summaryrefslogtreecommitdiff
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
parent52cd041405849817c72d272bee0e6798f57b66c4 (diff)
downloadvdr-plugin-markad-c69708374c62615009e2b92783dcea696166470e.tar.gz
vdr-plugin-markad-c69708374c62615009e2b92783dcea696166470e.tar.bz2
Added packet throttle in demux
-rw-r--r--demux.cpp61
-rw-r--r--demux.h7
-rw-r--r--markad-standalone.cpp7
-rw-r--r--tools.cpp2
-rw-r--r--ts2pkt.h2
5 files changed, 54 insertions, 25 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;
}
diff --git a/demux.h b/demux.h
index ed11e6c..75c3b59 100644
--- a/demux.h
+++ b/demux.h
@@ -23,6 +23,10 @@
#include "ts2pkt.h"
#include "pes2es.h"
+#if 1
+#include <unistd.h>
+#endif
+
class cMarkAdDemux
{
private:
@@ -33,6 +37,9 @@ private:
cMarkAdPES2ES *pes2videoes;
cMarkAdPaketQueue *queue;
+ bool pause;
+ int pause_retval;
+
void ProcessTS(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, int *PktLen);
void ProcessVDR(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, int *PktLen);
public:
diff --git a/markad-standalone.cpp b/markad-standalone.cpp
index 2a8001e..53b400f 100644
--- a/markad-standalone.cpp
+++ b/markad-standalone.cpp
@@ -306,10 +306,6 @@ void cMarkAdStandalone::CheckPATPMT(const char *Directory)
{
if (es->Descriptor_Tag==0x6A) macontext.General.DPid.Num=pid;
}
- else
- {
- macontext.General.DPid.Num=pid;
- }
break;
case 0x1b:
@@ -350,10 +346,11 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory)
if (isTS)
{
CheckPATPMT(Directory);
+ macontext.General.APid.Num=0;
}
else
{
- //macontext.General.APid.Num=-1;
+ macontext.General.APid.Num=0;
macontext.General.DPid.Num=-1;
macontext.General.VPid.Num=-1;
macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H262;
diff --git a/tools.cpp b/tools.cpp
index 04d7e2c..6828216 100644
--- a/tools.cpp
+++ b/tools.cpp
@@ -317,7 +317,7 @@ uchar *cMarkAdPaketQueue::GetPacket(int *Size, int Type)
outptr=pkthdr;
int bytesleft=inptr-outptr;
- if (pktinfo.pkthdr>(8192+bytesleft))
+ if (pktinfo.pkthdr>(4096+bytesleft))
{
memcpy(buffer,&buffer[pkthdr],bytesleft);
inptr=bytesleft;
diff --git a/ts2pkt.h b/ts2pkt.h
index cd8d19d..3d4e49a 100644
--- a/ts2pkt.h
+++ b/ts2pkt.h
@@ -72,7 +72,7 @@ unsigned Flags:
#define MA_ERR_NEG 6
void Reset(int ErrIndex=MA_ERR_STARTUP);
public:
- cMarkAdTS2Pkt(int RecvNumber, const char *QueueName="TS2Pkt", int QueueSize=262144);
+ cMarkAdTS2Pkt(int RecvNumber, const char *QueueName="TS2Pkt", int QueueSize=32768);
~cMarkAdTS2Pkt();
void Process(MarkAdPid Pid,uchar *TSData, int TSSize, uchar **PktData, int *PktSize);
};