diff options
author | Jan Schmidt <jan@centricular.com> | 2015-07-29 22:56:28 +1000 |
---|---|---|
committer | Jan Schmidt <jan@centricular.com> | 2015-07-29 23:10:49 +1000 |
commit | 0d170d51c7565cef5ebb933e28b262f35a57162a (patch) | |
tree | a0d63078c242fdcd65b12821dd04d7aeb4c0fe1a /gst/mpegtsmux/mpegtsmux.c | |
parent | 431c4b5e84f5242424ee76971a4798ab1798e331 (diff) |
mpegtsmux: Accumulate streamheaders in reverse
Accumulate streamheader packets in reverse into the
GList for efficiency, and reverse the list once when
processing.
Improves muxing speed when there are a lot of
streamheaders.
Diffstat (limited to 'gst/mpegtsmux/mpegtsmux.c')
-rw-r--r-- | gst/mpegtsmux/mpegtsmux.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c index 15f4356ece..bcd9deeccb 100644 --- a/gst/mpegtsmux/mpegtsmux.c +++ b/gst/mpegtsmux/mpegtsmux.c @@ -398,16 +398,7 @@ mpegtsmux_reset (MpegTsMux * mux, gboolean alloc) mux->programs = g_hash_table_new (g_direct_hash, g_direct_equal); if (mux->streamheader) { - GstBuffer *buf; - GList *sh; - - sh = mux->streamheader; - while (sh) { - buf = sh->data; - gst_buffer_unref (buf); - sh = g_list_next (sh); - } - g_list_free (mux->streamheader); + g_list_free_full (mux->streamheader, (GDestroyNotify) (gst_buffer_unref)); mux->streamheader = NULL; } gst_event_replace (&mux->force_key_unit_event, NULL); @@ -1386,7 +1377,10 @@ new_packet_common_init (MpegTsMux * mux, GstBuffer * buf, guint8 * data, } else { hbuf = gst_buffer_copy (buf); } - mux->streamheader = g_list_append (mux->streamheader, hbuf); + GST_LOG_OBJECT (mux, + "Collecting packet with pid 0x%04x into streamheaders", pid); + /* Streamheader packets collected in reverse order for efficiency */ + mux->streamheader = g_list_prepend (mux->streamheader, hbuf); } else if (mux->streamheader) { mpegtsmux_set_header_on_caps (mux); mux->streamheader_sent = TRUE; @@ -1695,6 +1689,12 @@ mpegtsmux_set_header_on_caps (MpegTsMux * mux) g_value_init (&array, GST_TYPE_ARRAY); + GST_LOG_OBJECT (mux, "setting %u packets into streamheader", + g_list_length (mux->streamheader)); + + /* Stream headers were accumulated in reverse, so fix that */ + mux->streamheader = g_list_reverse (mux->streamheader); + sh = mux->streamheader; while (sh) { buf = sh->data; |