iptv: started work on added IPTV support
This commit is contained in:
parent
844b65a840
commit
a7d7392661
13 changed files with 131 additions and 78 deletions
5
Makefile
5
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) += \
|
||||
|
|
37
src/idnode.c
37
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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
15
src/main.c
15
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);
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
}
|
||||
|
|
|
@ -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__
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue