summaryrefslogtreecommitdiff
path: root/demux.cpp
diff options
context:
space:
mode:
authorJochen Dolze <vdr@dolze.de>2009-10-03 23:49:07 +0200
committerJochen Dolze <vdr@dolze.de>2009-10-03 23:49:07 +0200
commitc69708374c62615009e2b92783dcea696166470e (patch)
tree8fc6a20869db4d52998e3bd0e0765126571f2bf2 /demux.cpp
parent52cd041405849817c72d272bee0e6798f57b66c4 (diff)
downloadvdr-plugin-markad-c69708374c62615009e2b92783dcea696166470e.tar.gz
vdr-plugin-markad-c69708374c62615009e2b92783dcea696166470e.tar.bz2
Added packet throttle in demux
Diffstat (limited to 'demux.cpp')
-rw-r--r--demux.cpp61
1 files changed, 43 insertions, 18 deletions
diff --git a/demux.cpp b/demux.cpp
index c36508f..9c28c34 100644
--- a/demux.cpp
+++ b/demux.cpp
@@ -15,7 +15,9 @@ cMarkAdDemux::cMarkAdDemux(int RecvNumber)
vdr2pkt=NULL;
pes2audioes=NULL;
pes2videoes=NULL;
- queue = new cMarkAdPaketQueue(RecvNumber,"Demux");
+ pause=false;
+ pause_retval=0;
+ queue = new cMarkAdPaketQueue(RecvNumber,"Demux",376);
}
cMarkAdDemux::~cMarkAdDemux()
@@ -51,7 +53,7 @@ void cMarkAdDemux::ProcessVDR(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt
if ((Pid.Type==MARKAD_PIDTYPE_VIDEO_H262) || (Pid.Type==MARKAD_PIDTYPE_VIDEO_H264))
{
- if (!pes2videoes) pes2videoes=new cMarkAdPES2ES(recvnumber,"PES2ES video",262144);
+ if (!pes2videoes) pes2videoes=new cMarkAdPES2ES(recvnumber,"PES2ES video",65536);
if (!pes2videoes) return;
pes2videoes->Process(Pid,pkt,pktlen,Pkt,PktLen);
return;
@@ -68,7 +70,7 @@ void cMarkAdDemux::ProcessTS(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt,
uchar *pkt;
int pktlen;
- if (!ts2pkt) ts2pkt=new cMarkAdTS2Pkt(recvnumber);
+ if (!ts2pkt) ts2pkt=new cMarkAdTS2Pkt(recvnumber,"TS2PES",262144);
if (!ts2pkt) return;
ts2pkt->Process(Pid,Data,Count,&pkt,&pktlen);
@@ -96,25 +98,30 @@ int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, in
*Pkt=NULL;
*PktLen=0;
+ uchar *in=NULL;
+ int inlen=0;
int retval;
- int min_needed=TS_SIZE;
- int needed=min_needed-queue->Length();
- if (Count>needed)
+ if (!pause)
{
- queue->Put(Data,needed);
- retval=needed;
+ int min_needed=TS_SIZE;
+
+ int needed=min_needed-queue->Length();
+ if (Count>needed)
+ {
+ queue->Put(Data,needed);
+ retval=needed;
+ }
+ else
+ {
+ queue->Put(Data,Count);
+ retval=Count;
+ }
+ if (queue->Length()<min_needed) return Count;
+
+ inlen=TS_SIZE;
+ in=queue->Get(&inlen);
}
- else
- {
- queue->Put(Data,Count);
- retval=Count;
- }
- if (queue->Length()<min_needed) return Count;
-
- uchar *in;
- int inlen=TS_SIZE;
- in=queue->Get(&inlen);
if (Pid.Num>=0)
{
@@ -124,5 +131,23 @@ int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, in
{
ProcessVDR(Pid, in, inlen, Pkt, PktLen);
}
+
+ if (*Pkt)
+ {
+ if (!pause_retval) pause_retval=retval;
+ pause=true;
+ return 0;
+ }
+
+ if (pause)
+ {
+ if (pause_retval)
+ {
+ retval=pause_retval;
+ pause_retval=0;
+ }
+ pause=false;
+ }
+
return retval;
}