From f9b3b46ab5b5bdaab44a9889a0c184cfef801712 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Sun, 23 Jun 2013 15:12:58 +0200 Subject: [PATCH] mpegtspacketizer: Speed up section parsing Only create subtables when needed. It was previously creating one every single time ... to check if one was present. And speed up code to detect whether a subtable was already present or not. Overall makes section pushing 2 times faster. --- gst/mpegtsdemux/mpegtspacketizer.c | 35 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 85e1cdaab1..63da03375d 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -306,18 +306,20 @@ flush_observations (MpegTSPacketizer2 * packetizer) priv->lastobsid = 0; } -static gint -mpegts_packetizer_stream_subtable_compare (gconstpointer a, gconstpointer b) +static inline MpegTSPacketizerStreamSubtable * +find_subtable (GSList * subtables, guint8 table_id, guint16 subtable_extension) { - MpegTSPacketizerStreamSubtable *asub, *bsub; + GSList *tmp; - asub = (MpegTSPacketizerStreamSubtable *) a; - bsub = (MpegTSPacketizerStreamSubtable *) b; + for (tmp = subtables; tmp; tmp = tmp->next) { + MpegTSPacketizerStreamSubtable *sub = + (MpegTSPacketizerStreamSubtable *) tmp->data; + if (sub->table_id == table_id + && sub->subtable_extension == subtable_extension) + return sub; + } - if (asub->table_id == bsub->table_id && - asub->subtable_extension == bsub->subtable_extension) - return 0; - return -1; + return FALSE; } static gboolean @@ -618,7 +620,6 @@ mpegts_packetizer_parse_section_header (MpegTSPacketizer2 * packetizer, guint8 tmp; guint8 *data, *crc_data; MpegTSPacketizerStreamSubtable *subtable; - GSList *subtable_list = NULL; section->complete = TRUE; /* get the section buffer, ownership stays with the stream */ @@ -644,20 +645,18 @@ mpegts_packetizer_parse_section_header (MpegTSPacketizer2 * packetizer, else section->subtable_extension = GST_READ_UINT16_BE (data + 2); - subtable = mpegts_packetizer_stream_subtable_new (section->table_id, + subtable = + find_subtable (stream->subtables, section->table_id, section->subtable_extension); - - subtable_list = g_slist_find_custom (stream->subtables, subtable, - mpegts_packetizer_stream_subtable_compare); - if (subtable_list) { + if (subtable) { GST_DEBUG ("Found previous subtable_extension:%d", section->subtable_extension); - - g_free (subtable); - subtable = (MpegTSPacketizerStreamSubtable *) (subtable_list->data); } else { GST_DEBUG ("Appending new subtable_extension:%d", section->subtable_extension); + subtable = mpegts_packetizer_stream_subtable_new (section->table_id, + section->subtable_extension); + stream->subtables = g_slist_prepend (stream->subtables, subtable); }