diff options
-rw-r--r-- | command/global.h | 3 | ||||
-rw-r--r-- | command/markad-standalone.cpp | 364 | ||||
-rw-r--r-- | command/marks.cpp | 22 | ||||
-rw-r--r-- | command/marks.h | 1 | ||||
-rw-r--r-- | command/video.cpp | 38 | ||||
-rw-r--r-- | command/video.h | 2 | ||||
-rw-r--r-- | plugin/markad.cpp | 12 | ||||
-rw-r--r-- | plugin/po/de_DE.po | 5 | ||||
-rw-r--r-- | plugin/po/it_IT.po | 5 | ||||
-rw-r--r-- | plugin/setup.cpp | 6 | ||||
-rw-r--r-- | plugin/setup.h | 2 | ||||
-rw-r--r-- | plugin/status.cpp | 7 |
12 files changed, 387 insertions, 80 deletions
diff --git a/command/global.h b/command/global.h index 1034ded..b1b2748 100644 --- a/command/global.h +++ b/command/global.h @@ -25,6 +25,8 @@ typedef unsigned char uchar; #define MT_COMMON 0x10 #define MT_ASPECTCHANGE 0x20 +#define MT_ASPECTSTART 0x21 +#define MT_ASPECTSTOP 0x22 #define MT_CHANNELCHANGE 0x30 #define MT_CHANNELSTART 0x30 @@ -83,6 +85,7 @@ typedef struct MarkAdContext { int Length; // in Minutes char *ChannelID; + MarkAdAspectRatio AspectRatio; MarkAdPid VPid; MarkAdPid APid; MarkAdPid DPid; diff --git a/command/markad-standalone.cpp b/command/markad-standalone.cpp index ce1ffd9..e170bfe 100644 --- a/command/markad-standalone.cpp +++ b/command/markad-standalone.cpp @@ -141,6 +141,14 @@ void cMarkAdStandalone::AddStartMark() isyslog(buf); free(buf); } + + if (tStop) + { + int tmp=tStart+macontext.Info.Length; + tStop=tmp*macontext.Video.Info.FramesPerSecond; + } + if (tStart) tStart*=macontext.Video.Info.FramesPerSecond; + dsyslog("tStart=%i tStop=%i",tStart,tStop); } bool cMarkAdStandalone::CheckFirstMark() @@ -152,7 +160,7 @@ bool cMarkAdStandalone::CheckFirstMark() if (!second) return false; if ((second->type==MT_LOGOSTART) || (second->type==MT_BORDERSTART) || - (second->type==MT_CHANNELSTART)) + (second->type==MT_CHANNELSTART) || (second->type==MT_ASPECTSTART)) { clMark *first=marks.Get(0); if (first) marks.Del(first); @@ -160,19 +168,21 @@ bool cMarkAdStandalone::CheckFirstMark() } if ((second->type==MT_LOGOSTOP) || (second->type==MT_BORDERSTOP) || - (second->type==MT_CHANNELSTOP)) + (second->type==MT_CHANNELSTOP) || (second->type==MT_ASPECTSTOP)) { marksAligned=true; } // If we have an aspectchange, check the next aspectchange mark // and the difference between - if ((second->type==MT_ASPECTCHANGE) && (macontext.Video.Info.FramesPerSecond>0)) + if ((second->type==MT_ASPECTCHANGE) && (macontext.Info.Length)) { clMark *next=marks.GetNext(second->position,MT_ASPECTCHANGE); if (next) { - int MAXPOSDIFF=(int) (macontext.Video.Info.FramesPerSecond*60*13); + int maxlen=macontext.Info.Length*(13*60)/(90*60); // max 13 minutes ads on 90 minutes program + if (maxlen>(13*60)) maxlen=(13*60); // maximum ad block = 13 minutes + int MAXPOSDIFF=(int) (macontext.Video.Info.FramesPerSecond*maxlen); if ((next->position-second->position)>MAXPOSDIFF) { clMark *first=marks.Get(0); @@ -193,25 +203,42 @@ void cMarkAdStandalone::AddMark(MarkAdMark *Mark) { // check if last mark is an aspectratio change clMark *prev=marks.GetLast(); - if ((prev) && (prev->type==MT_ASPECTCHANGE)) + if ((prev) && ((prev->type & 0xF0)==MT_ASPECTCHANGE)) { - if ((Mark->Position-prev->position)<20) + int MINMARKDIFF=(int) (macontext.Video.Info.FramesPerSecond*5); + if ((Mark->Position-prev->position)<MINMARKDIFF) { if (Mark->Comment) isyslog(Mark->Comment); - isyslog("aspectratio change in short distance, moving mark (%i->%i)",Mark->Position,prev->position); - marks.Add(MT_MOVED,prev->position,Mark->Comment); + isyslog("aspectratio change in short distance, using this mark (%i->%i)",Mark->Position,prev->position); return; } } } - if (((Mark->Type & 0xF0)==MT_LOGOCHANGE) && (macontext.Video.Info.FramesPerSecond>0)) + if (Mark->Type==MT_LOGOSTOP) + { + // check if last mark is an aspectratio change + clMark *prev=marks.GetLast(); + if ((prev) && (prev->type==MT_CHANNELSTOP)) + { + int MINMARKDIFF=(int) (macontext.Video.Info.FramesPerSecond*15); + if ((Mark->Position-prev->position)<MINMARKDIFF) + { + if (Mark->Comment) isyslog(Mark->Comment); + isyslog("audiochannel change in short distance, using this mark (%i->%i)",Mark->Position,prev->position); + //marks.Add(MT_MOVED,prev->position,Mark->Comment); + return; + } + } + } + + if ((Mark->Type & 0xF0)==MT_LOGOCHANGE) { // check if the distance to the last mark is large enough! clMark *prev=marks.GetLast(); if ((prev) && ((prev->type & 0xF0)==MT_LOGOCHANGE)) { - int MINMARKDIFF=(int) (macontext.Video.Info.FramesPerSecond*60*2); + int MINMARKDIFF=(int) (macontext.Video.Info.FramesPerSecond*80); if ((Mark->Position-prev->position)<MINMARKDIFF) { if (Mark->Comment) isyslog(Mark->Comment); @@ -222,49 +249,77 @@ void cMarkAdStandalone::AddMark(MarkAdMark *Mark) } } - if (((Mark->Type & 0xF0)==MT_BORDERCHANGE) && (Mark->Position>25000) && - (!macontext.Video.Options.IgnoreLogoDetection)) + if (macontext.Info.Length>0) { - isyslog("border change detected. logo detection disabled"); - macontext.Video.Options.IgnoreLogoDetection=true; - marks.Del(MT_LOGOSTART); - marks.Del(MT_LOGOSTOP); - } + int MINPOS=(int) ((macontext.Video.Info.FramesPerSecond*macontext.Info.Length)/5); + if (!MINPOS) MINPOS=25000; // fallback + if (((Mark->Type & 0xF0)==MT_BORDERCHANGE) && (Mark->Position>MINPOS) && + (!macontext.Video.Options.IgnoreLogoDetection)) + { + isyslog("border change detected. logo detection disabled"); + macontext.Video.Options.IgnoreLogoDetection=true; + marks.Del(MT_LOGOSTART); + marks.Del(MT_LOGOSTOP); + } - if ((((Mark->Type & 0xF0)==MT_CHANNELCHANGE) || (Mark->Type==MT_ASPECTCHANGE)) && - (Mark->Position>25000) && (bDecodeVideo)) - { - bool TurnOff=true; - if (Mark->Type==MT_ASPECTCHANGE) + if ((((Mark->Type & 0xF0)==MT_CHANNELCHANGE) || ((Mark->Type & 0xF0)==MT_ASPECTCHANGE)) && + (Mark->Position>MINPOS) && (bDecodeVideo)) { - if (marks.Count(MT_ASPECTCHANGE)<3) + bool TurnOff=true; + if ((Mark->Type & 0xF0)==MT_ASPECTCHANGE) { - TurnOff=false; + if ((marks.Count(MT_ASPECTCHANGE)+marks.Count(MT_ASPECTSTART)+ + marks.Count(MT_ASPECTSTOP)) <3) + { + TurnOff=false; + } } - } - if (Mark->Type==MT_CHANNELCHANGE) - { - if ((marks.Count(MT_CHANNELSTART)+marks.Count(MT_CHANNELSTOP))<3) + if ((Mark->Type & 0xF0)==MT_CHANNELCHANGE) { - TurnOff=false; + if ((marks.Count(MT_CHANNELSTART)+marks.Count(MT_CHANNELSTOP))<3) + { + TurnOff=false; + } } - } - if (TurnOff) - { - isyslog("%s change detected. logo/border detection disabled", - Mark->Type==MT_ASPECTCHANGE ? "aspectratio" : "audio channel"); + if (TurnOff) + { + isyslog("%s change detected. logo/border detection disabled", + (Mark->Type & 0xF0)==MT_ASPECTCHANGE ? "aspectratio" : "audio channel"); - bDecodeVideo=false; - macontext.Video.Data.Valid=false; - marks.Del(MT_LOGOSTART); - marks.Del(MT_LOGOSTOP); - marks.Del(MT_BORDERSTART); - marks.Del(MT_BORDERSTOP); + bDecodeVideo=false; + macontext.Video.Data.Valid=false; + marks.Del(MT_LOGOSTART); + marks.Del(MT_LOGOSTOP); + marks.Del(MT_BORDERSTART); + marks.Del(MT_BORDERSTOP); + } } } CheckFirstMark(); + + if (tStart) + { + if (abs(Mark->Position-tStart)<200*(macontext.Video.Info.FramesPerSecond)) + { + if ((Mark->Type==MT_ASPECTSTART) || (Mark->Type==MT_LOGOSTART) || + (Mark->Type==MT_CHANNELSTART) || (Mark->Type==MT_ASPECTCHANGE)) + { + isyslog("assuming start of broadcast (%i)",Mark->Position); + marks.Clear(); // clear all other marks till now + tStart=0; + } + } + } + + if ((tStop) && (Mark->Position>tStop)) + { + isyslog("assuming stop of broadcast (%i)",Mark->Position); + fastexit=true; + tStop=0; + } + clMark *old=marks.Get(Mark->Position); if (old) { @@ -286,7 +341,7 @@ void cMarkAdStandalone::RateMarks() { if (macontext.Info.Length) { - if ((marks.Count()>3) && (macontext.Info.Length>30)) + if ((marks.Count()>3) && (macontext.Info.Length>1800)) { int logomarks=marks.Count(MT_LOGOSTART) + marks.Count(MT_LOGOSTOP); int audiomarks=marks.Count(MT_CHANNELSTART) + marks.Count(MT_CHANNELSTOP); @@ -297,6 +352,8 @@ void cMarkAdStandalone::RateMarks() if ((logomarks) || (audiomarks)) { marks.Del(MT_ASPECTCHANGE); + marks.Del(MT_ASPECTSTART); + marks.Del(MT_ASPECTSTOP); } } } @@ -540,6 +597,12 @@ bool cMarkAdStandalone::ProcessFile(const char *Directory, int Number) } } + if (fastexit) + { + if (f!=-1) close(f); + return true; + } + CheckIndex(Directory); if (abort) { @@ -569,16 +632,26 @@ void cMarkAdStandalone::Process(const char *Directory) { break; } + if (fastexit) break; } if (!abort) { - if (lastiframe) + if ((lastiframe) && (!fastexit)) { + char *buf; +#if 0 + if ((marks.Count()<=1) && (tStart)) + { + if (asprintf(&buf,"start of broadcast (%i)",tStart)!=-1) + { + } + } +#endif + MarkAdMark tempmark; tempmark.Type=MT_COMMON; tempmark.Position=lastiframe; - char *buf; if (asprintf(&buf,"stop of recording (%i)",lastiframe)!=-1) { @@ -612,8 +685,22 @@ void cMarkAdStandalone::Process(const char *Directory) } else { - esyslog("index doesn't match marks%s", - isTS ? ", please recreate it" : ", please run genindex"); + if ((!isTS) && (bGenIndex)) + { + if (RegenerateVDRIndex(Directory)) + { + isyslog("recreated index"); + } + else + { + esyslog("failed to recreate index"); + } + } + else + { + esyslog("index doesn't match marks%s", + isTS ? ", please recreate it" : ", please run genindex"); + } } } } @@ -647,6 +734,7 @@ bool cMarkAdStandalone::LoadInfo(const char *Directory) free(buf); if (!f) return false; + long start=0; char *line=NULL; size_t length; while (getline(&line,&length,f)!=-1) @@ -671,13 +759,10 @@ bool cMarkAdStandalone::LoadInfo(const char *Directory) } if (line[0]=='E') { - int result=sscanf(line,"%*c %*i %*i %i %*i %*x",&macontext.Info.Length); - if (result==1) - { - macontext.Info.Length/=60; - } - else + int result=sscanf(line,"%*c %*i %li %i %*i %*x",&start,&macontext.Info.Length); + if (result!=2) { + start=0; macontext.Info.Length=0; } } @@ -695,7 +780,24 @@ bool cMarkAdStandalone::LoadInfo(const char *Directory) char *cr=strchr(title,13); if (cr) *cr=0; } - if ((bIgnoreAudioInfo) && (bIgnoreVideoInfo)) break; + } + if ((line[0]=='@') && (start) && (macontext.Info.Length) && (!tStart) && (!tStop)) + { + int ntok=0; + char *str=line,*tok; + while ((tok=strtok(str,">"))) + { + if (strstr(tok,"</start")) + { + tStart=start-atol(tok); + } + if (strstr(tok,"</stop")) + { + tStop=atol(tok)-start-macontext.Info.Length; + } + ntok++; + str=NULL; + } } if (line[0]=='X') { @@ -708,9 +810,18 @@ bool cMarkAdStandalone::LoadInfo(const char *Directory) { if ((type!=1) && (type!=5)) { +#if 0 // we dont have 4:3, so ignore AspectRatio-Changes macontext.Video.Options.IgnoreAspectRatio=true; isyslog("broadcasts aspectratio is not 4:3, disabling aspect ratio"); +#endif + macontext.Info.AspectRatio.Num=16; + macontext.Info.AspectRatio.Den=9; + } + else + { + macontext.Info.AspectRatio.Num=4; + macontext.Info.AspectRatio.Den=3; } } @@ -924,6 +1035,97 @@ bool cMarkAdStandalone::CheckPATPMT(const char *Directory) return true; } +bool cMarkAdStandalone::RegenerateVDRIndex(const char *Directory) +{ + if (!Directory) return false; + pid_t pid; + + char *oldfile; + if (asprintf(&oldfile,"%s/index.vdr.generated",Directory)==-1) return false; + if (unlink(oldfile)==-1) + { + if (errno!=ENOENT) + { + free(oldfile); + return false; + } + } + free(oldfile); + + if ((pid = fork()) < 0) return false; + if (pid > 0) // parent process + { + int status = 0; + if (waitpid(pid, &status, 0) < 0) return false; + + if (!status) + { + // check stdout/stderr-file for messages + char tmp[256]; + snprintf(tmp,sizeof(tmp),"/tmp/%i",pid); + tmp[255]=0; + struct stat statbuf; + if (stat(tmp,&statbuf)!=0) return false; + unlink(tmp); + if (statbuf.st_size!=0) return false; + } + + // rename index.vdr.generated -> index.vdr + char *oldpath,*newpath; + if (asprintf(&oldpath,"%s/index.vdr.generated",Directory)==-1) return false; + + if (asprintf(&newpath,"%s/index.vdr",Directory)==-1) + { + free(oldpath); + return false; + } + + if (rename(oldpath,newpath)!=0) + { + if (errno!=ENOENT) + { + free(oldpath); + free(newpath); + return false; + } + } + free(oldpath); + + if (getuid()==0 || geteuid()!=0) + { + // if we are root, set fileowner to owner of 001.vdr/00001.ts file + char *spath=NULL; + if (asprintf(&spath,"%s/%s",Directory,isTS ? "00001.ts" : "001.vdr")!=-1) + { + struct stat statbuf; + if (!stat(spath,&statbuf)) + { + chown(newpath,statbuf.st_uid, statbuf.st_gid); + } + free(spath); + } + } + free(newpath); + + return (status==0); + } + else // child process + { + int MaxPossibleFileDescriptors = getdtablesize(); + for (int i = STDERR_FILENO + 1; i < MaxPossibleFileDescriptors; i++) + close(i); //close all dup'ed filedescriptors + + if (chdir(Directory)!=0) return 2; + + char *cmd; + if (asprintf(&cmd,"genindex -q >& /tmp/%i",(int) getpid())==-1) return 2; + int ret=execl("/bin/sh", "sh", "-c", cmd, NULL); + free(cmd); + if (ret) ret=2; + _exit(ret); + } +} + bool cMarkAdStandalone::CreatePidfile(const char *Directory) { char *buf; @@ -993,10 +1195,11 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory, bool BackupMarks, in bool DecodeAudio, bool IgnoreVideoInfo, bool IgnoreAudioInfo, const char *LogoDir, const char *MarkFileName, bool ASD, bool noPid, bool OSD, const char *SVDRPHost, int SVDRPPort, - bool Before) + bool Before, bool GenIndex, bool Start, bool Stop) { directory=Directory; abort=false; + fastexit=false; noticeVDR_MP2=false; noticeVDR_AC3=false; @@ -1018,8 +1221,10 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory, bool BackupMarks, in bDecodeAudio=DecodeAudio; bIgnoreAudioInfo=IgnoreAudioInfo; bIgnoreVideoInfo=IgnoreVideoInfo; - + bGenIndex=GenIndex; bBackupMarks=BackupMarks; + tStart=Start; + tStop=Stop; macontext.Info.DPid.Type=MARKAD_PIDTYPE_AUDIO_AC3; macontext.Info.APid.Type=MARKAD_PIDTYPE_AUDIO_MP2; @@ -1119,11 +1324,16 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory, bool BackupMarks, in { if (bDecodeVideo) { - esyslog("failed loading info - logo %s disabled", + esyslog("failed loading info - logo %s and pre-/post-timer disabled", (LogoExtraction!=-1) ? "extraction" : "detection"); } + tStart=0; + tStop=0; } + if (tStart) isyslog("pre-timer %is",tStart); + if (tStop) isyslog("post-timer %is",tStop); + if (title[0]) { ptitle=title; @@ -1274,6 +1484,8 @@ int usage() " increments loglevel by one, can be given multiple times\n" "-B --backupmarks\n" " make a backup of existing marks\n" + "-G --genindex\n" + " run genindex on broken index file\n" "-L --extractlogo=<direction>[,width[,height]]\n" " extracts logo to /tmp as pgm files (must be renamed)\n" " <direction> 0 = top left, 1 = top right\n" @@ -1287,6 +1499,10 @@ int usage() " print version-info and exit\n" " --asd\n" " enable audio silence detecion\n" + " --bstart=<seconds>\n" + " margin at start\n" + " --bstop=<seconds>\n" + " margin at stop\n" " --markfile=<markfilename>\n" " set a different markfile-name\n" " --online[=1|2] (default is 1)\n" @@ -1364,6 +1580,9 @@ int main(int argc, char *argv[]) bool bDecodeAudio=true; bool bIgnoreAudioInfo=false; bool bIgnoreVideoInfo=false; + bool bGenIndex=false; + int tstart=0; + int tstop=0; int online=0; strcpy(logoDirectory,"/var/lib/markad"); @@ -1388,6 +1607,8 @@ int main(int argc, char *argv[]) {"verbose", 0, 0, 'v'}, {"asd",0,0,6}, + {"tstart",1,0,10}, + {"tstop",1,0,11}, {"loglevel",1,0,2}, {"markfile",1,0,1}, {"nopid",0,0,5}, @@ -1399,6 +1620,7 @@ int main(int argc, char *argv[]) {"backupmarks", 0, 0, 'B'}, {"scenechangedetection", 0, 0, 'C'}, + {"genindex",0, 0, 'G'}, {"extractlogo", 1, 0, 'L'}, {"OSD",0,0,'O' }, {"savelogo", 0, 0, 'S'}, @@ -1407,7 +1629,7 @@ int main(int argc, char *argv[]) {0, 0, 0, 0} }; - c = getopt_long (argc, argv, "abcd:i:jl:nop:s:vBCL:OSV", + c = getopt_long (argc, argv, "abcd:i:jl:nop:s:vBCGL:OSV", long_options, &option_index); if (c == -1) break; @@ -1518,6 +1740,10 @@ int main(int argc, char *argv[]) // --scenechangedetection break; + case 'G': + bGenIndex=true; + break; + case 'L': // --extractlogo str=optarg; @@ -1636,6 +1862,30 @@ int main(int argc, char *argv[]) } break; + case 10: // --bstart + if (isnumber(optarg) && atoi(optarg) > 0) + { + tstart=atoi(optarg); + } + else + { + fprintf(stderr, "markad: invalid bstart value: %s\n", optarg); + return 2; + } + break; + + case 11: // --bstop + if (isnumber(optarg) && atoi(optarg) > 0) + { + tstop=atoi(optarg); + } + else + { + fprintf(stderr, "markad: invalid bstop value: %s\n", optarg); + return 2; + } + break; + default: printf ("? getopt returned character code 0%o ? (option_index %d)\n", c,option_index); } @@ -1807,7 +2057,7 @@ int main(int argc, char *argv[]) cmasta = new cMarkAdStandalone(recDir,bBackupMarks, logoExtraction, logoWidth, logoHeight, bDecodeVideo,bDecodeAudio,bIgnoreVideoInfo,bIgnoreAudioInfo, logoDirectory,markFileName,bASD,bNoPid,bOSD,svdrphost, - svdrpport,bBefore); + svdrpport,bBefore,bGenIndex,tstart,tstop); if (!cmasta) return -1; cmasta->Process(recDir); diff --git a/command/marks.cpp b/command/marks.cpp index 8587e0d..d84fafd 100644 --- a/command/marks.cpp +++ b/command/marks.cpp @@ -32,14 +32,7 @@ clMark::~clMark() clMarks::~clMarks() { - clMark *next,*mark=first; - while (mark) - { - next=mark->Next(); - Del(mark); - mark=next; - } - + Clear(); } int clMarks::Count(int Type) @@ -71,6 +64,19 @@ void clMarks::Del(int Type) } } +void clMarks::Clear() +{ + clMark *next,*mark=first; + while (mark) + { + next=mark->Next(); + Del(mark); + mark=next; + } + first=NULL; + last=NULL; +} + void clMarks::Del(clMark *Mark) { if (!Mark) return; diff --git a/command/marks.h b/command/marks.h index 611f6b7..8ea4a99 100644 --- a/command/marks.h +++ b/command/marks.h @@ -98,6 +98,7 @@ public: } } clMark *Add(int Type, int Position, const char *Comment = NULL); + void Clear(); void Del(clMark *Mark); void Del(int Type); clMark *Get(int Position); diff --git a/command/video.cpp b/command/video.cpp index f32faa9..5eae436 100644 --- a/command/video.cpp +++ b/command/video.cpp @@ -53,13 +53,17 @@ cMarkAdLogo::~cMarkAdLogo() { } -int cMarkAdLogo::Load(char *file) +int cMarkAdLogo::Load(char *directory, char *file) { + char *path; + if (asprintf(&path,"%s/%s.pgm",directory,file)==-1) return -3; + // Load mask FILE *pFile; area.valid=false; area.corner=-1; - pFile=fopen(file, "rb"); + pFile=fopen(path, "rb"); + free(path); if (!pFile) return -1; fscanf(pFile, "P5\n#C%i %i\n%d %d\n255\n#", &area.corner,&area.mpixel,&LOGOWIDTH,&LOGOHEIGHT); @@ -358,20 +362,21 @@ int cMarkAdLogo::Process(int LastIFrame, int *LogoIFrame) { area.valid=false; // just to be sure! char *buf=NULL; - if (asprintf(&buf,"%s/%s-A%i_%i.pgm",macontext->LogoDir,macontext->Info.ChannelID, + if (asprintf(&buf,"%s-A%i_%i",macontext->Info.ChannelID, macontext->Video.Info.AspectRatio.Num,macontext->Video.Info.AspectRatio.Den)!=-1) { - int ret=Load(buf); + int ret=Load(macontext->LogoDir,buf); switch (ret) { case -1: - esyslog("failed to open %s",buf); - + isyslog("no logo for %s",buf); break; - case -2: esyslog("format error in %s",buf); break; + case -3: + esyslog("cannot load %s",buf); + break; } free(buf); } @@ -467,7 +472,7 @@ int cMarkAdBlackBordersHoriz::Process(int LastIFrame, int *BorderIFrame) } else { -#define MINSECS 60 +#define MINSECS 420 switch (borderstatus) { case UNINITIALIZED: @@ -645,7 +650,22 @@ MarkAdMark *cMarkAdVideo::Process(int LastIFrame) macontext->Video.Info.AspectRatio.Num, macontext->Video.Info.AspectRatio.Den,LastIFrame)!=-1) { - AddMark(MT_ASPECTCHANGE,LastIFrame,buf); + if ((macontext->Info.AspectRatio.Num) && (macontext->Info.AspectRatio.Den)) + { + if ((macontext->Video.Info.AspectRatio.Num==macontext->Info.AspectRatio.Num) && + (macontext->Video.Info.AspectRatio.Num==macontext->Info.AspectRatio.Num)) + { + AddMark(MT_ASPECTSTART,LastIFrame,buf); + } + else + { + AddMark(MT_ASPECTSTOP,LastIFrame,buf); + } + } + else + { + AddMark(MT_ASPECTCHANGE,LastIFrame,buf); + } free(buf); } } diff --git a/command/video.h b/command/video.h index e5e35d4..e2f1d1d 100644 --- a/command/video.h +++ b/command/video.h @@ -81,7 +81,7 @@ private: MarkAdContext *macontext; int Detect(int lastiframe, int *logoiframe); // ret 1 = logo, 0 = unknown, -1 = no logo - int Load(char *file); + int Load(char *directory, char *file); void Save(int lastiframe, uchar *picture); public: cMarkAdLogo(MarkAdContext *maContext); diff --git a/plugin/markad.cpp b/plugin/markad.cpp index 5fc04bb..caca23f 100644 --- a/plugin/markad.cpp +++ b/plugin/markad.cpp @@ -21,6 +21,7 @@ cPluginMarkAd::cPluginMarkAd(void) setup.ProcessDuring=true; setup.whileRecording=true; setup.whileReplaying=true; + setup.GenIndex=true; setup.OSDMessage=false; setup.BackupMarks=false; setup.Verbose=false; @@ -96,6 +97,17 @@ bool cPluginMarkAd::ProcessArgs(int argc, char *argv[]) bool cPluginMarkAd::Initialize(void) { // Initialize any background activities the plugin shall perform. + char *path; + if (asprintf(&path,"%s/markad",bindir)==-1) return false; + struct stat statbuf; + if (stat(path,&statbuf)==-1) + { + esyslog("markad: cannot find %s, please install",path); + free(path); + return false; + } + free(path); + return true; } diff --git a/plugin/po/de_DE.po b/plugin/po/de_DE.po index aceb4bd..ae1ec98 100644 --- a/plugin/po/de_DE.po +++ b/plugin/po/de_DE.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: vdr\n" "Report-Msgid-Bugs-To: <see README>\n" -"POT-Creation-Date: 2010-04-10 13:35+0200\n" +"POT-Creation-Date: 2010-04-18 15:58+0200\n" "PO-Revision-Date: 2009-08-27 14:18+0200\n" "Last-Translator: Jochen Dolze <vdr@dolze.de>\n" "Language-Team: <vdr@linuxtv.org>\n" @@ -63,6 +63,9 @@ msgstr " während einer anderen Aufnahme" msgid " while replaying" msgstr " während einer Wiedergabe" +msgid "repair index, if broken" +msgstr "Kaputte Indexdatei reparieren" + msgid "OSD message" msgstr "OSD Meldung" diff --git a/plugin/po/it_IT.po b/plugin/po/it_IT.po index 047603f..a592cd8 100644 --- a/plugin/po/it_IT.po +++ b/plugin/po/it_IT.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: vdr\n" "Report-Msgid-Bugs-To: <see README>\n" -"POT-Creation-Date: 2010-04-10 13:35+0200\n" +"POT-Creation-Date: 2010-04-18 15:58+0200\n" "PO-Revision-Date: 2009-11-14 18:06+0100\n" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Language-Team: <vdr@linuxtv.org>\n" @@ -66,6 +66,9 @@ msgstr "" msgid " while replaying" msgstr "" +msgid "repair index, if broken" +msgstr "" + msgid "OSD message" msgstr "" diff --git a/plugin/setup.cpp b/plugin/setup.cpp index 157291a..1798239 100644 --- a/plugin/setup.cpp +++ b/plugin/setup.cpp @@ -17,6 +17,7 @@ cSetupMarkAd::cSetupMarkAd(struct setup *Setup) osdmsg=setup->OSDMessage; backupmarks=setup->BackupMarks; verbose=setup->Verbose; + genindex=setup->GenIndex; processTexts[0]=tr("after"); processTexts[1]=tr("during"); @@ -34,6 +35,9 @@ void cSetupMarkAd::write(void) Add(new cMenuEditBoolItem(tr(" during another recording"),&whilerecording)); Add(new cMenuEditBoolItem(tr(" while replaying"),&whilereplaying)); } + + Add(new cMenuEditBoolItem(tr("repair index, if broken"),&genindex)); + Add(new cMenuEditBoolItem(tr("OSD message"),&osdmsg)); Add(new cMenuEditBoolItem(tr("backup marks"),&backupmarks)); Add(new cMenuEditBoolItem(tr("verbose logging"),&verbose)); @@ -69,6 +73,7 @@ void cSetupMarkAd::Store(void) SetupStore("whileRecording",whilerecording); SetupStore("whileReplaying",whilereplaying); SetupStore("BackupMarks",backupmarks); + SetupStore("GenIndex",genindex); SetupStore("OSDMessage",osdmsg); SetupStore("Verbose",verbose); @@ -76,6 +81,7 @@ void cSetupMarkAd::Store(void) setup->whileRecording=(bool) whilerecording; setup->whileReplaying=(bool) whilereplaying; setup->OSDMessage=(bool) osdmsg; + setup->GenIndex=(bool) genindex; setup->BackupMarks=(bool) backupmarks; setup->Verbose=(bool) verbose; } diff --git a/plugin/setup.h b/plugin/setup.h index c13c769..dab1501 100644 --- a/plugin/setup.h +++ b/plugin/setup.h @@ -18,6 +18,7 @@ struct setup bool OSDMessage; bool BackupMarks; bool Verbose; + bool GenIndex; }; class cSetupMarkAd : public cMenuSetupPage @@ -31,6 +32,7 @@ private: int osdmsg; int backupmarks; int verbose; + int genindex; void write(void); protected: virtual void Store(void); diff --git a/plugin/status.cpp b/plugin/status.cpp index be32133..91a4d56 100644 --- a/plugin/status.cpp +++ b/plugin/status.cpp @@ -69,11 +69,12 @@ bool cStatusMarkAd::Start(const char *FileName, const char *Name, bool Direct) { if ((Direct) && (Get(FileName)!=-1)) return false; - cString cmd = cString::sprintf("\"%s\"/markad %s %s %s -l \"%s\" %s \"%s\"",bindir, + cString cmd = cString::sprintf("\"%s\"/markad %s %s %s %s -l \"%s\" %s \"%s\"",bindir, setup->Verbose ? "-v" : "", setup->BackupMarks ? "-B" : "", + setup->GenIndex ? "-G" : "", setup->OSDMessage ? "-O" : "", - logodir,Direct ? "after" : "--online=2 before", FileName); - dsyslog("executing %s",*cmd); + logodir,Direct ? "-O after" : "--online=2 before", FileName); + dsyslog("markad: executing %s",*cmd); if (SystemExec(cmd)!=-1) { usleep(200000); |