32 #define BITSTREAM_READER_LE 41 #define CNG_RANDOM_SEED 12345 49 60, 0, 0, 2489, 60, 0, 0, 5217,
50 1, 6171, 0, 3953, 0, 10364, 1, 9357,
51 -1, 8843, 1, 9396, 0, 5794, -1, 10816,
52 2, 11606, -2, 12072, 0, 8616, 1, 12170,
53 0, 14440, 0, 7787, -1, 13721, 0, 18205,
54 0, 14471, 0, 15807, 1, 15275, 0, 13480,
55 -1, 18375, -1, 0, 1, 11194, -1, 13010,
56 1, 18836, -2, 20354, 1, 16233, -1, 0,
57 60, 0, 0, 12130, 0, 13385, 1, 17834,
58 1, 20875, 0, 21996, 1, 0, 1, 18277,
59 -1, 21321, 1, 13738, -1, 19094, -1, 20387,
60 -1, 0, 0, 21008, 60, 0, -2, 22807,
61 0, 15900, 1, 0, 0, 17989, -1, 22259,
62 1, 24395, 1, 23138, 0, 23948, 1, 22997,
63 2, 22604, -1, 25942, 0, 26246, 1, 25321,
64 0, 26423, 0, 24061, 0, 27247, 60, 0,
65 -1, 25572, 1, 23918, 1, 25930, 2, 26408,
66 -1, 19049, 1, 27357, -1, 24538, 60, 0,
67 -1, 25093, 0, 28549, 1, 0, 0, 22793,
68 -1, 25659, 0, 29377, 0, 30276, 0, 26198,
69 1, 22521, -1, 28919, 0, 27384, 1, 30162,
70 -1, 0, 0, 24237, -1, 30062, 0, 21763,
71 1, 30917, 60, 0, 0, 31284, 0, 29433,
72 1, 26821, 1, 28655, 0, 31327, 2, 30799,
73 1, 31389, 0, 32322, 1, 31760, -2, 31830,
74 0, 26936, -1, 31180, 1, 30875, 0, 27873,
75 -1, 30429, 1, 31050, 0, 0, 0, 31912,
76 1, 31611, 0, 31565, 0, 25557, 0, 31357,
77 60, 0, 1, 29536, 1, 28985, -1, 26984,
78 -1, 31587, 2, 30836, -2, 31133, 0, 30243,
79 -1, 30742, -1, 32090, 60, 0, 2, 30902,
80 60, 0, 0, 30027, 0, 29042, 60, 0,
81 0, 31756, 0, 24553, 0, 25636, -2, 30501,
82 60, 0, -1, 29617, 0, 30649, 60, 0,
83 0, 29274, 2, 30415, 0, 27480, 0, 31213,
84 -1, 28147, 0, 30600, 1, 31652, 2, 29068,
85 60, 0, 1, 28571, 1, 28730, 1, 31422,
86 0, 28257, 0, 24797, 60, 0, 0, 0,
87 60, 0, 0, 22105, 0, 27852, 60, 0,
88 60, 0, -1, 24214, 0, 24642, 0, 23305,
89 60, 0, 60, 0, 1, 22883, 0, 21601,
90 60, 0, 2, 25650, 60, 0, -2, 31253,
104 {21299, 13844, 8999, 5849, 3802, 2471, 1606, 1044, 679, 441},
106 {24576, 18432, 13824, 10368, 7776, 5832, 4374, 3281, 2460, 1845}
111 static const int cng_filt[4] = { 273, 998, 499, 333 };
113 static const int cng_bseg[3] = { 2048, 18432, 231233 };
125 for (
int ch = 0; ch < avctx->
channels; ch++) {
152 int temp, info_bits,
i;
162 if (info_bits == 3) {
172 if (info_bits == 2) {
269 return (
ff_sqrt(val << 1) >> 1) & (~1);
282 enum Rate cur_rate,
int pitch_lag,
int index)
319 for (i = 0; i < 8; i += 2) {
320 offset = ((cb_pos & 7) << 3) + cb_shift +
i;
321 vector[
offset] = (cb_sign & 1) ? cb_gain : -cb_gain;
333 vector[i] += beta * vector[i - lag] >> 15;
349 int pitch_lag,
int length,
int dir)
351 int limit, ccr, lag = 0;
358 limit = pitch_lag + 3;
360 for (i = pitch_lag - 3; i <= limit; i++) {
363 if (ccr > *ccr_max) {
382 int tgt_eng,
int ccr,
int res_eng)
389 temp1 = tgt_eng * res_eng >> 1;
390 temp2 = ccr * ccr << 1;
393 if (ccr >= res_eng) {
396 ppf->
opt_gain = (ccr << 15) / res_eng *
400 temp1 = (tgt_eng << 15) + (ccr * ppf->
opt_gain << 1);
402 pf_residual = av_sat_add32(temp1, temp2 + (1 << 15)) >> 16;
404 if (tgt_eng >= pf_residual << 1) {
407 temp1 = (tgt_eng << 14) / pf_residual;
444 int energy[5] = {0, 0, 0, 0, 0};
446 int fwd_lag =
autocorr_max(buf, offset, &energy[1], pitch_lag,
448 int back_lag =
autocorr_max(buf, offset, &energy[3], pitch_lag,
456 if (!back_lag && !fwd_lag)
474 for (i = 0; i < 5; i++)
475 temp1 =
FFMAX(energy[i], temp1);
478 for (i = 0; i < 5; i++)
479 energy[i] = (energy[i] << scale) >> 16;
481 if (fwd_lag && !back_lag) {
484 }
else if (!fwd_lag) {
493 temp1 = energy[4] * ((energy[1] * energy[1] + (1 << 14)) >> 15);
494 temp2 = energy[2] * ((energy[3] * energy[3] + (1 << 14)) >> 15);
495 if (temp1 >= temp2) {
516 int *exc_eng,
int *scale)
528 index =
autocorr_max(buf, offset, &ccr, pitch_lag, SUBFRAME_LEN * 2, -1);
529 ccr = av_sat_add32(ccr, 1 << 15) >> 16;
533 *exc_eng = av_sat_add32(tgt_eng, 1 << 15) >> 16;
541 best_eng = av_sat_add32(best_eng, 1 << 15) >> 16;
543 temp = best_eng * *exc_eng >> 3;
545 if (temp < ccr * ccr) {
561 int gain,
int *rseed)
567 for (i = 0; i < lag; i++)
568 out[i] = vector_ptr[i - lag] * 3 >> 2;
573 *rseed = (int16_t)(*rseed * 521 + 259);
574 out[
i] = gain * *rseed >> 15;
576 memset(buf, 0, (FRAME_LEN +
PITCH_MAX) *
sizeof(*buf));
589 #define iir_filter(fir_coef, iir_coef, src, dest, width)\ 592 int res_shift = 16 & ~-(width);\ 593 int in_shift = 16 - res_shift;\ 595 for (m = 0; m < SUBFRAME_LEN; m++) {\ 597 for (n = 1; n <= LPC_ORDER; n++) {\ 598 filter -= (fir_coef)[n - 1] * (src)[m - n] -\ 599 (iir_coef)[n - 1] * ((dest)[m - n] >> in_shift);\ 602 (dest)[m] = av_clipl_int32(((src)[m] * 65536) + (filter * 8) +\ 603 (1 << 15)) >> res_shift;\ 622 int temp = buf[
i] >> 2;
624 denom = av_sat_dadd32(denom, temp);
630 num = num << bits1 >> 1;
633 bits2 = 5 + bits1 -
bits2;
634 bits2 = av_clip_uintp2(bits2, 5);
636 gain = (num >> 1) / (denom >> 16);
658 int16_t *buf, int16_t *dst)
674 iir_filter(filter_coef[0], filter_coef[1], buf + i, filter_signal + i, 1);
696 temp = auto_corr[1] >> 16;
698 temp = (auto_corr[0] >> 2) / temp;
705 dst[j] = av_sat_dadd32(signal_ptr[j],
706 (signal_ptr[j - 1] >> 16) * temp) >> 16;
710 temp = 2 * scale + 4;
712 energy = av_clipl_int32((int64_t)auto_corr[1] << -temp);
714 energy = auto_corr[1] >>
temp;
728 else if (gain < 0x20)
729 return gain - 8 << 7;
731 return gain - 20 << 8;
736 *state = (*state * 521 + 259) & 0xFFFF;
737 return (*state & 0x7FFF) * base >> 15;
742 int i,
shift, seg, seg2, t,
val, val_add, x, y;
753 }
else if(shift < -31) {
757 x = av_clipl_int32(t * (int64_t)
cng_filt[0] >> 16);
769 seg2 =
FFMIN(seg, 3);
773 for (i = 0; i <
shift; i++) {
774 t = seg * 32 + (val << seg2);
783 t = seg * 32 + (val << seg2);
786 t = seg * 32 + (val + 1 << seg2);
788 val = (seg2 - 1) * 16 + val;
792 t = seg * 32 + (val - 1 << seg2);
794 val = (seg2 - 1) * 16 + val;
820 for (i = 0; i < SUBFRAMES / 2; i++) {
825 for (j = 0; j < 11; j++) {
826 signs[i * 11 + j] = ((t & 1) * 2 - 1) * (1 << 14);
836 for (j = 0; j <
pulses[
i]; j++, idx++) {
839 pos[idx] = tmp[idx2] * 2 + off[
i];
840 tmp[idx2] = tmp[--t];
858 t |=
FFABS(vector_ptr[j]);
859 t =
FFMIN(t, 0x7FFF);
869 for (j = 0; j < SUBFRAME_LEN * 2; j++) {
870 t = vector_ptr[j] * (1 << -
shift);
875 for (j = 0; j < SUBFRAME_LEN * 2; j++) {
876 t = vector_ptr[j] >>
shift;
883 for (j = 0; j < 11; j++)
884 b0 += tmp[pos[(i / 2) * 11 + j]] * signs[(i / 2) * 11 + j];
885 b0 = b0 * 2 * 2979LL + (1 << 29) >> 30;
888 if (shift * 2 + 3 >= 0)
891 c <<= -(shift * 2 + 3);
892 c = (av_clipl_int32(sum << 1) -
c) * 2979LL >> 15;
894 delta = b0 * b0 * 2 -
c;
909 x = av_clip(x, -10000, 10000);
911 for (j = 0; j < 11; j++) {
912 idx = (i / 2) * 11 + j;
913 vector_ptr[pos[idx]] = av_clip_int16(vector_ptr[pos[idx]] +
914 (x * signs[idx] >> 15));
918 memcpy(vector_ptr +
PITCH_MAX, vector_ptr,
919 sizeof(*vector_ptr) * SUBFRAME_LEN * 2);
920 vector_ptr += SUBFRAME_LEN * 2;
928 int *got_frame_ptr,
AVPacket *avpkt)
933 int buf_size = avpkt->
size;
934 int dec_mode = buf[0] & 3;
941 int bad_frame = 0,
i, j,
ret;
946 "Expected %d bytes, got %d - skipping packet\n",
956 for (
int ch = 0; ch < avctx->
channels; ch++) {
958 int16_t *audio = p->
audio;
1001 int v = av_clip_int16(vector_ptr[j] * 2);
1002 vector_ptr[j] = av_clip_int16(v + acb_vector[j]);
1022 vector_ptr +
i + ppf[j].
index,
1041 memset(frame->
data[0], 0,
1087 out[
i] = av_clip_int16(2 * p->
audio[LPC_ORDER +
i]);
1096 #define OFFSET(x) offsetof(G723_1_Context, x) 1097 #define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM 1101 { .i64 = 1 }, 0, 1,
AD },
1122 .priv_class = &g723_1dec_class,
static void comp_ppf_gains(int lag, PPFParam *ppf, enum Rate cur_rate, int tgt_eng, int ccr, int res_eng)
Calculate pitch postfilter optimal and scaling gains.
int16_t excitation[PITCH_MAX+FRAME_LEN+4]
static int shift(int a, int b)
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
const int16_t ff_g723_1_fixed_cb_gain[GAIN_LEVELS]
static void gen_fcb_excitation(int16_t *vector, G723_1_Subframe *subfrm, enum Rate cur_rate, int pitch_lag, int index)
Generate fixed codebook excitation vector.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
Memory handling functions.
G723_1_Subframe subframe[4]
static av_cold int init(AVCodecContext *avctx)
G723.1 unpacked data subframe.
int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, const int16_t *in, int buffer_length, int filter_length, int stop_on_overflow, int shift, int rounder)
LP synthesis filter.
static const AVClass g723_1dec_class
static const int8_t pulses[4]
Number of non-zero pulses in the MP-MLQ excitation.
static const int32_t max_pos[4]
Size of the MP-MLQ fixed excitation codebooks.
const char * av_default_item_name(void *ptr)
Return the context name.
int16_t audio[FRAME_LEN+LPC_ORDER+PITCH_MAX+4]
static const int16_t postfilter_tbl[2][LPC_ORDER]
0.65^i (Zero part) and 0.75^i (Pole part) scaled by 2^15
static void residual_interp(int16_t *buf, int16_t *out, int lag, int gain, int *rseed)
Perform residual interpolation based on frame classification.
static void formant_postfilter(G723_1_ChannelContext *p, int16_t *lpc, int16_t *buf, int16_t *dst)
Perform formant filtering.
#define AV_CH_LAYOUT_STEREO
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static int estimate_sid_gain(G723_1_ChannelContext *p)
static void postfilter(AMRContext *p, float *lpc, float *buf_out)
Perform adaptive post-filtering to enhance the quality of the speech.
static const int cng_adaptive_cb_lag[4]
uint8_t lsp_index[LSP_BANDS]
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
void ff_g723_1_inverse_quant(int16_t *cur_lsp, int16_t *prev_lsp, uint8_t *lsp_index, int bad_frame)
Perform inverse quantization of LSP frequencies.
enum AVSampleFormat sample_fmt
audio sample format
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static void generate_noise(G723_1_ChannelContext *p)
static const uint8_t bits2[81]
void av_memcpy_backptr(uint8_t *dst, int back, int cnt)
Overlapping memcpy() implementation.
bitstream reader API header.
void ff_g723_1_lsp_interpolate(int16_t *lpc, int16_t *cur_lsp, int16_t *prev_lsp)
Quantize LSP frequencies by interpolation and convert them to the corresponding LPC coefficients...
int pf_gain
formant postfilter gain scaling unit memory
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int ff_g723_1_normalize_bits(int num, int width)
Calculate the number of left-shifts required for normalizing the input.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void ff_g723_1_gen_dirac_train(int16_t *buf, int pitch_lag)
Generate a train of dirac functions with period as pitch lag.
const char * name
Name of the codec implementation.
static const int cng_bseg[3]
uint64_t channel_layout
Audio channel layout.
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)
Generate adaptive codebook excitation.
enum FrameType past_frame_type
void ff_acelp_weighted_vector_sum(int16_t *out, const int16_t *in_a, const int16_t *in_b, int16_t weight_coeff_a, int16_t weight_coeff_b, int16_t rounder, int shift, int length)
weighted sum of two vectors with rounding.
audio channel layout utility functions
AVCodec ff_g723_1_decoder
static double b0(void *priv, double x, double y)
int ff_g723_1_dot_product(const int16_t *a, const int16_t *b, int length)
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int index
postfilter backward/forward lag
static int autocorr_max(const int16_t *buf, int offset, int *ccr_max, int pitch_lag, int length, int dir)
Estimate maximum auto-correlation around pitch lag.
const int32_t ff_g723_1_combinatorial_table[PULSE_MAX][SUBFRAME_LEN/GRID_SIZE]
Used for the coding/decoding of the pulses positions for the MP-MLQ codebook.
static const int16_t pitch_contrib[340]
#define iir_filter(fir_coef, iir_coef, src, dest, width)
Perform IIR filtering.
int16_t opt_gain
optimal gain
static void comp_ppf_coeff(G723_1_ChannelContext *p, int offset, int pitch_lag, PPFParam *ppf, enum Rate cur_rate)
Calculate pitch postfilter parameters.
int ff_g723_1_scale_vector(int16_t *dst, const int16_t *vector, int length)
Scale vector contents based on the largest of their absolutes.
Libavcodec external API header.
static const int16_t dc_lsp[LPC_ORDER]
LSP DC component.
static const int cng_filt[4]
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static void gain_scale(G723_1_ChannelContext *p, int16_t *buf, int energy)
Adjust gain of postfiltered signal.
main external API structure.
static int sid_gain_to_lsp_index(int gain)
Silence Insertion Descriptor frame.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
G.723.1 types, functions and data tables.
int16_t fir_mem[LPC_ORDER]
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits1(GetBitContext *s)
Describe the class of an AVClass context structure.
int16_t sc_gain
scaling gain
#define AV_CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time...
G723_1_ChannelContext ch[2]
int16_t prev_lsp[LPC_ORDER]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int16_t synth_mem[LPC_ORDER]
common internal api header.
Pitch postfilter parameters.
static const int16_t ppf_gain_weight[2]
Postfilter gain weighting factors scaled by 2^15.
static int unpack_bitstream(G723_1_ChannelContext *p, const uint8_t *buf, int buf_size)
Unpack the frame into parameters.
enum FrameType cur_frame_type
int channels
number of audio channels
static int16_t square_root(unsigned val)
Bitexact implementation of sqrt(val/2).
static const AVOption options[]
static int comp_interp_index(G723_1_ChannelContext *p, int pitch_lag, int *exc_eng, int *scale)
Classify frames as voiced/unvoiced.
static av_cold int g723_1_decode_init(AVCodecContext *avctx)
static int cng_rand(int *state, int base)
int16_t sid_lsp[LPC_ORDER]
int16_t prev_excitation[PITCH_MAX]
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
uint8_t ** extended_data
pointers to the data planes/channels.
#define AV_CH_LAYOUT_MONO
static double val(void *priv, double ch)
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static int g723_1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
static const uint8_t bits1[81]
int ad_cb_lag
adaptive codebook lag