summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demux.cpp12
-rw-r--r--markad-standalone.cpp42
-rw-r--r--markad-standalone.h1
-rw-r--r--pes2es.cpp5
-rw-r--r--recv.cpp4
-rw-r--r--vdr2pkt.cpp2
6 files changed, 61 insertions, 5 deletions
diff --git a/demux.cpp b/demux.cpp
index fbe07de..672e046 100644
--- a/demux.cpp
+++ b/demux.cpp
@@ -52,7 +52,17 @@ 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",65536);
+ if (!pes2videoes)
+ {
+ if (Pid.Type==MARKAD_PIDTYPE_VIDEO_H264)
+ {
+ pes2videoes=new cMarkAdPES2ES(recvnumber,"PES2H264ES video",393216);
+ }
+ else
+ {
+ pes2videoes=new cMarkAdPES2ES(recvnumber,"PES2ES video",65536);
+ }
+ }
if (!pes2videoes) return;
pes2videoes->Process(Pid,pkt,pktlen,Pkt,PktLen);
}
diff --git a/markad-standalone.cpp b/markad-standalone.cpp
index 5925097..1453993 100644
--- a/markad-standalone.cpp
+++ b/markad-standalone.cpp
@@ -425,6 +425,37 @@ bool cMarkAdStandalone::CheckTS(const char *Directory)
return true;
}
+bool cMarkAdStandalone::CheckVDRHD(const char *Directory)
+{
+ char *buf;
+ if (asprintf(&buf,"%s/001.vdr",Directory)==-1) return false;
+
+ int fd=open(buf,O_RDONLY);
+ free(buf);
+ if (fd==-1) return false;
+
+ uchar pes_buf[32];
+ if (read(fd,pes_buf,sizeof(pes_buf))!=sizeof(pes_buf))
+ {
+ close(fd);
+ return false;
+ }
+ close(fd);
+
+ if ((pes_buf[0]==0) && (pes_buf[1]==0) && (pes_buf[2]==1) && ((pes_buf[3] & 0xF0)==0xE0))
+ {
+ int payloadstart=9+pes_buf[8];
+ if (payloadstart>23) return false;
+ uchar *start=&pes_buf[payloadstart];
+ if ((start[0]==0) && (start[1]==0) && (start[2]==1) && (start[5]==0) && (start[6]==0)
+ && (start[7]==0) && (start[8]==1))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
bool cMarkAdStandalone::CheckPATPMT(const char *Directory)
{
char *buf;
@@ -604,7 +635,16 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory)
macontext.General.APid.Num=-1;
macontext.General.DPid.Num=-1;
macontext.General.VPid.Num=-1;
- macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H262;
+
+ if (CheckVDRHD(Directory))
+ {
+ macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H264;
+ }
+ else
+ {
+ macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H262;
+ }
+
if (!markFileName[0]) strcpy(markFileName,"marks.vdr");
}
diff --git a/markad-standalone.h b/markad-standalone.h
index 8edf655..2846fe5 100644
--- a/markad-standalone.h
+++ b/markad-standalone.h
@@ -164,6 +164,7 @@ unsigned Descriptor_Length:
char *IndexToHMSF(int Index);
void AddMark(MarkAdMark *Mark);
+ bool CheckVDRHD(const char *Directory);
bool CheckPATPMT(const char *Directory);
bool CheckTS(const char *Directory);
bool LoadInfo(const char *Directory);
diff --git a/pes2es.cpp b/pes2es.cpp
index 724cfea..ed05d19 100644
--- a/pes2es.cpp
+++ b/pes2es.cpp
@@ -55,10 +55,13 @@ void cMarkAdPES2ES::Process(MarkAdPid Pid, uchar *PESData, int PESSize, uchar **
switch (Pid.Type)
{
case MARKAD_PIDTYPE_VIDEO_H262:
- case MARKAD_PIDTYPE_VIDEO_H264:
if ((peshdr->StreamID & 0xF0)!=0xE0) return;
type=MA_PACKET_PKT;
break;
+ case MARKAD_PIDTYPE_VIDEO_H264:
+ if ((peshdr->StreamID & 0xF0)!=0xE0) return;
+ type=MA_PACKET_H264;
+ break;
case MARKAD_PIDTYPE_AUDIO_AC3:
if (peshdr->StreamID!=0xBD) return;
type=MA_PACKET_AC3;
diff --git a/recv.cpp b/recv.cpp
index a7e99b5..e6e1efe 100644
--- a/recv.cpp
+++ b/recv.cpp
@@ -58,7 +58,9 @@ cMarkAdReceiver::cMarkAdReceiver(int RecvNumber, const char *Filename, cTimer *T
#if APIVERSNUM < 10700
macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H262;
#else
-#error "VDR-1.7.0 is not supported"
+#error "VDR-1.7.0 is still unsupported"
+#error "in plugin version, please use"
+#error "standalone version: make markad"
#endif
#endif
diff --git a/vdr2pkt.cpp b/vdr2pkt.cpp
index 1a42fd7..4703bce 100644
--- a/vdr2pkt.cpp
+++ b/vdr2pkt.cpp
@@ -15,7 +15,7 @@ cMarkAdVDR2Pkt::cMarkAdVDR2Pkt(int RecvNumber, const char *QueueName, int QueueS
cMarkAdVDR2Pkt::~cMarkAdVDR2Pkt()
{
-if (queue) delete queue;
+ if (queue) delete queue;
}
void cMarkAdVDR2Pkt::Process(MarkAdPid Pid, uchar *VDRData, int VDRSize, uchar **PktData, int *PktSize)