From: Adam Sutton Date: Mon, 14 Apr 2014 15:58:00 +0000 (+0100) Subject: mpegts: ensure scrambled streams are properly handled X-Git-Tag: v4.1~2171 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0a3f08dacd414205ce3aaff2f1bb2edc5bfa446b;p=thirdparty%2Ftvheadend.git 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 --- diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 5b65f3a39..f4ce6b114 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 fea2045f8..a9277f269 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 1a9cb7ef3..359419a09 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 f572a217a..f321a4551 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;