From 8e2ed3f4666934592a34eb5743b860ec755e68d8 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Tue, 30 Apr 2013 13:46:47 +0100 Subject: [PATCH] another swing back to looking at the tsfile input as access to home is crap atm --- src/input.h | 3 ++ src/input/mpegts.h | 17 +++++-- src/input/mpegts/mpegts_input.c | 13 +++--- src/input/mpegts/mpegts_mux.c | 33 ++++++++------ src/input/mpegts/mpegts_network.c | 9 +++- src/input/mpegts/mpegts_service.c | 1 - src/input/mpegts/mpegts_table.c | 29 ++++++++++-- src/input/mpegts/{tsfile => }/tsfile.h | 0 src/input/mpegts/tsfile/tsfile.c | 51 ++++++++++----------- src/input/mpegts/tsfile/tsfile_input.c | 57 +++++++++++------------- src/input/mpegts/tsfile/tsfile_mux.c | 22 ++++----- src/input/mpegts/tsfile/tsfile_private.h | 19 +++++--- src/main.c | 2 +- 13 files changed, 151 insertions(+), 105 deletions(-) rename src/input/mpegts/{tsfile => }/tsfile.h (100%) diff --git a/src/input.h b/src/input.h index e2c9d1b5..4765618a 100644 --- a/src/input.h +++ b/src/input.h @@ -25,6 +25,9 @@ #if ENABLE_MPEGTS #include "input/mpegts.h" +#if ENABLE_TSFILE +#include "input/mpegts/tsfile.h" +#endif #endif void input_init ( void ); diff --git a/src/input/mpegts.h b/src/input/mpegts.h index d73f1e28..1466d1db 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -23,8 +23,8 @@ #include "service.h" #include "src/input/mpegts/psi.h" -#define MM_ONID_NONE 0xFFFF -#define MM_TSID_NONE 0xFFFF +#define MPEGTS_ONID_NONE 0xFFFF +#define MPEGTS_TSID_NONE 0xFFFF /* Types */ typedef struct mpegts_table mpegts_table_t; @@ -406,6 +406,11 @@ mpegts_input_t *mpegts_input_create0 #define mpegts_input_create(t, u)\ (struct t*)mpegts_input_create0(calloc(1, sizeof(struct t)), t##_class, u) +#define mpegts_input_create1(u)\ + mpegts_input_create0(calloc(1, sizeof(mpegts_input_t)),\ + &mpegts_input_class, u) + + mpegts_network_t *mpegts_network_create0 ( mpegts_network_t *mn, const idclass_t *idc, const char *uuid, const char *name ); @@ -426,6 +431,9 @@ mpegts_mux_t *mpegts_mux_create0 (struct type*)mpegts_mux_create0(calloc(1, sizeof(struct type)),\ &type##_class, uuid,\ mn, onid, tsid) +#define mpegts_mux_create1(uuid, mn, onid, tsid)\ + mpegts_mux_create0(calloc(1, sizeof(mpegts_mux_t)), &mpegts_mux_class, uuid,\ + mn, onid, tsid) void mpegts_mux_initial_scan_done ( mpegts_mux_t *mm ); @@ -470,11 +478,14 @@ mpegts_service_t *mpegts_service_create0 ( 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(calloc(1, sizeof(struct t)),\ &t##_class, u, m, s, p) +#define mpegts_service_create1(u, m, s, p)\ + mpegts_service_create0(calloc(1, sizeof(mpegts_service_t)),\ + &mpegts_service_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 e7d69acc..a72a6beb 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -54,7 +54,7 @@ mpegts_input_recv_packets mpegts_mux_t *mm = mmi->mmi_mux; assert(mmi->mmi_input == mi); assert(mm != NULL); - tvhtrace("mpegts", "recv_packets tsb=%p, len=%d, pcr=%p, pcr_pid=%p", + tvhtrace("tsdemux", "recv_packets tsb=%p, len=%d, pcr=%p, pcr_pid=%p", tsb, (int)len, pcr, pcr_pid); /* Not enough data */ @@ -81,6 +81,7 @@ mpegts_input_recv_packets /* Sync */ if ( tsb[i] == 0x47 ) { int pid = ((tsb[i+1] & 0x1f) << 8) | tsb[i+2]; + tvhtrace("tsdemux", "recv_packet for pid %04X (%d)", pid, pid); /* SI data */ if (mm->mm_table_filter[pid]) { @@ -116,9 +117,9 @@ mpegts_input_recv_packets /* Re-sync */ } else { // TODO: set flag (to avoid spam) - tvhlog(LOG_DEBUG, "mpegts", "%s ts sync lost", "TODO"); + tvhlog(LOG_DEBUG, "tsdemux", "%s ts sync lost", "TODO"); if (ts_resync(tsb, &len, &i)) break; - tvhlog(LOG_DEBUG, "mpegts", "%s ts sync found", "TODO"); + tvhlog(LOG_DEBUG, "tsdemux", "%s ts sync found", "TODO"); } } @@ -191,10 +192,8 @@ mpegts_input_table_thread ( void *aux ) int mpegts_input_is_free ( mpegts_input_t *mi ) { - int r; - r = (LIST_FIRST(&mi->mi_mux_active) == NULL); - printf("mpegts_input_is_free(%p) = %d\n", mi, r); - return r; + mpegts_mux_instance_t *mmi = LIST_FIRST(&mi->mi_mux_active); + return mmi ? 0 : 1; } int diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 78c77993..4cfe3d20 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -43,7 +43,6 @@ mpegts_mux_instance_create0 mmi->mmi_input = mi; // TODO: is this required? LIST_INSERT_HEAD(&mm->mm_instances, mmi, mmi_mux_link); - printf("added to mm_instances\n"); return mmi; } @@ -65,7 +64,7 @@ void mpegts_mux_set_onid ( mpegts_mux_t *mm, uint16_t onid, int force ) { if (onid == mm->mm_onid) return; - if (!force && mm->mm_onid != MM_ONID_NONE) + if (!force && mm->mm_onid != MPEGTS_ONID_NONE) return; mm->mm_onid = onid; } @@ -74,7 +73,7 @@ void mpegts_mux_set_tsid ( mpegts_mux_t *mm, uint16_t tsid, int force ) { if (tsid == mm->mm_tsid) return; - if (!force && mm->mm_tsid != MM_ONID_NONE) + if (!force && mm->mm_tsid != MPEGTS_TSID_NONE) return; mm->mm_tsid = tsid; } @@ -91,7 +90,8 @@ mpegts_mux_initial_scan_link ( mpegts_mux_t *mm ) TAILQ_INSERT_TAIL(&mn->mn_initial_scan_pending_queue, mm, mm_initial_scan_link); mn->mn_initial_scan_num++; - printf("initial_scan_num = %d\n", mn->mn_initial_scan_num); + tvhtrace("mpegts", "added mm %p to initial scan for mn %p pending %d", + mm, mn, mn->mn_initial_scan_num); mpegts_network_schedule_initial_scan(mn); } @@ -99,7 +99,7 @@ static void mpegts_mux_initial_scan_timeout ( void *aux ) { mpegts_mux_t *mm = aux; - tvhlog(LOG_DEBUG, "mpegts", "Initial scan timed out for %s", "TODO"); + tvhlog(LOG_DEBUG, "mpegts", "initial scan timed out for mm %p", mm); mpegts_mux_initial_scan_done(mm); } @@ -122,12 +122,14 @@ mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight ) mpegts_network_t *mn = mm->mm_network; mpegts_mux_instance_t *mmi; - printf("mpegts_mux_start(%p, %s, %d)\n", mm, reason, weight); + tvhtrace("mpegts", "mm %p starting for '%s' (weight %d)", + mm, reason, weight); /* Already tuned */ - if (mm->mm_active) + if (mm->mm_active) { + tvhtrace("mpegts", "mm %p already active", mm); return 0; - printf("not already tuned\n"); + } /* Find */ // TODO: don't like this is unbounded, if for some reason mi_start_mux() @@ -135,12 +137,12 @@ mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight ) while (1) { /* Find free input */ - printf("checking for free input\n"); LIST_FOREACH(mmi, &mm->mm_instances, mmi_mux_link) if (!mmi->mmi_tune_failed && - !mmi->mmi_input->mi_is_free(mmi->mmi_input)) + mmi->mmi_input->mi_is_free(mmi->mmi_input)) break; - printf("free input ?= %p\n", mmi); + if (mmi) + tvhtrace("mpegts", "found free mmi %p", mmi); /* Try and remove a lesser instance */ if (!mmi) { @@ -155,6 +157,9 @@ mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight ) break; } + if (mmi) + tvhtrace("mpegts", "found mmi %p to boot", mmi); + /* No free input */ if (!mmi) return SM_CODE_NO_FREE_ADAPTER; @@ -182,7 +187,8 @@ mpegts_mux_open_table ( mpegts_mux_t *mm, mpegts_table_t *mt ) if (mt->mt_pid >= 0x2000) return; if (!mm->mm_table_filter[mt->mt_pid]) - printf("table opened %04X\n", mt->mt_pid); + tvhtrace("mpegts", "mm %p opened table pid %04X (%d)", + mm, mt->mt_pid, mt->mt_pid); mm->mm_table_filter[mt->mt_pid] = 1; } @@ -191,8 +197,9 @@ mpegts_mux_close_table ( mpegts_mux_t *mm, mpegts_table_t *mt ) { if (mt->mt_pid >= 0x2000) return; + tvhtrace("mpegts", "mm %p closed table pid %04X (%d)", + mm, mt->mt_pid, mt->mt_pid); mm->mm_table_filter[mt->mt_pid] = 0; - printf("table closed %04X\n", mt->mt_pid); } void diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index d0ec2de0..70b7c5af 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -28,13 +28,19 @@ const idclass_t mpegts_network_class = } }; +static mpegts_mux_t * +mpegts_network_create_mux + ( mpegts_mux_t *mm, uint16_t sid, uint16_t tsid, void *aux ) +{ + return NULL; +} + static void mpegts_network_initial_scan(void *aux) { mpegts_network_t *mn = aux; mpegts_mux_t *mm; - printf("mpegts_network_initial_scan(%p)\n", aux); while((mm = TAILQ_FIRST(&mn->mn_initial_scan_pending_queue)) != NULL) { assert(mm->mm_initial_scan_status == MM_SCAN_PENDING); if (mm->mm_start(mm, "initial scan", 1)) @@ -63,6 +69,7 @@ mpegts_network_create0 const char *netname ) { idnode_insert(&mn->mn_id, uuid, idc); + mn->mn_create_mux = mpegts_network_create_mux; 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 23453545..d809538d 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -248,7 +248,6 @@ mpegts_service_create0 mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid ) { service_create0((service_t*)s, class, uuid, S_MPEG_TS); - printf("mpegts_service_create0 = %p\n", s); /* Create */ tvhlog(LOG_DEBUG, "mpegts", "Add service %04X on %s", sid, "TODO"); diff --git a/src/input/mpegts/mpegts_table.c b/src/input/mpegts/mpegts_table.c index 351e69ff..2c1fd552 100644 --- a/src/input/mpegts/mpegts_table.c +++ b/src/input/mpegts/mpegts_table.c @@ -21,6 +21,26 @@ #include +static void +mpegts_table_fastswitch ( mpegts_mux_t *mm ) +{ + mpegts_table_t *mt; + + if(mm->mm_initial_scan_status == MM_SCAN_DONE) + return; + + LIST_FOREACH(mt, &mm->mm_tables, mt_link) + if((mt->mt_flags & MT_QUICKREQ) && mt->mt_count == 0) + return; + + // TODO: + //dvb_mux_save(dm); + + tvhlog(LOG_DEBUG, "mpegts", "initial scan for mm %p done", mm); + mpegts_mux_initial_scan_done(mm); +} + + void mpegts_table_dispatch ( const uint8_t *sec, size_t r, void *aux ) @@ -65,10 +85,8 @@ mpegts_table_dispatch if(ret == 0) mt->mt_count++; - /* TODO - if(mt->mt_flags & TDT_QUICKREQ) - dvb_table_fastswitch(tdmi); - */ + if(mt->mt_flags & MT_QUICKREQ) + mpegts_table_fastswitch(mt->mt_mux); } void @@ -109,6 +127,9 @@ mpegts_table_add mt->mt_opaque == opaque ) return; + tvhtrace("mpegts", "add %s table %02X/%02X (%d) pid %04X (%d)", + name, tableid, mask, tableid, pid, pid); + /* Create */ mt = calloc(1, sizeof(mpegts_table_t)); mt->mt_refcount = 1; diff --git a/src/input/mpegts/tsfile/tsfile.h b/src/input/mpegts/tsfile.h similarity index 100% rename from src/input/mpegts/tsfile/tsfile.h rename to src/input/mpegts/tsfile.h diff --git a/src/input/mpegts/tsfile/tsfile.c b/src/input/mpegts/tsfile/tsfile.c index 719e9674..b36f37cc 100644 --- a/src/input/mpegts/tsfile/tsfile.c +++ b/src/input/mpegts/tsfile/tsfile.c @@ -20,35 +20,28 @@ #include "tvheadend.h" #include "input.h" #include "channels.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 + * Globals */ -static mpegts_mux_t * -tsfile_network_create_mux - ( mpegts_mux_t *src, uint16_t onid, uint16_t tsid, void *aux ) -{ - return NULL; -} +mpegts_network_t tsfile_network; +mpegts_input_list_t tsfile_inputs; + +extern const idclass_t mpegts_service_class; +extern const idclass_t mpegts_network_class; /* - * Service creation + * Network definition */ static mpegts_service_t * tsfile_network_create_service ( mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid ) { static int t = 0; - mpegts_service_t *s = mpegts_service_create0(sizeof(mpegts_service_t), - &mpegts_service_class, - NULL, mm, sid, pmt_pid); + mpegts_service_t *s = mpegts_service_create1(NULL, mm, sid, pmt_pid); + + // TODO: HACK: REMOVE ME if (s) { char buf[128]; sprintf(buf, "channel-%d", t); @@ -67,15 +60,19 @@ void tsfile_init ( int tuners ) mpegts_input_t *mi; /* 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; + mpegts_network_create0(&tsfile_network, &mpegts_network_class, NULL, + "TSfile Network"); + tsfile_network.mn_create_service = tsfile_network_create_service; - /* Create inputs */ - for (i = 0; i < tuners; i++) { - mi = tsfile_input_create(); - mi->mi_network = tsfile_network; - LIST_INSERT_HEAD(&tsfile_inputs, mi, mi_global_link); + /* IPTV like setup */ + if (tuners <= 0) { + mi = tsfile_input_create(0); + mpegts_network_add_input(&tsfile_network, mi); + } else { + for (i = 0; i < tuners; i++) { + mi = tsfile_input_create(i+1); + mpegts_network_add_input(&tsfile_network, mi); + } } } @@ -86,10 +83,10 @@ void tsfile_add_file ( const char *path ) { mpegts_input_t *mi; mpegts_mux_t *mm; -printf("tsfile_add_file(%s)\n", path); + tvhtrace("tsfile", "add file %s", path); /* Create logical instance */ - mm = tsfile_mux_create0(NULL, tsfile_network, MM_ONID_NONE, MM_TSID_NONE); + mm = tsfile_mux_create(&tsfile_network); /* Create physical instance (for each tuner) */ LIST_FOREACH(mi, &tsfile_inputs, mi_global_link) diff --git a/src/input/mpegts/tsfile/tsfile_input.c b/src/input/mpegts/tsfile/tsfile_input.c index d8598b33..54d5feba 100644 --- a/src/input/mpegts/tsfile/tsfile_input.c +++ b/src/input/mpegts/tsfile/tsfile_input.c @@ -29,6 +29,9 @@ #include #include #include +#include + +extern const idclass_t mpegts_input_class; static void * tsfile_input_thread ( void *aux ) @@ -40,25 +43,24 @@ tsfile_input_thread ( void *aux ) struct stat st; uint8_t tsb[188*10]; int64_t pcr, pcr_last = PTS_UNSET, pcr_last_realtime = 0; - uint16_t pcr_pid = 0; mpegts_input_t *mi = aux; mpegts_mux_instance_t *mmi; + tsfile_mux_instance_t *tmi; /* Open file */ -printf("waiting for lock..\n"); pthread_mutex_lock(&global_lock); -printf("got lock\n"); if ((mmi = LIST_FIRST(&mi->mi_mux_active))) { - tsfile_mux_instance_t *tmi = (tsfile_mux_instance_t*)mmi; + tmi = (tsfile_mux_instance_t*)mmi; fd = tvh_open(tmi->mmi_tsfile_path, O_RDONLY | O_NONBLOCK, 0); if (fd == -1) tvhlog(LOG_ERR, "tsfile", "open(%s) failed %d (%s)", tmi->mmi_tsfile_path, errno, strerror(errno)); + else + tvhtrace("tsfile", "adapter %d opened %s", mi->mi_instance, tmi->mmi_tsfile_path); } pthread_mutex_unlock(&global_lock); if (fd == -1) return NULL; - printf("file opened = %d\n", fd); /* Polling */ memset(&ev, 0, sizeof(ev)); @@ -77,7 +79,8 @@ printf("got lock\n"); /* Check for extra (incomplete) packet at end */ rem = st.st_size % 188; len = 0; -printf("file size = %lu, rem = %lu\n", st.st_size, rem); + tvhtrace("tsfile", "adapter %d file size %"PRIsize_t " rem %"PRIsize_t, + mi->mi_instance, st.st_size, rem); /* Process input */ while (1) { @@ -101,6 +104,7 @@ printf("file size = %lu, rem = %lu\n", st.st_size, rem); if (len == st.st_size) { len = 0; c -= rem; + //tvhtrace("tsfile", "adapter %d reached eof, resetting", mi->mi_instance); lseek(fd, 0, SEEK_SET); pcr_last = PTS_UNSET; } @@ -108,7 +112,8 @@ printf("file size = %lu, rem = %lu\n", st.st_size, rem); /* Process */ if (c >= 0) { pcr = PTS_UNSET; - pos = mpegts_input_recv_packets(mi, mmi, tsb, c, &pcr, &pcr_pid); + pos = mpegts_input_recv_packets(mi, mmi, tsb, c, &pcr, &tmi->mmi_tsfile_pcr_pid); + printf("pcr = %lu, pcr_pid = %d\n", pcr, tmi->mmi_tsfile_pcr_pid); /* Delay */ if (pcr != PTS_UNSET) { @@ -129,6 +134,7 @@ printf("file size = %lu, rem = %lu\n", st.st_size, rem); pcr_last_realtime = getmonoclock(); } } + sched_yield(); } exit: @@ -138,11 +144,9 @@ exit: } static void -tsfile_input_stop_mux ( mpegts_input_t *mi ) +tsfile_input_stop_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) { int err; - mpegts_mux_instance_t *mmi = LIST_FIRST(&mi->mi_mux_active); - assert(mmi != NULL); /* Stop thread */ if (mi->mi_thread_pipe.rd != -1) { @@ -164,17 +168,20 @@ tsfile_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *t ) struct stat st; mpegts_mux_t *mm = t->mmi_mux; tsfile_mux_instance_t *mmi = (tsfile_mux_instance_t*)t; - printf("tsfile_input_start_mux(%p, %p)\n", mi, t); + tvhtrace("tsfile", "adapter %d starting mmi %p", mi->mi_instance, mmi); /* Already tuned */ -#if 0 + if (mmi->mmi_mux->mm_active == t) { + tvhtrace("tsfile", "mmi %p is already active", mmi); + return 0; + } assert(mmi->mmi_mux->mm_active == NULL); assert(LIST_FIRST(&mi->mi_mux_active) == NULL); -#endif /* Check file is accessible */ if (lstat(mmi->mmi_tsfile_path, &st)) { - printf("could not stat %s\n", mmi->mmi_tsfile_path); + tvhlog(LOG_ERR, "tsfile", "mmi %p could not stat %s", + mmi, mmi->mmi_tsfile_path); mmi->mmi_tune_failed = 1; return SM_CODE_TUNING_FAILED; } @@ -205,32 +212,18 @@ tsfile_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *t ) return 0; } -/* TODO: I think most of these can be moved to mpegts */ - -static void -tsfile_input_open_service ( mpegts_input_t *mi, mpegts_service_t *t ) -{ -} - -static void -tsfile_input_close_service ( mpegts_input_t *mi, mpegts_service_t *t ) -{ -} - mpegts_input_t * -tsfile_input_create ( void ) +tsfile_input_create ( int idx ) { pthread_t tid; mpegts_input_t *mi; /* Create object */ - mi = mpegts_input_create0(NULL); + mi = mpegts_input_create1(NULL); + mi->mi_instance = idx; mi->mi_start_mux = tsfile_input_start_mux; mi->mi_stop_mux = tsfile_input_stop_mux; - mi->mi_open_service = tsfile_input_open_service; - mi->mi_close_service = tsfile_input_close_service; - mi->mi_is_free = mpegts_input_is_free; - mi->mi_current_weight = mpegts_input_current_weight; + LIST_INSERT_HEAD(&tsfile_inputs, mi, mi_global_link); /* Start table thread */ pthread_create(&tid, NULL, mpegts_input_table_thread, mi); diff --git a/src/input/mpegts/tsfile/tsfile_mux.c b/src/input/mpegts/tsfile/tsfile_mux.c index 69173e75..322c0c56 100644 --- a/src/input/mpegts/tsfile/tsfile_mux.c +++ b/src/input/mpegts/tsfile/tsfile_mux.c @@ -17,29 +17,31 @@ * 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; +extern const idclass_t mpegts_mux_instance_class; tsfile_mux_instance_t * tsfile_mux_instance_create ( const char *path, mpegts_input_t *mi, mpegts_mux_t *mm ) { - tsfile_mux_instance_t *mmi = (tsfile_mux_instance_t*) - mpegts_mux_instance_create0(sizeof(tsfile_mux_instance_t), - NULL, mi, mm); - mmi->mmi_tsfile_path = strdup(path); - printf("mmi craeated %p path %s\n", mmi, mmi->mmi_tsfile_path); +#define tsfile_mux_instance_class mpegts_mux_instance_class + tsfile_mux_instance_t *mmi = + mpegts_mux_instance_create(tsfile_mux_instance, NULL, mi, mm); +#undef tsfile_mux_instance_class + mmi->mmi_tsfile_path = strdup(path); + mmi->mmi_tsfile_pcr_pid = 0; + tvhtrace("tsfile", "mmi created %p path %s", mmi, mmi->mmi_tsfile_path); return mmi; } mpegts_mux_t * -tsfile_mux_create0 - ( const char *uuid, mpegts_network_t *mn, uint16_t onid, uint16_t tsid ) +tsfile_mux_create ( mpegts_network_t *mn ) { - mpegts_mux_t *mm = mpegts_mux_create0(NULL, mn, onid, tsid); + mpegts_mux_t *mm + = mpegts_mux_create1(NULL, mn, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE); + tvhtrace("tsfile", "mm created %p", mm); return mm; } diff --git a/src/input/mpegts/tsfile/tsfile_private.h b/src/input/mpegts/tsfile/tsfile_private.h index 5b16833a..678218e2 100644 --- a/src/input/mpegts/tsfile/tsfile_private.h +++ b/src/input/mpegts/tsfile/tsfile_private.h @@ -22,6 +22,12 @@ #include "input/mpegts.h" +/* + * Globals + */ +extern mpegts_network_t tsfile_network; +extern mpegts_input_list_t tsfile_inputs; + /* * Typedefs */ @@ -43,21 +49,22 @@ struct tsfile_mux_instance * File input */ - char *mmi_tsfile_path; ///< Source file path - th_pipe_t mmi_tsfile_pipe; ///< Thread control pipe + char *mmi_tsfile_path; ///< Source file path + th_pipe_t mmi_tsfile_pipe; ///< Thread control pipe + uint16_t mmi_tsfile_pcr_pid; ///< Timing control + }; /* * Prototypes */ -mpegts_input_t *tsfile_input_create ( void ); +mpegts_input_t *tsfile_input_create ( int idx ); 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 ); +mpegts_mux_t * +tsfile_mux_create ( mpegts_network_t *mn ); #endif /* __TVH_TSFILE_PRIVATE_H__ */ diff --git a/src/main.c b/src/main.c index fe03cf3b..93f9a18c 100644 --- a/src/main.c +++ b/src/main.c @@ -719,7 +719,7 @@ main(int argc, char **argv) htsp_init(opt_bindaddr); -#if 0 +#if ENABLE_TSFILE if(opt_tsfile.num) { tsfile_init(opt_tsfile_tuner ?: opt_tsfile.num); for (i = 0; i < opt_tsfile.num; i++)