Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
ATSC - separate T and C networks
  • Loading branch information
perexg committed Dec 8, 2015
1 parent 717d561 commit f02851a
Show file tree
Hide file tree
Showing 18 changed files with 360 additions and 180 deletions.
6 changes: 4 additions & 2 deletions src/api/api_mpegts.c
Expand Up @@ -387,8 +387,10 @@ api_dvb_scanfile_list
list = &scanfile_regions_DVBC;
else if (!strcasecmp(type, "dvbs"))
list = &scanfile_regions_DVBS;
else if (!strcasecmp(type, "atsc"))
list = &scanfile_regions_ATSC;
else if (!strcasecmp(type, "atsc-t"))
list = &scanfile_regions_ATSC_T;
else if (!strcasecmp(type, "atsc-c"))
list = &scanfile_regions_ATSC_C;
else
return -EINVAL;

Expand Down
5 changes: 3 additions & 2 deletions src/input/mpegts/dvb.h
Expand Up @@ -378,8 +378,9 @@ typedef enum dvb_fe_type {
DVB_TYPE_T = 1, /* terrestrial */
DVB_TYPE_C, /* cable */
DVB_TYPE_S, /* satellite */
DVB_TYPE_ATSC, /* terrestrial - north america */
DVB_TYPE_LAST = DVB_TYPE_ATSC
DVB_TYPE_ATSC_T, /* terrestrial - north america */
DVB_TYPE_ATSC_C, /* cable - north america */
DVB_TYPE_LAST = DVB_TYPE_ATSC_C
} dvb_fe_type_t;

typedef enum dvb_fe_spectral_inversion {
Expand Down
34 changes: 25 additions & 9 deletions src/input/mpegts/dvb_support.c
Expand Up @@ -598,22 +598,35 @@ int dvb_str2rolloff(const char *p)

const static struct strtab delsystab[] = {
{ "NONE", DVB_SYS_NONE },
{ "DVB-C", DVB_SYS_DVBC_ANNEX_A },
{ "DVBC/ANNEX_A", DVB_SYS_DVBC_ANNEX_A },
{ "DVBC_ANNEX_A", DVB_SYS_DVBC_ANNEX_A },
{ "ATSC-C", DVB_SYS_DVBC_ANNEX_B },
{ "DVBC/ANNEX_B", DVB_SYS_DVBC_ANNEX_B },
{ "DVBC_ANNEX_B", DVB_SYS_DVBC_ANNEX_B },
{ "DVB-C/ANNEX-C",DVB_SYS_DVBC_ANNEX_C },
{ "DVBC/ANNEX_C", DVB_SYS_DVBC_ANNEX_C },
{ "DVBC_ANNEX_C", DVB_SYS_DVBC_ANNEX_C },
{ "DVBC_ANNEX_AC",DVB_SYS_DVBC_ANNEX_A }, /* for compatibility */
{ "DVB-T", DVB_SYS_DVBT },
{ "DVBT", DVB_SYS_DVBT },
{ "DVB-T2", DVB_SYS_DVBT2 },
{ "DVBT2", DVB_SYS_DVBT2 },
{ "DVB-S", DVB_SYS_DVBS },
{ "DVBS", DVB_SYS_DVBS },
{ "DVB-S2", DVB_SYS_DVBS2 },
{ "DVBS2", DVB_SYS_DVBS2 },
{ "DVB-H", DVB_SYS_DVBH },
{ "DVBH", DVB_SYS_DVBH },
{ "ISDB-T", DVB_SYS_ISDBT },
{ "ISDBT", DVB_SYS_ISDBT },
{ "ISDB-S", DVB_SYS_ISDBS },
{ "ISDBS", DVB_SYS_ISDBS },
{ "ISDB-C", DVB_SYS_ISDBC },
{ "ISDBC", DVB_SYS_ISDBC },
{ "ATSC-T", DVB_SYS_ATSC },
{ "ATSC", DVB_SYS_ATSC },
{ "ATSCM-H", DVB_SYS_ATSCMH },
{ "ATSCMH", DVB_SYS_ATSCMH },
{ "DTMB", DVB_SYS_DTMB },
{ "DMBTH", DVB_SYS_DTMB }, /* for compatibility */
Expand All @@ -629,7 +642,6 @@ dvb_delsys2type ( dvb_fe_delivery_system_t delsys )
{
switch (delsys) {
case DVB_SYS_DVBC_ANNEX_A:
case DVB_SYS_DVBC_ANNEX_B:
case DVB_SYS_DVBC_ANNEX_C:
case DVB_SYS_ISDBC:
return DVB_TYPE_C;
Expand All @@ -644,7 +656,9 @@ dvb_delsys2type ( dvb_fe_delivery_system_t delsys )
return DVB_TYPE_S;
case DVB_SYS_ATSC:
case DVB_SYS_ATSCMH:
return DVB_TYPE_ATSC;
return DVB_TYPE_ATSC_T;
case DVB_SYS_DVBC_ANNEX_B:
return DVB_TYPE_ATSC_C;
default:
return DVB_TYPE_NONE;
}
Expand Down Expand Up @@ -841,10 +855,11 @@ const static struct strtab poltab[] = {
dvb_str2val(pol);

const static struct strtab typetab[] = {
{"DVB-T", DVB_TYPE_T},
{"DVB-C", DVB_TYPE_C},
{"DVB-S", DVB_TYPE_S},
{"ATSC", DVB_TYPE_ATSC},
{"DVB-T", DVB_TYPE_T},
{"DVB-C", DVB_TYPE_C},
{"DVB-S", DVB_TYPE_S},
{"ATSC-T", DVB_TYPE_ATSC_T},
{"ATSC-C", DVB_TYPE_ATSC_C}
};
dvb_str2val(type);

Expand Down Expand Up @@ -943,7 +958,7 @@ dvb_mux_conf_str_dvbs ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize )
}

static int
dvb_mux_conf_str_atsc ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize )
dvb_mux_conf_str_atsc_t ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize )
{
return
snprintf(buf, bufsize,
Expand All @@ -963,11 +978,12 @@ dvb_mux_conf_str ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize )
case DVB_TYPE_T:
return dvb_mux_conf_str_dvbt(dmc, buf, bufsize);
case DVB_TYPE_C:
case DVB_TYPE_ATSC_C:
return dvb_mux_conf_str_dvbc(dmc, buf, bufsize);
case DVB_TYPE_S:
return dvb_mux_conf_str_dvbs(dmc, buf, bufsize);
case DVB_TYPE_ATSC:
return dvb_mux_conf_str_atsc(dmc, buf, bufsize);
case DVB_TYPE_ATSC_T:
return dvb_mux_conf_str_atsc_t(dmc, buf, bufsize);
default:
return
snprintf(buf, bufsize, "UNKNOWN MUX CONFIG");
Expand Down
6 changes: 3 additions & 3 deletions src/input/mpegts/linuxdvb/linuxdvb_adapter.c
Expand Up @@ -234,7 +234,7 @@ linuxdvb_get_type(int linux_type)
case FE_OFDM:
return DVB_TYPE_T;
case FE_ATSC:
return DVB_TYPE_ATSC;
return DVB_TYPE_ATSC_T;
default:
return DVB_TYPE_NONE;
}
Expand Down Expand Up @@ -378,10 +378,8 @@ linuxdvb_adapter_add ( const char *path )
}

/* Create frontend */
linuxdvb_frontend_create(feconf, la, i, fe_path, dmx_path, dvr_path, type, dfi.name);
#if DVB_VER_ATLEAST(5,5)
memset(fetypes, 0, sizeof(fetypes));
fetypes[type] = 1;
for (j = 0; j < cmd.u.buffer.len; j++) {
delsys = cmd.u.buffer.data[j];

Expand All @@ -401,6 +399,8 @@ linuxdvb_adapter_add ( const char *path )
type, dfi.name);
fetypes[type] = 1;
}
#else
linuxdvb_frontend_create(feconf, la, i, fe_path, dmx_path, dvr_path, type, dfi.name);
#endif
pthread_mutex_unlock(&global_lock);
}
Expand Down
25 changes: 19 additions & 6 deletions src/input/mpegts/linuxdvb/linuxdvb_frontend.c
Expand Up @@ -279,11 +279,21 @@ const idclass_t linuxdvb_frontend_dvbc_class =
}
};

const idclass_t linuxdvb_frontend_atsc_class =
const idclass_t linuxdvb_frontend_atsc_t_class =
{
.ic_super = &linuxdvb_frontend_class,
.ic_class = "linuxdvb_frontend_atsc",
.ic_caption = N_("Linux ATSC frontend"),
.ic_class = "linuxdvb_frontend_atsc_t",
.ic_caption = N_("Linux ATSC-T frontend"),
.ic_properties = (const property_t[]){
{}
}
};

const idclass_t linuxdvb_frontend_atsc_c_class =
{
.ic_super = &linuxdvb_frontend_class,
.ic_class = "linuxdvb_frontend_atsc_c",
.ic_caption = N_("Linux ATSC-C frontend"),
.ic_properties = (const property_t[]){
{}
}
Expand Down Expand Up @@ -1453,6 +1463,7 @@ linuxdvb_frontend_tune0
#undef _OFDM
break;
case DVB_TYPE_C:
case DVB_TYPE_ATSC_C:
p.u.qam.symbol_rate = dmc->u.dmc_fe_qam.symbol_rate;
p.u.qam.fec_inner = TRU(qam.fec_inner, fec_tbl, FEC_AUTO);
p.u.qam.modulation = TR(modulation, mod_tbl, QAM_AUTO);
Expand All @@ -1461,7 +1472,7 @@ linuxdvb_frontend_tune0
p.u.qpsk.symbol_rate = dmc->u.dmc_fe_qpsk.symbol_rate;
p.u.qpsk.fec_inner = TRU(qpsk.fec_inner, fec_tbl, FEC_AUTO);
break;
case DVB_TYPE_ATSC:
case DVB_TYPE_ATSC_T:
p.u.vsb.modulation = TR(modulation, mod_tbl, QAM_AUTO);
break;
default:
Expand Down Expand Up @@ -1678,8 +1689,10 @@ linuxdvb_frontend_create
idc = &linuxdvb_frontend_dvbc_class;
else if (type == DVB_TYPE_T)
idc = &linuxdvb_frontend_dvbt_class;
else if (type == DVB_TYPE_ATSC)
idc = &linuxdvb_frontend_atsc_class;
else if (type == DVB_TYPE_ATSC_T)
idc = &linuxdvb_frontend_atsc_t_class;
else if (type == DVB_TYPE_ATSC_C)
idc = &linuxdvb_frontend_atsc_c_class;
else {
tvherror("linuxdvb", "unknown FE type %d", type);
return NULL;
Expand Down
6 changes: 4 additions & 2 deletions src/input/mpegts/mpegts_dvb.h
Expand Up @@ -48,7 +48,8 @@ extern const idclass_t dvb_network_class;
extern const idclass_t dvb_network_dvbt_class;
extern const idclass_t dvb_network_dvbc_class;
extern const idclass_t dvb_network_dvbs_class;
extern const idclass_t dvb_network_atsc_class;
extern const idclass_t dvb_network_atsc_t_class;
extern const idclass_t dvb_network_atsc_c_class;

void dvb_network_init ( void );
void dvb_network_done ( void );
Expand Down Expand Up @@ -76,7 +77,8 @@ int dvb_network_get_orbital_pos(mpegts_network_t *mn);
extern const idclass_t dvb_mux_dvbt_class;
extern const idclass_t dvb_mux_dvbc_class;
extern const idclass_t dvb_mux_dvbs_class;
extern const idclass_t dvb_mux_atsc_class;
extern const idclass_t dvb_mux_atsc_t_class;
extern const idclass_t dvb_mux_atsc_c_class;

dvb_mux_t *dvb_mux_create0
(dvb_network_t *ln, uint16_t onid, uint16_t tsid,
Expand Down
86 changes: 69 additions & 17 deletions src/input/mpegts/mpegts_mux_dvb.c
Expand Up @@ -92,9 +92,13 @@ dvb_mux_##c##_class_##l##_enum (void *o, const char *lang)\
{\
static const int t[] = { __VA_ARGS__ };\
int i;\
htsmsg_t *m = htsmsg_create_list();\
for (i = 0; i < ARRAY_SIZE(t); i++)\
htsmsg_add_str(m, NULL, tvh_gettext_lang(lang, dvb_##l##2str(t[i])));\
htsmsg_t *m = htsmsg_create_list(), *e;\
for (i = 0; i < ARRAY_SIZE(t); i++) {\
e = htsmsg_create_map(); \
htsmsg_add_str(e, "key", dvb_##l##2str(t[i]));\
htsmsg_add_str(e, "val", tvh_gettext_lang(lang, dvb_##l##2str(t[i])));\
htsmsg_add_msg(m, NULL, e);\
}\
return m;\
}
#define MUX_PROP_STR(_id, _name, t, l, d)\
Expand Down Expand Up @@ -207,7 +211,7 @@ const idclass_t dvb_mux_dvbt_class =
.ic_caption = N_("Linux DVB-T multiplex"),
.ic_properties = (const property_t[]){
{
MUX_PROP_STR("delsys", N_("Delivery system"), dvbt, delsys, N_("DVB-T")),
MUX_PROP_STR("delsys", N_("Delivery system"), dvbt, delsys, "DVBT"),
},
{
.type = PT_U32,
Expand Down Expand Up @@ -263,12 +267,12 @@ dvb_mux_class_X(dvbc, qam, fec_inner, fec,

#define dvb_mux_dvbc_class_delsys_get dvb_mux_class_delsys_get
#define dvb_mux_dvbc_class_delsys_set dvb_mux_class_delsys_set

static htsmsg_t *
dvb_mux_dvbc_class_delsys_enum (void *o, const char *lang)
{
htsmsg_t *list = htsmsg_create_list();
htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_DVBC_ANNEX_A));
htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_DVBC_ANNEX_B));
htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_DVBC_ANNEX_C));
return list;
}
Expand All @@ -280,7 +284,7 @@ const idclass_t dvb_mux_dvbc_class =
.ic_caption = N_("Linux DVB-C multiplex"),
.ic_properties = (const property_t[]){
{
MUX_PROP_STR("delsys", N_("Delivery system"), dvbc, delsys, N_("DVBC_ANNEX_AC")),
MUX_PROP_STR("delsys", N_("Delivery system"), dvbc, delsys, "DVB-C"),
},
{
.type = PT_U32,
Expand Down Expand Up @@ -634,29 +638,29 @@ const idclass_t dvb_mux_dvbs_class =
}
};

#define dvb_mux_atsc_class_delsys_get dvb_mux_class_delsys_get
#define dvb_mux_atsc_class_delsys_set dvb_mux_class_delsys_set
#define dvb_mux_atsc_t_class_delsys_get dvb_mux_class_delsys_get
#define dvb_mux_atsc_t_class_delsys_set dvb_mux_class_delsys_set

static htsmsg_t *
dvb_mux_atsc_class_delsys_enum (void *o, const char *lang)
dvb_mux_atsc_t_class_delsys_enum (void *o, const char *lang)
{
htsmsg_t *list = htsmsg_create_list();
htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_ATSC));
htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_ATSCMH));
return list;
}

dvb_mux_class_R(atsc, modulation, qam,
dvb_mux_class_R(atsc_t, modulation, qam,
DVB_MOD_QAM_AUTO, DVB_MOD_QAM_256, DVB_MOD_VSB_8);

const idclass_t dvb_mux_atsc_class =
const idclass_t dvb_mux_atsc_t_class =
{
.ic_super = &dvb_mux_class,
.ic_class = "dvb_mux_atsc",
.ic_caption = N_("Linux ATSC multiplex"),
.ic_class = "dvb_mux_atsc_t",
.ic_caption = N_("Linux ATSC-T multiplex"),
.ic_properties = (const property_t[]){
{
MUX_PROP_STR("delsys", N_("Delivery system"), atsc, delsys, N_("ATSC")),
MUX_PROP_STR("delsys", N_("Delivery system"), atsc_t, delsys, "ATSC-T"),
},
{
.type = PT_U32,
Expand All @@ -667,7 +671,52 @@ const idclass_t dvb_mux_atsc_class =
.set = dvb_mux_dvbt_class_frequency_set,
},
{
MUX_PROP_STR("modulation", N_("Modulation"), atsc, qam, N_("AUTO"))
MUX_PROP_STR("modulation", N_("Modulation"), atsc_t, qam, N_("AUTO"))
},
{}
}
};

#define dvb_mux_atsc_c_class_delsys_get dvb_mux_class_delsys_get
#define dvb_mux_atsc_c_class_delsys_set dvb_mux_class_delsys_set

static htsmsg_t *
dvb_mux_atsc_c_class_delsys_enum (void *o, const char *lang)
{
htsmsg_t *list = htsmsg_create_list();
htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_DVBC_ANNEX_B));
return list;
}

const idclass_t dvb_mux_atsc_c_class =
{
.ic_super = &dvb_mux_class,
.ic_class = "dvb_mux_atsc_c",
.ic_caption = N_("Linux ATSC-C multiplex"),
.ic_properties = (const property_t[]){
{
MUX_PROP_STR("delsys", N_("Delivery system"), atsc_c, delsys, "ATSC-C"),
},
{
.type = PT_U32,
.id = "frequency",
.name = N_("Frequency (Hz)"),
.desc = N_("The frequency of the mux (in Hertz)."),
.off = offsetof(dvb_mux_t, lm_tuning.dmc_fe_freq),
.set = dvb_mux_dvbt_class_frequency_set,
},
{
.type = PT_U32,
.id = "symbolrate",
.name = N_("Symbol rate (Sym/s)"),
.desc = N_("The symbol rate."),
.off = offsetof(dvb_mux_t, lm_tuning.u.dmc_fe_qam.symbol_rate),
},
{
MUX_PROP_STR("constellation", N_("Constellation"), dvbc, qam, N_("AUTO"))
},
{
MUX_PROP_STR("fec", N_("FEC"), dvbc, fec, N_("AUTO"))
},
{}
}
Expand Down Expand Up @@ -775,9 +824,12 @@ dvb_mux_create0
} else if (ln->ln_type == DVB_TYPE_T) {
idc = &dvb_mux_dvbt_class;
delsys = DVB_SYS_DVBT;
} else if (ln->ln_type == DVB_TYPE_ATSC) {
idc = &dvb_mux_atsc_class;
} else if (ln->ln_type == DVB_TYPE_ATSC_T) {
idc = &dvb_mux_atsc_t_class;
delsys = DVB_SYS_ATSC;
} else if (ln->ln_type == DVB_TYPE_ATSC_C) {
idc = &dvb_mux_atsc_c_class;
delsys = DVB_SYS_DVBC_ANNEX_B;
} else {
tvherror("dvb", "unknown FE type %d", ln->ln_type);
return NULL;
Expand Down

0 comments on commit f02851a

Please sign in to comment.