mpegts cwc: re-add configuration for prefcapid (fixes #2001)

This commit is contained in:
Adam Sutton 2014-04-21 21:22:50 +01:00
parent 7348408b2a
commit a9e7d13cbf
5 changed files with 20 additions and 45 deletions

View file

@ -771,9 +771,9 @@ forbid:
ct->cs_channel = es->es_channel;
ct->ecm_state = ECM_VALID;
if(t->s_prefcapid == 0 || t->s_prefcapid != ct->cs_channel) {
t->s_prefcapid = ct->cs_channel;
tvhlog(LOG_DEBUG, "cwc", "Saving prefered PID %d", t->s_prefcapid);
if(t->s_dvb_prefcapid == 0 || t->s_dvb_prefcapid != ct->cs_channel) {
t->s_dvb_prefcapid = ct->cs_channel;
tvhlog(LOG_DEBUG, "cwc", "Saving prefered PID %d", t->s_dvb_prefcapid);
service_request_save((service_t*)t, 0);
}
@ -1638,28 +1638,28 @@ cwc_table_input(struct th_descrambler *td, service_t *s,
if (ct->ecm_state == ECM_RESET) {
ct->ecm_state = ECM_INIT;
ct->cs_channel = -1;
t->s_prefcapid = 0;
t->s_dvb_prefcapid = 0;
tvhlog(LOG_DEBUG, "cwc", "Reset after unexpected or no reply for service \"%s\"", t->s_dvb_svcname);
}
if (ct->ecm_state == ECM_INIT) {
// Validate prefered ECM PID
if(t->s_prefcapid != 0) {
if(t->s_dvb_prefcapid != 0) {
struct elementary_stream *prefca
= service_stream_find((service_t*)t, t->s_prefcapid);
= service_stream_find((service_t*)t, t->s_dvb_prefcapid);
if (!prefca || prefca->es_type != SCT_CA) {
tvhlog(LOG_DEBUG, "cwc", "Invalid prefered ECM (PID %d) found for service \"%s\"", t->s_prefcapid, t->s_dvb_svcname);
t->s_prefcapid = 0;
tvhlog(LOG_DEBUG, "cwc", "Invalid prefered ECM (PID %d) found for service \"%s\"", t->s_dvb_prefcapid, t->s_dvb_svcname);
t->s_dvb_prefcapid = 0;
}
}
if(t->s_prefcapid == st->es_pid) {
if(t->s_dvb_prefcapid == st->es_pid) {
ep = calloc(1, sizeof(ecm_pid_t));
ep->ep_pid = t->s_prefcapid;
ep->ep_pid = t->s_dvb_prefcapid;
LIST_INSERT_HEAD(&ct->cs_pids, ep, ep_link);
tvhlog(LOG_DEBUG, "cwc", "Insert prefered ECM (PID %d) for service \"%s\"", t->s_prefcapid, t->s_dvb_svcname);
tvhlog(LOG_DEBUG, "cwc", "Insert prefered ECM (PID %d) for service \"%s\"", t->s_dvb_prefcapid, t->s_dvb_svcname);
}
else if(t->s_prefcapid == 0) {
else if(t->s_dvb_prefcapid == 0) {
ep = calloc(1, sizeof(ecm_pid_t));
ep->ep_pid = st->es_pid;
LIST_INSERT_HEAD(&ct->cs_pids, ep, ep_link);

View file

@ -360,6 +360,7 @@ struct mpegts_service
char *s_dvb_cridauth;
uint16_t s_dvb_servicetype;
char *s_dvb_charset;
uint16_t s_dvb_prefcapid;
/*
* EIT/EPG control

View file

@ -126,6 +126,13 @@ const idclass_t mpegts_service_class =
.list = dvb_charset_enum,
.opts = PO_ADVANCED,
},
{
.type = PT_U16,
.id = "prefcapid",
.name = "Pref. CA PID",
.off = offsetof(mpegts_service_t, s_dvb_prefcapid),
.opts = PO_ADVANCED,
},
{},
}
};

View file

@ -911,26 +911,6 @@ service_build_stream_start(service_t *t)
/**
*
*/
void
service_set_enable(service_t *t, int enabled)
{
if(t->s_enabled == enabled)
return;
t->s_enabled = enabled;
t->s_config_save(t);
subscription_reschedule();
}
void
service_set_prefcapid(service_t *t, uint32_t prefcapid)
{
if(t->s_prefcapid == prefcapid)
return;
t->s_prefcapid = prefcapid;
t->s_config_save(t);
}
static pthread_mutex_t pending_save_mutex;
static pthread_cond_t pending_save_cond;

View file

@ -398,7 +398,6 @@ typedef struct service {
struct th_descrambler_list s_descramblers;
int s_scrambled_seen;
int s_caid;
uint16_t s_prefcapid;
/**
* List of all components.
@ -462,8 +461,6 @@ service_stream_find(service_t *t, int pid)
elementary_stream_t *service_stream_create(service_t *t, int pid,
streaming_component_type_t type);
void service_set_priority(service_t *t, int prio);
void service_settings_write(service_t *t);
const char *service_servicetype_txt(service_t *t);
@ -493,8 +490,6 @@ service_set_streaming_status_flags(service_t *t, int flag)
struct streaming_start;
struct streaming_start *service_build_stream_start(service_t *t);
void service_set_enable(service_t *t, int enabled);
void service_restart(service_t *t, int had_components);
void service_stream_destroy(service_t *t, elementary_stream_t *st);
@ -526,14 +521,6 @@ int tss2errcode(int tss);
uint16_t service_get_encryption(service_t *t);
void service_set_dvb_charset(service_t *t, const char *dvb_charset);
void service_set_dvb_eit_enable(service_t *t, int dvb_eit_enable);
void service_set_prefcapid(service_t *t, uint32_t prefcapid);
int service_is_primary_epg (service_t *t);
htsmsg_t *servicetype_list (void);
void service_load ( service_t *s, htsmsg_t *c );