[gst-cvs] gst-ffmpeg: Take into account ticks_per_frame for framerate calculation. Fixes #575759

Edward Hervey bilboed at kemper.freedesktop.org
Tue Mar 17 15:45:51 PDT 2009


Module: gst-ffmpeg
Branch: master
Commit: 7ca2836193baa85387484d1f85aa56dc7e02ba5d
URL:    http://cgit.freedesktop.org/gstreamer/gst-ffmpeg/commit/?id=7ca2836193baa85387484d1f85aa56dc7e02ba5d

Author: Edward Hervey <bilboed at bilboed.com>
Date:   Tue Mar 17 23:44:43 2009 +0100

Take into account ticks_per_frame for framerate calculation. Fixes #575759

---

 ext/ffmpeg/gstffmpegcodecmap.c |    4 +++-
 ext/ffmpeg/gstffmpegdec.c      |    3 ++-
 ext/ffmpeg/gstffmpegenc.c      |    8 +++++---
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/ext/ffmpeg/gstffmpegcodecmap.c b/ext/ffmpeg/gstffmpegcodecmap.c
index bd59498..57f2e09 100644
--- a/ext/ffmpeg/gstffmpegcodecmap.c
+++ b/ext/ffmpeg/gstffmpegcodecmap.c
@@ -189,7 +189,8 @@ gst_ff_vid_caps_new (AVCodecContext * context, enum CodecID codec_id,
         "width", G_TYPE_INT, context->width,
         "height", G_TYPE_INT, context->height,
         "framerate", GST_TYPE_FRACTION,
-        context->time_base.den, context->time_base.num, NULL);
+        context->time_base.den / context->ticks_per_frame,
+        context->time_base.num, NULL);
   } else if (context) {
     /* so we are after restricted caps in this case */
     switch (codec_id) {
@@ -1829,6 +1830,7 @@ gst_ffmpeg_caps_to_pixfmt (const GstCaps * caps,
     /* somehow these seem mixed up.. */
     context->time_base.den = gst_value_get_fraction_numerator (fps);
     context->time_base.num = gst_value_get_fraction_denominator (fps);
+    context->ticks_per_frame = 1;
 
     GST_DEBUG ("setting framerate %d/%d = %lf",
         context->time_base.den, context->time_base.num,
diff --git a/ext/ffmpeg/gstffmpegdec.c b/ext/ffmpeg/gstffmpegdec.c
index ee1c71e..efa1499 100644
--- a/ext/ffmpeg/gstffmpegdec.c
+++ b/ext/ffmpeg/gstffmpegdec.c
@@ -1649,7 +1649,8 @@ gst_ffmpegdec_video_frame (GstFFMpegDec * ffmpegdec,
               ffmpegdec->context->time_base.den < 1000)) {
         GST_LOG_OBJECT (ffmpegdec, "using decoder's framerate for duration");
         out_duration = gst_util_uint64_scale_int (GST_SECOND,
-            ffmpegdec->context->time_base.num,
+            ffmpegdec->context->time_base.num /
+            ffmpegdec->context->ticks_per_frame,
             ffmpegdec->context->time_base.den);
       } else {
         GST_LOG_OBJECT (ffmpegdec, "no valid duration found");
diff --git a/ext/ffmpeg/gstffmpegenc.c b/ext/ffmpeg/gstffmpegenc.c
index 0c6c6b4..8980d1d 100644
--- a/ext/ffmpeg/gstffmpegenc.c
+++ b/ext/ffmpeg/gstffmpegenc.c
@@ -346,6 +346,7 @@ gst_ffmpegenc_getcaps (GstPad * pad)
     ctx->height = DEFAULT_HEIGHT;
     ctx->time_base.num = 1;
     ctx->time_base.den = 25;
+    ctx->ticks_per_frame = 1;
     ctx->bit_rate = DEFAULT_VIDEO_BITRATE;
     /* makes it silent */
     ctx->strict_std_compliance = -1;
@@ -491,6 +492,7 @@ gst_ffmpegenc_setcaps (GstPad * pad, GstCaps * caps)
   if (!ffmpegenc->context->time_base.den) {
     ffmpegenc->context->time_base.den = 25;
     ffmpegenc->context->time_base.num = 1;
+    ffmpegenc->context->ticks_per_frame = 1;
   } else if ((oclass->in_plugin->id == CODEC_ID_MPEG4)
       && (ffmpegenc->context->time_base.den > 65535)) {
     /* MPEG4 Standards do not support time_base denominator greater than
@@ -515,7 +517,7 @@ gst_ffmpegenc_setcaps (GstPad * pad, GstCaps * caps)
     ctx = ffmpegenc->context;
     ctx->gop_size = (ffmpegenc->max_key_interval < 0) ?
         (-ffmpegenc->max_key_interval
-        * (ctx->time_base.den / ctx->time_base.num))
+        * (ctx->time_base.den * ctx->ticks_per_frame / ctx->time_base.num))
         : ffmpegenc->max_key_interval;
   }
 
@@ -636,8 +638,8 @@ gst_ffmpegenc_chain_video (GstPad * pad, GstBuffer * inbuf)
   g_return_val_if_fail (frame_size == GST_BUFFER_SIZE (inbuf), GST_FLOW_ERROR);
 
   ffmpegenc->picture->pts =
-      gst_ffmpeg_time_gst_to_ff (GST_BUFFER_TIMESTAMP (inbuf),
-      ffmpegenc->context->time_base);
+      gst_ffmpeg_time_gst_to_ff (GST_BUFFER_TIMESTAMP (inbuf) /
+      ffmpegenc->context->ticks_per_frame, ffmpegenc->context->time_base);
 
   ffmpegenc_setup_working_buf (ffmpegenc);
 





More information about the Gstreamer-commits mailing list