Index: speex/libspeex/modes_wb.c |
=================================================================== |
--- speex/libspeex/modes_wb.c (revision 0) |
+++ speex/libspeex/modes_wb.c (revision 0) |
@@ -0,0 +1,300 @@ |
+/* Copyright (C) 2002-2007 Jean-Marc Valin |
+ File: modes.c |
+ |
+ Describes the wideband modes of the codec |
+ |
+ 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 "arch.h" |
+#include <math.h> |
+#include "os_support.h" |
+ |
+ |
+#ifndef NULL |
+#define NULL 0 |
+#endif |
+ |
+EXPORT const SpeexMode * const speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode}; |
+ |
+extern const signed char hexc_table[]; |
+extern const signed char hexc_10_32_table[]; |
+ |
+#ifndef DISABLE_WIDEBAND |
+ |
+/* Split-VQ innovation for high-band wideband */ |
+static const split_cb_params split_cb_high = { |
+ 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 = { |
+ 10, /*subvect_size*/ |
+ 4, /*nb_subvect*/ |
+ hexc_10_32_table, /*shape_cb*/ |
+ 5, /*shape_bits*/ |
+ 0, |
+}; |
+ |
+#endif |
+ |
+ |
+static const SpeexSubmode wb_submode1 = { |
+ 0, |
+ 0, |
+ 1, |
+ 0, |
+ /*LSP quantization*/ |
+ lsp_quant_high, |
+ lsp_unquant_high, |
+ /*Pitch quantization*/ |
+ NULL, |
+ NULL, |
+ NULL, |
+ /*No innovation quantization*/ |
+ NULL, |
+ NULL, |
+ NULL, |
+ -1, |
+ 36 |
+}; |
+ |
+ |
+static const SpeexSubmode wb_submode2 = { |
+ 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, |
+#ifdef DISABLE_WIDEBAND |
+ NULL, |
+#else |
+ &split_cb_high_lbr, |
+#endif |
+ -1, |
+ 112 |
+}; |
+ |
+ |
+static const SpeexSubmode wb_submode3 = { |
+ 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, |
+#ifdef DISABLE_WIDEBAND |
+ NULL, |
+#else |
+ &split_cb_high, |
+#endif |
+ -1, |
+ 192 |
+}; |
+ |
+static const SpeexSubmode wb_submode4 = { |
+ 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, |
+#ifdef DISABLE_WIDEBAND |
+ NULL, |
+#else |
+ &split_cb_high, |
+#endif |
+ -1, |
+ 352 |
+}; |
+ |
+ |
+/* Split-band wideband CELP mode*/ |
+static const SpeexSBMode sb_wb_mode = { |
+ &speex_nb_mode, |
+ 160, /*frameSize*/ |
+ 40, /*subframeSize*/ |
+ 8, /*lpcSize*/ |
+#ifdef FIXED_POINT |
+ 29491, 19661, /* gamma1, gamma2 */ |
+#else |
+ 0.9, 0.6, /* gamma1, gamma2 */ |
+#endif |
+ QCONST16(.0002,15), /*lpc_floor*/ |
+ QCONST16(0.9f,15), |
+ {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL}, |
+ 3, |
+ {1, 8, 2, 3, 4, 5, 5, 6, 6, 7, 7}, |
+ {1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4}, |
+#ifndef DISABLE_VBR |
+ vbr_hb_thresh, |
+#endif |
+ 5 |
+}; |
+ |
+ |
+EXPORT const SpeexMode speex_wb_mode = { |
+ &sb_wb_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, |
+}; |
+ |
+ |
+ |
+/* "Ultra-wideband" mode stuff */ |
+ |
+ |
+ |
+/* Split-band "ultra-wideband" (32 kbps) CELP mode*/ |
+static const SpeexSBMode sb_uwb_mode = { |
+ &speex_wb_mode, |
+ 320, /*frameSize*/ |
+ 80, /*subframeSize*/ |
+ 8, /*lpcSize*/ |
+#ifdef FIXED_POINT |
+ 29491, 19661, /* gamma1, gamma2 */ |
+#else |
+ 0.9, 0.6, /* gamma1, gamma2 */ |
+#endif |
+ QCONST16(.0002,15), /*lpc_floor*/ |
+ QCONST16(0.7f,15), |
+ {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL}, |
+ 1, |
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, |
+ {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, |
+#ifndef DISABLE_VBR |
+ vbr_uhb_thresh, |
+#endif |
+ 2 |
+}; |
+ |
+int wb_mode_query(const void *mode, int request, void *ptr) |
+{ |
+ const SpeexSBMode *m = (const SpeexSBMode*)mode; |
+ |
+ switch (request) |
+ { |
+ case SPEEX_MODE_FRAME_SIZE: |
+ *((int*)ptr)=2*m->frameSize; |
+ break; |
+ case SPEEX_SUBMODE_BITS_PER_FRAME: |
+ if (*((int*)ptr)==0) |
+ *((int*)ptr) = SB_SUBMODE_BITS+1; |
+ else if (m->submodes[*((int*)ptr)]==NULL) |
+ *((int*)ptr) = -1; |
+ else |
+ *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame; |
+ break; |
+ default: |
+ speex_warning_int("Unknown wb_mode_query request: ", request); |
+ return -1; |
+ } |
+ return 0; |
+} |
+ |
+ |
+EXPORT const SpeexMode speex_uwb_mode = { |
+ &sb_uwb_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, |
+}; |
+ |
+/* We have defined speex_lib_get_mode() as a macro in speex.h */ |
+#undef speex_lib_get_mode |
+ |
+EXPORT const SpeexMode * speex_lib_get_mode (int mode) |
+{ |
+ if (mode < 0 || mode >= SPEEX_NB_MODES) return NULL; |
+ |
+ return speex_mode_list[mode]; |
+} |
+ |
+ |
+ |
Property changes on: speex/libspeex/modes_wb.c |
___________________________________________________________________ |
Name: svn:executable |
+ * |