diff options
author | Jochen Dolze <vdr@dolze.de> | 2009-10-06 00:36:26 +0200 |
---|---|---|
committer | Jochen Dolze <vdr@dolze.de> | 2009-10-06 00:36:26 +0200 |
commit | c11caab8aa7f1e296694e2eaa4477d299adcd1e6 (patch) | |
tree | 64adfc0dbab11a45f804489f9f4bddbef720fb0c /ts2pkt.cpp | |
parent | c69708374c62615009e2b92783dcea696166470e (diff) | |
download | vdr-plugin-markad-c11caab8aa7f1e296694e2eaa4477d299adcd1e6.tar.gz vdr-plugin-markad-c11caab8aa7f1e296694e2eaa4477d299adcd1e6.tar.bz2 |
Fixed TS packet processing (buffer overflows)
Added packet injection
Diffstat (limited to 'ts2pkt.cpp')
-rw-r--r-- | ts2pkt.cpp | 47 |
1 files changed, 42 insertions, 5 deletions
@@ -24,8 +24,8 @@ void cMarkAdTS2Pkt::Reset(int ErrIndex) { switch (ErrIndex) { - case MA_ERR_TOSMALL: - dsyslog("markad [%i]: input to small",recvnumber); + case MA_ERR_TSSIZE: + dsyslog("markad [%i]: inbuf not 188 bytes",recvnumber); break; case MA_ERR_NOSYNC: dsyslog("markad [%i]: found no sync",recvnumber); @@ -37,16 +37,53 @@ void cMarkAdTS2Pkt::Reset(int ErrIndex) dsyslog("markad [%i]: wrong AFC value",recvnumber); break; case MA_ERR_TOBIG: - dsyslog("markad [%i]: buflen > 188",recvnumber); + dsyslog("markad [%i]: buflen > 188 bytes",recvnumber); break; case MA_ERR_NEG: - dsyslog("markad [%i]: buflen < 0",recvnumber); + dsyslog("markad [%i]: buflen negative",recvnumber); break; } counter=-1; if (queue) queue->Clear(); } +bool cMarkAdTS2Pkt::InjectVideoPES(uchar *PESData, int PESSize) +{ + if ((!PESData) || (!PESSize)) return false; + + struct PESHDR *peshdr=(struct PESHDR *) PESData; + + // first check some simple things + if ((peshdr->Sync1!=0) && (peshdr->Sync2!=0) && (peshdr->Sync3!=1)) return false; + if ((peshdr->StreamID & 0xF0)!=0xE0) return false; + + int Length=(peshdr->LenH<<8)+peshdr->LenL; + if (Length) Length+=sizeof(PESHDR); + if (Length!=PESSize) return false; + + struct PESHDROPT *peshdropt=(struct PESHDROPT *) &PESData[sizeof(struct PESHDR)]; + + uchar *buf; + int buflen; + + if (peshdropt->MarkerBits==0x2) + { + // we have an optional PES header + int bpos=sizeof(struct PESHDR)+sizeof(struct PESHDROPT)+ + peshdropt->Length; + buf=&PESData[bpos]; + buflen=PESSize-bpos; + } + else + { + int bpos=sizeof(struct PESHDR); + buf=&PESData[bpos]; + buflen=PESSize-bpos; + } + queue->Inject(buf,buflen); + return true; +} + void cMarkAdTS2Pkt::Process(MarkAdPid Pid, uchar *TSData, int TSSize, uchar **PktData, int *PktSize) { if ((!PktData) || (!PktSize) || (!queue)) return; @@ -57,7 +94,7 @@ void cMarkAdTS2Pkt::Process(MarkAdPid Pid, uchar *TSData, int TSSize, uchar **Pk { if (TSSize!=TS_SIZE) { - Reset(MA_ERR_TOSMALL); + Reset(MA_ERR_TSSIZE); return; // we need a full packet } |