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
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"
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
31 #include "bitstream.h"
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
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
dc309e45a671 Another set of definitions for G.729
voroshil
parents: 7668
diff changeset
85 /**
7597
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
86 * \brief pseudo random number generator
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
87 */
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
88 static inline uint16_t g729_random(uint16_t value)
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
89 {
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
90 return 31821 * value + 13849;
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
91 }
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
92
7773
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
93 /**
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
94 * Get parity bit of bit 2..7
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
95 */
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
96 static inline int g729_get_parity(uint8_t value)
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
97 {
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
98 return (0x6996966996696996ULL >> (value >> 2)) & 1;
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
99 }
272a13ae94c0 Parity bit calculation routine for G.729
voroshil
parents: 7693
diff changeset
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
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
152 AVCodec g729_decoder =
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
153 {
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
154 "g729",
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
155 CODEC_TYPE_AUDIO,
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
156 CODEC_ID_G729,
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
157 sizeof(G729_Context),
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
158 ff_g729_decoder_init,
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
159 NULL,
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
160 NULL,
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
161 ff_g729_decode_frame,
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
162 .long_name = NULL_IF_CONFIG_SMALL("G.729"),
7060f0338be3 G.729 decoder main code
voroshil
parents:
diff changeset
163 };