src/tvhtime.c \
src/descrambler/descrambler.c \
src/serviceprobe.c \
+ src/input.c \
SRCS += \
src/parsers/parsers.c \
# 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) += \
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;
}
#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);
#if ENABLE_MPEGTS
#include "input/mpegts.h"
-#include "input/mpegts/tsfile/tsfile.h" // TODO: move
#endif
+void input_init ( void );
+
#endif /* __TVH_INPUT_H__ */
* ***************************************************************************/
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 );
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 );
}
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);
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;
.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) },
+
}
};
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;
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);
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 */
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();
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);
* 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);
#endif
return ret;
}
+
+void service_load_one ( service_t *s, htsmsg_t *c )
+{
+}
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);
htsmsg_t *servicetype_list (void);
+void service_load_one ( service_t *s, htsmsg_t *c );
+
#endif // SERVICE_H__
/**
*
*/
-#if ENABLE_IPTV
+#if 0//ENABLE_IPTV
static void
service_update_iptv(htsmsg_t *in)
{
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);