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:
parent
25bc74b8a6
commit
d0bb024e11
10
ChangeLog
10
ChangeLog
@ -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:
|
||||||
|
@ -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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user