summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2005-06-09 09:53:04 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2005-06-09 09:53:04 +0000
commit4869163a532a1ba01ee321882c1ecad955e228b1 (patch)
tree0b7785ae697f496ecfb89025faffd5a91a28245c
parentb863f44a1a6cfd1e70e4869f051349237c3be35c (diff)
downloadgst-libav-4869163a532a1ba01ee321882c1ecad955e228b1.tar.gz
ext/ffmpeg/gstffmpegdec.c: Only do timestamp interpolation for delayed streams (containing
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).
-rw-r--r--ChangeLog6
-rw-r--r--ext/ffmpeg/gstffmpegdec.c14
2 files changed, 15 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 3577246..b55b51f 100644
--- 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,
diff --git a/ext/ffmpeg/gstffmpegdec.c b/ext/ffmpeg/gstffmpegdec.c
index 3b9a137..5a4c32f 100644
--- a/ext/ffmpeg/gstffmpegdec.c
+++ b/ext/ffmpeg/gstffmpegdec.c
@@ -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 &&