shithub: openh264

Download patch

ref: a758282ee70f834f1ce5f2a4c17e8da97ddbe774
parent: 3689361da1b7e39c1e19e1eb8a01b5c2e3f19761
parent: 21c74fe8ba807ba3c4788e94a9fc1d9519040a3a
author: sijchen <sijchen@cisco.com>
date: Wed Apr 9 09:56:24 EDT 2014

Merge pull request #635 from lyao2/new_scroll_dev

add scroll detection files

--- a/codec/processing/build/win32/WelsVP_2008.vcproj
+++ b/codec/processing/build/win32/WelsVP_2008.vcproj
@@ -802,6 +802,26 @@
 				>
 			</File>
 		</Filter>
+		<Filter
+			Name="scrolldetection"
+			>
+			<File
+				RelativePath="..\..\src\scrolldetection\ScrollDetection.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\scrolldetection\ScrollDetection.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\scrolldetection\ScrollDetectionFuncs.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\scrolldetection\ScrollDetectionFuncs.h"
+				>
+			</File>
+		</Filter>
 	</Files>
 	<Globals>
 	</Globals>
--- a/codec/processing/interface/IWelsVP.h
+++ b/codec/processing/interface/IWelsVP.h
@@ -131,6 +131,7 @@
   METHOD_COMPLEXITY_ANALYSIS   ,
   METHOD_COMPLEXITY_ANALYSIS_SCREEN,
   METHOD_IMAGE_ROTATE		  ,
+  METHOD_SCROLL_DETECTION,
   METHOD_MASK
 } EMethods;
 
@@ -137,6 +138,13 @@
 //-----------------------------------------------------------------//
 //  Algorithm parameters define
 //-----------------------------------------------------------------//
+typedef struct{
+  SRect sMaskRect;
+  bool bMaskInfoAvailable;
+  int iScrollMvX;
+  int iScrollMvY;
+  bool bScrollDetectFlag; // 0:false ; 1:ltr; 2: scene change
+} SScrollDetectionParam;
 
 typedef enum {
   SIMILAR_SCENE,   //similar scene
--- a/codec/processing/src/common/WelsFrameWork.cpp
+++ b/codec/processing/src/common/WelsFrameWork.cpp
@@ -33,6 +33,7 @@
 #include "WelsFrameWork.h"
 #include "../denoise/denoise.h"
 #include "../downsample/downsample.h"
+#include "../scrolldetection/ScrollDetection.h"
 #include "../scenechangedetection/SceneChangeDetection.h"
 #include "../vaacalc/vaacalculation.h"
 #include "../backgrounddetection/BackgroundDetection.h"
@@ -265,6 +266,9 @@
   case METHOD_DENOISE:
     pStrategy = WelsDynamicCast (IStrategy*, new CDenoiser (iCpuFlag));
     break;
+  case METHOD_SCROLL_DETECTION:
+	pStrategy = WelsDynamicCast (IStrategy*, new CScrollDetection(iCpuFlag));
+	break;
   case METHOD_SCENE_CHANGE_DETECTION_VIDEO:
   case METHOD_SCENE_CHANGE_DETECTION_SCREEN:
     pStrategy = BuildSceneChangeDetection(m_eMethod, iCpuFlag);
--- a/codec/processing/src/scenechangedetection/SceneChangeDetection.h
+++ b/codec/processing/src/scenechangedetection/SceneChangeDetection.h
@@ -28,16 +28,16 @@
  *     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  *     POSSIBILITY OF SUCH DAMAGE.
  *
-* \file	        :  SceneChangeDetection.h
-*
-* \brief	    :  scene change detection class of wels video processor class
-*
-* \date         :  2011/03/14
-*
-* \description  :  1. rewrite the package code of scene change detection class
-*
-*************************************************************************************
-*/
+ * \file	        :  SceneChangeDetection.h
+ *
+ * \brief	    :  scene change detection class of wels video processor class
+ *
+ * \date         :  2011/03/14
+ *
+ * \description  :  1. rewrite the package code of scene change detection class
+ *
+ *************************************************************************************
+ */
 
 #ifndef WELSVP_SCENECHANGEDETECTION_H
 #define WELSVP_SCENECHANGEDETECTION_H
--- /dev/null
+++ b/codec/processing/src/scrolldetection/ScrollDetection.cpp
@@ -1,0 +1,119 @@
+/*!
+ * \copy
+ *     Copyright (c)  2009-2013, Cisco Systems
+ *     All rights reserved.
+ *
+ *     Redistribution and use in source and binary forms, with or without
+ *     modification, are permitted provided that the following conditions
+ *     are met:
+ *
+ *        * Redistributions of source code must retain the above copyright
+ *          notice, this list of conditions and the following disclaimer.
+ *
+ *        * Redistributions in binary form must reproduce the above copyright
+ *          notice, this list of conditions and the following disclaimer in
+ *          the documentation and/or other materials provided with the
+ *          distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ *     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ *     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ *     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ *     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *     POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+
+#include "ScrollDetection.h"
+#include "ScrollDetectionFuncs.h"
+#include "cpu.h"
+
+WELSVP_NAMESPACE_BEGIN
+
+EResult CScrollDetection::Process(int32_t iType, SPixMap* pSrcPixMap, SPixMap* pRefPixMap){
+  if (pRefPixMap->pPixel[0] == NULL || pRefPixMap->pPixel[1] == NULL || pRefPixMap->pPixel[2] == NULL
+    || pSrcPixMap->pPixel[0] == NULL || pSrcPixMap->pPixel[1] == NULL || pSrcPixMap->pPixel[2] == NULL
+    || pRefPixMap->sRect.iRectWidth != pSrcPixMap->sRect.iRectWidth || pRefPixMap->sRect.iRectHeight != pSrcPixMap->sRect.iRectHeight){
+  return RET_INVALIDPARAM;
+  }
+
+  if (!m_sScrollDetectionParam.bMaskInfoAvailable)
+    ScrollDetectionWithoutMask(pSrcPixMap, pRefPixMap);
+  else
+    ScrollDetectionWithMask(pSrcPixMap, pRefPixMap);
+
+  return RET_SUCCESS;
+}
+
+EResult CScrollDetection::Set(int32_t iType, void *pParam){
+  if( pParam == NULL ){
+    return RET_INVALIDPARAM;
+  }
+  m_sScrollDetectionParam = *((SScrollDetectionParam*)pParam);
+  return RET_SUCCESS;
+}
+
+EResult CScrollDetection::Get(int32_t iType, void *pParam){
+  if( pParam == NULL ){
+    return RET_INVALIDPARAM;
+  }
+  *((SScrollDetectionParam*)pParam) = m_sScrollDetectionParam;
+  return RET_SUCCESS;
+}
+
+void CScrollDetection::ScrollDetectionWithMask(SPixMap* pSrcPixMap, SPixMap* pRefPixMap) {
+  int32_t iStartX, iStartY, iWidth, iHeight;
+
+  iStartX = m_sScrollDetectionParam.sMaskRect.iRectLeft;
+  iStartY = m_sScrollDetectionParam.sMaskRect.iRectTop;
+  iWidth = m_sScrollDetectionParam.sMaskRect.iRectWidth;
+  iHeight = m_sScrollDetectionParam.sMaskRect.iRectHeight;
+
+  iWidth /= 2;
+  iStartX += iWidth/2;
+
+  m_sScrollDetectionParam.iScrollMvX = 0;
+  m_sScrollDetectionParam.iScrollMvY = 0;
+  m_sScrollDetectionParam.bScrollDetectFlag = false;
+
+  if(iStartX >= 0 && iWidth > MINIMUM_DETECT_WIDTH && iHeight > 2 * CHECK_OFFSET){
+    ScrollDetectionCore(pSrcPixMap, pRefPixMap,iWidth, iHeight, iStartX, iStartY, m_sScrollDetectionParam);
+  }
+}
+
+void CScrollDetection::ScrollDetectionWithoutMask(SPixMap* pSrcPixMap, SPixMap* pRefPixMap){
+  int32_t iStartX, iStartY, iWidth, iHeight;
+
+  const int32_t kiPicBorderWidth= pSrcPixMap->sRect.iRectHeight>>4;
+  const int32_t kiRegionWidth = (int) (pSrcPixMap->sRect.iRectWidth-(kiPicBorderWidth<<1))/3;
+  const int32_t kiRegionHeight = (pSrcPixMap->sRect.iRectHeight*7)>>3;
+  const int32_t kiHieghtStride = (int) pSrcPixMap->sRect.iRectHeight*5/24;
+
+  for (int32_t i=0; i< REGION_NUMBER;i++){
+    iStartX = kiPicBorderWidth+(i%3)*kiRegionWidth;
+    iStartY = -pSrcPixMap->sRect.iRectHeight*7/48+ (int)(i/3)*(kiHieghtStride);
+    iWidth = kiRegionWidth;
+    iHeight = kiRegionHeight;
+
+    iWidth /= 2;
+    iStartX += iWidth/2;
+
+    m_sScrollDetectionParam.iScrollMvX = 0;
+    m_sScrollDetectionParam.iScrollMvY = 0;
+    m_sScrollDetectionParam.bScrollDetectFlag = false;
+
+    ScrollDetectionCore(pSrcPixMap, pRefPixMap, iWidth, iHeight, iStartX, iStartY, m_sScrollDetectionParam);
+
+    if (m_sScrollDetectionParam.bScrollDetectFlag && m_sScrollDetectionParam.iScrollMvY)
+      break;
+  }
+}
+
+WELSVP_NAMESPACE_END
\ No newline at end of file
--- /dev/null
+++ b/codec/processing/src/scrolldetection/ScrollDetection.h
@@ -1,0 +1,73 @@
+/*!
+ * \copy
+ *     Copyright (c)  2009-2013, Cisco Systems
+ *     All rights reserved.
+ *
+ *     Redistribution and use in source and binary forms, with or without
+ *     modification, are permitted provided that the following conditions
+ *     are met:
+ *
+ *        * Redistributions of source code must retain the above copyright
+ *          notice, this list of conditions and the following disclaimer.
+ *
+ *        * Redistributions in binary form must reproduce the above copyright
+ *          notice, this list of conditions and the following disclaimer in
+ *          the documentation and/or other materials provided with the
+ *          distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ *     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ *     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ *     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ *     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *     POSSIBILITY OF SUCH DAMAGE.
+ *
+ * \file	        :  ScrollDectection.h
+ *
+ * \brief	    :  scroll detection class of wels video processor class
+ *
+ * \date         :  2011/04/26
+ *
+ * \description  :  rewrite the package code of scroll detection class
+ *
+ *************************************************************************************
+ */
+
+#include "util.h"
+#include "memory.h"
+#include "WelsFrameWork.h"
+#include "IWelsVP.h"
+
+WELSVP_NAMESPACE_BEGIN
+
+#ifdef HAVE_MMX
+WELSVP_EXTERN_C_BEGIN
+WELSVP_EXTERN_C_END
+#endif
+
+class CScrollDetection : public IStrategy{
+public:
+  CScrollDetection(int32_t iCpuFlag){
+    m_eMethod = METHOD_SCROLL_DETECTION;
+    WelsMemset (&m_sScrollDetectionParam, 0, sizeof (m_sScrollDetectionParam));
+  };
+  ~CScrollDetection(){
+  }
+  EResult Process(int32_t iType, SPixMap* pSrcPixMap, SPixMap* pRefPixMap);
+  EResult Set(int32_t iType, void *pParam);
+  EResult Get(int32_t iType, void *pParam);
+
+private:
+  void ScrollDetectionWithMask(SPixMap* pSrcPixMap, SPixMap* pRefPixMap);
+  void ScrollDetectionWithoutMask(SPixMap* pSrcPixMap, SPixMap* pRefPixMap);
+private:
+  SScrollDetectionParam m_sScrollDetectionParam;
+};
+
+WELSVP_NAMESPACE_END
--- /dev/null
+++ b/codec/processing/src/scrolldetection/ScrollDetectionFuncs.cpp
@@ -1,0 +1,202 @@
+/*!
+ * \copy
+ *     Copyright (c)  2009-2013, Cisco Systems
+ *     All rights reserved.
+ *
+ *     Redistribution and use in source and binary forms, with or without
+ *     modification, are permitted provided that the following conditions
+ *     are met:
+ *
+ *        * Redistributions of source code must retain the above copyright
+ *          notice, this list of conditions and the following disclaimer.
+ *
+ *        * Redistributions in binary form must reproduce the above copyright
+ *          notice, this list of conditions and the following disclaimer in
+ *          the documentation and/or other materials provided with the
+ *          distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ *     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ *     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ *     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ *     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *     POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "ScrollDetection.h"
+#include "ScrollDetectionFuncs.h"
+
+WELSVP_NAMESPACE_BEGIN
+
+int32_t CheckLine(uint8_t* pData, int32_t iWidth){
+  int32_t iQualified = 0;
+  int32_t iColorMap[8] = {0};
+  int32_t iChangedTimes = 0;
+  int32_t iColorCounts = 0;
+
+  RECORD_COLOR(pData[0], iColorMap);
+
+  for (int32_t i=1; i<iWidth; i++){
+    RECORD_COLOR(pData[i], iColorMap);
+    iChangedTimes += (pData[i] != pData[i-1]);
+  }
+  for (int32_t i=0; i<8; i++)
+    for (int32_t j=0; j<32; j++)
+      iColorCounts += ((iColorMap[i] >> j)&1);
+
+  switch(iColorCounts){
+  case 1:
+    iQualified = 0;
+    break;
+  case 2:
+  case 3:
+    iQualified = (iChangedTimes > 3);
+    break;
+  default:
+    iQualified = 1;
+    break;
+  }
+  return iQualified;
+}
+
+int32_t SelectTestLine(uint8_t* pY, int32_t iWidth, int32_t iHeight, int32_t iPicHeight,
+                       int32_t iStride, int32_t iOffsetX, int32_t iOffsetY){
+  const int32_t kiHalfHeight	= iHeight >> 1;
+  const int32_t kiMidPos		= iOffsetY + kiHalfHeight;
+  int32_t TestPos			= kiMidPos;
+  int32_t iOffsetAbs;
+  uint8_t* pTmp;
+
+  for (iOffsetAbs = 0; iOffsetAbs < kiHalfHeight; iOffsetAbs++){
+    TestPos = kiMidPos + iOffsetAbs;
+    if (TestPos < iPicHeight){
+      pTmp = pY + TestPos * iStride + iOffsetX;
+      if (CheckLine(pTmp, iWidth)) break;
+    }
+    TestPos = kiMidPos - iOffsetAbs;
+    if(TestPos >=0){
+      pTmp = pY + TestPos * iStride + iOffsetX;
+      if (CheckLine(pTmp, iWidth)) break;
+    }
+  }
+  if (iOffsetAbs == kiHalfHeight)
+    TestPos = -1;
+  return TestPos;
+}
+
+/*
+ * compare pixel line between previous and current one
+ * return: 0 for totally equal, otherwise 1
+ */
+int32_t CompareLine(uint8_t *pYSrc, uint8_t *pYRef, const int32_t kiWidth)
+{
+  int32_t iCmp = 1;
+
+  if ( *((int32_t*)pYSrc) != *((int32_t*)pYRef)) return 1;
+  if ( *((int32_t*)(pYSrc + 4)) != *((int32_t*)(pYRef + 4))) return 1;
+  if ( *((int32_t*)(pYSrc + 8)) != *((int32_t*)(pYRef + 8))) return 1;
+  if ( kiWidth > 12 )
+    iCmp = WelsMemcmp(pYSrc+12, pYRef+12, kiWidth-12);
+  return iCmp;
+}
+
+void ScrollDetectionCore(SPixMap* pSrcPixMap, SPixMap* pRefPixMap, int32_t iWidth, int32_t iHeight,
+                         int32_t iOffsetX, int32_t iOffsetY, SScrollDetectionParam &sScrollDetectionParam){
+  bool bScrollDetected = 0;
+  uint8_t* pYLine;
+  uint8_t* pYTmp;
+  int32_t iTestPos, iSearchPos = 0, iOffsetAbs, iMaxAbs;
+  int32_t iPicHeight = pRefPixMap->sRect.iRectHeight;
+  int32_t iMinHeight = WELS_MAX(iOffsetY,0);
+  int32_t iMaxHeight = WELS_MIN(iOffsetY + iHeight - 1, iPicHeight-1) ;//offset_y + height - 1;//
+  uint8_t* pYRef, *pYSrc;
+  int32_t iYStride;
+
+  pYRef = (uint8_t*)pRefPixMap->pPixel[0];
+  pYSrc = (uint8_t*)pSrcPixMap->pPixel[0];
+  iYStride = pRefPixMap->iStride[0];
+
+  iTestPos = SelectTestLine(pYSrc, iWidth, iHeight, iPicHeight, iYStride, iOffsetX, iOffsetY);
+
+  if (iTestPos == -1){
+    sScrollDetectionParam.bScrollDetectFlag = 0;
+    return;
+  }
+  pYLine = pYSrc + iYStride * iTestPos + iOffsetX;
+  iMaxAbs = WELS_MIN(WELS_MAX(iTestPos-iMinHeight-1, iMaxHeight-iTestPos),MAX_SCROLL_MV_Y);
+  iSearchPos = iTestPos;
+  for (iOffsetAbs = 0; iOffsetAbs <= iMaxAbs; iOffsetAbs++){
+    iSearchPos = iTestPos + iOffsetAbs;
+    if (iSearchPos <= iMaxHeight){
+      pYTmp = pYRef + iSearchPos * iYStride + iOffsetX;
+      if (!CompareLine(pYLine, pYTmp, iWidth)){
+        uint8_t *pYUpper, *pYLineUpper;
+        int32_t iCheckedLines;
+        int32_t iLowOffset = WELS_MIN(iMaxHeight - iSearchPos, CHECK_OFFSET);
+        int32_t i;
+
+        iCheckedLines = WELS_MIN(iTestPos - iMinHeight + iLowOffset, 2 * CHECK_OFFSET);
+        pYUpper = pYTmp - (iCheckedLines - iLowOffset) * iYStride;
+        pYLineUpper = pYLine - (iCheckedLines - iLowOffset) * iYStride;
+
+        for(i = 0; i < iCheckedLines; i ++){
+          if (CompareLine(pYLineUpper, pYUpper, iWidth)){
+            break;
+          }
+          pYUpper += iYStride;
+          pYLineUpper += iYStride;
+        }
+        if (i == iCheckedLines){
+          bScrollDetected=1;
+          break;
+        }
+      }
+    }
+
+    iSearchPos = iTestPos - iOffsetAbs-1;
+    if (iSearchPos >= iMinHeight){
+      pYTmp = pYRef + iSearchPos * iYStride + iOffsetX;
+      if (!CompareLine(pYLine, pYTmp, iWidth))
+      {
+        uint8_t *pYUpper, *pYLineUpper;
+        int32_t iCheckedLines;
+        int32_t iUpOffset = WELS_MIN(iSearchPos - iMinHeight, CHECK_OFFSET);
+        int32_t i;
+
+        pYUpper = pYTmp - iUpOffset * iYStride;
+        pYLineUpper = pYLine - iUpOffset * iYStride;
+        iCheckedLines = WELS_MIN(iMaxHeight - iTestPos + iUpOffset, 2 * CHECK_OFFSET);
+
+        for(i = 0; i < iCheckedLines; i ++){
+          if (CompareLine(pYLineUpper,pYUpper, iWidth)){
+            break;
+          }
+          pYUpper += iYStride;
+          pYLineUpper += iYStride;
+        }
+        if (i == iCheckedLines){
+          bScrollDetected=1;
+          break;
+        }
+      }
+    }
+  }
+
+  if (!bScrollDetected){
+    sScrollDetectionParam.bScrollDetectFlag = 0;
+  }
+  else{
+    sScrollDetectionParam.bScrollDetectFlag = 1;
+    sScrollDetectionParam.iScrollMvY = iSearchPos - iTestPos; // pre_pos - cur_pos, change to mv
+    sScrollDetectionParam.iScrollMvX = 0;
+  }
+}
+
+WELSVP_NAMESPACE_END
\ No newline at end of file
--- /dev/null
+++ b/codec/processing/src/scrolldetection/ScrollDetectionFuncs.h
@@ -1,0 +1,61 @@
+/*!
+ * \copy
+ *     Copyright (c)  2009-2013, Cisco Systems
+ *     All rights reserved.
+ *
+ *     Redistribution and use in source and binary forms, with or without
+ *     modification, are permitted provided that the following conditions
+ *     are met:
+ *
+ *        * Redistributions of source code must retain the above copyright
+ *          notice, this list of conditions and the following disclaimer.
+ *
+ *        * Redistributions in binary form must reproduce the above copyright
+ *          notice, this list of conditions and the following disclaimer in
+ *          the documentation and/or other materials provided with the
+ *          distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ *     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ *     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ *     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ *     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *     POSSIBILITY OF SUCH DAMAGE.
+ *
+ * \file	        :  ScrollDetectionFuncs.h
+ *
+ * \brief	    :  scroll detection class of wels video processor class
+ *
+ * \date         :  2011/04/26
+ *
+ * \description  :  rewrite the package code of scroll detection class
+ *
+ *************************************************************************************
+ */
+
+WELSVP_NAMESPACE_BEGIN
+
+#define MINIMUM_DETECT_WIDTH 50  // no less than 16
+#define CHECK_OFFSET 25
+#define MAX_SCROLL_MV_Y 511
+#define REGION_NUMBER 9
+#define RECORD_COLOR(a, x)	\
+{	\
+  int32_t _t = (uint8_t)(a);	\
+  x[_t>>5] |= (1 << (_t&31)); \
+}
+
+int32_t CheckLine(uint8_t* pData, int32_t iWidth);
+int32_t SelectTestLine(uint8_t* pY, int32_t iWidth, int32_t iHeight, int32_t iPicHeight,
+                       int32_t iStride, int32_t iOffsetX, int32_t iOffsetY);
+int32_t CompareLine(uint8_t *pYSrc, uint8_t *pYRef, const int32_t kiWidth);
+void ScrollDetectionCore(SPixMap* pSrcPixMap, SPixMap* pRefPixMap, int32_t iWidth, int32_t iHeight,
+                         int32_t iOffsetX, int32_t iOffsetY, SScrollDetectionParam &sScrollDetectionParam);
+
+WELSVP_NAMESPACE_END
\ No newline at end of file
--- a/codec/processing/targets.mk
+++ b/codec/processing/targets.mk
@@ -14,6 +14,8 @@
 	$(PROCESSING_SRCDIR)/src/imagerotate/imagerotate.cpp\
 	$(PROCESSING_SRCDIR)/src/imagerotate/imagerotatefuncs.cpp\
 	$(PROCESSING_SRCDIR)/src/scenechangedetection/SceneChangeDetection.cpp\
+	$(PROCESSING_SRCDIR)/src/scrolldetection/ScrollDetection.cpp\
+	$(PROCESSING_SRCDIR)/src/scrolldetection/ScrollDetectionFuncs.cpp\
 	$(PROCESSING_SRCDIR)/src/vaacalc/vaacalcfuncs.cpp\
 	$(PROCESSING_SRCDIR)/src/vaacalc/vaacalculation.cpp\