]> git.sesse.net Git - ffmpeg/blob - libavcodec/g729dec.c
Fix typo in vc1.c, make capitalization in warning/error messages more consistent.
[ffmpeg] / libavcodec / g729dec.c
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 "get_bits.h"
32
33 #include "g729.h"
34 #include "lsp.h"
35 #include "celp_math.h"
36 #include "acelp_filters.h"
37 #include "acelp_pitch_delay.h"
38 #include "acelp_vectors.h"
39 #include "g729data.h"
40
41 /**
42  * minimum quantized LSF value (3.2.4)
43  * 0.005 in Q13
44  */
45 #define LSFQ_MIN                   40
46
47 /**
48  * maximum quantized LSF value (3.2.4)
49  * 3.135 in Q13
50  */
51 #define LSFQ_MAX                   25681
52
53 /**
54  * minimum LSF distance (3.2.4)
55  * 0.0391 in Q13
56  */
57 #define LSFQ_DIFF_MIN              321
58
59 /**
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
74 typedef struct {
75     int sample_rate;
76     uint8_t packed_frame_size;  ///< input frame size(in bytes)
77     uint8_t unpacked_frame_size;///< output frame size (in bytes)
78     uint8_t fc_indexes_bits;    ///< size (in bits) of fixed-codebook index entry
79
80     /// mr_energy = mean_energy + 10 * log10(2^26  * subframe_size) in (7.13)
81     int mr_energy;
82 } G729FormatDescription;
83
84 /**
85  * \brief pseudo random number generator
86  */
87 static inline uint16_t g729_prng(uint16_t value)
88 {
89     return 31821 * value + 13849;
90 }
91
92 /**
93  * Get parity bit of bit 2..7
94  */
95 static inline int get_parity(uint8_t value)
96 {
97    return (0x6996966996696996ULL >> (value >> 2)) & 1;
98 }
99
100 static av_cold int decoder_init(AVCodecContext * avctx)
101 {
102     if (avctx->channels != 1) {
103         av_log(avctx, AV_LOG_ERROR, "Only mono sound is supported (requested channels: %d).\n", avctx->channels);
104         return AVERROR_NOFMT;
105     }
106
107     /* Both 8kbit/s and 6.4kbit/s modes uses two subframes per frame. */
108     avctx->frame_size = SUBFRAME_SIZE << 1;
109
110     return 0;
111 }
112
113         ff_acelp_weighted_vector_sum(fc + pitch_delay_int[i],
114                                      fc + pitch_delay_int[i],
115                                      fc, 1 << 14,
116                                      av_clip(ctx->gain_pitch, SHARP_MIN, SHARP_MAX),
117                                      0, 14,
118                                      SUBFRAME_SIZE - pitch_delay_int[i]);
119
120         if (ctx->frame_erasure) {
121             ctx->gain_pitch = (29491 * ctx->gain_pitch) >> 15; // 0.90 (0.15)
122             ctx->gain_code  = ( 2007 * ctx->gain_code ) >> 11; // 0.98 (0.11)
123
124             gain_corr_factor = 0;
125         } else {
126             ctx->gain_pitch  = cb_gain_1st_8k[parm->gc_1st_index[i]][0] +
127                                cb_gain_2nd_8k[parm->gc_2nd_index[i]][0];
128             gain_corr_factor = cb_gain_1st_8k[parm->gc_1st_index[i]][1] +
129                                cb_gain_2nd_8k[parm->gc_2nd_index[i]][1];
130
131         ff_acelp_weighted_vector_sum(ctx->exc + i * SUBFRAME_SIZE,
132                                      ctx->exc + i * SUBFRAME_SIZE, fc,
133                                      (!voicing && ctx->frame_erasure) ? 0 : ctx->gain_pitch,
134                                      ( voicing && ctx->frame_erasure) ? 0 : ctx->gain_code,
135                                      1 << 13, 14, SUBFRAME_SIZE);
136
137     if (buf_size < packed_frame_size) {
138         av_log(avctx, AV_LOG_ERROR, "Error processing packet: packet size too small\n");
139         return AVERROR(EIO);
140     }
141     if (*data_size < unpacked_frame_size) {
142         av_log(avctx, AV_LOG_ERROR, "Error processing packet: output buffer too small\n");
143         return AVERROR(EIO);
144     }
145
146 AVCodec g729_decoder =
147 {
148     "g729",
149     CODEC_TYPE_AUDIO,
150     CODEC_ID_G729,
151     sizeof(G729Context),
152     decoder_init,
153     NULL,
154     NULL,
155     decode_frame,
156     .long_name = NULL_IF_CONFIG_SMALL("G.729"),
157 };