blob: 6611a37d66d5bf9685c08e15ba6ecc5cf2a9df77 [file] [log] [blame]
/*
* Copyright (C) 2007-2008 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/**
*
* File Name: armVCM4P10_CompareMotionCostToMV.c
* OpenMAX DL: v1.0.2
* Revision: 9641
* Date: Thursday, February 7, 2008
*
*
*
*
* Description:
* Contains module for comparing motion vectors and SAD's to decide
* the best MV and SAD
*
*/
#include "omxtypes.h"
#include "armOMX.h"
#include "armVC.h"
#include "armCOMM.h"
/**
* Function: armVCM4P10_ExpGolBitsUsed
*
* Description:
* Performs calculating Exp-Golomb code length for a given values
*
* Remarks:
*
* Parameters:
* [in] val Signed number for which Exp-Golomb code length has
* to be calculated
*
* Return Value:
* Returns the length of the Exp-Golomb code for val
*/
static OMX_U16 armVCM4P10_ExpGolBitsUsed (OMX_S16 val)
{
OMX_U16 sizeCodeNum, codeNum;
/* Mapping val to codeNum */
codeNum = armAbs (val);
if (val > 0)
{
codeNum = (2 * codeNum) - 1;
}
else
{
codeNum = 2 * codeNum;
}
/* Size of the exp-golomb code */
sizeCodeNum = (2 * armLogSize (codeNum + 1)) - 1;
return sizeCodeNum;
}
/**
* Function: armVCM4P10_CompareMotionCostToMV
*
* Description:
* Performs comparision of motion vectors and Motion cost to decide the
* best MV and best MC
*
* Remarks:
*
* Parameters:
* [in] mvX x coordinate of the candidate motion vector in 1/4 pel units
* [in] mvY y coordinate of the candidate motion vector in 1/4 pel units
* [in] diffMV differential MV
* [in] candSAD Candidate SAD
* [in] bestMV Best MV, contains best MV till the previous interation.
* [in] nLamda Lamda factor; used to compute motion cost
* [in] *pBestCost Contains the current best motion cost.
* [out] *pBestCost pBestCost Motion cost will be associated with the best MV
* after judgement;
* computed as SAD+Lamda*BitsUsedByMV, if the candCost is less
* than the best cost passed then the *pBestCost will be equal to candCost
* [out] bestMV Finally will have the best MV after the judgement.
*
* Return Value:
* OMX_INT -- 1 to indicate that the current motion cost is the best
* 0 to indicate that it is NOT the best motion cost
*/
OMX_INT armVCM4P10_CompareMotionCostToMV (
OMX_S16 mvX,
OMX_S16 mvY,
OMXVCMotionVector diffMV,
OMX_INT candSAD,
OMXVCMotionVector *bestMV,
OMX_U32 nLamda,
OMX_S32 *pBestCost
)
{
OMX_S32 candCost;
OMX_U16 sizeCodeNum;
sizeCodeNum = armVCM4P10_ExpGolBitsUsed (diffMV.dx);
sizeCodeNum += armVCM4P10_ExpGolBitsUsed (diffMV.dy);
/* Motion cost = SAD + lamda * ((bitsused(diffMVx) + (bitsused(diffMVy))*/
candCost = candSAD + (nLamda * sizeCodeNum);
/* Calculate candCost */
if (candCost < *pBestCost)
{
*pBestCost = candCost;
bestMV->dx = mvX;
bestMV->dy = mvY;
return 1;
}
if (candCost > *pBestCost)
{
return 0;
}
/* shorter motion vector */
if ( (mvX * mvX + mvY * mvY) < ((bestMV->dx * bestMV->dx) + (bestMV->dy * bestMV->dy)) )
{
*pBestCost = candCost;
bestMV->dx = mvX;
bestMV->dy = mvY;
return 1;
}
return 0;
}
/*End of File*/