diff options
author | Jochen Dolze <vdr@dolze.de> | 2010-03-23 21:22:09 +0100 |
---|---|---|
committer | Jochen Dolze <vdr@dolze.de> | 2010-03-23 21:22:09 +0100 |
commit | 2536e2274be47a822eb6034d5f359070c4c7270b (patch) | |
tree | 960f2a2bef50b90be9a27f2d6736fe3bc202ba0c | |
parent | 616e154c45b6d30233375c0d5f53027b47975bc9 (diff) | |
download | vdr-plugin-markad-2536e2274be47a822eb6034d5f359070c4c7270b.tar.gz vdr-plugin-markad-2536e2274be47a822eb6034d5f359070c4c7270b.tar.bz2 |
Added more marktypes, added initial mark rating
-rw-r--r-- | audio.cpp | 9 | ||||
-rw-r--r-- | global.h | 9 | ||||
-rw-r--r-- | markad-standalone.cpp | 73 | ||||
-rw-r--r-- | marks.cpp | 18 | ||||
-rw-r--r-- | marks.h | 5 | ||||
-rw-r--r-- | vdr2pkt.cpp | 4 | ||||
-rw-r--r-- | video.cpp | 8 |
7 files changed, 81 insertions, 45 deletions
@@ -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); } } @@ -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; @@ -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(); @@ -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); @@ -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); } } |