diff --git a/mythtv/programs/mythcommflag/ClassicCommDetector.cpp b/mythtv/programs/mythcommflag/ClassicCommDetector.cpp
index 800e83d..327548f 100644
|
a
|
b
|
ClassicCommDetector::ClassicCommDetector(SkipType commDetectMethod_in,
|
| 152 | 152 | preRoll(0), postRoll(0) |
| 153 | 153 | { |
| 154 | 154 | commDetectBorder = |
| 155 | | gCoreContext->GetNumSetting("CommDetectBorder", 20); |
| | 155 | gCoreContext->GetNumSetting("CommDetectBorder", 5); |
| 156 | 156 | commDetectBlankFrameMaxDiff = |
| 157 | 157 | gCoreContext->GetNumSetting("CommDetectBlankFrameMaxDiff", 25); |
| 158 | 158 | commDetectDarkBrightness = |
| … |
… |
void ClassicCommDetector::Init()
|
| 206 | 206 | .arg(width).arg(height) |
| 207 | 207 | .arg(player->GetFrameRate()).arg(commDetectMethod)); |
| 208 | 208 | |
| 209 | | if ((width * height) > 1000000) |
| | 209 | /*if ((width * height) > 1000000) |
| 210 | 210 | { |
| 211 | 211 | horizSpacing = 10; |
| 212 | 212 | vertSpacing = 10; |
| … |
… |
void ClassicCommDetector::Init()
|
| 230 | 230 | { |
| 231 | 231 | horizSpacing = 4; |
| 232 | 232 | vertSpacing = 4; |
| 233 | | } |
| | 233 | }*/ |
| 234 | 234 | |
| | 235 | horizSpacing = 1; |
| | 236 | vertSpacing = 1; |
| | 237 | |
| 235 | 238 | LOG(VB_COMMFLAG, LOG_INFO, |
| 236 | 239 | QString("Using Sample Spacing of %1 horizontal & %2 vertical pixels.") |
| 237 | 240 | .arg(horizSpacing).arg(vertSpacing)); |
| … |
… |
void ClassicCommDetector::ProcessFrame(VideoFrame *frame,
|
| 790 | 793 | { |
| 791 | 794 | fInfo.aspect = frameInfo[lastFrameNumber].aspect; |
| 792 | 795 | fInfo.format = frameInfo[lastFrameNumber].format; |
| | 796 | fInfo.flagMask = COMM_FRAME_SKIPPED; |
| | 797 | while (++lastFrameNumber < curFrameNumber) |
| | 798 | { |
| | 799 | // Only overwrite if there was no info for the frame yet |
| | 800 | if (!frameInfo.contains(lastFrameNumber)) |
| | 801 | frameInfo[lastFrameNumber] = fInfo; |
| | 802 | } |
| 793 | 803 | } |
| 794 | | fInfo.flagMask = COMM_FRAME_SKIPPED; |
| 795 | | |
| 796 | | lastFrameNumber++; |
| 797 | | while(lastFrameNumber < curFrameNumber) |
| 798 | | frameInfo[lastFrameNumber++] = fInfo; |
| 799 | | |
| 800 | 804 | fInfo.flagMask = 0; |
| 801 | 805 | } |
| 802 | 806 | lastFrameNumber = curFrameNumber; |
| … |
… |
void ClassicCommDetector::ProcessFrame(VideoFrame *frame,
|
| 808 | 812 | |
| 809 | 813 | if (commDetectMethod & COMM_DETECT_SCENE) |
| 810 | 814 | { |
| 811 | | sceneChangeDetector->processFrame(framePtr); |
| | 815 | sceneChangeDetector->processFrame(curFrameNumber, framePtr); |
| 812 | 816 | } |
| 813 | 817 | |
| 814 | 818 | stationLogoPresent = false; |
| … |
… |
void ClassicCommDetector::BuildAllMethodsCommList(void)
|
| 1397 | 1401 | fbp->score += 20; |
| 1398 | 1402 | } |
| 1399 | 1403 | |
| 1400 | | if ((fbp->scRate > 1.0) && |
| 1401 | | (fbp->logoCount < (fbp->frames * .90))) |
| | 1404 | if ((fbp->scRate > 0.75) && |
| | 1405 | (fbp->logoCount < (fbp->frames * .25))) |
| 1402 | 1406 | { |
| 1403 | 1407 | if (verboseDebugging) |
| 1404 | | LOG(VB_COMMFLAG, LOG_DEBUG, " scRate > 1.0, -10"); |
| | 1408 | LOG(VB_COMMFLAG, LOG_DEBUG, " scRate > 0.75, -10"); |
| 1405 | 1409 | fbp->score -= 10; |
| 1406 | 1410 | |
| 1407 | | if (fbp->scRate > 2.0) |
| | 1411 | if (fbp->scRate > 1.5) |
| 1408 | 1412 | { |
| 1409 | 1413 | if (verboseDebugging) |
| 1410 | | LOG(VB_COMMFLAG, LOG_DEBUG, " scRate > 2.0, -10"); |
| | 1414 | LOG(VB_COMMFLAG, LOG_DEBUG, " scRate > 1.5, -10"); |
| 1411 | 1415 | fbp->score -= 10; |
| 1412 | 1416 | } |
| 1413 | 1417 | } |
diff --git a/mythtv/programs/mythcommflag/ClassicSceneChangeDetector.cpp b/mythtv/programs/mythcommflag/ClassicSceneChangeDetector.cpp
index c449353..ea93b1b 100644
|
a
|
b
|
ClassicSceneChangeDetector::ClassicSceneChangeDetector(unsigned int width,
|
| 8 | 8 | unsigned int height, unsigned int commdetectborder_in, |
| 9 | 9 | unsigned int xspacing_in, unsigned int yspacing_in): |
| 10 | 10 | SceneChangeDetectorBase(width,height), |
| 11 | | frameNumber(0), |
| 12 | 11 | previousFrameWasSceneChange(false), |
| 13 | 12 | xspacing(xspacing_in), |
| 14 | 13 | yspacing(yspacing_in), |
| … |
… |
void ClassicSceneChangeDetector::deleteLater(void)
|
| 25 | 24 | SceneChangeDetectorBase::deleteLater(); |
| 26 | 25 | } |
| 27 | 26 | |
| 28 | | void ClassicSceneChangeDetector::processFrame(unsigned char* frame) |
| | 27 | void ClassicSceneChangeDetector::processFrame(unsigned int frameNumber, unsigned char* frame) |
| 29 | 28 | { |
| 30 | 29 | histogram->generateFromImage(frame, width, height, commdetectborder, |
| 31 | 30 | width-commdetectborder, commdetectborder, |
| … |
… |
void ClassicSceneChangeDetector::processFrame(unsigned char* frame)
|
| 38 | 37 | previousFrameWasSceneChange = isSceneChange; |
| 39 | 38 | |
| 40 | 39 | std::swap(histogram,previousHistogram); |
| 41 | | frameNumber++; |
| 42 | 40 | } |
| 43 | 41 | |
| 44 | 42 | /* vim: set expandtab tabstop=4 shiftwidth=4: */ |
diff --git a/mythtv/programs/mythcommflag/ClassicSceneChangeDetector.h b/mythtv/programs/mythcommflag/ClassicSceneChangeDetector.h
index f4d2200..6b4060d 100644
|
a
|
b
|
class ClassicSceneChangeDetector : public SceneChangeDetectorBase
|
| 13 | 13 | unsigned int yspacing); |
| 14 | 14 | virtual void deleteLater(void); |
| 15 | 15 | |
| 16 | | void processFrame(unsigned char* frame); |
| | 16 | void processFrame(unsigned int frameNumber, unsigned char* frame); |
| 17 | 17 | |
| 18 | 18 | private: |
| 19 | 19 | ~ClassicSceneChangeDetector() {} |
| … |
… |
class ClassicSceneChangeDetector : public SceneChangeDetectorBase
|
| 21 | 21 | private: |
| 22 | 22 | Histogram* histogram; |
| 23 | 23 | Histogram* previousHistogram; |
| 24 | | unsigned int frameNumber; |
| 25 | 24 | bool previousFrameWasSceneChange; |
| 26 | 25 | unsigned int xspacing, yspacing; |
| 27 | 26 | unsigned int commdetectborder; |
diff --git a/mythtv/programs/mythcommflag/Histogram.cpp b/mythtv/programs/mythcommflag/Histogram.cpp
index 12d2a9a..849f23b 100644
|
a
|
b
|
unsigned int Histogram::getThresholdForPercentageOfPixels(float percentage)
|
| 70 | 70 | |
| 71 | 71 | float Histogram::calculateSimilarityWith(const Histogram& other) const |
| 72 | 72 | { |
| 73 | | long similar = 0; |
| 74 | | |
| 75 | | for(unsigned int i = 0; i < 256; i++) |
| | 73 | const int proximity = 5; |
| | 74 | long similarity = 0; |
| | 75 | |
| | 76 | similarity += std::min(data[0], |
| | 77 | other.data[0]); |
| | 78 | similarity += std::min(data[0] + data[1], |
| | 79 | other.data[0] + other.data[1]); |
| | 80 | similarity += std::min(data[0] + data[1] + data[2], |
| | 81 | other.data[0] + other.data[1] + other.data[2]); |
| | 82 | |
| | 83 | for(unsigned int i = 0; i <= 256 - proximity; i++) |
| 76 | 84 | { |
| 77 | | if (data[i] < other.data[i]) |
| 78 | | similar += data[i]; |
| 79 | | else |
| 80 | | similar += other.data[i]; |
| | 85 | unsigned int mine = 0, others = 0; |
| | 86 | for (int j = 0; j < proximity; ++j) |
| | 87 | { |
| | 88 | mine += data[i+j]; |
| | 89 | others += other.data[i+j]; |
| | 90 | } |
| | 91 | similarity += std::min(mine, others); |
| 81 | 92 | } |
| 82 | | |
| 83 | | //Using c style cast for old gcc compatibility. |
| 84 | | return static_cast<float>(similar) / static_cast<float>(numberOfSamples); |
| | 93 | |
| | 94 | similarity += std::min(data[253] + data[254] + data[255], |
| | 95 | other.data[253] + other.data[254] + other.data[255]); |
| | 96 | similarity += std::min(data[254] + data[255], |
| | 97 | other.data[254] + other.data[255]); |
| | 98 | similarity += std::min(data[255], |
| | 99 | other.data[255]); |
| | 100 | |
| | 101 | return similarity / static_cast<float>(numberOfSamples * proximity); |
| 85 | 102 | } |
| 86 | 103 | |
| 87 | 104 | /* vim: set expandtab tabstop=4 shiftwidth=4: */ |
diff --git a/mythtv/programs/mythcommflag/SceneChangeDetectorBase.h b/mythtv/programs/mythcommflag/SceneChangeDetectorBase.h
index 67296d5..338c80a 100644
|
a
|
b
|
class SceneChangeDetectorBase : public QObject
|
| 11 | 11 | SceneChangeDetectorBase(unsigned int w, unsigned int h) : |
| 12 | 12 | width(w), height(h) {} |
| 13 | 13 | |
| 14 | | virtual void processFrame(unsigned char *frame) = 0; |
| | 14 | virtual void processFrame(unsigned int frameNumber, unsigned char *frame) = 0; |
| 15 | 15 | |
| 16 | 16 | signals: |
| 17 | 17 | void haveNewInformation(unsigned int framenum, bool scenechange, |