diff --git a/src/input/mpegts.h b/src/input/mpegts.h
index 4e49ad10..e6e1f35d 100644
--- a/src/input/mpegts.h
+++ b/src/input/mpegts.h
@@ -140,6 +140,18 @@ struct mpegts_network
*/
mpegts_mux_list_t mn_muxes;
+ /*
+ * Functions
+ */
+ mpegts_mux_t* (*mn_create_mux)
+ (mpegts_mux_t*, uint16_t onid, uint16_t tsid, void *aux);
+ mpegts_service_t* (*mn_create_service)
+ (mpegts_mux_t*, uint16_t sid, uint16_t pmt_pid);
+
+ // Note: the above are slightly odd in that they take mux instead of
+ // network as initial param. This is intentional as we need to
+ // know the mux and can easily get to network from there
+
#if 0 // TODO: FIXME
int dn_fe_type; // Frontend types for this network (FE_QPSK, etc)
#endif
@@ -208,6 +220,7 @@ struct mpegts_mux
int (*mm_start) ( mpegts_mux_t *mm, const char *reason, int weight );
void (*mm_open_table) (mpegts_mux_t*,mpegts_table_t*);
void (*mm_close_table) (mpegts_mux_t*,mpegts_table_t*);
+
#if 0
dvb_mux_conf_t dm_conf;
@@ -311,14 +324,6 @@ struct mpegts_service
};
-/* Create */
-mpegts_service_t * mpegts_service_create0
- ( size_t alloc, const idclass_t *class, const char *uuid );
-#define mpegts_service_create(uuid)\
- mpegts_service_create0(sizeof(mpegts_service_t), &mpegts_service_class, uuid)
-#define mpegts_service_create1(type, uuid)\
- (type##_t*)mpegts_service_create0(sizeof(type##_t), &type##_class, uuid)
-
/* **************************************************************************
* Physical Network
* *************************************************************************/
@@ -433,6 +438,14 @@ void mpegts_table_flush_all
(mpegts_mux_t *mm);
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_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)
+
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_service.c b/src/input/mpegts/mpegts_service.c
index 385b5484..62f06118 100644
--- a/src/input/mpegts/mpegts_service.c
+++ b/src/input/mpegts/mpegts_service.c
@@ -204,34 +204,17 @@ mpegts_service_setsourceinfo(service_t *t, source_info_t *si)
}
/*
- * Find service
+ * Create service
*/
mpegts_service_t *
-mpegts_service_find
- ( mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid, const char *uuid, int *save )
+mpegts_service_create0
+ ( size_t alloc, const idclass_t *class, const char *uuid,
+ mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid )
{
- mpegts_service_t *s;
-
- /* Validate */
- lock_assert(&global_lock);
-
- /* Find existing service */
- LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link)
- if (s->s_dvb_service_id == sid) {
- if (pmt_pid && pmt_pid != s->s_pmt_pid) {
- s->s_pmt_pid = pmt_pid;
- if (save) *save = 1;
- }
- return s;
- }
-
- /* Ignore */
- if (!pmt_pid)
- return NULL;
+ mpegts_service_t *s = (mpegts_service_t*)idnode_create0(alloc, class, uuid);
/* Create */
tvhlog(LOG_DEBUG, "mpegts", "Add service %04X on %s", sid, "TODO");
- s = service_create(mpegts_service, uuid, S_MPEG_TS);
sbuf_init(&s->s_tsbuf);
@@ -254,6 +237,40 @@ mpegts_service_find
pthread_mutex_lock(&s->s_stream_mutex);
// TODO: nice name
pthread_mutex_unlock(&s->s_stream_mutex);
+
+ return s;
+}
+
+/*
+ * Find service
+ */
+mpegts_service_t *
+mpegts_service_find
+ ( mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid,
+ const char *uuid, int *save )
+{
+ mpegts_service_t *s;
+
+ /* Validate */
+ lock_assert(&global_lock);
+
+ /* Find existing service */
+ LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link)
+ if (s->s_dvb_service_id == sid) {
+ if (pmt_pid && pmt_pid != s->s_pmt_pid) {
+ s->s_pmt_pid = pmt_pid;
+ if (save) *save = 1;
+ }
+ return s;
+ }
+
+ /* Ignore */
+ if (!pmt_pid)
+ return NULL;
+
+ /* Create */
+ s = mm->mm_network->mn_create_service(mm, sid, pmt_pid);
+ if (save) *save = 1;
return s;
}
diff --git a/src/input/mpegts/tsfile/tsfile.c b/src/input/mpegts/tsfile/tsfile.c
index 2fe9669c..66027cc5 100644
--- a/src/input/mpegts/tsfile/tsfile.c
+++ b/src/input/mpegts/tsfile/tsfile.c
@@ -17,12 +17,38 @@
* along with this program. If not, see .
*/
+#include "input.h"
#include "tsfile.h"
#include "tsfile_private.h"
+extern const idclass_t mpegts_service_class;
+
static mpegts_network_t *tsfile_network;
LIST_HEAD(,mpegts_input) tsfile_inputs;
+/*
+ * Cannot create muxes
+ */
+static mpegts_mux_t *
+tsfile_network_create_mux
+ ( mpegts_mux_t *src, uint16_t onid, uint16_t tsid, void *aux )
+{
+ return NULL;
+}
+
+/*
+ * Service creation
+ */
+static mpegts_service_t *
+tsfile_network_create_service
+ ( mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid )
+{
+ mpegts_service_t *s = mpegts_service_create0(sizeof(mpegts_service_t),
+ &mpegts_service_class,
+ NULL, mm, sid, pmt_pid);
+ return s;
+}
+
/*
* Initialise
*/
@@ -33,6 +59,8 @@ void tsfile_init ( int tuners )
/* Shared network */
tsfile_network = mpegts_network_create0(NULL, "tsfile network");
+ tsfile_network->mn_create_mux = tsfile_network_create_mux;
+ tsfile_network->mn_create_service = tsfile_network_create_service;
/* Create inputs */
for (i = 0; i < tuners; i++) {
@@ -52,7 +80,7 @@ void tsfile_add_file ( const char *path )
printf("tsfile_add_file(%s)\n", path);
/* Create logical instance */
- mm = mpegts_mux_create0(NULL, tsfile_network, MM_ONID_NONE, MM_TSID_NONE);
+ mm = tsfile_mux_create0(NULL, tsfile_network, MM_ONID_NONE, MM_TSID_NONE);
/* Create physical instance (for each tuner) */
LIST_FOREACH(mi, &tsfile_inputs, mi_global_link)
diff --git a/src/input/mpegts/tsfile/tsfile.h b/src/input/mpegts/tsfile/tsfile.h
index 0785a41a..6a9e0f7b 100644
--- a/src/input/mpegts/tsfile/tsfile.h
+++ b/src/input/mpegts/tsfile/tsfile.h
@@ -20,6 +20,11 @@
#ifndef __TVH_TSFILE_H__
#define __TVH_TSFILE_H__
+#include
+
+struct mpegts_mux;
+struct mpegts_network;
+
/* Initialise system (with N tuners) */
void tsfile_init ( int tuners );
diff --git a/src/input/mpegts/tsfile/tsfile_mux.c b/src/input/mpegts/tsfile/tsfile_mux.c
index 923f8eba..69173e75 100644
--- a/src/input/mpegts/tsfile/tsfile_mux.c
+++ b/src/input/mpegts/tsfile/tsfile_mux.c
@@ -17,8 +17,12 @@
* along with this program. If not, see .
*/
+#include "tsfile.h"
#include "tsfile_private.h"
+extern const idclass_t mpegts_mux_class;
+extern const idclass_t mpegts_service_class;
+
tsfile_mux_instance_t *
tsfile_mux_instance_create
( const char *path, mpegts_input_t *mi, mpegts_mux_t *mm )
@@ -31,6 +35,14 @@ tsfile_mux_instance_create
return mmi;
}
+mpegts_mux_t *
+tsfile_mux_create0
+ ( const char *uuid, mpegts_network_t *mn, uint16_t onid, uint16_t tsid )
+{
+ mpegts_mux_t *mm = mpegts_mux_create0(NULL, mn, onid, tsid);
+ return mm;
+}
+
/******************************************************************************
* Editor Configuration
diff --git a/src/input/mpegts/tsfile/tsfile_private.h b/src/input/mpegts/tsfile/tsfile_private.h
index 62bbc36c..5b16833a 100644
--- a/src/input/mpegts/tsfile/tsfile_private.h
+++ b/src/input/mpegts/tsfile/tsfile_private.h
@@ -34,6 +34,11 @@ struct tsfile_mux_instance
{
mpegts_mux_instance_t; ///< Parent obj
+ /*
+ * Timing
+ */
+
+
/*
* File input
*/
@@ -50,6 +55,10 @@ mpegts_input_t *tsfile_input_create ( void );
tsfile_mux_instance_t *tsfile_mux_instance_create
( const char *path, mpegts_input_t *mi, mpegts_mux_t *mm );
+struct mpegts_mux *
+tsfile_mux_create0
+ ( const char *uuid, struct mpegts_network *mn, uint16_t onid, uint16_t tsid );
+
#endif /* __TVH_TSFILE_PRIVATE_H__ */
/******************************************************************************