descrambler: add stop fcn and remove the loop from tsdemux

This commit is contained in:
Jaroslav Kysela 2014-05-30 09:39:49 +02:00
parent 7425d43a23
commit 18315fc72f
4 changed files with 37 additions and 30 deletions

View file

@ -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 );

View file

@ -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

View file

@ -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);
}
}

View file

@ -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;