00001 #ifndef _CLASSIC_COMMDETECTOR_H_
00002 #define _CLASSIC_COMMDETECTOR_H_
00003
00004 #include "CommDetector.h"
00005 #include "CommDetectorBase.h"
00006 #include "libmythtv/frame.h"
00007 #include "qdatetime.h"
00008
00009 class NuppelVideoPlayer;
00010 class LogoDetectorBase;
00011 class SceneChangeDetectorBase;
00012
00013 class ClassicCommDetector : public CommDetectorBase
00014 {
00015 Q_OBJECT
00016
00017 public:
00018 ClassicCommDetector(enum SkipTypes commDetectMethod, bool showProgress,
00019 bool fullSpeed, NuppelVideoPlayer* nvp,
00020 const QDateTime& startedAt_in,
00021 const QDateTime& stopsAt_in,
00022 const QDateTime& recordingStartedAt_in,
00023 const QDateTime& recordingStopsAt_in);
00024 virtual ~ClassicCommDetector();
00025 bool go();
00026 void getCommercialBreakList(QMap<long long, int> &comms);
00027 void recordingFinished(long long totalFileSize);
00028 void requestCommBreakMapUpdate(void);
00029
00030 void logoDetectorBreathe();
00031
00032 friend class ClassicLogoDetector;
00033 private:
00034
00035 typedef struct frameinfo
00036 {
00037 int minBrightness;
00038 int maxBrightness;
00039 int avgBrightness;
00040 int sceneChangePercent;
00041 int aspect;
00042 int format;
00043 int flagMask;
00044 }
00045 FrameInfoEntry;
00046
00047 typedef struct frameblock
00048 {
00049 long start;
00050 long end;
00051 long frames;
00052 double length;
00053 int bfCount;
00054 int logoCount;
00055 int ratingCount;
00056 int scCount;
00057 double scRate;
00058 int formatMatch;
00059 int aspectMatch;
00060 int score;
00061 }
00062 FrameBlock;
00063
00064 void Init();
00065 void SetVideoParams(float aspect);
00066 void ProcessFrame(VideoFrame *frame, long long frame_number);
00067 void ClearAllMaps(void);
00068 void GetBlankCommMap(QMap<long long, int> &comms);
00069 void GetBlankCommBreakMap(QMap<long long, int> &comms);
00070 void GetSceneChangeMap(QMap<long long, int> &scenes,
00071 long long start_frame);
00072 void BuildMasterCommList(void);
00073 void UpdateFrameBlock(FrameBlock *fbp, FrameInfoEntry finfo,
00074 int format, int aspect);
00075 void BuildAllMethodsCommList(void);
00076 void BuildBlankFrameCommList(void);
00077 void BuildSceneChangeCommList(void);
00078 void BuildLogoCommList();
00079 void MergeBlankCommList(void);
00080 bool FrameIsInBreakMap(long long f, QMap<long long, int> &breakMap);
00081 void DumpMap(QMap<long long, int> &map);
00082 void CondenseMarkMap(QMap<long long, int>&map, int spacing, int length);
00083 void ConvertShowMapToCommMap(QMap<long long, int>&map);
00084 void CleanupFrameInfo(void);
00085 void GetLogoCommBreakMap(QMap<long long, int> &map);
00086
00087 enum SkipTypes commDetectMethod;
00088 bool showProgress;
00089 bool fullSpeed;
00090 NuppelVideoPlayer *nvp;
00091 QDateTime startedAt, stopsAt;
00092 QDateTime recordingStartedAt, recordingStopsAt;
00093 bool stillRecording;
00094 QMap<long long,int> lastSentCommBreakMap;
00095 bool commBreakMapUpdateRequested;
00096 bool sendCommBreakMapUpdates;
00097
00098 bool aggressiveDetection;
00099 int commDetectBorder;
00100 int commDetectBlankFrameMaxDiff;
00101 int commDetectDarkBrightness;
00102 int commDetectDimBrightness;
00103 int commDetectBoxBrightness;
00104 int commDetectDimAverage;
00105 int commDetectMaxCommBreakLength;
00106 int commDetectMinCommBreakLength;
00107 int commDetectMinShowLength;
00108 int commDetectMaxCommLength;
00109 bool commDetectBlankCanHaveLogo;
00110
00111 bool verboseDebugging;
00112
00113 long long lastFrameNumber;
00114 long long curFrameNumber;
00115
00116 int width;
00117 int height;
00118 int horizSpacing;
00119 int vertSpacing;
00120 double fps;
00121 double fpm;
00122 bool blankFramesOnly;
00123 int blankFrameCount;
00124 int currentAspect;
00125
00126 long long framesProcessed;
00127 long long preRoll;
00128 long long postRoll;
00129
00130 int totalMinBrightness;
00131
00132 bool detectBlankFrames;
00133 bool detectSceneChanges;
00134 bool detectStationLogo;
00135
00136 bool logoInfoAvailable;
00137 LogoDetectorBase* logoDetector;
00138
00139 bool skipAllBlanks;
00140
00141 unsigned char *framePtr;
00142
00143 QMap<long long, FrameInfoEntry> frameInfo;
00144 QMap<long long, int> blankFrameMap;
00145 QMap<long long, int> blankCommMap;
00146 QMap<long long, int> blankCommBreakMap;
00147 QMap<long long, int> sceneMap;
00148 QMap<long long, int> sceneCommBreakMap;
00149 QMap<long long, int> commBreakMap;
00150 QMap<long long, int> logoCommBreakMap;
00151
00152 bool frameIsBlank;
00153 bool sceneHasChanged;
00154 bool stationLogoPresent;
00155
00156 bool lastFrameWasBlank;
00157 bool lastFrameWasSceneChange;
00158 bool decoderFoundAspectChanges;
00159
00160 SceneChangeDetectorBase* sceneChangeDetector;
00161
00162 public slots:
00163 void sceneChangeDetectorHasNewInformation(unsigned int framenum, bool isSceneChange,float debugValue);
00164 };
00165
00166 #endif
00167
00168
00169