This makes the decoder independent of mpegvideo. This copy of the draw_horiz_band code is simplified compared to the "generic" mpegvideo one which still has a number of special cases for different codecs. Signed-off-by: Martin Storsjö <martin@martin.st>tags/n1.2
@@ -1542,7 +1542,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" | |||||
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" | ||||
@@ -1689,7 +1689,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" | |||||
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" | ||||
@@ -123,10 +123,46 @@ static void h264_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type, | |||||
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, | |||||
h->ref_list[0][0].f.data[0] ? &h->ref_list[0][0] : NULL, | |||||
y, height, h->picture_structure, h->first_field, 0, | |||||
h->low_delay, h->mb_height * 16, h->mb_width * 16); | |||||
AVCodecContext *avctx = h->avctx; | |||||
Picture *cur = &h->cur_pic; | |||||
Picture *last = h->ref_list[0][0].f.data[0] ? &h->ref_list[0][0] : NULL; | |||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); | |||||
int vshift = desc->log2_chroma_h; | |||||
const int field_pic = h->picture_structure != PICT_FRAME; | |||||
if (field_pic) { | |||||
height <<= 1; | |||||
y <<= 1; | |||||
} | |||||
height = FFMIN(height, avctx->height - y); | |||||
if (field_pic && h->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 || h->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, h->picture_structure, height); | |||||
} | |||||
} | } | ||||
static void free_frame_buffer(H264Context *h, Picture *pic) | static void free_frame_buffer(H264Context *h, Picture *pic) | ||||