1bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
2bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
3bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * File Name:  armCOMM.c
4bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * OpenMAX DL: v1.0.2
5bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Revision:   9641
6bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Date:       Thursday, February 7, 2008
7bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
8bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
9bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
10bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
11bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
12bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Defines Common APIs used across OpenMAX API's
13bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
14bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
15bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "omxtypes.h"
16bebc99d6fa433c04139294a5057f8439d772dbd9James Dong#include "armCOMM.h"
17bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
18bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/***********************************************************************/
19bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                /* Miscellaneous Arithmetic operations */
20bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
21bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
22bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armRoundFloatToS16
23bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
24bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description:
25bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Converts a double precision value into a short int after rounding
26bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
27bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
28bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in]  Value                 Float value to be converted
29bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
30bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
31bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] converted value in OMX_S16 format
32bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
33bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
34bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
35bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S16 armRoundFloatToS16 (OMX_F64 Value)
36bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
37bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (Value > 0)
38bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
39bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_S16)(Value + .5);
40bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
41bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
42bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
43bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_S16)(Value - .5);
44bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
45bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
46bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
47bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
48bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armRoundFloatToS32
49bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
50bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description:
51bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Converts a double precision value into a int after rounding
52bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
53bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
54bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in]  Value                 Float value to be converted
55bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
56bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
57bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] converted value in OMX_S32 format
58bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
59bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
60bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
61bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armRoundFloatToS32 (OMX_F64 Value)
62bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
63bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (Value > 0)
64bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
65bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_S32)(Value + .5);
66bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
67bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
68bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
69bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_S32)(Value - .5);
70bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
71bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
72bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
73bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armSatRoundFloatToS16
74bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
75bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description:
76bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Converts a double precision value into a short int after rounding and saturation
77bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
78bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
79bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in]  Value                 Float value to be converted
80bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
81bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
82bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] converted value in OMX_S16 format
83bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
84bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
85bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
86bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S16 armSatRoundFloatToS16 (OMX_F64 Value)
87bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
88bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (Value > 0)
89bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
90bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Value += 0.5;
91bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
92bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if(Value > (OMX_S16)OMX_MAX_S16 )
93bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
94bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (OMX_S16)OMX_MAX_S16;
95bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
96bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
97bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
98bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (OMX_S16)Value;
99bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
100bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
101bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
102bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
103bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Value -= 0.5;
104bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
105bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if(Value < (OMX_S16)OMX_MIN_S16 )
106bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
107bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (OMX_S16)OMX_MIN_S16;
108bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
109bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
110bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
111bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (OMX_S16)Value;
112bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
113bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
114bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
115bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
116bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
117bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armSatRoundFloatToS32
118bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
119bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description:
120bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Converts a double precision value into a int after rounding and saturation
121bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
122bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
123bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in]  Value                 Float value to be converted
124bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
125bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
126bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] converted value in OMX_S32 format
127bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
128bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
129bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
130bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armSatRoundFloatToS32 (OMX_F64 Value)
131bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
132bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (Value > 0)
133bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
134bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Value += 0.5;
135bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
136bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if(Value > (OMX_S32)OMX_MAX_S32 )
137bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
138bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (OMX_S32)OMX_MAX_S32;
139bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
140bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
141bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
142bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (OMX_S32)Value;
143bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
144bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
145bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
146bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
147bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Value -= 0.5;
148bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
149bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if(Value < (OMX_S32)OMX_MIN_S32 )
150bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
151bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (OMX_S32)OMX_MIN_S32;
152bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
153bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
154bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
155bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return (OMX_S32)Value;
156bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
157bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
158bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
159bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
160bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
161bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armSatRoundFloatToU16
162bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
163bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description:
164bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Converts a double precision value into a unsigned short int after rounding and saturation
165bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
166bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
167bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in]  Value                 Float value to be converted
168bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
169bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
170bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] converted value in OMX_U16 format
171bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
172bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
173bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
174bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_U16 armSatRoundFloatToU16 (OMX_F64 Value)
175bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
176bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Value += 0.5;
177bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
178bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if(Value > (OMX_U16)OMX_MAX_U16 )
179bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
180bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_U16)OMX_MAX_U16;
181bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
182bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
183bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
184bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_U16)Value;
185bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
186bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
187bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
188bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
189bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armSatRoundFloatToU32
190bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
191bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description:
192bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Converts a double precision value into a unsigned int after rounding and saturation
193bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
194bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
195bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in]  Value                 Float value to be converted
196bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
197bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
198bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] converted value in OMX_U32 format
199bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
200bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
201bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
202bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_U32 armSatRoundFloatToU32 (OMX_F64 Value)
203bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
204bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Value += 0.5;
205bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
206bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if(Value > (OMX_U32)OMX_MAX_U32 )
207bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
208bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_U32)OMX_MAX_U32;
209bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
210bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
211bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
212bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_U32)Value;
213bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
214bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
215bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
216bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
217bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armRoundFloatToS64
218bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
219bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description:
220bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Converts a double precision value into a 64 bit int after rounding
221bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
222bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
223bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in]  Value                 Float value to be converted
224bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
225bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
226bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out] converted value in OMX_S64 format
227bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
228bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
229bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
230bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S64 armRoundFloatToS64 (OMX_F64 Value)
231bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
232bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (Value > 0)
233bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
234bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_S64)(Value + .5);
235bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
236bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
237bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
238bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_S64)(Value - .5);
239bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
240bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
241bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
242bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
243bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armSignCheck
244bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
245bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description:
246bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Checks the sign of a variable:
247bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * returns 1 if it is Positive
248bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * returns 0 if it is 0
249bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * returns -1 if it is Negative
250bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
251bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Remarks:
252bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
253bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
254bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in]	    var     Variable to be checked
255bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
256bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
257bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * OMX_INT --   returns 1 if it is Positive
258bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *              returns 0 if it is 0
259bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *              returns -1 if it is Negative
260bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
261bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
262bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_INT armSignCheck (
263bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S16 var
264bebc99d6fa433c04139294a5057f8439d772dbd9James Dong)
265bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
266bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
267bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_INT Sign;
268bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
269bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (var < 0)
270bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
271bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Sign = -1;
272bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
273bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else if ( var > 0)
274bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
275bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Sign = 1;
276bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
277bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
278bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
279bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Sign = 0;
280bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
281bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
282bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return Sign;
283bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
284bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
285bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
286bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armClip
287bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
288bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description: Clips the input between MAX and MIN value
289bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
290bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
291bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Remarks:
292bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
293bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
294bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Min     lower bound
295bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Max     upper bound
296bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] src     variable to the clipped
297bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
298bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
299bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * OMX_S32 --   returns clipped value
300bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
301bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
302bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armClip (
303bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_INT min,
304bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_INT max,
305bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 src
306bebc99d6fa433c04139294a5057f8439d772dbd9James Dong)
307bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
308bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
309bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (src > max)
310bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
311bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        src = max;
312bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
313bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else if (src < min)
314bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
315bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        src = min;
316bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
317bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
318bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return src;
319bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
320bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
321bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
322bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armClip_F32
323bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
324bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description: Clips the input between MAX and MIN value
325bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
326bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
327bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Remarks:
328bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
329bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
330bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Min     lower bound
331bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Max     upper bound
332bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] src     variable to the clipped
333bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
334bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
335bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * OMX_F32 --   returns clipped value
336bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
337bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
338bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_F32 armClip_F32 (
339bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_F32 min,
340bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_F32 max,
341bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_F32 src
342bebc99d6fa433c04139294a5057f8439d772dbd9James Dong)
343bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
344bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
345bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (src > max)
346bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
347bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        src = max;
348bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
349bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else if (src < min)
350bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
351bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        src = min;
352bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
353bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
354bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return src;
355bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
356bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
357bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
358bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armShiftSat_F32
359bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
360bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description: Divides a float value by 2^shift and
361bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * saturates it for unsigned value range for satBits.
362bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Second parameter is like "shifting" the corresponding
363bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * integer value. Takes care of rounding while clipping the final
364bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * value.
365bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
366bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
367bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] v          Number to be operated upon
368bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] shift      Divides the input "v" by "2^shift"
369bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] satBits    Final range is [0, 2^satBits)
370bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
371bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
372bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * OMX_S32 --   returns "shifted" saturated value
373bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
374bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
375bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_U32 armShiftSat_F32(OMX_F32 v, OMX_INT shift, OMX_INT satBits)
376bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
377bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U32 allOnes = (OMX_U32)(-1);
378bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U32 maxV = allOnes >> (32-satBits);
379bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_F32 vShifted, vRounded, shiftDiv = (OMX_F32)(1 << shift);
380bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U32 vInt;
381bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U32 vIntSat;
382bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
383bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if(v <= 0)
384bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return 0;
385bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
386bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    vShifted = v / shiftDiv;
387bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    vRounded = (OMX_F32)(vShifted + 0.5);
388bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    vInt = (OMX_U32)vRounded;
389bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    vIntSat = vInt;
390bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if(vIntSat > maxV)
391bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        vIntSat = maxV;
392bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return vIntSat;
393bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
394bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
395bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
396bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Functions: armSwapElem
397bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
398bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description:
399bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * These function swaps two elements at the specified pointer locations.
400bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * The size of each element could be anything as specified by <elemSize>
401bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
402bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
403bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * OMXResult -- Error status from the function
404bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
405bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMXResult armSwapElem(
406bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        OMX_U8 *pBuf1,
407bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        OMX_U8 *pBuf2,
408bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        OMX_INT elemSize
409bebc99d6fa433c04139294a5057f8439d772dbd9James Dong       )
410bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
411bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_INT i;
412bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U8 temp;
413bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    armRetArgErrIf(!pBuf1 || !pBuf2, OMX_Sts_BadArgErr);
414bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
415bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for(i = 0; i < elemSize; i++)
416bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
417bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        temp = *(pBuf1 + i);
418bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        *(pBuf1 + i) = *(pBuf2 + i);
419bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        *(pBuf2 + i) = temp;
420bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
421bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return OMX_Sts_NoErr;
422bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
423bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
424bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
425bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armMedianOf3
426bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
427bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description: Finds the median of three numbers
428bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
429bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Remarks:
430bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
431bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
432bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] fEntry     First entry
433bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] sEntry     second entry
434bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] tEntry     Third entry
435bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
436bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
437bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * OMX_S32 --   returns the median value
438bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
439bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
440bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armMedianOf3 (
441bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 fEntry,
442bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 sEntry,
443bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 tEntry
444bebc99d6fa433c04139294a5057f8439d772dbd9James Dong)
445bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
446bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 a, b, c;
447bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
448bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    a = armMin (fEntry, sEntry);
449bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    b = armMax (fEntry, sEntry);
450bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    c = armMin (b, tEntry);
451bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return (armMax (a, c));
452bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
453bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
454bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
455bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function: armLogSize
456bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
457bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description: Finds the size of a positive value and returns the same
458bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
459bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Remarks:
460bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
461bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parameters:
462bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] value    Positive value
463bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
464bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return Value:
465bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * OMX_U8 --     Returns the minimum number of bits required to represent the positive value.
466bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                 This is the smallest k>=0 such that that value is less than (1<<k).
467bebc99d6fa433c04139294a5057f8439d772dbd9James Dong */
468bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
469bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_U8 armLogSize (
470bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U16 value
471bebc99d6fa433c04139294a5057f8439d772dbd9James Dong)
472bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
473bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U8 i;
474bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    for ( i = 0; value > 0; value = value >> 1)
475bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
476bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        i++;
477bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
478bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return i;
479bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
480bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
481bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/***********************************************************************/
482bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                /* Saturating Arithmetic operations */
483bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
484bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
485bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armSatAdd_S32()
486bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
487bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
488bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *   Returns the result of saturated addition of the two inputs Value1, Value2
489bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
490bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
491bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value1       First Operand
492bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value2       Second Operand
493bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
494bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
495bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]             Result of operation
496bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
497bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
498bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
499bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
500bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armSatAdd_S32(OMX_S32 Value1,OMX_S32 Value2)
501bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
502bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 Result;
503bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
504bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Result = Value1 + Value2;
505bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
506bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if( (Value1^Value2) >= 0)
507bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
508bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /*Same sign*/
509bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if( (Result^Value1) >= 0)
510bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
511bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            /*Result has not saturated*/
512bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return Result;
513bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
514bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
515bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
516bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if(Value1 >= 0)
517bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
518bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                /*Result has saturated in positive side*/
519bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return OMX_MAX_S32;
520bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
521bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            else
522bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
523bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                /*Result has saturated in negative side*/
524bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return OMX_MIN_S32;
525bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
526bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
527bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
528bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
529bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
530bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
531bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
532bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return Result;
533bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
534bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
535bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
536bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
537bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
538bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armSatAdd_S64()
539bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
540bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
541bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *   Returns the result of saturated addition of the two inputs Value1, Value2
542bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
543bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
544bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value1       First Operand
545bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value2       Second Operand
546bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
547bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
548bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]             Result of operation
549bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
550bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
551bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
552bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
553bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S64 armSatAdd_S64(OMX_S64 Value1,OMX_S64 Value2)
554bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
555bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S64 Result;
556bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
557bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Result = Value1 + Value2;
558bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
559bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if( (Value1^Value2) >= 0)
560bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
561bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /*Same sign*/
562bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if( (Result^Value1) >= 0)
563bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
564bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            /*Result has not saturated*/
565bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return Result;
566bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
567bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
568bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
569bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if(Value1 >= 0)
570bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
571bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                /*Result has saturated in positive side*/
572bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                Result = OMX_MAX_S64;
573bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return Result;
574bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
575bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            else
576bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
577bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                /*Result has saturated in negative side*/
578bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return OMX_MIN_S64;
579bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
580bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
581bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
582bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
583bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
584bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
585bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
586bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return Result;
587bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
588bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
589bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
590bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
591bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/** Function :armSatSub_S32()
592bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
593bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
594bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     Returns the result of saturated substraction of the two inputs Value1, Value2
595bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
596bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
597bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value1       First Operand
598bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value2       Second Operand
599bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
600bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
601bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]             Result of operation
602bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
603bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
604bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
605bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armSatSub_S32(OMX_S32 Value1,OMX_S32 Value2)
606bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
607bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 Result;
608bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
609bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Result = Value1 - Value2;
610bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
611bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if( (Value1^Value2) < 0)
612bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
613bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        /*Opposite sign*/
614bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        if( (Result^Value1) >= 0)
615bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
616bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            /*Result has not saturated*/
617bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            return Result;
618bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
619bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        else
620bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
621bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            if(Value1 >= 0)
622bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
623bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                /*Result has saturated in positive side*/
624bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return OMX_MAX_S32;
625bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
626bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            else
627bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            {
628bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                /*Result has saturated in negative side*/
629bebc99d6fa433c04139294a5057f8439d772dbd9James Dong                return OMX_MIN_S32;
630bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            }
631bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
632bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
633bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
634bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
635bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
636bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
637bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return Result;
638bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
639bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
640bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
641bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
642bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
643bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armSatMac_S32()
644bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
645bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
646bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     Returns the result of Multiplication of Value1 and Value2 and subesquent saturated
647bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     accumulation with Mac
648bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
649bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
650bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value1       First Operand
651bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value2       Second Operand
652bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Mac          Accumulator
653bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
654bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
655bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]             Result of operation
656bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
657bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
658bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armSatMac_S32(OMX_S32 Mac,OMX_S16 Value1,OMX_S16 Value2)
659bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
660bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 Result;
661bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
662bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Result = (OMX_S32)(Value1*Value2);
663bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    Result = armSatAdd_S32( Mac , Result );
664bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
665bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return Result;
666bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
667bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
668bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
669bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armSatMac_S16S32_S32
670bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
671bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
672bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *   Returns the result of saturated MAC operation of the three inputs delayElem, filTap , mac
673bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
674bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *   mac = mac + Saturate_in_32Bits(delayElem * filTap)
675bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
676bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
677bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] delayElem    First 32 bit Operand
678bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] filTap       Second 16 bit Operand
679bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] mac          Result of MAC operation
680bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
681bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
682bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]  mac        Result of operation
683bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
684bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
685bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
686bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armSatMac_S16S32_S32(OMX_S32 mac, OMX_S32 delayElem, OMX_S16 filTap )
687bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
688bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
689bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 result;
690bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
691bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    result = armSatMulS16S32_S32(filTap,delayElem);
692bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
693bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if ( result > OMX_MAX_S16 )
694bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
695bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        result = OMX_MAX_S32;
696bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
697bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else if( result < OMX_MIN_S16 )
698bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
699bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        result = OMX_MIN_S32;
700bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
701bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
702bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
703bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        result = delayElem * filTap;
704bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
705bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
706bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    mac = armSatAdd_S32(mac,result);
707bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
708bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return mac;
709bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
710bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
711bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
712bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
713bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armSatRoundRightShift_S32_S16
714bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
715bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
716bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *   Returns the result of rounded right shift operation of input by the scalefactor
717bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
718bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *   output = Saturate_in_16Bits( ( Right/LeftShift( (Round(input) , shift ) )
719bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
720bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
721bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] input       The input to be operated on
722bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] shift The shift number
723bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
724bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
725bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]            Result of operation
726bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
727bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
728bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
729bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
730bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S16 armSatRoundRightShift_S32_S16(OMX_S32 input, OMX_INT shift)
731bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
732bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    input = armSatRoundLeftShift_S32(input,-shift);
733bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
734bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if ( input > OMX_MAX_S16 )
735bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
736bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_S16)OMX_MAX_S16;
737bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
738bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else if (input < OMX_MIN_S16)
739bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
740bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        return (OMX_S16)OMX_MIN_S16;
741bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
742bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
743bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
744bebc99d6fa433c04139294a5057f8439d772dbd9James Dong       return (OMX_S16)input;
745bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
746bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
747bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
748bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
749bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
750bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armSatRoundLeftShift_S32()
751bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
752bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
753bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     Returns the result of saturating left-shift operation on input
754bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     Or rounded Right shift if the input Shift is negative.
755bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
756bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
757bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value        Operand
758bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Shift        Operand for shift operation
759bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
760bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
761bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]             Result of operation
762bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
763bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
764bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
765bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armSatRoundLeftShift_S32(OMX_S32 Value, OMX_INT Shift)
766bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
767bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_INT i;
768bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
769bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (Shift < 0)
770bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
771bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Shift = -Shift;
772bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Value = armSatAdd_S32(Value, (1 << (Shift - 1)));
773bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Value = Value >> Shift;
774bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
775bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
776bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
777bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (i = 0; i < Shift; i++)
778bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
779bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            Value = armSatAdd_S32(Value, Value);
780bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
781bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
782bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return Value;
783bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
784bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
785bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
786bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armSatRoundLeftShift_S64()
787bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
788bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
789bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     Returns the result of saturating left-shift operation on input
790bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     Or rounded Right shift if the input Shift is negative.
791bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
792bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
793bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Value        Operand
794bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] shift        Operand for shift operation
795bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
796bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
797bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]             Result of operation
798bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
799bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
800bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
801bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S64 armSatRoundLeftShift_S64(OMX_S64 Value, OMX_INT Shift)
802bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
803bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_INT i;
804bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
805bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (Shift < 0)
806bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
807bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Shift = -Shift;
808bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Value = armSatAdd_S64(Value, ((OMX_S64)1 << (Shift - 1)));
809bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        Value = Value >> Shift;
810bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
811bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
812bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
813bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        for (i = 0; i < Shift; i++)
814bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        {
815bebc99d6fa433c04139294a5057f8439d772dbd9James Dong            Value = armSatAdd_S64(Value, Value);
816bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        }
817bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
818bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return Value;
819bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
820bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
821bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
822bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armSatMulS16S32_S32()
823bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
824bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
825bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     Returns the result of a S16 data type multiplied with an S32 data type
826bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     in a S32 container
827bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
828bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
829bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] input1       Operand 1
830bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] input2       Operand 2
831bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
832bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
833bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]             Result of operation
834bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
835bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
836bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
837bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
838bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armSatMulS16S32_S32(OMX_S16 input1,OMX_S32 input2)
839bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
840bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S16 hi2,lo1;
841bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U16 lo2;
842bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
843bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 temp1,temp2;
844bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 result;
845bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
846bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    lo1  = input1;
847bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
848bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    hi2  = ( input2 >>  16 );
849bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    lo2  = ( (OMX_U32)( input2 << 16 ) >> 16 );
850bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
851bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    temp1 = hi2 * lo1;
852bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    temp2 = ( lo2* lo1 ) >> 16;
853bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
854bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    result =  armSatAdd_S32(temp1,temp2);
855bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
856bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return result;
857bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
858bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
859bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
860bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armSatMulS32S32_S32()
861bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
862bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description :
863bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     Returns the result of a S32 data type multiplied with an S32 data type
864bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *     in a S32 container
865bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
866bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
867bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] input1       Operand 1
868bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] input2       Operand 2
869bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
870bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
871bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]             Result of operation
872bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
873bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
874bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
875bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armSatMulS32S32_S32(OMX_S32 input1,OMX_S32 input2)
876bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
877bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S16 hi1,hi2;
878bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_U16 lo1,lo2;
879bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
880bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 temp1,temp2,temp3;
881bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_S32 result;
882bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
883bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    hi1  = ( input1 >>  16 );
884bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    lo1  = ( (OMX_U32)( input1 << 16 ) >> 16 );
885bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
886bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    hi2  = ( input2 >>  16 );
887bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    lo2  = ( (OMX_U32)( input2 << 16 ) >> 16 );
888bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
889bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    temp1 =   hi1 * hi2;
890bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    temp2 = ( hi1* lo2 ) >> 16;
891bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    temp3 = ( hi2* lo1 ) >> 16;
892bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
893bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    result = armSatAdd_S32(temp1,temp2);
894bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    result = armSatAdd_S32(result,temp3);
895bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
896bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return result;
897bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
898bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
899bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/**
900bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Function :armIntDivAwayFromZero()
901bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
902bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Description : Integer division with rounding to the nearest integer.
903bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *               Half-integer values are rounded away from zero
904bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *               unless otherwise specified. For example 3//2 is rounded
905bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *               to 2, and -3//2 is rounded to -2.
906bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
907bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Parametrs:
908bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Num        Operand 1
909bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [in] Deno       Operand 2
910bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
911bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * Return:
912bebc99d6fa433c04139294a5057f8439d772dbd9James Dong * [out]             Result of operation input1//input2
913bebc99d6fa433c04139294a5057f8439d772dbd9James Dong *
914bebc99d6fa433c04139294a5057f8439d772dbd9James Dong **/
915bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
916bebc99d6fa433c04139294a5057f8439d772dbd9James DongOMX_S32 armIntDivAwayFromZero (OMX_S32 Num, OMX_S32 Deno)
917bebc99d6fa433c04139294a5057f8439d772dbd9James Dong{
918bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    OMX_F64 result;
919bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
920bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    result = ((OMX_F64)Num)/((OMX_F64)Deno);
921bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
922bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    if (result >= 0)
923bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
924bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        result += 0.5;
925bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
926bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    else
927bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    {
928bebc99d6fa433c04139294a5057f8439d772dbd9James Dong        result -= 0.5;
929bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    }
930bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
931bebc99d6fa433c04139294a5057f8439d772dbd9James Dong    return (OMX_S32)(result);
932bebc99d6fa433c04139294a5057f8439d772dbd9James Dong}
933bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
934bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
935bebc99d6fa433c04139294a5057f8439d772dbd9James Dong/*End of File*/
936bebc99d6fa433c04139294a5057f8439d772dbd9James Dong
937