diff --git a/src/muxer/muxer_pass.c b/src/muxer/muxer_pass.c index 906099a..47a9a2e 100644 --- a/src/muxer/muxer_pass.c +++ b/src/muxer/muxer_pass.c @@ -29,6 +29,33 @@ #include "muxer_pass.h" #include "dvr/dvr.h" +static uint8_t null_pkt[] = { + 0x47, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF +}; + typedef struct pass_muxer { muxer_t; @@ -429,39 +456,63 @@ 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; + } + tsb = tmp; + + /* PMT */ + } else if (tsb[1] & 0x40) { /* pusi - the first PMT packet */ + pm->pm_pmt[3] = (pm->pm_pmt[3] & 0xf0) | pm->pm_pmt_cc; pm->pm_pmt_cc = (pm->pm_pmt_cc + 1) & 0xf; + tsb = pm->pm_pmt; + } else { - /* Nullify packet */ - tsb[1] = 0x1f; - memset(tsb+2, 0xff, 186); + tsb = null_pkt; } + + /* Write */ + pass_muxer_write(m, tsb, 188); + + /* 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); }