From 35c0d91e5133e7e6614d48d3884fb2a31cf46df8 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sat, 17 Oct 2015 19:40:24 +0200 Subject: [PATCH] dvbpsi: move the service enable / seen flag to PMT table (test also running elementary streams), fixes #3167 --- src/input/mpegts/dvb_psi.c | 15 +++++++++------ src/service.c | 10 ++++++++++ src/service.h | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 2e078feee..e0d5e6967 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -872,12 +872,6 @@ dvb_pat_callback tvhdebug("pat", " sid %04X (%d) on pid %04X (%d)", sid, sid, pid, pid); int save = 0; if ((s = mpegts_service_find(mm, sid, pid, 1, &save))) { - if (!s->s_enabled && s->s_auto == SERVICE_AUTO_PAT_MISSING) { - tvhinfo("mpegts", "enabling service %s [sid %04X/%d] (found in PAT)", - s->s_nicename, s->s_dvb_service_id, s->s_dvb_service_id); - service_set_enabled((service_t *)s, 1, SERVICE_AUTO_NORMAL); - } - s->s_dvb_check_seen = dispatch_clock; mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK, dvb_pmt_callback, NULL, "pmt", MT_CRC | MT_QUICKREQ | MT_ONESHOT | MT_SCANSUBS, @@ -2358,6 +2352,15 @@ psi_parse_pmt // notify descrambler that we found another CAIDs if (update & PMT_UPDATE_NEW_CAID) descrambler_caid_changed((service_t *)t); + + if (service_has_audio_or_video((service_t *)t)) { + t->s_dvb_check_seen = dispatch_clock; + if (!t->s_enabled && t->s_auto == SERVICE_AUTO_PAT_MISSING) { + tvhinfo("mpegts", "enabling service %s [sid %04X/%d] (found in PAT and PMT)", + t->s_nicename, t->s_dvb_service_id, t->s_dvb_service_id); + service_set_enabled((service_t *)t, 1, SERVICE_AUTO_NORMAL); + } + } } return ret; } diff --git a/src/service.c b/src/service.c index 2acf4e478..f6c6be368 100644 --- a/src/service.c +++ b/src/service.c @@ -1071,6 +1071,16 @@ service_data_timeout(void *aux) /** * */ +int +service_has_audio_or_video(service_t *t) +{ + elementary_stream_t *st; + TAILQ_FOREACH(st, &t->s_components, es_link) + if (SCT_ISVIDEO(st->es_type) || SCT_ISAUDIO(st->es_type)) + return 1; + return 0; +} + int service_is_sdtv(service_t *t) { diff --git a/src/service.h b/src/service.h index dcaf590c2..3a96e611c 100644 --- a/src/service.h +++ b/src/service.h @@ -530,6 +530,7 @@ void service_settings_write(service_t *t); const char *service_servicetype_txt(service_t *t); +int service_has_audio_or_video(service_t *t); int service_is_sdtv(service_t *t); int service_is_hdtv(service_t *t); int service_is_radio(service_t *t); -- 2.47.3