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;
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 );
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 );
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
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 )
{
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,
}
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];
#include "input.h"
#include "dvbcam.h"
+#include "input/mpegts/tsdemux.h"
#include "input/mpegts/linuxdvb/linuxdvb_private.h"
#if ENABLE_LINUXDVB_CA
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:
#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);
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];
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,