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