annotate acelp_pitch_delay.h @ 11034:fd5921186064 libavcodec

Make the fast loop filter path work with unavailable left MBs. This prevents the issue with having to switch between slow and fast code paths in each row. 0.5% faster loopfilter for cathedral
author michael
date Thu, 28 Jan 2010 02:15:25 +0000
parents ca88470521db
children dc394a1cc943
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 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
57 * \remark The routine is used in G.729 @8k, AMR @10.2k, AMR @7.95k,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
58 * AMR @7.4k for the second subframe.
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 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
77 * \remark The routine is used in G.729 @6.4k, AMR @6.7k, AMR @5.9k,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
78 * AMR @5.15k, AMR @4.75k for the second subframe.
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 * \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
89 * second subframe
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 * \return pitch delay in 1/6 units
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
92 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
93 * Pitch delay is coded:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
94 * 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
95 * integers only, 95 <= pitch_delay <= 143
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 * \remark The routine is used in AMR @12.2k for the first and third subframes.
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 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
100
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
101 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
102 * \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
103 * with 1/6 precision.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
104 * \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
105 * \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
106 * second subframe
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 * \return pitch delay in 1/6 units
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
109 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
110 * Pitch delay is coded:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
111 * 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
112 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
113 * \remark The routine is used in AMR @12.2k for the second and fourth subframes.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
114 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
115 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
116 int ac_index,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
117 int pitch_delay_min);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
118
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
119 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
120 * \brief Update past quantized energies
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
121 * \param quant_energy [in/out] past quantized energies (5.10)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
122 * \param gain_corr_factor gain correction factor
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
123 * \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
124 * \param erasure frame erasure flag
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
125 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
126 * 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
127 * averaged energy, attenuated by 4dB:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
128 * 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
129 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
130 * In normal mode memory is updated with
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
131 * Er - Ep = 20 * log10(gain_corr_factor)
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 * \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
134 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
135 void ff_acelp_update_past_gain(
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
136 int16_t* quant_energy,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
137 int gain_corr_factor,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
138 int log2_ma_pred_order,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
139 int erasure);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
140
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
141 /**
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
142 * \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
143 * 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
144 * \param dsp initialized dsputil context
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
145 * \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
146 * \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
147 * \param mr_energy mean innovation energy and fixed-point correction (7.13)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
148 * \param quant_energy [in/out] past quantized energies (5.10)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
149 * \param subframe_size length of subframe
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
150 * \param ma_pred_order MA prediction order
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
151 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
152 * \return quantized fixed-codebook gain (14.1)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
153 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
154 * 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
155 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
156 * 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
157 * Ep - mean-removed predicted energy (dB)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
158 * Er - mean-removed innovation energy (dB)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
159 * 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
160 * N - subframe_size
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
161 * M - MA (Moving Average) prediction order
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
162 * gc - fixed-codebook gain
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
163 * gc_p - predicted fixed-codebook gain
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 * 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
166 * 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
167 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
168 * gc = gc_p * gain_corr_factor
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
169 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
170 * 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
171 * 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
172 * of previous fixed-codebook contributions.
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
173 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
174 * 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
175 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
176 * Ei = 10log(mean)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
177 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
178 * 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
179 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
180 * 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
181 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
182 * 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
183 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
184 * and from above:
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
185 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
186 * gc_p = 10^((Ep - Ei + Em) / 20)
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
187 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
188 * 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
189 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
190 * 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
191 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
192 * 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
193 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
194 * 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
195 * = 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
196 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
197 * 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
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 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
200 * 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
201 * - 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
202 * = 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
203 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
204 * gc_p = 10 ^ ((Ep - Ei + Em) / 20) =
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
205 * = 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
206 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
207 * where
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
208 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
209 * 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
210 *
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
211 * \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
212 */
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
213 int16_t ff_acelp_decode_gain_code(
8505
c8743c33eeef Remove duplicated dot product code. Use dsputil's
reynaldo
parents: 7760
diff changeset
214 DSPContext *dsp,
7170
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
215 int gain_corr_factor,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
216 const int16_t* fc_v,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
217 int mr_energy,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
218 const int16_t* quant_energy,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
219 const int16_t* ma_prediction_coeff,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
220 int subframe_size,
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
221 int max_pred_order);
04da42c2b7b4 gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff changeset
222
10483
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
223 /**
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
224 * 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
225 *
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
226 * @param fixed_gain_factor gain correction factor
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
227 * @param fixed_energy decoded algebraic codebook vector energy
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
228 * @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
229 * 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
230 * @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
231 * @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
232 */
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
233 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
234 float *prediction_error, float energy_mean,
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
235 const float *pred_table);
afad312b9989 Implement AMR gain function that is used by both AMR and SIPR.
vitor
parents: 8505
diff changeset
236
10532
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
237
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 * 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
240 * 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
241 *
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
242 * 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
243 *
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
244 * @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
245 * @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
246 * @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
247 * @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
248 * @param subframe current subframe number
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
249 * @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
250 */
ca88470521db Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
vitor
parents: 10483
diff changeset
251 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
252 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
253 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
254
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7170
diff changeset
255 #endif /* AVCODEC_ACELP_PITCH_DELAY_H */