From 0a3f08dacd414205ce3aaff2f1bb2edc5bfa446b Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Mon, 14 Apr 2014 16:58:00 +0100 Subject: [PATCH] mpegts: ensure scrambled streams are properly handled If a scrambled has been seen on a "scrambled" channel all further packets (within the subscription) MUST be processed through the descrambler else we can end up with out of sequence packets causing CC errors. Relates to #1986 --- src/input/mpegts/dvb_psi.c | 6 ------ src/input/mpegts/tsdemux.c | 4 ++-- src/service.c | 1 + src/service.h | 1 - 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 5b65f3a3..f4ce6b11 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -952,12 +952,6 @@ dvb_sdt_callback s->s_servicetype = r; } - /* Update scrambled state */ - if (s->s_scrambled != free_ca_mode) { - s->s_scrambled = free_ca_mode; - tvhtrace("sdt", " scrambled changed"); - } - /* Check if this is master * Some networks appear to provide diff service names on diff transponders */ diff --git a/src/input/mpegts/tsdemux.c b/src/input/mpegts/tsdemux.c index fea2045f..a9277f26 100644 --- a/src/input/mpegts/tsdemux.c +++ b/src/input/mpegts/tsdemux.c @@ -239,7 +239,7 @@ ts_recv_packet1 * Lock for descrambling, but only if packet was not in error */ if(!error) - t->s_scrambled_seen = t->s_scrambled; + t->s_scrambled_seen |= service_is_encrypted((service_t*)t); /* scrambled stream */ n = m = 0; @@ -257,7 +257,7 @@ ts_recv_packet1 m++; } - if(!error && t->s_scrambled != 0) { + if(!error && service_is_encrypted((service_t*)t) != 0) { if(n == 0) { service_set_streaming_status_flags((service_t*)t, TSS_NO_DESCRAMBLER); } else if(m == n) { diff --git a/src/service.c b/src/service.c index 1a9cb7ef..359419a0 100644 --- a/src/service.c +++ b/src/service.c @@ -334,6 +334,7 @@ service_start(service_t *t, int instance) assert(t->s_status != SERVICE_RUNNING); t->s_streaming_status = 0; + t->s_scrambled_seen = 0; if((r = t->s_start_feed(t, instance))) return r; diff --git a/src/service.h b/src/service.h index f572a217..f321a455 100644 --- a/src/service.h +++ b/src/service.h @@ -397,7 +397,6 @@ typedef struct service { */ struct th_descrambler_list s_descramblers; - int s_scrambled; int s_scrambled_seen; int s_caid; uint16_t s_prefcapid;