matroskademux: calculate segment duration after parsing all the IDs

Since the segment duration is given in terms of the
GST_MATROSKA_ID_TIMECODESCALE we should only convert it into
nanoseconds when we are sure that any scale specified in the file has
been read.

https://bugzilla.gnome.org/show_bug.cgi?id=650258
This commit is contained in:
Debarshi Ray 2011-05-15 23:25:15 +03:00 committed by Sebastian Dröge
parent 5b99b910ec
commit bdc464a778

View file

@ -3501,6 +3501,7 @@ static GstFlowReturn
gst_matroska_demux_parse_info (GstMatroskaDemux * demux, GstEbmlRead * ebml) gst_matroska_demux_parse_info (GstMatroskaDemux * demux, GstEbmlRead * ebml)
{ {
GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn ret = GST_FLOW_OK;
gdouble dur_f = -1.0;
guint32 id; guint32 id;
DEBUG_ELEMENT_START (demux, ebml, "SegmentInfo"); DEBUG_ELEMENT_START (demux, ebml, "SegmentInfo");
@ -3529,23 +3530,15 @@ gst_matroska_demux_parse_info (GstMatroskaDemux * demux, GstEbmlRead * ebml)
} }
case GST_MATROSKA_ID_DURATION:{ case GST_MATROSKA_ID_DURATION:{
gdouble num; if ((ret = gst_ebml_read_float (ebml, &id, &dur_f)) != GST_FLOW_OK)
GstClockTime dur;
if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK)
break; break;
if (num <= 0.0) { if (dur_f <= 0.0) {
GST_WARNING_OBJECT (demux, "Invalid duration %lf", num); GST_WARNING_OBJECT (demux, "Invalid duration %lf", dur_f);
break; break;
} }
GST_DEBUG_OBJECT (demux, "Duration: %lf", num); GST_DEBUG_OBJECT (demux, "Duration: %lf", dur_f);
dur = gst_gdouble_to_guint64 (num *
gst_guint64_to_gdouble (demux->time_scale));
if (GST_CLOCK_TIME_IS_VALID (dur) && dur <= G_MAXINT64)
gst_segment_set_duration (&demux->segment, GST_FORMAT_TIME, dur);
break; break;
} }
@ -3616,6 +3609,15 @@ gst_matroska_demux_parse_info (GstMatroskaDemux * demux, GstEbmlRead * ebml)
} }
} }
if (dur_f > 0.0) {
GstClockTime dur_u;
dur_u = gst_gdouble_to_guint64 (dur_f *
gst_guint64_to_gdouble (demux->time_scale));
if (GST_CLOCK_TIME_IS_VALID (dur_u) && dur_u <= G_MAXINT64)
gst_segment_set_duration (&demux->segment, GST_FORMAT_TIME, dur_u);
}
DEBUG_ELEMENT_STOP (demux, ebml, "SegmentInfo", ret); DEBUG_ELEMENT_STOP (demux, ebml, "SegmentInfo", ret);
demux->segmentinfo_parsed = TRUE; demux->segmentinfo_parsed = TRUE;