iptv: started work on added IPTV support

This commit is contained in:
Adam Sutton 2013-04-30 11:19:27 +01:00
parent 844b65a840
commit a7d7392661
13 changed files with 131 additions and 78 deletions

View file

@ -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) += \

View 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 )
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;
}

View 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);

View 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__ */

View 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 );

View 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);

View 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);
}
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;

View 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);

View 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 */

View 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);

View 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 )
{
}

View 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__

View 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);