Mercurial > mplayer.hg
changeset 5603:5f4485862a72
native codecs files moved to libmpcodecs/native/
author | arpi |
---|---|
date | Sat, 13 Apr 2002 18:04:24 +0000 |
parents | 628c85c15c7b |
children | 5bd00421d251 |
files | Makefile libmpcodecs/Makefile libmpcodecs/ad_msgsm.c libmpcodecs/ad_roqaudio.c libmpcodecs/native/xa_gsm.c libmpcodecs/native/xa_gsm.h libmpcodecs/native/xa_gsm_int.h xa/xa_gsm.c xa/xa_gsm.h xa/xa_gsm_int.h |
diffstat | 10 files changed, 1127 insertions(+), 1129 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Sat Apr 13 18:03:02 2002 +0000 +++ b/Makefile Sat Apr 13 18:04:24 2002 +0000 @@ -37,7 +37,7 @@ # a BSD compatible 'install' program INSTALL = install -SRCS_COMMON = cyuv.c xacodec.c cpudetect.c mp_msg.c msvidc.c cinepak.c fli.c qtrle.c codec-cfg.c cfgparser.c my_profile.c RTjpegN.c minilzo.c nuppelvideo.c spudec.c playtree.c playtreeparser.c asxparser.c qtsmc.c roqav.c qtrpza.c vobsub.c +SRCS_COMMON = xacodec.c cpudetect.c mp_msg.c codec-cfg.c cfgparser.c my_profile.c spudec.c playtree.c playtreeparser.c asxparser.c vobsub.c SRCS_MENCODER = mencoder.c $(SRCS_COMMON) libao2/afmt.c divx4_vbr.c libvo/aclib.c libvo/img_format.c libvo/osd.c me-opt-reg.c SRCS_MPLAYER = mplayer.c $(SRCS_COMMON) find_sub.c subreader.c lirc_mp.c mixer.c mp-opt-reg.c @@ -56,14 +56,14 @@ AO_LIBS = -Llibao2 -lao2 A_LIBS = $(ALSA_LIB) $(NAS_LIB) $(MAD_LIB) $(VORBIS_LIB) $(FAAD_LIB) $(SGIAUDIO_LIB) -CODEC_LIBS = -Llibmpcodecs -lmpcodecs -Lmp3lib -lMP3 -Lliba52 -la52 -Lxa -lxa -Llibmpeg2 -lmpeg2 $(AV_LIB) -Llibfame -lfame +CODEC_LIBS = -Llibmpcodecs -lmpcodecs -Lmp3lib -lMP3 -Lliba52 -la52 -Llibmpeg2 -lmpeg2 $(AV_LIB) -Llibfame -lfame COMMON_LIBS = $(CODEC_LIBS) -Llibmpdemux -lmpdemux $(NEW_INPUT_LIB) $(LIB_LOADER) $(A_LIBS) $(CSS_LIB) $(ARCH_LIB) -Lpostproc -lpostproc $(DECORE_LIB) -Llinux -losdep $(TERMCAP_LIB) $(STREAMING_LIB) $(Z_LIB) $(GTK_LIBS) $(PNG_LIB) $(JPEG_LIB) -lm ifeq ($(VIDIX),yes) MISC_LIBS += -Llibdha -ldha -Lvidix -lvidix endif CFLAGS = $(OPTFLAGS) -Ilibmpdemux -Iloader $(VO_INC) $(EXTRA_INC) # -Wall -PARTS = libfame libmpdemux libmpcodecs mp3lib liba52 libmp1e libmpeg2 libavcodec libao2 drivers drivers/syncfb linux postproc xa input +PARTS = libfame libmpdemux libmpcodecs mp3lib liba52 libmp1e libmpeg2 libavcodec libao2 drivers drivers/syncfb linux postproc input ifeq ($(VIDIX),yes) PARTS += libdha vidix endif @@ -105,7 +105,7 @@ .c.o: $(CC) -c $(CFLAGS) -o $@ $< -COMMON_DEPS = libfame/libfame.a libmpdemux/libmpdemux.a libmpcodecs/libmpcodecs.a libao2/libao2.a liba52/liba52.a mp3lib/libMP3.a libmpeg2/libmpeg2.a linux/libosdep.a postproc/libpostproc.a xa/libxa.a input/libinput.a +COMMON_DEPS = libfame/libfame.a libmpdemux/libmpdemux.a libmpcodecs/libmpcodecs.a libao2/libao2.a liba52/liba52.a mp3lib/libMP3.a libmpeg2/libmpeg2.a linux/libosdep.a postproc/libpostproc.a input/libinput.a ifeq ($(VIDIX),yes) COMMON_DEPS += libdha/libdha.so vidix/libvidix.a @@ -173,9 +173,6 @@ postproc/libpostproc.a: $(MAKE) -C postproc -xa/libxa.a: - $(MAKE) -C xa - input/libinput.a: $(MAKE) -C input
--- a/libmpcodecs/Makefile Sat Apr 13 18:03:02 2002 +0000 +++ b/libmpcodecs/Makefile Sat Apr 13 18:04:24 2002 +0000 @@ -8,6 +8,7 @@ VIDEO_SRCS=dec_video.c vd.c vd_null.c vd_cinepak.c vd_qtrpza.c vd_ffmpeg.c vd_dshow.c vd_vfw.c vd_odivx.c vd_divx4.c vd_raw.c vd_xanim.c vd_msvidc.c vd_fli.c vd_qtrle.c vd_qtsmc.c vd_roqvideo.c vd_cyuv.c vd_nuv.c vd_libmpeg2.c vd_msrle.c vd_huffyuv.c vd_zlib.c vd_mpegpes.c VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_pp.c vf_scale.c vf_fame.c vf_format.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c ENCODER_SRCS=ve.c ve_divx4.c ve_lavc.c ve_vfw.c ve_rawrgb.c ve_libdv.c +NATIVE_SRCS=native/RTjpegN.c native/cinepak.c native/cyuv.c native/fli.c native/minilzo.c native/msvidc.c native/nuppelvideo.c native/qtrle.c native/qtrpza.c native/qtsmc.c native/roqav.c native/xa_gsm.c ifeq ($(PNG),yes) VIDEO_SRCS += vd_mpng.c @@ -17,13 +18,13 @@ VIDEO_SRCS += vd_ijpg.c endif -SRCS=$(AUDIO_SRCS) $(VIDEO_SRCS) $(VFILTER_SRCS) +SRCS=$(AUDIO_SRCS) $(VIDEO_SRCS) $(VFILTER_SRCS) $(NATIVE_SRCS) OBJS=$(SRCS:.c=.o) SRCS2=$(ENCODER_SRCS) OBJS2=$(SRCS2:.c=.o) -CFLAGS = -Wall $(OPTFLAGS) -I. -I.. -I../libmpdemux -I../loader $(EXTRA_INC) +CFLAGS = -Wall $(OPTFLAGS) -I. -Inative -I.. -I../libmpdemux -I../loader $(EXTRA_INC) .SUFFIXES: .c .o @@ -44,7 +45,7 @@ rm -f *.o *.a *~ distclean: - rm -f Makefile.bak *.o *.a *~ .depend + rm -f Makefile.bak $(OBJS) $(OBJS2) $(LIBNAME) $(LIBNAME2) *~ .depend dep: depend
--- a/libmpcodecs/ad_msgsm.c Sat Apr 13 18:03:02 2002 +0000 +++ b/libmpcodecs/ad_msgsm.c Sat Apr 13 18:04:24 2002 +0000 @@ -17,7 +17,7 @@ LIBAD_EXTERN(msgsm) -#include "xa/xa_gsm.h" +#include "xa_gsm.h" static int init(sh_audio_t *sh_audio) {
--- a/libmpcodecs/ad_roqaudio.c Sat Apr 13 18:03:02 2002 +0000 +++ b/libmpcodecs/ad_roqaudio.c Sat Apr 13 18:04:24 2002 +0000 @@ -4,7 +4,7 @@ #include "config.h" #include "ad_internal.h" -#include "../roqav.h" +#include "roqav.h" static ad_info_t info = {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/native/xa_gsm.c Sat Apr 13 18:04:24 2002 +0000 @@ -0,0 +1,997 @@ + +/* + 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; + +unsigned char xa_sign_2_ulaw[256]; + +unsigned char XA_Signed_To_uLaw(long ch) +{ + long mask; + if (ch < 0) { ch = -ch; mask = 0x7f; } + else { mask = 0xff; } + if (ch < 32) { ch = 0xF0 | (15 - (ch / 2)); } + else if (ch < 96) { ch = 0xE0 | (15 - (ch - 32) / 4); } + else if (ch < 224) { ch = 0xD0 | (15 - (ch - 96) / 8); } + else if (ch < 480) { ch = 0xC0 | (15 - (ch - 224) / 16); } + else if (ch < 992) { ch = 0xB0 | (15 - (ch - 480) / 32); } + else if (ch < 2016) { ch = 0xA0 | (15 - (ch - 992) / 64); } + else if (ch < 4064) { ch = 0x90 | (15 - (ch - 2016) / 128); } + else if (ch < 8160) { ch = 0x80 | (15 - (ch - 4064) / 256); } + else { ch = 0x80; } + return (mask & ch); +} + +void Gen_Signed_2_uLaw() +{ + unsigned long i; + for(i=0;i<256;i++) + { unsigned char d; + char ch = i; + long chr = ch; + d = XA_Signed_To_uLaw(chr * 16); + xa_sign_2_ulaw[i] = d; + } +} + + +void GSM_Init() +{ + memset((char *)(&gsm_state), 0, sizeof(XA_GSM_STATE)); + gsm_state.nrp = 40; + Gen_Signed_2_uLaw(); +} + + +/* 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 */ +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; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/native/xa_gsm.h Sat Apr 13 18:04:24 2002 +0000 @@ -0,0 +1,6 @@ + +void XA_MSGSM_Decoder(unsigned char *ibuf,unsigned short *obuf); +void XA_GSM_Decoder(unsigned char *ibuf,unsigned short *obuf); +void GSM_Init(); + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/native/xa_gsm_int.h Sat Apr 13 18:04:24 2002 +0000 @@ -0,0 +1,114 @@ +/******************************************************************** + * + * 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. + * + ********************************************************************/ + +#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) + +*/ +
--- a/xa/xa_gsm.c Sat Apr 13 18:03:02 2002 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,997 +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; - -unsigned char xa_sign_2_ulaw[256]; - -unsigned char XA_Signed_To_uLaw(long ch) -{ - long mask; - if (ch < 0) { ch = -ch; mask = 0x7f; } - else { mask = 0xff; } - if (ch < 32) { ch = 0xF0 | (15 - (ch / 2)); } - else if (ch < 96) { ch = 0xE0 | (15 - (ch - 32) / 4); } - else if (ch < 224) { ch = 0xD0 | (15 - (ch - 96) / 8); } - else if (ch < 480) { ch = 0xC0 | (15 - (ch - 224) / 16); } - else if (ch < 992) { ch = 0xB0 | (15 - (ch - 480) / 32); } - else if (ch < 2016) { ch = 0xA0 | (15 - (ch - 992) / 64); } - else if (ch < 4064) { ch = 0x90 | (15 - (ch - 2016) / 128); } - else if (ch < 8160) { ch = 0x80 | (15 - (ch - 4064) / 256); } - else { ch = 0x80; } - return (mask & ch); -} - -void Gen_Signed_2_uLaw() -{ - unsigned long i; - for(i=0;i<256;i++) - { unsigned char d; - char ch = i; - long chr = ch; - d = XA_Signed_To_uLaw(chr * 16); - xa_sign_2_ulaw[i] = d; - } -} - - -void GSM_Init() -{ - memset((char *)(&gsm_state), 0, sizeof(XA_GSM_STATE)); - gsm_state.nrp = 40; - Gen_Signed_2_uLaw(); -} - - -/* 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 */ -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/xa/xa_gsm.h Sat Apr 13 18:03:02 2002 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ - -void XA_MSGSM_Decoder(unsigned char *ibuf,unsigned short *obuf); -void XA_GSM_Decoder(unsigned char *ibuf,unsigned short *obuf); -void GSM_Init(); - -
--- a/xa/xa_gsm_int.h Sat Apr 13 18:03:02 2002 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +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. - * - ********************************************************************/ - -#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) - -*/ -