diff options
author | Jochen Dolze <vdr@dolze.de> | 2010-09-16 21:37:36 +0200 |
---|---|---|
committer | Jochen Dolze <vdr@dolze.de> | 2010-09-16 21:37:36 +0200 |
commit | 57df9917d4626d93323c7b0d2368fbf5d4748627 (patch) | |
tree | ebfe76fe280db47e223335266eab1bd34afa4226 /command/demux.cpp | |
parent | 03fc6351fce571b5ff7454bdfad9d4a0f0fb7679 (diff) | |
download | vdr-plugin-markad-57df9917d4626d93323c7b0d2368fbf5d4748627.tar.gz vdr-plugin-markad-57df9917d4626d93323c7b0d2368fbf5d4748627.tar.bz2 |
Added second pass processing (overlap, audio silence detection)
Diffstat (limited to 'command/demux.cpp')
-rw-r--r-- | command/demux.cpp | 101 |
1 files changed, 63 insertions, 38 deletions
diff --git a/command/demux.cpp b/command/demux.cpp index 23bd78e..91a5a54 100644 --- a/command/demux.cpp +++ b/command/demux.cpp @@ -7,6 +7,8 @@ #include "demux.h" +#include <string.h> + cMarkAdDemux::cMarkAdDemux() { ts2pkt=NULL; @@ -39,17 +41,15 @@ void cMarkAdDemux::Clear() skip=0; } -void cMarkAdDemux::ProcessVDR(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, int *PktLen) +void cMarkAdDemux::ProcessVDR(MarkAdPid Pid, uchar *Data, int Count, MarkAdPacket *Pkt) { - if ((!Pkt) || (!PktLen)) return; - *Pkt=NULL; - *PktLen=0; + if (!Pkt) return; if ((Pid.Type==MARKAD_PIDTYPE_AUDIO_AC3) || (Pid.Type==MARKAD_PIDTYPE_AUDIO_MP2)) { if (!pes2audioes) pes2audioes=new cMarkAdPES2ES("PES2ES audio"); if (!pes2audioes) return; - pes2audioes->Process(Pid,Data,Count,Pkt,PktLen); + pes2audioes->Process(Pid,Data,Count,Pkt); } if ((Pid.Type==MARKAD_PIDTYPE_VIDEO_H262) || (Pid.Type==MARKAD_PIDTYPE_VIDEO_H264)) @@ -66,20 +66,48 @@ void cMarkAdDemux::ProcessVDR(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt } } if (!pes2videoes) return; - pes2videoes->Process(Pid,Data,Count,Pkt,PktLen); + pes2videoes->Process(Pid,Data,Count,Pkt); } return; } -void cMarkAdDemux::ProcessTS(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, int *PktLen) +void cMarkAdDemux::GetVideoPTS(uchar *Data, int Count, unsigned int *Timestamp) { - if ((!Pkt) || (!PktLen)) return; - *Pkt=NULL; - *PktLen=0; + if (!Data) return; + if (Count<=0) return; + if (!Timestamp) return; + struct PESHDR *peshdr=(struct PESHDR *) Data; + + if ((peshdr->Sync1!=0) && (peshdr->Sync2!=0) && (peshdr->Sync3!=1)) return; + if ((peshdr->StreamID & 0xF0)!=0xE0) return; + + struct PESHDROPT *peshdropt=(struct PESHDROPT *) &Data[sizeof(struct PESHDR)]; + if (peshdropt->MarkerBits!=0x2) return; - uchar *pkt; - int pktlen; + if (peshdropt->PTSDTS<2) return; + + struct PESHDROPTPTS *peshdroptpts=(struct PESHDROPTPTS *) &Data[sizeof(struct PESHDR)+ + sizeof(struct PESHDROPT)]; + + if (peshdroptpts->Marker1 && peshdroptpts->Marker2 && + peshdroptpts->Marker3) +{ + unsigned int pts=0; + pts|=((peshdroptpts->PTS29_15_H<<7|peshdroptpts->PTS29_15_L)<<15); + pts|=(peshdroptpts->PTS14_0_H<<7|peshdroptpts->PTS14_0_L); + pts|=(peshdroptpts->PTS32_30<<30); + *Timestamp=pts; + } + return; +} + +void cMarkAdDemux::ProcessTS(MarkAdPid Pid, uchar *Data, int Count, MarkAdPacket *Pkt) +{ + if (!Pkt) return; + + MarkAdPacket pkt; + memset(&pkt,0,sizeof(pkt)); if (!ts2pkt) { @@ -94,31 +122,31 @@ void cMarkAdDemux::ProcessTS(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, } if (!ts2pkt) return; - ts2pkt->Process(Pid,Data,Count,&pkt,&pktlen); + if (!ts2pkt->Process(Pid,Data,Count,&pkt)) + { + if (pes2audioes) pes2audioes->Clear(); + return; + } if ((Pid.Type==MARKAD_PIDTYPE_AUDIO_AC3) || (Pid.Type==MARKAD_PIDTYPE_AUDIO_MP2)) { if (!pes2audioes) pes2audioes=new cMarkAdPES2ES("PES2ES audio"); if (!pes2audioes) return; - pes2audioes->Process(Pid,pkt,pktlen,Pkt,PktLen); + pes2audioes->Process(Pid,pkt.Data,pkt.Length,Pkt); } if ((Pid.Type==MARKAD_PIDTYPE_VIDEO_H262) || (Pid.Type==MARKAD_PIDTYPE_VIDEO_H264)) { - if ((pkt) && ((pkt[3] & 0xF0)==0xE0) && (pkt[4]!=0) && (pkt[5]!=0)) + GetVideoPTS(pkt.Data,pkt.Length,&Pkt->Timestamp); + if ((pkt.Data) && ((pkt.Data[3] & 0xF0)==0xE0) && (pkt.Data[4]!=0) && (pkt.Data[5]!=0)) { - ts2pkt->InjectVideoPES(pkt,pktlen); - pkt=NULL; - pktlen=0; + ts2pkt->InjectVideoPES(pkt.Data,pkt.Length); + pkt.Data=NULL; + pkt.Length=0; } + Pkt->Data=pkt.Data; + Pkt->Length=pkt.Length; } - - if ((pkt) && (!*Pkt)) - { - *Pkt=pkt; - *PktLen=pktlen; - } - return; } @@ -171,32 +199,29 @@ int cMarkAdDemux::GetMinNeeded(MarkAdPid Pid, uchar *Data, int Count, bool *Offc } } -int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, int *PktLen, bool *Offcnt) +int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, MarkAdPacket *Pkt) { - if ((!Data) && (!Count) && (!Pkt) || (!PktLen)) return -1; - - *Pkt=NULL; - *PktLen=0; + if ((!Data) && (!Count) && (!Pkt)) return -1; uchar *in=NULL; int inlen=0; int retval=0; - if (Offcnt) *Offcnt=false; - if (!pause) { + memset(Pkt,0,sizeof(MarkAdPacket)); + if (!min_needed) { if (skip) { int t_skip=skip; skip=0; - if (Offcnt) *Offcnt=true; + Pkt->Offcnt=true; return t_skip; } - int t_min_needed=GetMinNeeded(Pid,Data,Count,Offcnt); + int t_min_needed=GetMinNeeded(Pid,Data,Count,&Pkt->Offcnt); if (t_min_needed==0) { return -1; @@ -236,14 +261,14 @@ int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, in if (Pid.Num>=0) { - ProcessTS(Pid, in, inlen, Pkt, PktLen); + ProcessTS(Pid, in, inlen, Pkt); } else { - ProcessVDR(Pid, in, inlen, Pkt, PktLen); + ProcessVDR(Pid, in, inlen, Pkt); } - if (*Pkt) + if (Pkt->Data) { if (!pause_retval) pause_retval=retval; pause=true; @@ -260,6 +285,6 @@ int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, in pause=false; } - if (Offcnt) *Offcnt=true; + Pkt->Offcnt=true; return retval; } |