[xiph-commits] r11302 - trunk/speex/libspeex
jm at svn.xiph.org
jm at svn.xiph.org
Fri Apr 28 00:53:53 PDT 2006
Author: jm
Date: 2006-04-28 00:53:51 -0700 (Fri, 28 Apr 2006)
New Revision: 11302
Removed:
trunk/speex/libspeex/modes_noglobals.c
Log:
No longer needed (was made for symbian before we figured out that making
all the global data const fixed the problem).
Deleted: trunk/speex/libspeex/modes_noglobals.c
===================================================================
--- trunk/speex/libspeex/modes_noglobals.c 2006-04-27 23:23:55 UTC (rev 11301)
+++ trunk/speex/libspeex/modes_noglobals.c 2006-04-28 07:53:51 UTC (rev 11302)
@@ -1,1145 +0,0 @@
-/* Copyright (C) 2004 CSIRO Australia
- File: modes_noglobals.c
-
- Hacked by Conrad Parker, based on modes.c:
- Copyright (C) 2002 Jean-Marc Valin
-
- Describes the different modes of the codec. This file differs from
- modes.c in that SpeexMode structures are dynamically allocated,
- rather than being statically defined. This introduces some minor
- API changes which are described in the file README.symbian in the
- top level of the Speex source distribution.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- - Neither the name of the Xiph.org Foundation nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "modes.h"
-#include "ltp.h"
-#include "quant_lsp.h"
-#include "cb_search.h"
-#include "sb_celp.h"
-#include "nb_celp.h"
-#include "vbr.h"
-#include "misc.h"
-#include <math.h>
-#include <string.h>
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-/* Extern declarations for all codebooks we use here */
-extern const signed char gain_cdbk_nb[];
-extern const signed char gain_cdbk_lbr[];
-extern const signed char hexc_table[];
-extern const signed char exc_5_256_table[];
-extern const signed char exc_5_64_table[];
-extern const signed char exc_8_128_table[];
-extern const signed char exc_10_32_table[];
-extern const signed char exc_10_16_table[];
-extern const signed char exc_20_32_table[];
-extern const signed char hexc_10_32_table[];
-
-static const ltp_params *
-speex_ltp_params_new (const signed char * gain_cdbk, int gain_bits,
- int pitch_bits)
-{
- ltp_params * params;
-
- params = (ltp_params *) speex_alloc (sizeof (ltp_params));
- if (params == NULL) return NULL;
-
- params->gain_cdbk = gain_cdbk;
- params->gain_bits = gain_bits;
- params->pitch_bits = pitch_bits;
-
- return params;
-}
-
-static void
-speex_ltp_params_free (const ltp_params * params)
-{
- speex_free ((void *)params);
-}
-
-static const split_cb_params *
-speex_split_cb_params_new (int subvect_size, int nb_subvect,
- const signed char * shape_cb, int shape_bits,
- int have_sign)
-{
- split_cb_params * params;
-
- params = (split_cb_params *) speex_alloc (sizeof (split_cb_params));
- if (params == NULL) return NULL;
-
- params->subvect_size = subvect_size;
- params->nb_subvect = nb_subvect;
- params->shape_cb = shape_cb;
- params->shape_bits = shape_bits;
- params->have_sign = have_sign;
-
- return params;
-}
-
-static void
-speex_split_cb_params_free (const split_cb_params * params)
-{
- speex_free ((void *)params);
-}
-
-static SpeexSubmode *
-speex_submode_new (int lbr_pitch, int forced_pitch_gain,
- int have_subframe_gain, int double_codebook,
-
- lsp_quant_func lsp_quant, lsp_unquant_func lsp_unquant,
- ltp_quant_func ltp_quant, ltp_unquant_func ltp_unquant,
- const void * ltp_params,
-
- innovation_quant_func innovation_quant,
- innovation_unquant_func innovation_unquant,
- const void * innovation_params,
-
- /*Synthesis filter enhancement*/
- spx_word16_t lpc_enh_k1, /**< Enhancer constant */
- spx_word16_t lpc_enh_k2, /**< Enhancer constant */
- spx_word16_t lpc_enh_k3, /**< Enhancer constant */
- spx_word16_t comb_gain, /**< Gain of enhancer comb filter */
-
- int bits_per_frame /**< Number of bits per frame after encoding*/
-
- )
-{
- SpeexSubmode * submode;
-
- submode = (SpeexSubmode *) speex_alloc (sizeof (SpeexSubmode));
- if (submode == NULL) return NULL;
-
- submode->lbr_pitch = lbr_pitch;
- submode->forced_pitch_gain = forced_pitch_gain;
- submode->have_subframe_gain = have_subframe_gain;
- submode->double_codebook = double_codebook;
- submode->lsp_quant = lsp_quant;
- submode->lsp_unquant = lsp_unquant;
- submode->ltp_quant = ltp_quant;
- submode->ltp_unquant = ltp_unquant;
- submode->ltp_params = ltp_params;
- submode->innovation_quant = innovation_quant;
- submode->innovation_unquant = innovation_unquant;
- submode->innovation_params = innovation_params;
- submode->lpc_enh_k1 = lpc_enh_k1;
- submode->lpc_enh_k2 = lpc_enh_k2;
- submode->lpc_enh_k3 = lpc_enh_k3;
- submode->comb_gain = comb_gain;
- submode->bits_per_frame = bits_per_frame;
-
- return submode;
-}
-
-static void
-speex_submode_free (const SpeexSubmode * submode)
-{
- if (submode->ltp_params)
- speex_ltp_params_free (submode->ltp_params);
-
- if (submode->innovation_params)
- speex_split_cb_params_free (submode->innovation_params);
-
- speex_free ((void *)submode);
-}
-
-static SpeexNBMode *
-nb_mode_new (int frameSize, int subframeSize, int lpcSize, int bufSize,
- int pitchStart, int pitchEnd, spx_word16_t gamma1,
- spx_word16_t gamma2, float lag_factor, float lpc_floor,
-#ifdef EPIC_48K
- int lbr48k,
-#endif
- const SpeexSubmode * submodes[], int defaultSubmode,
- int quality_map[])
-{
- SpeexNBMode * nb_mode;
-
- nb_mode = (SpeexNBMode *) speex_alloc (sizeof (SpeexNBMode));
- if (nb_mode == NULL) return NULL;
-
- nb_mode->frameSize = frameSize;
- nb_mode->subframeSize = subframeSize;
- nb_mode->lpcSize = lpcSize;
- nb_mode->bufSize = bufSize;
- nb_mode->pitchStart = pitchStart;
- nb_mode->pitchEnd = pitchEnd;
- nb_mode->gamma1 = gamma1;
- nb_mode->gamma2 = gamma2;
- nb_mode->lag_factor = lag_factor;
- nb_mode->lpc_floor = lpc_floor;
-#ifdef EPIC_48K
- nb_mode->lbr48k = lbr48k;
-#endif
- memcpy (nb_mode->submodes, submodes, sizeof (nb_mode->submodes));
- nb_mode->defaultSubmode = defaultSubmode;
- memcpy (nb_mode->quality_map, quality_map, sizeof (nb_mode->quality_map));
-
- return nb_mode;
-}
-
-static void
-nb_mode_free (const SpeexNBMode * nb_mode)
-{
- speex_free ((void *)nb_mode);
-}
-
-static SpeexSBMode *
-sb_mode_new (
- const SpeexMode *nb_mode, /**< Embedded narrowband mode */
- int frameSize, /**< Size of frames used for encoding */
- int subframeSize, /**< Size of sub-frames used for encoding */
- int lpcSize, /**< Order of LPC filter */
- int bufSize, /**< Signal buffer size in encoder */
- spx_word16_t gamma1, /**< Perceptual filter parameter #1 */
- spx_word16_t gamma2, /**< Perceptual filter parameter #1 */
- float lag_factor, /**< Lag-windowing parameter */
- float lpc_floor, /**< Noise floor for LPC analysis */
- float folding_gain,
-
- const SpeexSubmode *submodes[], /**< Sub-mode data for the mode */
- int defaultSubmode, /**< Default sub-mode to use when encoding */
- int low_quality_map[], /**< Mode corresponding to each quality setting */
- int quality_map[], /**< Mode corresponding to each quality setting */
- const float (*vbr_thresh)[11],
- int nb_modes
- )
-{
- SpeexSBMode * sb_mode;
-
- sb_mode = (SpeexSBMode *) speex_alloc (sizeof (SpeexSBMode));
- if (sb_mode == NULL) return NULL;
-
- sb_mode->nb_mode = nb_mode;
- sb_mode->frameSize = frameSize;
- sb_mode->subframeSize = subframeSize;
- sb_mode->lpcSize = lpcSize;
- sb_mode->bufSize = bufSize;
- sb_mode->gamma1 = gamma1;
- sb_mode->gamma2 = gamma2;
- sb_mode->lag_factor = lag_factor;
- sb_mode->lpc_floor = lpc_floor;
- sb_mode->folding_gain = folding_gain;
-
- memcpy (sb_mode->submodes, submodes, sizeof (sb_mode->submodes));
- sb_mode->defaultSubmode = defaultSubmode;
- memcpy (sb_mode->low_quality_map, low_quality_map, sizeof (sb_mode->low_quality_map));
- memcpy (sb_mode->quality_map, quality_map, sizeof (sb_mode->quality_map));
- sb_mode->vbr_thresh = vbr_thresh;
- sb_mode->nb_modes = nb_modes;
-
- return sb_mode;
-}
-
-static void
-sb_mode_free (const SpeexSBMode * sb_mode)
-{
- int i;
-
- for (i = 0; i < SB_SUBMODES; i++)
- if (sb_mode->submodes[i]) speex_submode_free (sb_mode->submodes[i]);
-
- speex_free ((void *)sb_mode);
-}
-
-static SpeexMode *
-mode_new (const void * b_mode, mode_query_func query, char * modeName,
- int modeID, int bitstream_version, encoder_init_func enc_init,
- encoder_destroy_func enc_destroy, encode_func enc,
- decoder_init_func dec_init, decoder_destroy_func dec_destroy,
- decode_func dec, encoder_ctl_func enc_ctl,
- decoder_ctl_func dec_ctl)
-{
- SpeexMode * mode;
-
- mode = (SpeexMode *) speex_alloc (sizeof (SpeexMode));
- if (mode == NULL) return NULL;
-
- mode->mode = b_mode;
- mode->query = query;
- mode->modeName = modeName;
- mode->modeID = modeID;
- mode->bitstream_version = bitstream_version;
- mode->enc_init = enc_init;
- mode->enc_destroy = enc_destroy;
- mode->enc = enc;
- mode->dec_init = dec_init;
- mode->dec_destroy = dec_destroy;
- mode->dec = dec;
- mode->enc_ctl = enc_ctl;
- mode->dec_ctl = dec_ctl;
-
- return mode;
-}
-
-/* Freeing each kind of created (SpeexMode *) is done separately below */
-
-/* Parameters for Long-Term Prediction (LTP)*/
-static const ltp_params * ltp_params_nb (void)
-{
- return speex_ltp_params_new (
- gain_cdbk_nb,
- 7,
- 7
- );
-}
-
-/* Parameters for Long-Term Prediction (LTP)*/
-static const ltp_params * ltp_params_vlbr (void)
-{
- return speex_ltp_params_new (
- gain_cdbk_lbr,
- 5,
- 0
- );
-}
-
-/* Parameters for Long-Term Prediction (LTP)*/
-static const ltp_params * ltp_params_lbr (void)
-{
- return speex_ltp_params_new (
- gain_cdbk_lbr,
- 5,
- 7
- );
-}
-
-/* Parameters for Long-Term Prediction (LTP)*/
-static const ltp_params * ltp_params_med (void)
-{
- return speex_ltp_params_new (
- gain_cdbk_lbr,
- 5,
- 7
- );
-}
-
-/* Split-VQ innovation parameters for very low bit-rate narrowband */
-static const split_cb_params * split_cb_nb_vlbr (void)
-{
- return speex_split_cb_params_new (
- 10, /*subvect_size*/
- 4, /*nb_subvect*/
- exc_10_16_table, /*shape_cb*/
- 4, /*shape_bits*/
- 0
- );
-}
-
-/* Split-VQ innovation parameters for very low bit-rate narrowband */
-static const split_cb_params * split_cb_nb_ulbr (void)
-{
- return speex_split_cb_params_new (
- 20, /*subvect_size*/
- 2, /*nb_subvect*/
- exc_20_32_table, /*shape_cb*/
- 5, /*shape_bits*/
- 0
- );
-}
-
-/* Split-VQ innovation parameters for low bit-rate narrowband */
-static const split_cb_params * split_cb_nb_lbr (void)
-{
- return speex_split_cb_params_new (
- 10, /*subvect_size*/
- 4, /*nb_subvect*/
- exc_10_32_table, /*shape_cb*/
- 5, /*shape_bits*/
- 0
- );
-}
-
-
-/* Split-VQ innovation parameters narrowband */
-static const split_cb_params * split_cb_nb (void)
-{
- return speex_split_cb_params_new (
- 5, /*subvect_size*/
- 8, /*nb_subvect*/
- exc_5_64_table, /*shape_cb*/
- 6, /*shape_bits*/
- 0
- );
-}
-
-/* Split-VQ innovation parameters narrowband */
-static const split_cb_params * split_cb_nb_med (void)
-{
- return speex_split_cb_params_new (
- 8, /*subvect_size*/
- 5, /*nb_subvect*/
- exc_8_128_table, /*shape_cb*/
- 7, /*shape_bits*/
- 0
- );
-}
-
-/* Split-VQ innovation for low-band wideband */
-static const split_cb_params * split_cb_sb (void)
-{
- return speex_split_cb_params_new (
- 5, /*subvect_size*/
- 8, /*nb_subvect*/
- exc_5_256_table, /*shape_cb*/
- 8, /*shape_bits*/
- 0
- );
-}
-
-/* Split-VQ innovation for high-band wideband */
-static const split_cb_params * split_cb_high (void)
-{
- return speex_split_cb_params_new (
- 8, /*subvect_size*/
- 5, /*nb_subvect*/
- hexc_table, /*shape_cb*/
- 7, /*shape_bits*/
- 1
- );
-}
-
-
-/* Split-VQ innovation for high-band wideband */
-static const split_cb_params * split_cb_high_lbr (void)
-{
- return speex_split_cb_params_new (
- 10, /*subvect_size*/
- 4, /*nb_subvect*/
- hexc_10_32_table, /*shape_cb*/
- 5, /*shape_bits*/
- 0
- );
-}
-
-/* 2150 bps "vocoder-like" mode for comfort noise */
-static const SpeexSubmode * nb_submode1 (void)
-{
- return speex_submode_new (
- 0,
- 1,
- 0,
- 0,
- /* LSP quantization */
- lsp_quant_lbr,
- lsp_unquant_lbr,
- /* No pitch quantization */
- forced_pitch_quant,
- forced_pitch_unquant,
- NULL,
- /* No innovation quantization (noise only) */
- noise_codebook_quant,
- noise_codebook_unquant,
- NULL,
-#ifdef FIXED_POINT
- 22938, 22938, 0, -1,
-#else
- .7, .7, 0, -1,
-#endif
- 43
- );
-}
-
-/* 3.95 kbps very low bit-rate mode */
-static const SpeexSubmode * nb_submode8 (void)
-{
- const split_cb_params * params;
-
- params = split_cb_nb_ulbr();
- if (params == NULL) return NULL;
-
- return speex_submode_new (
- 0,
- 1,
- 0,
- 0,
- /*LSP quantization*/
- lsp_quant_lbr,
- lsp_unquant_lbr,
- /*No pitch quantization*/
- forced_pitch_quant,
- forced_pitch_unquant,
- NULL,
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- params,
-#ifdef FIXED_POINT
- 22938, 16384, 11796, 21299,
-#else
- 0.7, 0.5, .36, .65,
-#endif
- 79
- );
-}
-
-/* 5.95 kbps very low bit-rate mode */
-static const SpeexSubmode * nb_submode2 (void)
-{
- return speex_submode_new (
- 0,
- 0,
- 0,
- 0,
- /*LSP quantization*/
- lsp_quant_lbr,
- lsp_unquant_lbr,
- /*No pitch quantization*/
- pitch_search_3tap,
- pitch_unquant_3tap,
- ltp_params_vlbr(),
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- split_cb_nb_vlbr(),
-#ifdef FIXED_POINT
- 22938, 16384, 11796, 18022,
-#else
- 0.7, 0.5, .36, .55,
-#endif
- 119
- );
-}
-
-/* 8 kbps low bit-rate mode */
-static const SpeexSubmode * nb_submode3 (void)
-{
- return speex_submode_new (
- -1,
- 0,
- 1,
- 0,
- /*LSP quantization*/
- lsp_quant_lbr,
- lsp_unquant_lbr,
- /*Pitch quantization*/
- pitch_search_3tap,
- pitch_unquant_3tap,
- ltp_params_lbr(),
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- split_cb_nb_lbr(),
-#ifdef FIXED_POINT
- 22938, 18022, 9830, 14746,
-#else
- 0.7, 0.55, .30, .45,
-#endif
- 160
- );
-}
-
-/* 11 kbps medium bit-rate mode */
-static const SpeexSubmode * nb_submode4 (void)
-{
- return speex_submode_new (
- -1,
- 0,
- 1,
- 0,
- /*LSP quantization*/
- lsp_quant_lbr,
- lsp_unquant_lbr,
- /*Pitch quantization*/
- pitch_search_3tap,
- pitch_unquant_3tap,
- ltp_params_med(),
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- split_cb_nb_med(),
-#ifdef FIXED_POINT
- 22938, 20644, 5243, 11469,
-#else
- 0.7, 0.63, .16, .35,
-#endif
- 220
- );
-}
-
-/* 15 kbps high bit-rate mode */
-static const SpeexSubmode * nb_submode5 (void)
-{
- return speex_submode_new (
- -1,
- 0,
- 3,
- 0,
- /*LSP quantization*/
- lsp_quant_nb,
- lsp_unquant_nb,
- /*Pitch quantization*/
- pitch_search_3tap,
- pitch_unquant_3tap,
- ltp_params_nb(),
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- split_cb_nb(),
-#ifdef FIXED_POINT
- 22938, 21299, 3932, 8192,
-#else
- 0.7, 0.65, .12, .25,
-#endif
- 300
- );
-}
-
-/* 18.2 high bit-rate mode */
-static const SpeexSubmode * nb_submode6 (void)
-{
- return speex_submode_new (
- -1,
- 0,
- 3,
- 0,
- /*LSP quantization*/
- lsp_quant_nb,
- lsp_unquant_nb,
- /*Pitch quantization*/
- pitch_search_3tap,
- pitch_unquant_3tap,
- ltp_params_nb(),
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- split_cb_sb(),
-#ifdef FIXED_POINT
- 22282, 21299, 2294, 3277,
-#else
- 0.68, 0.65, .07, .1,
-#endif
- 364
- );
-}
-
-/* 24.6 kbps high bit-rate mode */
-static const SpeexSubmode * nb_submode7 (void)
-{
- return speex_submode_new (
- -1,
- 0,
- 3,
- 1,
- /*LSP quantization*/
- lsp_quant_nb,
- lsp_unquant_nb,
- /*Pitch quantization*/
- pitch_search_3tap,
- pitch_unquant_3tap,
- ltp_params_nb(),
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- split_cb_nb(),
-#ifdef FIXED_POINT
- 21299, 21299, 0, -1,
-#else
- 0.65, 0.65, .0, -1,
-#endif
- 492
- );
-}
-
-
-/* Default mode for narrowband */
-static const SpeexNBMode * nb_mode (void)
-{
- const SpeexSubmode ** submodes;
- int quality_map[11] = {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7};
- const SpeexNBMode * ret;
-
- submodes = (const SpeexSubmode **)
- speex_alloc (sizeof (SpeexSubmode *) * SB_SUBMODES);
- if (submodes == NULL) return NULL;
- memset (submodes, 0, sizeof (submodes));
-
- if (!(submodes[1] = nb_submode1())) goto nb_1;
- if (!(submodes[2] = nb_submode2())) goto nb_2;
- if (!(submodes[3] = nb_submode3())) goto nb_3;
- if (!(submodes[4] = nb_submode4())) goto nb_4;
- if (!(submodes[5] = nb_submode5())) goto nb_5;
- if (!(submodes[6] = nb_submode6())) goto nb_6;
- if (!(submodes[7] = nb_submode7())) goto nb_7;
- if (!(submodes[8] = nb_submode8())) goto nb_8;
-
- ret = nb_mode_new (
- 160, /*frameSize*/
- 40, /*subframeSize*/
- 10, /*lpcSize*/
- 640, /*bufSize*/
- 17, /*pitchStart*/
- 144, /*pitchEnd*/
-#ifdef FIXED_POINT
- 29491, 19661, /* gamma1, gamma2 */
-#else
- 0.9, 0.6, /* gamma1, gamma2 */
-#endif
- .012, /*lag_factor*/
- 1.0002, /*lpc_floor*/
-#ifdef EPIC_48K
- 0,
-#endif
- submodes,
- 5,
- quality_map
- );
-
- if (ret == NULL) goto nb_8;
-
- /* If nb_mode_new() was successful, the references to submodes have been
- * copied into ret->submodes[], and it's safe to free submodes.
- */
- speex_free ((void *)submodes);
-
- return ret;
-
- /* Cleanup on memory allocation errors */
- nb_8: speex_submode_free (submodes[8]);
- nb_7: speex_submode_free (submodes[7]);
- nb_6: speex_submode_free (submodes[6]);
- nb_5: speex_submode_free (submodes[5]);
- nb_4: speex_submode_free (submodes[4]);
- nb_3: speex_submode_free (submodes[3]);
- nb_2: speex_submode_free (submodes[2]);
- nb_1: speex_submode_free (submodes[1]);
-
- speex_free ((void *)submodes);
-
- return NULL;
-}
-
-
-/* Default mode for narrowband */
-static const SpeexMode * speex_nb_mode_new (void)
-{
- const SpeexNBMode * _nb_mode;
-
- _nb_mode = nb_mode();
- if (_nb_mode == NULL) return NULL;
-
- return mode_new (
- _nb_mode,
- nb_mode_query,
- "narrowband",
- 0,
- 4,
- &nb_encoder_init,
- &nb_encoder_destroy,
- &nb_encode,
- &nb_decoder_init,
- &nb_decoder_destroy,
- &nb_decode,
- &nb_encoder_ctl,
- &nb_decoder_ctl
- );
-}
-
-static void speex_nb_mode_free (const SpeexMode * mode)
-{
- nb_mode_free ((SpeexNBMode *)mode->mode);
- speex_free ((void *)mode);
-}
-
-/* Wideband part */
-
-static const SpeexSubmode * wb_submode1 (void)
-{
- return speex_submode_new (
- 0,
- 0,
- 1,
- 0,
- /*LSP quantization*/
- lsp_quant_high,
- lsp_unquant_high,
- /*Pitch quantization*/
- NULL,
- NULL,
- NULL,
- /*No innovation quantization*/
- NULL,
- NULL,
- NULL,
-#ifdef FIXED_POINT
- 24576, 24576, 0, -1,
-#else
- .75, .75, .0, -1,
-#endif
- 36
- );
-}
-
-
-static const SpeexSubmode * wb_submode2 (void)
-{
- return speex_submode_new (
- 0,
- 0,
- 1,
- 0,
- /*LSP quantization*/
- lsp_quant_high,
- lsp_unquant_high,
- /*Pitch quantization*/
- NULL,
- NULL,
- NULL,
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- split_cb_high_lbr(),
-#ifdef FIXED_POINT
- 27853, 19661, 8192, -1,
-#else
- .85, .6, .25, -1,
-#endif
- 112
- );
-}
-
-
-static const SpeexSubmode * wb_submode3 (void)
-{
- return speex_submode_new (
- 0,
- 0,
- 1,
- 0,
- /*LSP quantization*/
- lsp_quant_high,
- lsp_unquant_high,
- /*Pitch quantization*/
- NULL,
- NULL,
- NULL,
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- split_cb_high(),
-
-#ifdef FIXED_POINT
- 24576, 22938, 1638, -1,
-#else
- .75, .7, .05, -1,
-#endif
- 192
- );
-}
-
-static const SpeexSubmode * wb_submode4 (void)
-{
- return speex_submode_new (
- 0,
- 0,
- 1,
- 1,
- /*LSP quantization*/
- lsp_quant_high,
- lsp_unquant_high,
- /*Pitch quantization*/
- NULL,
- NULL,
- NULL,
- /*Innovation quantization*/
- split_cb_search_shape_sign,
- split_cb_shape_sign_unquant,
- split_cb_high(),
-#ifdef FIXED_POINT
- 24576, 24576, 0, -1,
-#else
- .75, .75, .0, -1,
-#endif
- 352
- );
-}
-
-
-/* Split-band wideband CELP mode*/
-static const SpeexSBMode * sb_wb_mode (void)
-{
- const SpeexMode * nb_mode;
- const SpeexSubmode ** submodes;
- int low_quality_map[11] = {1, 8, 2, 3, 4, 5, 5, 6, 6, 7, 7};
- int quality_map[11] = {1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4};
- SpeexSBMode * ret;
-
- nb_mode = speex_nb_mode_new ();
- if (nb_mode == NULL) return NULL;
-
- submodes = (const SpeexSubmode **)
- speex_alloc (sizeof (SpeexSubmode *) * SB_SUBMODES);
- if (submodes == NULL) return NULL;
- memset (submodes, 0, sizeof (submodes));
-
- if (!(submodes[1] = wb_submode1())) goto sb_1;
- if (!(submodes[2] = wb_submode2())) goto sb_2;
- if (!(submodes[3] = wb_submode3())) goto sb_3;
- if (!(submodes[4] = wb_submode4())) goto sb_4;
-
- ret = sb_mode_new (
- nb_mode,
- 160, /*frameSize*/
- 40, /*subframeSize*/
- 8, /*lpcSize*/
- 640, /*bufSize*/
-#ifdef FIXED_POINT
- 29491, 19661, /* gamma1, gamma2 */
-#else
- 0.9, 0.6, /* gamma1, gamma2 */
-#endif
- .001, /*lag_factor*/
- 1.0001, /*lpc_floor*/
- 0.9,
- submodes,
- 3,
- low_quality_map,
- quality_map,
- vbr_hb_thresh,
- 5
- );
-
- if (ret == NULL) goto sb_4;
-
- /* If sb_mode_new() was successful, the references to submodes have been
- * copied into ret->submodes[], and it's safe to free submodes.
- */
- speex_free ((void *)submodes);
-
- return ret;
-
- /* Cleanup on memory allocation errors */
- sb_4: speex_submode_free (submodes[4]);
- sb_3: speex_submode_free (submodes[3]);
- sb_2: speex_submode_free (submodes[2]);
- sb_1: speex_submode_free (submodes[1]);
-
- speex_free ((void *)submodes);
-
- return NULL;
-}
-
-static void
-sb_wb_mode_free (const SpeexSBMode * mode)
-{
- speex_nb_mode_free (mode->nb_mode);
-}
-
-static const SpeexMode * speex_wb_mode_new (void)
-{
- const SpeexSBMode * sb_mode;
-
- sb_mode = sb_wb_mode ();
- if (sb_mode == NULL) return NULL;
-
- return mode_new (
- (const SpeexNBMode *)sb_mode,
- wb_mode_query,
- "wideband (sub-band CELP)",
- 1,
- 4,
- &sb_encoder_init,
- &sb_encoder_destroy,
- &sb_encode,
- &sb_decoder_init,
- &sb_decoder_destroy,
- &sb_decode,
- &sb_encoder_ctl,
- &sb_decoder_ctl
- );
-}
-
-static void speex_wb_mode_free (const SpeexMode * mode)
-{
- sb_wb_mode_free (mode->mode);
- speex_free ((void *)mode);
-}
-
-
-/* "Ultra-wideband" mode stuff */
-
-
-
-/* Split-band "ultra-wideband" (32 kbps) CELP mode*/
-static const SpeexSBMode * sb_uwb_mode (void)
-{
- const SpeexSBMode * nb_mode;
- const SpeexSubmode ** submodes;
- int low_quality_map[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
- int quality_map[11] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- SpeexSBMode * ret;
-
- nb_mode = sb_wb_mode ();
- if (nb_mode == NULL) return NULL;
-
- submodes = (const SpeexSubmode **)
- speex_alloc (sizeof (SpeexSubmode *) * SB_SUBMODES);
- if (submodes == NULL) return NULL;
- memset (submodes, 0, sizeof (submodes));
-
- if (!(submodes[1] = wb_submode1())) goto uwb_1;
-
- ret = sb_mode_new (
- (const SpeexMode *)nb_mode,
- 320, /*frameSize*/
- 80, /*subframeSize*/
- 8, /*lpcSize*/
- 1280, /*bufSize*/
-#ifdef FIXED_POINT
- 29491, 19661, /* gamma1, gamma2 */
-#else
- 0.9, 0.6, /* gamma1, gamma2 */
-#endif
- .002, /*lag_factor*/
- 1.0001, /*lpc_floor*/
- 0.7,
- submodes,
- 1,
- low_quality_map,
- quality_map,
- vbr_uhb_thresh,
- 2
- );
-
- if (ret == NULL) goto uwb_1;
-
- /* If sb_mode_new() was successful, the references to submodes have been
- * copied into ret->submodes[], and it's safe to free submodes.
- */
- speex_free ((void *)submodes);
-
- return ret;
-
- uwb_1: speex_submode_free (submodes[1]);
-
- speex_free ((void *)submodes);
-
- return NULL;
-}
-
-static void sb_uwb_mode_free (const SpeexSBMode * mode)
-{
- sb_wb_mode_free ((const SpeexSBMode *)mode->nb_mode);
- sb_mode_free (mode);
-}
-
-static const SpeexMode * speex_uwb_mode_new (void)
-{
- const SpeexSBMode * sb_mode;
-
- sb_mode = sb_uwb_mode();
- if (sb_mode == NULL) return NULL;
-
- return mode_new (
- sb_mode,
- wb_mode_query,
- "ultra-wideband (sub-band CELP)",
- 2,
- 4,
- &sb_encoder_init,
- &sb_encoder_destroy,
- &sb_encode,
- &sb_decoder_init,
- &sb_decoder_destroy,
- &sb_decode,
- &sb_encoder_ctl,
- &sb_decoder_ctl
- );
-}
-
-static void speex_uwb_mode_free (const SpeexMode * mode)
-{
- sb_uwb_mode_free (mode->mode);
- speex_free ((void *)mode);
-}
-
-const SpeexMode * speex_mode_new (int modeID)
-{
- switch (modeID) {
- case 0: return speex_nb_mode_new(); break;
- case 1: return speex_wb_mode_new(); break;
- case 2: return speex_uwb_mode_new(); break;
- default: return NULL;
- }
-}
-
-void speex_mode_destroy (const SpeexMode * mode)
-{
- switch (mode->modeID) {
- case 0: speex_nb_mode_free(mode); break;
- case 1: speex_wb_mode_free(mode); break;
- case 2: speex_uwb_mode_free(mode); break;
- default: break;
- }
-}
-
-/** XXX: This is just a dummy global mode, as used by nb_celp.c */
-const SpeexMode speex_wb_mode = {
- NULL,
- NULL,
- NULL,
- 0,
- 0,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-int speex_mode_query(const SpeexMode *mode, int request, void *ptr)
-{
- if (mode == &speex_wb_mode && request == SPEEX_SUBMODE_BITS_PER_FRAME) {
- int * p = (int*)ptr;
-
- switch (*p) {
- case 0: *p = SB_SUBMODE_BITS+1; break;
- case 1: *p = 36; break;
- case 2: *p = 112; break;
- case 3: *p = 192; break;
- case 4: *p = 352; break;
- default: *p = -1; break;
- }
-
- return 0;
- }
-
- return mode->query(mode->mode, request, ptr);
-}
More information about the commits
mailing list