summaryrefslogtreecommitdiff
path: root/demux.cpp
diff options
context:
space:
mode:
authorJochen Dolze <vdr@dolze.de>2009-09-25 21:25:30 +0200
committerJochen Dolze <vdr@dolze.de>2009-09-25 21:25:30 +0200
commit404b1e87e9d1f8854cbbd5a438ec4791b6ed296b (patch)
treec533dfc3b656f2afe92560c94caaf50105504272 /demux.cpp
parent8f9594678c4e0d94e546cd2e94f898bf796c86c6 (diff)
downloadvdr-plugin-markad-404b1e87e9d1f8854cbbd5a438ec4791b6ed296b.tar.gz
vdr-plugin-markad-404b1e87e9d1f8854cbbd5a438ec4791b6ed296b.tar.bz2
Updated demux, ts2pkt
Diffstat (limited to 'demux.cpp')
-rw-r--r--demux.cpp67
1 files changed, 48 insertions, 19 deletions
diff --git a/demux.cpp b/demux.cpp
index 96748a2..a0aec72 100644
--- a/demux.cpp
+++ b/demux.cpp
@@ -8,38 +8,67 @@
#include "demux.h"
-cMarkAdDemux::cMarkAdDemux()
+cMarkAdDemux::cMarkAdDemux(int RecvNumber)
{
- ts2pes=new cMarkAdTS2PES();
+ ts2pkt=new cMarkAdTS2Pkt(RecvNumber);
pes2audioes=NULL;
- pespkt=NULL;
+ pkt=NULL;
pesptr=NULL;
- peslen=0;
+ pktlen=0;
+ tsdata=tsptr=NULL;
+ tssize=0;
}
cMarkAdDemux::~cMarkAdDemux()
{
- if (ts2pes) delete ts2pes;
+ if (ts2pkt) delete ts2pkt;
if (pes2audioes) delete pes2audioes;
+ if (tsdata) free(tsdata);
}
int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, int *PktLen)
{
- if ((!Data) && (!Count) && (!ts2pes) && (!pes2audioes) ||
+ if ((!Data) && (!Count) && (!ts2pkt) && (!pes2audioes) ||
(!Pkt) || (!PktLen) || (!Pid.Num)) return -1;
*Pkt=NULL;
*PktLen=0;
int len=-1; // we don't want loops
- if (!peslen)
+ if (!pktlen)
{
- len=ts2pes->Process(Pid,Data,Count,&pespkt,&peslen);
+ if (tssize<TS_SIZE)
+ {
+ tsdata=(uchar *) realloc(tsdata,tssize+Count);
+ if (!tsdata) return -1;
+ memcpy(tsdata+tssize,Data,Count);
+ tssize+=Count;
+ tsptr=tsdata;
+ if (tssize<TS_SIZE) return Count;
+ }
+ len=ts2pkt->Process(Pid,tsdata,tssize,&pkt,&pktlen);
+
+ int bufleftsize=tssize-len;
+ uchar *ptr=(uchar *) malloc(bufleftsize);
+ if (!ptr) return -1;
+ memcpy(ptr,tsdata+len,bufleftsize);
+
+ free(tsdata);
+ tsdata=ptr;
+ tssize=bufleftsize;
+ if (tssize<TS_SIZE)
+ {
+ len=Count;
+ }
+ else
+ {
+ len=0;
+ }
}
- if (pespkt)
+ if (pkt)
{
- if ((((pespkt[3]>=0xc0) && (pespkt[3]<=0xDF)) || (pespkt[3]==0xBD))
+ if ((((pkt[3]>=0xc0) && (pkt[3]<=0xDF)) || (pkt[3]==0xBD))
&& (!pesptr))
{
if (!pes2audioes)
@@ -48,7 +77,7 @@ int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, in
}
if (pes2audioes)
{
- pesptr=pespkt;
+ pesptr=pkt;
}
else
{
@@ -61,9 +90,9 @@ int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, in
if (len==-1) len=0;
uchar *esdata;
int essize;
- while (peslen>0)
+ while (pktlen>0)
{
- int len2=pes2audioes->Process(pesptr,peslen,&esdata,&essize);
+ int len2=pes2audioes->Process(pesptr,pktlen,&esdata,&essize);
if (len2<0)
{
break;
@@ -76,8 +105,8 @@ int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, in
*PktLen=essize;
}
pesptr+=len2;
- peslen-=len2;
- if (!peslen) pesptr=NULL;
+ pktlen-=len2;
+ if (!pktlen) pesptr=NULL;
break;
}
}
@@ -85,10 +114,10 @@ int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, in
}
else
{
- *Pkt=pespkt;
- *PktLen=peslen;
- pespkt=pesptr=NULL;
- peslen=0;
+ *Pkt=pkt;
+ *PktLen=pktlen;
+ pkt=pesptr=NULL;
+ pktlen=0;
}
}
return len;