From: Jaroslav Kysela Date: Thu, 16 Nov 2017 12:57:35 +0000 (+0100) Subject: descrambler: remove dr_external and use dr_descramble instead X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=46dd84951ae26907568fb59f18ecccd3693647be;p=thirdparty%2Ftvheadend.git descrambler: remove dr_external and use dr_descramble instead --- diff --git a/src/descrambler.h b/src/descrambler.h index 99da06b1f..a887f56f3 100644 --- a/src/descrambler.h +++ b/src/descrambler.h @@ -87,7 +87,8 @@ typedef struct th_descrambler_key { typedef struct th_descrambler_runtime { th_descrambler_t *dr_descrambler; struct service *dr_service; - int (*dr_descramble)(struct th_descrambler *td, const uint8_t *tsb, int len); + int (*dr_descramble)(struct service *t, struct elementary_stream *st, + const uint8_t *tsb, int len); int dr_ca_count; int dr_ca_resolved; int dr_ca_failed; @@ -186,7 +187,6 @@ void descrambler_service_start ( struct service *t ); void descrambler_service_stop ( struct service *t ); void descrambler_caid_changed ( struct service *t ); int descrambler_resolved ( struct service *t, th_descrambler_t *ignore ); -void descrambler_external ( struct service *t, int state ); int descrambler_multi_pid ( th_descrambler_t *t ); void descrambler_keys ( th_descrambler_t *t, int type, uint16_t pid, const uint8_t *even, const uint8_t *odd ); @@ -195,6 +195,8 @@ void descrambler_notify ( th_descrambler_t *t, const char *cardsystem, uint16_t pid, uint32_t ecmtime, uint16_t hops, const char *reader, const char *from, const char *protocol ); +int descrambler_pass ( struct service *t, struct elementary_stream *st, + const uint8_t *tsb, int len ); int descrambler_descramble ( struct service *t, struct elementary_stream *st, const uint8_t *tsb, int len ); diff --git a/src/descrambler/descrambler.c b/src/descrambler/descrambler.c index bcceb95ec..146155622 100644 --- a/src/descrambler/descrambler.c +++ b/src/descrambler/descrambler.c @@ -396,14 +396,10 @@ descrambler_service_start ( service_t *t ) dr->dr_force_skip = 0; } - if (t->s_dvb_forcecaid != 0xffff) + if (t->s_dvb_forcecaid == 0xffff) + dr->dr_descramble = descrambler_pass; + else caclient_start(t); - - if (t->s_dvb_forcecaid == 0xffff) { - pthread_mutex_lock(&t->s_stream_mutex); - descrambler_external(t, 1); - pthread_mutex_unlock(&t->s_stream_mutex); - } } void @@ -530,22 +526,6 @@ descrambler_resolved( service_t *t, th_descrambler_t *ignore ) return 0; } -void -descrambler_external ( service_t *t, int state ) -{ - th_descrambler_runtime_t *dr; - - if (t == NULL) - return; - - lock_assert(&t->s_stream_mutex); - - if ((dr = t->s_descramble) == NULL) - return; - dr->dr_external = state ? 1 : 0; - service_reset_streaming_status_flags(t, TSS_NO_DESCRAMBLER); -} - int descrambler_multi_pid ( th_descrambler_t *td ) { @@ -982,6 +962,17 @@ ecm_reset( service_t *t, th_descrambler_runtime_t *dr ) return ret; } +int +descrambler_pass ( service_t *t, + elementary_stream_t *st, + const uint8_t *tsb, + int len ) +{ + if ((tsb[3] & 0x80) == 0) + ts_recv_packet0((mpegts_service_t *)t, st, tsb, len); + return 1; +} + int descrambler_descramble ( service_t *t, elementary_stream_t *st, @@ -1009,13 +1000,7 @@ descrambler_descramble ( service_t *t, } if (dr->dr_descramble) - return dr->dr_descramble(dr->dr_descrambler, tsb, len); - - if (dr->dr_external) { - if ((tsb[3] & 0x80) == 0) - ts_recv_packet0((mpegts_service_t *)t, st, tsb, len); - return 1; - } + return dr->dr_descramble(t, st, tsb, len); if (!dr->dr_key_multipid) { tk = &dr->dr_keys[0]; diff --git a/src/descrambler/dvbcam.c b/src/descrambler/dvbcam.c index c417f5517..062963fd0 100644 --- a/src/descrambler/dvbcam.c +++ b/src/descrambler/dvbcam.c @@ -25,6 +25,7 @@ #include "input.h" #include "dvbcam.h" +#include "input/mpegts/tsdemux.h" #include "input/mpegts/linuxdvb/linuxdvb_private.h" #if ENABLE_LINUXDVB_CA @@ -266,11 +267,10 @@ dvbcam_pmt_data(mpegts_service_t *s, const uint8_t *ptr, int len) list_mgmt = CA_LIST_MANAGEMENT_UPDATE; } else { list_mgmt = ac->active_programs ? CA_LIST_MANAGEMENT_ADD : - CA_LIST_MANAGEMENT_ONLY; + CA_LIST_MANAGEMENT_ONLY; ac->active_programs++; } - descrambler_external((service_t *)s, 1); linuxdvb_ca_enqueue_capmt(ac->ca, ac->slot, as->last_pmt, as->last_pmt_len, list_mgmt, CA_PMT_CMD_ID_OK_DESCRAMBLING); done: @@ -315,9 +315,10 @@ dvbcam_service_destroy(th_descrambler_t *td) #if ENABLE_DDCI static int -dvbcam_descramble(struct th_descrambler *td, const uint8_t *tsb, int len) +dvbcam_descramble_ddci(service_t *t, elementary_stream_t *st, const uint8_t *tsb, int len) { - dvbcam_active_service_t *as = (dvbcam_active_service_t *)td; + th_descrambler_runtime_t *dr = ((mpegts_service_t *)t)->s_descramble; + dvbcam_active_service_t *as = (dvbcam_active_service_t *)dr->dr_descrambler; linuxdvb_ddci_t *lddci = as->ac->ca->lddci; linuxdvb_ddci_put(lddci, tsb, len); @@ -333,6 +334,8 @@ dvbcam_service_start(caclient_t *cac, service_t *t) dvbcam_active_cam_t *ac = NULL; th_descrambler_t *td; elementary_stream_t *st; + th_descrambler_runtime_t *dr; + mpegts_mux_t *mm; caid_t *c = NULL; int count = 0; char buf[128]; @@ -391,17 +394,15 @@ end_of_search_for_cam: td->td_nicename = strdup(buf); td->td_service = t; td->td_stop = dvbcam_service_destroy; + dr = t->s_descramble; + dr->dr_descrambler = td; + dr->dr_descramble = descrambler_pass; #if ENABLE_DDCI if (ac->ca->lddci) { - th_descrambler_runtime_t *dr = t->s_descramble; - mpegts_mux_t *mm; - /* assign the service to the DD CI CAM */ linuxdvb_ddci_assign(ac->ca->lddci, t); - if (dr) { - dr->dr_descrambler = td; - dr->dr_descramble = dvbcam_descramble; - } + dr->dr_descramble = dvbcam_descramble_ddci; + /* open ECM PID */ assert(c); mm = ((mpegts_service_t *)t)->s_dvb_mux; mpegts_input_open_service_pid(mm->mm_active->mmi_input, mm, t,