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