From 544ae68429cf8e7eb026d912a508e6905d76e404 Mon Sep 17 00:00:00 2001 From: wisc Date: Sun, 10 Jan 2016 14:41:47 +0100 Subject: [PATCH] test old v1+ vs new v2 Former-commit-id: 5217ac135cd0c7a6907be0097df72506ca7f2d71 --- include/blackborder/BlackBorderProcessor.h | 8 ++ libsrc/blackborder/BlackBorderProcessor.cpp | 107 ++++++++++++++++++-- 2 files changed, 105 insertions(+), 10 deletions(-) diff --git a/include/blackborder/BlackBorderProcessor.h b/include/blackborder/BlackBorderProcessor.h index 4d0c4fca..19f90d3d 100644 --- a/include/blackborder/BlackBorderProcessor.h +++ b/include/blackborder/BlackBorderProcessor.h @@ -73,6 +73,8 @@ namespace hyperion /// @return True if the current border changed else false /// bool updateBorder(const BlackBorder & newDetectedBorder); + bool updateBorder1(const BlackBorder & newDetectedBorder); + bool updateBorder2(const BlackBorder & newDetectedBorder); /// The number of unknown-borders detected before it becomes the current border const unsigned _unknownSwitchCnt; @@ -87,12 +89,18 @@ namespace hyperion BlackBorderDetector _detector; /// The current detected border + BlackBorder _currentBorder1; BlackBorder _currentBorder; /// The border detected in the previous frame + BlackBorder _previousDetectedBorder1; BlackBorder _previousDetectedBorder; /// The number of frame the previous detected border matched the incomming border + unsigned _consistentCnt1; unsigned _consistentCnt; + /// The number of frame the previous detected border NOT matched the incomming border + unsigned _inconsistentCnt1; + unsigned _inconsistentCnt; }; } // end namespace hyperion diff --git a/libsrc/blackborder/BlackBorderProcessor.cpp b/libsrc/blackborder/BlackBorderProcessor.cpp index b9c21eea..b3f1824f 100644 --- a/libsrc/blackborder/BlackBorderProcessor.cpp +++ b/libsrc/blackborder/BlackBorderProcessor.cpp @@ -1,4 +1,4 @@ -//#include +#include // Blackborder includes #include @@ -12,9 +12,14 @@ BlackBorderProcessor::BlackBorderProcessor(const unsigned unknownFrameCnt, _borderSwitchCnt(borderFrameCnt), _blurRemoveCnt(blurRemoveCnt), _detector(blackborderThreshold), + _currentBorder1({true, -1, -1}), _currentBorder({true, -1, -1}), + _previousDetectedBorder1({true, -1, -1}), _previousDetectedBorder({true, -1, -1}), - _consistentCnt(0) + _consistentCnt1(0), + _consistentCnt(0), + _inconsistentCnt1(0), + _inconsistentCnt(0) { // empty } @@ -24,23 +29,102 @@ BlackBorder BlackBorderProcessor::getCurrentBorder() const return _currentBorder; } + bool BlackBorderProcessor::updateBorder(const BlackBorder & newDetectedBorder) +{ +bool result1 = updateBorder1(newDetectedBorder); +if (result1) +{ + std::cout << "border change v1 " << _currentBorder1.horizontalSize << ":" << _currentBorder1.verticalSize << std::endl; +} + +bool result2 = updateBorder2(newDetectedBorder); +if (result2) +{ + std::cout << "border change v2 " << _currentBorder.horizontalSize << ":" << _currentBorder.verticalSize << std::endl; +} + +return result2; +} + + +bool BlackBorderProcessor::updateBorder1(const BlackBorder & newDetectedBorder) +{ + // set the consistency counter + if (newDetectedBorder == _previousDetectedBorder1) + { + ++_consistentCnt1; + } + else + { + _previousDetectedBorder1 = newDetectedBorder; + _consistentCnt1 = 0; + } + +// std::cout << "cur: " << _currentBorder1.verticalSize << " " << _currentBorder1.horizontalSize << " new: " << newDetectedBorder.verticalSize << " " << newDetectedBorder.horizontalSize << " c:i " << _consistentCnt1 << ":" << _inconsistentCnt1 << std::endl; + + // check if there is a change + if (_currentBorder1 == newDetectedBorder) + { + // No change required + return false; + } + + bool borderChanged = false; + if (newDetectedBorder.unknown) + { + // apply the unknown border if we consistently can't determine a border + if (_consistentCnt1 == _unknownSwitchCnt) + { + _currentBorder1 = newDetectedBorder; + borderChanged = true; + } + } + else + { + // apply the detected border if it has been detected consistently + if (_currentBorder1.unknown || _consistentCnt1 == _borderSwitchCnt) + { + _currentBorder1 = newDetectedBorder; + borderChanged = true; + } + else + { + bool stable = (_consistentCnt >= 10) || (_inconsistentCnt >=30 ); + // apply smaller borders immediately + if ((newDetectedBorder.verticalSize < _currentBorder1.verticalSize) && (stable)) + { + _currentBorder1.verticalSize = newDetectedBorder.verticalSize; + borderChanged = true; + } + + if ((newDetectedBorder.horizontalSize < _currentBorder1.horizontalSize) && (stable)) + { + _currentBorder1.horizontalSize = newDetectedBorder.horizontalSize; + borderChanged = true; + } + } + } + + return borderChanged; +} + +bool BlackBorderProcessor::updateBorder2(const BlackBorder & newDetectedBorder) { // set the consistency counter if (newDetectedBorder == _previousDetectedBorder) { - if (_consistentCnt < 100000) - { - ++_consistentCnt; - } + ++_consistentCnt; + _inconsistentCnt = 0; } else { _previousDetectedBorder = newDetectedBorder; _consistentCnt = 0; + ++_inconsistentCnt; } -// std::cout << "new: " << newDetectedBorder.verticalSize << " " << newDetectedBorder.horizontalSize << " cur: " << _currentBorder.verticalSize << " " << _currentBorder.horizontalSize << " cc " << _consistentCnt << std::endl; +// std::cout << "cur: " << _currentBorder.verticalSize << " " << _currentBorder.horizontalSize << " new: " << newDetectedBorder.verticalSize << " " << newDetectedBorder.horizontalSize << " c:i " << _consistentCnt << ":" << _inconsistentCnt << std::endl; // check if there is a change if (_currentBorder == newDetectedBorder) @@ -71,16 +155,19 @@ bool BlackBorderProcessor::updateBorder(const BlackBorder & newDetectedBorder) } else { + bool stable = (_consistentCnt >= 10) || (_inconsistentCnt >=30 ); + //more then A consistent seems like a new size not only a short flicker + //more then B inconsistent seems like the image is changing a lot and we need to set smaller border // apply smaller borders immediately // if (newDetectedBorder.verticalSize < _currentBorder.verticalSize) - if ( (newDetectedBorder.verticalSize < _currentBorder.verticalSize) && (_consistentCnt >= 1) )// almost immediatly - avoid switching for "abnormal" frames + if ( (newDetectedBorder.verticalSize < _currentBorder.verticalSize) && (stable) )// almost immediatly - avoid switching for "abnormal" frames { _currentBorder.verticalSize = newDetectedBorder.verticalSize; borderChanged = true; } // if (newDetectedBorder.horizontalSize < _currentBorder.horizontalSize) - if ( (newDetectedBorder.horizontalSize < _currentBorder.horizontalSize) && (_consistentCnt >= 1) ) + if ( (newDetectedBorder.horizontalSize < _currentBorder.horizontalSize) && (stable) ) { _currentBorder.horizontalSize = newDetectedBorder.horizontalSize; borderChanged = true; @@ -89,4 +176,4 @@ bool BlackBorderProcessor::updateBorder(const BlackBorder & newDetectedBorder) } return borderChanged; -} +} \ No newline at end of file