You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
h264: add a copy of draw_horiz_band.
This makes the decoder independent of mpegvideo. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
committed by
Michael Niedermayer
parent
4f0d4acc70
commit
454c5d10b2
4
configure
vendored
4
configure
vendored
@@ -1707,7 +1707,7 @@ h263_decoder_select="error_resilience h263_parser mpegvideo"
|
|||||||
h263_encoder_select="aandcttables error_resilience mpegvideoenc"
|
h263_encoder_select="aandcttables error_resilience mpegvideoenc"
|
||||||
h263i_decoder_select="h263_decoder"
|
h263i_decoder_select="h263_decoder"
|
||||||
h263p_encoder_select="h263_encoder"
|
h263p_encoder_select="h263_encoder"
|
||||||
h264_decoder_select="error_resilience golomb h264chroma h264dsp h264pred h264qpel mpegvideo videodsp"
|
h264_decoder_select="error_resilience golomb h264chroma h264dsp h264pred h264qpel videodsp"
|
||||||
huffyuv_encoder_select="huffman"
|
huffyuv_encoder_select="huffman"
|
||||||
iac_decoder_select="fft mdct sinewin"
|
iac_decoder_select="fft mdct sinewin"
|
||||||
imc_decoder_select="fft mdct sinewin"
|
imc_decoder_select="fft mdct sinewin"
|
||||||
@@ -1868,7 +1868,7 @@ wmv3_vdpau_decoder_select="vc1_vdpau_decoder"
|
|||||||
wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
|
wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
|
||||||
|
|
||||||
# parsers
|
# parsers
|
||||||
h264_parser_select="error_resilience golomb h264chroma h264dsp h264pred h264qpel mpegvideo videodsp"
|
h264_parser_select="error_resilience golomb h264chroma h264dsp h264pred h264qpel videodsp"
|
||||||
mpeg4video_parser_select="error_resilience mpegvideo"
|
mpeg4video_parser_select="error_resilience mpegvideo"
|
||||||
mpegvideo_parser_select="error_resilience mpegvideo"
|
mpegvideo_parser_select="error_resilience mpegvideo"
|
||||||
vc1_parser_select="error_resilience mpegvideo"
|
vc1_parser_select="error_resilience mpegvideo"
|
||||||
|
@@ -143,12 +143,54 @@ static void h264_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type,
|
|||||||
ff_h264_hl_decode_mb(h);
|
ff_h264_hl_decode_mb(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void draw_horiz_band(AVCodecContext *avctx, Picture *cur,
|
||||||
|
Picture *last, int y, int h, int picture_structure,
|
||||||
|
int first_field, int low_delay)
|
||||||
|
{
|
||||||
|
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
|
||||||
|
int vshift = desc->log2_chroma_h;
|
||||||
|
const int field_pic = picture_structure != PICT_FRAME;
|
||||||
|
if(field_pic){
|
||||||
|
h <<= 1;
|
||||||
|
y <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
h = FFMIN(h, avctx->height - y);
|
||||||
|
|
||||||
|
if(field_pic && first_field && !(avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
|
||||||
|
|
||||||
|
if (avctx->draw_horiz_band) {
|
||||||
|
AVFrame *src;
|
||||||
|
int offset[AV_NUM_DATA_POINTERS];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(cur->f.pict_type == AV_PICTURE_TYPE_B || low_delay ||
|
||||||
|
(avctx->slice_flags & SLICE_FLAG_CODED_ORDER))
|
||||||
|
src = &cur->f;
|
||||||
|
else if (last)
|
||||||
|
src = &last->f;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
offset[0]= y * src->linesize[0];
|
||||||
|
offset[1]=
|
||||||
|
offset[2]= (y >> vshift) * src->linesize[1];
|
||||||
|
for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
|
||||||
|
offset[i] = 0;
|
||||||
|
|
||||||
|
emms_c();
|
||||||
|
|
||||||
|
avctx->draw_horiz_band(avctx, src, offset,
|
||||||
|
y, picture_structure, h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
|
void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
|
||||||
{
|
{
|
||||||
ff_draw_horiz_band(h->avctx, NULL, &h->cur_pic,
|
draw_horiz_band(h->avctx, &h->cur_pic,
|
||||||
h->ref_list[0][0].f.data[0] ? &h->ref_list[0][0] : NULL,
|
h->ref_list[0][0].f.data[0] ? &h->ref_list[0][0] : NULL,
|
||||||
y, height, h->picture_structure, h->first_field, 0,
|
y, height, h->picture_structure, h->first_field,
|
||||||
h->low_delay, h->mb_height * 16, h->mb_width * 16);
|
h->low_delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_frame_buffer(H264Context *h, Picture *pic)
|
static void free_frame_buffer(H264Context *h, Picture *pic)
|
||||||
|
Reference in New Issue
Block a user