Mercurial > mplayer.hg
changeset 31591:cc5e21203fb5
Remove copy of old and ugly libgsm code and wrapper.
Decoding these formats is supported via FFmpeg both natively and
through libgsm.
author | reimar |
---|---|
date | Sat, 10 Jul 2010 08:04:48 +0000 |
parents | dd1dc0ff5283 |
children | a4ceb52caa30 |
files | Makefile etc/codecs.conf libmpcodecs/ad.c libmpcodecs/ad_msgsm.c libmpcodecs/native/xa_gsm.c libmpcodecs/native/xa_gsm.h libmpcodecs/native/xa_gsm_int.h |
diffstat | 7 files changed, 0 insertions(+), 1226 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Sat Jul 10 07:57:06 2010 +0000 +++ b/Makefile Sat Jul 10 08:04:48 2010 +0000 @@ -383,14 +383,12 @@ libmpcodecs/ad_hwmpa.c \ libmpcodecs/ad_imaadpcm.c \ libmpcodecs/ad_msadpcm.c \ - libmpcodecs/ad_msgsm.c \ libmpcodecs/ad_pcm.c \ libmpcodecs/dec_audio.c \ libmpcodecs/dec_teletext.c \ libmpcodecs/dec_video.c \ libmpcodecs/img_format.c \ libmpcodecs/mp_image.c \ - libmpcodecs/native/xa_gsm.c \ libmpcodecs/pullup.c \ libmpcodecs/vd.c \ libmpcodecs/vd_hmblck.c \
--- a/etc/codecs.conf Sat Jul 10 07:57:06 2010 +0000 +++ b/etc/codecs.conf Sat Jul 10 08:04:48 2010 +0000 @@ -4316,16 +4316,6 @@ driver ffmpeg dll "libgsm_ms" -audiocodec msgsm - info "MS GSM" - status working - format 0x31 - format 0x32 - format 0x204D5347 - format 0x1500 - fourcc agsm - driver msgsm - audiocodec msgsmacm info "MS GSM" status working
--- a/libmpcodecs/ad.c Sat Jul 10 07:57:06 2010 +0000 +++ b/libmpcodecs/ad.c Sat Jul 10 08:04:48 2010 +0000 @@ -50,7 +50,6 @@ extern const ad_functions_t mpcodecs_ad_dshow; extern const ad_functions_t mpcodecs_ad_dmo; extern const ad_functions_t mpcodecs_ad_acm; -extern const ad_functions_t mpcodecs_ad_msgsm; extern const ad_functions_t mpcodecs_ad_faad; extern const ad_functions_t mpcodecs_ad_libvorbis; extern const ad_functions_t mpcodecs_ad_speex; @@ -85,7 +84,6 @@ &mpcodecs_ad_imaadpcm, &mpcodecs_ad_msadpcm, &mpcodecs_ad_dk3adpcm, - &mpcodecs_ad_msgsm, #ifdef CONFIG_WIN32DLL &mpcodecs_ad_dshow, &mpcodecs_ad_dmo,
--- a/libmpcodecs/ad_msgsm.c Sat Jul 10 07:57:06 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include "config.h" -#include "ad_internal.h" - -static const ad_info_t info = -{ - "native GSM/MSGSM audio decoder", - "msgsm", - "A'rpi", - "XAnim", - "" -}; - -LIBAD_EXTERN(msgsm) - -#include "native/xa_gsm.h" - -static int init(sh_audio_t *sh_audio) -{ - if(!sh_audio->wf) return 0; - // MS-GSM audio codec: - GSM_Init(); - sh_audio->channels=sh_audio->wf->nChannels; - sh_audio->samplerate=sh_audio->wf->nSamplesPerSec; - sh_audio->samplesize=2; - // decodes 65 byte -> 320 short - // 1 sec: sh_audio->channels*sh_audio->samplerate samples - // 1 frame: 320 samples - if(sh_audio->format==0x31 || sh_audio->format==0x32){ - sh_audio->ds->ss_mul=65; sh_audio->ds->ss_div=320; - } else { - sh_audio->ds->ss_mul=33; sh_audio->ds->ss_div=160; - } - sh_audio->i_bps=sh_audio->ds->ss_mul*(sh_audio->channels*sh_audio->samplerate)/sh_audio->ds->ss_div; // 1:10 - return 1; -} - -static int preinit(sh_audio_t *sh_audio) -{ - sh_audio->audio_out_minsize=4*320; - return 1; -} - -static void uninit(sh_audio_t *sh) -{ -} - -static int control(sh_audio_t *sh,int cmd,void* arg, ...) -{ - return CONTROL_UNKNOWN; -} - -static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) -{ - if(sh_audio->format==0x31 || sh_audio->format==0x32){ - unsigned char ibuf[65]; // 65 bytes / frame - if(demux_read_data(sh_audio->ds,ibuf,65)!=65) return -1; // EOF - XA_MSGSM_Decoder(ibuf,(unsigned short *) buf); // decodes 65 byte -> 320 short - return 2*320; - } else { - unsigned char ibuf[33]; // 33 bytes / frame - if(demux_read_data(sh_audio->ds,ibuf,33)!=33) return -1; // EOF - XA_GSM_Decoder(ibuf,(unsigned short *) buf); // decodes 33 byte -> 160 short - return 2*160; - } -}
--- a/libmpcodecs/native/xa_gsm.c Sat Jul 10 07:57:06 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,965 +0,0 @@ - -/* - Written by Mark Podlipec <podlipec@ici.net>. - - Most of this code comes from a GSM 06.10 library by - Jutta Degener and Carsten Bormann, available via - <http://www.pobox.com/~jutta/toast.html>. - - That library is distributed with the following copyright: - - Copyright 1992 by Jutta Degener and Carsten Bormann, - Technische Universitaet Berlin - -Any use of this software is permitted provided that this notice is not -removed and that neither the authors nor the Technische Universitaet Berlin -are deemed to have made any representations as to the suitability of this -software for any purpose nor are held responsible for any defects of -this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - -As a matter of courtesy, the authors request to be informed about uses -this software has found, about bugs in this software, and about any -improvements that may be of general interest. - - Berlin, 15.09.1992 - Jutta Degener - Carsten Bormann -*/ - - -#include <stdio.h> -#include <string.h> -#include <assert.h> /* POD optional */ -#include "xa_gsm_int.h" - -//void XA_MSGSM_Decoder(); -static void GSM_Decode(); -static void Gsm_RPE_Decoding(); - -//static short gsm_buf[320]; -static XA_GSM_STATE gsm_state; - - -void GSM_Init(void) -{ - memset((char *)(&gsm_state), 0, sizeof(XA_GSM_STATE)); - gsm_state.nrp = 40; -} - - -/* Table 4.3b Quantization levels of the LTP gain quantizer - */ -/* bc 0 1 2 3 */ -static word gsm_QLB[4] = { 3277, 11469, 21299, 32767 }; - -/* Table 4.6 Normalized direct mantissa used to compute xM/xmax - */ -/* i 0 1 2 3 4 5 6 7 */ -static word gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; - - - -/****************/ -#define saturate(x) \ - ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x)) - -/****************/ -static word gsm_sub (a,b) -word a; -word b; -{ - longword diff = (longword)a - (longword)b; - return saturate(diff); -} - -/****************/ -static word gsm_asr (a,n) -word a; -int n; -{ - if (n >= 16) return -(a < 0); - if (n <= -16) return 0; - if (n < 0) return a << -n; - -# ifdef SASR - return a >> n; -# else - if (a >= 0) return a >> n; - else return -(word)( -(uword)a >> n ); -# endif -} - -/****************/ -static word gsm_asl (a,n) -word a; -int n; -{ - if (n >= 16) return 0; - if (n <= -16) return -(a < 0); - if (n < 0) return gsm_asr(a, -n); - return a << n; -} - - -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/**** 4.2.17 */ -static void RPE_grid_positioning(Mc,xMp,ep) -word Mc; /* grid position IN */ -register word * xMp; /* [0..12] IN */ -register word * ep; /* [0..39] OUT */ -/* - * This procedure computes the reconstructed long term residual signal - * ep[0..39] for the LTP analysis filter. The inputs are the Mc - * which is the grid position selection and the xMp[0..12] decoded - * RPE samples which are upsampled by a factor of 3 by inserting zero - * values. - */ -{ - int i = 13; - - assert(0 <= Mc && Mc <= 3); - - switch (Mc) { - case 3: *ep++ = 0; - case 2: do { - *ep++ = 0; - case 1: *ep++ = 0; - case 0: *ep++ = *xMp++; - } while (--i); - } - while (++Mc < 4) *ep++ = 0; - - /* - - int i, k; - for (k = 0; k <= 39; k++) ep[k] = 0; - for (i = 0; i <= 12; i++) { - ep[ Mc + (3*i) ] = xMp[i]; - } - */ -} - - -/**** 4.2.16 */ -static void APCM_inverse_quantization (xMc,mant,exp,xMp) -register word * xMc; /* [0..12] IN */ -word mant; -word exp; -register word * xMp; /* [0..12] OUT */ -/* - * This part is for decoding the RPE sequence of coded xMc[0..12] - * samples to obtain the xMp[0..12] array. Table 4.6 is used to get - * the mantissa of xmaxc (FAC[0..7]). - */ -{ - int i; - word temp, temp1, temp2, temp3; - longword ltmp; - - assert( mant >= 0 && mant <= 7 ); - - temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */ - temp2 = gsm_sub( 6, exp ); /* see 4.2-15 for exp */ - temp3 = gsm_asl( 1, gsm_sub( temp2, 1 )); - - for (i = 13; i--;) { - - assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */ - - /* temp = gsm_sub( *xMc++ << 1, 7 ); */ - temp = (*xMc++ << 1) - 7; /* restore sign */ - assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */ - - temp <<= 12; /* 16 bit signed */ - temp = GSM_MULT_R( temp1, temp ); - temp = GSM_ADD( temp, temp3 ); - *xMp++ = gsm_asr( temp, temp2 ); - } -} - - -/**** 4.12.15 */ -static void APCM_quantization_xmaxc_to_exp_mant (xmaxc,exp_out,mant_out) -word xmaxc; /* IN */ -word * exp_out; /* OUT */ -word * mant_out; /* OUT */ -{ - word exp, mant; - - /* Compute exponent and mantissa of the decoded version of xmaxc - */ - - exp = 0; - if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1; - mant = xmaxc - (exp << 3); - - if (mant == 0) { - exp = -4; - mant = 7; - } - else { - while (mant <= 7) { - mant = mant << 1 | 1; - exp--; - } - mant -= 8; - } - - assert( exp >= -4 && exp <= 6 ); - assert( mant >= 0 && mant <= 7 ); - - *exp_out = exp; - *mant_out = mant; -} - -static void Gsm_RPE_Decoding (S, xmaxcr, Mcr, xMcr, erp) -XA_GSM_STATE * S; -word xmaxcr; -word Mcr; -word * xMcr; /* [0..12], 3 bits IN */ -word * erp; /* [0..39] OUT */ - -{ - word exp, mant; - word xMp[ 13 ]; - - APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant ); - APCM_inverse_quantization( xMcr, mant, exp, xMp ); - RPE_grid_positioning( Mcr, xMp, erp ); - -} - - -/* - * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER - */ - -static void Postprocessing(S,s) -XA_GSM_STATE * S; -register word * s; -{ - register int k; - register word msr = S->msr; - register longword ltmp; /* for GSM_ADD */ - register word tmp; - - for (k = 160; k--; s++) - { - tmp = GSM_MULT_R( msr, 28180 ); - msr = GSM_ADD(*s, tmp); /* Deemphasis */ - *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */ - } - S->msr = msr; -} - -/**** 4.3.2 */ -static void Gsm_Long_Term_Synthesis_Filtering (S,Ncr,bcr,erp,drp) -XA_GSM_STATE * S; -word Ncr; -word bcr; -register word * erp; /* [0..39] IN */ -register word * drp; /* [-120..-1] IN, [-120..40] OUT */ - -/* - * This procedure uses the bcr and Ncr parameter to realize the - * long term synthesis filtering. The decoding of bcr needs - * table 4.3b. - */ -{ - register longword ltmp; /* for ADD */ - register int k; - word brp, drpp, Nr; - - /* Check the limits of Nr. - */ - Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr; - S->nrp = Nr; - assert(Nr >= 40 && Nr <= 120); - - /* Decoding of the LTP gain bcr - */ - brp = gsm_QLB[ bcr ]; - - /* Computation of the reconstructed short term residual - * signal drp[0..39] - */ - assert(brp != MIN_WORD); - - for (k = 0; k <= 39; k++) { - drpp = GSM_MULT_R( brp, drp[ k - Nr ] ); - drp[k] = GSM_ADD( erp[k], drpp ); - } - - /* - * Update of the reconstructed short term residual signal - * drp[ -1..-120 ] - */ - - for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ]; -} - -static void Short_term_synthesis_filtering (S,rrp,k,wt,sr) -XA_GSM_STATE *S; -register word *rrp; /* [0..7] IN */ -register int k; /* k_end - k_start */ -register word *wt; /* [0..k-1] IN */ -register word *sr; /* [0..k-1] OUT */ -{ - register word * v = S->v; - register int i; - register word sri, tmp1, tmp2; - register longword ltmp; /* for GSM_ADD & GSM_SUB */ - - while (k--) { - sri = *wt++; - for (i = 8; i--;) { - - /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) ); - */ - tmp1 = rrp[i]; - tmp2 = v[i]; - tmp2 = ( tmp1 == MIN_WORD && tmp2 == MIN_WORD - ? MAX_WORD - : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2 - + 16384) >> 15)) ; - - sri = GSM_SUB( sri, tmp2 ); - - /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) ); - */ - tmp1 = ( tmp1 == MIN_WORD && sri == MIN_WORD - ? MAX_WORD - : 0x0FFFF & (( (longword)tmp1 * (longword)sri - + 16384) >> 15)) ; - - v[i+1] = GSM_ADD( v[i], tmp1); - } - *sr++ = v[0] = sri; - } -} - -/* 4.2.8 */ - -static void Decoding_of_the_coded_Log_Area_Ratios (LARc,LARpp) -word * LARc; /* coded log area ratio [0..7] IN */ -word * LARpp; /* out: decoded .. */ -{ - register word temp1 /* , temp2 */; - register long ltmp; /* for GSM_ADD */ - - /* This procedure requires for efficient implementation - * two tables. - * - * INVA[1..8] = integer( (32768 * 8) / real_A[1..8]) - * MIC[1..8] = minimum value of the LARc[1..8] - */ - - /* Compute the LARpp[1..8] - */ - - /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) { - * - * temp1 = GSM_ADD( *LARc, *MIC ) << 10; - * temp2 = *B << 1; - * temp1 = GSM_SUB( temp1, temp2 ); - * - * assert(*INVA != MIN_WORD); - * - * temp1 = GSM_MULT_R( *INVA, temp1 ); - * *LARpp = GSM_ADD( temp1, temp1 ); - * } - */ - -#undef STEP -#define STEP( B, MIC, INVA ) \ - temp1 = GSM_ADD( *LARc++, MIC ) << 10; \ - temp1 = GSM_SUB( temp1, B << 1 ); \ - temp1 = GSM_MULT_R( INVA, temp1 ); \ - *LARpp++ = GSM_ADD( temp1, temp1 ); - - STEP( 0, -32, 13107 ); - STEP( 0, -32, 13107 ); - STEP( 2048, -16, 13107 ); - STEP( -2560, -16, 13107 ); - - STEP( 94, -8, 19223 ); - STEP( -1792, -8, 17476 ); - STEP( -341, -4, 31454 ); - STEP( -1144, -4, 29708 ); - - /* NOTE: the addition of *MIC is used to restore - * the sign of *LARc. - */ -} - -/* 4.2.9 */ -/* Computation of the quantized reflection coefficients - */ - -/* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8] - */ - -/* - * Within each frame of 160 analyzed speech samples the short term - * analysis and synthesis filters operate with four different sets of - * coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) - * and the actual set of decoded LARs (LARpp(j)) - * - * (Initial value: LARpp(j-1)[1..8] = 0.) - */ - -static void Coefficients_0_12 (LARpp_j_1, LARpp_j, LARp) -register word * LARpp_j_1; -register word * LARpp_j; -register word * LARp; -{ - register int i; - register longword ltmp; - - for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) { - *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); - *LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1)); - } -} - -static void Coefficients_13_26 (LARpp_j_1, LARpp_j, LARp) -register word * LARpp_j_1; -register word * LARpp_j; -register word * LARp; -{ - register int i; - register longword ltmp; - for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { - *LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 )); - } -} - -static void Coefficients_27_39 (LARpp_j_1, LARpp_j, LARp) -register word * LARpp_j_1; -register word * LARpp_j; -register word * LARp; -{ - register int i; - register longword ltmp; - - for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { - *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); - *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 )); - } -} - - -static void Coefficients_40_159 (LARpp_j, LARp) -register word * LARpp_j; -register word * LARp; -{ - register int i; - - for (i = 1; i <= 8; i++, LARp++, LARpp_j++) - *LARp = *LARpp_j; -} -/* 4.2.9.2 */ - -static void LARp_to_rp (LARp) -register word * LARp; /* [0..7] IN/OUT */ -/* - * The input of this procedure is the interpolated LARp[0..7] array. - * The reflection coefficients, rp[i], are used in the analysis - * filter and in the synthesis filter. - */ -{ - register int i; - register word temp; - register longword ltmp; - - for (i = 1; i <= 8; i++, LARp++) { - - /* temp = GSM_ABS( *LARp ); - * - * if (temp < 11059) temp <<= 1; - * else if (temp < 20070) temp += 11059; - * else temp = GSM_ADD( temp >> 2, 26112 ); - * - * *LARp = *LARp < 0 ? -temp : temp; - */ - - if (*LARp < 0) { - temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp); - *LARp = - ((temp < 11059) ? temp << 1 - : ((temp < 20070) ? temp + 11059 - : GSM_ADD( temp >> 2, 26112 ))); - } else { - temp = *LARp; - *LARp = (temp < 11059) ? temp << 1 - : ((temp < 20070) ? temp + 11059 - : GSM_ADD( temp >> 2, 26112 )); - } - } -} - - - - - -/**** */ -static void Gsm_Short_Term_Synthesis_Filter (S, LARcr, wt, s) -XA_GSM_STATE * S; -word * LARcr; /* received log area ratios [0..7] IN */ -word * wt; /* received d [0..159] IN */ -word * s; /* signal s [0..159] OUT */ -{ - word * LARpp_j = S->LARpp[ S->j ]; - word * LARpp_j_1 = S->LARpp[ S->j ^=1 ]; - - word LARp[8]; - -#undef FILTER -#if defined(FAST) && defined(USE_FLOAT_MUL) - -# define FILTER (* (S->fast \ - ? Fast_Short_term_synthesis_filtering \ - : Short_term_synthesis_filtering )) -#else -# define FILTER Short_term_synthesis_filtering -#endif - - Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j ); - - Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, wt, s ); - - Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 14, wt + 13, s + 13 ); - - Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, wt + 27, s + 27 ); - - Coefficients_40_159( LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER(S, LARp, 120, wt + 40, s + 40); -} - - - - -static void GSM_Decode(S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s) -XA_GSM_STATE *S; -word *LARcr; /* [0..7] IN */ -word *Ncr; /* [0..3] IN */ -word *bcr; /* [0..3] IN */ -word *Mcr; /* [0..3] IN */ -word *xmaxcr; /* [0..3] IN */ -word *xMcr; /* [0..13*4] IN */ -word *s; /* [0..159] OUT */ -{ - int j, k; - word erp[40], wt[160]; - word *drp = S->dp0 + 120; - - for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) - { - Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp ); - Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp ); - for (k = 0; k <= 39; k++) wt[ j * 40 + k ] = drp[ k ]; - } - - Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s ); - Postprocessing(S, s); -} - - - -/****-------------------------------------------------------------------**** - **** Podlipec: For AVI/WAV files GSM 6.10 combines two 33 bytes frames - **** into one 65 byte frame. - ****-------------------------------------------------------------------****/ -void XA_MSGSM_Decoder(unsigned char *ibuf,unsigned short *obuf) -{ word sr; - word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - - sr = *ibuf++; - - LARc[0] = sr & 0x3f; sr >>= 6; - sr |= (word)*ibuf++ << 2; - LARc[1] = sr & 0x3f; sr >>= 6; - sr |= (word)*ibuf++ << 4; - LARc[2] = sr & 0x1f; sr >>= 5; - LARc[3] = sr & 0x1f; sr >>= 5; - sr |= (word)*ibuf++ << 2; - LARc[4] = sr & 0xf; sr >>= 4; - LARc[5] = sr & 0xf; sr >>= 4; - sr |= (word)*ibuf++ << 2; /* 5 */ - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 4; - Nc[0] = sr & 0x7f; sr >>= 7; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (word)*ibuf++ << 1; - xmaxc[0] = sr & 0x3f; sr >>= 6; - xmc[0] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - xmc[1] = sr & 0x7; sr >>= 3; - xmc[2] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - xmc[5] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; /* 10 */ - xmc[6] = sr & 0x7; sr >>= 3; - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - xmc[9] = sr & 0x7; sr >>= 3; - xmc[10] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 4; - Nc[1] = sr & 0x7f; sr >>= 7; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (word)*ibuf++ << 1; - xmaxc[1] = sr & 0x3f; sr >>= 6; - xmc[13] = sr & 0x7; sr >>= 3; - sr = *ibuf++; /* 15 */ - xmc[14] = sr & 0x7; sr >>= 3; - xmc[15] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - xmc[18] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; - xmc[19] = sr & 0x7; sr >>= 3; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - xmc[22] = sr & 0x7; sr >>= 3; - xmc[23] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 4; /* 20 */ - Nc[2] = sr & 0x7f; sr >>= 7; - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (word)*ibuf++ << 1; - xmaxc[2] = sr & 0x3f; sr >>= 6; - xmc[26] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - xmc[27] = sr & 0x7; sr >>= 3; - xmc[28] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - xmc[31] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; - xmc[32] = sr & 0x7; sr >>= 3; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - sr = *ibuf++; /* 25 */ - xmc[35] = sr & 0x7; sr >>= 3; - xmc[36] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 4; - Nc[3] = sr & 0x7f; sr >>= 7; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (word)*ibuf++ << 1; - xmaxc[3] = sr & 0x3f; sr >>= 6; - xmc[39] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - xmc[40] = sr & 0x7; sr >>= 3; - xmc[41] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; /* 30 */ - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - xmc[44] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; - xmc[45] = sr & 0x7; sr >>= 3; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - xmc[48] = sr & 0x7; sr >>= 3; - xmc[49] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - - GSM_Decode(&gsm_state, LARc, Nc, bc, Mc, xmaxc, xmc, obuf); - -/* - carry = sr & 0xf; - sr = carry; -*/ - /* 2nd frame */ - sr &= 0xf; - sr |= (word)*ibuf++ << 4; /* 1 */ - LARc[0] = sr & 0x3f; sr >>= 6; - LARc[1] = sr & 0x3f; sr >>= 6; - sr = *ibuf++; - LARc[2] = sr & 0x1f; sr >>= 5; - sr |= (word)*ibuf++ << 3; - LARc[3] = sr & 0x1f; sr >>= 5; - LARc[4] = sr & 0xf; sr >>= 4; - sr |= (word)*ibuf++ << 2; - LARc[5] = sr & 0xf; sr >>= 4; - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr = *ibuf++; /* 5 */ - Nc[0] = sr & 0x7f; sr >>= 7; - sr |= (word)*ibuf++ << 1; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (word)*ibuf++ << 5; - xmaxc[0] = sr & 0x3f; sr >>= 6; - xmc[0] = sr & 0x7; sr >>= 3; - xmc[1] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; - xmc[2] = sr & 0x7; sr >>= 3; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - xmc[5] = sr & 0x7; sr >>= 3; - xmc[6] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; /* 10 */ - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - xmc[9] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; - xmc[10] = sr & 0x7; sr >>= 3; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - Nc[1] = sr & 0x7f; sr >>= 7; - sr |= (word)*ibuf++ << 1; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (word)*ibuf++ << 5; - xmaxc[1] = sr & 0x3f; sr >>= 6; - xmc[13] = sr & 0x7; sr >>= 3; - xmc[14] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; /* 15 */ - xmc[15] = sr & 0x7; sr >>= 3; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - xmc[18] = sr & 0x7; sr >>= 3; - xmc[19] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - xmc[22] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; - xmc[23] = sr & 0x7; sr >>= 3; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - Nc[2] = sr & 0x7f; sr >>= 7; - sr |= (word)*ibuf++ << 1; /* 20 */ - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (word)*ibuf++ << 5; - xmaxc[2] = sr & 0x3f; sr >>= 6; - xmc[26] = sr & 0x7; sr >>= 3; - xmc[27] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; - xmc[28] = sr & 0x7; sr >>= 3; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - xmc[31] = sr & 0x7; sr >>= 3; - xmc[32] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - xmc[35] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; /* 25 */ - xmc[36] = sr & 0x7; sr >>= 3; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr = *ibuf++; - Nc[3] = sr & 0x7f; sr >>= 7; - sr |= (word)*ibuf++ << 1; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (word)*ibuf++ << 5; - xmaxc[3] = sr & 0x3f; sr >>= 6; - xmc[39] = sr & 0x7; sr >>= 3; - xmc[40] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; - xmc[41] = sr & 0x7; sr >>= 3; - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - sr = (word)*ibuf++; /* 30 */ - xmc[44] = sr & 0x7; sr >>= 3; - xmc[45] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 2; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - xmc[48] = sr & 0x7; sr >>= 3; - sr |= (word)*ibuf++ << 1; - xmc[49] = sr & 0x7; sr >>= 3; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - - GSM_Decode(&gsm_state, LARc, Nc, bc, Mc, xmaxc, xmc, &obuf[160]); - - /* Return number of source bytes consumed and output samples produced */ -// *icnt = 65; -// *ocnt = 320; - return; -} - -#define GSM_MAGIC 0xd - -void XA_GSM_Decoder(unsigned char *ibuf,unsigned short *obuf) -{ word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - - /* Sanity */ - if (((*ibuf >> 4) & 0x0F) != GSM_MAGIC) - { int i; - for(i=0;i<160;i++) obuf[i] = 0; -// *icnt = 33; -// *ocnt = 160; - return; - } - - LARc[0] = (*ibuf++ & 0xF) << 2; /* 1 */ - LARc[0] |= (*ibuf >> 6) & 0x3; - LARc[1] = *ibuf++ & 0x3F; - LARc[2] = (*ibuf >> 3) & 0x1F; - LARc[3] = (*ibuf++ & 0x7) << 2; - LARc[3] |= (*ibuf >> 6) & 0x3; - LARc[4] = (*ibuf >> 2) & 0xF; - LARc[5] = (*ibuf++ & 0x3) << 2; - LARc[5] |= (*ibuf >> 6) & 0x3; - LARc[6] = (*ibuf >> 3) & 0x7; - LARc[7] = *ibuf++ & 0x7; - - Nc[0] = (*ibuf >> 1) & 0x7F; - - bc[0] = (*ibuf++ & 0x1) << 1; - bc[0] |= (*ibuf >> 7) & 0x1; - - Mc[0] = (*ibuf >> 5) & 0x3; - - xmaxc[0] = (*ibuf++ & 0x1F) << 1; - xmaxc[0] |= (*ibuf >> 7) & 0x1; - - xmc[0] = (*ibuf >> 4) & 0x7; - xmc[1] = (*ibuf >> 1) & 0x7; - xmc[2] = (*ibuf++ & 0x1) << 2; - xmc[2] |= (*ibuf >> 6) & 0x3; - xmc[3] = (*ibuf >> 3) & 0x7; - xmc[4] = *ibuf++ & 0x7; - xmc[5] = (*ibuf >> 5) & 0x7; - xmc[6] = (*ibuf >> 2) & 0x7; - xmc[7] = (*ibuf++ & 0x3) << 1; /* 10 */ - xmc[7] |= (*ibuf >> 7) & 0x1; - xmc[8] = (*ibuf >> 4) & 0x7; - xmc[9] = (*ibuf >> 1) & 0x7; - xmc[10] = (*ibuf++ & 0x1) << 2; - xmc[10] |= (*ibuf >> 6) & 0x3; - xmc[11] = (*ibuf >> 3) & 0x7; - xmc[12] = *ibuf++ & 0x7; - - Nc[1] = (*ibuf >> 1) & 0x7F; - - bc[1] = (*ibuf++ & 0x1) << 1; - bc[1] |= (*ibuf >> 7) & 0x1; - - Mc[1] = (*ibuf >> 5) & 0x3; - - xmaxc[1] = (*ibuf++ & 0x1F) << 1; - xmaxc[1] |= (*ibuf >> 7) & 0x1; - - - xmc[13] = (*ibuf >> 4) & 0x7; - xmc[14] = (*ibuf >> 1) & 0x7; - xmc[15] = (*ibuf++ & 0x1) << 2; - xmc[15] |= (*ibuf >> 6) & 0x3; - xmc[16] = (*ibuf >> 3) & 0x7; - xmc[17] = *ibuf++ & 0x7; - xmc[18] = (*ibuf >> 5) & 0x7; - xmc[19] = (*ibuf >> 2) & 0x7; - xmc[20] = (*ibuf++ & 0x3) << 1; - xmc[20] |= (*ibuf >> 7) & 0x1; - xmc[21] = (*ibuf >> 4) & 0x7; - xmc[22] = (*ibuf >> 1) & 0x7; - xmc[23] = (*ibuf++ & 0x1) << 2; - xmc[23] |= (*ibuf >> 6) & 0x3; - xmc[24] = (*ibuf >> 3) & 0x7; - xmc[25] = *ibuf++ & 0x7; - - Nc[2] = (*ibuf >> 1) & 0x7F; - - bc[2] = (*ibuf++ & 0x1) << 1; /* 20 */ - bc[2] |= (*ibuf >> 7) & 0x1; - - Mc[2] = (*ibuf >> 5) & 0x3; - - xmaxc[2] = (*ibuf++ & 0x1F) << 1; - xmaxc[2] |= (*ibuf >> 7) & 0x1; - - - xmc[26] = (*ibuf >> 4) & 0x7; - xmc[27] = (*ibuf >> 1) & 0x7; - xmc[28] = (*ibuf++ & 0x1) << 2; - xmc[28] |= (*ibuf >> 6) & 0x3; - xmc[29] = (*ibuf >> 3) & 0x7; - xmc[30] = *ibuf++ & 0x7; - xmc[31] = (*ibuf >> 5) & 0x7; - xmc[32] = (*ibuf >> 2) & 0x7; - xmc[33] = (*ibuf++ & 0x3) << 1; - xmc[33] |= (*ibuf >> 7) & 0x1; - xmc[34] = (*ibuf >> 4) & 0x7; - xmc[35] = (*ibuf >> 1) & 0x7; - xmc[36] = (*ibuf++ & 0x1) << 2; - xmc[36] |= (*ibuf >> 6) & 0x3; - xmc[37] = (*ibuf >> 3) & 0x7; - xmc[38] = *ibuf++ & 0x7; - - Nc[3] = (*ibuf >> 1) & 0x7F; - - bc[3] = (*ibuf++ & 0x1) << 1; - bc[3] |= (*ibuf >> 7) & 0x1; - - Mc[3] = (*ibuf >> 5) & 0x3; - - xmaxc[3] = (*ibuf++ & 0x1F) << 1; - xmaxc[3] |= (*ibuf >> 7) & 0x1; - - xmc[39] = (*ibuf >> 4) & 0x7; - xmc[40] = (*ibuf >> 1) & 0x7; - xmc[41] = (*ibuf++ & 0x1) << 2; - xmc[41] |= (*ibuf >> 6) & 0x3; - xmc[42] = (*ibuf >> 3) & 0x7; - xmc[43] = *ibuf++ & 0x7; /* 30 */ - xmc[44] = (*ibuf >> 5) & 0x7; - xmc[45] = (*ibuf >> 2) & 0x7; - xmc[46] = (*ibuf++ & 0x3) << 1; - xmc[46] |= (*ibuf >> 7) & 0x1; - xmc[47] = (*ibuf >> 4) & 0x7; - xmc[48] = (*ibuf >> 1) & 0x7; - xmc[49] = (*ibuf++ & 0x1) << 2; - xmc[49] |= (*ibuf >> 6) & 0x3; - xmc[50] = (*ibuf >> 3) & 0x7; - xmc[51] = *ibuf & 0x7; /* 33 */ - - GSM_Decode(&gsm_state, LARc, Nc, bc, Mc, xmaxc, xmc, obuf); - - /* Return number of source bytes consumed and output samples produced */ -// *icnt = 33; -// *ocnt = 160; -}
--- a/libmpcodecs/native/xa_gsm.h Sat Jul 10 07:57:06 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef MPLAYER_XA_GSM_H -#define MPLAYER_XA_GSM_H - -void XA_MSGSM_Decoder(unsigned char *ibuf,unsigned short *obuf); -void XA_GSM_Decoder(unsigned char *ibuf,unsigned short *obuf); -void GSM_Init(void); - -#endif /* MPLAYER_XA_GSM_H */
--- a/libmpcodecs/native/xa_gsm_int.h Sat Jul 10 07:57:06 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +0,0 @@ -/******************************************************************** - * - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - * - * The contents of the file COPYRIGHT: - * - * Any use of this software is permitted provided that this notice is not - * removed and that neither the authors nor the Technische Universitaet Berlin - * are deemed to have made any representations as to the suitability of this - * software for any purpose nor are held responsible for any defects of - * this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - * - * As a matter of courtesy, the authors request to be informed about uses - * this software has found, about bugs in this software, and about any - * improvements that may be of general interest. - * - * Berlin, 15.09.1992 - * Jutta Degener - * Carsten Bormann - * - ********************************************************************/ - -#ifndef MPLAYER_XA_GSM_INT_H -#define MPLAYER_XA_GSM_INT_H - -#include "xa_gsm.h" - - -typedef short word; /* 16 bit signed int */ -typedef int longword; /* 32 bit signed int */ - -typedef unsigned short uword; /* unsigned word */ -typedef unsigned int ulongword; /* unsigned longword */ - -typedef struct { - - word dp0[ 280 ]; - - word z1; /* preprocessing.c, Offset_com. */ - longword L_z2; /* Offset_com. */ - int mp; /* Preemphasis */ - - word u[8]; /* short_term_aly_filter.c */ - word LARpp[2][8]; /* */ - word j; /* */ - - word ltp_cut; /* long_term.c, LTP crosscorr. */ - word nrp; /* 40 */ /* long_term.c, synthesis */ - word v[9]; /* short_term.c, synthesis */ - word msr; /* decoder.c, Postprocessing */ - - char verbose; /* only used if !NDEBUG */ - char fast; /* only used if FAST */ - - char wav_fmt; /* only used if WAV49 defined */ - unsigned char frame_index; /* odd/even chaining */ - unsigned char frame_chain; /* half-byte to carry forward */ -} XA_GSM_STATE; - - -#define MIN_WORD (-32767 - 1) -#define MAX_WORD 32767 - -#define MIN_LONGWORD (-2147483647 - 1) -#define MAX_LONGWORD 2147483647 - -#ifdef SASR /* flag: >> is a signed arithmetic shift right */ -#undef SASR -#define SASR(x, by) ((x) >> (by)) -#else -#define SASR(x, by) ((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by)))) -#endif /* SASR */ - - - -/* - * Inlined functions from add.h - */ - -/* - * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *) \ - * (0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15)) - */ -#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ - (SASR( ((longword)(a) * (longword)(b) + 16384), 15 )) - -# define GSM_MULT(a,b) /* word a, word b, !(a == b == MIN_WORD) */ \ - (SASR( ((longword)(a) * (longword)(b)), 15 )) - -# define GSM_L_MULT(a, b) /* word a, word b */ \ - (((longword)(a) * (longword)(b)) << 1) - -# define GSM_L_ADD(a, b) \ - ( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \ - : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \ - >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 ) \ - : ((b) <= 0 ? (a) + (b) \ - : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \ - ? MAX_LONGWORD : utmp)) - -/* - * # define GSM_ADD(a, b) \ - * ((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \ - * ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) - */ -/* Nonportable, but faster: */ - -#define GSM_ADD(a, b) \ - ((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \ - MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp) - -# define GSM_SUB(a, b) \ - ((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \ - ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) - -# define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a)) - -/* Use these if necessary: - -# define GSM_MULT_R(a, b) gsm_mult_r(a, b) -# define GSM_MULT(a, b) gsm_mult(a, b) -# define GSM_L_MULT(a, b) gsm_L_mult(a, b) - -# define GSM_L_ADD(a, b) gsm_L_add(a, b) -# define GSM_ADD(a, b) gsm_add(a, b) -# define GSM_SUB(a, b) gsm_sub(a, b) - -# define GSM_ABS(a) gsm_abs(a) - -*/ - -#endif /* MPLAYER_XA_GSM_INT_H */