1/* 2 * Copyright (C) 2004-2010 NXP Software 3 * Copyright (C) 2010 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18#ifndef _VECTOR_ARITHMETIC_H_ 19#define _VECTOR_ARITHMETIC_H_ 20 21 22#ifdef __cplusplus 23extern "C" { 24#endif /* __cplusplus */ 25 26#include "LVM_Types.h" 27 28/********************************************************************************** 29 VARIOUS FUNCTIONS 30***********************************************************************************/ 31 32void LoadConst_16( const LVM_INT16 val, 33 LVM_INT16 *dst, 34 LVM_INT16 n ); 35 36void LoadConst_32( const LVM_INT32 val, 37 LVM_INT32 *dst, 38 LVM_INT16 n ); 39 40void Copy_16( const LVM_INT16 *src, 41 LVM_INT16 *dst, 42 LVM_INT16 n ); 43 44/********************************************************************************* 45 * note: In Mult3s_16x16() saturation of result is not taken care when * 46 * overflow occurs. * 47 * For example when *src = 0x8000, val = *0x8000 * 48 * The function gives the output as 0x8000 instead of 0x7fff * 49 * This is the only case which will give wrong result. * 50 * For more information refer to Vector_Arithmetic.doc in /doc folder * 51 *********************************************************************************/ 52void Mult3s_16x16( const LVM_INT16 *src, 53 const LVM_INT16 val, 54 LVM_INT16 *dst, 55 LVM_INT16 n); 56 57/********************************************************************************* 58 * note: In Mult3s_32x16() saturation of result is not taken care when * 59 * overflow occurs. * 60 * For example when *src = 0x8000000, val = *0x8000 * 61 * The function gives the output as 0x8000000 instead of 0x7fffffff * 62 * This is the only extreme condition which is giving unexpected result * 63 * For more information refer to Vector_Arithmetic.doc in /doc folder * 64 *********************************************************************************/ 65void Mult3s_32x16( const LVM_INT32 *src, 66 const LVM_INT16 val, 67 LVM_INT32 *dst, 68 LVM_INT16 n); 69 70void DelayMix_16x16( const LVM_INT16 *src, 71 LVM_INT16 *delay, 72 LVM_INT16 size, 73 LVM_INT16 *dst, 74 LVM_INT16 *pOffset, 75 LVM_INT16 n); 76 77void DelayWrite_32( const LVM_INT32 *src, /* Source 1, to be delayed */ 78 LVM_INT32 *delay, /* Delay buffer */ 79 LVM_UINT16 size, /* Delay size */ 80 LVM_UINT16 *pOffset, /* Delay offset */ 81 LVM_INT16 n); 82 83void Add2_Sat_16x16( const LVM_INT16 *src, 84 LVM_INT16 *dst, 85 LVM_INT16 n ); 86 87void Add2_Sat_32x32( const LVM_INT32 *src, 88 LVM_INT32 *dst, 89 LVM_INT16 n ); 90 91void Mac3s_Sat_16x16( const LVM_INT16 *src, 92 const LVM_INT16 val, 93 LVM_INT16 *dst, 94 LVM_INT16 n); 95 96void Mac3s_Sat_32x16( const LVM_INT32 *src, 97 const LVM_INT16 val, 98 LVM_INT32 *dst, 99 LVM_INT16 n); 100 101void DelayAllPass_Sat_32x16To32( LVM_INT32 *delay, /* Delay buffer */ 102 LVM_UINT16 size, /* Delay size */ 103 LVM_INT16 coeff, /* All pass filter coefficient */ 104 LVM_UINT16 DelayOffset, /* Simple delay offset */ 105 LVM_UINT16 *pAllPassOffset, /* All pass filter delay offset */ 106 LVM_INT32 *dst, /* Source/destination */ 107 LVM_INT16 n); 108 109/********************************************************************************** 110 SHIFT FUNCTIONS 111***********************************************************************************/ 112 113void Shift_Sat_v16xv16 ( const LVM_INT16 val, 114 const LVM_INT16 *src, 115 LVM_INT16 *dst, 116 LVM_INT16 n); 117 118void Shift_Sat_v32xv32 ( const LVM_INT16 val, 119 const LVM_INT32 *src, 120 LVM_INT32 *dst, 121 LVM_INT16 n); 122 123/********************************************************************************** 124 AUDIO FORMAT CONVERSION FUNCTIONS 125***********************************************************************************/ 126 127void MonoTo2I_16( const LVM_INT16 *src, 128 LVM_INT16 *dst, 129 LVM_INT16 n); 130 131void MonoTo2I_32( const LVM_INT32 *src, 132 LVM_INT32 *dst, 133 LVM_INT16 n); 134 135void From2iToMono_32( const LVM_INT32 *src, 136 LVM_INT32 *dst, 137 LVM_INT16 n); 138 139void MSTo2i_Sat_16x16( const LVM_INT16 *srcM, 140 const LVM_INT16 *srcS, 141 LVM_INT16 *dst, 142 LVM_INT16 n ); 143 144void From2iToMS_16x16( const LVM_INT16 *src, 145 LVM_INT16 *dstM, 146 LVM_INT16 *dstS, 147 LVM_INT16 n ); 148 149void From2iToMono_16( const LVM_INT16 *src, 150 LVM_INT16 *dst, 151 LVM_INT16 n); 152 153void JoinTo2i_32x32( const LVM_INT32 *srcL, 154 const LVM_INT32 *srcR, 155 LVM_INT32 *dst, 156 LVM_INT16 n ); 157 158/********************************************************************************** 159 DATA TYPE CONVERSION FUNCTIONS 160***********************************************************************************/ 161 162void Int16LShiftToInt32_16x32(const LVM_INT16 *src, 163 LVM_INT32 *dst, 164 LVM_INT16 n, 165 LVM_INT16 shift ); 166 167void Int32RShiftToInt16_Sat_32x16(const LVM_INT32 *src, 168 LVM_INT16 *dst, 169 LVM_INT16 n, 170 LVM_INT16 shift ); 171 172#ifdef __cplusplus 173} 174#endif /* __cplusplus */ 175 176 177/**********************************************************************************/ 178 179#endif /* _VECTOR_ARITHMETIC_H_ */ 180 181/**********************************************************************************/ 182