From: Jaroslav Kysela Date: Wed, 28 Mar 2018 09:59:10 +0000 (+0200) Subject: mpegts input: add tspos per mux instance X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1f621ecfeb855327d23fcce0577a65b3d4eec02d;p=thirdparty%2Ftvheadend.git mpegts input: add tspos per mux instance --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 518d1258d..777a9cfc9 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -495,6 +495,7 @@ struct mpegts_mux * Data processing */ + uint64_t mm_input_pos; RB_HEAD(, mpegts_pid) mm_pids; LIST_HEAD(, mpegts_pid_sub) mm_all_subs; int mm_last_pid; diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 94924ad5d..96ed0a6cd 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -1367,6 +1367,7 @@ mpegts_input_process int table_wakeup = 0; mpegts_mux_t *mm = mpkt->mp_mux; mpegts_mux_instance_t *mmi; + uint64_t tspos; if (mm == NULL || (mmi = mm->mm_active) == NULL) return 0; @@ -1374,6 +1375,7 @@ mpegts_input_process assert(mm == mmi->mmi_mux); /* Process */ + tspos = mm->mm_input_pos; assert((len % 188) == 0); while (len > 0) { @@ -1427,12 +1429,12 @@ mpegts_input_process /* Stream all PIDs */ LIST_FOREACH(mps, &mm->mm_all_subs, mps_svcraw_link) if ((mps->mps_type & MPS_ALL) || (type & (MPS_TABLE|MPS_FTABLE))) - ts_recv_raw((mpegts_service_t *)mps->mps_owner, tsb, llen); + ts_recv_raw((mpegts_service_t *)mps->mps_owner, tspos, tsb, llen); /* Stream raw PIDs */ if (type & MPS_RAW) { LIST_FOREACH(mps, &mp->mp_raw_subs, mps_raw_link) - ts_recv_raw((mpegts_service_t *)mps->mps_owner, tsb, llen); + ts_recv_raw((mpegts_service_t *)mps->mps_owner, tspos, tsb, llen); } /* Stream service data */ @@ -1442,7 +1444,7 @@ mpegts_input_process f = (type & (MPS_TABLE|MPS_FTABLE)) || (pid == s->s_components.set_pmt_pid) || (pid == s->s_components.set_pcr_pid); - ts_recv_packet1((mpegts_service_t*)s, pid, tsb, llen, f); + ts_recv_packet1((mpegts_service_t*)s, tspos, pid, tsb, llen, f); } } else /* Stream table data */ @@ -1452,7 +1454,7 @@ mpegts_input_process f = (type & (MPS_TABLE|MPS_FTABLE)) || (pid == s->s_components.set_pmt_pid) || (pid == s->s_components.set_pcr_pid); - ts_recv_packet1((mpegts_service_t*)s, pid, tsb, llen, f); + ts_recv_packet1((mpegts_service_t*)s, tspos, pid, tsb, llen, f); } } @@ -1505,13 +1507,14 @@ mpegts_input_process /* Stream to all fullmux subscribers */ LIST_FOREACH(mps, &mm->mm_all_subs, mps_svcraw_link) - ts_recv_raw((mpegts_service_t *)mps->mps_owner, tsb, llen); + ts_recv_raw((mpegts_service_t *)mps->mps_owner, tspos, tsb, llen); } done: tsb += llen; len -= llen; + tspos += llen; } /* Raw stream */ @@ -1540,6 +1543,7 @@ done: /* Bandwidth monitoring */ llen = tsb - mpkt->mp_data; atomic_add(&mmi->tii_stats.bps, llen); + mm->mm_input_pos += llen; return llen; } diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 6acfb348f..bf45899e2 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -260,6 +260,7 @@ mpegts_mux_instance_start r = mi->mi_warm_mux(mi, mmi); if (r) return r; + mm->mm_input_pos = 0; r = mi->mi_start_mux(mi, mmi, weight); if (r) return r; diff --git a/src/input/mpegts/tsdemux.c b/src/input/mpegts/tsdemux.c index bb2ac8e15..a8ac3d86d 100644 --- a/src/input/mpegts/tsdemux.c +++ b/src/input/mpegts/tsdemux.c @@ -145,7 +145,8 @@ skip_cc: */ int ts_recv_packet1 - (mpegts_service_t *t, uint16_t pid, const uint8_t *tsb, int len, int table) + (mpegts_service_t *t, uint64_t tspos, uint16_t pid, + const uint8_t *tsb, int len, int table) { elementary_stream_t *st; uint_fast8_t scrambled, error = 0; @@ -257,7 +258,7 @@ ts_skip_packet2(mpegts_service_t *t, const uint8_t *tsb, int len) * */ void -ts_recv_raw(mpegts_service_t *t, const uint8_t *tsb, int len) +ts_recv_raw(mpegts_service_t *t, uint64_t tspos, const uint8_t *tsb, int len) { int pid, parent = 0; diff --git a/src/input/mpegts/tsdemux.h b/src/input/mpegts/tsdemux.h index 2089f4b8d..e62bb070f 100644 --- a/src/input/mpegts/tsdemux.h +++ b/src/input/mpegts/tsdemux.h @@ -25,12 +25,14 @@ void ts_recv_packet0 (struct mpegts_service *t, elementary_stream_t *st, const uint8_t *tsb, int len); int ts_recv_packet1 - (struct mpegts_service *t, uint16_t pid, const uint8_t *tsb, int len, int table); + (struct mpegts_service *t, uint64_t tspos, uint16_t pid, + const uint8_t *tsb, int len, int table); void ts_recv_packet2(struct mpegts_service *t, const uint8_t *tsb, int len); void ts_skip_packet2(struct mpegts_service *t, const uint8_t *tsb, int len); -void ts_recv_raw(struct mpegts_service *t, const uint8_t *tsb, int len); +void ts_recv_raw + (struct mpegts_service *t, uint64_t tspos, const uint8_t *tsb, int len); #endif /* TSDEMUX_H */