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;
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,
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 )
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)
#include <ctype.h>
#include "tvheadend.h"
#include "caclient.h"
+#include "descrambler.h"
#include "service.h"
#include "input.h"
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);
}