mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-06 07:28:53 +00:00
gst/matroska/matroska-demux.c: Handle position and duration query in DEFAULT format if the pad's track has a default ...
Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), (gst_matroska_demux_add_stream), (gst_matroska_demux_query), (gst_matroska_demux_element_query), (gst_matroska_demux_handle_src_query), (gst_matroska_demux_handle_seek_event): Handle position and duration query in DEFAULT format if the pad's track has a default frame duration set. Fix seeking now that the segment's duration doesn't contain the (possibly wrong or inaccurate) duration of the Matroska file.
This commit is contained in:
parent
2c38fcd1e6
commit
33e0d064a5
2 changed files with 82 additions and 32 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
2008-07-02 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init),
|
||||||
|
(gst_matroska_demux_add_stream), (gst_matroska_demux_query),
|
||||||
|
(gst_matroska_demux_element_query),
|
||||||
|
(gst_matroska_demux_handle_src_query),
|
||||||
|
(gst_matroska_demux_handle_seek_event):
|
||||||
|
Handle position and duration query in DEFAULT format if the
|
||||||
|
pad's track has a default frame duration set.
|
||||||
|
|
||||||
|
Fix seeking now that the segment's duration doesn't contain the
|
||||||
|
(possibly wrong or inaccurate) duration of the Matroska file.
|
||||||
|
|
||||||
2008-07-02 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
2008-07-02 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||||
|
|
||||||
* gst/matroska/ebml-read.c: (_ext2dbl):
|
* gst/matroska/ebml-read.c: (_ext2dbl):
|
||||||
|
|
|
@ -116,6 +116,9 @@ static void gst_matroska_demux_loop (GstPad * pad);
|
||||||
static gboolean gst_matroska_demux_element_send_event (GstElement * element,
|
static gboolean gst_matroska_demux_element_send_event (GstElement * element,
|
||||||
GstEvent * event);
|
GstEvent * event);
|
||||||
|
|
||||||
|
static gboolean gst_matroska_demux_element_query (GstElement * element,
|
||||||
|
GstQuery * query);
|
||||||
|
|
||||||
/* pad functions */
|
/* pad functions */
|
||||||
static gboolean gst_matroska_demux_sink_activate_pull (GstPad * sinkpad,
|
static gboolean gst_matroska_demux_sink_activate_pull (GstPad * sinkpad,
|
||||||
gboolean active);
|
gboolean active);
|
||||||
|
@ -183,6 +186,8 @@ gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass)
|
||||||
GST_DEBUG_FUNCPTR (gst_matroska_demux_change_state);
|
GST_DEBUG_FUNCPTR (gst_matroska_demux_change_state);
|
||||||
gstelement_class->send_event =
|
gstelement_class->send_event =
|
||||||
GST_DEBUG_FUNCPTR (gst_matroska_demux_element_send_event);
|
GST_DEBUG_FUNCPTR (gst_matroska_demux_element_send_event);
|
||||||
|
gstelement_class->query =
|
||||||
|
GST_DEBUG_FUNCPTR (gst_matroska_demux_element_query);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1472,6 +1477,8 @@ gst_matroska_demux_add_stream (GstMatroskaDemux * demux)
|
||||||
|
|
||||||
context->pending_tags = list;
|
context->pending_tags = list;
|
||||||
|
|
||||||
|
gst_pad_set_element_private (context->pad, context);
|
||||||
|
|
||||||
gst_pad_use_fixed_caps (context->pad);
|
gst_pad_use_fixed_caps (context->pad);
|
||||||
gst_pad_set_caps (context->pad, context->caps);
|
gst_pad_set_caps (context->pad, context->caps);
|
||||||
gst_pad_set_active (context->pad, TRUE);
|
gst_pad_set_active (context->pad, TRUE);
|
||||||
|
@ -1496,17 +1503,16 @@ gst_matroska_demux_get_src_query_types (GstPad * pad)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query)
|
gst_matroska_demux_query (GstMatroskaDemux * demux, GstPad * pad,
|
||||||
|
GstQuery * query)
|
||||||
{
|
{
|
||||||
GstMatroskaDemux *demux;
|
|
||||||
|
|
||||||
gboolean res = FALSE;
|
gboolean res = FALSE;
|
||||||
|
GstMatroskaTrackContext *context = NULL;
|
||||||
|
|
||||||
demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad));
|
if (pad) {
|
||||||
|
context = gst_pad_get_element_private (pad);
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME: do queries on the Tracks, not on the Segment.
|
|
||||||
* Convert between time and frames if we know the duration
|
|
||||||
* of one frame for the track */
|
|
||||||
switch (GST_QUERY_TYPE (query)) {
|
switch (GST_QUERY_TYPE (query)) {
|
||||||
case GST_QUERY_POSITION:
|
case GST_QUERY_POSITION:
|
||||||
{
|
{
|
||||||
|
@ -1514,15 +1520,25 @@ gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query)
|
||||||
|
|
||||||
gst_query_parse_position (query, &format, NULL);
|
gst_query_parse_position (query, &format, NULL);
|
||||||
|
|
||||||
if (format != GST_FORMAT_TIME) {
|
if (format == GST_FORMAT_TIME) {
|
||||||
GST_DEBUG ("only query position on TIME is supported");
|
GST_OBJECT_LOCK (demux);
|
||||||
break;
|
if (context)
|
||||||
|
gst_query_set_position (query, GST_FORMAT_TIME, context->pos);
|
||||||
|
else
|
||||||
|
gst_query_set_position (query, GST_FORMAT_TIME,
|
||||||
|
demux->segment.last_stop);
|
||||||
|
GST_OBJECT_UNLOCK (demux);
|
||||||
|
} else if (format == GST_FORMAT_DEFAULT && context
|
||||||
|
&& context->default_duration) {
|
||||||
|
GST_OBJECT_LOCK (demux);
|
||||||
|
gst_query_set_position (query, GST_FORMAT_DEFAULT,
|
||||||
|
context->pos / context->default_duration);
|
||||||
|
GST_OBJECT_UNLOCK (demux);
|
||||||
|
} else {
|
||||||
|
GST_DEBUG_OBJECT (demux,
|
||||||
|
"only position query in TIME and DEFAULT format is supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_OBJECT_LOCK (demux);
|
|
||||||
gst_query_set_position (query, GST_FORMAT_TIME, demux->segment.last_stop);
|
|
||||||
GST_OBJECT_UNLOCK (demux);
|
|
||||||
|
|
||||||
res = TRUE;
|
res = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1532,15 +1548,21 @@ gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query)
|
||||||
|
|
||||||
gst_query_parse_duration (query, &format, NULL);
|
gst_query_parse_duration (query, &format, NULL);
|
||||||
|
|
||||||
if (format != GST_FORMAT_TIME) {
|
if (format == GST_FORMAT_TIME) {
|
||||||
GST_DEBUG ("only query duration on TIME is supported");
|
GST_OBJECT_LOCK (demux);
|
||||||
break;
|
gst_query_set_duration (query, GST_FORMAT_TIME, demux->duration);
|
||||||
|
GST_OBJECT_UNLOCK (demux);
|
||||||
|
} else if (format == GST_FORMAT_DEFAULT && context
|
||||||
|
&& context->default_duration) {
|
||||||
|
GST_OBJECT_LOCK (demux);
|
||||||
|
gst_query_set_duration (query, GST_FORMAT_DEFAULT,
|
||||||
|
demux->duration / context->default_duration);
|
||||||
|
GST_OBJECT_UNLOCK (demux);
|
||||||
|
} else {
|
||||||
|
GST_DEBUG_OBJECT (demux,
|
||||||
|
"only duration query in TIME and DEFAULT format is supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_OBJECT_LOCK (demux);
|
|
||||||
gst_query_set_duration (query, GST_FORMAT_TIME, demux->duration);
|
|
||||||
GST_OBJECT_UNLOCK (demux);
|
|
||||||
|
|
||||||
res = TRUE;
|
res = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1550,10 +1572,27 @@ gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_object_unref (demux);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_matroska_demux_element_query (GstElement * element, GstQuery * query)
|
||||||
|
{
|
||||||
|
return gst_matroska_demux_query (GST_MATROSKA_DEMUX (element), NULL, query);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query)
|
||||||
|
{
|
||||||
|
gboolean ret;
|
||||||
|
GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad));
|
||||||
|
|
||||||
|
ret = gst_matroska_demux_query (demux, pad, query);
|
||||||
|
|
||||||
|
gst_object_unref (demux);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static GstMatroskaIndex *
|
static GstMatroskaIndex *
|
||||||
gst_matroskademux_do_index_seek (GstMatroskaDemux * demux, gint64 seek_pos,
|
gst_matroskademux_do_index_seek (GstMatroskaDemux * demux, gint64 seek_pos,
|
||||||
|
@ -1729,28 +1768,26 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
|
||||||
/* if nothing configured, play complete file */
|
/* if nothing configured, play complete file */
|
||||||
if (!GST_CLOCK_TIME_IS_VALID (cur))
|
if (!GST_CLOCK_TIME_IS_VALID (cur))
|
||||||
cur = 0;
|
cur = 0;
|
||||||
if (!GST_CLOCK_TIME_IS_VALID (stop))
|
|
||||||
stop = demux->segment.duration;
|
|
||||||
/* prevent some calculations and comparisons involving INVALID */
|
/* prevent some calculations and comparisons involving INVALID */
|
||||||
segment_start = demux->segment.start;
|
segment_start = demux->segment.start;
|
||||||
segment_stop = demux->segment.stop;
|
segment_stop = demux->segment.stop;
|
||||||
if (!GST_CLOCK_TIME_IS_VALID (segment_start))
|
if (!GST_CLOCK_TIME_IS_VALID (segment_start))
|
||||||
segment_start = 0;
|
segment_start = 0;
|
||||||
if (!GST_CLOCK_TIME_IS_VALID (segment_stop))
|
|
||||||
segment_stop = demux->segment.duration;
|
|
||||||
|
|
||||||
if (cur_type == GST_SEEK_TYPE_SET)
|
if (cur_type == GST_SEEK_TYPE_SET)
|
||||||
segment_start = cur;
|
segment_start = cur;
|
||||||
else if (cur_type == GST_SEEK_TYPE_CUR)
|
else if (cur_type == GST_SEEK_TYPE_CUR)
|
||||||
segment_start += cur;
|
segment_start += cur;
|
||||||
|
|
||||||
if (stop_type == GST_SEEK_TYPE_SET)
|
if (stop_type == GST_SEEK_TYPE_SET) {
|
||||||
segment_stop = stop;
|
segment_stop = stop;
|
||||||
else if (stop_type == GST_SEEK_TYPE_CUR)
|
} else if (stop_type == GST_SEEK_TYPE_CUR) {
|
||||||
segment_stop += stop;
|
if (GST_CLOCK_TIME_IS_VALID (segment_stop)
|
||||||
|
&& GST_CLOCK_TIME_IS_VALID (stop))
|
||||||
segment_start = CLAMP (segment_start, 0, demux->segment.duration);
|
segment_stop += stop;
|
||||||
segment_stop = CLAMP (segment_stop, 0, demux->segment.duration);
|
else
|
||||||
|
segment_stop = -1;
|
||||||
|
}
|
||||||
|
|
||||||
GST_DEBUG ("New segment positions: %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
|
GST_DEBUG ("New segment positions: %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
|
||||||
GST_TIME_ARGS (segment_start), GST_TIME_ARGS (segment_stop));
|
GST_TIME_ARGS (segment_start), GST_TIME_ARGS (segment_stop));
|
||||||
|
|
Loading…
Reference in a new issue