| Index: third_party/openmax_dl/dl/src/armCOMM.c
|
| diff --git a/third_party/openmax_dl/dl/src/armCOMM.c b/third_party/openmax_dl/dl/src/armCOMM.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1118744fa6e756ce8da37eebc7cacc15bf117369
|
| --- /dev/null
|
| +++ b/third_party/openmax_dl/dl/src/armCOMM.c
|
| @@ -0,0 +1,949 @@
|
| +/*
|
| + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + *
|
| + * This file was originally licensed as follows. It has been
|
| + * relicensed with permission from the copyright holders.
|
| + */
|
| +
|
| +/**
|
| + *
|
| + * File Name: armCOMM.c
|
| + * OpenMAX DL: v1.0.2
|
| + * Revision: 10586
|
| + * Date: Wednesday, March 5, 2008
|
| + *
|
| + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
|
| + *
|
| + *
|
| + *
|
| + * Defines Common APIs used across OpenMAX API's
|
| + */
|
| +
|
| +#include "omxtypes.h"
|
| +#include "armCOMM.h"
|
| +
|
| +/***********************************************************************/
|
| + /* Miscellaneous Arithmetic operations */
|
| +
|
| +/**
|
| + * Function: armRoundFloatToS16
|
| + *
|
| + * Description:
|
| + * Converts a double precision value into a short int after rounding
|
| + *
|
| + * Parameters:
|
| + * [in] Value Float value to be converted
|
| + *
|
| + * Return Value:
|
| + * [out] converted value in OMX_S16 format
|
| + *
|
| + */
|
| +
|
| +OMX_S16 armRoundFloatToS16 (OMX_F64 Value)
|
| +{
|
| + if (Value > 0)
|
| + {
|
| + return (OMX_S16)(Value + .5);
|
| + }
|
| + else
|
| + {
|
| + return (OMX_S16)(Value - .5);
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Function: armRoundFloatToS32
|
| + *
|
| + * Description:
|
| + * Converts a double precision value into a int after rounding
|
| + *
|
| + * Parameters:
|
| + * [in] Value Float value to be converted
|
| + *
|
| + * Return Value:
|
| + * [out] converted value in OMX_S32 format
|
| + *
|
| + */
|
| +
|
| +OMX_S32 armRoundFloatToS32 (OMX_F64 Value)
|
| +{
|
| + if (Value > 0)
|
| + {
|
| + return (OMX_S32)(Value + .5);
|
| + }
|
| + else
|
| + {
|
| + return (OMX_S32)(Value - .5);
|
| + }
|
| +}
|
| +/**
|
| + * Function: armSatRoundFloatToS16
|
| + *
|
| + * Description:
|
| + * Converts a double precision value into a short int after rounding and saturation
|
| + *
|
| + * Parameters:
|
| + * [in] Value Float value to be converted
|
| + *
|
| + * Return Value:
|
| + * [out] converted value in OMX_S16 format
|
| + *
|
| + */
|
| +
|
| +OMX_S16 armSatRoundFloatToS16 (OMX_F64 Value)
|
| +{
|
| + if (Value > 0)
|
| + {
|
| + Value += 0.5;
|
| +
|
| + if(Value > (OMX_S16)OMX_MAX_S16 )
|
| + {
|
| + return (OMX_S16)OMX_MAX_S16;
|
| + }
|
| + else
|
| + {
|
| + return (OMX_S16)Value;
|
| + }
|
| + }
|
| + else
|
| + {
|
| + Value -= 0.5;
|
| +
|
| + if(Value < (OMX_S16)OMX_MIN_S16 )
|
| + {
|
| + return (OMX_S16)OMX_MIN_S16;
|
| + }
|
| + else
|
| + {
|
| + return (OMX_S16)Value;
|
| + }
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Function: armSatRoundFloatToS32
|
| + *
|
| + * Description:
|
| + * Converts a double precision value into a int after rounding and saturation
|
| + *
|
| + * Parameters:
|
| + * [in] Value Float value to be converted
|
| + *
|
| + * Return Value:
|
| + * [out] converted value in OMX_S32 format
|
| + *
|
| + */
|
| +
|
| +OMX_S32 armSatRoundFloatToS32 (OMX_F64 Value)
|
| +{
|
| + if (Value > 0)
|
| + {
|
| + Value += 0.5;
|
| +
|
| + if(Value > (OMX_S32)OMX_MAX_S32 )
|
| + {
|
| + return (OMX_S32)OMX_MAX_S32;
|
| + }
|
| + else
|
| + {
|
| + return (OMX_S32)Value;
|
| + }
|
| + }
|
| + else
|
| + {
|
| + Value -= 0.5;
|
| +
|
| + if(Value < (OMX_S32)OMX_MIN_S32 )
|
| + {
|
| + return (OMX_S32)OMX_MIN_S32;
|
| + }
|
| + else
|
| + {
|
| + return (OMX_S32)Value;
|
| + }
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Function: armSatRoundFloatToU16
|
| + *
|
| + * Description:
|
| + * Converts a double precision value into a unsigned short int after rounding and saturation
|
| + *
|
| + * Parameters:
|
| + * [in] Value Float value to be converted
|
| + *
|
| + * Return Value:
|
| + * [out] converted value in OMX_U16 format
|
| + *
|
| + */
|
| +
|
| +OMX_U16 armSatRoundFloatToU16 (OMX_F64 Value)
|
| +{
|
| + Value += 0.5;
|
| +
|
| + if(Value > (OMX_U16)OMX_MAX_U16 )
|
| + {
|
| + return (OMX_U16)OMX_MAX_U16;
|
| + }
|
| + else
|
| + {
|
| + return (OMX_U16)Value;
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Function: armSatRoundFloatToU32
|
| + *
|
| + * Description:
|
| + * Converts a double precision value into a unsigned int after rounding and saturation
|
| + *
|
| + * Parameters:
|
| + * [in] Value Float value to be converted
|
| + *
|
| + * Return Value:
|
| + * [out] converted value in OMX_U32 format
|
| + *
|
| + */
|
| +
|
| +OMX_U32 armSatRoundFloatToU32 (OMX_F64 Value)
|
| +{
|
| + Value += 0.5;
|
| +
|
| + if(Value > (OMX_U32)OMX_MAX_U32 )
|
| + {
|
| + return (OMX_U32)OMX_MAX_U32;
|
| + }
|
| + else
|
| + {
|
| + return (OMX_U32)Value;
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Function: armRoundFloatToS64
|
| + *
|
| + * Description:
|
| + * Converts a double precision value into a 64 bit int after rounding
|
| + *
|
| + * Parameters:
|
| + * [in] Value Float value to be converted
|
| + *
|
| + * Return Value:
|
| + * [out] converted value in OMX_S64 format
|
| + *
|
| + */
|
| +
|
| +OMX_S64 armRoundFloatToS64 (OMX_F64 Value)
|
| +{
|
| + if (Value > 0)
|
| + {
|
| + return (OMX_S64)(Value + .5);
|
| + }
|
| + else
|
| + {
|
| + return (OMX_S64)(Value - .5);
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Function: armSignCheck
|
| + *
|
| + * Description:
|
| + * Checks the sign of a variable:
|
| + * returns 1 if it is Positive
|
| + * returns 0 if it is 0
|
| + * returns -1 if it is Negative
|
| + *
|
| + * Remarks:
|
| + *
|
| + * Parameters:
|
| + * [in] var Variable to be checked
|
| + *
|
| + * Return Value:
|
| + * OMX_INT -- returns 1 if it is Positive
|
| + * returns 0 if it is 0
|
| + * returns -1 if it is Negative
|
| + */
|
| +
|
| +OMX_INT armSignCheck (
|
| + OMX_S16 var
|
| +)
|
| +
|
| +{
|
| + OMX_INT Sign;
|
| +
|
| + if (var < 0)
|
| + {
|
| + Sign = -1;
|
| + }
|
| + else if ( var > 0)
|
| + {
|
| + Sign = 1;
|
| + }
|
| + else
|
| + {
|
| + Sign = 0;
|
| + }
|
| +
|
| + return Sign;
|
| +}
|
| +
|
| +/**
|
| + * Function: armClip
|
| + *
|
| + * Description: Clips the input between MAX and MIN value
|
| + *
|
| + *
|
| + * Remarks:
|
| + *
|
| + * Parameters:
|
| + * [in] Min lower bound
|
| + * [in] Max upper bound
|
| + * [in] src variable to the clipped
|
| + *
|
| + * Return Value:
|
| + * OMX_S32 -- returns clipped value
|
| + */
|
| +
|
| +OMX_S32 armClip (
|
| + OMX_INT min,
|
| + OMX_INT max,
|
| + OMX_S32 src
|
| +)
|
| +
|
| +{
|
| + if (src > max)
|
| + {
|
| + src = max;
|
| + }
|
| + else if (src < min)
|
| + {
|
| + src = min;
|
| + }
|
| +
|
| + return src;
|
| +}
|
| +
|
| +/**
|
| + * Function: armClip_F32
|
| + *
|
| + * Description: Clips the input between MAX and MIN value
|
| + *
|
| + *
|
| + * Remarks:
|
| + *
|
| + * Parameters:
|
| + * [in] Min lower bound
|
| + * [in] Max upper bound
|
| + * [in] src variable to the clipped
|
| + *
|
| + * Return Value:
|
| + * OMX_F32 -- returns clipped value
|
| + */
|
| +
|
| +OMX_F32 armClip_F32 (
|
| + OMX_F32 min,
|
| + OMX_F32 max,
|
| + OMX_F32 src
|
| +)
|
| +
|
| +{
|
| + if (src > max)
|
| + {
|
| + src = max;
|
| + }
|
| + else if (src < min)
|
| + {
|
| + src = min;
|
| + }
|
| +
|
| + return src;
|
| +}
|
| +
|
| +/**
|
| + * Function: armShiftSat_F32
|
| + *
|
| + * Description: Divides a float value by 2^shift and
|
| + * saturates it for unsigned value range for satBits.
|
| + * Second parameter is like "shifting" the corresponding
|
| + * integer value. Takes care of rounding while clipping the final
|
| + * value.
|
| + *
|
| + * Parameters:
|
| + * [in] v Number to be operated upon
|
| + * [in] shift Divides the input "v" by "2^shift"
|
| + * [in] satBits Final range is [0, 2^satBits)
|
| + *
|
| + * Return Value:
|
| + * OMX_S32 -- returns "shifted" saturated value
|
| + */
|
| +
|
| +OMX_U32 armShiftSat_F32(OMX_F32 v, OMX_INT shift, OMX_INT satBits)
|
| +{
|
| + OMX_U32 allOnes = (OMX_U32)(-1);
|
| + OMX_U32 maxV = allOnes >> (32-satBits);
|
| + OMX_F32 vShifted, vRounded, shiftDiv = (OMX_F32)(1 << shift);
|
| + OMX_U32 vInt;
|
| + OMX_U32 vIntSat;
|
| +
|
| + if(v <= 0)
|
| + return 0;
|
| +
|
| + vShifted = v / shiftDiv;
|
| + vRounded = (OMX_F32)(vShifted + 0.5);
|
| + vInt = (OMX_U32)vRounded;
|
| + vIntSat = vInt;
|
| + if(vIntSat > maxV)
|
| + vIntSat = maxV;
|
| + return vIntSat;
|
| +}
|
| +
|
| +/**
|
| + * Functions: armSwapElem
|
| + *
|
| + * Description:
|
| + * These function swaps two elements at the specified pointer locations.
|
| + * The size of each element could be anything as specified by <elemSize>
|
| + *
|
| + * Return Value:
|
| + * OMXResult -- Error status from the function
|
| + */
|
| +OMXResult armSwapElem(
|
| + OMX_U8 *pBuf1,
|
| + OMX_U8 *pBuf2,
|
| + OMX_INT elemSize
|
| + )
|
| +{
|
| + OMX_INT i;
|
| + OMX_U8 temp;
|
| + armRetArgErrIf(!pBuf1 || !pBuf2, OMX_Sts_BadArgErr);
|
| +
|
| + for(i = 0; i < elemSize; i++)
|
| + {
|
| + temp = *(pBuf1 + i);
|
| + *(pBuf1 + i) = *(pBuf2 + i);
|
| + *(pBuf2 + i) = temp;
|
| + }
|
| + return OMX_Sts_NoErr;
|
| +}
|
| +
|
| +/**
|
| + * Function: armMedianOf3
|
| + *
|
| + * Description: Finds the median of three numbers
|
| + *
|
| + * Remarks:
|
| + *
|
| + * Parameters:
|
| + * [in] fEntry First entry
|
| + * [in] sEntry second entry
|
| + * [in] tEntry Third entry
|
| + *
|
| + * Return Value:
|
| + * OMX_S32 -- returns the median value
|
| + */
|
| +
|
| +OMX_S32 armMedianOf3 (
|
| + OMX_S32 fEntry,
|
| + OMX_S32 sEntry,
|
| + OMX_S32 tEntry
|
| +)
|
| +{
|
| + OMX_S32 a, b, c;
|
| +
|
| + a = armMin (fEntry, sEntry);
|
| + b = armMax (fEntry, sEntry);
|
| + c = armMin (b, tEntry);
|
| + return (armMax (a, c));
|
| +}
|
| +
|
| +/**
|
| + * Function: armLogSize
|
| + *
|
| + * Description: Finds the size of a positive value and returns the same
|
| + *
|
| + * Remarks:
|
| + *
|
| + * Parameters:
|
| + * [in] value Positive value
|
| + *
|
| + * Return Value:
|
| + * OMX_U8 -- Returns the minimum number of bits required to represent the positive value.
|
| + This is the smallest k>=0 such that that value is less than (1<<k).
|
| + */
|
| +
|
| +OMX_U8 armLogSize (
|
| + OMX_U16 value
|
| +)
|
| +{
|
| + OMX_U8 i;
|
| + for ( i = 0; value > 0; value = value >> 1)
|
| + {
|
| + i++;
|
| + }
|
| + return i;
|
| +}
|
| +
|
| +/***********************************************************************/
|
| + /* Saturating Arithmetic operations */
|
| +
|
| +/**
|
| + * Function :armSatAdd_S32()
|
| + *
|
| + * Description :
|
| + * Returns the result of saturated addition of the two inputs Value1, Value2
|
| + *
|
| + * Parametrs:
|
| + * [in] Value1 First Operand
|
| + * [in] Value2 Second Operand
|
| + *
|
| + * Return:
|
| + * [out] Result of operation
|
| + *
|
| + *
|
| + **/
|
| +
|
| +OMX_S32 armSatAdd_S32(OMX_S32 Value1,OMX_S32 Value2)
|
| +{
|
| + OMX_S32 Result;
|
| +
|
| + Result = Value1 + Value2;
|
| +
|
| + if( (Value1^Value2) >= 0)
|
| + {
|
| + /*Same sign*/
|
| + if( (Result^Value1) >= 0)
|
| + {
|
| + /*Result has not saturated*/
|
| + return Result;
|
| + }
|
| + else
|
| + {
|
| + if(Value1 >= 0)
|
| + {
|
| + /*Result has saturated in positive side*/
|
| + return OMX_MAX_S32;
|
| + }
|
| + else
|
| + {
|
| + /*Result has saturated in negative side*/
|
| + return OMX_MIN_S32;
|
| + }
|
| +
|
| + }
|
| +
|
| + }
|
| + else
|
| + {
|
| + return Result;
|
| + }
|
| +
|
| +}
|
| +
|
| +/**
|
| + * Function :armSatAdd_S64()
|
| + *
|
| + * Description :
|
| + * Returns the result of saturated addition of the two inputs Value1, Value2
|
| + *
|
| + * Parametrs:
|
| + * [in] Value1 First Operand
|
| + * [in] Value2 Second Operand
|
| + *
|
| + * Return:
|
| + * [out] Result of operation
|
| + *
|
| + *
|
| + **/
|
| +
|
| +OMX_S64 armSatAdd_S64(OMX_S64 Value1,OMX_S64 Value2)
|
| +{
|
| + OMX_S64 Result;
|
| +
|
| + Result = Value1 + Value2;
|
| +
|
| + if( (Value1^Value2) >= 0)
|
| + {
|
| + /*Same sign*/
|
| + if( (Result^Value1) >= 0)
|
| + {
|
| + /*Result has not saturated*/
|
| + return Result;
|
| + }
|
| + else
|
| + {
|
| + if(Value1 >= 0)
|
| + {
|
| + /*Result has saturated in positive side*/
|
| + Result = OMX_MAX_S64;
|
| + return Result;
|
| + }
|
| + else
|
| + {
|
| + /*Result has saturated in negative side*/
|
| + return OMX_MIN_S64;
|
| + }
|
| +
|
| + }
|
| +
|
| + }
|
| + else
|
| + {
|
| + return Result;
|
| + }
|
| +
|
| +}
|
| +
|
| +/** Function :armSatSub_S32()
|
| + *
|
| + * Description :
|
| + * Returns the result of saturated substraction of the two inputs Value1, Value2
|
| + *
|
| + * Parametrs:
|
| + * [in] Value1 First Operand
|
| + * [in] Value2 Second Operand
|
| + *
|
| + * Return:
|
| + * [out] Result of operation
|
| + *
|
| + **/
|
| +
|
| +OMX_S32 armSatSub_S32(OMX_S32 Value1,OMX_S32 Value2)
|
| +{
|
| + OMX_S32 Result;
|
| +
|
| + Result = Value1 - Value2;
|
| +
|
| + if( (Value1^Value2) < 0)
|
| + {
|
| + /*Opposite sign*/
|
| + if( (Result^Value1) >= 0)
|
| + {
|
| + /*Result has not saturated*/
|
| + return Result;
|
| + }
|
| + else
|
| + {
|
| + if(Value1 >= 0)
|
| + {
|
| + /*Result has saturated in positive side*/
|
| + return OMX_MAX_S32;
|
| + }
|
| + else
|
| + {
|
| + /*Result has saturated in negative side*/
|
| + return OMX_MIN_S32;
|
| + }
|
| +
|
| + }
|
| +
|
| + }
|
| + else
|
| + {
|
| + return Result;
|
| + }
|
| +
|
| +}
|
| +
|
| +/**
|
| + * Function :armSatMac_S32()
|
| + *
|
| + * Description :
|
| + * Returns the result of Multiplication of Value1 and Value2 and subesquent saturated
|
| + * accumulation with Mac
|
| + *
|
| + * Parametrs:
|
| + * [in] Value1 First Operand
|
| + * [in] Value2 Second Operand
|
| + * [in] Mac Accumulator
|
| + *
|
| + * Return:
|
| + * [out] Result of operation
|
| + **/
|
| +
|
| +OMX_S32 armSatMac_S32(OMX_S32 Mac,OMX_S16 Value1,OMX_S16 Value2)
|
| +{
|
| + OMX_S32 Result;
|
| +
|
| + Result = (OMX_S32)(Value1*Value2);
|
| + Result = armSatAdd_S32( Mac , Result );
|
| +
|
| + return Result;
|
| +}
|
| +
|
| +/**
|
| + * Function :armSatMac_S16S32_S32
|
| + *
|
| + * Description :
|
| + * Returns the result of saturated MAC operation of the three inputs delayElem, filTap , mac
|
| + *
|
| + * mac = mac + Saturate_in_32Bits(delayElem * filTap)
|
| + *
|
| + * Parametrs:
|
| + * [in] delayElem First 32 bit Operand
|
| + * [in] filTap Second 16 bit Operand
|
| + * [in] mac Result of MAC operation
|
| + *
|
| + * Return:
|
| + * [out] mac Result of operation
|
| + *
|
| + **/
|
| +
|
| +OMX_S32 armSatMac_S16S32_S32(OMX_S32 mac, OMX_S32 delayElem, OMX_S16 filTap )
|
| +{
|
| +
|
| + OMX_S32 result;
|
| +
|
| + result = armSatMulS16S32_S32(filTap,delayElem);
|
| +
|
| + if ( result > OMX_MAX_S16 )
|
| + {
|
| + result = OMX_MAX_S32;
|
| + }
|
| + else if( result < OMX_MIN_S16 )
|
| + {
|
| + result = OMX_MIN_S32;
|
| + }
|
| + else
|
| + {
|
| + result = delayElem * filTap;
|
| + }
|
| +
|
| + mac = armSatAdd_S32(mac,result);
|
| +
|
| + return mac;
|
| +}
|
| +
|
| +
|
| +/**
|
| + * Function :armSatRoundRightShift_S32_S16
|
| + *
|
| + * Description :
|
| + * Returns the result of rounded right shift operation of input by the scalefactor
|
| + *
|
| + * output = Saturate_in_16Bits( ( Right/LeftShift( (Round(input) , shift ) )
|
| + *
|
| + * Parametrs:
|
| + * [in] input The input to be operated on
|
| + * [in] shift The shift number
|
| + *
|
| + * Return:
|
| + * [out] Result of operation
|
| + *
|
| + **/
|
| +
|
| +
|
| +OMX_S16 armSatRoundRightShift_S32_S16(OMX_S32 input, OMX_INT shift)
|
| +{
|
| + input = armSatRoundLeftShift_S32(input,-shift);
|
| +
|
| + if ( input > OMX_MAX_S16 )
|
| + {
|
| + return (OMX_S16)OMX_MAX_S16;
|
| + }
|
| + else if (input < OMX_MIN_S16)
|
| + {
|
| + return (OMX_S16)OMX_MIN_S16;
|
| + }
|
| + else
|
| + {
|
| + return (OMX_S16)input;
|
| + }
|
| +
|
| +}
|
| +
|
| +/**
|
| + * Function :armSatRoundLeftShift_S32()
|
| + *
|
| + * Description :
|
| + * Returns the result of saturating left-shift operation on input
|
| + * Or rounded Right shift if the input Shift is negative.
|
| + *
|
| + * Parametrs:
|
| + * [in] Value Operand
|
| + * [in] Shift Operand for shift operation
|
| + *
|
| + * Return:
|
| + * [out] Result of operation
|
| + *
|
| + **/
|
| +
|
| +OMX_S32 armSatRoundLeftShift_S32(OMX_S32 Value, OMX_INT Shift)
|
| +{
|
| + OMX_INT i;
|
| +
|
| + if (Shift < 0)
|
| + {
|
| + Shift = -Shift;
|
| + Value = armSatAdd_S32(Value, (1 << (Shift - 1)));
|
| + Value = Value >> Shift;
|
| + }
|
| + else
|
| + {
|
| + for (i = 0; i < Shift; i++)
|
| + {
|
| + Value = armSatAdd_S32(Value, Value);
|
| + }
|
| + }
|
| + return Value;
|
| +}
|
| +
|
| +/**
|
| + * Function :armSatRoundLeftShift_S64()
|
| + *
|
| + * Description :
|
| + * Returns the result of saturating left-shift operation on input
|
| + * Or rounded Right shift if the input Shift is negative.
|
| + *
|
| + * Parametrs:
|
| + * [in] Value Operand
|
| + * [in] shift Operand for shift operation
|
| + *
|
| + * Return:
|
| + * [out] Result of operation
|
| + *
|
| + **/
|
| +
|
| +OMX_S64 armSatRoundLeftShift_S64(OMX_S64 Value, OMX_INT Shift)
|
| +{
|
| + OMX_INT i;
|
| +
|
| + if (Shift < 0)
|
| + {
|
| + Shift = -Shift;
|
| + Value = armSatAdd_S64(Value, ((OMX_S64)1 << (Shift - 1)));
|
| + Value = Value >> Shift;
|
| + }
|
| + else
|
| + {
|
| + for (i = 0; i < Shift; i++)
|
| + {
|
| + Value = armSatAdd_S64(Value, Value);
|
| + }
|
| + }
|
| + return Value;
|
| +}
|
| +
|
| +/**
|
| + * Function :armSatMulS16S32_S32()
|
| + *
|
| + * Description :
|
| + * Returns the result of a S16 data type multiplied with an S32 data type
|
| + * in a S32 container
|
| + *
|
| + * Parametrs:
|
| + * [in] input1 Operand 1
|
| + * [in] input2 Operand 2
|
| + *
|
| + * Return:
|
| + * [out] Result of operation
|
| + *
|
| + **/
|
| +
|
| +
|
| +OMX_S32 armSatMulS16S32_S32(OMX_S16 input1,OMX_S32 input2)
|
| +{
|
| + OMX_S16 hi2,lo1;
|
| + OMX_U16 lo2;
|
| +
|
| + OMX_S32 temp1,temp2;
|
| + OMX_S32 result;
|
| +
|
| + lo1 = input1;
|
| +
|
| + hi2 = ( input2 >> 16 );
|
| + lo2 = ( (OMX_U32)( input2 << 16 ) >> 16 );
|
| +
|
| + temp1 = hi2 * lo1;
|
| + temp2 = ( lo2* lo1 ) >> 16;
|
| +
|
| + result = armSatAdd_S32(temp1,temp2);
|
| +
|
| + return result;
|
| +}
|
| +
|
| +/**
|
| + * Function :armSatMulS32S32_S32()
|
| + *
|
| + * Description :
|
| + * Returns the result of a S32 data type multiplied with an S32 data type
|
| + * in a S32 container
|
| + *
|
| + * Parametrs:
|
| + * [in] input1 Operand 1
|
| + * [in] input2 Operand 2
|
| + *
|
| + * Return:
|
| + * [out] Result of operation
|
| + *
|
| + **/
|
| +
|
| +OMX_S32 armSatMulS32S32_S32(OMX_S32 input1,OMX_S32 input2)
|
| +{
|
| + OMX_S16 hi1,hi2;
|
| + OMX_U16 lo1,lo2;
|
| +
|
| + OMX_S32 temp1,temp2,temp3;
|
| + OMX_S32 result;
|
| +
|
| + hi1 = ( input1 >> 16 );
|
| + lo1 = ( (OMX_U32)( input1 << 16 ) >> 16 );
|
| +
|
| + hi2 = ( input2 >> 16 );
|
| + lo2 = ( (OMX_U32)( input2 << 16 ) >> 16 );
|
| +
|
| + temp1 = hi1 * hi2;
|
| + temp2 = ( hi1* lo2 ) >> 16;
|
| + temp3 = ( hi2* lo1 ) >> 16;
|
| +
|
| + result = armSatAdd_S32(temp1,temp2);
|
| + result = armSatAdd_S32(result,temp3);
|
| +
|
| + return result;
|
| +}
|
| +
|
| +/**
|
| + * Function :armIntDivAwayFromZero()
|
| + *
|
| + * Description : Integer division with rounding to the nearest integer.
|
| + * Half-integer values are rounded away from zero
|
| + * unless otherwise specified. For example 3//2 is rounded
|
| + * to 2, and -3//2 is rounded to -2.
|
| + *
|
| + * Parametrs:
|
| + * [in] Num Operand 1
|
| + * [in] Deno Operand 2
|
| + *
|
| + * Return:
|
| + * [out] Result of operation input1//input2
|
| + *
|
| + **/
|
| +
|
| +OMX_S32 armIntDivAwayFromZero (OMX_S32 Num, OMX_S32 Deno)
|
| +{
|
| + OMX_F64 result;
|
| +
|
| + result = ((OMX_F64)Num)/((OMX_F64)Deno);
|
| +
|
| + if (result >= 0)
|
| + {
|
| + result += 0.5;
|
| + }
|
| + else
|
| + {
|
| + result -= 0.5;
|
| + }
|
| +
|
| + return (OMX_S32)(result);
|
| +}
|
| +
|
| +
|
| +/*End of File*/
|
| +
|
|
|