From c69708374c62615009e2b92783dcea696166470e Mon Sep 17 00:00:00 2001 From: Jochen Dolze Date: Sat, 3 Oct 2009 23:49:07 +0200 Subject: Added packet throttle in demux --- demux.cpp | 61 ++++++++++++++++++++++++++++++++++++--------------- demux.h | 7 ++++++ markad-standalone.cpp | 7 ++---- tools.cpp | 2 +- ts2pkt.h | 2 +- 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()Get(&inlen); } - else - { - queue->Put(Data,Count); - retval=Count; - } - if (queue->Length()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 +#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); }; -- cgit v1.2.3