gst/matroska/: Try harder to extract the framerate for video tracks correctly and...
authorTim-Philipp Müller <tim@centricular.net>
Mon, 11 Dec 2006 13:59:33 +0000 (13:59 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Mon, 11 Dec 2006 13:59:33 +0000 (13:59 +0000)
Original commit message from CVS:
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps):
* gst/matroska/matroska-ids.c:
(gst_matroska_track_init_video_context):
* gst/matroska/matroska-ids.h:
Try harder to extract the framerate for video tracks correctly and
save it directly instead of converting it back and forth a few
times. Mostly makes a difference for very small framerates (<1).
Fixes #380199.

ChangeLog
gst/matroska/matroska-demux.c
gst/matroska/matroska-ids.c
gst/matroska/matroska-ids.h

index b468ca76a77e8d037aa21a3f9da975a933953d5c..104c7e3ea5a124c6a404c1786723c1681104c466 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-12-11  Tim-Philipp Müller  <tim at centricular dot net>
+
+       * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
+       (gst_matroska_demux_video_caps):
+       * gst/matroska/matroska-ids.c:
+       (gst_matroska_track_init_video_context):
+       * gst/matroska/matroska-ids.h:
+         Try harder to extract the framerate for video tracks correctly and
+         save it directly instead of converting it back and forth a few
+         times. Mostly makes a difference for very small framerates (<1).
+         Fixes #380199.
+
 2006-12-11  Tim-Philipp Müller  <tim at centricular dot net>
 
        * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_init),
index c09afa40e10388954cad4164777bf881ac4adf9e..3c54b213dababe6a27a4c5f156a70830ea921f79 100644 (file)
@@ -660,7 +660,9 @@ gst_matroska_demux_add_stream (GstMatroskaDemux * demux)
                 res = FALSE;
                 break;
               }
-              context->default_duration = GST_SECOND * (1. / num);
+              context->default_duration =
+                  gst_gdouble_to_guint64 ((gdouble) GST_SECOND * (1.0 / num));
+              videocontext->default_fps = num;
               break;
             }
 
@@ -3615,14 +3617,26 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *
             videocontext->display_height * videocontext->pixel_width, NULL);
       }
 
-      if (context->default_duration > 0) {
-        GValue fps_double = { 0 };
-        GValue fps_fraction = { 0 };
+      if (videocontext->default_fps > 0.0) {
+        GValue fps_double = { 0, };
+        GValue fps_fraction = { 0, };
 
         g_value_init (&fps_double, G_TYPE_DOUBLE);
         g_value_init (&fps_fraction, GST_TYPE_FRACTION);
-        g_value_set_double (&fps_double,
-            gst_guint64_to_gdouble (GST_SECOND / context->default_duration));
+        g_value_set_double (&fps_double, videocontext->default_fps);
+        g_value_transform (&fps_double, &fps_fraction);
+
+        gst_structure_set_value (structure, "framerate", &fps_fraction);
+        g_value_unset (&fps_double);
+        g_value_unset (&fps_fraction);
+      } else if (context->default_duration > 0) {
+        GValue fps_double = { 0, };
+        GValue fps_fraction = { 0, };
+
+        g_value_init (&fps_double, G_TYPE_DOUBLE);
+        g_value_init (&fps_fraction, GST_TYPE_FRACTION);
+        g_value_set_double (&fps_double, (gdouble) GST_SECOND * 1.0 /
+            gst_guint64_to_gdouble (context->default_duration));
         g_value_transform (&fps_double, &fps_fraction);
 
         gst_structure_set_value (structure, "framerate", &fps_fraction);
index db8261ab3af0c8b198f6ef99b95dab2413483894..ec71a5688a5dbac45e68dd71df3bc69ffbdf058c 100644 (file)
@@ -56,6 +56,7 @@ gst_matroska_track_init_video_context (GstMatroskaTrackContext ** p_context)
   video_context->eye_mode = 0;
   video_context->asr_mode = 0;
   video_context->fourcc = 0;
+  video_context->default_fps = 0.0;
   return TRUE;
 }
 
index 5a5e572256a02999b816eb7e827068444d0a6cce..e570599d9c91e7d83d203a8dff833187a991b396 100644 (file)
@@ -292,8 +292,9 @@ typedef struct _GstMatroskaTrackContext {
 typedef struct _GstMatroskaTrackVideoContext {
   GstMatroskaTrackContext parent;
 
-  guint         pixel_width, pixel_height,
-                display_width, display_height;
+  guint         pixel_width, pixel_height;
+  guint         display_width, display_height;
+  gdouble       default_fps;
   GstMatroskaEyeMode eye_mode;
   GstMatroskaAspectRatioMode asr_mode;
   guint32       fourcc;