basetsmux: preserve user-specified sections across resets
authorMathieu Duponchelle <mathieu@centricular.com>
Wed, 29 May 2019 15:01:40 +0000 (17:01 +0200)
committerMathieu Duponchelle <mduponchelle1@gmail.com>
Thu, 30 May 2019 13:53:05 +0000 (13:53 +0000)
As sections can be provided by the user through send_event
when the element state is NULL, their lifetime is expected
to match that of the muxer, and they must be preserved when
the state changes

gst/mpegtsmux/gstbasetsmux.c
gst/mpegtsmux/tsmux/tsmux.c

index 0123f61769e1a64ed204c2beed52c3cce58863a4..94940c8cf5bcf5270f27d4540ae35c1375301cd4 100644 (file)
@@ -270,11 +270,21 @@ gst_base_ts_mux_set_header_on_caps (GstBaseTsMux * mux)
   gst_caps_unref (caps);
 }
 
+static gboolean
+steal_si_section (GstMpegtsSectionType * type, TsMuxSection * section,
+    TsMux * mux)
+{
+  g_hash_table_insert (mux->si_sections, type, section);
+
+  return TRUE;
+}
+
 static void
 gst_base_ts_mux_reset (GstBaseTsMux * mux, gboolean alloc)
 {
   GstBuffer *buf;
   GstBaseTsMuxClass *klass = GST_BASE_TS_MUX_GET_CLASS (mux);
+  GHashTable *si_sections = NULL;
 
   mux->first = TRUE;
   mux->last_flow_ret = GST_FLOW_OK;
@@ -290,6 +300,9 @@ gst_base_ts_mux_reset (GstBaseTsMux * mux, gboolean alloc)
     gst_adapter_clear (mux->out_adapter);
 
   if (mux->tsmux) {
+    if (mux->tsmux->si_sections)
+      si_sections = g_hash_table_ref (mux->tsmux->si_sections);
+
     tsmux_free (mux->tsmux);
     mux->tsmux = NULL;
   }
@@ -309,8 +322,16 @@ gst_base_ts_mux_reset (GstBaseTsMux * mux, gboolean alloc)
     g_assert (klass->create_ts_mux);
 
     mux->tsmux = klass->create_ts_mux (mux);
+
+    /* Preserve user-specified sections across resets */
+    if (si_sections)
+      g_hash_table_foreach_steal (si_sections, (GHRFunc) steal_si_section,
+          mux->tsmux);
   }
 
+  if (si_sections)
+    g_hash_table_unref (si_sections);
+
   if (klass->reset)
     klass->reset (mux);
 }
index 290da032d679366bddb0338bbaa16d6420680bdb..ea5f512ed7c3ba1c16a5d207e958a2de6ed330b9 100644 (file)
@@ -382,7 +382,7 @@ tsmux_free (TsMux * mux)
   g_list_free (mux->streams);
 
   /* Free SI table sections */
-  g_hash_table_destroy (mux->si_sections);
+  g_hash_table_unref (mux->si_sections);
 
   g_slice_free (TsMux, mux);
 }