Mercurial > libavcodec.hg
annotate g729dec.c @ 9830:bd0879f752e6 libavcodec
Express the H.264 parser dependency on the golomb code in configure instead of
in the Makefile as it is done for all other parts that depend on golomb.
author | diego |
---|---|
date | Tue, 09 Jun 2009 20:29:52 +0000 |
parents | 7679262f1459 |
children | af3cc583501e |
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" | |
9428 | 31 #include "get_bits.h" |
7597 | 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 | |
9824 | 74 typedef struct { |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
75 int sample_rate; |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
76 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
|
77 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
|
78 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
|
79 |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
80 /// 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
|
81 int mr_energy; |
9823 | 82 } G729FormatDescription; |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
83 |
7693 | 84 /** |
7597 | 85 * \brief pseudo random number generator |
86 */ | |
9820
b72fbafc9408
Internal routine should not use name of standard function.
voroshil
parents:
9819
diff
changeset
|
87 static inline uint16_t g729_prng(uint16_t value) |
7597 | 88 { |
89 return 31821 * value + 13849; | |
90 } | |
91 | |
7773 | 92 /** |
93 * Get parity bit of bit 2..7 | |
94 */ | |
9819
fbc565735c4d
Remove ff_g729_ and g729_ prefixes from static routines.
voroshil
parents:
9428
diff
changeset
|
95 static inline int get_parity(uint8_t value) |
7773 | 96 { |
97 return (0x6996966996696996ULL >> (value >> 2)) & 1; | |
98 } | |
99 | |
9824 | 100 if (avctx->channels != 1) { |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
101 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
|
102 return AVERROR_NOFMT; |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
103 } |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
104 |
9824 | 105 ff_acelp_weighted_vector_sum(fc + pitch_delay_int[i], |
106 fc + pitch_delay_int[i], | |
107 fc, 1 << 14, | |
108 av_clip(ctx->gain_pitch, SHARP_MIN, SHARP_MAX), | |
109 0, 14, | |
110 ctx->subframe_size - pitch_delay_int[i]); | |
7780
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
111 |
9824 | 112 if (ctx->frame_erasure) { |
113 ctx->gain_pitch = (29491 * ctx->gain_pitch) >> 15; // 0.90 (0.15) | |
114 ctx->gain_code = ( 2007 * ctx->gain_code ) >> 11; // 0.98 (0.11) | |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
115 |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
116 gain_corr_factor = 0; |
9824 | 117 } else { |
7780
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
118 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
|
119 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
|
120 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
|
121 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
|
122 |
9824 | 123 ff_acelp_weighted_vector_sum(ctx->exc + i * ctx->subframe_size, |
124 ctx->exc + i * ctx->subframe_size, fc, | |
125 (!voicing && ctx->frame_erasure) ? 0 : ctx->gain_pitch, | |
126 ( voicing && ctx->frame_erasure) ? 0 : ctx->gain_code, | |
127 1<<13, 14, ctx->subframe_size); | |
7780
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
128 |
9824 | 129 if (buf_size < packed_frame_size) { |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
130 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
|
131 return AVERROR(EIO); |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
132 } |
9824 | 133 if (*data_size < unpacked_frame_size) { |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
134 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
|
135 return AVERROR(EIO); |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
136 } |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
137 |
7597 | 138 AVCodec g729_decoder = |
139 { | |
140 "g729", | |
141 CODEC_TYPE_AUDIO, | |
142 CODEC_ID_G729, | |
9823 | 143 sizeof(G729Context), |
9819
fbc565735c4d
Remove ff_g729_ and g729_ prefixes from static routines.
voroshil
parents:
9428
diff
changeset
|
144 decoder_init, |
7597 | 145 NULL, |
146 NULL, | |
9819
fbc565735c4d
Remove ff_g729_ and g729_ prefixes from static routines.
voroshil
parents:
9428
diff
changeset
|
147 decode_frame, |
7597 | 148 .long_name = NULL_IF_CONFIG_SMALL("G.729"), |
149 }; |