diff --git a/src/descrambler.h b/src/descrambler.h index 094a7f2e..4bfcd753 100755 --- a/src/descrambler.h +++ b/src/descrambler.h @@ -85,7 +85,8 @@ LIST_HEAD(caid_list, caid); void descrambler_init ( void ); void descrambler_done ( void ); void descrambler_service_start ( struct service *t ); -int descrambler_descramble ( th_descrambler_t *td, +void descrambler_service_stop ( struct service *t ); +int descrambler_descramble ( struct service *t, struct elementary_stream *st, const uint8_t *tsb ); const char *descrambler_caid2name( uint16_t caid ); diff --git a/src/descrambler/descrambler.c b/src/descrambler/descrambler.c index 2e6753b3..4608a02d 100755 --- a/src/descrambler/descrambler.c +++ b/src/descrambler/descrambler.c @@ -134,19 +134,37 @@ descrambler_service_start ( service_t *t ) #endif } +void +descrambler_service_stop ( service_t *t ) +{ + th_descrambler_t *td; + + while ((td = LIST_FIRST(&t->s_descramblers)) != NULL) + td->td_stop(td); +} + int -descrambler_descramble ( th_descrambler_t *td, +descrambler_descramble ( service_t *t, struct elementary_stream *st, const uint8_t *tsb ) { - if (td->td_keystate == DS_FORBIDDEN) + th_descrambler_t *td; + int count, failed; + + LIST_FOREACH(td, &t->s_descramblers, td_service_link) { + count++; + if (td->td_keystate == DS_FORBIDDEN) { + failed++; + continue; + } + if (td->td_keystate != DS_RESOLVED) + continue; + tvhcsa_descramble(td->td_csa, + (struct mpegts_service *)td->td_service, + st, tsb); return 1; - if (td->td_keystate != DS_RESOLVED) - return -1; - tvhcsa_descramble(td->td_csa, - (struct mpegts_service *)td->td_service, - st, tsb); - return 0; + } + return count == failed ? -1 : 0; } // TODO: might actually put const char* into caid_t diff --git a/src/input/mpegts/tsdemux.c b/src/input/mpegts/tsdemux.c index 00f2210d..f0dfa596 100644 --- a/src/input/mpegts/tsdemux.c +++ b/src/input/mpegts/tsdemux.c @@ -175,8 +175,7 @@ ts_recv_packet1 (mpegts_service_t *t, const uint8_t *tsb, int64_t *pcrp, int table) { elementary_stream_t *st; - int pid, n, m, r; - th_descrambler_t *td; + int pid, r; int error = 0; int64_t pcr = PTS_UNSET; @@ -244,25 +243,16 @@ ts_recv_packet1 t->s_scrambled_seen |= service_is_encrypted((service_t*)t); /* scrambled stream */ - n = m = 0; - - LIST_FOREACH(td, &t->s_descramblers, td_service_link) { - n++; - - r = descrambler_descramble(td, st, tsb); - if(r == 0) { - pthread_mutex_unlock(&t->s_stream_mutex); - return 1; - } - - if(r == 1) - m++; + r = descrambler_descramble((service_t *)t, st, tsb); + if(r > 0) { + pthread_mutex_unlock(&t->s_stream_mutex); + return 1; } - if(!error && service_is_encrypted((service_t*)t) != 0) { - if(n == 0) { + if(!error && service_is_encrypted((service_t*)t)) { + if(r == 0) { service_set_streaming_status_flags((service_t*)t, TSS_NO_DESCRAMBLER); - } else if(m == n) { + } else { service_set_streaming_status_flags((service_t*)t, TSS_NO_ACCESS); } } diff --git a/src/service.c b/src/service.c index a4705426..479977ea 100644 --- a/src/service.c +++ b/src/service.c @@ -265,7 +265,6 @@ service_stream_destroy(service_t *t, elementary_stream_t *es) static void service_stop(service_t *t) { - th_descrambler_t *td; elementary_stream_t *st; gtimer_disarm(&t->s_receive_timer); @@ -274,8 +273,7 @@ service_stop(service_t *t) pthread_mutex_lock(&t->s_stream_mutex); - while((td = LIST_FIRST(&t->s_descramblers)) != NULL) - td->td_stop(td); + descrambler_service_stop(t); t->s_tt_commercial_advice = COMMERCIAL_UNKNOWN;