ext/ffmpeg/gstffmpegdec.c: When H264 is presented without codec_data, use a parser...
authorJan Schmidt <thaytan@mad.scientist.com>
Mon, 27 Nov 2006 18:58:38 +0000 (18:58 +0000)
committerJan Schmidt <thaytan@mad.scientist.com>
Mon, 27 Nov 2006 18:58:38 +0000 (18:58 +0000)
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
ext/ffmpeg/gstffmpegdec.c

index 4d5a697..584b8e7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2006-11-27  Jan Schmidt  <thaytan@mad.scientist.com>
+
+       * 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  <thomas at apestaart dot org>
 
        * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_register):
index 4747948..7d1b9b5 100644 (file)
@@ -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 */