?? g729a_basic_op.c
字號:
#include "../Common/typedef.h"
#include "../Include/G729A_basic_op.h"
static Word16 G729Asature(Word32 L_var1);
static Flag G729AOverMax = 0X00007fffL;
static Flag G729AOverMin = 0xffff8000L;
Flag G729AOverflow =0;
static Word16 G729Asature(Word32 L_var1)
{
G729AOverflow = (L_var1 > G729AOverMax) + (L_var1 < G729AOverMin);
return _ext(_spack2(L_var1, L_var1), 16, 16);
}
Word16 G729Aadd_s(Word16 var1,Word16 var2)
{
Word32 L_somme;
L_somme = _sadd(var1, var2);
G729AOverflow = (L_somme > G729AOverMax) + (L_somme < G729AOverMin);
return _ext(_spack2(L_somme, L_somme), 16, 16);
}
Word16 G729Asub_s(Word16 var1,Word16 var2)
{
Word32 L_diff;
L_diff = _ssub(var1, var2);
G729AOverflow = (L_diff > G729AOverMax) + (L_diff < G729AOverMin);
return _ext(_spack2(L_diff, L_diff), 16, 16);
}
Word16 G729Ashl_s(Word16 var1,Word16 var2)
{
Word32 L_result;
L_result = _sshvl((Word32)var1, (Word32)var2);
G729AOverflow = (L_result > G729AOverMax) + (L_result < G729AOverMin);
return (Word16)_spack2(L_result, L_result);
}
Word16 G729Ashr_s(Word16 var1,Word16 var2)
{
Word16 var_out;
if (var2 < 0)
{
var_out = G729Ashl_s(var1,-var2);
}
else
{
if (var2 >= 15)
{
var_out = (var1 < 0) ? (Word16)(-1) : (Word16)0;
}
else
{
if (var1 < 0)
{
var_out = ~(( ~var1) >> var2 );
}
else
{
var_out = var1 >> var2;
}
}
}
return(var_out);
}
Word16 G729Amult(Word16 var1, Word16 var2)
{
Word16 var_out;
Word32 L_produit;
L_produit = (Word32)var1 * (Word32)var2;
L_produit = (L_produit & (Word32) 0xffff8000L) >> 15;
if (L_produit & (Word32) 0x00010000L)
L_produit = L_produit | (Word32) 0xffff0000L;
var_out = G729Asature(L_produit);
return (var_out);
}
Word32 G729AL_mult(Word16 var1,Word16 var2)
{
Word32 L_var_out;
L_var_out = (Word32)var1 * (Word32)var2;
if (L_var_out != (Word32)0x40000000L)
{
L_var_out *= 2;
}
else
{
G729AOverflow = 1;
L_var_out = G729AMAX_32;
}
return(L_var_out);
}
Word16 G729Around(Word32 L_var1)
{
Word16 var_out;
Word32 L_arrondi;
L_arrondi = G729AL_add(L_var1, (Word32)0x00008000);
var_out = G729Aextract_h(L_arrondi);
return(var_out);
}
Word32 G729AL_mac(Word32 L_var3, Word16 var1, Word16 var2)
{
Word32 L_var_out;
Word32 L_produit;
L_produit = G729AL_mult(var1,var2);
L_var_out = G729AL_add(L_var3,L_produit);
return(L_var_out);
}
Word32 G729AL_msu(Word32 L_var3, Word16 var1, Word16 var2)
{
Word32 L_var_out;
Word32 L_produit;
L_produit = G729AL_mult(var1,var2);
L_var_out = G729AL_sub(L_var3,L_produit);
return(L_var_out);
}
Word32 G729AL_add(Word32 L_var1, Word32 L_var2)
{
Word32 L_var_out;
L_var_out = L_var1 + L_var2;
if (((L_var1 ^ L_var2) & G729AMIN_32) == 0)
{
if ((L_var_out ^ L_var1) & G729AMIN_32)
{
L_var_out = (L_var1 < 0) ? G729AMIN_32 : G729AMAX_32;
G729AOverflow = 1;
}
}
return(L_var_out);
}
Word32 G729AL_sub(Word32 L_var1, Word32 L_var2)
{
Word32 L_var_out;
L_var_out = L_var1 - L_var2;
if (((L_var1 ^ L_var2) & G729AMIN_32) != 0)
{
if ((L_var_out ^ L_var1) & G729AMIN_32)
{
L_var_out = (L_var1 < 0L) ? G729AMIN_32 : G729AMAX_32;
G729AOverflow = 1;
}
}
return(L_var_out);
}
Word16 G729Amult_r(Word16 var1, Word16 var2)
{
Word16 var_out;
Word32 L_produit_arr;
L_produit_arr = (Word32)var1 * (Word32)var2;
L_produit_arr += (Word32) 0x00004000;
L_produit_arr &= (Word32) 0xffff8000L;
L_produit_arr >>= 15;
if (L_produit_arr & (Word32) 0x00010000L)
{
L_produit_arr |= (Word32) 0xffff0000L;
}
var_out = G729Asature(L_produit_arr);
return(var_out);
}
Word32 G729AL_shl(Word32 L_var1, Word16 var2)
{
Word32 L_var_out;
L_var_out = 0L;
if (var2 <= 0)
{
L_var_out = G729AL_shr(L_var1,-var2);
}
else
{
for(;var2>0;var2--)
{
if (L_var1 > (Word32) 0X3fffffffL)
{
G729AOverflow = 1;
L_var_out = G729AMAX_32;
break;
}
else
{
if (L_var1 < (Word32) 0xc0000000L)
{
G729AOverflow = 1;
L_var_out = G729AMIN_32;
break;
}
}
L_var1 *= 2;
L_var_out = L_var1;
}
}
return(L_var_out);
}
Word32 G729AL_shr(Word32 L_var1, Word16 var2)
{
Word32 L_var_out;
if (var2 < 0)
{
L_var_out = G729AL_shl(L_var1,-var2);
}
else
{
if (var2 >= 31)
{
L_var_out = (L_var1 < 0L) ? -1 : 0;
}
else
{
if (L_var1<0)
{
L_var_out = ~((~L_var1) >> var2);
}
else
{
L_var_out = L_var1 >> var2;
}
}
}
return(L_var_out);
}
Word16 G729Ashr_r(Word16 var1, Word16 var2)
{
Word16 var_out;
if (var2>15)
{
var_out = 0;
}
else
{
var_out = G729Ashr_s(var1,var2);
if (var2 > 0)
{
if ((var1 & ((Word16)1 << (var2-1))) != 0)
{
var_out++;
}
}
}
return(var_out);
}
Word32 G729AL_shr_r(Word32 L_var1,Word16 var2)
{
Word32 L_var_out;
if (var2 > 31)
{
L_var_out = 0;
}
else
{
L_var_out = G729AL_shr(L_var1,var2);
if (var2 > 0)
{
if ( (L_var1 & ( (Word32)1 << (var2-1) )) != 0)
{
L_var_out++;
}
}
}
return(L_var_out);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -