]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts network/mux: add ISDB-[TCS] and DAB definitions
authorJaroslav Kysela <perex@perex.cz>
Thu, 7 Jan 2016 13:49:45 +0000 (14:49 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 7 Jan 2016 14:47:32 +0000 (15:47 +0100)
src/input/mpegts/dvb.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/mpegts_dvb.h
src/input/mpegts/mpegts_mux_dvb.c
src/input/mpegts/mpegts_network_dvb.c

index f17ea7f78928395e3f1e5a0a631d58e0104be191..372e2a918bf661c2d64fc5fbdd361284649918e0 100644 (file)
@@ -380,7 +380,11 @@ typedef enum dvb_fe_type {
   DVB_TYPE_S,                  /* satellite */
   DVB_TYPE_ATSC_T,             /* terrestrial - north america */
   DVB_TYPE_ATSC_C,             /* cable - north america */
-  DVB_TYPE_LAST = DVB_TYPE_ATSC_C
+  DVB_TYPE_ISDB_T,              /* terrestrial - japan, brazil */
+  DVB_TYPE_ISDB_C,              /* cable - japan, brazil */
+  DVB_TYPE_ISDB_S,              /* satellite - japan, brazil */
+  DVB_TYPE_DAB,                 /* digital radio (europe) */
+  DVB_TYPE_LAST = DVB_TYPE_DAB
 } dvb_fe_type_t;
 
 typedef enum dvb_fe_spectral_inversion {
@@ -558,6 +562,17 @@ typedef struct dvb_ofdm_config {
   dvb_fe_hierarchy_t      hierarchy_information;
 } dvb_ofdm_config_t;
 
+typedef struct dvb_isdbt_config {
+  dvb_fe_bandwidth_t      bandwidth;
+  dvb_fe_guard_interval_t guard_interval;
+  struct {
+    dvb_fe_code_rate_t    fec;
+    dvb_fe_modulation_t   modulation;
+    int                   segment_count;
+    int                   time_interleaving;
+  } layers[3];
+} dvb_isdbt_config_t;
+
 typedef struct dvb_mux_conf
 {
   dvb_fe_type_t               dmc_fe_type;
@@ -574,6 +589,7 @@ typedef struct dvb_mux_conf
     dvb_qpsk_config_t         dmc_fe_qpsk;
     dvb_qam_config_t          dmc_fe_qam;
     dvb_ofdm_config_t         dmc_fe_ofdm;
+    dvb_isdbt_config_t        dmc_fe_isdbt;
   } u;
 
   // For scan file configurations
index be5da5054c5d2957388729b4a5657560746cea18..cfa198187d7d4e204035a3184fb238221a51b327 100644 (file)
@@ -2586,7 +2586,10 @@ psi_tables_install ( mpegts_input_t *mi, mpegts_mux_t *mm,
   case DVB_SYS_DVBT2:
   case DVB_SYS_DVBS:
   case DVB_SYS_DVBS2:
+  case DVB_SYS_ISDBT:
+  case DVB_SYS_ISDBC:
   case DVB_SYS_ISDBS:
+  case DVB_SYS_DAB:
     psi_tables_dvb(mm);
     break;
   case DVB_SYS_TURBO:
@@ -2599,12 +2602,9 @@ psi_tables_install ( mpegts_input_t *mi, mpegts_mux_t *mm,
     break;
   case DVB_SYS_NONE:
   case DVB_SYS_DVBH:
-  case DVB_SYS_ISDBT:
-  case DVB_SYS_ISDBC:
   case DVB_SYS_DTMB:
   case DVB_SYS_CMMB:
   case DVB_SYS_DSS:
-  case DVB_SYS_DAB:
     break;
   case DVB_SYS_ATSC_ALL:
     psi_tables_atsc_c(mm);
index ac37f328b5603927dc99f33e04aa0558025d827a..a2f2ae304cb8f5902356807786cfad847c76e38c 100644 (file)
@@ -50,6 +50,10 @@ extern const idclass_t dvb_network_dvbc_class;
 extern const idclass_t dvb_network_dvbs_class;
 extern const idclass_t dvb_network_atsc_t_class;
 extern const idclass_t dvb_network_atsc_c_class;
+extern const idclass_t dvb_network_isdb_t_class;
+extern const idclass_t dvb_network_isdb_c_class;
+extern const idclass_t dvb_network_isdb_s_class;
+extern const idclass_t dvb_network_dab_class;
 
 void dvb_network_init ( void );
 void dvb_network_done ( void );
@@ -79,6 +83,10 @@ extern const idclass_t dvb_mux_dvbc_class;
 extern const idclass_t dvb_mux_dvbs_class;
 extern const idclass_t dvb_mux_atsc_t_class;
 extern const idclass_t dvb_mux_atsc_c_class;
+extern const idclass_t dvb_mux_isdb_t_class;
+extern const idclass_t dvb_mux_isdb_c_class;
+extern const idclass_t dvb_mux_isdb_s_class;
+extern const idclass_t dvb_mux_dab_class;
 
 dvb_mux_t *dvb_mux_create0
   (dvb_network_t *ln, uint16_t onid, uint16_t tsid,
index e31367fdef2770ae735b171656b197a767b8e1f5..f7d21dbd04becb2960fc9410ce323d446cee0944 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Tvheadend - Linux DVB Multiplex
+ *  Tvheadend - DVB Multiplex
  *
  *  Copyright (C) 2013 Adam Sutton
  *
@@ -45,20 +45,20 @@ extern const idclass_t mpegts_mux_class;
  */
 
 /* Macro to define mux class str get/set */
-#define dvb_mux_class_R(c, f, l, ...)\
+#define dvb_mux_class_R(c, f, l, t, ...)\
 static const void * \
 dvb_mux_##c##_class_##l##_get (void *o)\
 {\
   static const char *s;\
   dvb_mux_t *lm = o;\
-  s = dvb_##l##2str(lm->lm_tuning.dmc_fe_##f);\
+  s = dvb_##t##2str(lm->lm_tuning.dmc_fe_##f);\
   return &s;\
 }\
 static int \
 dvb_mux_##c##_class_##l##_set (void *o, const void *v)\
 {\
   dvb_mux_t *lm = o;\
-  lm->lm_tuning.dmc_fe_##f = dvb_str2##l ((const char*)v);\
+  lm->lm_tuning.dmc_fe_##f = dvb_str2##t ((const char*)v);\
   return 1;\
 }\
 static htsmsg_t *\
@@ -66,25 +66,29 @@ 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_##t##2str(t[i]));\
+    htsmsg_add_str(e, "val", tvh_gettext_lang(lang, dvb_##t##2str(t[i])));\
+    htsmsg_add_msg(m, NULL, e);\
+  }\
   return m;\
 }
-#define dvb_mux_class_X(c, f, p, l, ...)\
+#define dvb_mux_class_X(c, f, p, l, t, ...)\
 static const void * \
 dvb_mux_##c##_class_##l##_get (void *o)\
 {\
   static const char *s;\
   dvb_mux_t *lm = o;\
-  s = dvb_##l##2str(lm->lm_tuning.u.dmc_fe_##f.p);\
+  s = dvb_##t##2str(lm->lm_tuning.u.dmc_fe_##f.p);\
   return &s;\
 }\
 static int \
 dvb_mux_##c##_class_##l##_set (void *o, const void *v)\
 {\
   dvb_mux_t *lm = o;\
-  lm->lm_tuning.u.dmc_fe_##f.p = dvb_str2##l ((const char*)v);\
+  lm->lm_tuning.u.dmc_fe_##f.p = dvb_str2##t ((const char*)v);\
   return 1;\
 }\
 static htsmsg_t *\
@@ -95,8 +99,8 @@ dvb_mux_##c##_class_##l##_enum (void *o, const char *lang)\
   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_str(e, "key", dvb_##t##2str(t[i]));\
+    htsmsg_add_str(e, "val", tvh_gettext_lang(lang, dvb_##t##2str(t[i])));\
     htsmsg_add_msg(m, NULL, e);\
   }\
   return m;\
@@ -136,7 +140,7 @@ const idclass_t dvb_mux_class =
 {
   .ic_super      = &mpegts_mux_class,
   .ic_class      = "dvb_mux",
-  .ic_caption    = N_("Linux DVB multiplex"),
+  .ic_caption    = N_("DVB multiplex"),
   .ic_properties = (const property_t[]){
     {}
   }
@@ -146,30 +150,30 @@ const idclass_t dvb_mux_class =
  * DVB-T
  */
 
-dvb_mux_class_X(dvbt, ofdm, bandwidth,             bw,
+dvb_mux_class_X(dvbt, ofdm, bandwidth, bw, bw,
                      DVB_BANDWIDTH_AUTO,  DVB_BANDWIDTH_10_MHZ,
                      DVB_BANDWIDTH_8_MHZ, DVB_BANDWIDTH_7_MHZ,
                      DVB_BANDWIDTH_6_MHZ, DVB_BANDWIDTH_5_MHZ,
                      DVB_BANDWIDTH_1_712_MHZ);
-dvb_mux_class_R(dvbt, modulation,                  qam,
+dvb_mux_class_R(dvbt, modulation, qam, qam,
                      DVB_MOD_QAM_AUTO, DVB_MOD_QPSK, DVB_MOD_QAM_16,
                      DVB_MOD_QAM_64, DVB_MOD_QAM_256);
-dvb_mux_class_X(dvbt, ofdm, transmission_mode,     mode,
+dvb_mux_class_X(dvbt, ofdm, transmission_mode, mode, mode,
                      DVB_TRANSMISSION_MODE_AUTO, DVB_TRANSMISSION_MODE_32K,
                      DVB_TRANSMISSION_MODE_16K, DVB_TRANSMISSION_MODE_8K,
                      DVB_TRANSMISSION_MODE_2K, DVB_TRANSMISSION_MODE_1K);
-dvb_mux_class_X(dvbt, ofdm, guard_interval,        guard,
+dvb_mux_class_X(dvbt, ofdm, guard_interval, guard, guard,
                      DVB_GUARD_INTERVAL_AUTO, DVB_GUARD_INTERVAL_1_32,
                      DVB_GUARD_INTERVAL_1_16, DVB_GUARD_INTERVAL_1_8,
                      DVB_GUARD_INTERVAL_1_4, DVB_GUARD_INTERVAL_1_128,
                      DVB_GUARD_INTERVAL_19_128, DVB_GUARD_INTERVAL_19_256);
-dvb_mux_class_X(dvbt, ofdm, hierarchy_information, hier,
+dvb_mux_class_X(dvbt, ofdm, hierarchy_information, hier, hier,
                      DVB_HIERARCHY_AUTO, DVB_HIERARCHY_NONE,
                      DVB_HIERARCHY_1, DVB_HIERARCHY_2, DVB_HIERARCHY_4);
-dvb_mux_class_X(dvbt, ofdm, code_rate_HP,          fechi,
+dvb_mux_class_X(dvbt, ofdm, code_rate_HP, fechi, fechi,
                      DVB_FEC_AUTO, DVB_FEC_1_2, DVB_FEC_2_3, DVB_FEC_3_4,
                      DVB_FEC_3_5,  DVB_FEC_4_5, DVB_FEC_5_6, DVB_FEC_7_8);
-dvb_mux_class_X(dvbt, ofdm, code_rate_LP,          feclo,
+dvb_mux_class_X(dvbt, ofdm, code_rate_LP, feclo, feclo,
                      DVB_FEC_AUTO, DVB_FEC_1_2, DVB_FEC_2_3, DVB_FEC_3_4,
                      DVB_FEC_3_5,  DVB_FEC_4_5, DVB_FEC_5_6, DVB_FEC_7_8);
 
@@ -208,7 +212,7 @@ const idclass_t dvb_mux_dvbt_class =
 {
   .ic_super      = &dvb_mux_class,
   .ic_class      = "dvb_mux_dvbt",
-  .ic_caption    = N_("Linux DVB-T multiplex"),
+  .ic_caption    = N_("DVB-T multiplex"),
   .ic_properties = (const property_t[]){
     {
       MUX_PROP_STR("delsys", N_("Delivery system"), dvbt, delsys, "DVBT"),
@@ -280,10 +284,10 @@ const idclass_t dvb_mux_dvbt_class =
  * DVB-C
  */
 
-dvb_mux_class_R(dvbc, modulation,                 qam,
+dvb_mux_class_R(dvbc, modulation, qam, qam,
                      DVB_MOD_QAM_AUTO, DVB_MOD_QAM_16, DVB_MOD_QAM_32,
                      DVB_MOD_QAM_64, DVB_MOD_QAM_128, DVB_MOD_QAM_256);
-dvb_mux_class_X(dvbc, qam, fec_inner,             fec,
+dvb_mux_class_X(dvbc, qam, fec_inner, fec, fec,
                      DVB_FEC_AUTO, DVB_FEC_NONE,
                      DVB_FEC_1_2, DVB_FEC_2_3, DVB_FEC_3_4, DVB_FEC_4_5,
                      DVB_FEC_5_6, DVB_FEC_8_9, DVB_FEC_9_10);
@@ -304,7 +308,7 @@ const idclass_t dvb_mux_dvbc_class =
 {
   .ic_super      = &dvb_mux_class,
   .ic_class      = "dvb_mux_dvbc",
-  .ic_caption    = N_("Linux DVB-C multiplex"),
+  .ic_caption    = N_("DVB-C multiplex"),
   .ic_properties = (const property_t[]){
     {
       MUX_PROP_STR("delsys", N_("Delivery system"), dvbc, delsys, "DVB-C"),
@@ -338,11 +342,27 @@ const idclass_t dvb_mux_dvbc_class =
   }
 };
 
-dvb_mux_class_X(dvbs, qpsk, fec_inner,             fec,
+/*
+ * DVB-S
+ */
+
+dvb_mux_class_X(dvbs, qpsk, fec_inner, fec, fec,
                      DVB_FEC_AUTO, DVB_FEC_NONE,
                      DVB_FEC_1_2, DVB_FEC_2_3, DVB_FEC_3_4, DVB_FEC_3_5,
                      DVB_FEC_4_5, DVB_FEC_5_6, DVB_FEC_7_8, DVB_FEC_8_9,
                      DVB_FEC_9_10);
+dvb_mux_class_R(dvbs, modulation, qam, qam,
+                     DVB_MOD_AUTO, DVB_MOD_QPSK, DVB_MOD_QAM_16,
+                     DVB_MOD_PSK_8, DVB_MOD_APSK_16, DVB_MOD_APSK_32);
+dvb_mux_class_R(dvbs, rolloff, rolloff, rolloff,
+                     DVB_ROLLOFF_35, DVB_ROLLOFF_20, DVB_ROLLOFF_25);
+dvb_mux_class_R(dvbs, pilot, pilot, pilot,
+                     DVB_PILOT_AUTO, DVB_PILOT_ON, DVB_PILOT_OFF);
+dvb_mux_class_X(dvbs, qpsk, polarisation, polarisation, pol,
+                     DVB_POLARISATION_VERTICAL, DVB_POLARISATION_HORIZONTAL,
+                     DVB_POLARISATION_CIRCULAR_LEFT, DVB_POLARISATION_CIRCULAR_RIGHT);
+dvb_mux_class_R(dvbs, pls_mode, pls_mode, plsmode,
+                     DVB_PLS_ROOT, DVB_PLS_GOLD, DVB_PLS_COMBO);
 
 static int
 dvb_mux_dvbs_class_frequency_set ( void *o, const void *v )
@@ -376,151 +396,6 @@ dvb_mux_dvbs_class_symbol_rate_set ( void *o, const void *v )
   return 0;
 }
 
-static const void *
-dvb_mux_dvbs_class_polarity_get (void *o)
-{
-  static const char *s;
-  dvb_mux_t *lm = o;
-  s = dvb_pol2str(lm->lm_tuning.u.dmc_fe_qpsk.polarisation);
-  return &s;
-}
-
-static int
-dvb_mux_dvbs_class_polarity_set (void *o, const void *s)
-{
-  dvb_mux_t *lm = o;
-  lm->lm_tuning.u.dmc_fe_qpsk.polarisation = dvb_str2pol((const char*)s);
-  return 1;
-}
-
-static htsmsg_t *
-dvb_mux_dvbs_class_polarity_enum (void *o, const char *lang)
-{
-  htsmsg_t *list = htsmsg_create_list();
-  htsmsg_add_str(list, NULL, dvb_pol2str(DVB_POLARISATION_VERTICAL));
-  htsmsg_add_str(list, NULL, dvb_pol2str(DVB_POLARISATION_HORIZONTAL));
-  htsmsg_add_str(list, NULL, dvb_pol2str(DVB_POLARISATION_CIRCULAR_LEFT));
-  htsmsg_add_str(list, NULL, dvb_pol2str(DVB_POLARISATION_CIRCULAR_RIGHT));
-  return list;
-}
-
-static const void *
-dvb_mux_dvbs_class_modulation_get ( void *o )
-{
-  static const char *s;
-  dvb_mux_t *lm = o;
-  s = dvb_qam2str(lm->lm_tuning.dmc_fe_modulation);
-  return &s;
-}
-
-static int
-dvb_mux_dvbs_class_modulation_set (void *o, const void *s)
-{
-  int mod = dvb_str2qam(s);
-  dvb_mux_t *lm = o;
-  if (mod != lm->lm_tuning.dmc_fe_modulation) {
-    lm->lm_tuning.dmc_fe_modulation = mod;
-    return 1;
-  }
-  return 0;
-}
-
-static htsmsg_t *
-dvb_mux_dvbs_class_modulation_list ( void *o, const char *lang )
-{
-  htsmsg_t *list = htsmsg_create_list();
-  htsmsg_add_str(list, NULL, tvh_gettext_lang(lang, dvb_qam2str(DVB_MOD_AUTO)));
-  htsmsg_add_str(list, NULL, dvb_qam2str(DVB_MOD_QPSK));
-  htsmsg_add_str(list, NULL, dvb_qam2str(DVB_MOD_QAM_16));
-  htsmsg_add_str(list, NULL, dvb_qam2str(DVB_MOD_PSK_8));
-  htsmsg_add_str(list, NULL, dvb_qam2str(DVB_MOD_APSK_16));
-  htsmsg_add_str(list, NULL, dvb_qam2str(DVB_MOD_APSK_32));
-  return list;
-}
-
-static const void *
-dvb_mux_dvbs_class_rolloff_get ( void *o )
-{
-  static const char *s;
-  dvb_mux_t *lm = o;
-  s = dvb_rolloff2str(lm->lm_tuning.dmc_fe_rolloff);
-  return &s;
-}
-
-static int
-dvb_mux_dvbs_class_rolloff_set ( void *o, const void *s )
-{
-  dvb_mux_t *lm = o;
-  lm->lm_tuning.dmc_fe_rolloff = dvb_str2rolloff(s);
-  return 1;
-}
-
-static htsmsg_t *
-dvb_mux_dvbs_class_rolloff_list ( void *o, const char *lang )
-{
-  htsmsg_t *list = htsmsg_create_list();
-  htsmsg_add_str(list, NULL, dvb_rolloff2str(DVB_ROLLOFF_35));
-  // Note: this is a bit naff, as the below values are only relevant
-  //       to S2 muxes, but currently have no way to model that
-  htsmsg_add_str(list, NULL, dvb_rolloff2str(DVB_ROLLOFF_20));
-  htsmsg_add_str(list, NULL, dvb_rolloff2str(DVB_ROLLOFF_25));
-  htsmsg_add_str(list, NULL, tvh_gettext_lang(lang, dvb_rolloff2str(DVB_ROLLOFF_AUTO)));
-  return list;
-}
-
-static const void *
-dvb_mux_dvbs_class_pilot_get ( void *o )
-{
-  static const char *s;
-  dvb_mux_t *lm = o;
-  s = dvb_pilot2str(lm->lm_tuning.dmc_fe_pilot);
-  return &s;
-}
-
-static int
-dvb_mux_dvbs_class_pilot_set ( void *o, const void *s )
-{
-  dvb_mux_t *lm = o;
-  lm->lm_tuning.dmc_fe_pilot = dvb_str2pilot(s);
-  return 1;
-}
-static htsmsg_t *
-dvb_mux_dvbs_class_pilot_list ( void *o, const char *lang )
-{
-  htsmsg_t *list = htsmsg_create_list();
-  htsmsg_add_str(list, NULL, tvh_gettext_lang(lang, dvb_pilot2str(DVB_PILOT_AUTO)));
-  htsmsg_add_str(list, NULL, dvb_pilot2str(DVB_PILOT_ON));
-  htsmsg_add_str(list, NULL, dvb_pilot2str(DVB_PILOT_OFF));
-  return list;
-}
-
-static const void *
-dvb_mux_dvbs_class_pls_mode_get ( void *o )
-{
-  static const char *s;
-  dvb_mux_t *lm = o;
-  s = dvb_plsmode2str(lm->lm_tuning.dmc_fe_pls_mode);
-  return &s;
-}
-
-static int
-dvb_mux_dvbs_class_pls_mode_set ( void *o, const void *s )
-{
-  dvb_mux_t *lm = o;
-  lm->lm_tuning.dmc_fe_pls_mode = dvb_str2plsmode(s);
-  return 1;
-}
-
-static htsmsg_t *
-dvb_mux_dvbs_class_pls_mode_list ( void *o, const char *lang )
-{
-  htsmsg_t *list = htsmsg_create_list();
-  htsmsg_add_str(list, NULL, dvb_plsmode2str(DVB_PLS_ROOT));
-  htsmsg_add_str(list, NULL, dvb_plsmode2str(DVB_PLS_GOLD));
-  htsmsg_add_str(list, NULL, dvb_plsmode2str(DVB_PLS_COMBO));
-  return list;
-}
-
 #define dvb_mux_dvbs_class_delsys_get dvb_mux_class_delsys_get
 #define dvb_mux_dvbs_class_delsys_set dvb_mux_class_delsys_set
 
@@ -564,7 +439,7 @@ const idclass_t dvb_mux_dvbs_class =
 {
   .ic_super      = &dvb_mux_class,
   .ic_class      = "dvb_mux_dvbs",
-  .ic_caption    = N_("Linux DVB-S multiplex"),
+  .ic_caption    = N_("DVB-S multiplex"),
   .ic_properties = (const property_t[]){
     {
       MUX_PROP_STR("delsys", N_("Delivery system"), dvbs, delsys, "DVBS"),
@@ -586,42 +461,19 @@ const idclass_t dvb_mux_dvbs_class =
       .set      = dvb_mux_dvbs_class_symbol_rate_set,
     },
     {
-      MUX_PROP_STR("polarisation", N_("Polarization"), dvbs, polarity, NULL)
+      MUX_PROP_STR("polarisation", N_("Polarization"), dvbs, polarisation, NULL)
     },
     {
-      .type     = PT_STR,
-      .id       = "modulation",
-      .name     = N_("Modulation"),
-      .desc     = N_("The modulation used on the mux."),
-      .set      = dvb_mux_dvbs_class_modulation_set,
-      .get      = dvb_mux_dvbs_class_modulation_get,
-      .list     = dvb_mux_dvbs_class_modulation_list,
-      .def.s    = "AUTO",
+      MUX_PROP_STR("modulation", N_("Modulation"), dvbs, qam, NULL)
     },
     {
       MUX_PROP_STR("fec", N_("FEC"), dvbs, fec, "AUTO")
     },
     {
-      .type     = PT_STR,
-      .id       = "rolloff",
-      .name     = N_("Rolloff"),
-      .desc     = N_("The mux rolloff. Leave as AUTO unless you know the "
-                     "exact rolloff for this mux."),
-      .set      = dvb_mux_dvbs_class_rolloff_set,
-      .get      = dvb_mux_dvbs_class_rolloff_get,
-      .list     = dvb_mux_dvbs_class_rolloff_list,
-      .def.s    = "AUTO"
+      MUX_PROP_STR("rolloff", N_("Rolloff"), dvbs, rolloff, "AUTO")
     },
     {
-      .type     = PT_STR,
-      .id       = "pilot",
-      .name     = N_("Pilot"),
-      .desc     = N_("Use pilot on this mux. AUTO is the recommended "
-                     "value."),
-      .opts     = PO_ADVANCED,
-      .set      = dvb_mux_dvbs_class_pilot_set,
-      .get      = dvb_mux_dvbs_class_pilot_get,
-      .list     = dvb_mux_dvbs_class_pilot_list,
+      MUX_PROP_STR("pilot", N_("Pilot"), dvbs, pilot, "AUTO")
     },
     {
       .type     = PT_INT,
@@ -633,14 +485,7 @@ const idclass_t dvb_mux_dvbs_class =
       .opts     = PO_ADVANCED
     },
     {
-      .type     = PT_STR,
-      .id       = "pls_mode",
-      .name     = N_("PLS mode"),
-      .set      = dvb_mux_dvbs_class_pls_mode_set,
-      .get      = dvb_mux_dvbs_class_pls_mode_get,
-      .list     = dvb_mux_dvbs_class_pls_mode_list,
-      .def.s    = "ROOT",
-      .opts     = PO_ADVANCED
+      MUX_PROP_STR("pls_mode", N_("PLS mode"), dvbs, pls_mode, "ROOT")
     },
     {
       .type     = PT_U32,
@@ -665,6 +510,10 @@ const idclass_t dvb_mux_dvbs_class =
   }
 };
 
+/*
+ * ATSC-T
+ */
+
 #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
 
@@ -677,14 +526,14 @@ dvb_mux_atsc_t_class_delsys_enum (void *o, const char *lang)
   return list;
 }
 
-dvb_mux_class_R(atsc_t, modulation, qam,
+dvb_mux_class_R(atsc_t, modulation, qam, qam,
                      DVB_MOD_QAM_AUTO, DVB_MOD_QAM_256, DVB_MOD_VSB_8);
 
 const idclass_t dvb_mux_atsc_t_class =
 {
   .ic_super      = &dvb_mux_class,
   .ic_class      = "dvb_mux_atsc_t",
-  .ic_caption    = N_("Linux ATSC-T multiplex"),
+  .ic_caption    = N_("ATSC-T multiplex"),
   .ic_properties = (const property_t[]){
     {
       MUX_PROP_STR("delsys", N_("Delivery system"), atsc_t, delsys, "ATSC-T"),
@@ -704,6 +553,10 @@ const idclass_t dvb_mux_atsc_t_class =
   }
 };
 
+/*
+ * ATSC-C
+ */
+
 #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
 
@@ -719,7 +572,7 @@ 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_caption    = N_("ATSC-C multiplex"),
   .ic_properties = (const property_t[]){
     {
       MUX_PROP_STR("delsys", N_("Delivery system"), atsc_c, delsys, "ATSC-C"),
@@ -749,6 +602,268 @@ const idclass_t dvb_mux_atsc_c_class =
   }
 };
 
+/*
+ * ISDB-T
+ */
+
+#define dvb_mux_isdb_t_class_delsys_get dvb_mux_class_delsys_get
+#define dvb_mux_isdb_t_class_delsys_set dvb_mux_class_delsys_set
+
+static htsmsg_t *
+dvb_mux_isdb_t_class_delsys_enum (void *o, const char *lang)
+{
+  htsmsg_t *list = htsmsg_create_list();
+  htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_ISDBT));
+  return list;
+}
+
+dvb_mux_class_X(isdb_t, isdbt, bandwidth, bw, bw,
+                     DVB_BANDWIDTH_AUTO,  DVB_BANDWIDTH_10_MHZ,
+                     DVB_BANDWIDTH_8_MHZ, DVB_BANDWIDTH_7_MHZ,
+                     DVB_BANDWIDTH_6_MHZ, DVB_BANDWIDTH_5_MHZ,
+                     DVB_BANDWIDTH_1_712_MHZ);
+dvb_mux_class_X(isdb_t, isdbt, guard_interval, guard, guard,
+                     DVB_GUARD_INTERVAL_AUTO, DVB_GUARD_INTERVAL_1_32,
+                     DVB_GUARD_INTERVAL_1_16, DVB_GUARD_INTERVAL_1_8,
+                     DVB_GUARD_INTERVAL_1_4, DVB_GUARD_INTERVAL_1_128,
+                     DVB_GUARD_INTERVAL_19_128, DVB_GUARD_INTERVAL_19_256);
+dvb_mux_class_X(isdb_t, isdbt, layers[0].modulation, isdbt_mod_a, qam,
+                     DVB_MOD_QAM_AUTO, DVB_MOD_QPSK, DVB_MOD_QAM_16,
+                     DVB_MOD_QAM_64, DVB_MOD_QAM_256);
+dvb_mux_class_X(isdb_t, isdbt, layers[0].fec, isdbt_fec_a, fec,
+                     DVB_FEC_AUTO, DVB_FEC_NONE,
+                     DVB_FEC_1_2, DVB_FEC_2_3, DVB_FEC_3_4, DVB_FEC_4_5,
+                     DVB_FEC_5_6, DVB_FEC_8_9, DVB_FEC_9_10);
+dvb_mux_class_X(isdb_t, isdbt, layers[1].modulation, isdbt_mod_b, qam,
+                     DVB_MOD_QAM_AUTO, DVB_MOD_QPSK, DVB_MOD_QAM_16,
+                     DVB_MOD_QAM_64, DVB_MOD_QAM_256);
+dvb_mux_class_X(isdb_t, isdbt, layers[1].fec, isdbt_fec_b, fec,
+                     DVB_FEC_AUTO, DVB_FEC_NONE,
+                     DVB_FEC_1_2, DVB_FEC_2_3, DVB_FEC_3_4, DVB_FEC_4_5,
+                     DVB_FEC_5_6, DVB_FEC_8_9, DVB_FEC_9_10);
+dvb_mux_class_X(isdb_t, isdbt, layers[2].modulation, isdbt_mod_c, qam,
+                     DVB_MOD_QAM_AUTO, DVB_MOD_QPSK, DVB_MOD_QAM_16,
+                     DVB_MOD_QAM_64, DVB_MOD_QAM_256);
+dvb_mux_class_X(isdb_t, isdbt, layers[2].fec, isdbt_fec_c, fec,
+                     DVB_FEC_AUTO, DVB_FEC_NONE,
+                     DVB_FEC_1_2, DVB_FEC_2_3, DVB_FEC_3_4, DVB_FEC_4_5,
+                     DVB_FEC_5_6, DVB_FEC_8_9, DVB_FEC_9_10);
+
+const idclass_t dvb_mux_isdb_t_class =
+{
+  .ic_super      = &dvb_mux_class,
+  .ic_class      = "dvb_mux_isdbt",
+  .ic_caption    = N_("ISDB-T multiplex"),
+  .ic_properties = (const property_t[]){
+    {
+      MUX_PROP_STR("delsys", N_("Delivery system"), isdb_t, delsys, "ISDB-T"),
+      .desc     = N_("Select the delivery system used by your provider."),
+    },
+    {
+      .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,
+    },
+    {
+      MUX_PROP_STR("bandwidth", N_("Bandwidth"), isdb_t, bw, N_("AUTO")),
+      .desc     = N_("Select the bandwidth the mux uses. "
+                     "If you're not sure of the value leave as AUTO "
+                     "but be aware that tuning may fail as some drivers "
+                     "do not like the AUTO setting."),
+    },
+    {
+      MUX_PROP_STR("guard_interval", N_("Guard interval"), isdb_t, guard, N_("AUTO")),
+      .desc     = N_("Select the guard interval used by the mux. "
+                     "If you're not sure of the value leave as AUTO."),
+    },
+    /* Layer A */
+    {
+      MUX_PROP_STR("layera_fec", N_("Layer A: FEC"), isdb_t, isdbt_fec_a, N_("AUTO")),
+    },
+    {
+      MUX_PROP_STR("layera_mod", N_("Layer A: Constellation"), isdb_t, isdbt_mod_a, N_("AUTO")),
+    },
+    {
+      .type     = PT_U32,
+      .id       = "layera_segcnt",
+      .name     = N_("Layer A: Segment count"),
+      .off      = offsetof(dvb_mux_t, lm_tuning.u.dmc_fe_isdbt.layers[0].segment_count),
+    },
+    {
+      .type     = PT_U32,
+      .id       = "layera_timint",
+      .name     = N_("Layer A: Time interleaving"),
+      .off      = offsetof(dvb_mux_t, lm_tuning.u.dmc_fe_isdbt.layers[0].time_interleaving),
+    },
+    /* Layer B */
+    {
+      MUX_PROP_STR("layerb_fec", N_("Layer B: FEC"), isdb_t, isdbt_fec_b, N_("AUTO")),
+    },
+    {
+      MUX_PROP_STR("layerb_mod", N_("Layer B: Constellation"), isdb_t, isdbt_mod_b, N_("AUTO")),
+    },
+    {
+      .type     = PT_U32,
+      .id       = "layerb_segcnt",
+      .name     = N_("Layer B: Segment count"),
+      .off      = offsetof(dvb_mux_t, lm_tuning.u.dmc_fe_isdbt.layers[1].segment_count),
+    },
+    {
+      .type     = PT_U32,
+      .id       = "layerb_timint",
+      .name     = N_("Layer B: Time interleaving"),
+      .off      = offsetof(dvb_mux_t, lm_tuning.u.dmc_fe_isdbt.layers[1].time_interleaving),
+    },
+    /* Layer C */
+    {
+      MUX_PROP_STR("layerb_fec", N_("Layer C: FEC"), isdb_t, isdbt_fec_c, N_("AUTO")),
+    },
+    {
+      MUX_PROP_STR("layerb_mod", N_("Layer C: Constellation"), isdb_t, isdbt_mod_c, N_("AUTO")),
+    },
+    {
+      .type     = PT_U32,
+      .id       = "layerc_segcnt",
+      .name     = N_("Layer C: Segment count"),
+      .off      = offsetof(dvb_mux_t, lm_tuning.u.dmc_fe_isdbt.layers[2].segment_count),
+    },
+    {
+      .type     = PT_U32,
+      .id       = "layerb_timint",
+      .name     = N_("Layer C: Time interleaving"),
+      .off      = offsetof(dvb_mux_t, lm_tuning.u.dmc_fe_isdbt.layers[2].time_interleaving),
+    },
+    {}
+  }
+};
+
+/*
+ * ISDB-C
+ */
+
+const idclass_t dvb_mux_isdb_c_class =
+{
+  .ic_super      = &dvb_mux_class,
+  .ic_class      = "dvb_mux_isdbc",
+  .ic_caption    = N_("ISDB-C multiplex"),
+  .ic_properties = (const property_t[]){
+    {
+      MUX_PROP_STR("delsys", N_("Delivery system"), dvbc, delsys, "DVB-C"),
+      .desc     = N_("Select the delivery system used by your cable provider."),
+    },
+    {
+      .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")),
+      .desc     = N_("Select the quadrature amplitude modulation (QAM) used by the mux. "
+                     "If you're not sure of the value leave as AUTO."),
+    },
+    {
+      MUX_PROP_STR("fec", N_("FEC"), dvbc, fec, N_("AUTO")),
+      .desc     = N_("Select the forward error correction used on the mux."),
+    },
+    {}
+  }
+};
+
+/*
+ * ISDB-S
+ */
+
+#define dvb_mux_isdb_s_class_delsys_get dvb_mux_class_delsys_get
+#define dvb_mux_isdb_s_class_delsys_set dvb_mux_class_delsys_set
+
+static htsmsg_t *
+dvb_mux_isdb_s_class_delsys_enum (void *o, const char *lang)
+{
+  htsmsg_t *list = htsmsg_create_list();
+  htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_ISDBS));
+  return list;
+}
+
+const idclass_t dvb_mux_isdb_s_class =
+{
+  .ic_super      = &dvb_mux_class,
+  .ic_class      = "dvb_mux_isdbs",
+  .ic_caption    = N_("ISDB-S multiplex"),
+  .ic_properties = (const property_t[]){
+    {
+      MUX_PROP_STR("delsys", N_("Delivery system"), isdb_s, delsys, "ISDBS"),
+    },
+    {
+      .type     = PT_U32,
+      .id       = "frequency",
+      .name     = N_("Frequency (kHz)"),
+      .desc     = N_("The frequency of the mux (in Hertz)."),
+      .off      = offsetof(dvb_mux_t, lm_tuning.dmc_fe_freq),
+      .set      = dvb_mux_dvbs_class_frequency_set,
+    },
+    {
+      .type     = PT_INT,
+      .id       = "stream_id",
+      .name     = N_("Stream ID"),
+      .desc     = N_("The stream ID used for this mux."),
+      .off      = offsetof(dvb_mux_t, lm_tuning.dmc_fe_stream_id),
+      .def.i   = DVB_NO_STREAM_ID_FILTER,
+      .opts     = PO_ADVANCED
+    },
+    {}
+  }
+};
+
+/*
+ * DAB
+ */
+
+#define dvb_mux_dab_class_delsys_get dvb_mux_class_delsys_get
+#define dvb_mux_dab_class_delsys_set dvb_mux_class_delsys_set
+
+static htsmsg_t *
+dvb_mux_dab_class_delsys_enum (void *o, const char *lang)
+{
+  htsmsg_t *list = htsmsg_create_list();
+  htsmsg_add_str(list, NULL, dvb_delsys2str(DVB_SYS_DAB));
+  return list;
+}
+
+const idclass_t dvb_mux_dab_class =
+{
+  .ic_super      = &dvb_mux_class,
+  .ic_class      = "dvb_mux_dab",
+  .ic_caption    = N_("DAB multiplex"),
+  .ic_properties = (const property_t[]){
+    {
+      MUX_PROP_STR("delsys", N_("Delivery system"), dab, delsys, "DAB"),
+      .desc     = N_("Select the delivery system used by your cable provider."),
+    },
+    {
+      .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,
+    },
+    {}
+  }
+};
+
 /* **************************************************************************
  * Class methods
  * *************************************************************************/
index a17a740bd24b0fb6eeb9401b05225bc28134c753..b2af98ff0ce18f2f499f2a22e39b7bd47a5f3c19 100644 (file)
@@ -137,12 +137,31 @@ dvb_network_atsc_t_class_scanfile_list ( void *o, const char *lang )
 {
   return dvb_network_class_scanfile_list(o, lang, "atsc-t");
 }
-
 static htsmsg_t *
 dvb_network_atsc_c_class_scanfile_list ( void *o, const char *lang )
 {
   return dvb_network_class_scanfile_list(o, lang, "atsc-c");
 }
+static htsmsg_t *
+dvb_network_isdb_t_class_scanfile_list ( void *o, const char *lang )
+{
+  return dvb_network_class_scanfile_list(o, lang, "isdb-t");
+}
+static htsmsg_t *
+dvb_network_isdb_c_class_scanfile_list ( void *o, const char *lang )
+{
+  return dvb_network_class_scanfile_list(o, lang, "isdb-c");
+}
+static htsmsg_t *
+dvb_network_isdb_s_class_scanfile_list ( void *o, const char *lang )
+{
+  return dvb_network_class_scanfile_list(o, lang, "isdb-s");
+}
+static htsmsg_t *
+dvb_network_dab_class_scanfile_list ( void *o, const char *lang )
+{
+  return dvb_network_class_scanfile_list(o, lang, "dab");
+}
 
 static const void *
 dvb_network_class_orbital_pos_get ( void *o )
@@ -321,6 +340,94 @@ const idclass_t dvb_network_atsc_c_class =
   }
 };
 
+const idclass_t dvb_network_isdb_t_class =
+{
+  .ic_super      = &dvb_network_class,
+  .ic_class      = "dvb_network_isdb_t",
+  .ic_caption    = N_("ISDB-T network"),
+  .ic_properties = (const property_t[]) {
+    {
+      .type     = PT_STR,
+      .id       = "scanfile",
+      .name     = N_("Pre-defined muxes"),
+      .desc     = N_("Use a pre-defined list of ISDB-T muxes. "
+                     "Note: these lists can sometimes be outdated and "
+                     "may cause scanning to take longer than usual."),
+      .set      = dvb_network_class_scanfile_set,
+      .get      = dvb_network_class_scanfile_get,
+      .list     = dvb_network_isdb_t_class_scanfile_list,
+      .opts     = PO_NOSAVE,
+    },
+    {}
+  }
+};
+
+const idclass_t dvb_network_isdb_c_class =
+{
+  .ic_super      = &dvb_network_class,
+  .ic_class      = "dvb_network_isdb_c",
+  .ic_caption    = N_("ISDB-C network"),
+  .ic_properties = (const property_t[]) {
+    {
+      .type     = PT_STR,
+      .id       = "scanfile",
+      .name     = N_("Pre-defined muxes"),
+      .desc     = N_("Use a pre-defined list of ISDB-C muxes. "
+                     "Note: these lists can sometimes be outdated and "
+                     "may cause scanning to take longer than usual."),
+      .set      = dvb_network_class_scanfile_set,
+      .get      = dvb_network_class_scanfile_get,
+      .list     = dvb_network_isdb_c_class_scanfile_list,
+      .opts     = PO_NOSAVE,
+    },
+    {}
+  }
+};
+
+const idclass_t dvb_network_isdb_s_class =
+{
+  .ic_super      = &dvb_network_class,
+  .ic_class      = "dvb_network_isdb_s",
+  .ic_caption    = N_("ISDB-S network"),
+  .ic_properties = (const property_t[]) {
+    {
+      .type     = PT_STR,
+      .id       = "scanfile",
+      .name     = N_("Pre-defined muxes"),
+      .desc     = N_("Use a pre-defined list of ISDB-S muxes. "
+                     "Note: these lists can sometimes be outdated and "
+                     "may cause scanning to take longer than usual."),
+      .set      = dvb_network_class_scanfile_set,
+      .get      = dvb_network_class_scanfile_get,
+      .list     = dvb_network_isdb_s_class_scanfile_list,
+      .opts     = PO_NOSAVE,
+    },
+    {}
+  }
+};
+
+const idclass_t dvb_network_dab_class =
+{
+  .ic_super      = &dvb_network_class,
+  .ic_class      = "dvb_network_dab",
+  .ic_caption    = N_("DAB network"),
+  .ic_properties = (const property_t[]) {
+    {
+      .type     = PT_STR,
+      .id       = "scanfile",
+      .name     = N_("Pre-defined muxes"),
+      .desc     = N_("Use a pre-defined list of DAB muxes. "
+                     "Note: these lists can sometimes be outdated and "
+                     "may cause scanning to take longer than usual."),
+      .set      = dvb_network_class_scanfile_set,
+      .get      = dvb_network_class_scanfile_get,
+      .list     = dvb_network_dab_class_scanfile_list,
+      .opts     = PO_NOSAVE,
+    },
+    {}
+  }
+};
+
 /* ****************************************************************************
  * Class methods
  * ***************************************************************************/
@@ -457,6 +564,14 @@ dvb_network_mux_class
     return &dvb_mux_atsc_t_class;
   if (idnode_is_instance(&mn->mn_id, &dvb_network_atsc_c_class))
     return &dvb_mux_atsc_c_class;
+  if (idnode_is_instance(&mn->mn_id, &dvb_network_isdb_t_class))
+    return &dvb_mux_isdb_t_class;
+  if (idnode_is_instance(&mn->mn_id, &dvb_network_isdb_c_class))
+    return &dvb_mux_isdb_c_class;
+  if (idnode_is_instance(&mn->mn_id, &dvb_network_isdb_s_class))
+    return &dvb_mux_isdb_s_class;
+  if (idnode_is_instance(&mn->mn_id, &dvb_network_dab_class))
+    return &dvb_mux_dab_class;
   return NULL;
 }
 
@@ -702,6 +817,10 @@ static  const idclass_t* dvb_network_classes[] = {
   &dvb_network_dvbs_class,
   &dvb_network_atsc_t_class,
   &dvb_network_atsc_c_class,
+  &dvb_network_isdb_t_class,
+  &dvb_network_isdb_c_class,
+  &dvb_network_isdb_s_class,
+  &dvb_network_dab_class
 };
 
 void dvb_network_init ( void )