summaryrefslogtreecommitdiff
path: root/gst/mpegtsmux
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2015-07-29 22:56:28 +1000
committerJan Schmidt <jan@centricular.com>2015-07-29 23:10:49 +1000
commit0d170d51c7565cef5ebb933e28b262f35a57162a (patch)
treea0d63078c242fdcd65b12821dd04d7aeb4c0fe1a /gst/mpegtsmux
parent431c4b5e84f5242424ee76971a4798ab1798e331 (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')
-rw-r--r--gst/mpegtsmux/mpegtsmux.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c
index 15f4356ec..bcd9deecc 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;