/*
 * 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*/
