annotate acelp_pitch_delay.h @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 0885e7a93ed4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
1 /*
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
2 * gain code, gain pitch and pitch delay decoding
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
3 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
4 * Copyright (c) 2008 Vladimir Voroshilov
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
5 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
6 * This file is part of FFmpeg.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
7 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
12 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
16 * Lesser General Public License for more details.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
17 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
21 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
22
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7170
diff changeset
23 #ifndef AVCODEC_ACELP_PITCH_DELAY_H
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7170
diff changeset
24 #define AVCODEC_ACELP_PITCH_DELAY_H
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
25
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
26 #include <stdint.h>
8505
c8743c33eeef Remove duplicated dot product code. Use dsputil's
reynaldo
parents: 7760
diff changeset
27 #include "dsputil.h"
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
28
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
29 #define PITCH_DELAY_MIN 20
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
30 #define PITCH_DELAY_MAX 143
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
31
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
32 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
33 * \brief Decode pitch delay of the first subframe encoded by 8 bits with 1/3
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
34 * resolution.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
35 * \param ac_index adaptive codebook index (8 bits)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
36 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
37 * \return pitch delay in 1/3 units
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
38 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
39 * Pitch delay is coded:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
40 * with 1/3 resolution, 19 < pitch_delay < 85
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
41 * integers only, 85 <= pitch_delay <= 143
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
42 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
43 int ff_acelp_decode_8bit_to_1st_delay3(int ac_index);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
44
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
45 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
46 * \brief Decode pitch delay of the second subframe encoded by 5 or 6 bits
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
47 * with 1/3 precision.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
48 * \param ac_index adaptive codebook index (5 or 6 bits)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
49 * \param pitch_delay_min lower bound (integer) of pitch delay interval
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
50 * for second subframe
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
51 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
52 * \return pitch delay in 1/3 units
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
53 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
54 * Pitch delay is coded:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
55 * with 1/3 resolution, -6 < pitch_delay - int(prev_pitch_delay) < 5
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
56 *
12058
dc394a1cc943 Fix printing of '@' symbols in Doxygen comments; the correct syntax is '@@'.
diego
parents: 10532
diff changeset
57 * \remark The routine is used in G.729 @@8k, AMR @@10.2k, AMR @@7.95k,
dc394a1cc943 Fix printing of '@' symbols in Doxygen comments; the correct syntax is '@@'.
diego
parents: 10532
diff changeset
58 * AMR @@7.4k for the second subframe.
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
59 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
60 int ff_acelp_decode_5_6_bit_to_2nd_delay3(
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
61 int ac_index,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
62 int pitch_delay_min);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
63
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
64 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
65 * \brief Decode pitch delay with 1/3 precision.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
66 * \param ac_index adaptive codebook index (4 bits)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
67 * \param pitch_delay_min lower bound (integer) of pitch delay interval for
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
68 * second subframe
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
69 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
70 * \return pitch delay in 1/3 units
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
71 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
72 * Pitch delay is coded:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
73 * integers only, -6 < pitch_delay - int(prev_pitch_delay) <= -2
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
74 * with 1/3 resolution, -2 < pitch_delay - int(prev_pitch_delay) < 1
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
75 * integers only, 1 <= pitch_delay - int(prev_pitch_delay) < 5
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
76 *
12058
dc394a1cc943 Fix printing of '@' symbols in Doxygen comments; the correct syntax is '@@'.
diego
parents: 10532
diff changeset
77 * \remark The routine is used in G.729 @@6.4k, AMR @@6.7k, AMR @@5.9k,
dc394a1cc943 Fix printing of '@' symbols in Doxygen comments; the correct syntax is '@@'.
diego
parents: 10532
diff changeset
78 * AMR @@5.15k, AMR @@4.75k for the second subframe.
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
79 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
80 int ff_acelp_decode_4bit_to_2nd_delay3(
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
81 int ac_index,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
82 int pitch_delay_min);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
83
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
84 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
85 * \brief Decode pitch delay of the first subframe encoded by 9 bits
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
86 * with 1/6 precision.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
87 * \param ac_index adaptive codebook index (9 bits)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
88 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
89 * \return pitch delay in 1/6 units
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
90 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
91 * Pitch delay is coded:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
92 * with 1/6 resolution, 17 < pitch_delay < 95
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
93 * integers only, 95 <= pitch_delay <= 143
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
94 *
12059
8c396820d385 Fix two more instances of wrong @ usage in Doxygen comments.
diego
parents: 12058
diff changeset
95 * \remark The routine is used in AMR @@12.2k for the first and third subframes.
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
96 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
97 int ff_acelp_decode_9bit_to_1st_delay6(int ac_index);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
98
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
99 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
100 * \brief Decode pitch delay of the second subframe encoded by 6 bits
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
101 * with 1/6 precision.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
102 * \param ac_index adaptive codebook index (6 bits)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
103 * \param pitch_delay_min lower bound (integer) of pitch delay interval for
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
104 * second subframe
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
105 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
106 * \return pitch delay in 1/6 units
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
107 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
108 * Pitch delay is coded:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
109 * with 1/6 resolution, -6 < pitch_delay - int(prev_pitch_delay) < 5
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
110 *
12059
8c396820d385 Fix two more instances of wrong @ usage in Doxygen comments.
diego
parents: 12058
diff changeset
111 * \remark The routine is used in AMR @@12.2k for the second and fourth subframes.
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
112 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
113 int ff_acelp_decode_6bit_to_2nd_delay6(
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
114 int ac_index,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
115 int pitch_delay_min);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
116
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
117 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
118 * \brief Update past quantized energies
12181
0885e7a93ed4 Fix Doxygen @param command attribute syntax.
diego
parents: 12067
diff changeset
119 * \param[in,out] quant_energy past quantized energies (5.10)
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
120 * \param gain_corr_factor gain correction factor
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
121 * \param log2_ma_pred_order log2() of MA prediction order
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
122 * \param erasure frame erasure flag
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
123 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
124 * If frame erasure flag is not equal to zero, memory is updated with
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
125 * averaged energy, attenuated by 4dB:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
126 * max(avg(quant_energy[i])-4, -14), i=0,ma_pred_order
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
127 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
128 * In normal mode memory is updated with
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
129 * Er - Ep = 20 * log10(gain_corr_factor)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
130 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
131 * \remark The routine is used in G.729 and AMR (all modes).
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
132 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
133 void ff_acelp_update_past_gain(
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
134 int16_t* quant_energy,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
135 int gain_corr_factor,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
136 int log2_ma_pred_order,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
137 int erasure);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
138
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
139 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
140 * \brief Decode the adaptive codebook gain and add
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
141 * correction (4.1.5 and 3.9.1 of G.729).
8505
c8743c33eeef Remove duplicated dot product code. Use dsputil's
reynaldo
parents: 7760
diff changeset
142 * \param dsp initialized dsputil context
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
143 * \param gain_corr_factor gain correction factor (2.13)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
144 * \param fc_v fixed-codebook vector (2.13)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
145 * \param mr_energy mean innovation energy and fixed-point correction (7.13)
12181
0885e7a93ed4 Fix Doxygen @param command attribute syntax.
diego
parents: 12067
diff changeset
146 * \param[in,out] quant_energy past quantized energies (5.10)
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
147 * \param subframe_size length of subframe
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
148 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
149 * \return quantized fixed-codebook gain (14.1)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
150 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
151 * The routine implements equations 69, 66 and 71 of the G.729 specification (3.9.1)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
152 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
153 * Em - mean innovation energy (dB, constant, depends on decoding algorithm)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
154 * Ep - mean-removed predicted energy (dB)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
155 * Er - mean-removed innovation energy (dB)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
156 * Ei - mean energy of the fixed-codebook contribution (dB)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
157 * N - subframe_size
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
158 * M - MA (Moving Average) prediction order
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
159 * gc - fixed-codebook gain
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
160 * gc_p - predicted fixed-codebook gain
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
161 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
162 * Fixed codebook gain is computed using predicted gain gc_p and
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
163 * correction factor gain_corr_factor as shown below:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
164 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
165 * gc = gc_p * gain_corr_factor
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
166 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
167 * The predicted fixed codebook gain gc_p is found by predicting
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
168 * the energy of the fixed-codebook contribution from the energy
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
169 * of previous fixed-codebook contributions.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
170 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
171 * mean = 1/N * sum(i,0,N){ fc_v[i] * fc_v[i] }
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
172 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
173 * Ei = 10log(mean)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
174 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
175 * Er = 10log(1/N * gc^2 * mean) - Em = 20log(gc) + Ei - Em
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
176 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
177 * Replacing Er with Ep and gc with gc_p we will receive:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
178 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
179 * Ep = 10log(1/N * gc_p^2 * mean) - Em = 20log(gc_p) + Ei - Em
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
180 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
181 * and from above:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
182 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
183 * gc_p = 10^((Ep - Ei + Em) / 20)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
184 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
185 * Ep is predicted using past energies and prediction coefficients:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
186 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
187 * Ep = sum(i,0,M){ ma_prediction_coeff[i] * quant_energy[i] }
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
188 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
189 * gc_p in fixed-point arithmetic is calculated as following:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
190 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
191 * mean = 1/N * sum(i,0,N){ (fc_v[i] / 2^13) * (fc_v[i] / 2^13) } =
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
192 * = 1/N * sum(i,0,N) { fc_v[i] * fc_v[i] } / 2^26
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
193 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
194 * Ei = 10log(mean) = -10log(N) - 10log(2^26) +
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
195 * + 10log(sum(i,0,N) { fc_v[i] * fc_v[i] })
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
196 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
197 * Ep - Ei + Em = Ep + Em + 10log(N) + 10log(2^26) -
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
198 * - 10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) =
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
199 * = Ep + mr_energy - 10log(sum(i,0,N) { fc_v[i] * fc_v[i] })
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
200 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
201 * gc_p = 10 ^ ((Ep - Ei + Em) / 20) =
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
202 * = 2 ^ (3.3219 * (Ep - Ei + Em) / 20) = 2 ^ (0.166 * (Ep - Ei + Em))
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
203 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
204 * where
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
205 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
206 * mr_energy = Em + 10log(N) + 10log(2^26)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
207 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
208 * \remark The routine is used in G.729 and AMR (all modes).
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
209 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
210 int16_t ff_acelp_decode_gain_code(
8505
c8743c33eeef Remove duplicated dot product code. Use dsputil's
reynaldo
parents: 7760
diff changeset
211 DSPContext *dsp,
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
212 int gain_corr_factor,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
213 const int16_t* fc_v,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
214 int mr_energy,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
215 const int16_t* quant_energy,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
216 const int16_t* ma_prediction_coeff,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
217 int subframe_size,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
218 int max_pred_order);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
219
10483
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
220 /**
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
221 * Calculate fixed gain (part of section 6.1.3 of AMR spec)
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
222 *
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
223 * @param fixed_gain_factor gain correction factor
12067
9aaff29c1e78 Fix doxy of fixed_mean_energy parameter in ff_amr_set_fixed_gain().
diego
parents: 12060
diff changeset
224 * @param fixed_mean_energy mean decoded algebraic codebook vector energy
10483
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
225 * @param prediction_error vector of the quantified predictor errors of
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
226 * the four previous subframes. It is updated by this function.
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
227 * @param energy_mean desired mean innovation energy
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
228 * @param pred_table table of four moving average coefficients
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
229 */
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
230 float ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy,
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
231 float *prediction_error, float energy_mean,
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
232 const float *pred_table);
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
233
10532
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
234
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
235 /**
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
236 * Decode the adaptive codebook index to the integer and fractional parts
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
237 * of the pitch lag for one subframe at 1/3 fractional precision.
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
238 *
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
239 * The choice of pitch lag is described in 3GPP TS 26.090 section 5.6.1.
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
240 *
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
241 * @param lag_int integer part of pitch lag of the current subframe
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
242 * @param lag_frac fractional part of pitch lag of the current subframe
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
243 * @param pitch_index parsed adaptive codebook (pitch) index
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
244 * @param prev_lag_int integer part of pitch lag for the previous subframe
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
245 * @param subframe current subframe number
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
246 * @param third_as_first treat the third frame the same way as the first
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
247 */
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
248 void ff_decode_pitch_lag(int *lag_int, int *lag_frac, int pitch_index,
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
249 const int prev_lag_int, const int subframe,
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
250 int third_as_first, int resolution);
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
251
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7170
diff changeset
252 #endif /* AVCODEC_ACELP_PITCH_DELAY_H */