diff --git a/src/muxer/muxer_pass.c b/src/muxer/muxer_pass.c index 906099a..605463c 100644 --- a/src/muxer/muxer_pass.c +++ b/src/muxer/muxer_pass.c @@ -429,39 +429,65 @@ static void pass_muxer_write_ts(muxer_t *m, pktbuf_t *pb) { pass_muxer_t *pm = (pass_muxer_t*)m; - unsigned char* tsb; + uint8_t tmp[188], *tsb, *pkt = pb->pb_data; + size_t len = pb->pb_size; /* Rewrite PAT/PMT in operation */ if (pm->m_config.m_flags & (MC_REWRITE_PAT | MC_REWRITE_PMT)) { - tsb = pb->pb_data; + len = 0; while (tsb < pb->pb_data + pb->pb_size) { int pid = (tsb[1] & 0x1f) << 8 | tsb[2]; - /* PAT */ - if (pm->m_config.m_flags & MC_REWRITE_PAT && pid == 0) { - if (pass_muxer_rewrite_pat(pm, tsb)) { - tvherror("pass", "PAT rewrite failed, disabling"); - pm->m_config.m_flags &= ~MC_REWRITE_PAT; - } - /* PMT */ - } else if (pm->m_config.m_flags & MC_REWRITE_PMT && pid == pm->pm_pmt_pid) { - if (tsb[1] & 0x40) { /* pusi - the first PMT packet */ - memcpy(tsb, pm->pm_pmt, 188); - tsb[3] = (pm->pm_pmt[3] & 0xf0) | pm->pm_pmt_cc; + /* Process */ + if ( ((pm->m_config.m_flags & MC_REWRITE_PAT) && (pid == 0)) || + ((pm->m_config.m_flags & MC_REWRITE_PMT) && + (pid == pm->pm_pmt_pid)) ) { + + /* Flush */ + if (len) + pass_muxer_write(m, pkt, len); + + /* Store new start point (after this packet) */ + pkt = tsb + 188; + len = 0; + + /* PAT */ + if (pid == 0) { + memcpy(tmp, tsb, sizeof(tmp)); + if (pass_muxer_rewrite_pat(pm, tmp)) { + tvherror("pass", "PAT rewrite failed, disabling"); + pm->m_config.m_flags &= ~MC_REWRITE_PAT; + } + + /* PMT */ + } else if (tsb[1] & 0x40) { /* pusi - the first PMT packet */ + memcpy(tmp, pm->pm_pmt, 188); + tmp[3] = (pm->pm_pmt[3] & 0xf0) | pm->pm_pmt_cc; pm->pm_pmt_cc = (pm->pm_pmt_cc + 1) & 0xf; + } else { /* Nullify packet */ - tsb[1] = 0x1f; + tmp[0] = 0x47; + tmp[1] = 0x1f; memset(tsb+2, 0xff, 186); } + + /* Write */ + pass_muxer_write(m, tmp, sizeof(tmp)); + + /* Record */ + } else { + len += 188; } + /* Next packet */ tsb += 188; } } - pass_muxer_write(m, pb->pb_data, pb->pb_size); + if (len) + pass_muxer_write(m, pkt, len); }