blob: 88ff9bcac777dec1389d0e0837bbd69202d58c41 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
/****************************************************************************************
Portions of this file are derived from the following 3GPP standard:
3GPP TS 26.173
ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
Available from http://www.3gpp.org
(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
Permission to distribute, modify and use this file under the standard license
terms listed above has been obtained from the copyright holder.
****************************************************************************************/
/*
------------------------------------------------------------------------------
Pathname: ./src/pvamrwbdecoder_basic_op.h
Date: 05/07/2007
------------------------------------------------------------------------------
REVISION HISTORY
Description:
------------------------------------------------------------------------------
INCLUDE DESCRIPTION
------------------------------------------------------------------------------
*/
#ifndef PVAMRWBDECODER_BASIC_OP_H
#define PVAMRWBDECODER_BASIC_OP_H
#include "normalize_amr_wb.h"
#define MAX_32 (int32)0x7fffffffL
#define MIN_32 (int32)0x80000000L
#define MAX_16 ((int16)+32767) /* 0x7fff */
#define MIN_16 ((int16)-32768) /* 0x8000 */
/*----------------------------------------------------------------------------
Function Name : negate_int16
Negate var1 with saturation, saturate in the case where input is -32768:
negate(var1) = sub(0,var1).
Inputs :
var1
16 bit short signed integer (int16) whose value falls in the
range : 0x8000 <= var1 <= 0x7fff.
Outputs :
none
Return Value :
16 bit short signed integer (int16) whose value falls in the
range : 0x8000 <= var_out <= 0x7fff.
----------------------------------------------------------------------------*/
__inline int16 negate_int16(int16 var1)
{
return (((var1 == MIN_16) ? MAX_16 : -var1));
}
/*----------------------------------------------------------------------------
Function Name : shl_int16
Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill
the var2 LSB of the result. If var2 is negative, arithmetically shift
var1 right by -var2 with sign extension. Saturate the result in case of
underflows or overflows.
Inputs :
var1
16 bit short signed integer (int16) whose value falls in the
range : 0x8000 <= var1 <= 0x7fff.
var2
16 bit short signed integer (int16) whose value falls in the
range : 0x8000 <= var1 <= 0x7fff.
Return Value :
var_out
16 bit short signed integer (int16) whose value falls in the
range : 0x8000 <= var_out <= 0x7fff.
----------------------------------------------------------------------------*/
__inline int16 shl_int16(int16 var1, int16 var2)
{
int16 var_out;
if (var2 < 0)
{
var2 = (-var2) & (0xf);
var_out = var1 >> var2;
}
else
{
var2 &= 0xf;
var_out = var1 << var2;
if (var_out >> var2 != var1)
{
var_out = (var1 >> 15) ^ MAX_16;
}
}
return (var_out);
}
/*----------------------------------------------------------------------------
Function Name : shl_int32
Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero
fill the var2 LSB of the result. If var2 is negative, arithmetically
shift L_var1 right by -var2 with sign extension. Saturate the result in
case of underflows or overflows.
Inputs :
L_var1 32 bit long signed integer (int32) whose value falls in the
range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
var2
16 bit short signed integer (int16) whose value falls in the
range : 8000 <= var2 <= 7fff.
Return Value :
32 bit long signed integer (int32) whose value falls in the
range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
----------------------------------------------------------------------------*/
__inline int32 shl_int32(int32 L_var1, int16 var2)
{
int32 L_var_out;
if (var2 > 0)
{
L_var_out = L_var1 << var2;
if (L_var_out >> var2 != L_var1)
{
L_var_out = (L_var1 >> 31) ^ MAX_32;
}
}
else
{
var2 = (-var2) & (0xf);
L_var_out = L_var1 >> var2;
}
return (L_var_out);
}
/*----------------------------------------------------------------------------
Function Name : shr_int32
Arithmetically shift the 32 bit input L_var1 right var2 positions with
sign extension. If var2 is negative, arithmetically shift L_var1 left
by -var2 and zero fill the -var2 LSB of the result. Saturate the result
in case of underflows or overflows.
Inputs :
L_var1 32 bit long signed integer (int32) whose value falls in the
range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
var2
16 bit short signed integer (int16) whose value falls in the
range : 8000 <= var2 <= 7fff.
Return Value :
32 bit long signed integer (int32) whose value falls in the
range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
----------------------------------------------------------------------------*/
__inline int32 shr_int32(int32 L_var1, int16 var2)
{
int32 L_var_out;
if (var2 >= 0)
{
L_var_out = L_var1 >> (var2 & 0x1f);
}
else
{
var2 = (int16)(-var2);
var2 &= 0x1f;
L_var_out = L_var1 << var2;
if (L_var_out >> var2 != L_var1)
{
L_var_out = (L_var1 >> 31) ^ MAX_32;
}
}
return (L_var_out);
}
#if defined(PV_ARM_V5)
#include "pvamrwbdecoder_basic_op_armv5.h"
#elif defined(PV_ARM_GCC_V5)
#include "pvamrwbdecoder_basic_op_gcc_armv5.h"
#else
#ifndef C_EQUIVALENT
#define C_EQUIVALENT // default to C_EQUIVALENT
#endif
#include "pvamrwbdecoder_basic_op_cequivalent.h"
#endif
#endif /* PVAMRWBDECODER_BASIC_OP_H */