gst/matroska/matroska-demux.c: When receiving a SEEK event on a specific pad first search for a seek table entry for ...

Original commit message from CVS:
* gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek),
(gst_matroska_demux_element_send_event),
(gst_matroska_demux_handle_seek_event),
(gst_matroska_demux_handle_src_event):
When receiving a SEEK event on a specific pad first search for a seek
table entry for the stream of the pad and then fall back to an entry
for a different stream.
This commit is contained in:
Sebastian Dröge 2008-08-02 18:35:21 +00:00
parent 25bc74b8a6
commit d0bb024e11
2 changed files with 35 additions and 13 deletions

View File

@ -1,3 +1,13 @@
2008-08-02 Sebastian Dröge <sebastian.droege@collabora.co.uk>
* gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek),
(gst_matroska_demux_element_send_event),
(gst_matroska_demux_handle_seek_event),
(gst_matroska_demux_handle_src_event):
When receiving a SEEK event on a specific pad first search for a seek
table entry for the stream of the pad and then fall back to an entry
for a different stream.
2008-08-02 Sebastian Dröge <sebastian.droege@collabora.co.uk> 2008-08-02 Sebastian Dröge <sebastian.droege@collabora.co.uk>
* configure.ac: * configure.ac:

View File

@ -130,7 +130,7 @@ static gboolean gst_matroska_demux_sink_activate_pull (GstPad * sinkpad,
static gboolean gst_matroska_demux_sink_activate (GstPad * sinkpad); static gboolean gst_matroska_demux_sink_activate (GstPad * sinkpad);
static gboolean gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux, static gboolean gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
GstEvent * event); GstPad * pad, GstEvent * event);
static gboolean gst_matroska_demux_handle_src_event (GstPad * pad, static gboolean gst_matroska_demux_handle_src_event (GstPad * pad,
GstEvent * event); GstEvent * event);
static const GstQueryType *gst_matroska_demux_get_src_query_types (GstPad * static const GstQueryType *gst_matroska_demux_get_src_query_types (GstPad *
@ -872,9 +872,8 @@ gst_matroska_decode_content_encodings (GArray * encodings)
guint8 *data = NULL; guint8 *data = NULL;
guint size; guint size;
if ((enc-> if ((enc->scope & GST_MATROSKA_TRACK_ENCODING_SCOPE_NEXT_CONTENT_ENCODING)
scope & GST_MATROSKA_TRACK_ENCODING_SCOPE_NEXT_CONTENT_ENCODING) == == 0)
0)
continue; continue;
/* Encryption not supported yet */ /* Encryption not supported yet */
@ -1915,8 +1914,8 @@ gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query)
} }
static GstMatroskaIndex * static GstMatroskaIndex *
gst_matroskademux_do_index_seek (GstMatroskaDemux * demux, gint64 seek_pos, gst_matroskademux_do_index_seek (GstMatroskaDemux * demux, guint track,
gint64 segment_stop, gboolean keyunit) gint64 seek_pos, gint64 segment_stop, gboolean keyunit)
{ {
GstMatroskaIndex *entry = NULL; GstMatroskaIndex *entry = NULL;
guint n; guint n;
@ -1930,7 +1929,7 @@ gst_matroskademux_do_index_seek (GstMatroskaDemux * demux, gint64 seek_pos,
index = &g_array_index (demux->index, GstMatroskaIndex, n); index = &g_array_index (demux->index, GstMatroskaIndex, n);
if (index->time <= seek_pos) if (index->time <= seek_pos && ((track && index->track == track) || !track))
entry = index; entry = index;
else else
break; break;
@ -1945,7 +1944,10 @@ gst_matroskademux_do_index_seek (GstMatroskaDemux * demux, gint64 seek_pos,
GstMatroskaIndex *index; GstMatroskaIndex *index;
GstClockTimeDiff d_this, d_entry; GstClockTimeDiff d_this, d_entry;
do {
index = &g_array_index (demux->index, GstMatroskaIndex, n); index = &g_array_index (demux->index, GstMatroskaIndex, n);
} while (n++ < demux->index->len && ((track && index->track == track)
|| !track));
d_entry = GST_CLOCK_DIFF (entry->time, seek_pos); d_entry = GST_CLOCK_DIFF (entry->time, seek_pos);
if (d_entry < 0) if (d_entry < 0)
@ -1962,6 +1964,10 @@ gst_matroskademux_do_index_seek (GstMatroskaDemux * demux, gint64 seek_pos,
} }
} }
if (entry == NULL && track)
entry = gst_matroskademux_do_index_seek (demux, 0,
seek_pos, segment_stop, keyunit);
return entry; return entry;
} }
@ -2004,7 +2010,7 @@ gst_matroska_demux_element_send_event (GstElement * element, GstEvent * event)
g_return_val_if_fail (event != NULL, FALSE); g_return_val_if_fail (event != NULL, FALSE);
if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) { if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) {
res = gst_matroska_demux_handle_seek_event (demux, event); res = gst_matroska_demux_handle_seek_event (demux, NULL, event);
} else { } else {
GST_WARNING ("Unhandled event of type %s", GST_EVENT_TYPE_NAME (event)); GST_WARNING ("Unhandled event of type %s", GST_EVENT_TYPE_NAME (event));
res = FALSE; res = FALSE;
@ -2015,7 +2021,7 @@ gst_matroska_demux_element_send_event (GstElement * element, GstEvent * event)
static gboolean static gboolean
gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux, gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
GstEvent * event) GstPad * pad, GstEvent * event)
{ {
GstMatroskaIndex *entry; GstMatroskaIndex *entry;
GstSeekFlags flags; GstSeekFlags flags;
@ -2027,6 +2033,12 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
gint64 cur, stop; gint64 cur, stop;
gint64 segment_start, segment_stop; gint64 segment_start, segment_stop;
gint i; gint i;
guint track = 0;
if (pad) {
GstMatroskaTrackContext *context = gst_pad_get_element_private (pad);
track = context->num;
}
gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
&stop_type, &stop); &stop_type, &stop);
@ -2046,7 +2058,7 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
/* check sanity before we start flushing and all that */ /* check sanity before we start flushing and all that */
if (cur_type == GST_SEEK_TYPE_SET) { if (cur_type == GST_SEEK_TYPE_SET) {
GST_OBJECT_LOCK (demux); GST_OBJECT_LOCK (demux);
if (!gst_matroskademux_do_index_seek (demux, cur, -1, FALSE)) { if (!gst_matroskademux_do_index_seek (demux, 0, cur, -1, FALSE)) {
GST_DEBUG ("No matching seek entry in index"); GST_DEBUG ("No matching seek entry in index");
GST_OBJECT_UNLOCK (demux); GST_OBJECT_UNLOCK (demux);
return FALSE; return FALSE;
@ -2100,7 +2112,7 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
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));
entry = gst_matroskademux_do_index_seek (demux, segment_start, entry = gst_matroskademux_do_index_seek (demux, track, segment_start,
segment_stop, keyunit); segment_stop, keyunit);
if (!entry) { if (!entry) {
@ -2198,7 +2210,7 @@ gst_matroska_demux_handle_src_event (GstPad * pad, GstEvent * event)
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_SEEK: case GST_EVENT_SEEK:
res = gst_matroska_demux_handle_seek_event (demux, event); res = gst_matroska_demux_handle_seek_event (demux, pad, event);
break; break;
/* events we don't need to handle */ /* events we don't need to handle */