diff options
Diffstat (limited to 'remux/ts2es.c')
-rw-r--r-- | remux/ts2es.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/remux/ts2es.c b/remux/ts2es.c new file mode 100644 index 0000000..2f27d4f --- /dev/null +++ b/remux/ts2es.c @@ -0,0 +1,87 @@ +#include "remux/ts2es.h" + +// from VDR's remux.c +#define MAXNONUSEFULDATA (10*1024*1024) + +class cTS2ES: public ipack { + friend void PutES(uint8_t *Buffer, int Size, void *Data); + +private: + uint8_t *m_ResultBuffer; + int *m_ResultCount; + +public: + cTS2ES(uint8_t *ResultBuffer, int *ResultCount); + ~cTS2ES(); + + void PutTSPacket(const uint8_t *Buffer); +}; + +void PutES(uint8_t *Buffer, int Size, void *Data) { + cTS2ES *This = (cTS2ES*)Data; + uint8_t payl = Buffer[8] + 9 + This->start - 1; + int count = Size - payl; + + if (*This->m_ResultCount + count > RESULTBUFFERSIZE) { + esyslog("ERROR: result buffer overflow (%d + %d > %d)", + *This->m_ResultCount, count, RESULTBUFFERSIZE); + count = RESULTBUFFERSIZE - *This->m_ResultCount; + } + memcpy(This->m_ResultBuffer + *This->m_ResultCount, Buffer + payl, count); + *This->m_ResultCount += count; + This->start = 1; +} + +cTS2ES::cTS2ES(uint8_t *ResultBuffer, int *ResultCount) { + m_ResultBuffer = ResultBuffer; + m_ResultCount = ResultCount; + + init_ipack(this, IPACKS, PutES, 0); + data = (void*)this; +} + +cTS2ES::~cTS2ES() { +} + +void cTS2ES::PutTSPacket(const uint8_t *Buffer) { + if (!Buffer) + return; + + if (Buffer[1] & 0x80) { // ts error + // TODO + } + + if (Buffer[1] & 0x40) { // payload start + if (plength == MMAX_PLENGTH - 6) { + plength = found - 6; + found = 0; + send_ipack(this); + reset_ipack(this); + } + } + + uint8_t off = 0; + + if (Buffer[3] & 0x20) { // adaptation field? + off = Buffer[4] + 1; + if (off + 4 > TS_SIZE - 1) + return; + } + + instant_repack((uint8_t*)(Buffer + 4 + off), TS_SIZE - 4 - off, this); +} + +cTS2ESRemux::cTS2ESRemux(int Pid): + cTSRemux(false) { + m_Pid = Pid; + m_Remux = new cTS2ES(m_ResultBuffer, &m_ResultCount); +} + +cTS2ESRemux::~cTS2ESRemux() { + delete m_Remux; +} + +void cTS2ESRemux::PutTSPacket(int Pid, const uint8_t *Data) { + if (Pid == m_Pid) m_Remux->PutTSPacket(Data); +} + |