From bc7d61abca38353296a43e38c05ddddf3e70ab5a Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Mon, 30 May 2011 10:40:08 +0530 Subject: [PATCH] matroska: refactor code common to matroskademux and matroskaparse Move the following functions to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_get_seek_track - gst_matroska_{demux,parse}_reset_streams https://bugzilla.gnome.org/show_bug.cgi?id=650877 --- gst/matroska/matroska-demux.c | 59 ++++--------------------------------- gst/matroska/matroska-parse.c | 56 ++++------------------------------- gst/matroska/matroska-read-common.c | 48 ++++++++++++++++++++++++++++++ gst/matroska/matroska-read-common.h | 4 +++ 4 files changed, 63 insertions(+), 104 deletions(-) diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index 33a37a6..f70e278 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -1514,55 +1514,6 @@ gst_matroska_demux_element_send_event (GstElement * element, GstEvent * event) return res; } -/* determine track to seek in */ -static GstMatroskaTrackContext * -gst_matroska_demux_get_seek_track (GstMatroskaDemux * demux, - GstMatroskaTrackContext * track) -{ - gint i; - - if (track && track->type == GST_MATROSKA_TRACK_TYPE_VIDEO) - return track; - - for (i = 0; i < demux->common.src->len; i++) { - GstMatroskaTrackContext *stream; - - stream = g_ptr_array_index (demux->common.src, i); - if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && stream->index_table) - track = stream; - } - - return track; -} - -/* call with object lock held */ -static void -gst_matroska_demux_reset_streams (GstMatroskaDemux * demux, GstClockTime time, - gboolean full) -{ - gint i; - - GST_DEBUG_OBJECT (demux, "resetting stream state"); - - g_assert (demux->common.src->len == demux->common.num_streams); - for (i = 0; i < demux->common.src->len; i++) { - GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src, - i); - context->pos = time; - context->set_discont = TRUE; - context->eos = FALSE; - context->from_time = GST_CLOCK_TIME_NONE; - if (full) - context->last_flow = GST_FLOW_OK; - if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { - GstMatroskaTrackVideoContext *videocontext = - (GstMatroskaTrackVideoContext *) context; - /* demux object lock held by caller */ - videocontext->earliest_time = GST_CLOCK_TIME_NONE; - } - } -} - static gboolean gst_matroska_demux_move_to_entry (GstMatroskaDemux * demux, GstMatroskaIndex * entry, gboolean reset) @@ -1580,7 +1531,7 @@ gst_matroska_demux_move_to_entry (GstMatroskaDemux * demux, entry->block, GST_TIME_ARGS (entry->time)); /* update the time */ - gst_matroska_demux_reset_streams (demux, entry->time, TRUE); + gst_matroska_read_common_reset_streams (&demux->common, entry->time, TRUE); demux->segment.last_stop = entry->time; demux->seek_block = entry->block; demux->seek_first = TRUE; @@ -1945,7 +1896,7 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux, /* check sanity before we start flushing and all that */ GST_OBJECT_LOCK (demux); - track = gst_matroska_demux_get_seek_track (demux, track); + track = gst_matroska_read_common_get_seek_track (&demux->common, track); if ((entry = gst_matroska_read_common_do_index_seek (&demux->common, track, seeksegment.last_stop, &demux->seek_index, &demux->seek_entry)) == NULL) { @@ -5200,7 +5151,8 @@ gst_matroska_demux_chain (GstPad * pad, GstBuffer * buffer) GST_DEBUG_OBJECT (demux, "got DISCONT"); gst_adapter_clear (demux->common.adapter); GST_OBJECT_LOCK (demux); - gst_matroska_demux_reset_streams (demux, GST_CLOCK_TIME_NONE, FALSE); + gst_matroska_read_common_reset_streams (&demux->common, + GST_CLOCK_TIME_NONE, FALSE); GST_OBJECT_UNLOCK (demux); } @@ -5312,7 +5264,8 @@ gst_matroska_demux_handle_sink_event (GstPad * pad, GstEvent * event) { gst_adapter_clear (demux->common.adapter); GST_OBJECT_LOCK (demux); - gst_matroska_demux_reset_streams (demux, GST_CLOCK_TIME_NONE, TRUE); + gst_matroska_read_common_reset_streams (&demux->common, + GST_CLOCK_TIME_NONE, TRUE); demux->segment.last_stop = GST_CLOCK_TIME_NONE; demux->cluster_time = GST_CLOCK_TIME_NONE; demux->cluster_offset = 0; diff --git a/gst/matroska/matroska-parse.c b/gst/matroska/matroska-parse.c index 92e97c8..f9fc3b3 100644 --- a/gst/matroska/matroska-parse.c +++ b/gst/matroska/matroska-parse.c @@ -1234,54 +1234,6 @@ gst_matroska_parse_element_send_event (GstElement * element, GstEvent * event) return res; } -/* determine track to seek in */ -static GstMatroskaTrackContext * -gst_matroska_parse_get_seek_track (GstMatroskaParse * parse, - GstMatroskaTrackContext * track) -{ - gint i; - - if (track && track->type == GST_MATROSKA_TRACK_TYPE_VIDEO) - return track; - - for (i = 0; i < parse->common.src->len; i++) { - GstMatroskaTrackContext *stream; - - stream = g_ptr_array_index (parse->common.src, i); - if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && stream->index_table) - track = stream; - } - - return track; -} - -static void -gst_matroska_parse_reset_streams (GstMatroskaParse * parse, GstClockTime time, - gboolean full) -{ - gint i; - - GST_DEBUG_OBJECT (parse, "resetting stream state"); - - g_assert (parse->common.src->len == parse->common.num_streams); - for (i = 0; i < parse->common.src->len; i++) { - GstMatroskaTrackContext *context = g_ptr_array_index (parse->common.src, - i); - context->pos = time; - context->set_discont = TRUE; - context->eos = FALSE; - context->from_time = GST_CLOCK_TIME_NONE; - if (full) - context->last_flow = GST_FLOW_OK; - if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { - GstMatroskaTrackVideoContext *videocontext = - (GstMatroskaTrackVideoContext *) context; - /* parse object lock held by caller */ - videocontext->earliest_time = GST_CLOCK_TIME_NONE; - } - } -} - /* searches for a cluster start from @pos, * return GST_FLOW_OK and cluster position in @pos if found */ static GstFlowReturn @@ -1389,7 +1341,7 @@ gst_matroska_parse_handle_seek_event (GstMatroskaParse * parse, if (pad) track = gst_pad_get_element_private (pad); - track = gst_matroska_parse_get_seek_track (parse, track); + track = gst_matroska_read_common_get_seek_track (&parse->common, track); gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); @@ -3824,7 +3776,8 @@ gst_matroska_parse_chain (GstPad * pad, GstBuffer * buffer) GST_DEBUG_OBJECT (parse, "got DISCONT"); gst_adapter_clear (parse->common.adapter); GST_OBJECT_LOCK (parse); - gst_matroska_parse_reset_streams (parse, GST_CLOCK_TIME_NONE, FALSE); + gst_matroska_read_common_reset_streams (&parse->common, + GST_CLOCK_TIME_NONE, FALSE); GST_OBJECT_UNLOCK (parse); } @@ -3934,7 +3887,8 @@ gst_matroska_parse_handle_sink_event (GstPad * pad, GstEvent * event) { gst_adapter_clear (parse->common.adapter); GST_OBJECT_LOCK (parse); - gst_matroska_parse_reset_streams (parse, GST_CLOCK_TIME_NONE, TRUE); + gst_matroska_read_common_reset_streams (&parse->common, + GST_CLOCK_TIME_NONE, TRUE); GST_OBJECT_UNLOCK (parse); parse->segment.last_stop = GST_CLOCK_TIME_NONE; parse->cluster_time = GST_CLOCK_TIME_NONE; diff --git a/gst/matroska/matroska-read-common.c b/gst/matroska/matroska-read-common.c index a8f041b..20e3034 100644 --- a/gst/matroska/matroska-read-common.c +++ b/gst/matroska/matroska-read-common.c @@ -446,6 +446,27 @@ gst_matroska_read_common_get_length (GstMatroskaReadCommon * common) return end; } +/* determine track to seek in */ +GstMatroskaTrackContext * +gst_matroska_read_common_get_seek_track (GstMatroskaReadCommon * common, + GstMatroskaTrackContext * track) +{ + gint i; + + if (track && track->type == GST_MATROSKA_TRACK_TYPE_VIDEO) + return track; + + for (i = 0; i < common->src->len; i++) { + GstMatroskaTrackContext *stream; + + stream = g_ptr_array_index (common->src, i); + if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && stream->index_table) + track = stream; + } + + return track; +} + /* skip unknown or alike element */ GstFlowReturn gst_matroska_read_common_parse_skip (GstMatroskaReadCommon * common, @@ -1102,6 +1123,33 @@ gst_matroska_read_common_read_track_encodings (GstMatroskaReadCommon * common, return gst_matroska_decode_content_encodings (context->encodings); } +/* call with object lock held */ +void +gst_matroska_read_common_reset_streams (GstMatroskaReadCommon * common, + GstClockTime time, gboolean full) +{ + gint i; + + GST_DEBUG_OBJECT (common, "resetting stream state"); + + g_assert (common->src->len == common->num_streams); + for (i = 0; i < common->src->len; i++) { + GstMatroskaTrackContext *context = g_ptr_array_index (common->src, i); + context->pos = time; + context->set_discont = TRUE; + context->eos = FALSE; + context->from_time = GST_CLOCK_TIME_NONE; + if (full) + context->last_flow = GST_FLOW_OK; + if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + GstMatroskaTrackVideoContext *videocontext = + (GstMatroskaTrackVideoContext *) context; + /* demux object lock held by caller */ + videocontext->earliest_time = GST_CLOCK_TIME_NONE; + } + } +} + gboolean gst_matroska_read_common_tracknumber_unique (GstMatroskaReadCommon * common, guint64 num) diff --git a/gst/matroska/matroska-read-common.h b/gst/matroska/matroska-read-common.h index 7c48879..21783fb 100644 --- a/gst/matroska/matroska-read-common.h +++ b/gst/matroska/matroska-read-common.h @@ -87,6 +87,8 @@ GstMatroskaIndex * gst_matroska_read_common_do_index_seek ( void gst_matroska_read_common_found_global_tag (GstMatroskaReadCommon * common, GstElement * el, GstTagList * taglist); gint64 gst_matroska_read_common_get_length (GstMatroskaReadCommon * common); +GstMatroskaTrackContext * gst_matroska_read_common_get_seek_track ( + GstMatroskaReadCommon * common, GstMatroskaTrackContext * track); GstFlowReturn gst_matroska_read_common_parse_index (GstMatroskaReadCommon * common, GstEbmlRead * ebml); GstFlowReturn gst_matroska_read_common_parse_skip (GstMatroskaReadCommon * @@ -104,6 +106,8 @@ gint gst_matroska_read_common_stream_from_num (GstMatroskaReadCommon * common, GstFlowReturn gst_matroska_read_common_read_track_encodings ( GstMatroskaReadCommon * common, GstEbmlRead * ebml, GstMatroskaTrackContext * context); +void gst_matroska_read_common_reset_streams (GstMatroskaReadCommon * common, + GstClockTime time, gboolean full); gboolean gst_matroska_read_common_tracknumber_unique (GstMatroskaReadCommon * common, guint64 num); -- 2.7.4