]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blob - libavcodec/g729dec.c
frsh: Export information about the last RTP contract and VRES
[frescor/ffmpeg.git] / 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 {
76     int sample_rate;
77     uint8_t packed_frame_size;  ///< input frame size(in bytes)
78     uint8_t unpacked_frame_size;///< output frame size (in bytes)
79     uint8_t fc_indexes_bits;    ///< size (in bits) of fixed-codebook index entry
80
81     /// mr_energy = mean_energy + 10 * log10(2^26  * subframe_size) in (7.13)
82     int mr_energy;
83 } G729_format_description;
84
85 /**
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
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
101     if(avctx->channels != 1)
102     {
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         ff_acelp_weighted_vector_sum(
108                 fc + pitch_delay_int[i],
109                 fc + pitch_delay_int[i],
110                 fc,
111                 1 << 14,
112                 av_clip(ctx->gain_pitch, SHARP_MIN, SHARP_MAX),
113                 0,
114                 14,
115                 ctx->subframe_size - pitch_delay_int[i]);
116
117         if(ctx->frame_erasure)
118         {
119             ctx->gain_pitch = (29491 * ctx->gain_pitch) >> 15; // 0.9 (0.15)
120             ctx->gain_code  = (2007 * ctx->gain_code) >> 11;   // 0.98 in (0.11)
121
122             gain_corr_factor = 0;
123         }
124         else
125         {
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(
132                 ctx->exc + i * ctx->subframe_size,
133                 ctx->exc + i * ctx->subframe_size,
134                 fc,
135                 (!voicing && ctx->frame_erasure) ? 0 : ctx->gain_pitch,
136                 ( voicing && ctx->frame_erasure) ? 0 : ctx->gain_code,
137                 1<<13,
138                 14,
139                 ctx->subframe_size);
140
141     if (buf_size<packed_frame_size)
142     {
143         av_log(avctx, AV_LOG_ERROR, "Error processing packet: packet size too small\n");
144         return AVERROR(EIO);
145     }
146     if (*data_size<unpacked_frame_size)
147     {
148         av_log(avctx, AV_LOG_ERROR, "Error processing packet: output buffer too small\n");
149         return AVERROR(EIO);
150     }
151
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 };