diff options
author | Jochen Dolze <vdr@dolze.de> | 2009-09-22 09:29:03 +0200 |
---|---|---|
committer | Jochen Dolze <vdr@dolze.de> | 2009-09-22 09:29:03 +0200 |
commit | 8f9594678c4e0d94e546cd2e94f898bf796c86c6 (patch) | |
tree | db70bb896f08b831485f9d97a53b134708b9c5a6 /ts2pes.cpp | |
parent | 27b768a40f33b229ee832d22f24696565b812f98 (diff) | |
download | vdr-plugin-markad-8f9594678c4e0d94e546cd2e94f898bf796c86c6.tar.gz vdr-plugin-markad-8f9594678c4e0d94e546cd2e94f898bf796c86c6.tar.bz2 |
Updated various things
Diffstat (limited to 'ts2pes.cpp')
-rw-r--r-- | ts2pes.cpp | 112 |
1 files changed, 74 insertions, 38 deletions
@@ -29,19 +29,25 @@ void cMarkAdTS2PES::Reset() pesdata=NULL; pessize=0; data_left=false; - streamsize=0; counter=-1; sync=false; } -int cMarkAdTS2PES::FindPESHeader(uchar *TSData, int TSSize, int *StreamSize) +int cMarkAdTS2PES::FindPESHeader(uchar *TSData, int TSSize, int *StreamSize, + int *HeaderSize) { - unsigned long scanner=0xFFFFFFFF; - int i; + if ((!TSData) || (!TSSize)) return -1; +#define PESHDRSIZE 6 + if (StreamSize) (*StreamSize)=0; + if (HeaderSize) (*HeaderSize)=3; + //unsigned long scanner=0xFFFFFFFF; + int i=0; +long scanner=-1; + for (i=0; i<TSSize; i++) { scanner<<=8; - if (scanner==0x00000100) + if (scanner==(long) 0x00000100L) { break; } @@ -49,22 +55,35 @@ int cMarkAdTS2PES::FindPESHeader(uchar *TSData, int TSSize, int *StreamSize) } if (i!=TSSize) { - if (StreamSize) + if ((StreamSize) && ((i+2)<TSSize)) { if (TSData[i]>=0xBC) { - *StreamSize=(TSData[i+1]<<8)+TSData[i+2]; + (*StreamSize)=(TSData[i+1]<<8)+TSData[i+2]; if (*StreamSize) (*StreamSize)+=6; // 6 Byte PES-Header } } + if ((HeaderSize) && ((i+6)<TSSize)) + { + struct PESHDROPT *peshdropt=(struct PESHDROPT *) &TSData[i+3]; + if (peshdropt->MarkerBits==0x2) + { + (*HeaderSize)=PESHDRSIZE+sizeof(struct PESHDROPT)+ + peshdropt->Length; + } + else + { + (*HeaderSize)=PESHDRSIZE; + } + } return i-3; } return -1; } -int cMarkAdTS2PES::Process(int Pid, uchar *TSData, int TSSize, uchar **PESData, int *PESSize) +int cMarkAdTS2PES::Process(MarkAdPid Pid, uchar *TSData, int TSSize, uchar **PESData, int *PESSize) { - if ((!PESData) || (!PESSize)) return -1; + if ((!PESData) || (!PESSize) || (!TSData) || (!TSSize)) return -1; *PESData=NULL; *PESSize=0; @@ -92,7 +111,7 @@ int cMarkAdTS2PES::Process(int Pid, uchar *TSData, int TSSize, uchar **PESData, struct TSHDR *tshdr = (struct TSHDR *) TSData; int pid = (tshdr->PidH << 8) | tshdr->PidL; - if (Pid!=pid) + if (Pid.Num!=pid) { return TS_SIZE; // not for us } @@ -148,6 +167,13 @@ int cMarkAdTS2PES::Process(int Pid, uchar *TSData, int TSSize, uchar **PESData, Reset(); return TS_SIZE; } + if (buflen<0) + { + // error in size + Reset(); + return TS_SIZE; + } + bytes_processed=TS_SIZE-buflen; pesdata=(uchar *) realloc(pesdata,pessize+buflen); @@ -166,20 +192,26 @@ int cMarkAdTS2PES::Process(int Pid, uchar *TSData, int TSSize, uchar **PESData, data_left=false; } - int peshdr=FindPESHeader(pesdata, pessize, &streamsize); + int streamsize=0; + int peshdrsize=3; // size of sync (just as start) + int peshdr=FindPESHeader(pesdata, pessize, &streamsize, &peshdrsize); + if (peshdr==0) { if (!streamsize) { - peshdr=FindPESHeader(pesdata+3,pessize-3,NULL); - if (peshdr>0) peshdr+=3; + peshdr=FindPESHeader(pesdata+peshdrsize,pessize-peshdrsize,NULL,NULL); + if (peshdr>=0) + { + peshdr+=peshdrsize; + } } else { if (pessize>streamsize) { int size=pessize-streamsize; - + uchar *pesptr=pesdata; *PESData=pesdata; *PESSize=streamsize; if (pesdatalast) free(pesdatalast); @@ -189,43 +221,47 @@ int cMarkAdTS2PES::Process(int Pid, uchar *TSData, int TSSize, uchar **PESData, void *ptr=malloc(size); if (!ptr) return -1; - memcpy(ptr,(*PESData)+streamsize,size); + memcpy(ptr,pesptr+streamsize,size); bytes_processed-=size; pessize=size; pesdata=(uchar *) ptr; data_left=true; - streamsize=0; } } } + if (peshdr>0) { // start of next PES paket found if (pesdata) { - // return old data - *PESData=pesdata; - *PESSize=peshdr; - if (pesdatalast) free(pesdatalast); - pesdatalast=pesdata; - int size=pessize-peshdr; - pesdata=NULL; - pessize=0; - - if (size>0) - { - void *ptr=malloc(size); - if (!ptr) return -1; - memcpy(ptr,(*PESData)+peshdr,size); - bytes_processed-=size; - pessize=size; - pesdata=(uchar *) ptr; - data_left=true; - } - else + if ((pesdata[0]==0) && (pesdata[1]==0) && (pesdata[2]==1)) { - // TODO: not sure if this is ok - bytes_processed-=size; + // return old data + uchar *pesptr=pesdata; + *PESData=pesdata; + *PESSize=peshdr; + if (pesdatalast) free(pesdatalast); + pesdatalast=pesdata; + int size=pessize-peshdr; + pesdata=NULL; + pessize=0; + + if (size>0) + { + void *ptr=malloc(size); + if (!ptr) return -1; + memcpy(ptr,pesptr+peshdr,size); + bytes_processed-=size; + pessize=size; + pesdata=(uchar *) ptr; + data_left=true; + } + else + { + // TODO: not sure if this is ok + bytes_processed-=size; + } } } } |