summaryrefslogtreecommitdiff
path: root/markad-standalone.cpp
diff options
context:
space:
mode:
authorJochen Dolze <vdr@dolze.de>2010-03-18 20:04:17 +0100
committerJochen Dolze <vdr@dolze.de>2010-03-18 20:04:17 +0100
commit92de31d7d3592ca46a391f82afea1a0b3ca58c8c (patch)
tree508a56287d4647607bb4ad2c5015f2e9e9e13b20 /markad-standalone.cpp
parentbd2f9a57303165db325b014aa6735789790ddfed (diff)
downloadvdr-plugin-markad-92de31d7d3592ca46a391f82afea1a0b3ca58c8c.tar.gz
vdr-plugin-markad-92de31d7d3592ca46a391f82afea1a0b3ca58c8c.tar.bz2
Added ability for online scan
Diffstat (limited to 'markad-standalone.cpp')
-rw-r--r--markad-standalone.cpp105
1 files changed, 90 insertions, 15 deletions
diff --git a/markad-standalone.cpp b/markad-standalone.cpp
index 70844c6..3d7849f 100644
--- a/markad-standalone.cpp
+++ b/markad-standalone.cpp
@@ -7,24 +7,28 @@
#include "markad-standalone.h"
+bool SYSLOG=false;
cMarkAdStandalone *cmasta=NULL;
int SysLogLevel=2;
void syslog_with_tid(int priority, const char *format, ...)
{
va_list ap;
-#ifdef SYSLOG
- char fmt[255];
- snprintf(fmt, sizeof(fmt), "[%d] %s", getpid(), format);
- va_start(ap, format);
- vsyslog(priority, fmt, ap);
- va_end(ap);
-#else
- va_start(ap, format);
- vprintf(format,ap);
- va_end(ap);
- printf("\n");
-#endif
+ if (SYSLOG)
+ {
+ char fmt[255];
+ snprintf(fmt, sizeof(fmt), "[%d] %s", getpid(), format);
+ va_start(ap, format);
+ vsyslog(priority, fmt, ap);
+ va_end(ap);
+ }
+ else
+ {
+ va_start(ap, format);
+ vprintf(format,ap);
+ va_end(ap);
+ printf("\n");
+ }
}
void cMarkAdStandalone::AddStartMark()
@@ -77,6 +81,10 @@ void cMarkAdStandalone::AddMark(MarkAdMark *Mark)
}
+void cMarkAdStandalone::RateMarks()
+{
+}
+
void cMarkAdStandalone::SaveFrame(int frame)
{
if (!macontext.Video.Info.Width) return;
@@ -102,6 +110,53 @@ void cMarkAdStandalone::SaveFrame(int frame)
fclose(pFile);
}
+void cMarkAdStandalone::CheckIndex()
+{
+ // Here we check the indexfile
+ // if we have an index we check if the
+ // index is more advanced than our framecounter
+ // if not we wait. if we wait too much,
+ // we discard this check
+
+#define WAITTIME 10
+
+ if (!indexFile) return;
+ if (sleepcnt>=2) return; // we already slept too much
+
+ bool notenough=true;
+ do
+ {
+ struct stat statbuf;
+ if (stat(indexFile,&statbuf)==-1) return;
+
+ int maxframes=statbuf.st_size/8;
+ if (lastmaxframes==maxframes) return; // no new frames still last call!
+
+ if (maxframes<(framecnt+200))
+ {
+ // now we sleep and hopefully the index will grow
+ dsyslog("markad [%i]: we are too fast, waiting %i secs",recvnumber,WAITTIME);
+ sleep(WAITTIME);
+ if (errno==EINTR) return;
+ sleepcnt++;
+ if (sleepcnt>=2)
+ {
+ esyslog("markad [%i]: no new data after %i seconds, skipping wait!",
+ recvnumber,sleepcnt*WAITTIME);
+ notenough=false; // something went wrong?
+ }
+ }
+ else
+ {
+ sleepcnt=0;
+ notenough=false;
+ }
+ lastmaxframes=maxframes;
+ }
+ while (notenough);
+
+}
+
bool cMarkAdStandalone::ProcessFile(const char *Directory, int Number)
{
if (!Directory) return false;
@@ -124,6 +179,9 @@ bool cMarkAdStandalone::ProcessFile(const char *Directory, int Number)
free(fbuf);
if (f==-1) return false;
+ CheckIndex();
+ if (abort) return false;
+
int dataread;
dsyslog("markad [%i]: processing file %05i",recvnumber,Number);
@@ -155,6 +213,11 @@ bool cMarkAdStandalone::ProcessFile(const char *Directory, int Number)
{
if (!framecnt)
{
+ if (macontext.General.VPid.Type==MARKAD_PIDTYPE_VIDEO_H264)
+ {
+ isyslog("markad [%i]: HDTV %i%c",recvnumber,
+ macontext.Video.Info.Height,macontext.Video.Info.Interlaced ? 'i' : 'p');
+ }
if (!marks.Load(Directory,macontext.Video.Info.FramesPerSecond,isTS))
{
AddStartMark();
@@ -266,7 +329,12 @@ bool cMarkAdStandalone::ProcessFile(const char *Directory, int Number)
}
}
}
-
+ CheckIndex();
+ if (abort)
+ {
+ if (f!=-1) close(f);
+ return false;
+ }
}
close(f);
return true;
@@ -620,6 +688,9 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory, bool BackupMarks, in
noticeVDR_MP2=false;
noticeVDR_AC3=false;
+ sleepcnt=0;
+ lastmaxframes=0;
+
memset(&macontext,0,sizeof(macontext));
macontext.LogoDir=(char *) LogoDir;
macontext.StandAlone.LogoExtraction=LogoExtraction;
@@ -682,6 +753,7 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory, bool BackupMarks, in
abort=true;
}
macontext.General.APid.Num=0;
+ if (asprintf(&indexFile,"%s/index",Directory)==-1) indexFile=NULL;
}
else
{
@@ -697,6 +769,7 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory, bool BackupMarks, in
{
macontext.General.VPid.Type=MARKAD_PIDTYPE_VIDEO_H262;
}
+ if (asprintf(&indexFile,"%s/index.vdr",Directory)==-1) indexFile=NULL;
}
if (!LoadInfo(Directory))
@@ -772,6 +845,8 @@ cMarkAdStandalone::cMarkAdStandalone(const char *Directory, bool BackupMarks, in
cMarkAdStandalone::~cMarkAdStandalone()
{
if (macontext.General.ChannelID) free(macontext.General.ChannelID);
+ if (indexFile) free(indexFile);
+
if (video_demux) delete video_demux;
if (ac3_demux) delete ac3_demux;
if (mp2_demux) delete mp2_demux;
@@ -929,7 +1004,7 @@ int main(int argc, char *argv[])
case 'b':
// --background
- bFork = true;
+ bFork = SYSLOG = true;
break;
case 'c':
@@ -1129,7 +1204,7 @@ int main(int argc, char *argv[])
{
if (strcmp(argv[optind], "after" ) == 0 )
{
- bAfter = bFork = bNice = true;
+ bAfter = bFork = bNice = SYSLOG = true;
}
else if (strcmp(argv[optind], "before" ) == 0 )
{