summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst/mpegtsdemux/mpegtsbase.c10
-rw-r--r--gst/mpegtsdemux/tsdemux.c5
2 files changed, 15 insertions, 0 deletions
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c
index d63122f7c..eb16aac39 100644
--- a/gst/mpegtsdemux/mpegtsbase.c
+++ b/gst/mpegtsdemux/mpegtsbase.c
@@ -816,6 +816,11 @@ mpegts_base_apply_pat (MpegTSBase * base, GstMpegtsSection * section)
if (klass->can_remove_program (base, program)) {
mpegts_base_deactivate_program (base, program);
mpegts_base_remove_program (base, patp->program_number);
+ } else {
+ /* sub-class now owns the program and must call
+ * mpegts_base_deactivate_and_free_program later */
+ g_hash_table_steal (base->programs,
+ GINT_TO_POINTER ((gint) patp->program_number));
}
/* FIXME: when this happens it may still be pmt pid of another
* program, so setting to False may make it go through expensive
@@ -891,6 +896,11 @@ mpegts_base_apply_pmt (MpegTSBase * base, GstMpegtsSection * section)
if (klass->can_remove_program (base, old_program)) {
mpegts_base_deactivate_program (base, old_program);
mpegts_base_free_program (old_program);
+ } else {
+ /* sub-class now owns the program and must call
+ * mpegts_base_deactivate_and_free_program later */
+ g_hash_table_steal (base->programs,
+ GINT_TO_POINTER ((gint) old_program->program_number));
}
initial_program = FALSE;
} else
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c
index 8eaf9a798..1a51ac901 100644
--- a/gst/mpegtsdemux/tsdemux.c
+++ b/gst/mpegtsdemux/tsdemux.c
@@ -407,6 +407,11 @@ gst_ts_demux_reset (MpegTSBase * base)
demux->global_tags = NULL;
}
+ if (demux->previous_program) {
+ mpegts_base_deactivate_and_free_program (base, demux->previous_program);
+ demux->previous_program = NULL;
+ }
+
demux->have_group_id = FALSE;
demux->group_id = G_MAXUINT;