summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2006-10-31 10:31:18 +0000
committerWim Taymans <wim.taymans@gmail.com>2006-10-31 10:31:18 +0000
commit8ac0c0e09a8a4c5cc8c41237aa3980545ea18d2a (patch)
tree08097e7bf217ed95605f7ae43f2ec0d82158c90a /gst
parent1e68f40b74920d489e699b5e2e45a3391530528f (diff)
gst/qtdemux/qtdemux.c: Handle unbounded length streams a bit better. Fixes #367696.
Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), (gst_qtdemux_handle_src_query), (qtdemux_parse_tree), (qtdemux_parse_trak): Handle unbounded length streams a bit better. Fixes #367696.
Diffstat (limited to 'gst')
-rw-r--r--gst/qtdemux/qtdemux.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c
index a67932a5..61497619 100644
--- a/gst/qtdemux/qtdemux.c
+++ b/gst/qtdemux/qtdemux.c
@@ -558,6 +558,22 @@ gst_qtdemux_get_src_query_types (GstPad * pad)
}
static gboolean
+gst_qtdemux_get_duration (GstQTDemux * qtdemux, gint64 * duration)
+{
+ gboolean res = TRUE;
+
+ *duration = GST_CLOCK_TIME_NONE;
+
+ if (qtdemux->duration != 0) {
+ if (qtdemux->duration != G_MAXINT32 && qtdemux->timescale != 0) {
+ *duration = gst_util_uint64_scale_int (qtdemux->duration,
+ GST_SECOND, qtdemux->timescale);
+ }
+ }
+ return res;
+}
+
+static gboolean
gst_qtdemux_handle_src_query (GstPad * pad, GstQuery * query)
{
gboolean res = FALSE;
@@ -572,15 +588,13 @@ gst_qtdemux_handle_src_query (GstPad * pad, GstQuery * query)
}
break;
case GST_QUERY_DURATION:
- if (qtdemux->duration != 0 && qtdemux->timescale != 0) {
- gint64 duration;
+ {
+ gint64 duration;
- duration = gst_util_uint64_scale_int (qtdemux->duration,
- GST_SECOND, qtdemux->timescale);
+ res = gst_qtdemux_get_duration (qtdemux, &duration);
- gst_query_set_duration (query, GST_FORMAT_TIME, duration);
- res = TRUE;
- }
+ gst_query_set_duration (query, GST_FORMAT_TIME, duration);
+ }
break;
default:
res = FALSE;
@@ -3145,12 +3159,10 @@ qtdemux_parse_tree (GstQTDemux * qtdemux)
GST_INFO_OBJECT (qtdemux, "timescale: %d", qtdemux->timescale);
GST_INFO_OBJECT (qtdemux, "duration: %d", qtdemux->duration);
- if (qtdemux->timescale != 0 && qtdemux->duration != 0) {
+ if (TRUE) {
gint64 duration;
- duration = gst_util_uint64_scale_int (qtdemux->duration,
- GST_SECOND, qtdemux->timescale);
-
+ gst_qtdemux_get_duration (qtdemux, &duration);
gst_segment_set_duration (&qtdemux->segment, GST_FORMAT_TIME, duration);
}
@@ -3242,7 +3254,7 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
GST_LOG ("track timescale: %d", stream->timescale);
GST_LOG ("track duration: %d", stream->duration);
- {
+ if (qtdemux->duration != G_MAXINT32 && stream->duration != G_MAXINT32) {
guint64 tdur1, tdur2;
/* don't overflow */