summaryrefslogtreecommitdiff
path: root/markad-standalone.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'markad-standalone.cpp')
-rw-r--r--markad-standalone.cpp121
1 files changed, 74 insertions, 47 deletions
diff --git a/markad-standalone.cpp b/markad-standalone.cpp
index 53b400f..94c0d22 100644
--- a/markad-standalone.cpp
+++ b/markad-standalone.cpp
@@ -8,6 +8,8 @@
#include "markad-standalone.h"
+cMarkAdStandalone *cmasta=NULL;
+
void syslog_with_tid(int priority, const char *format, ...)
{
va_list ap;
@@ -57,7 +59,7 @@ bool cMarkAdStandalone::ProcessFile(const char *Directory, int Number)
while ((dataread=read(f,data,datalen))>0)
{
-
+ if (abort) break;
MarkAdMark *mark;
if (common)
@@ -172,13 +174,19 @@ bool cMarkAdStandalone::ProcessFile(const char *Directory, int Number)
void cMarkAdStandalone::Process(const char *Directory)
{
+ if (abort) return;
for (int i=1; i<=MaxFiles; i++)
{
+ if (abort) break;
if (!ProcessFile(Directory,i))
{
break;
}
}
+ if (abort)
+ {
+ isyslog("markad [%i]: aborted",recvnumber);
+ }
}
bool cMarkAdStandalone::CheckTS(const char *Directory)
@@ -216,60 +224,59 @@ bool cMarkAdStandalone::CheckTS(const char *Directory)
return true;
}
-void cMarkAdStandalone::CheckPATPMT(const char *Directory)
+bool cMarkAdStandalone::CheckPATPMT(const char *Directory)
{
char *buf;
- if (asprintf(&buf,"%s/00001.ts",Directory)==-1) return;
+ if (asprintf(&buf,"%s/00001.ts",Directory)==-1) return false;
int fd=open(buf,O_RDONLY);
free(buf);
- if (fd==-1) return;
+ if (fd==-1) return false;
uchar patpmt[376];
if (read(fd,patpmt,sizeof(patpmt))!=sizeof(patpmt))
{
close(fd);
- return;
+ return false;
}
close(fd);
// some checks
- if ((patpmt[0]!=0x47) || (patpmt[188]!=0x47)) return; // no TS-Sync
- if (((patpmt[1] & 0x5F)!=0x40) && (patpmt[2]!=0)) return; // no PAT
- if ((patpmt[3] & 0x10)!=0x10) return; // PAT not without AFC
- if ((patpmt[191] & 0x10)!=0x10) return; // PMT not without AFC
+ if ((patpmt[0]!=0x47) || (patpmt[188]!=0x47)) return false; // no TS-Sync
+ if (((patpmt[1] & 0x5F)!=0x40) && (patpmt[2]!=0)) return false; // no PAT
+ if ((patpmt[3] & 0x10)!=0x10) return false; // PAT not without AFC
+ if ((patpmt[191] & 0x10)!=0x10) return false; // PMT not without AFC
struct PAT *pat = (struct PAT *) &patpmt[5];
// more checks
- if (pat->reserved1!=3) return; // is always 11
- if (pat->reserved3!=7) return; // is always 111
+ if (pat->reserved1!=3) return false; // is always 11
+ if (pat->reserved3!=7) return false; // is always 111
int pid=pat->pid_L+(pat->pid_H<<8);
int pmtpid=((patpmt[189] & 0x1f)<<8)+patpmt[190];
- if (pid!=pmtpid) return; // pid in PAT differs from pid in PMT
+ if (pid!=pmtpid) return false; // pid in PAT differs from pid in PMT
struct PMT *pmt = (struct PMT *) &patpmt[193];
// still more checks
- if (pmt->reserved1!=3) return; // is always 11
- if (pmt->reserved2!=3) return; // is always 11
- if (pmt->reserved3!=7) return; // is always 111
- if (pmt->reserved4!=15) return; // is always 1111
+ if (pmt->reserved1!=3) return false; // is always 11
+ if (pmt->reserved2!=3) return false; // is always 11
+ if (pmt->reserved3!=7) return false; // is always 111
+ if (pmt->reserved4!=15) return false; // is always 1111
if ((pmt->program_number_H!=pat->program_number_H) ||
- (pmt->program_number_L!=pat->program_number_L)) return;
+ (pmt->program_number_L!=pat->program_number_L)) return false;
int desc_len=(pmt->program_info_length_H<<8)+pmt->program_info_length_L;
- if (desc_len>166) return; // beyond patpmt buffer
+ if (desc_len>166) return false; // beyond patpmt buffer
int section_end = 196+(pmt->section_length_H<<8)+pmt->section_length_L;
section_end-=4; // we don't care about the CRC32
- if (section_end>376) return; //beyond patpmt buffer
+ if (section_end>376) return false; //beyond patpmt buffer
int i=205+desc_len;
-
while (i<section_end)
{
struct ES_DESCRIPTOR *es=NULL;
@@ -281,8 +288,8 @@ void cMarkAdStandalone::CheckPATPMT(const char *Directory)
}
// oh no -> more checks!
- if (si->reserved1!=7) return;
- if (si->reserved2!=15) return;
+ if (si->reserved1!=7) return false;
+ if (si->reserved2!=15) return false;
int pid=(si->PID_H<<8)+si->PID_L;
@@ -318,12 +325,13 @@ void cMarkAdStandalone::CheckPATPMT(const char *Directory)
i+=(sizeof(struct STREAMINFO)+esinfo_len);
}
- return;
+ return true;
}
cMarkAdStandalone::cMarkAdStandalone(const char *Directory)
{
recvnumber=255;
+ abort=false;
memset(&macontext,0,sizeof(macontext));
macontext.General.StartTime=0;
@@ -345,12 +353,15 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory)
if (isTS)
{
- CheckPATPMT(Directory);
+ if (!CheckPATPMT(Directory))
+ {
+ esyslog("markad [%i]: no PAT/PMT found -> nothing to process",recvnumber);
+ abort=true;
+ }
macontext.General.APid.Num=0;
}
else
{
- macontext.General.APid.Num=0;
macontext.General.DPid.Num=-1;
macontext.General.VPid.Num=-1;
macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H262;
@@ -369,7 +380,7 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory)
if (macontext.General.APid.Num)
{
- dsyslog("markad [%i]: using mp2 (0x%04x)",recvnumber,macontext.General.APid.Num);
+ dsyslog("markad [%i]: using MP2 (0x%04x)",recvnumber,macontext.General.APid.Num);
mp2_demux = new cMarkAdDemux(recvnumber);
}
else
@@ -379,7 +390,7 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory)
if (macontext.General.DPid.Num)
{
- dsyslog("markad [%i]: using ac3 (0x%04x)",recvnumber,macontext.General.DPid.Num);
+ dsyslog("markad [%i]: using AC3 (0x%04x)",recvnumber,macontext.General.DPid.Num);
ac3_demux = new cMarkAdDemux(recvnumber);
}
else
@@ -451,6 +462,21 @@ int usage()
return -1;
}
+void signal_handler(int sig)
+{
+ if (sig==SIGUSR1)
+ {
+ // TODO: what we are supposed to do?
+ }
+ else
+ {
+ if (cmasta)
+ {
+ cmasta->SetAbort();
+ }
+ }
+}
+
int main(int argc, char *argv[])
{
int c;
@@ -518,14 +544,17 @@ int main(int argc, char *argv[])
break;
case 'O':
-// osdMsg = 1;
+ // --OSD
+ break;
+
+ case 'o':
+ // --overlap
break;
case 's':
case 'l':
case 'c':
case 'j':
- case 'o':
case 'a':
case 'S':
case 'B':
@@ -552,9 +581,10 @@ int main(int argc, char *argv[])
//setMarkfileName(optarg); // TODO: implement this
break;
- case 2: // --verbose
- //if (isnumber(optarg))
- // verbosity = atoi(optarg);
+ case 2: // --loglevel
+ SysLogLevel=atoi(optarg);
+ if (SysLogLevel>10) SysLogLevel=10;
+ if (SysLogLevel<0) SysLogLevel=2;
break;
case 3: // --testmode
@@ -717,15 +747,6 @@ int main(int argc, char *argv[])
}
}
- // catch some signals
- /*
- signal(SIGINT, signal_handler);
- signal(SIGTERM, signal_handler);
- signal(SIGABRT, signal_handler);
- signal(SIGSEGV, signal_handler);
- signal(SIGUSR1, signal_handler);
- */
-
// now do the work...
struct stat statbuf;
if (stat(recDir,&statbuf)==-1)
@@ -740,13 +761,19 @@ int main(int argc, char *argv[])
return -1;
}
- cMarkAdStandalone *cmasta = new cMarkAdStandalone(recDir);
- if (cmasta)
- {
- cmasta->Process(recDir);
- delete cmasta;
- }
+ cmasta = new cMarkAdStandalone(recDir);
+ if (!cmasta) return -1;
+
+ // ignore some signals
+ signal(SIGHUP, SIG_IGN);
+
+ // catch some signals
+ signal(SIGINT, signal_handler);
+ signal(SIGTERM, signal_handler);
+ signal(SIGUSR1, signal_handler);
+ cmasta->Process(recDir);
+ delete cmasta;
return 0;
}