summaryrefslogtreecommitdiff
path: root/ts2pkt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ts2pkt.cpp')
-rw-r--r--ts2pkt.cpp47
1 files changed, 42 insertions, 5 deletions
diff --git a/ts2pkt.cpp b/ts2pkt.cpp
index ad26ebe..dc624ee 100644
--- a/ts2pkt.cpp
+++ b/ts2pkt.cpp
@@ -24,8 +24,8 @@ void cMarkAdTS2Pkt::Reset(int ErrIndex)
{
switch (ErrIndex)
{
- case MA_ERR_TOSMALL:
- dsyslog("markad [%i]: input to small",recvnumber);
+ case MA_ERR_TSSIZE:
+ dsyslog("markad [%i]: inbuf not 188 bytes",recvnumber);
break;
case MA_ERR_NOSYNC:
dsyslog("markad [%i]: found no sync",recvnumber);
@@ -37,16 +37,53 @@ void cMarkAdTS2Pkt::Reset(int ErrIndex)
dsyslog("markad [%i]: wrong AFC value",recvnumber);
break;
case MA_ERR_TOBIG:
- dsyslog("markad [%i]: buflen > 188",recvnumber);
+ dsyslog("markad [%i]: buflen > 188 bytes",recvnumber);
break;
case MA_ERR_NEG:
- dsyslog("markad [%i]: buflen < 0",recvnumber);
+ dsyslog("markad [%i]: buflen negative",recvnumber);
break;
}
counter=-1;
if (queue) queue->Clear();
}
+bool cMarkAdTS2Pkt::InjectVideoPES(uchar *PESData, int PESSize)
+{
+ if ((!PESData) || (!PESSize)) return false;
+
+ struct PESHDR *peshdr=(struct PESHDR *) PESData;
+
+ // first check some simple things
+ if ((peshdr->Sync1!=0) && (peshdr->Sync2!=0) && (peshdr->Sync3!=1)) return false;
+ if ((peshdr->StreamID & 0xF0)!=0xE0) return false;
+
+ int Length=(peshdr->LenH<<8)+peshdr->LenL;
+ if (Length) Length+=sizeof(PESHDR);
+ if (Length!=PESSize) return false;
+
+ struct PESHDROPT *peshdropt=(struct PESHDROPT *) &PESData[sizeof(struct PESHDR)];
+
+ uchar *buf;
+ int buflen;
+
+ if (peshdropt->MarkerBits==0x2)
+ {
+ // we have an optional PES header
+ int bpos=sizeof(struct PESHDR)+sizeof(struct PESHDROPT)+
+ peshdropt->Length;
+ buf=&PESData[bpos];
+ buflen=PESSize-bpos;
+ }
+ else
+ {
+ int bpos=sizeof(struct PESHDR);
+ buf=&PESData[bpos];
+ buflen=PESSize-bpos;
+ }
+ queue->Inject(buf,buflen);
+ return true;
+}
+
void cMarkAdTS2Pkt::Process(MarkAdPid Pid, uchar *TSData, int TSSize, uchar **PktData, int *PktSize)
{
if ((!PktData) || (!PktSize) || (!queue)) return;
@@ -57,7 +94,7 @@ void cMarkAdTS2Pkt::Process(MarkAdPid Pid, uchar *TSData, int TSSize, uchar **Pk
{
if (TSSize!=TS_SIZE)
{
- Reset(MA_ERR_TOSMALL);
+ Reset(MA_ERR_TSSIZE);
return; // we need a full packet
}