]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
iptv: started work on added IPTV support
authorAdam Sutton <dev@adamsutton.me.uk>
Tue, 30 Apr 2013 10:19:27 +0000 (11:19 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Tue, 30 Apr 2013 10:19:27 +0000 (11:19 +0100)
13 files changed:
Makefile
src/idnode.c
src/idnode.h
src/input.h
src/input/mpegts.h
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_network.c
src/input/mpegts/mpegts_service.c
src/main.c
src/service.c
src/service.h
src/webui/extjs.c

index 6ee43dc36351f0c4c5b4ef96a5748a44d21026ea..6ad0f5e93f86211595c166c7788689fdb3527075 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -108,6 +108,7 @@ SRCS =  src/version.c \
        src/tvhtime.c \
        src/descrambler/descrambler.c \
        src/serviceprobe.c \
+  src/input.c \
 
 SRCS += \
        src/parsers/parsers.c \
@@ -194,7 +195,9 @@ SRCS-${CONFIG_LINUXDVB} += \
 
 # IPTV
 SRCS-${CONFIG_IPTV} += \
-       src/input/mepgts/iptv.c
+       src/input/mpegts/iptv/iptv.c \
+  src/input/mpegts/iptv/iptv_mux.c \
+  src/input/mpegts/iptv/iptv_service.c \
 
 # TSfile
 SRCS-$(CONFIG_TSFILE) += \
index f4bddfa9fae567184adc5b54db3d91923bed5c01..3ef95278b6302e010051cc0ccfe5659fc0ab5322 100644 (file)
@@ -342,38 +342,9 @@ idnode_notify_title_changed(void *obj)
   notify_by_msg("idnodeNameChanged", m);
 }
 
-idnode_t *
-idnode_create0 ( size_t alloc, const idclass_t *class, const char *uuid )
-{
-  idnode_t *self = calloc(1, alloc);
-  idnode_insert(self, uuid, class);
-  return self;
-}
-
-void
-idnode_save ( idnode_t *self, const char *path )
-{
-  // serialize
-  // save
-}
-
-idnode_t *
-idnode_load ( htsmsg_field_t *cfg, void*(*create)(const char*) )
-{
-  htsmsg_t *m;
-  idnode_t *self;
-  if (!(m    = htsmsg_get_map_by_field(cfg))) return NULL;
-  if (!(self = create(cfg->hmf_name)))          return NULL;
-  // todo deserialize settings
-  return self;
-}
-
-void
-idnode_load_all ( const char *path, void*(*create)(const char *) )
+int
+idnode_load_one
+  ( idnode_t *self, htsmsg_t *m )
 {
-  htsmsg_t *m;
-  htsmsg_field_t *f;
-  if ((m = hts_settings_load(path)))
-    HTSMSG_FOREACH(f, m)
-      idnode_load(f, create);
+  return 0;
 }
index f5cf45c0fb470e6d54ccb53daa04226fc3ecc600..9edba2db3d79b3a9a1790c44365c993939d05b5c 100644 (file)
@@ -61,3 +61,5 @@ idnode_t *idnode_create0
 
 #define idnode_create(c, uuid)\
   (struct c*)idnode_create0(sizeof(struct c), &c##_class, uuid)
+
+int idnode_load_one(idnode_t *self, htsmsg_t *cfg);
index f49e27d4f5a151f6e97062a1758c0e18702ae6af..e2c9d1b516a44adc61cdb43601ae9a74aac56d8c 100644 (file)
@@ -25,7 +25,8 @@
 
 #if ENABLE_MPEGTS
 #include "input/mpegts.h"
-#include "input/mpegts/tsfile/tsfile.h" // TODO: move
 #endif
 
+void input_init ( void );
+
 #endif /* __TVH_INPUT_H__ */
index e6e1f35dc41a76f7e64b609180c7274e1dc47fb1..9fc82154bc8ea1cacae88a8838649d2794216635 100644 (file)
@@ -396,22 +396,43 @@ struct mpegts_input
  * ***************************************************************************/
 
 mpegts_input_t *mpegts_input_create0
-  ( const char *uuid );
+  ( mpegts_input_t *mi, const idclass_t *idc, const char *uuid );
+
+#define mpegts_input_create(t, u)\
+  (struct t*)mpegts_input_create0(calloc(1, sizeof(struct t)), t##_class, u)
 
 mpegts_network_t *mpegts_network_create0
-  ( const char *uuid, const char *name );
+  ( mpegts_network_t *mn, const idclass_t *idc, const char *uuid,
+    const char *name );
 
+#define mpegts_network_create(t, u, n)\
+  (struct t*)mpegts_network_create0(calloc(1, sizeof(struct t)), t##_class, u, n)
+  
 void mpegts_network_schedule_initial_scan
   ( mpegts_network_t *mm );
 
 mpegts_mux_t *mpegts_mux_create0
-  ( const char *uuid, mpegts_network_t *net, uint16_t onid, uint16_t tsid );
+  ( mpegts_mux_t *mm, const idclass_t *class, const char *uuid,
+    mpegts_network_t *mn, uint16_t onid, uint16_t tsid );
 
-mpegts_mux_instance_t *mpegts_mux_instance_create0
-  ( size_t alloc, const char *uuid, mpegts_input_t *mi, mpegts_mux_t *mm );
+#define mpegts_mux_create(type, uuid, mn, onid, tsid)\
+  (struct type*)mpegts_mux_create0(calloc(1, sizeof(struct type)),\
+                                   &type##_class, uuid,\
+                                   mn, onid, tsid)
 
 void mpegts_mux_initial_scan_done ( mpegts_mux_t *mm );
 
+void mpegts_mux_load_one ( mpegts_mux_t *mm, htsmsg_t *c );
+
+mpegts_mux_instance_t *mpegts_mux_instance_create0
+  ( mpegts_mux_instance_t *mmi, const idclass_t *class, const char *uuid,
+    mpegts_input_t *mi, mpegts_mux_t *mm );
+
+#define mpegts_mux_instance_create(type, uuid, mi, mm)\
+  (struct type*)mpegts_mux_instance_create0(calloc(1, sizeof(struct type)),\
+                                            &type##_class, uuid,\
+                                            mi, mm);
+
 void mpegts_mux_set_tsid ( mpegts_mux_t *mm, uint16_t tsid, int force );
 
 void mpegts_mux_set_onid ( mpegts_mux_t *mm, uint16_t onid, int force );
@@ -439,12 +460,15 @@ void mpegts_table_flush_all
 void mpegts_table_destroy ( mpegts_table_t *mt );
 
 mpegts_service_t *mpegts_service_create0
-  ( size_t alloc, const idclass_t *class, const char *uuid,
+  ( mpegts_service_t *ms, const idclass_t *class, const char *uuid,
     mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid );
 
 /* Create */
 #define mpegts_service_create(t, u, m, s, p)\
-  (struct t*)mpegts_service_create0(sizeof(struct t), &t##_class, u, m, s, p)
+  (struct t*)mpegts_service_create0(calloc(1, sizeof(struct t)),\
+                                    &t##_class, u, m, s, p)
+
+void mpegts_service_load_one ( mpegts_service_t *ms, htsmsg_t *c );
 
 mpegts_service_t *mpegts_service_find ( mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid, const char *uuid, int *save );
 
index 433090bf8f87f13da27eea5faec4fed1733aedc8..5aca0d0de8ddda0926578d2683f7e48d4b54146f 100644 (file)
@@ -204,9 +204,10 @@ mpegts_input_current_weight ( mpegts_input_t *mi )
 }
 
 mpegts_input_t*
-mpegts_input_create0 ( const char *uuid )
+mpegts_input_create0  
+  ( mpegts_input_t *mi, const idclass_t *class, const char *uuid )
 {
-  mpegts_input_t *mi = idnode_create(mpegts_input, uuid);
+  idnode_insert(&mi->mi_id, uuid, class);
 
   /* Init mutex */
   pthread_mutex_init(&mi->mi_delivery_mutex, NULL);
index 83687b214baa77f575625aff0c4c18871a6e23c5..78c77993faf1771b2c00d2d654fb681fc4b2437a 100644 (file)
@@ -33,12 +33,10 @@ const idclass_t mpegts_mux_instance_class =
 
 mpegts_mux_instance_t *
 mpegts_mux_instance_create0
-  ( size_t alloc, const char *uuid, mpegts_input_t *mi, mpegts_mux_t *mm )
+  ( mpegts_mux_instance_t *mmi, const idclass_t *class, const char *uuid,
+    mpegts_input_t *mi, mpegts_mux_t *mm )
 {
-  mpegts_mux_instance_t *mmi;
-
-  /* Create */
-  mmi = (mpegts_mux_instance_t*)idnode_create0(alloc, &mpegts_mux_instance_class, uuid);
+  idnode_insert(&mmi->mmi_id, uuid, class);
 
   /* Setup links */
   mmi->mmi_mux   = mm;
@@ -55,6 +53,11 @@ const idclass_t mpegts_mux_class =
   .ic_class      = "mpegts_mux",
   .ic_caption    = "MPEGTS Multiplex",
   .ic_properties = (const property_t[]){
+    {  PROPDEF1("onid", "Original Network ID",
+               PT_INT, mpegts_mux_t, mm_onid) },
+    {  PROPDEF1("tsid", "Transport Stream ID",
+               PT_INT, mpegts_mux_t, mm_tsid) },
+
   }
 };
 
@@ -192,11 +195,26 @@ mpegts_mux_close_table ( mpegts_mux_t *mm, mpegts_table_t *mt )
   printf("table closed %04X\n", mt->mt_pid);
 }
 
+void
+mpegts_mux_load_one ( mpegts_mux_t *mm, htsmsg_t *c )
+{
+  uint32_t u32;
+  
+  /* ONID */
+  if (!htsmsg_get_u32(c, "onid", &u32))
+    mm->mm_onid = u32;
+
+  /* TSID */
+  if (!htsmsg_get_u32(c, "tsid", &u32))
+    mm->mm_tsid = u32;
+}
+
 mpegts_mux_t *
-mpegts_mux_create0  
-  ( const char *uuid, mpegts_network_t *net, uint16_t onid, uint16_t tsid )
+mpegts_mux_create0
+  ( mpegts_mux_t *mm, const idclass_t *class, const char *uuid,
+    mpegts_network_t *net, uint16_t onid, uint16_t tsid )
 {
-  mpegts_mux_t *mm = idnode_create(mpegts_mux, uuid);
+  idnode_insert(&mm->mm_id, uuid, class);
 
   /* Identification */
   mm->mm_onid                = onid;
index b14b13b0cd5afe69a782d983dcaacf17f023467f..62b5e94f8e5f9b5e847c3464372f947919746b7d 100644 (file)
@@ -52,9 +52,10 @@ mpegts_network_schedule_initial_scan ( mpegts_network_t *mn )
 
 mpegts_network_t *
 mpegts_network_create0
-  ( const char *uuid, const char *netname )
+  ( mpegts_network_t *mn, const idclass_t *idc, const char *uuid,
+    const char *netname )
 {
-  mpegts_network_t *mn = idnode_create(mpegts_network, uuid);
+  idnode_insert(&mn->mn_id, uuid, idc);
   mn->mn_network_name = strdup(netname);
   TAILQ_INIT(&mn->mn_initial_scan_pending_queue);
   TAILQ_INIT(&mn->mn_initial_scan_current_queue);
index 045e6ffa5adbfeedd58b1bc4e0ca11c037f104a4..23453545234dcbefc2f1e5eb76ae8d28e2773070 100644 (file)
@@ -203,15 +203,51 @@ mpegts_service_setsourceinfo(service_t *t, source_info_t *si)
     si->si_service = strdup(s->s_dvb_svcname);
 }
 
+/*
+ * Load
+ */
+void
+mpegts_service_load_one
+  ( mpegts_service_t *ms, htsmsg_t *c )
+{
+  uint32_t u32;
+  const char *str;
+
+  /* Load core */
+  service_load_one((service_t*)ms, c);
+
+  /* Load local */
+  if (!htsmsg_get_u32(c, "pcr_pid", &u32))
+    ms->s_pcr_pid = u32;
+  if (!htsmsg_get_u32(c, "pmt_pid", &u32))
+    ms->s_pmt_pid = u32;
+  if (!htsmsg_get_u32(c, "sid", &u32))
+    ms->s_dvb_service_id = u32;
+  if (!htsmsg_get_u32(c, "channel_num", &u32))
+    ms->s_dvb_channel_num = u32;
+  if ((str = htsmsg_get_str(c, "svcname")))
+    tvh_str_update(&ms->s_dvb_svcname, str);
+  if ((str = htsmsg_get_str(c, "provider")))
+    tvh_str_update(&ms->s_dvb_provider, str);
+  if ((str = htsmsg_get_str(c, "default_authority")))
+    tvh_str_update(&ms->s_dvb_default_authority, str);
+  if (!htsmsg_get_u32(c, "servicetype", &u32))
+    ms->s_dvb_servicetype = u32;
+  if ((str = htsmsg_get_str(c, "charset")))
+    tvh_str_update(&ms->s_dvb_charset, str);
+  if (!htsmsg_get_u32(c, "eit_enable", &u32))
+    ms->s_dvb_eit_enable = u32 ? 1 : 0;
+}
+
 /*
  * Create service
  */
 mpegts_service_t *
 mpegts_service_create0
-  ( size_t alloc, const idclass_t *class, const char *uuid,
+  ( mpegts_service_t *s, const idclass_t *class, const char *uuid,
     mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid )
 {
-  mpegts_service_t *s = (mpegts_service_t*)service_create0(alloc, uuid, class, S_MPEG_TS);
+  service_create0((service_t*)s, class, uuid, S_MPEG_TS);
   printf("mpegts_service_create0 = %p\n", s);
 
   /* Create */
index 9ff4b413c91471ac9ec730575fb6c0b77665c673..fe03cf3bbd6f818e89199e6a98f0f42144ad6467 100644 (file)
@@ -698,18 +698,7 @@ main(int argc, char **argv)
 
   access_init(opt_firstrun, opt_noacl);
 
-#if ENABLE_LINUXDVB
-  muxes_init();
-  dvb_init(adapter_mask, opt_dvb_raw);
-#endif
-
-#if ENABLE_IPTV
-  iptv_input_init();
-#endif
-
-#if ENABLE_V4L
-  v4l_init();
-#endif
+  input_init();
 
 #if ENABLE_TIMESHIFT
   timeshift_init();
@@ -730,11 +719,13 @@ main(int argc, char **argv)
 
   htsp_init(opt_bindaddr);
 
+#if 0
   if(opt_tsfile.num) {
     tsfile_init(opt_tsfile_tuner ?: opt_tsfile.num);
     for (i = 0; i < opt_tsfile.num; i++)
       tsfile_add_file(opt_tsfile.str[i]);
   }
+#endif
 
   if(opt_subscribe != NULL)
     subscription_dummy_join(opt_subscribe, 1);
index bb9e16bd39ebc7b63605299a67afac597c4d969f..462449acde558b75d5c6d667749ecbeb7fd97414 100644 (file)
@@ -481,10 +481,10 @@ service_destroy(service_t *t)
  * Create and initialize a new service struct
  */
 service_t *
-service_create0(size_t alloc, const char *uuid, const idclass_t *idc, int source_type)
+service_create0
+  ( service_t *t, const idclass_t *class, const char *uuid, int source_type)
 {
-  service_t *t = (service_t*)idnode_create0(alloc, idc, uuid);
-printf("service_create0 = %p\n", t);
+  idnode_insert(&t->s_id, uuid, class);
 
   lock_assert(&global_lock);
 
@@ -1274,3 +1274,7 @@ htsmsg_t *servicetype_list ( void )
 #endif
   return ret;
 }
+
+void service_load_one ( service_t *s, htsmsg_t *c )
+{
+}
index a7e3e65709292d7bbc166475bd05c204d354bdb3..3bfc039894966bd50dcdec47ddbfa433e9e85956 100644 (file)
@@ -433,11 +433,10 @@ void service_init(void);
 
 int service_start(service_t *t, int instance);
 
-service_t *service_create0(size_t alloc, const char *uuid, const idclass_t *idc, int source_type);
-
-#define service_create(t, u, s)\
-  (struct t*)service_create0(sizeof(struct t), u, &t##_class, s)
+service_t *service_create0(service_t *t, const idclass_t *idc, const char *uuid, int source_type);
 
+#define service_create(t, c, u, s)\
+  (struct t*)service_create0(calloc(1, sizeof(struct t), &t##_class, c, u, s)
 
 void service_unref(service_t *t);
 
@@ -524,4 +523,6 @@ int service_is_primary_epg (service_t *t);
 
 htsmsg_t *servicetype_list (void);
 
+void service_load_one ( service_t *s, htsmsg_t *c );
+
 #endif // SERVICE_H__
index 9ff8e4e7ad32f5a7cc19a00b5669643b20c759bc..f689c7028322e76e6ee64ae1c7ccbab9620afde7 100644 (file)
@@ -1730,7 +1730,7 @@ extjs_mergechannel(http_connection_t *hc, const char *remain, void *opaque)
 /**
  *
  */
-#if ENABLE_IPTV
+#if 0//ENABLE_IPTV
 static void
 service_update_iptv(htsmsg_t *in)
 {
@@ -2375,7 +2375,7 @@ extjs_start(void)
   http_path_add("/config",           NULL, extjs_config,           ACCESS_WEB_INTERFACE);
   http_path_add("/languages",        NULL, extjs_languages,        ACCESS_WEB_INTERFACE);
   http_path_add("/mergechannel",     NULL, extjs_mergechannel,     ACCESS_ADMIN);
-#if ENABLE_IPTV
+#if 0//ENABLE_IPTV
   http_path_add("/iptv/services",    NULL, extjs_iptvservices,     ACCESS_ADMIN);
 #endif
   http_path_add("/servicedetails",   NULL, extjs_servicedetails,   ACCESS_ADMIN);