diff options
-rw-r--r-- | gst/mpegtsdemux/mpegtsbase.c | 10 | ||||
-rw-r--r-- | gst/mpegtsdemux/tsdemux.c | 5 |
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; |