summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--audio.cpp9
-rw-r--r--global.h9
-rw-r--r--markad-standalone.cpp73
-rw-r--r--marks.cpp18
-rw-r--r--marks.h5
-rw-r--r--vdr2pkt.cpp4
-rw-r--r--video.cpp8
7 files changed, 81 insertions, 45 deletions
diff --git a/audio.cpp b/audio.cpp
index 4a40700..f391b33 100644
--- a/audio.cpp
+++ b/audio.cpp
@@ -168,7 +168,14 @@ MarkAdMark *cMarkAdAudio::Process(int LastIFrame)
macontext->Audio.Info.Channels,lastiframe)!=-1)
{
isyslog(buf);
- AddMark(MT_CHANNELCHANGE,lastiframe,buf);
+ if (macontext->Audio.Info.Channels>2)
+ {
+ AddMark(MT_CHANNELSTART,lastiframe,buf);
+ }
+ else
+ {
+ AddMark(MT_CHANNELSTOP,lastiframe,buf);
+ }
free(buf);
}
}
diff --git a/global.h b/global.h
index ffc44cf..23f7a1a 100644
--- a/global.h
+++ b/global.h
@@ -25,9 +25,14 @@ typedef unsigned char uchar;
#define MT_COMMON 0x10
#define MT_ASPECTCHANGE 0x20
#define MT_CHANNELCHANGE 0x30
-#define MT_LOGOCHANGE 0x40
-#define MT_BORDERCHANGE 0x50
+#define MT_CHANNELSTART 0x30
+#define MT_CHANNELSTOP 0x31
+#define MT_LOGOSTART 0x40
+#define MT_LOGOSTOP 0x41
+#define MT_BORDERSTART 0x50
+#define MT_BORDERSTOP 0x51
#define MT_SILENCECHANGE 0x60
+#define MT_ALL 0xFF
typedef struct MarkAdMark
{
diff --git a/markad-standalone.cpp b/markad-standalone.cpp
index 0959ce4..ddd79ae 100644
--- a/markad-standalone.cpp
+++ b/markad-standalone.cpp
@@ -50,46 +50,59 @@ void cMarkAdStandalone::AddMark(MarkAdMark *Mark)
if (!Mark) return;
if (!Mark->Type) return;
- if (((Mark->Type==MT_CHANNELCHANGE) || (Mark->Type==MT_ASPECTCHANGE)) &&
+ if ((((Mark->Type & 0xF0)==MT_CHANNELCHANGE) || (Mark->Type==MT_ASPECTCHANGE)) &&
(Mark->Position>25000) && (bDecodeVideo))
{
- isyslog("%s change detected. video decoding disabled",
- Mark->Type==MT_CHANNELCHANGE ? "audio channel" : "aspectratio");
- bDecodeVideo=false;
- macontext.Video.Data.Valid=false;
- marks.Del(MT_LOGOCHANGE);
- marks.Del(MT_BORDERCHANGE);
- }
+ bool TurnOff=true;
+ if (Mark->Type==MT_ASPECTCHANGE)
+ {
+ if (marks.Count(MT_ASPECTCHANGE)<3)
+ {
+ TurnOff=false;
+ }
+ }
+ if (TurnOff)
+ {
+ isyslog("%s change detected. video decoding disabled",
+ Mark->Type==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);
+ }
+ }
marks.Add(Mark->Type,Mark->Position,Mark->Comment);
}
void cMarkAdStandalone::RateMarks()
{
-#if 0
- if (!marksAligned)
- {
- clMark *prevmark=marks.GetPrev(Mark->Position);
- if (!prevmark) return;
- if (prevmark->position==0) return;
+ if (marks.Count()<=3) return; // only three marks? -> nothing to rate
- int MAXPOSDIFF = (int) (macontext.Video.Info.FramesPerSecond*60*13); // = 13 min
+ // First check if we have only aspectmarks and no logomarks/audiomarks
+ int logomarks=marks.Count(MT_LOGOSTART) + marks.Count(MT_LOGOSTOP);
+ int audiomarks=marks.Count(MT_CHANNELSTART) + marks.Count(MT_CHANNELSTOP);
- if (abs(Mark->Position-prevmark->position)>MAXPOSDIFF)
- {
- clMark *firstmark=marks.Get(0);
- if (firstmark)
- {
- marks.Del(firstmark);
- marksAligned=true;
- }
- }
- else
- {
- marksAligned=true;
- }
+ if ((logomarks) || (audiomarks))
+ {
+ // If we have logomarks get rid of all aspectmarks
+ marks.Del(MT_ASPECTCHANGE);
+ }
+
+ // Check the third mark
+ clMark *second=marks.GetNext(0);
+ if (!second) return; // failure
+ clMark *third=marks.GetNext(second->position);
+ if (!third) return; // failure
+ int MAXPOSDIFF=(int) (macontext.Video.Info.FramesPerSecond*60*13);
+ if ((third->position-second->position)>MAXPOSDIFF)
+ {
+ clMark *first=marks.Get(0);
+ if (first) marks.Del(first);
}
-#endif
}
void cMarkAdStandalone::SaveFrame(int frame)
@@ -386,7 +399,7 @@ void cMarkAdStandalone::Process(const char *Directory)
usec+=1000000;
sec--;
}
-
+ RateMarks();
if (marks.Save(Directory,macontext.Video.Info.FramesPerSecond,isTS))
{
bool bIndexError=false;
diff --git a/marks.cpp b/marks.cpp
index 5a59b2e..3d4b81a 100644
--- a/marks.cpp
+++ b/marks.cpp
@@ -42,6 +42,22 @@ clMarks::~clMarks()
}
+int clMarks::Count(int Type)
+{
+ if (Type==0xFF) return count;
+
+ if (!first) return 0;
+
+ int ret=0;
+ clMark *mark=first;
+ while (mark)
+ {
+ if (mark->type==Type) ret++;
+ mark=mark->Next();
+ }
+ return ret;
+}
+
void clMarks::Del(int Type)
{
if (!first) return; // no elements yet
@@ -115,7 +131,7 @@ clMark *clMarks::GetNext(int Position)
clMark *mark=first;
while (mark)
{
- if (Position>mark->position) break;
+ if (Position>=mark->position) break;
mark=mark->Next();
}
return mark->Next();
diff --git a/marks.h b/marks.h
index 6d58079..c2da10c 100644
--- a/marks.h
+++ b/marks.h
@@ -88,10 +88,7 @@ public:
count=0;
}
~clMarks();
- int Count()
- {
- return count;
- }
+ int Count(int Type=0xFF);
void SetFileName(const char *FileName)
{
if (FileName)
diff --git a/vdr2pkt.cpp b/vdr2pkt.cpp
index d6ef906..8d5a18f 100644
--- a/vdr2pkt.cpp
+++ b/vdr2pkt.cpp
@@ -20,11 +20,9 @@ cMarkAdVDR2Pkt::~cMarkAdVDR2Pkt()
void cMarkAdVDR2Pkt::Process(MarkAdPid Pid, uchar *VDRData, int VDRSize, uchar **PktData, int *PktSize)
{
if ((!PktData) || (!PktSize) || (!queue)) return;
- if ((Pid.Type!=MARKAD_PIDTYPE_VIDEO_H262) &&
- (Pid.Type!=MARKAD_PIDTYPE_VIDEO_H264)) return;
-
*PktData=NULL;
*PktSize=0;
+ if (!Pid.Type) return;
if (VDRData) queue->Put(VDRData,VDRSize);
*PktData=queue->GetPacket(PktSize,MA_PACKET_PKT);
diff --git a/video.cpp b/video.cpp
index cb06f00..408f673 100644
--- a/video.cpp
+++ b/video.cpp
@@ -564,7 +564,7 @@ MarkAdMark *cMarkAdVideo::Process(int LastIFrame)
if (asprintf(&buf,"detected logo start (%i)",logoiframe)!=-1)
{
isyslog(buf);
- AddMark(MT_LOGOCHANGE,logoiframe,buf);
+ AddMark(MT_LOGOSTART,logoiframe,buf);
free(buf);
}
}
@@ -573,7 +573,7 @@ MarkAdMark *cMarkAdVideo::Process(int LastIFrame)
if (asprintf(&buf,"detected logo stop (%i)",logoiframe)!=-1)
{
isyslog(buf);
- AddMark(MT_LOGOCHANGE,logoiframe,buf);
+ AddMark(MT_LOGOSTOP,logoiframe,buf);
free(buf);
}
}
@@ -589,7 +589,7 @@ MarkAdMark *cMarkAdVideo::Process(int LastIFrame)
if (asprintf(&buf,"detected start of horiz. borders (%i)",borderiframe)!=-1)
{
isyslog(buf);
- AddMark(MT_BORDERCHANGE,borderiframe,buf);
+ AddMark(MT_BORDERSTART,borderiframe,buf);
free(buf);
}
}
@@ -600,7 +600,7 @@ MarkAdMark *cMarkAdVideo::Process(int LastIFrame)
if (asprintf(&buf,"detected stop of horiz. borders (%i)",borderiframe)!=-1)
{
isyslog(buf);
- AddMark(MT_BORDERCHANGE,borderiframe,buf);
+ AddMark(MT_BORDERSTOP,borderiframe,buf);
free(buf);
}
}