mpegtsbase: Refactor code to cope with g_hash_table_foreach_remove()

This commit is contained in:
Edward Hervey 2011-10-13 16:55:05 +02:00
parent 6abe2134bf
commit 0c80f63c5b

View file

@ -477,21 +477,30 @@ mpegts_base_free_program (MpegTSBaseProgram * program)
/* FIXME : This is being called by tsdemux::find_timestamps() /* FIXME : This is being called by tsdemux::find_timestamps()
* We need to avoid re-entrant code like that */ * 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 void
mpegts_base_remove_program (MpegTSBase * base, gint program_number) mpegts_base_remove_program (MpegTSBase * base, gint program_number)
{ {
MpegTSBaseProgram *program; 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)); 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, remove_each_program (gpointer key, MpegTSBaseProgram * program,
MpegTSBase * base) MpegTSBase * base)
{ {
/* First deactivate it */ /* First deactivate it */
mpegts_base_deactivate_program (base, program); 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 static gboolean
gst_mpegts_base_handle_eos (MpegTSBase * base) 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 */ /* finally remove */
return TRUE; return TRUE;
} }