shithub: openh264

Download patch

ref: d809a7981bf8d2d975228ddf1c419f8bb6d126e3
parent: 88fded255aebe00098895f4f9d750370ecc7697e
author: sijchen <sijchen@cisco.com>
date: Thu Mar 13 06:18:01 EDT 2014

mv range setting refactor

--- a/codec/encoder/core/inc/svc_motion_estimate.h
+++ b/codec/encoder/core/inc/svc_motion_estimate.h
@@ -130,5 +130,16 @@
 bool WelsMeSadCostSelect (int32_t* pSadCost, const uint16_t* kpMvdCost, int32_t* pBestCost, const int32_t kiDx,
                             const int32_t kiDy, int32_t* pIx, int32_t* pIy);
 
+inline void SetMvWithinMvRange( const int32_t kiMbWidth, const int32_t kiMbHeight, const int32_t kiMbX, const int32_t kiMbY,
+                        const int32_t kiMaxMvRange,
+                        SMVUnitXY* pMvMin, SMVUnitXY* pMvMax)
+{
+  pMvMin->iMvX = WELS_MAX(-1*((kiMbX + 1)<<4) + INTPEL_NEEDED_MARGIN, -1*kiMaxMvRange);
+  pMvMin->iMvY = WELS_MAX(-1*((kiMbY + 1)<<4) + INTPEL_NEEDED_MARGIN, -1*kiMaxMvRange);
+  pMvMax->iMvX = WELS_MIN( ((kiMbWidth - kiMbX)<<4) - INTPEL_NEEDED_MARGIN, kiMaxMvRange);
+  pMvMax->iMvY = WELS_MIN( ((kiMbHeight - kiMbY)<<4) - INTPEL_NEEDED_MARGIN, kiMaxMvRange);
+}
+
+
 }
 #endif
--- a/codec/encoder/core/src/svc_base_layer_md.cpp
+++ b/codec/encoder/core/src/svc_base_layer_md.cpp
@@ -359,18 +359,7 @@
   ST32 (&pCurMb->sP16x16Mv, 0);
   ST32 (&pCurLayer->pDecPic->sMvList[kiMbXY], 0);
 
-  pSlice->sMvMin.iMvX = -16 * (kiMbX + 1) + INTPEL_NEEDED_MARGIN;
-  if (pSlice->sMvMin.iMvX < -MV_RANGE)
-    pSlice->sMvMin.iMvX = -MV_RANGE;
-  pSlice->sMvMin.iMvY = -16 * (kiMbY + 1) + INTPEL_NEEDED_MARGIN;
-  if (pSlice->sMvMin.iMvY < -MV_RANGE)
-    pSlice->sMvMin.iMvY = -MV_RANGE;
-  pSlice->sMvMax.iMvX = 16 * (kiMbWidth - kiMbX) - INTPEL_NEEDED_MARGIN;
-  if (pSlice->sMvMax.iMvX > MV_RANGE)
-    pSlice->sMvMax.iMvX = MV_RANGE;
-  pSlice->sMvMax.iMvY = 16 * (kiMbHeight - kiMbY) - INTPEL_NEEDED_MARGIN;
-  if (pSlice->sMvMax.iMvY > MV_RANGE)
-    pSlice->sMvMax.iMvY = MV_RANGE;
+  SetMvWithinMvRange( kiMbWidth, kiMbHeight, kiMbX, kiMbY, MV_RANGE, &(pSlice->sMvMin), &(pSlice->sMvMax));
 }
 
 int32_t WelsMdI16x16 (SWelsFuncPtrList* pFunc, SDqLayer* pCurDqLayer, SMbCache* pMbCache, int32_t iLambda) {