diff --git a/modules/AbsoluteFrameDifference.cpp b/modules/AbsoluteFrameDifference.cpp index edee60d..21a6021 100644 --- a/modules/AbsoluteFrameDifference.cpp +++ b/modules/AbsoluteFrameDifference.cpp @@ -50,7 +50,7 @@ Bool AbsoluteFrameDifference::create( std::vector apcFrameList ) _BASIC_MODULE_API_2_CHECK_ for( UInt i = 0; i < apcFrameList.size(); i++ ) - if( !apcFrameList[i]->haveSameFmt( apcFrameList[i], PlaYUVerFrame::MATCH_RESOLUTION | PlaYUVerFrame::MATCH_BITS) ) + if( !apcFrameList[i]->haveSameFmt( apcFrameList[i], PlaYUVerFrame::MATCH_COLOR_SPACE | PlaYUVerFrame::MATCH_RESOLUTION | PlaYUVerFrame::MATCH_BITS) ) return false; m_pcFrameDifference = new PlaYUVerFrame( apcFrameList[0]->getWidth(), apcFrameList[0]->getHeight(), PlaYUVerFrame::GRAY ); diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 3508782..0460240 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -35,7 +35,6 @@ ADD_MODULE( FilterComponentLuma "FilterComponent" ) ADD_MODULE( FilterComponentChromaU "FilterComponent" ) ADD_MODULE( FilterComponentChromaV "FilterComponent" ) ADD_MODULE( FrameDifference "FrameDifference" ) -ADD_MODULE( FrameDifference "FrameDifference9Bits" ) ADD_MODULE( AbsoluteFrameDifference "AbsoluteFrameDifference" ) ADD_MODULE( FrameBinarization "FrameBinarization" ) ADD_MODULE( FrameShift "FrameShift" ) diff --git a/modules/FrameDifference.cpp b/modules/FrameDifference.cpp index 50b6476..3120929 100644 --- a/modules/FrameDifference.cpp +++ b/modules/FrameDifference.cpp @@ -34,26 +34,49 @@ FrameDifference::FrameDifference() m_iModuleAPI = MODULE_API_2; m_iModuleType = FRAME_PROCESSING_MODULE; m_pchModuleCategory = "Measurements"; - m_pchModuleName = "FrameDifference8Bits"; + m_pchModuleName = "FrameDifference"; m_pchModuleTooltip = "Measure the difference between two images (Y plane), Y1 - Y2, with max absolute diff of 128"; - m_uiModuleRequirements = MODULE_REQUIRES_NEW_WINDOW; + m_uiModuleRequirements = MODULE_REQUIRES_NEW_WINDOW | MODULE_REQUIRES_OPTIONS; m_uiNumberOfFrames = MODULE_REQUIRES_TWO_FRAMES; + m_cModuleOptions.addOptions()/**/ + ( "Bits per pixel", m_uiBitsPixel, "Bits per pixel (use zero to avoid scaling) [0]" ); + + m_uiBitsPixel = 0; + m_pcFrameDifference = NULL; } Bool FrameDifference::create( std::vector apcFrameList ) { _BASIC_MODULE_API_2_CHECK_ - UInt bitsPixel = ( apcFrameList[0]->getBitsPel() ) & 0x0F; - m_iMaxDiffValue = ( 1 << ( bitsPixel - 1 ) ); - m_pcFrameDifference = new PlaYUVerFrame( apcFrameList[0]->getWidth(), apcFrameList[0]->getHeight(), PlaYUVerFrame::GRAY, bitsPixel ); + + UInt uiMaxBitsPixel = 0; + for( UInt i = 0; i < apcFrameList.size(); i++ ) + { + if( !apcFrameList[i]->haveSameFmt( apcFrameList[i], PlaYUVerFrame::MATCH_COLOR_SPACE | PlaYUVerFrame::MATCH_RESOLUTION ) ) + return false; + if( apcFrameList[i]->getBitsPel() > uiMaxBitsPixel ) + { + uiMaxBitsPixel = apcFrameList[i]->getBitsPel(); + } + } + + if( !m_uiBitsPixel ) + { + m_uiBitsPixel = ( uiMaxBitsPixel + 1 ) & 0x0F; + } + + m_iDiffBitShift = ( uiMaxBitsPixel + 1 ) - m_uiBitsPixel; + m_iMaxDiffValue = ( 1 << ( m_uiBitsPixel - 1 ) ); + + m_pcFrameDifference = new PlaYUVerFrame( apcFrameList[0]->getWidth(), apcFrameList[0]->getHeight(), PlaYUVerFrame::GRAY, m_uiBitsPixel ); return true; } PlaYUVerFrame* FrameDifference::process( std::vector apcFrameList ) { - Pel* pInput1PelYUV = apcFrameList[0]->getPelBufferYUV()[0][0]; + Pel* pInput1PelYUV = apcFrameList[0]->getPelBufferYUV()[0][0]; Pel* pInput2PelYUV = apcFrameList[1]->getPelBufferYUV()[0][0]; Pel* pOutputPelYUV = m_pcFrameDifference->getPelBufferYUV()[0][0]; Int aux_pel_1, aux_pel_2; @@ -65,9 +88,10 @@ PlaYUVerFrame* FrameDifference::process( std::vector apcFrameLis aux_pel_1 = *pInput1PelYUV++; aux_pel_2 = *pInput2PelYUV++; diff = aux_pel_1 - aux_pel_2; - diff = diff / 2; + diff = m_iDiffBitShift > 0 ? diff >> m_iDiffBitShift : diff << m_iDiffBitShift; diff = std::min( diff, m_iMaxDiffValue - 1 ); diff = std::max( diff, -m_iMaxDiffValue ); + diff += m_iMaxDiffValue; *pOutputPelYUV++ = diff; } diff --git a/modules/FrameDifference.h b/modules/FrameDifference.h index ce1e0f6..f5776b1 100644 --- a/modules/FrameDifference.h +++ b/modules/FrameDifference.h @@ -37,6 +37,8 @@ class FrameDifference: public PlaYUVerModuleIf REGISTER_CLASS_FACTORY( FrameDifference ) private: + UInt m_uiBitsPixel; + Int m_iDiffBitShift; Int m_iMaxDiffValue; PlaYUVerFrame* m_pcFrameDifference; diff --git a/modules/FrameDifference9Bits.cpp b/modules/FrameDifference9Bits.cpp deleted file mode 100644 index 00c0ed2..0000000 --- a/modules/FrameDifference9Bits.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* This file is a part of plaYUVer project - * Copyright (C) 2014-2015 by Luis Lucas (luisfrlucas@gmail.com) - * Joao Carreira (jfmcarreira@gmail.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/** - * \file FrameDifference9Bits.cpp - * \brief Frame Difference module - */ - -#include "FrameDifference9Bits.h" -#include - -namespace plaYUVer -{ - -FrameDifference9Bits::FrameDifference9Bits() -{ - /* Module Definition */ - m_iModuleAPI = MODULE_API_2; - m_iModuleType = FRAME_PROCESSING_MODULE; - m_pchModuleCategory = "Measurements"; - m_pchModuleName = "FrameDifference9Bits"; - m_pchModuleTooltip = "Measure the difference between two images (Y plane), Y1 - Y2, with max absolute diff of 128"; - m_uiModuleRequirements = MODULE_REQUIRES_NEW_WINDOW; - m_uiNumberOfFrames = MODULE_REQUIRES_TWO_FRAMES; - - m_pcFrameDifference9Bits = NULL; -} - -Bool FrameDifference9Bits::create( std::vector apcFrameList ) -{ - _BASIC_MODULE_API_2_CHECK_ - UInt bitsPixel = ( apcFrameList[0]->getBitsPel() + 1 ) & 0x0F; - m_iMaxDiffValue = ( 1 << ( bitsPixel - 1 ) ); - m_pcFrameDifference9Bits = new PlaYUVerFrame( apcFrameList[0]->getWidth(), apcFrameList[0]->getHeight(), PlaYUVerFrame::GRAY, bitsPixel ); - return true; -} - -PlaYUVerFrame* FrameDifference9Bits::process( std::vector apcFrameList ) -{ - Pel* pInput1PelYUV = apcFrameList[0]->getPelBufferYUV()[0][0]; - Pel* pInput2PelYUV = apcFrameList[1]->getPelBufferYUV()[0][0]; - Pel* pOutputPelYUV = m_pcFrameDifference9Bits->getPelBufferYUV()[0][0]; - Int aux_pel_1, aux_pel_2; - Int diff = 0; - - for( UInt y = 0; y < m_pcFrameDifference9Bits->getHeight(); y++ ) - for( UInt x = 0; x < m_pcFrameDifference9Bits->getWidth(); x++ ) - { - aux_pel_1 = *pInput1PelYUV++; - aux_pel_2 = *pInput2PelYUV++; - diff = aux_pel_1 - aux_pel_2; - diff = std::min( diff, m_iMaxDiffValue - 1 ); - diff = std::max( diff, -m_iMaxDiffValue ); - diff += m_iMaxDiffValue; - *pOutputPelYUV++ = diff; - } - return m_pcFrameDifference9Bits; -} - -Void FrameDifference9Bits::destroy() -{ - if( m_pcFrameDifference9Bits ) - delete m_pcFrameDifference9Bits; - m_pcFrameDifference9Bits = NULL; -} - -} // NAMESPACE - diff --git a/modules/FrameDifference9Bits.h b/modules/FrameDifference9Bits.h deleted file mode 100644 index 506d70a..0000000 --- a/modules/FrameDifference9Bits.h +++ /dev/null @@ -1,57 +0,0 @@ -/* This file is a part of plaYUVer project - * Copyright (C) 2014-2015 by Luis Lucas (luisfrlucas@gmail.com) - * Joao Carreira (jfmcarreira@gmail.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/** - * \file FrameDifference9Bits.h - * \brief Frame Difference module - */ - -#ifndef __FRAMEDIFFERENCE9BITS_H__ -#define __FRAMEDIFFERENCE9BITS_H__ - -#include "lib/PlaYUVerModuleIf.h" - -#include - -namespace plaYUVer -{ - -class FrameDifference9Bits: public PlaYUVerModuleIf -{ -REGISTER_CLASS_FACTORY( FrameDifference9Bits ) - -private: - Int m_iMaxDiffValue; - PlaYUVerFrame* m_pcFrameDifference9Bits; - -public: - FrameDifference9Bits(); - virtual ~FrameDifference9Bits() - { - } - Bool create( std::vector apcFrameList ); - PlaYUVerFrame* process( std::vector apcFrameList ); - Void destroy(); - -}; - -} // NAMESPACE - -#endif // __FRAMEDIFFERENCE9BITS_H__ - diff --git a/modules/PlaYUVerModuleFactory.cpp b/modules/PlaYUVerModuleFactory.cpp index 7454c2e..6b0e01c 100644 --- a/modules/PlaYUVerModuleFactory.cpp +++ b/modules/PlaYUVerModuleFactory.cpp @@ -41,7 +41,6 @@ PlaYUVerModuleFactory::PlaYUVerModuleFactory() Register( "FilterComponentChromaV", &FilterComponentChromaV::Create ); Register( "AbsoluteFrameDifference", &AbsoluteFrameDifference::Create ); Register( "FrameDifference", &FrameDifference::Create ); - Register( "FrameDifference9Bits", &FrameDifference9Bits::Create ); Register( "SetChromaHalfScale", &SetChromaHalfScale::Create ); Register( "FrameCrop", &FrameCrop::Create ); Register( "FrameBinarization", &FrameBinarization::Create );