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.
This commit is contained in:
Jan Schmidt 2015-07-29 22:56:28 +10:00
parent 431c4b5e84
commit 0d170d51c7

View file

@ -398,16 +398,7 @@ mpegtsmux_reset (MpegTsMux * mux, gboolean alloc)
mux->programs = g_hash_table_new (g_direct_hash, g_direct_equal); mux->programs = g_hash_table_new (g_direct_hash, g_direct_equal);
if (mux->streamheader) { if (mux->streamheader) {
GstBuffer *buf; g_list_free_full (mux->streamheader, (GDestroyNotify) (gst_buffer_unref));
GList *sh;
sh = mux->streamheader;
while (sh) {
buf = sh->data;
gst_buffer_unref (buf);
sh = g_list_next (sh);
}
g_list_free (mux->streamheader);
mux->streamheader = NULL; mux->streamheader = NULL;
} }
gst_event_replace (&mux->force_key_unit_event, 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 { } else {
hbuf = gst_buffer_copy (buf); 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) { } else if (mux->streamheader) {
mpegtsmux_set_header_on_caps (mux); mpegtsmux_set_header_on_caps (mux);
mux->streamheader_sent = TRUE; mux->streamheader_sent = TRUE;
@ -1695,6 +1689,12 @@ mpegtsmux_set_header_on_caps (MpegTsMux * mux)
g_value_init (&array, GST_TYPE_ARRAY); 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; sh = mux->streamheader;
while (sh) { while (sh) {
buf = sh->data; buf = sh->data;