Mercurial > libavcodec.hg
annotate g729dec.c @ 9379:d31c367da415 libavcodec
Make sure mpeg2 has its height rounded up to 32 as that is needed
for interlaced stuff.
This might have been exploitable when emu edge was not set though
note this bug has been introduced just a few days ago.
author | michael |
---|---|
date | Fri, 10 Apr 2009 00:09:07 +0000 |
parents | ecb1962c12f3 |
children | 0dce4fe6e6f3 |
rev | line source |
---|---|
7597 | 1 /* |
2 * G.729 decoder | |
3 * Copyright (c) 2008 Vladimir Voroshilov | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 #include <stdlib.h> | |
22 #include <inttypes.h> | |
23 #include <limits.h> | |
24 #include <stdio.h> | |
25 #include <string.h> | |
26 #include <math.h> | |
27 #include <assert.h> | |
28 | |
29 #include "avcodec.h" | |
30 #include "libavutil/avutil.h" | |
31 #include "bitstream.h" | |
32 | |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
33 #include "g729.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
34 #include "lsp.h" |
8048
ecb1962c12f3
Rename acelp_math.[ch] to celp_math.[ch] to prepare for QCELP decoder merge.
diego
parents:
7872
diff
changeset
|
35 #include "celp_math.h" |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
36 #include "acelp_filters.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
37 #include "acelp_pitch_delay.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
38 #include "acelp_vectors.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
39 #include "g729data.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
40 |
7597 | 41 /** |
7668
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
42 * minimum quantized LSF value (3.2.4) |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
43 * 0.005 in Q13 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
44 */ |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
45 #define LSFQ_MIN 40 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
46 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
47 /** |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
48 * maximum quantized LSF value (3.2.4) |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
49 * 3.135 in Q13 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
50 */ |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
51 #define LSFQ_MAX 25681 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
52 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
53 /** |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
54 * minimum LSF distance (3.2.4) |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
55 * 0.0391 in Q13 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
56 */ |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
57 #define LSFQ_DIFF_MIN 321 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
58 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
59 /** |
7693 | 60 * minimum gain pitch value (3.8, Equation 47) |
61 * 0.2 in (1.14) | |
62 */ | |
63 #define SHARP_MIN 3277 | |
64 | |
65 /** | |
66 * maximum gain pitch value (3.8, Equation 47) | |
67 * (EE) This does not comply with the specification. | |
68 * Specification says about 0.8, which should be | |
69 * 13107 in (1.14), but reference C code uses | |
70 * 13017 (equals to 0.7945) instead of it. | |
71 */ | |
72 #define SHARP_MAX 13017 | |
73 | |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
74 typedef struct |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
75 { |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
76 int sample_rate; |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
77 uint8_t packed_frame_size; ///< input frame size(in bytes) |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
78 uint8_t unpacked_frame_size;///< output frame size (in bytes) |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
79 uint8_t fc_indexes_bits; ///< size (in bits) of fixed-codebook index entry |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
80 |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
81 /// mr_energy = mean_energy + 10 * log10(2^26 * subframe_size) in (7.13) |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
82 int mr_energy; |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
83 } G729_format_description; |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
84 |
7693 | 85 /** |
7597 | 86 * \brief pseudo random number generator |
87 */ | |
88 static inline uint16_t g729_random(uint16_t value) | |
89 { | |
90 return 31821 * value + 13849; | |
91 } | |
92 | |
7773 | 93 /** |
94 * Get parity bit of bit 2..7 | |
95 */ | |
96 static inline int g729_get_parity(uint8_t value) | |
97 { | |
98 return (0x6996966996696996ULL >> (value >> 2)) & 1; | |
99 } | |
100 | |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
101 if(avctx->channels != 1) |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
102 { |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
103 av_log(avctx, AV_LOG_ERROR, "Only mono sound is supported (requested channels: %d).\n", avctx->channels); |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
104 return AVERROR_NOFMT; |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
105 } |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
106 |
7780
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
107 ff_acelp_weighted_vector_sum( |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
108 fc + pitch_delay_int[i], |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
109 fc + pitch_delay_int[i], |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
110 fc, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
111 1 << 14, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
112 av_clip(ctx->gain_pitch, SHARP_MIN, SHARP_MAX), |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
113 0, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
114 14, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
115 ctx->subframe_size - pitch_delay_int[i]); |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
116 |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
117 if(ctx->frame_erasure) |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
118 { |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
119 ctx->gain_pitch = (29491 * ctx->gain_pitch) >> 15; // 0.9 (0.15) |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
120 ctx->gain_code = (2007 * ctx->gain_code) >> 11; // 0.98 in (0.11) |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
121 |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
122 gain_corr_factor = 0; |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
123 } |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
124 else |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
125 { |
7780
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
126 ctx->gain_pitch = cb_gain_1st_8k[parm->gc_1st_index[i]][0] + |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
127 cb_gain_2nd_8k[parm->gc_2nd_index[i]][0]; |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
128 gain_corr_factor = cb_gain_1st_8k[parm->gc_1st_index[i]][1] + |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
129 cb_gain_2nd_8k[parm->gc_2nd_index[i]][1]; |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
130 |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
131 ff_acelp_weighted_vector_sum( |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
132 ctx->exc + i * ctx->subframe_size, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
133 ctx->exc + i * ctx->subframe_size, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
134 fc, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
135 (!voicing && ctx->frame_erasure) ? 0 : ctx->gain_pitch, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
136 ( voicing && ctx->frame_erasure) ? 0 : ctx->gain_code, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
137 1<<13, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
138 14, |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
139 ctx->subframe_size); |
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
140 |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
141 if (buf_size<packed_frame_size) |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
142 { |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
143 av_log(avctx, AV_LOG_ERROR, "Error processing packet: packet size too small\n"); |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
144 return AVERROR(EIO); |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
145 } |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
146 if (*data_size<unpacked_frame_size) |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
147 { |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
148 av_log(avctx, AV_LOG_ERROR, "Error processing packet: output buffer too small\n"); |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
149 return AVERROR(EIO); |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
150 } |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
151 |
7597 | 152 AVCodec g729_decoder = |
153 { | |
154 "g729", | |
155 CODEC_TYPE_AUDIO, | |
156 CODEC_ID_G729, | |
157 sizeof(G729_Context), | |
158 ff_g729_decoder_init, | |
159 NULL, | |
160 NULL, | |
161 ff_g729_decode_frame, | |
162 .long_name = NULL_IF_CONFIG_SMALL("G.729"), | |
163 }; |