Mercurial > hg > audiostuff
diff spandsp-0.0.3/spandsp-0.0.3/src/spandsp/gsm0610.h @ 5:f762bf195c4b
import spandsp-0.0.3
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 16:00:21 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spandsp-0.0.3/spandsp-0.0.3/src/spandsp/gsm0610.h Fri Jun 25 16:00:21 2010 +0200 @@ -0,0 +1,144 @@ +/* + * SpanDSP - a series of DSP components for telephony + * + * gsm0610.h - GSM 06.10 full rate speech codec. + * + * Written by Steve Underwood <steveu@coppice.org> + * + * Copyright (C) 2006 Steve Underwood + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id: gsm0610.h,v 1.7 2006/10/24 13:45:28 steveu Exp $ + */ + +#if !defined(_GSM0610_H_) +#define _GSM0610_H_ + +/*! \page gsm0610_page GSM 06.10 encoding and decoding +\section gsm0610_page_sec_1 What does it do? + +The GSM 06.10 module is an version of the widely used GSM FR codec software +available from http://kbs.cs.tu-berlin.de/~jutta/toast.html. This version +was produced since some versions of this codec are not bit exact, or not +very efficient on modern processors. This implementation can use MMX instructions +on Pentium class processors, or alternative methods on other processors. It +passes all the ETSI test vectors. That is, it is a tested bit exact implementation. + +This implementation supports encoded data in one of three packing formats: + - Unpacked, with the 76 parameters of a GSM 06.10 code frame each occupying a + separate byte. (note that none of the parameters exceed 8 bits). + - Packed the the 33 byte per frame, used for VoIP, where 4 bits per frame are wasted. + - Packed in WAV49 format, where 2 frames are packed into 65 bytes. + +\section gsm0610_page_sec_2 How does it work? +???. +*/ + +enum +{ + GSM0610_PACKING_NONE, + GSM0610_PACKING_WAV49, + GSM0610_PACKING_VOIP +}; + +/*! + GSM 06.10 FR codec unpacked frame. +*/ +typedef struct +{ + int16_t LARc[8]; + int16_t Nc[4]; + int16_t bc[4]; + int16_t Mc[4]; + int16_t xmaxc[4]; + int16_t xMc[4][13]; +} gsm0610_frame_t; + +/*! + GSM 06.10 FR codec state descriptor. This defines the state of + a single working instance of the GSM 06.10 FR encoder or decoder. +*/ +typedef struct +{ + /*! \brief One of the packing modes */ + int packing; + + int16_t dp0[280]; + + int16_t z1; /* preprocessing, Offset_com. */ + int32_t L_z2; /* Offset_com. */ + int16_t mp; /* Preemphasis */ + + int16_t u[8]; /* short_term_delay_filter */ + int16_t LARpp[2][8]; + int16_t j; + + int16_t nrp; /* long term synthesis */ + int16_t v[9]; /* short term synthesis */ + int16_t msr; /* decoder postprocessing */ + + int16_t e[50]; /* encoder */ + uint8_t frame_index; + uint8_t frame_chain; +} gsm0610_state_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/*! Initialise a GSM 06.10 encode or decode context. + \param s The GSM 06.10 context + \param packing One of the GSM0610_PACKING_xxx options. + \return A pointer to the GSM 06.10 context, or NULL for error. */ +gsm0610_state_t *gsm0610_init(gsm0610_state_t *s, int packing); + +int gsm0610_release(gsm0610_state_t *s); + +/*! Encode a buffer of linear PCM data to GSM 06.10. + \param s The GSM 06.10 context. + \param ima_data The GSM 06.10 data produced. + \param amp The audio sample buffer. + \param len The number of samples in the buffer. + \return The number of bytes of GSM 06.10 data produced. */ +int gsm0610_encode(gsm0610_state_t *s, uint8_t code[], const int16_t amp[], int quant); + +/*! Decode a buffer of GSM 06.10 data to linear PCM. + \param s The GSM 06.10 context. + \param amp The audio sample buffer. + \param code The GSM 06.10 data. + \param quant The number of frames of GSM 06.10 data to be decoded. + \return The number of samples returned. */ +int gsm0610_decode(gsm0610_state_t *s, int16_t amp[], const uint8_t code[], int quant); + +int gsm0610_pack_none(uint8_t c[], gsm0610_frame_t *s); + +int gsm0610_pack_wav49(uint8_t c[], gsm0610_frame_t *s, int half); + +int gsm0610_pack_voip(uint8_t c[], gsm0610_frame_t *s); + +int gsm0610_unpack_none(gsm0610_frame_t *s, const uint8_t c[]); + +int gsm0610_unpack_wav49(gsm0610_frame_t *s, const uint8_t c[], int half); + +int gsm0610_unpack_voip(gsm0610_frame_t *s, const uint8_t c[]); + +#ifdef __cplusplus +} +#endif + +#endif +/*- End of include ---------------------------------------------------------*/