diff --git a/Makefile b/Makefile index 6ee43dc3..6ad0f5e9 100644 --- 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) += \ diff --git a/src/idnode.c b/src/idnode.c index f4bddfa9..3ef95278 100644 --- a/src/idnode.c +++ b/src/idnode.c @@ -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 ) +int +idnode_load_one + ( idnode_t *self, htsmsg_t *m ) { - 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 *) ) -{ - htsmsg_t *m; - htsmsg_field_t *f; - if ((m = hts_settings_load(path))) - HTSMSG_FOREACH(f, m) - idnode_load(f, create); + return 0; } diff --git a/src/idnode.h b/src/idnode.h index f5cf45c0..9edba2db 100644 --- a/src/idnode.h +++ b/src/idnode.h @@ -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); diff --git a/src/input.h b/src/input.h index f49e27d4..e2c9d1b5 100644 --- a/src/input.h +++ b/src/input.h @@ -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__ */ diff --git a/src/input/mpegts.h b/src/input/mpegts.h index e6e1f35d..9fc82154 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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 ); diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 433090bf..5aca0d0d 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -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); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 83687b21..78c77993 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -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); } -mpegts_mux_t * -mpegts_mux_create0 - ( const char *uuid, mpegts_network_t *net, uint16_t onid, uint16_t tsid ) +void +mpegts_mux_load_one ( mpegts_mux_t *mm, htsmsg_t *c ) { - mpegts_mux_t *mm = idnode_create(mpegts_mux, uuid); + 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 + ( mpegts_mux_t *mm, const idclass_t *class, const char *uuid, + mpegts_network_t *net, uint16_t onid, uint16_t tsid ) +{ + idnode_insert(&mm->mm_id, uuid, class); /* Identification */ mm->mm_onid = onid; diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index b14b13b0..62b5e94f 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -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); diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index 045e6ffa..23453545 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -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 */ diff --git a/src/main.c b/src/main.c index 9ff4b413..fe03cf3b 100644 --- a/src/main.c +++ b/src/main.c @@ -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); diff --git a/src/service.c b/src/service.c index bb9e16bd..462449ac 100644 --- a/src/service.c +++ b/src/service.c @@ -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 ) +{ +} diff --git a/src/service.h b/src/service.h index a7e3e657..3bfc0398 100644 --- a/src/service.h +++ b/src/service.h @@ -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__ diff --git a/src/webui/extjs.c b/src/webui/extjs.c index 9ff8e4e7..f689c702 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -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);