SAT>IP Server/Client: Add more tuner types (atsc, dvbcb, dvbs, dvbc2)

This commit is contained in:
Jaroslav Kysela 2015-03-18 11:45:04 +01:00
parent 28e8db1dc2
commit 3dfc1eba78
8 changed files with 194 additions and 54 deletions

View file

@ -390,7 +390,7 @@ satip_device_create( satip_device_info_t *info )
tvh_uuid_t uuid;
htsmsg_t *conf = NULL, *feconf = NULL;
char *argv[10];
int i, j, n, m, fenum, t2, save = 0;
int i, j, n, m, fenum, v2, save = 0;
dvb_fe_type_t type;
char buf2[60];
@ -454,20 +454,34 @@ satip_device_create( satip_device_info_t *info )
n = http_tokenize(sd->sd_info.tunercfg, argv, 10, ',');
for (i = 0, fenum = 1; i < n; i++) {
type = DVB_TYPE_NONE;
t2 = 0;
v2 = 0;
if (strncmp(argv[i], "DVBS2-", 6) == 0) {
type = DVB_TYPE_S;
m = atoi(argv[i] + 6);
v2 = 1;
} else if (strncmp(argv[i], "DVBS-", 5) == 0) {
type = DVB_TYPE_S;
m = atoi(argv[i] + 5);
} else if (strncmp(argv[i], "DVBT2-", 6) == 0) {
type = DVB_TYPE_T;
m = atoi(argv[i] + 6);
t2 = 1;
v2 = 1;
} else if (strncmp(argv[i], "DVBT-", 5) == 0) {
type = DVB_TYPE_T;
m = atoi(argv[i] + 5);
} else if (strncmp(argv[i], "DVBC2-", 6) == 0) {
type = DVB_TYPE_C;
m = atoi(argv[i] + 6);
v2 = 1;
} else if (strncmp(argv[i], "DVBC-", 5) == 0) {
type = DVB_TYPE_C;
m = atoi(argv[i] + 5);
} else if (strncmp(argv[i], "ATSC-", 5) == 0) {
type = DVB_TYPE_ATSC;
m = atoi(argv[i] + 5);
} else if (strncmp(argv[i], "DVBCB-", 6) == 0) {
m = atoi(argv[i] + 6);
v2 = 2;
}
if (type == DVB_TYPE_NONE) {
tvhlog(LOG_ERR, "satip", "%s: bad tuner type [%s]",
@ -477,7 +491,7 @@ satip_device_create( satip_device_info_t *info )
satip_device_nicename(sd, buf2, sizeof(buf2)), argv[i]);
} else {
for (j = 0; j < m; j++)
if (satip_frontend_create(feconf, sd, type, t2, fenum))
if (satip_frontend_create(feconf, sd, type, v2, fenum))
fenum++;
}
}

View file

@ -65,7 +65,14 @@ satip_frontend_signal_cb( void *aux )
return;
if (!lfe->sf_tables) {
psi_tables_default(mmi->mmi_mux);
psi_tables_dvb(mmi->mmi_mux);
if (lfe->sf_type == DVB_TYPE_ATSC) {
if (lfe->sf_atsc_c)
psi_tables_atsc_c(mmi->mmi_mux);
else
psi_tables_atsc_t(mmi->mmi_mux);
} else {
psi_tables_dvb(mmi->mmi_mux);
}
lfe->sf_tables = 1;
}
sigstat.status_text = signal2str(lfe->sf_status);
@ -335,6 +342,16 @@ const idclass_t satip_frontend_dvbc_class =
}
};
const idclass_t satip_frontend_atsc_class =
{
.ic_super = &satip_frontend_class,
.ic_class = "satip_frontend_atsc",
.ic_caption = "SAT>IP ATSC Frontend",
.ic_properties = (const property_t[]){
{}
}
};
/* **************************************************************************
* Class methods
* *************************************************************************/
@ -500,6 +517,7 @@ satip_frontend_start_mux
lfe->sf_req = tr;
lfe->sf_running = 1;
lfe->sf_tables = 0;
lfe->sf_atsc_c = lm->lm_tuning.dmc_fe_modulation != DVB_MOD_VSB_8;
lfe->sf_status = SIGNAL_NONE;
pthread_mutex_unlock(&lfe->sf_dvr_lock);
@ -618,6 +636,8 @@ satip_frontend_network_list ( mpegts_input_t *mi )
idc = &dvb_network_dvbs_class;
else if (lfe->sf_type == DVB_TYPE_C)
idc = &dvb_network_dvbc_class;
else if (lfe->sf_type == DVB_TYPE_ATSC)
idc = &dvb_network_atsc_class;
else
return NULL;
@ -1562,7 +1582,7 @@ satip_frontend_hacks( satip_frontend_t *lfe, int *def_positions )
satip_frontend_t *
satip_frontend_create
( htsmsg_t *conf, satip_device_t *sd, dvb_fe_type_t type, int t2, int num )
( htsmsg_t *conf, satip_device_t *sd, dvb_fe_type_t type, int v2, int num )
{
const idclass_t *idc;
const char *uuid = NULL, *override = NULL;
@ -1606,6 +1626,8 @@ satip_frontend_create
idc = &satip_frontend_dvbt_class;
else if (type == DVB_TYPE_C)
idc = &satip_frontend_dvbc_class;
else if (type == DVB_TYPE_ATSC)
idc = &satip_frontend_atsc_class;
else {
tvherror("satip", "unknown FE type %d", type);
return NULL;
@ -1618,7 +1640,7 @@ satip_frontend_create
lfe->sf_device = sd;
lfe->sf_number = num;
lfe->sf_type = type;
lfe->sf_type_t2 = t2;
lfe->sf_type_v2 = v2;
lfe->sf_master = master;
lfe->sf_type_override = override ? strdup(override) : NULL;
satip_frontend_hacks(lfe, &def_positions);

View file

@ -110,7 +110,7 @@ struct satip_frontend
*/
int sf_number;
dvb_fe_type_t sf_type;
int sf_type_t2;
int sf_type_v2;
char *sf_type_override;
int sf_master;
int sf_udp_rtp_port;
@ -127,6 +127,7 @@ struct satip_frontend
int sf_thread;
int sf_running;
int sf_tables;
int sf_atsc_c;
int sf_position;
signal_state_t sf_status;
gtimer_t sf_monitor_timer;
@ -183,7 +184,7 @@ char *satip_device_nicename ( satip_device_t *sd, char *buf, int len );
satip_frontend_t *
satip_frontend_create
( htsmsg_t *conf, satip_device_t *sd, dvb_fe_type_t type, int t2, int num );
( htsmsg_t *conf, satip_device_t *sd, dvb_fe_type_t type, int v2, int num );
void satip_frontend_save ( satip_frontend_t *lfe, htsmsg_t *m );

View file

@ -77,8 +77,9 @@ satip_rtsp_setup( http_client_t *hc, int src, int fe,
{ .t = DVB_SYS_DVBS, "dvbs" },
{ .t = DVB_SYS_DVBS2, "dvbs2" },
{ .t = DVB_SYS_DVBC_ANNEX_A, "dvbc" },
{ .t = DVB_SYS_DVBC_ANNEX_B, "dvbc" },
{ .t = DVB_SYS_DVBC_ANNEX_C, "dvbc" },
{ .t = DVB_SYS_ATSC, "atsc" },
{ .t = DVB_SYS_DVBC_ANNEX_B, "dvbcb" },
{ .t = TABLE_EOD }
};
static tvh2satip_t pol[] = {
@ -190,7 +191,8 @@ satip_rtsp_setup( http_client_t *hc, int src, int fe,
dmc->u.dmc_fe_qam.fec_inner != DVB_FEC_AUTO)
/* note: OctopusNet device does not handle 'fec=auto' */
ADD(u.dmc_fe_qam.fec_inner, fec, "auto");
} else {
} else if (dmc->dmc_fe_delsys == DVB_SYS_DVBT ||
dmc->dmc_fe_delsys == DVB_SYS_DVBT2) {
satip_rtsp_add_val("freq", buf, dmc->dmc_fe_freq / 1000);
if (dmc->u.dmc_fe_ofdm.bandwidth != DVB_BANDWIDTH_AUTO &&
dmc->u.dmc_fe_ofdm.bandwidth != DVB_BANDWIDTH_NONE)
@ -209,6 +211,14 @@ satip_rtsp_setup( http_client_t *hc, int src, int fe,
if (dmc->dmc_fe_delsys == DVB_SYS_DVBT2)
if (dmc->dmc_fe_stream_id != DVB_NO_STREAM_ID_FILTER)
satip_rtsp_add_val("pls", buf, (dmc->dmc_fe_stream_id & 0xff) * 1000);
} else if (dmc->dmc_fe_delsys == DVB_SYS_ATSC ||
dmc->dmc_fe_delsys == DVB_SYS_DVBC_ANNEX_B) {
satip_rtsp_add_val("freq", buf, dmc->dmc_fe_freq / 1000);
if (dmc->dmc_fe_modulation != DVB_MOD_AUTO &&
dmc->dmc_fe_modulation != DVB_MOD_NONE &&
dmc->dmc_fe_modulation != DVB_MOD_QAM_AUTO)
ADD(dmc_fe_modulation, mtype,
dmc->dmc_fe_delsys == DVB_SYS_ATSC ? "8vsb" : "64qam");
}
if (flags & SATIP_SETUP_PIDS0)
strcat(buf, "&pids=0");

View file

@ -88,23 +88,53 @@ rtsp_delsys(int fe, int *findex)
if (fe < 1)
return DVB_SYS_NONE;
pthread_mutex_lock(&global_lock);
i = config_get_int("satip_dvbt", 0);
if (fe <= i) {
res = DVB_SYS_DVBT;
goto result;
}
fe -= i;
i = config_get_int("satip_dvbs", 0);
if (fe <= i) {
res = DVB_SYS_DVBS;
goto result;
}
fe -= i;
i = config_get_int("satip_dvbs2", 0);
if (fe <= i) {
res = DVB_SYS_DVBS;
goto result;
}
fe -= i;
i = config_get_int("satip_dvbt", 0);
if (fe <= i) {
res = DVB_SYS_DVBT;
goto result;
}
fe -= i;
i = config_get_int("satip_dvbt2", 0);
if (fe <= i) {
res = DVB_SYS_DVBT;
goto result;
}
fe -= i;
i = config_get_int("satip_dvbc", 0);
if (fe <= i) {
res = DVB_SYS_DVBC_ANNEX_A;
goto result;
}
fe -= i;
i = config_get_int("satip_dvbc2", 0);
if (fe <= i) {
res = DVB_SYS_DVBC_ANNEX_A;
goto result;
}
fe -= i;
i = config_get_int("satip_atsc", 0);
if (fe <= i) {
res = DVB_SYS_ATSC;
goto result;
}
fe -= i;
i = config_get_int("satip_dvbcb", 0);
if (fe <= i) {
res = DVB_SYS_DVBC_ANNEX_B;
goto result;
}
pthread_mutex_unlock(&global_lock);
return DVB_SYS_NONE;
result:
@ -688,6 +718,8 @@ msys_to_tvh(http_connection_t *hc)
{ "dvbt2", DVB_SYS_DVBT2 },
{ "dvbc", DVB_SYS_DVBC_ANNEX_A },
{ "dvbc2", DVB_SYS_DVBC_ANNEX_C },
{ "atsc", DVB_SYS_ATSC },
{ "dvbcb", DVB_SYS_DVBC_ANNEX_B }
};
const char *s = http_arg_get_remove(&hc->hc_req_args, "msys");
return s[0] ? str2val(s, tab) : DVB_SYS_NONE;
@ -811,6 +843,7 @@ mtype_to_tvh(http_connection_t *hc)
{ "64qam", DVB_MOD_QAM_64 },
{ "128qam", DVB_MOD_QAM_128 },
{ "256qam", DVB_MOD_QAM_256 },
{ "8vsb", DVB_MOD_VSB_8 },
};
const char *s = http_arg_get_remove(&hc->hc_req_args, "mtype");
if (s[0]) {
@ -1088,6 +1121,11 @@ rtsp_process_play(http_connection_t *hc, int setup)
dmc->dmc_fe_stream_id = plp;
dmc->dmc_fe_pls_code = ds; /* check */
} else if (msys == DVB_SYS_ATSC || msys == DVB_SYS_DVBC_ANNEX_B) {
if (!TAILQ_EMPTY(&hc->hc_req_args))
goto error;
} else {
goto error;

View file

@ -46,6 +46,12 @@ int satip_server_match_uuid(const char *uuid)
* XML description
*/
struct xml_type_xtab {
const char *id;
const char *cname;
int *count;
};
static int
satip_server_http_xml(http_connection_t *hc)
{
@ -103,9 +109,24 @@ satip_server_http_xml(http_connection_t *hc)
char *devicelist = NULL;
htsbuf_queue_t q;
mpegts_network_t *mn;
int dvbt = 0, dvbs = 0, dvbc = 0, srcs = 0, delim = 0, i;
int dvbt = 0, dvbs = 0, dvbc = 0, atsc = 0;
int srcs = 0, delim = 0, tuners = 0, i;
struct xml_type_xtab *p;
http_arg_list_t args;
struct xml_type_xtab xtab[] = {
{ "DVBS", "satip_dvbs", &dvbs },
{ "DVBS2", "satip_dvbs2", &dvbs },
{ "DVBT", "satip_dvbt", &dvbt },
{ "DVBT2", "satip_dvbt2", &dvbt },
{ "DVBC", "satip_dvbc", &dvbc },
{ "DVBC2", "satip_dvbc2", &dvbc },
{ "ATSC", "satip_atsc", &atsc },
{ "DVBCB", "satip_dvbcb", &dvbc },
{}
};
htsbuf_queue_init(&q, 0);
pthread_mutex_lock(&global_lock);
@ -120,36 +141,31 @@ satip_server_http_xml(http_connection_t *hc)
srcs = mn->mn_satip_source;
} else if (idnode_is_instance(&mn->mn_id, &dvb_network_dvbc_class))
dvbc++;
else if (idnode_is_instance(&mn->mn_id, &dvb_network_atsc_class))
atsc++;
}
if (dvbs && (i = config_get_int("satip_dvbs", 0)) > 0) {
htsbuf_qprintf(&q, "%sDVBS2-%d", delim ? "," : "", i);
delim++;
} else {
dvbs = 0;
}
if (dvbt && (i = config_get_int("satip_dvbt", 0)) > 0) {
htsbuf_qprintf(&q, "%sDVBT-%d", delim ? "," : "", i);
delim++;
} else {
dvbt = 0;
}
if (dvbc && (i = config_get_int("satip_dvbc", 0)) > 0) {
htsbuf_qprintf(&q, "%sDVBC-%d", delim ? "," : "", i);
delim++;
} else {
dvbc = 0;
for (p = xtab; p->id; p++) {
i = config_get_int(p->cname, 0);
if (i > 0) {
tuners += i;
if (*p->count && i > 0) {
htsbuf_qprintf(&q, "%s%s-%d", delim ? "," : "", p->id, i);
delim++;
}
}
}
pthread_mutex_unlock(&global_lock);
if (!dvbs)
srcs = 0;
devicelist = htsbuf_to_string(&q);
printf("devicelist: '%s'\n", devicelist);
htsbuf_queue_flush(&q);
if (devicelist == NULL || devicelist[0] == '\0') {
tcp_get_ip_str((struct sockaddr*)hc->hc_peer, buf, sizeof(buf));
tvhwarn("satips", "SAT>IP server announces an empty tuner list to a client %s (missing %s)",
buf, dvbt + dvbs + dvbc ? "tuner settings - global config" : "network assignment");
buf, !tuners ? "tuner settings - global config" : "network assignment");
}
if (satip_server_rtsp_port != 554)
@ -495,14 +511,20 @@ static void satip_server_info(const char *prefix, int descramble, int muxcnf)
{
tvhinfo("satips", "SAT>IP Server %sinitialized "
"(HTTP %s:%d, RTSP %s:%d, "
"descramble %d, muxcnf %d, DVB-T %d, DVB-S2 %d, DVB-C %d)",
"descramble %d, muxcnf %d)",
prefix,
http_server_ip, http_server_port,
http_server_ip, satip_server_rtsp_port,
descramble, muxcnf,
descramble, muxcnf);
tvhinfo("satips", "SAT>IP Server tuners: DVB-T/T2 %d/%d, DVB-S/S2 %d/%d, DVB-C/C2 %d/%d, ATSC %d, DVB-Cable/AnnexB %d",
config_get_int("satip_dvbt", 0),
config_get_int("satip_dvbt2", 0),
config_get_int("satip_dvbs", 0),
config_get_int("satip_dvbc", 0));
config_get_int("satip_dvbs2", 0),
config_get_int("satip_dvbc", 0),
config_get_int("satip_dvbc2", 0),
config_get_int("satip_atsc", 0),
config_get_int("satip_dvbcb", 0));
}
/*

View file

@ -531,14 +531,24 @@ extjs_config(http_connection_t *hc, const char *remain, void *opaque)
ssave |= config_set_int("satip_weight", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_descramble")))
ssave |= config_set_int("satip_descramble", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbt")))
ssave |= config_set_int("satip_dvbt", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbs")))
ssave |= config_set_int("satip_dvbs", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbc")))
ssave |= config_set_int("satip_dvbc", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_muxcnf")))
ssave |= config_set_int("satip_muxcnf", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbs")))
ssave |= config_set_int("satip_dvbs", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbs2")))
ssave |= config_set_int("satip_dvbs2", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbt")))
ssave |= config_set_int("satip_dvbt", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbt2")))
ssave |= config_set_int("satip_dvbt2", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbc")))
ssave |= config_set_int("satip_dvbc", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbc2")))
ssave |= config_set_int("satip_dvbc2", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_atsc")))
ssave |= config_set_int("satip_atsc", atoi(str));
if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbcb")))
ssave |= config_set_int("satip_dvbcb", atoi(str));
if (save | ssave)
config_save();
if (ssave)

View file

@ -45,8 +45,9 @@ tvheadend.miscconf = function(panel, index) {
'tvhtime_update_enabled', 'tvhtime_ntp_enabled',
'tvhtime_tolerance',
'prefer_picon', 'chiconpath', 'piconpath',
'satip_rtsp', 'satip_weight', 'satip_descramble',
'satip_dvbt', 'satip_dvbs', 'satip_dvbc'
'satip_rtsp', 'satip_weight', 'satip_descramble', 'satip_muxcnf',
'satip_dvbs', 'satip_dvbs2', 'satip_dvbt', 'satip_dvbt2',
'satip_dvbc', 'satip_dvbc2', 'satip_atsc', 'satip_dvbcb'
]);
/* ****************************************************************
@ -234,21 +235,41 @@ tvheadend.miscconf = function(panel, index) {
name: 'satip_descramble',
fieldLabel: 'Descramble Services (Limit Per Mux)'
});
var muxcnf = new Ext.form.NumberField({
name: 'satip_muxcnf',
fieldLabel: 'Muxes Handling (0 = auto, 1 = keep, 2 = reject)'
});
var dvbs = new Ext.form.NumberField({
name: 'satip_dvbs',
fieldLabel: 'Exported DVB-S Tuners'
});
var dvbs2 = new Ext.form.NumberField({
name: 'satip_dvbs2',
fieldLabel: 'Exported DVB-S2 Tuners'
});
var dvbt = new Ext.form.NumberField({
name: 'satip_dvbt',
fieldLabel: 'Exported DVB-T Tuners'
});
var dvbs = new Ext.form.NumberField({
name: 'satip_dvbs',
fieldLabel: 'Exported DVB-S2 Tuners'
var dvbt2 = new Ext.form.NumberField({
name: 'satip_dvbt2',
fieldLabel: 'Exported DVB-T2 Tuners'
});
var dvbc = new Ext.form.NumberField({
name: 'satip_dvbc',
fieldLabel: 'Exported DVB-C Tuners'
});
var muxcnf = new Ext.form.NumberField({
name: 'satip_muxcnf',
fieldLabel: 'Muxes Handling (0 = auto, 1 = keep, 2 = reject)'
var dvbc2 = new Ext.form.NumberField({
name: 'satip_dvbc2',
fieldLabel: 'Exported DVB-C2 Tuners'
});
var atsc = new Ext.form.NumberField({
name: 'satip_atsc',
fieldLabel: 'Exported ATSC Tuners'
});
var dvbcb = new Ext.form.NumberField({
name: 'satip_dvbcb',
fieldLabel: 'Exported DVB-Cable/AnnexB Tuners'
});
satipPanel = new Ext.form.FieldSet({
@ -256,8 +277,10 @@ tvheadend.miscconf = function(panel, index) {
width: 700,
autoHeight: true,
collapsible: true,
collapsed: true,
animCollapse: true,
items: [rtsp, weight, descramble, dvbt, dvbs, dvbc, muxcnf]
items: [rtsp, weight, descramble, muxcnf,
dvbs, dvbs2, dvbt, dvbt2, dvbc, dvbc2, atsc, dvbcb]
});
}