From 0c80f63c5b8e7049f15929ddcac72ecab6e8aaa2 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 13 Oct 2011 16:55:05 +0200 Subject: [PATCH] mpegtsbase: Refactor code to cope with g_hash_table_foreach_remove() --- gst/mpegtsdemux/mpegtsbase.c | 41 ++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 1976ee5c1e..f9b1fbaa37 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -477,21 +477,30 @@ mpegts_base_free_program (MpegTSBaseProgram * program) /* FIXME : This is being called by tsdemux::find_timestamps() * We need to avoid re-entrant code like that */ +static gboolean +mpegts_base_stop_program (MpegTSBase * base, MpegTSBaseProgram * program) +{ + MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base); + + GST_DEBUG_OBJECT (base, "program_number : %d", program->program_number); + + if (klass->program_stopped) + klass->program_stopped (base, program); + + return TRUE; +} + void mpegts_base_remove_program (MpegTSBase * base, gint program_number) { MpegTSBaseProgram *program; - MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base); - GST_DEBUG_OBJECT (base, "program_number : %d", program_number); + program = + (MpegTSBaseProgram *) g_hash_table_lookup (base->programs, + GINT_TO_POINTER (program_number)); + if (program) + mpegts_base_stop_program (base, program); - if (klass->program_stopped) { - program = - (MpegTSBaseProgram *) g_hash_table_lookup (base->programs, - GINT_TO_POINTER (program_number)); - if (program) - klass->program_stopped (base, program); - } g_hash_table_remove (base->programs, GINT_TO_POINTER (program_number)); } @@ -1137,20 +1146,26 @@ mpegts_base_get_tags_from_eit (MpegTSBase * base, GstStructure * eit_info) } } -static void +static gboolean remove_each_program (gpointer key, MpegTSBaseProgram * program, MpegTSBase * base) { /* First deactivate it */ mpegts_base_deactivate_program (base, program); - /* Then remove it */ - mpegts_base_remove_program (base, program->program_number); + + /* Then stop it */ + mpegts_base_stop_program (base, program); + + /* And tell _foreach_remove() to remove it */ + return TRUE; } static gboolean gst_mpegts_base_handle_eos (MpegTSBase * base) { - g_hash_table_foreach (base->programs, (GHFunc) remove_each_program, base); + g_hash_table_foreach_remove (base->programs, (GHRFunc) remove_each_program, + base); + /* finally remove */ return TRUE; }