From: Jaroslav Kysela Date: Thu, 18 Oct 2018 18:36:59 +0000 (+0200) Subject: dvb psi: change PMT monitor when PMT PID changes for SID, issue #4942 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f89dc75ba0e9b2aaf86e1746b3ed4434a6f118ed;p=thirdparty%2Ftvheadend.git dvb psi: change PMT monitor when PMT PID changes for SID, issue #4942 --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 9d29d56ca..037235964 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -1022,6 +1022,7 @@ elementary_stream_t *mpegts_input_open_service_pid ( mpegts_input_t *mi, mpegts_mux_t *mm, service_t *s, streaming_component_type_t stype, int pid, int weight, int create ); +void mpegts_input_open_pmt_monitor ( mpegts_mux_t *mm, mpegts_service_t *s ); void mpegts_input_open_cat_monitor ( mpegts_mux_t *mm, mpegts_service_t *s ); void tsdebug_encode_keys diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index a90fc6fcb..4dfffe26a 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -1017,7 +1017,8 @@ dvb_pat_callback NULL, "pmt", LS_TBL_BASE, MT_CRC | MT_QUICKREQ | MT_ONESHOT | MT_SCANSUBS, pid, MPS_WEIGHT_PMT_SCAN); - + if (save & 2) /* PMT PID change? */ + mpegts_input_open_pmt_monitor(mm, s); if (save) service_request_save((service_t*)s); } diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index ddfc5257f..0bcc603db 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -809,10 +809,23 @@ fin: return dvb_table_end((mpegts_psi_table_t *)mt, st, sect); } +void +mpegts_input_open_pmt_monitor + ( mpegts_mux_t *mm, mpegts_service_t *s ) +{ + if (s->s_pmt_mon) + mpegts_table_destroy(s->s_pmt_mon); + s->s_pmt_mon = + mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK, + dvb_pmt_callback, s, "pmt", LS_TBL_BASE, + MT_CRC, s->s_components.set_pmt_pid, MPS_WEIGHT_PMT); +} + void mpegts_input_open_cat_monitor ( mpegts_mux_t *mm, mpegts_service_t *s ) { + assert(s->s_cat_mon == NULL); s->s_cat_mon = mpegts_table_add(mm, DVB_CAT_BASE, DVB_CAT_MASK, mpegts_input_cat_pass_callback, s, "cat", @@ -885,11 +898,8 @@ no_pids: pthread_mutex_unlock(&mi->mi_output_lock); /* Add PMT monitor */ - if(s->s_type == STYPE_STD) { - s->s_pmt_mon = - mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK, - dvb_pmt_callback, s, "pmt", LS_TBL_BASE, - MT_CRC, s->s_components.set_pmt_pid, MPS_WEIGHT_PMT); + if (s->s_type == STYPE_STD) { + mpegts_input_open_pmt_monitor(mm, s); if (s->s_scrambled_pass && (flags & SUBSCRIPTION_EMM) != 0) mpegts_input_open_cat_monitor(mm, s); } diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index b8da15ff7..a04686fda 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -922,7 +922,7 @@ mpegts_service_find if (service_id16(s) == sid) { if (pmt_pid && pmt_pid != s->s_components.set_pmt_pid) { s->s_components.set_pmt_pid = pmt_pid; - if (save) *save = 1; + if (save) *save = 3; } if (create) { if ((save && *save) || s->s_dvb_last_seen + 3600 < gclk()) {