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 );
#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
(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;
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);
}
}
static void
service_stop(service_t *t)
{
- th_descrambler_t *td;
elementary_stream_t *st;
gtimer_disarm(&t->s_receive_timer);
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;