ext/ffmpeg/gstffmpegdec.c: Only do timestamp interpolation for delayed streams (conta...
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Thu, 9 Jun 2005 09:53:04 +0000 (09:53 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Thu, 9 Jun 2005 09:53:04 +0000 (09:53 +0000)
Original commit message from CVS:
* ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_frame):
Only do timestamp interpolation for delayed streams (containing
B-frames). Fixes stuttering playback of ASF files (#306770).

ChangeLog
ext/ffmpeg/gstffmpegdec.c

index 3577246..b55b51f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2005-06-09  Ronald S. Bultje  <rbultje@ronald.bitfreak.net>
 
+       * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_frame):
+         Only do timestamp interpolation for delayed streams (containing
+         B-frames). Fixes stuttering playback of ASF files (#306770).
+
+2005-06-09  Ronald S. Bultje  <rbultje@ronald.bitfreak.net>
+
        * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps),
        (gst_ffmpeg_caps_with_codecid):
          Remove weird flags from SVQ3 flags and just give full atom,
index 3b9a137..5a4c32f 100644 (file)
@@ -685,7 +685,7 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec,
 
        if (ffmpegdec->picture->opaque != NULL) {
          outbuf = (GstBuffer *) ffmpegdec->picture->opaque;
-       }else {
+       } else {
          AVPicture pic;
          gint fsize = gst_ffmpeg_avpicture_get_size (ffmpegdec->context->pix_fmt,
             ffmpegdec->context->width, ffmpegdec->context->height);
@@ -717,10 +717,12 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec,
          * For B-frame containing movies, we get all pictures delayed
          * except for the I frames, so we synchronize only on I frames
          * and keep an internal counter based on FPS for the others. */
-        if ((ffmpegdec->picture->pict_type == FF_I_TYPE ||
-             !GST_CLOCK_TIME_IS_VALID (ffmpegdec->next_ts)) &&
-            GST_CLOCK_TIME_IS_VALID (*in_ts)) {
+        if (!(oclass->in_plugin->capabilities & CODEC_CAP_DELAY) ||
+           ((ffmpegdec->picture->pict_type == FF_I_TYPE ||
+              !GST_CLOCK_TIME_IS_VALID (ffmpegdec->next_ts)) &&
+             GST_CLOCK_TIME_IS_VALID (*in_ts))) {
           ffmpegdec->next_ts = *in_ts;
+         *in_ts = GST_CLOCK_TIME_NONE;
         }
 
         GST_BUFFER_TIMESTAMP (outbuf) = ffmpegdec->next_ts;
@@ -738,12 +740,14 @@ gst_ffmpegdec_frame (GstFFMpegDec * ffmpegdec,
         } else {
           ffmpegdec->next_ts = GST_CLOCK_TIME_NONE;
         }
-      } else if (ffmpegdec->picture->pict_type != -1) {
+      } else if (ffmpegdec->picture->pict_type != -1 &&
+                oclass->in_plugin->capabilities & CODEC_CAP_DELAY) {
         /* update time for skip-frame */
         if ((ffmpegdec->picture->pict_type == FF_I_TYPE ||
              !GST_CLOCK_TIME_IS_VALID (ffmpegdec->next_ts)) &&
             GST_CLOCK_TIME_IS_VALID (*in_ts)) {
           ffmpegdec->next_ts = *in_ts;
+         *in_ts = GST_CLOCK_TIME_NONE;
         }
         
         if (ffmpegdec->context->frame_rate_base != 0 &&