diff options
author | Jochen Dolze <vdr@dolze.de> | 2009-10-03 23:49:07 +0200 |
---|---|---|
committer | Jochen Dolze <vdr@dolze.de> | 2009-10-03 23:49:07 +0200 |
commit | c69708374c62615009e2b92783dcea696166470e (patch) | |
tree | 8fc6a20869db4d52998e3bd0e0765126571f2bf2 | |
parent | 52cd041405849817c72d272bee0e6798f57b66c4 (diff) | |
download | vdr-plugin-markad-c69708374c62615009e2b92783dcea696166470e.tar.gz vdr-plugin-markad-c69708374c62615009e2b92783dcea696166470e.tar.bz2 |
Added packet throttle in demux
-rw-r--r-- | demux.cpp | 61 | ||||
-rw-r--r-- | demux.h | 7 | ||||
-rw-r--r-- | markad-standalone.cpp | 7 | ||||
-rw-r--r-- | tools.cpp | 2 | ||||
-rw-r--r-- | ts2pkt.h | 2 |
5 files changed, 54 insertions, 25 deletions
@@ -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; } @@ -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; @@ -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; @@ -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); }; |