shithub: openh264

Download patch

ref: 31b1c2eb7e6f47ffeaa5c82a26013b8b090d2e89
parent: c1817891b520803fca6b998e2baa28bc69405652
parent: a60af6a750ba1492b7b68352b23c1a75ad9ce257
author: Licai Guo <licaguo@cisco.com>
date: Fri Mar 28 05:21:40 EDT 2014

Merge pull request #591 from sijchen/me_merge91

[Encoder ME] add function pointer initialization

--- a/codec/encoder/core/inc/svc_motion_estimate.h
+++ b/codec/encoder/core/inc/svc_motion_estimate.h
@@ -84,7 +84,9 @@
 
 #define  COST_MVD(table, mx, my)  (table[mx] + table[my])
 
+// Function definitions below
 
+void WelsInitMeFunc( SWelsFuncPtrList* pFuncList, uint32_t uiCpuFlag, bool bScreenContent );
 
 /*!
  * \brief	BL mb motion estimate search
--- a/codec/encoder/core/inc/wels_func_ptr_def.h
+++ b/codec/encoder/core/inc/wels_func_ptr_def.h
@@ -134,11 +134,16 @@
     uint8_t*, uint8_t*);
 
 typedef void (*PMotionSearchFunc) (SWelsFuncPtrList* pFuncList, void* pCurDqLayer, void* pMe,
-                                   void* pSlice);  // here after reset all function pointers, will set as right parameter type
+                                   void* pSlice);
 typedef void (*PCalculateSatdFunc) ( PSampleSadSatdCostFunc pSatd, void * vpMe, const int32_t kiEncStride, const int32_t kiRefStride );
 typedef bool (*PCheckDirectionalMv) (PSampleSadSatdCostFunc pSad, void * vpMe,
                       const SMVUnitXY ksMinMv, const SMVUnitXY ksMaxMv, const int32_t kiEncStride, const int32_t kiRefStride,
                       int32_t& iBestSadCost);
+typedef void (*PLineFullSearchFunc) (	void *pFunc, void *vpMe,
+													uint16_t* pMvdTable, const int32_t kiFixedMvd,
+													const int32_t kiEncStride, const int32_t kiRefStride,
+													const int32_t kiMinPos, const int32_t kiMaxPos,
+                          const bool bVerticalSearch );
 
 #define     MAX_BLOCK_TYPE 5 // prev 7
 typedef struct TagSampleDealingFunc {
@@ -192,6 +197,7 @@
   pfMotionSearch; //svc_encode_slice.c svc_mode_decision.c svc_enhance_layer_md.c svc_base_layer_md.c
   PCalculateSatdFunc pfCalculateSatd;
   PCheckDirectionalMv pfCheckDirectionalMv;
+  PLineFullSearchFunc pfLineFullSearch;
 
   PCopyFunc      pfCopy16x16Aligned;		//svc_encode_slice.c svc_mode_decision.c svc_base_layer_md.c
   PCopyFunc      pfCopy16x16NotAligned;	//md.c
--- a/codec/encoder/core/src/encoder.cpp
+++ b/codec/encoder/core/src/encoder.cpp
@@ -185,6 +185,9 @@
   WelsInitFillingPredFuncs (uiCpuFlag);
   WelsInitIntraPredFuncs (pFuncList, uiCpuFlag);
 
+  /* ME func */
+  WelsInitMeFunc(pFuncList, uiCpuFlag, SCREEN_CONTENT_REAL_TIME==pParam->iUsageType);
+
   /* sad, satd, average */
   WelsInitSampleSadFunc (pFuncList, uiCpuFlag);
 
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -2515,7 +2515,6 @@
     pFuncList->pfMotionSearch  = WelsMotionEstimateSearch;
     pFuncList->pfFirstIntraMode = WelsMdFirstIntraMode;
     pFuncList->sSampleDealingFuncs.pfMeCost = pCtx->pFuncList->sSampleDealingFuncs.pfSampleSatd;
-    pFuncList->pfCheckDirectionalMv = CheckDirectionalMvFalse;
     if (kbHighestSpatialLayer) {
       pFuncList->pfCalculateSatd = NotCalculateSatdCost;
       pFuncList->pfInterFineMd = WelsMdInterFinePartitionVaa;
--- a/codec/encoder/core/src/svc_motion_estimate.cpp
+++ b/codec/encoder/core/src/svc_motion_estimate.cpp
@@ -38,7 +38,7 @@
  *************************************************************************************
  */
 
-
+#include "cpu_core.h"
 #include "sample.h"
 #include "svc_motion_estimate.h"
 
@@ -58,7 +58,20 @@
     pMe->uiSatdCost = pMe->uiSadCost;
 }
 
+void WelsInitMeFunc( SWelsFuncPtrList* pFuncList, uint32_t uiCpuFlag, bool bScreenContent ) {
+  if (!bScreenContent) {
+    pFuncList->pfCheckDirectionalMv = CheckDirectionalMvFalse;
+  } else {
+    pFuncList->pfCheckDirectionalMv = CheckDirectionalMv;
 
+    //for cross serarch
+    pFuncList->pfLineFullSearch = LineFullSearch_c;
+    pFuncList->pfLineFullSearch = LineFullSearch_c;
+    if ( uiCpuFlag & WELS_CPU_SSE41 ) {
+    }
+  }
+}
+
 /*!
  * \brief	BL mb motion estimate search
  *
@@ -234,22 +247,21 @@
   pMe->pRefMb = pRefMb;
 }
 
-void CalculateSatdCost( PSampleSadSatdCostFunc pSatd, void * vpMe, const int32_t kiEncStride, const int32_t kiRefStride )
-{
+void CalculateSatdCost( PSampleSadSatdCostFunc pSatd, void * vpMe,
+                       const int32_t kiEncStride, const int32_t kiRefStride ) {
   SWelsME* pMe						 = static_cast<SWelsME *>(vpMe);
   pMe->uSadPredISatd.uiSatd = pSatd(pMe->pEncMb, kiEncStride, pMe->pRefMb, kiRefStride);
   pMe->uiSatdCost = pMe->uSadPredISatd.uiSatd + COST_MVD (pMe->pMvdCost, pMe->sMv.iMvX - pMe->sMvp.iMvX,
                                                             pMe->sMv.iMvY - pMe->sMvp.iMvY);
 }
-void NotCalculateSatdCost( PSampleSadSatdCostFunc pSatd, void * vpMe, const int32_t kiEncStride, const int32_t kiRefStride )
-{
+void NotCalculateSatdCost( PSampleSadSatdCostFunc pSatd, void * vpMe,
+                          const int32_t kiEncStride, const int32_t kiRefStride ) {
 }
 
 
 bool CheckDirectionalMv(PSampleSadSatdCostFunc pSad, void * vpMe,
                       const SMVUnitXY ksMinMv, const SMVUnitXY ksMaxMv, const int32_t kiEncStride, const int32_t kiRefStride,
-                      int32_t& iBestSadCost)
-{
+                      int32_t& iBestSadCost) {
   SWelsME* pMe						 = static_cast<SWelsME *>(vpMe);
   const int16_t kiMvX = pMe->sDirectionalMv.iMvX;
   const int16_t kiMvY = pMe->sDirectionalMv.iMvY;
@@ -257,13 +269,11 @@
   //Check MV from scrolling detection
   if ( (BLOCK_16x16!=pMe->uiBlockSize) //scrolled_MV with P16x16 is checked SKIP checking function
     && ( kiMvX | kiMvY ) //(0,0) checked in ordinary initial point checking
-    && CheckMvInRange( pMe->sDirectionalMv, ksMinMv, ksMaxMv ) )
-  {
+    && CheckMvInRange( pMe->sDirectionalMv, ksMinMv, ksMaxMv ) ) {
     uint8_t* pRef = &pMe->pColoRefMb[kiMvY * kiRefStride + kiMvX];
     uint32_t uiCurrentSadCost = pSad( pMe->pEncMb, kiEncStride,  pRef, kiRefStride ) +
       COST_MVD(pMe->pMvdCost, (kiMvX<<2) - pMe->sMvp.iMvX, (kiMvY<<2) - pMe->sMvp.iMvY );
-    if( uiCurrentSadCost < pMe->uiSadCost )
-    {
+    if( uiCurrentSadCost < pMe->uiSadCost ) {
       iBestSadCost = uiCurrentSadCost;
       return true;
     }
@@ -273,8 +283,7 @@
 
 bool CheckDirectionalMvFalse(PSampleSadSatdCostFunc pSad, void * vpMe,
                       const SMVUnitXY ksMinMv, const SMVUnitXY ksMaxMv, const int32_t kiEncStride, const int32_t kiRefStride,
-                      int32_t& iBestSadCost)
-{
+                      int32_t& iBestSadCost) {
   return false;
 }
 
@@ -282,8 +291,7 @@
 														uint16_t* pMvdTable, const int32_t kiFixedMvd,
 														const int32_t kiEncStride, const int32_t kiRefStride,
 													const int32_t kiMinPos, const int32_t kiMaxPos,
-                          const bool bVerticalSearch )
-{
+                          const bool bVerticalSearch ) {
   SWelsFuncPtrList *pFuncList      = static_cast<SWelsFuncPtrList *>(pFunc);
   SWelsME *pMe				                    = static_cast<SWelsME *>(vpMe);
 }
@@ -291,8 +299,7 @@
 													uint16_t* pMvdTable, const int32_t kiFixedMvd,
 													const int32_t kiEncStride, const int32_t kiRefStride,
 													const int32_t kiMinPos, const int32_t kiMaxPos,
-                          const bool bVerticalSearch )
-{
+                          const bool bVerticalSearch ) {
   SWelsFuncPtrList *pFuncList      = static_cast<SWelsFuncPtrList *>(pFunc);
   SWelsME *pMe				                    = static_cast<SWelsME *>(vpMe);
   PSampleSadSatdCostFunc pSad = pFuncList->sSampleDealingFuncs.pfSampleSad[pMe->uiBlockSize];
@@ -323,11 +330,9 @@
 }
 
 void WelsMotionCrossSearch(SWelsFuncPtrList *pFuncList,  SDqLayer* pCurLayer, SWelsME * pMe,
-											const SSlice* pSlice)
-{
-  //TODO:
-  //PMOTION_VERFULL_SEARCH VerticalFullSearchFunc	= pFuncList->VerticalFullSearch_c;
-  //PMOTION_HORFULL_SEARCH HorizontalFullSearchFunc	= pFuncList->HorizontalFullSearch_c;
+											const SSlice* pSlice) {
+  PLineFullSearchFunc pfVerticalFullSearchFunc	= pFuncList->pfLineFullSearch;
+  PLineFullSearchFunc pfHorizontalFullSearchFunc	= pFuncList->pfLineFullSearch;
   const int32_t kiEncStride = pCurLayer->iEncStride[0];
   const int32_t kiRefStride = pCurLayer->pRefPic->iLineSize[0];
 
@@ -339,7 +344,7 @@
   uint16_t* pMvdCostY = pMe->pMvdCost - iCurMeBlockQpelPixY - pMe->sMvp.iMvY;//do the offset here instead of in the search
 
   //vertical search
-  LineFullSearch_c( pFuncList, pMe,
+  pfVerticalFullSearchFunc( pFuncList, pMe,
     pMvdCostY, pMvdCostX[ iCurMeBlockQpelPixX ],
     kiEncStride, kiRefStride,
     iCurMeBlockPixY + pSlice->sMvStartMin.iMvY,
@@ -347,7 +352,7 @@
 
   //horizontal search
   if (pMe->uiSadCost >= pMe->uiSadCostThreshold) {
-    LineFullSearch_c( pFuncList, pMe,
+    pfHorizontalFullSearchFunc( pFuncList, pMe,
       pMvdCostX, pMvdCostY[ iCurMeBlockQpelPixY ],
       kiEncStride, kiRefStride,
       iCurMeBlockPixX + pSlice->sMvStartMin.iMvX,