You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

268 lines
6.9 KiB

/*
* G.723.1 common header and data tables
* Copyright (c) 2006 Benjamin Larsson
* Copyright (c) 2010 Mohamed Naufal Basheer
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file
* G.723.1 types, functions and data tables
*/
#ifndef AVCODEC_G723_1_H
#define AVCODEC_G723_1_H
#include <stdint.h>
#include "libavutil/log.h"
#define SUBFRAMES 4
#define SUBFRAME_LEN 60
#define FRAME_LEN (SUBFRAME_LEN << 2)
#define HALF_FRAME_LEN (FRAME_LEN / 2)
#define LPC_FRAME (HALF_FRAME_LEN + SUBFRAME_LEN)
#define LPC_ORDER 10
#define LSP_BANDS 3
#define LSP_CB_SIZE 256
#define PITCH_MIN 18
#define PITCH_MAX (PITCH_MIN + 127)
#define PITCH_ORDER 5
#define GRID_SIZE 2
#define PULSE_MAX 6
#define GAIN_LEVELS 24
#define COS_TBL_SIZE 512
/**
* Bitexact implementation of 2ab scaled by 1/2^16.
*
* @param a 32 bit multiplicand
* @param b 16 bit multiplier
*/
#define MULL2(a, b) \
((((a) >> 16) * (b) * 2) + (((a) & 0xffff) * (b) >> 15))
/**
* G723.1 frame types
*/
enum FrameType {
Merge commit '1470ce21cec5ee26e106e2a884c26bbf84e5aaea' * commit '1470ce21cec5ee26e106e2a884c26bbf84e5aaea': Bump libavcodec and libavformat minor versions for G.723.1 decoder and demuxer G.723.1 demuxer and decoder Add a shift parameter to celp_lp_synthesis_filter() libopenjpeg: K&R formatting cosmetics yadif: use emms_c() instead of inline assembly for emms invocations. ac3: don't use different names for option tables in the template file. lavfi: use const for AVFilterPad declarations in all filters. adpcm: don't duplicate identical AVSampleFmt array for each encoder. configure: cosmetics: Group test dependencies together configure: add more passthrough flags in tms470 filter configure: move flag filtering functions out of if/else blocks Conflicts: Changelog configure doc/general.texi libavcodec/Makefile libavcodec/ac3enc_fixed.c libavcodec/allcodecs.c libavcodec/eac3enc.c libavcodec/g723_1.c libavcodec/g723_1_data.h libavcodec/libopenjpegdec.c libavcodec/libopenjpegenc.c libavcodec/v210dec.h libavcodec/version.h libavfilter/af_anull.c libavfilter/asrc_anullsrc.c libavfilter/f_settb.c libavfilter/fifo.c libavfilter/split.c libavfilter/src_movie.c libavfilter/vf_aspect.c libavfilter/vf_blackframe.c libavfilter/vf_boxblur.c libavfilter/vf_copy.c libavfilter/vf_crop.c libavfilter/vf_cropdetect.c libavfilter/vf_delogo.c libavfilter/vf_drawbox.c libavfilter/vf_drawtext.c libavfilter/vf_fade.c libavfilter/vf_fieldorder.c libavfilter/vf_format.c libavfilter/vf_frei0r.c libavfilter/vf_gradfun.c libavfilter/vf_hflip.c libavfilter/vf_hqdn3d.c libavfilter/vf_libopencv.c libavfilter/vf_lut.c libavfilter/vf_null.c libavfilter/vf_overlay.c libavfilter/vf_pad.c libavfilter/vf_pixdesctest.c libavfilter/vf_scale.c libavfilter/vf_select.c libavfilter/vf_setpts.c libavfilter/vf_showinfo.c libavfilter/vf_slicify.c libavfilter/vf_transpose.c libavfilter/vf_unsharp.c libavfilter/vf_vflip.c libavfilter/vf_yadif.c libavfilter/vsrc_color.c libavfilter/vsrc_testsrc.c libavformat/Makefile libavformat/allformats.c libavformat/g723_1.c libavformat/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
13 years ago
ACTIVE_FRAME, ///< Active speech
SID_FRAME, ///< Silence Insertion Descriptor frame
UNTRANSMITTED_FRAME
};
/**
* G723.1 rate values
*/
enum Rate {
Merge commit '1470ce21cec5ee26e106e2a884c26bbf84e5aaea' * commit '1470ce21cec5ee26e106e2a884c26bbf84e5aaea': Bump libavcodec and libavformat minor versions for G.723.1 decoder and demuxer G.723.1 demuxer and decoder Add a shift parameter to celp_lp_synthesis_filter() libopenjpeg: K&R formatting cosmetics yadif: use emms_c() instead of inline assembly for emms invocations. ac3: don't use different names for option tables in the template file. lavfi: use const for AVFilterPad declarations in all filters. adpcm: don't duplicate identical AVSampleFmt array for each encoder. configure: cosmetics: Group test dependencies together configure: add more passthrough flags in tms470 filter configure: move flag filtering functions out of if/else blocks Conflicts: Changelog configure doc/general.texi libavcodec/Makefile libavcodec/ac3enc_fixed.c libavcodec/allcodecs.c libavcodec/eac3enc.c libavcodec/g723_1.c libavcodec/g723_1_data.h libavcodec/libopenjpegdec.c libavcodec/libopenjpegenc.c libavcodec/v210dec.h libavcodec/version.h libavfilter/af_anull.c libavfilter/asrc_anullsrc.c libavfilter/f_settb.c libavfilter/fifo.c libavfilter/split.c libavfilter/src_movie.c libavfilter/vf_aspect.c libavfilter/vf_blackframe.c libavfilter/vf_boxblur.c libavfilter/vf_copy.c libavfilter/vf_crop.c libavfilter/vf_cropdetect.c libavfilter/vf_delogo.c libavfilter/vf_drawbox.c libavfilter/vf_drawtext.c libavfilter/vf_fade.c libavfilter/vf_fieldorder.c libavfilter/vf_format.c libavfilter/vf_frei0r.c libavfilter/vf_gradfun.c libavfilter/vf_hflip.c libavfilter/vf_hqdn3d.c libavfilter/vf_libopencv.c libavfilter/vf_lut.c libavfilter/vf_null.c libavfilter/vf_overlay.c libavfilter/vf_pad.c libavfilter/vf_pixdesctest.c libavfilter/vf_scale.c libavfilter/vf_select.c libavfilter/vf_setpts.c libavfilter/vf_showinfo.c libavfilter/vf_slicify.c libavfilter/vf_transpose.c libavfilter/vf_unsharp.c libavfilter/vf_vflip.c libavfilter/vf_yadif.c libavfilter/vsrc_color.c libavfilter/vsrc_testsrc.c libavformat/Makefile libavformat/allformats.c libavformat/g723_1.c libavformat/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
13 years ago
RATE_6300,
RATE_5300
};
/**
* G723.1 unpacked data subframe
*/
Merge commit '1470ce21cec5ee26e106e2a884c26bbf84e5aaea' * commit '1470ce21cec5ee26e106e2a884c26bbf84e5aaea': Bump libavcodec and libavformat minor versions for G.723.1 decoder and demuxer G.723.1 demuxer and decoder Add a shift parameter to celp_lp_synthesis_filter() libopenjpeg: K&R formatting cosmetics yadif: use emms_c() instead of inline assembly for emms invocations. ac3: don't use different names for option tables in the template file. lavfi: use const for AVFilterPad declarations in all filters. adpcm: don't duplicate identical AVSampleFmt array for each encoder. configure: cosmetics: Group test dependencies together configure: add more passthrough flags in tms470 filter configure: move flag filtering functions out of if/else blocks Conflicts: Changelog configure doc/general.texi libavcodec/Makefile libavcodec/ac3enc_fixed.c libavcodec/allcodecs.c libavcodec/eac3enc.c libavcodec/g723_1.c libavcodec/g723_1_data.h libavcodec/libopenjpegdec.c libavcodec/libopenjpegenc.c libavcodec/v210dec.h libavcodec/version.h libavfilter/af_anull.c libavfilter/asrc_anullsrc.c libavfilter/f_settb.c libavfilter/fifo.c libavfilter/split.c libavfilter/src_movie.c libavfilter/vf_aspect.c libavfilter/vf_blackframe.c libavfilter/vf_boxblur.c libavfilter/vf_copy.c libavfilter/vf_crop.c libavfilter/vf_cropdetect.c libavfilter/vf_delogo.c libavfilter/vf_drawbox.c libavfilter/vf_drawtext.c libavfilter/vf_fade.c libavfilter/vf_fieldorder.c libavfilter/vf_format.c libavfilter/vf_frei0r.c libavfilter/vf_gradfun.c libavfilter/vf_hflip.c libavfilter/vf_hqdn3d.c libavfilter/vf_libopencv.c libavfilter/vf_lut.c libavfilter/vf_null.c libavfilter/vf_overlay.c libavfilter/vf_pad.c libavfilter/vf_pixdesctest.c libavfilter/vf_scale.c libavfilter/vf_select.c libavfilter/vf_setpts.c libavfilter/vf_showinfo.c libavfilter/vf_slicify.c libavfilter/vf_transpose.c libavfilter/vf_unsharp.c libavfilter/vf_vflip.c libavfilter/vf_yadif.c libavfilter/vsrc_color.c libavfilter/vsrc_testsrc.c libavformat/Makefile libavformat/allformats.c libavformat/g723_1.c libavformat/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
13 years ago
typedef struct G723_1_Subframe {
int ad_cb_lag; ///< adaptive codebook lag
int ad_cb_gain;
int dirac_train;
int pulse_sign;
int grid_index;
int amp_index;
int pulse_pos;
} G723_1_Subframe;
/**
* Pitch postfilter parameters
*/
typedef struct PPFParam {
int index; ///< postfilter backward/forward lag
int16_t opt_gain; ///< optimal gain
int16_t sc_gain; ///< scaling gain
} PPFParam;
/**
* Harmonic filter parameters
*/
typedef struct HFParam {
int index;
int gain;
} HFParam;
/**
* Optimized fixed codebook excitation parameters
*/
typedef struct FCBParam {
int min_err;
int amp_index;
int grid_index;
int dirac_train;
int pulse_pos[PULSE_MAX];
int pulse_sign[PULSE_MAX];
} FCBParam;
typedef struct G723_1_ChannelContext {
G723_1_Subframe subframe[4];
enum FrameType cur_frame_type;
enum FrameType past_frame_type;
enum Rate cur_rate;
uint8_t lsp_index[LSP_BANDS];
int pitch_lag[2];
int erased_frames;
int16_t prev_lsp[LPC_ORDER];
int16_t sid_lsp[LPC_ORDER];
int16_t prev_excitation[PITCH_MAX];
int16_t excitation[PITCH_MAX + FRAME_LEN + 4];
int16_t synth_mem[LPC_ORDER];
int16_t fir_mem[LPC_ORDER];
int iir_mem[LPC_ORDER];
int random_seed;
int cng_random_seed;
int interp_index;
int interp_gain;
int sid_gain;
int cur_gain;
int reflection_coef;
int pf_gain; ///< formant postfilter
///< gain scaling unit memory
int16_t audio[FRAME_LEN + LPC_ORDER + PITCH_MAX + 4];
/* encoder */
int16_t prev_data[HALF_FRAME_LEN];
int16_t prev_weight_sig[PITCH_MAX];
int16_t hpf_fir_mem; ///< highpass filter fir
int hpf_iir_mem; ///< and iir memories
int16_t perf_fir_mem[LPC_ORDER]; ///< perceptual filter fir
int16_t perf_iir_mem[LPC_ORDER]; ///< and iir memories
int16_t harmonic_mem[PITCH_MAX];
} G723_1_ChannelContext;
typedef struct G723_1_Context {
AVClass *class;
int postfilter;
G723_1_ChannelContext ch[2];
} G723_1_Context;
/**
* Scale vector contents based on the largest of their absolutes.
*/
int ff_g723_1_scale_vector(int16_t *dst, const int16_t *vector, int length);
/**
* Calculate the number of left-shifts required for normalizing the input.
*
* @param num input number
* @param width width of the input, 16 bits(0) / 32 bits(1)
*/
int ff_g723_1_normalize_bits(int num, int width);
int ff_g723_1_dot_product(const int16_t *a, const int16_t *b, int length);
/**
* Get delayed contribution from the previous excitation vector.
*/
void ff_g723_1_get_residual(int16_t *residual, int16_t *prev_excitation,
int lag);
/**
* Generate a train of dirac functions with period as pitch lag.
*/
void ff_g723_1_gen_dirac_train(int16_t *buf, int pitch_lag);
/**
* Generate adaptive codebook excitation.
*/
void ff_g723_1_gen_acb_excitation(int16_t *vector, int16_t *prev_excitation,
int pitch_lag, G723_1_Subframe *subfrm,
enum Rate cur_rate);
/**
* Quantize LSP frequencies by interpolation and convert them to
* the corresponding LPC coefficients.
*
* @param lpc buffer for LPC coefficients
* @param cur_lsp the current LSP vector
* @param prev_lsp the previous LSP vector
*/
void ff_g723_1_lsp_interpolate(int16_t *lpc, int16_t *cur_lsp,
int16_t *prev_lsp);
/**
* Perform inverse quantization of LSP frequencies.
*
* @param cur_lsp the current LSP vector
* @param prev_lsp the previous LSP vector
* @param lsp_index VQ indices
* @param bad_frame bad frame flag
*/
void ff_g723_1_inverse_quant(int16_t *cur_lsp, int16_t *prev_lsp,
uint8_t *lsp_index, int bad_frame);
static const uint8_t frame_size[4] = { 24, 20, 4, 1 };
/**
* LSP DC component
*/
static const int16_t dc_lsp[LPC_ORDER] = {
0x0c3b,
0x1271,
0x1e0a,
0x2a36,
0x3630,
0x406f,
0x4d28,
0x56f4,
0x638c,
0x6c46
};
/* Cosine table scaled by 2^14 */
extern const int16_t ff_g723_1_cos_tab[COS_TBL_SIZE + 1];
#define G723_1_COS_TAB_FIRST_ELEMENT 16384
/**
* LSP VQ tables
*/
extern const int16_t ff_g723_1_lsp_band0[LSP_CB_SIZE][3];
extern const int16_t ff_g723_1_lsp_band1[LSP_CB_SIZE][3];
extern const int16_t ff_g723_1_lsp_band2[LSP_CB_SIZE][4];
/**
* Used for the coding/decoding of the pulses positions
* for the MP-MLQ codebook
*/
extern const int32_t ff_g723_1_combinatorial_table[PULSE_MAX][SUBFRAME_LEN/GRID_SIZE];
/**
* Number of non-zero pulses in the MP-MLQ excitation
*/
static const int8_t pulses[4] = {6, 5, 6, 5};
extern const int16_t ff_g723_1_fixed_cb_gain[GAIN_LEVELS];
extern const int16_t ff_g723_1_adaptive_cb_gain85 [ 85 * 20];
extern const int16_t ff_g723_1_adaptive_cb_gain170[170 * 20];
#endif /* AVCODEC_G723_1_H */