aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2013-03-02 11:22:02 -0800
committerMichael Niedermayer <michaelni@gmx.at>2013-03-03 00:45:45 +0100
commit454c5d10b29361ab638b4f8189dea2a121f3f372 (patch)
tree2b3792611d9179ced6a31ce7fbeed84a43df231b
parent4f0d4acc7017a751da7739b17644b1151310343b (diff)
downloadffmpeg-454c5d10b29361ab638b4f8189dea2a121f3f372.tar.gz
h264: add a copy of draw_horiz_band.
This makes the decoder independent of mpegvideo. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rwxr-xr-xconfigure4
-rw-r--r--libavcodec/h264.c50
2 files changed, 48 insertions, 6 deletions
diff --git a/configure b/configure
index a9907ac59a..a3be9a8d47 100755
--- a/configure
+++ b/configure
@@ -1707,7 +1707,7 @@ h263_decoder_select="error_resilience h263_parser mpegvideo"
h263_encoder_select="aandcttables error_resilience mpegvideoenc"
h263i_decoder_select="h263_decoder"
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"
iac_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"
# 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"
mpegvideo_parser_select="error_resilience mpegvideo"
vc1_parser_select="error_resilience mpegvideo"
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index a3d612723e..bb33878af4 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -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);
}
+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)
{
- 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);
+ draw_horiz_band(h->avctx, &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,
+ h->low_delay);
}
static void free_frame_buffer(H264Context *h, Picture *pic)