From 1359d613135cc686116a211cef20e2cadcec84eb Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Mon, 27 Nov 2006 18:58:38 +0000 Subject: [PATCH] ext/ffmpeg/gstffmpegdec.c: When H264 is presented without codec_data, use a parser to frame it by assuming that no co... Original commit message from CVS: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_open), (gst_ffmpegdec_chain): When H264 is presented without codec_data, use a parser to frame it by assuming that no codec_data implies it is unpacketised. Always use the return value from the parser to advance the input buffer position. --- ChangeLog | 10 ++++++++++ ext/ffmpeg/gstffmpegdec.c | 35 ++++++++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4d5a697..584b8e7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-11-27 Jan Schmidt + + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_open), + (gst_ffmpegdec_chain): + When H264 is presented without codec_data, use a parser to frame it + by assuming that no codec_data implies it is unpacketised. + + Always use the return value from the parser to advance the input + buffer position. + 2006-11-17 Thomas Vander Stichele * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_register): diff --git a/ext/ffmpeg/gstffmpegdec.c b/ext/ffmpeg/gstffmpegdec.c index 4747948..7d1b9b5 100644 --- a/ext/ffmpeg/gstffmpegdec.c +++ b/ext/ffmpeg/gstffmpegdec.c @@ -487,10 +487,22 @@ gst_ffmpegdec_open (GstFFMpegDec * ffmpegdec) case CODEC_ID_MPEG4: case CODEC_ID_MJPEG: case CODEC_ID_MP3: - case CODEC_ID_H264: GST_LOG_OBJECT (ffmpegdec, "not using parser, blacklisted codec"); ffmpegdec->pctx = NULL; break; + case CODEC_ID_H264: + /* For H264, only use a parser if there is no context data, if there is, + * we're talking AVC */ + if (ffmpegdec->context->extradata_size == 0) { + GST_LOG_OBJECT (ffmpegdec, "H264 with no extradata, creating parser"); + ffmpegdec->pctx = av_parser_init (oclass->in_plugin->id); + } + else { + GST_LOG_OBJECT (ffmpegdec, + "H264 with extradata implies framed data - not using parser"); + ffmpegdec->pctx = NULL; + } + break; default: GST_LOG_OBJECT (ffmpegdec, "Using parser"); ffmpegdec->pctx = av_parser_init (oclass->in_plugin->id); @@ -1871,17 +1883,22 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf) GST_LOG_OBJECT (ffmpegdec, "parser returned res %d and size %d", res, size); + GST_LOG_OBJECT (ffmpegdec, "consuming %d bytes. Next ts at %d, ffpts:%" + G_GINT64_FORMAT, size, left, ffmpegdec->pctx->pts); + + /* there is output, set pointers for next round. */ + bsize -= res; + bdata += res; + /* if there is no output, we must break and wait for more data. also the * timestamp in the context is not updated. */ - if (size == 0) - break; - - GST_LOG_OBJECT (ffmpegdec, "consuming %d bytes. Next ts at %d, ffpts:%"G_GINT64_FORMAT, - size, left, ffmpegdec->pctx->pts); + if (size == 0) { + if(bsize>0) + continue; + else + break; + } - /* there is output, set pointers for next round. */ - bsize -= size; - bdata += size; if (left <= size) { left = 0; /* activate the pending timestamp/duration and mark it invalid */ -- 2.7.4