armVCM4P10_CompareMotionCostToMV.c revision 78e52bfac041d71ce53b5b13c2abf78af742b09d
1/*
2 * Copyright (C) 2007-2008 ARM Limited
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17/**
18 *
19 * File Name:  armVCM4P10_CompareMotionCostToMV.c
20 * OpenMAX DL: v1.0.2
21 * Revision:   9641
22 * Date:       Thursday, February 7, 2008
23 *
24 *
25 *
26 *
27 * Description:
28 * Contains module for comparing motion vectors and SAD's to decide
29 * the best MV and SAD
30 *
31 */
32
33#include "omxtypes.h"
34#include "armOMX.h"
35
36#include "armVC.h"
37#include "armCOMM.h"
38
39/**
40 * Function: armVCM4P10_ExpGolBitsUsed
41 *
42 * Description:
43 * Performs calculating Exp-Golomb code length for a given values
44 *
45 * Remarks:
46 *
47 * Parameters:
48 * [in]	         val	Signed number for which Exp-Golomb code length has
49 *                      to be calculated
50 *
51 * Return Value:
52 *             Returns the length of the Exp-Golomb code for val
53 */
54
55static OMX_U16 armVCM4P10_ExpGolBitsUsed (OMX_S16 val)
56{
57    OMX_U16 sizeCodeNum, codeNum;
58
59    /* Mapping val to codeNum */
60    codeNum = armAbs (val);
61    if (val > 0)
62    {
63        codeNum = (2 * codeNum) - 1;
64    }
65    else
66    {
67        codeNum = 2 * codeNum;
68    }
69
70    /* Size of the exp-golomb code */
71    sizeCodeNum = (2 * armLogSize (codeNum + 1)) - 1;
72
73    return sizeCodeNum;
74}
75
76
77/**
78 * Function: armVCM4P10_CompareMotionCostToMV
79 *
80 * Description:
81 * Performs comparision of motion vectors and Motion cost to decide the
82 * best MV and best MC
83 *
84 * Remarks:
85 *
86 * Parameters:
87 * [in]	         mvX	x coordinate of the candidate motion vector in 1/4 pel units
88 * [in]	         mvY	y coordinate of the candidate motion vector in 1/4 pel units
89 * [in]	      diffMV	differential MV
90 * [in]	     candSAD	Candidate SAD
91 * [in]	      bestMV	Best MV, contains best MV till the previous interation.
92 * [in]       nLamda    Lamda factor; used to compute motion cost
93 * [in]   *pBestCost    Contains the current best motion cost.
94 * [out]  *pBestCost    pBestCost Motion cost will be associated with the best MV
95 *                      after judgement;
96 *                      computed as SAD+Lamda*BitsUsedByMV, if the candCost is less
97 *                      than the best cost passed then the *pBestCost will be equal to candCost
98 * [out]	  bestMV	Finally will have the best MV after the judgement.
99 *
100 * Return Value:
101 * OMX_INT -- 1 to indicate that the current motion cost is the best
102 *            0 to indicate that it is NOT the best motion cost
103 */
104
105OMX_INT armVCM4P10_CompareMotionCostToMV (
106    OMX_S16  mvX,
107    OMX_S16  mvY,
108    OMXVCMotionVector diffMV,
109    OMX_INT candSAD,
110    OMXVCMotionVector *bestMV,
111    OMX_U32 nLamda,
112    OMX_S32 *pBestCost
113)
114{
115    OMX_S32 candCost;
116    OMX_U16 sizeCodeNum;
117
118    sizeCodeNum = armVCM4P10_ExpGolBitsUsed (diffMV.dx);
119    sizeCodeNum += armVCM4P10_ExpGolBitsUsed (diffMV.dy);
120
121    /* Motion cost = SAD +  lamda * ((bitsused(diffMVx) + (bitsused(diffMVy))*/
122    candCost = candSAD + (nLamda * sizeCodeNum);
123
124    /* Calculate candCost */
125    if (candCost < *pBestCost)
126    {
127        *pBestCost = candCost;
128        bestMV->dx = mvX;
129        bestMV->dy = mvY;
130        return 1;
131    }
132    if (candCost > *pBestCost)
133    {
134        return 0;
135    }
136    /* shorter motion vector */
137    if ( (mvX * mvX + mvY * mvY) < ((bestMV->dx * bestMV->dx) + (bestMV->dy * bestMV->dy)) )
138    {
139        *pBestCost = candCost;
140        bestMV->dx = mvX;
141        bestMV->dy = mvY;
142        return 1;
143    }
144
145    return 0;
146}
147
148/*End of File*/
149