gst/matroska/: Try harder to extract the framerate for video tracks correctly and save it directly instead of convert...

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.
This commit is contained in:
Tim-Philipp Müller 2006-12-11 13:59:33 +00:00
parent 2f992c783e
commit 0d3b023699
4 changed files with 36 additions and 8 deletions

View File

@ -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> 2006-12-11 Tim-Philipp Müller <tim at centricular dot net>
* ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_init), * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_init),

View File

@ -660,7 +660,9 @@ gst_matroska_demux_add_stream (GstMatroskaDemux * demux)
res = FALSE; res = FALSE;
break; 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; break;
} }
@ -3615,14 +3617,26 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *
videocontext->display_height * videocontext->pixel_width, NULL); videocontext->display_height * videocontext->pixel_width, NULL);
} }
if (context->default_duration > 0) { if (videocontext->default_fps > 0.0) {
GValue fps_double = { 0 }; GValue fps_double = { 0, };
GValue fps_fraction = { 0 }; GValue fps_fraction = { 0, };
g_value_init (&fps_double, G_TYPE_DOUBLE); g_value_init (&fps_double, G_TYPE_DOUBLE);
g_value_init (&fps_fraction, GST_TYPE_FRACTION); g_value_init (&fps_fraction, GST_TYPE_FRACTION);
g_value_set_double (&fps_double, g_value_set_double (&fps_double, videocontext->default_fps);
gst_guint64_to_gdouble (GST_SECOND / context->default_duration)); 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); g_value_transform (&fps_double, &fps_fraction);
gst_structure_set_value (structure, "framerate", &fps_fraction); gst_structure_set_value (structure, "framerate", &fps_fraction);

View File

@ -56,6 +56,7 @@ gst_matroska_track_init_video_context (GstMatroskaTrackContext ** p_context)
video_context->eye_mode = 0; video_context->eye_mode = 0;
video_context->asr_mode = 0; video_context->asr_mode = 0;
video_context->fourcc = 0; video_context->fourcc = 0;
video_context->default_fps = 0.0;
return TRUE; return TRUE;
} }

View File

@ -292,8 +292,9 @@ typedef struct _GstMatroskaTrackContext {
typedef struct _GstMatroskaTrackVideoContext { typedef struct _GstMatroskaTrackVideoContext {
GstMatroskaTrackContext parent; GstMatroskaTrackContext parent;
guint pixel_width, pixel_height, guint pixel_width, pixel_height;
display_width, display_height; guint display_width, display_height;
gdouble default_fps;
GstMatroskaEyeMode eye_mode; GstMatroskaEyeMode eye_mode;
GstMatroskaAspectRatioMode asr_mode; GstMatroskaAspectRatioMode asr_mode;
guint32 fourcc; guint32 fourcc;