descrambler: add stop fcn and remove the loop from tsdemux
This commit is contained in:
parent
7425d43a23
commit
18315fc72f
4 changed files with 37 additions and 30 deletions
|
@ -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 );
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue