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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7597
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
1 /*
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
2 * G.729 decoder
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
3 * Copyright (c) 2008 Vladimir Voroshilov
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
4 *
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
5 * This file is part of FFmpeg.
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
6 *
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
11 *
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
15 * Lesser General Public License for more details.
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
16 *
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
20 */
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
21 #include <stdlib.h>
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
22 #include <inttypes.h>
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
23 #include <limits.h>
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
24 #include <stdio.h>
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
25 #include <string.h>
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
26 #include <math.h>
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
27 #include <assert.h>
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
28
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
29 #include "avcodec.h"
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
30 #include "libavutil/avutil.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 8048
diff changeset
31 #include "get_bits.h"
7597
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
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
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
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
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
60 * minimum gain pitch value (3.8, Equation 47)
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
61 * 0.2 in (1.14)
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
62 */
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
63 #define SHARP_MIN 3277
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
64
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
65 /**
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
66 * maximum gain pitch value (3.8, Equation 47)
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
67 * (EE) This does not comply with the specification.
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
68 * Specification says about 0.8, which should be
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
69 * 13107 in (1.14), but reference C code uses
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
70 * 13017 (equals to 0.7945) instead of it.
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
71 */
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
72 #define SHARP_MAX 13017
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
73
9824
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
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
4a5f2453973d Convert structure names to FFmpeg style
voroshil
parents: 9820
diff changeset
82 } G729FormatDescription;
7872
18d5d203ba0c Another set of approved changes for G.729: includes, formats structure,
voroshil
parents: 7802
diff changeset
83
7693
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
84 /**
7597
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
85 * \brief pseudo random number generator
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
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
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
88 {
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
89 return 31821 * value + 13849;
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
90 }
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
91
7773
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
92 /**
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
93 * Get parity bit of bit 2..7
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
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
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
96 {
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
97 return (0x6996966996696996ULL >> (value >> 2)) & 1;
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
98 }
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
99
9824
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
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
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
105 ff_acelp_weighted_vector_sum(fc + pitch_delay_int[i],
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
106 fc + pitch_delay_int[i],
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
107 fc, 1 << 14,
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
108 av_clip(ctx->gain_pitch, SHARP_MIN, SHARP_MAX),
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
109 0, 14,
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
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
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
112 if (ctx->frame_erasure) {
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
113 ctx->gain_pitch = (29491 * ctx->gain_pitch) >> 15; // 0.90 (0.15)
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
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
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
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
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
123 ff_acelp_weighted_vector_sum(ctx->exc + i * ctx->subframe_size,
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
124 ctx->exc + i * ctx->subframe_size, fc,
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
125 (!voicing && ctx->frame_erasure) ? 0 : ctx->gain_pitch,
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
126 ( voicing && ctx->frame_erasure) ? 0 : ctx->gain_code,
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
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
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
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
7679262f1459 K&R formatting of already submitted G.729 code
voroshil
parents: 9823
diff changeset
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
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
138 AVCodec g729_decoder =
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
139 {
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
140 "g729",
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
141 CODEC_TYPE_AUDIO,
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
142 CODEC_ID_G729,
9823
4a5f2453973d Convert structure names to FFmpeg style
voroshil
parents: 9820
diff changeset
143 sizeof(G729Context),
9819
fbc565735c4d Remove ff_g729_ and g729_ prefixes from static routines.
voroshil
parents: 9428
diff changeset
144 decoder_init,
7597
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
145 NULL,
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
146 NULL,
9819
fbc565735c4d Remove ff_g729_ and g729_ prefixes from static routines.
voroshil
parents: 9428
diff changeset
147 decode_frame,
7597
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
148 .long_name = NULL_IF_CONFIG_SMALL("G.729"),
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
149 };