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;
assert(mm == mmi->mmi_mux);
/* Process */
+ tspos = mm->mm_input_pos;
assert((len % 188) == 0);
while (len > 0) {
/* 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 */
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 */
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);
}
}
/* 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 */
/* Bandwidth monitoring */
llen = tsb - mpkt->mp_data;
atomic_add(&mmi->tii_stats.bps, llen);
+ mm->mm_input_pos += llen;
return llen;
}
*/
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;
*
*/
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;
(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 */