From: Jaroslav Kysela Date: Sat, 15 Oct 2016 20:09:27 +0000 (+0200) Subject: descrambler: DVBCAM (HW CAM) - do not try to use sw descrambler for HW CAM CAIDs X-Git-Tag: v4.2.1~264 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=39108cea4d93e85f0db852a30ba5a90b0458eb17;p=thirdparty%2Ftvheadend.git descrambler: DVBCAM (HW CAM) - do not try to use sw descrambler for HW CAM CAIDs --- diff --git a/src/descrambler.h b/src/descrambler.h index f6367b36a..7060469ec 100644 --- a/src/descrambler.h +++ b/src/descrambler.h @@ -64,6 +64,7 @@ typedef struct th_descrambler { typedef struct th_descrambler_runtime { struct service *dr_service; tvhcsa_t dr_csa; + uint32_t dr_external:1; uint32_t dr_skip:1; uint32_t dr_quick_ecm:1; uint32_t dr_key:1; @@ -155,6 +156,7 @@ 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 ); void descrambler_keys ( th_descrambler_t *t, int type, const uint8_t *even, const uint8_t *odd ); void descrambler_notify ( th_descrambler_t *t, diff --git a/src/descrambler/descrambler.c b/src/descrambler/descrambler.c index 6de934a93..59d697678 100644 --- a/src/descrambler/descrambler.c +++ b/src/descrambler/descrambler.c @@ -417,6 +417,16 @@ 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 || (dr = t->s_descramble) == NULL) + return; + dr->dr_external = state ? 1 : 0; +} + void descrambler_keys ( th_descrambler_t *td, int type, const uint8_t *even, const uint8_t *odd ) @@ -667,12 +677,12 @@ descrambler_descramble ( service_t *t, lock_assert(&t->s_stream_mutex); - if (dr == NULL) { + if (dr == NULL || dr->dr_external) { if ((tsb[3] & 0x80) == 0) { ts_recv_packet2((mpegts_service_t *)t, tsb, len); return 1; } - return -1; + return dr->dr_external ? 1 : -1; } if (dr->dr_csa.csa_type == DESCRAMBLER_NONE && dr->dr_queue_total == 0) diff --git a/src/descrambler/dvbcam.c b/src/descrambler/dvbcam.c index 237289082..dd71599d0 100644 --- a/src/descrambler/dvbcam.c +++ b/src/descrambler/dvbcam.c @@ -19,6 +19,7 @@ #include #include "tvheadend.h" #include "caclient.h" +#include "descrambler.h" #include "service.h" #include "input.h" @@ -185,9 +186,11 @@ end_of_search_for_cam: list_mgmt = CA_LIST_MANAGEMENT_ONLY; enqueue: - if (as->ca) + if (as->ca) { + descrambler_external((service_t *)s, 1); linuxdvb_ca_enqueue_capmt(as->ca, as->slot, as->last_pmt, as->last_pmt_len, list_mgmt, CA_PMT_CMD_ID_OK_DESCRAMBLING); + } done: pthread_mutex_unlock(&dvbcam_mutex); }