12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software 32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project 42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License. 72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at 82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software 122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and 152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License. 162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifndef _VECTOR_ARITHMETIC_H_ 192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define _VECTOR_ARITHMETIC_H_ 202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifdef __cplusplus 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" { 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* __cplusplus */ 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Types.h" 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent VARIOUS FUNCTIONS 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LoadConst_16( const LVM_INT16 val, 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n ); 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LoadConst_32( const LVM_INT32 val, 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n ); 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Copy_16( const LVM_INT16 *src, 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n ); 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************* 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * note: In Mult3s_16x16() saturation of result is not taken care when * 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * overflow occurs. * 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * For example when *src = 0x8000, val = *0x8000 * 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * The function gives the output as 0x8000 instead of 0x7fff * 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * This is the only case which will give wrong result. * 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * For more information refer to Vector_Arithmetic.doc in /doc folder * 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *********************************************************************************/ 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Mult3s_16x16( const LVM_INT16 *src, 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 val, 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************* 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * note: In Mult3s_32x16() saturation of result is not taken care when * 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * overflow occurs. * 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * For example when *src = 0x8000000, val = *0x8000 * 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * The function gives the output as 0x8000000 instead of 0x7fffffff * 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * This is the only extreme condition which is giving unexpected result * 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * For more information refer to Vector_Arithmetic.doc in /doc folder * 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *********************************************************************************/ 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Mult3s_32x16( const LVM_INT32 *src, 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 val, 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid DelayMix_16x16( const LVM_INT16 *src, 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *delay, 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 size, 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *pOffset, 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid DelayWrite_32( const LVM_INT32 *src, /* Source 1, to be delayed */ 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *delay, /* Delay buffer */ 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 size, /* Delay size */ 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 *pOffset, /* Delay offset */ 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Add2_Sat_16x16( const LVM_INT16 *src, 842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n ); 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Add2_Sat_32x32( const LVM_INT32 *src, 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n ); 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Mac3s_Sat_16x16( const LVM_INT16 *src, 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 val, 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Mac3s_Sat_32x16( const LVM_INT32 *src, 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 val, 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid DelayAllPass_Sat_32x16To32( LVM_INT32 *delay, /* Delay buffer */ 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 size, /* Delay size */ 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 coeff, /* All pass filter coefficient */ 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 DelayOffset, /* Simple delay offset */ 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 *pAllPassOffset, /* All pass filter delay offset */ 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, /* Source/destination */ 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent SHIFT FUNCTIONS 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Shift_Sat_v16xv16 ( const LVM_INT16 val, 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 *src, 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Shift_Sat_v32xv32 ( const LVM_INT16 val, 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT32 *src, 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent AUDIO FORMAT CONVERSION FUNCTIONS 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid MonoTo2I_16( const LVM_INT16 *src, 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid MonoTo2I_32( const LVM_INT32 *src, 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid From2iToMono_32( const LVM_INT32 *src, 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid MSTo2i_Sat_16x16( const LVM_INT16 *srcM, 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 *srcS, 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n ); 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid From2iToMS_16x16( const LVM_INT16 *src, 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dstM, 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dstS, 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n ); 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid From2iToMono_16( const LVM_INT16 *src, 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n); 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid JoinTo2i_32x32( const LVM_INT32 *srcL, 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT32 *srcR, 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n ); 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DATA TYPE CONVERSION FUNCTIONS 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Int16LShiftToInt32_16x32(const LVM_INT16 *src, 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *dst, 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n, 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 shift ); 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Int32RShiftToInt16_Sat_32x16(const LVM_INT32 *src, 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n, 1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 shift ); 1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifdef __cplusplus 1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* __cplusplus */ 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/ 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* _VECTOR_ARITHMETIC_H_ */ 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/ 182