From f69bc70665f0c2a254bae0ab632f323a00e3c5c8 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Sat, 15 Jun 2013 21:37:54 +0100 Subject: [PATCH] mpegts: ensure all data queues are properly flushed This ensures that we don't get stale data into the SI table pipelines which can result in processing of data that doesn't match the expected mux (and ultimately screws up addressing). --- src/input/mpegts.h | 2 ++ src/input/mpegts/mpegts_input.c | 17 +++++++++++++++++ src/input/mpegts/mpegts_mux.c | 6 +++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 89fd4dbc..304d9add 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -487,6 +487,8 @@ int mpegts_input_current_weight ( mpegts_input_t *mi ); void mpegts_input_save ( mpegts_input_t *mi, htsmsg_t *c ); +void mpegts_input_flush_mux ( mpegts_input_t *mi, mpegts_mux_t *mm ); + void mpegts_table_dispatch (const uint8_t *sec, size_t r, void *mt); void mpegts_table_release diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 0b2fbb21..e1f90e1e 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -336,6 +336,23 @@ mpegts_input_table_thread ( void *aux ) return NULL; } +void +mpegts_input_flush_mux + ( mpegts_input_t *mi, mpegts_mux_t *mm ) +{ + mpegts_table_feed_t *mtf, *next; + + pthread_mutex_lock(&mi->mi_delivery_mutex); + mtf = TAILQ_FIRST(&mi->mi_table_feed); + while (mtf) { + next = TAILQ_NEXT(mtf, mtf_link); + if (mtf->mtf_mux == mm) + TAILQ_REMOVE(&mi->mi_table_feed, mtf, mtf_link); + mtf = next; + } + pthread_mutex_unlock(&mi->mi_delivery_mutex); +} + /* ************************************************************************** * Creation/Config * *************************************************************************/ diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 33562a4e..73e78406 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -262,7 +262,7 @@ mpegts_mux_stop ( mpegts_mux_t *mm ) { char buf[256]; mpegts_mux_instance_t *mmi = mm->mm_active; - mpegts_input_t *mi; + mpegts_input_t *mi = NULL; mm->mm_display_name(mm, buf, sizeof(buf)); tvhdebug("mpegts", "%s - stopping mux", buf); @@ -277,6 +277,10 @@ mpegts_mux_stop ( mpegts_mux_t *mm ) tvhtrace("mpegts", "%s - flush tables", buf); mpegts_table_flush_all(mm); + /* Flush table data queue */ + if (mi) + mpegts_input_flush_mux(mi, mm); + /* Alert listeners */ // TODO