Home | History | Annotate | Download | only in libspeex
      1 /* Copyright (C) 2002-2006 Jean-Marc Valin */
      2 /**
      3    @file modes.h
      4    @brief Describes the different modes of the codec
      5 */
      6 /*
      7    Redistribution and use in source and binary forms, with or without
      8    modification, are permitted provided that the following conditions
      9    are met:
     10 
     11    - Redistributions of source code must retain the above copyright
     12    notice, this list of conditions and the following disclaimer.
     13 
     14    - Redistributions in binary form must reproduce the above copyright
     15    notice, this list of conditions and the following disclaimer in the
     16    documentation and/or other materials provided with the distribution.
     17 
     18    - Neither the name of the Xiph.org Foundation nor the names of its
     19    contributors may be used to endorse or promote products derived from
     20    this software without specific prior written permission.
     21 
     22    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     23    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     24    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     25    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
     26    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     27    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     28    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     29    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     30    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     31    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     32    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     33 
     34 */
     35 
     36 #ifndef MODES_H
     37 #define MODES_H
     38 
     39 #include <speex/speex.h>
     40 #include <speex/speex_bits.h>
     41 #include "arch.h"
     42 
     43 #define NB_SUBMODES 16
     44 #define NB_SUBMODE_BITS 4
     45 
     46 #define SB_SUBMODES 8
     47 #define SB_SUBMODE_BITS 3
     48 
     49 /* Used internally, NOT TO BE USED in applications */
     50 /** Used internally*/
     51 #define SPEEX_GET_PI_GAIN 100
     52 /** Used internally*/
     53 #define SPEEX_GET_EXC     101
     54 /** Used internally*/
     55 #define SPEEX_GET_INNOV   102
     56 /** Used internally*/
     57 #define SPEEX_GET_DTX_STATUS   103
     58 /** Used internally*/
     59 #define SPEEX_SET_INNOVATION_SAVE   104
     60 /** Used internally*/
     61 #define SPEEX_SET_WIDEBAND   105
     62 
     63 /** Used internally*/
     64 #define SPEEX_GET_STACK   106
     65 
     66 
     67 /** Quantizes LSPs */
     68 typedef void (*lsp_quant_func)(spx_lsp_t *, spx_lsp_t *, int, SpeexBits *);
     69 
     70 /** Decodes quantized LSPs */
     71 typedef void (*lsp_unquant_func)(spx_lsp_t *, int, SpeexBits *);
     72 
     73 
     74 /** Long-term predictor quantization */
     75 typedef int (*ltp_quant_func)(spx_word16_t *, spx_word16_t *, spx_coef_t *, spx_coef_t *,
     76                               spx_coef_t *, spx_sig_t *, const void *, int, int, spx_word16_t,
     77                               int, int, SpeexBits*, char *, spx_word16_t *, spx_word16_t *, int, int, int, spx_word32_t *);
     78 
     79 /** Long-term un-quantize */
     80 typedef void (*ltp_unquant_func)(spx_word16_t *, spx_word32_t *, int, int, spx_word16_t, const void *, int, int *,
     81                                  spx_word16_t *, SpeexBits*, char*, int, int, spx_word16_t, int);
     82 
     83 
     84 /** Innovation quantization function */
     85 typedef void (*innovation_quant_func)(spx_word16_t *, spx_coef_t *, spx_coef_t *, spx_coef_t *, const void *, int, int,
     86                                       spx_sig_t *, spx_word16_t *, SpeexBits *, char *, int, int);
     87 
     88 /** Innovation unquantization function */
     89 typedef void (*innovation_unquant_func)(spx_sig_t *, const void *, int, SpeexBits*, char *, spx_int32_t *);
     90 
     91 /** Description of a Speex sub-mode (wither narrowband or wideband */
     92 typedef struct SpeexSubmode {
     93    int     lbr_pitch;          /**< Set to -1 for "normal" modes, otherwise encode pitch using a global pitch and allowing a +- lbr_pitch variation (for low not-rates)*/
     94    int     forced_pitch_gain;  /**< Use the same (forced) pitch gain for all sub-frames */
     95    int     have_subframe_gain; /**< Number of bits to use as sub-frame innovation gain */
     96    int     double_codebook;    /**< Apply innovation quantization twice for higher quality (and higher bit-rate)*/
     97    /*LSP functions*/
     98    lsp_quant_func    lsp_quant; /**< LSP quantization function */
     99    lsp_unquant_func  lsp_unquant; /**< LSP unquantization function */
    100 
    101    /*Long-term predictor functions*/
    102    ltp_quant_func    ltp_quant; /**< Long-term predictor (pitch) quantizer */
    103    ltp_unquant_func  ltp_unquant; /**< Long-term predictor (pitch) un-quantizer */
    104    const void       *ltp_params; /**< Pitch parameters (options) */
    105 
    106    /*Quantization of innovation*/
    107    innovation_quant_func innovation_quant; /**< Innovation quantization */
    108    innovation_unquant_func innovation_unquant; /**< Innovation un-quantization */
    109    const void             *innovation_params; /**< Innovation quantization parameters*/
    110 
    111    spx_word16_t      comb_gain;  /**< Gain of enhancer comb filter */
    112 
    113    int               bits_per_frame; /**< Number of bits per frame after encoding*/
    114 } SpeexSubmode;
    115 
    116 /** Struct defining the encoding/decoding mode*/
    117 typedef struct SpeexNBMode {
    118    int     frameSize;      /**< Size of frames used for encoding */
    119    int     subframeSize;   /**< Size of sub-frames used for encoding */
    120    int     lpcSize;        /**< Order of LPC filter */
    121    int     pitchStart;     /**< Smallest pitch value allowed */
    122    int     pitchEnd;       /**< Largest pitch value allowed */
    123 
    124    spx_word16_t gamma1;    /**< Perceptual filter parameter #1 */
    125    spx_word16_t gamma2;    /**< Perceptual filter parameter #2 */
    126    spx_word16_t   lpc_floor;      /**< Noise floor for LPC analysis */
    127 
    128    const SpeexSubmode *submodes[NB_SUBMODES]; /**< Sub-mode data for the mode */
    129    int     defaultSubmode; /**< Default sub-mode to use when encoding */
    130    int     quality_map[11]; /**< Mode corresponding to each quality setting */
    131 } SpeexNBMode;
    132 
    133 
    134 /** Struct defining the encoding/decoding mode for SB-CELP (wideband) */
    135 typedef struct SpeexSBMode {
    136    const SpeexMode *nb_mode;    /**< Embedded narrowband mode */
    137    int     frameSize;     /**< Size of frames used for encoding */
    138    int     subframeSize;  /**< Size of sub-frames used for encoding */
    139    int     lpcSize;       /**< Order of LPC filter */
    140    spx_word16_t gamma1;   /**< Perceptual filter parameter #1 */
    141    spx_word16_t gamma2;   /**< Perceptual filter parameter #1 */
    142    spx_word16_t   lpc_floor;     /**< Noise floor for LPC analysis */
    143    spx_word16_t   folding_gain;
    144 
    145    const SpeexSubmode *submodes[SB_SUBMODES]; /**< Sub-mode data for the mode */
    146    int     defaultSubmode; /**< Default sub-mode to use when encoding */
    147    int     low_quality_map[11]; /**< Mode corresponding to each quality setting */
    148    int     quality_map[11]; /**< Mode corresponding to each quality setting */
    149 #ifndef DISABLE_VBR
    150    const float (*vbr_thresh)[11];
    151 #endif
    152    int     nb_modes;
    153 } SpeexSBMode;
    154 
    155 int speex_encode_native(void *state, spx_word16_t *in, SpeexBits *bits);
    156 int speex_decode_native(void *state, SpeexBits *bits, spx_word16_t *out);
    157 
    158 int nb_mode_query(const void *mode, int request, void *ptr);
    159 int wb_mode_query(const void *mode, int request, void *ptr);
    160 
    161 #endif
    162