From b53f82a2286cf27d02d3b69f7af02b5382d3f24e Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 14 Feb 2017 16:49:49 +0100 Subject: [PATCH] descrambled: fix forcecaid handling, fixes #4215 --- src/descrambler/descrambler.c | 10 ++++++---- src/input/mpegts.h | 1 - src/input/mpegts/tsdemux.c | 11 ++++++----- src/service.c | 4 ++++ src/service.h | 1 + 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/descrambler/descrambler.c b/src/descrambler/descrambler.c index 63210892b..d58cbe984 100644 --- a/src/descrambler/descrambler.c +++ b/src/descrambler/descrambler.c @@ -244,7 +244,7 @@ descrambler_service_start ( service_t *t ) if (t->s_scrambled_pass) return; - if (!((mpegts_service_t *)t)->s_dvb_forcecaid) { + if (!t->s_dvb_forcecaid) { count = 0; TAILQ_FOREACH(st, &t->s_filt_components, es_filt_link) @@ -266,7 +266,7 @@ descrambler_service_start ( service_t *t ) if (constcw_table) { for (p = constcw_table; *p; p++) - if (*p == ((mpegts_service_t *)t)->s_dvb_forcecaid) { + if (*p == t->s_dvb_forcecaid) { constcw = 1; break; } @@ -288,13 +288,15 @@ descrambler_service_start ( service_t *t ) dr->dr_force_skip = 0; tvhcsa_init(&dr->dr_csa); } - caclient_start(t); + + if (t->s_dvb_forcecaid != 0xffff) + caclient_start(t); #if ENABLE_LINUXDVB_CA dvbcam_service_start(t); #endif - if (((mpegts_service_t *)t)->s_dvb_forcecaid == 0xffff) { + if (t->s_dvb_forcecaid == 0xffff) { pthread_mutex_lock(&t->s_stream_mutex); descrambler_external(t, 1); pthread_mutex_unlock(&t->s_stream_mutex); diff --git a/src/input/mpegts.h b/src/input/mpegts.h index d7fb16130..0345a3edb 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -578,7 +578,6 @@ struct mpegts_service char *s_dvb_charset; uint16_t s_dvb_prefcapid; int s_dvb_prefcapid_lock; - uint16_t s_dvb_forcecaid; time_t s_dvb_created; time_t s_dvb_last_seen; time_t s_dvb_check_seen; diff --git a/src/input/mpegts/tsdemux.c b/src/input/mpegts/tsdemux.c index 81ab9c986..bd4e6cd1d 100644 --- a/src/input/mpegts/tsdemux.c +++ b/src/input/mpegts/tsdemux.c @@ -179,8 +179,9 @@ ts_recv_packet1 (mpegts_service_t *t, const uint8_t *tsb, int len, int table) { elementary_stream_t *st; - int pid, r; - int error = 0; + int_fast16_t pid; + uint_fast8_t scrambled, error = 0; + int r; /* Error */ if (tsb[1] & 0x80) @@ -218,14 +219,14 @@ ts_recv_packet1 if(!error) service_set_streaming_status_flags((service_t*)t, TSS_INPUT_SERVICE); + scrambled = t->s_scrambled_seen; if(!t->s_scrambled_pass && - ((tsb[3] & 0xc0) || - (t->s_scrambled_seen && st && st->es_type != SCT_CA))) { + ((tsb[3] & 0xc0) || (scrambled && st && st->es_type != SCT_CA))) { /** * Lock for descrambling, but only if packet was not in error */ - if(!error) + if(!scrambled && !error) t->s_scrambled_seen |= service_is_encrypted((service_t*)t); /* scrambled stream */ diff --git a/src/service.c b/src/service.c index 340880b9d..7a760b8c5 100644 --- a/src/service.c +++ b/src/service.c @@ -1332,6 +1332,10 @@ int service_is_encrypted(service_t *t) { elementary_stream_t *st; + if (((mpegts_service_t *)t)->s_dvb_forcecaid == 0xffff) + return 0; + if (((mpegts_service_t *)t)->s_dvb_forcecaid) + return 1; TAILQ_FOREACH(st, &t->s_components, es_link) if (st->es_type == SCT_CA) return 1; diff --git a/src/service.h b/src/service.h index 390adf0d7..658a57782 100644 --- a/src/service.h +++ b/src/service.h @@ -457,6 +457,7 @@ typedef struct service { * Descrambling support */ + uint16_t s_dvb_forcecaid; struct th_descrambler_list s_descramblers; uint8_t s_scrambled_seen; uint8_t s_scrambled_pass; -- 2.47.2