Mercurial > libavcodec.hg
annotate libamr.c @ 5775:38f220befc32 libavcodec
Replace "signed short" typecast with "int16_t" as suggested by
Mans Rullgard. Value at the right side is 16 bit length signed.
We can not know for sure that short is in fact 16 bits, even if
this virtually always is the case.
author | voroshil |
---|---|
date | Thu, 04 Oct 2007 15:13:42 +0000 |
parents | c3f2379b80db |
children | 0281d8efb050 |
rev | line source |
---|---|
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
1 /* |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
2 * AMR Audio decoder stub |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
3 * Copyright (c) 2003 the ffmpeg project |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3463
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3463
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3463
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3463
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3463
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
16 * |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3463
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
20 */ |
2967 | 21 |
4575 | 22 /** @file |
23 * Adaptive Multi-Rate (AMR) Audio decoder stub. | |
24 * | |
25 * This code implements both an AMR-NarrowBand (AMR-NB) and an AMR-WideBand | |
26 * (AMR-WB) audio encoder/decoder through external reference code from | |
27 * http://www.3gpp.org/. The license of the code from 3gpp is unclear so you | |
28 * have to download the code separately. Two versions exists: One fixed-point | |
4857 | 29 * and one floating-point. For some reason the float encoder is significantly |
30 * faster at least on a P4 1.5GHz (0.9s instead of 9.9s on a 30s audio clip | |
31 * at MR102). Both float and fixed point are supported for AMR-NB, but only | |
32 * float for AMR-WB. | |
4575 | 33 * |
34 * \section AMR-NB | |
35 * | |
36 * \subsection Float | |
37 * The float version (default) can be downloaded from: | |
4746
4aedb3b6fa4e
Update specification and reference implementation links.
diego
parents:
4744
diff
changeset
|
38 * http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-610.zip |
4575 | 39 * |
40 * \subsection Fixed-point | |
41 * The fixed-point (TS26.073) can be downloaded from: | |
4842
c3b0eb402862
Update download URL with a link to a working version.
diego
parents:
4793
diff
changeset
|
42 * http://www.3gpp.org/ftp/Specs/archive/26_series/26.073/26073-600.zip |
4575 | 43 * |
44 * \subsection Specification | |
45 * The specification for AMR-NB can be found in TS 26.071 | |
46 * (http://www.3gpp.org/ftp/Specs/html-info/26071.htm) and some other | |
47 * info at http://www.3gpp.org/ftp/Specs/html-info/26-series.htm. | |
48 * | |
49 * \section AMR-WB | |
4858
3e38885a28bc
Remove the build instructions from the doxygen comments, they are duplicated
diego
parents:
4857
diff
changeset
|
50 * |
4575 | 51 * \subsection Float |
52 * The reference code can be downloaded from: | |
4746
4aedb3b6fa4e
Update specification and reference implementation links.
diego
parents:
4744
diff
changeset
|
53 * http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-600.zip |
4575 | 54 * |
55 * \subsection Fixed-point | |
56 * If someone wants to use the fixed point version it can be downloaded from: | |
57 * http://www.3gpp.org/ftp/Specs/archive/26_series/26.173/26173-571.zip. | |
58 * | |
59 * \subsection Specification | |
4746
4aedb3b6fa4e
Update specification and reference implementation links.
diego
parents:
4744
diff
changeset
|
60 * The specification for AMR-WB can be found in TS 26.171 |
4aedb3b6fa4e
Update specification and reference implementation links.
diego
parents:
4744
diff
changeset
|
61 * (http://www.3gpp.org/ftp/Specs/html-info/26171.htm) and some other |
4aedb3b6fa4e
Update specification and reference implementation links.
diego
parents:
4744
diff
changeset
|
62 * info at http://www.3gpp.org/ftp/Specs/html-info/26-series.htm. |
4575 | 63 * |
1297 | 64 */ |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
65 |
1297 | 66 #include "avcodec.h" |
67 | |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
68 #ifdef CONFIG_LIBAMR_NB_FIXED |
1297 | 69 |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
70 #define MMS_IO |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
71 |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
72 #include "amr/sp_dec.h" |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
73 #include "amr/d_homing.h" |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
74 #include "amr/typedef.h" |
1297 | 75 #include "amr/sp_enc.h" |
76 #include "amr/sid_sync.h" | |
77 #include "amr/e_homing.h" | |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
78 |
1297 | 79 #else |
4843
0e11f292482f
Replace hackish support for amr-nb and amr-wb. Instead of including the source
diego
parents:
4842
diff
changeset
|
80 #include <amrnb/interf_dec.h> |
0e11f292482f
Replace hackish support for amr-nb and amr-wb. Instead of including the source
diego
parents:
4842
diff
changeset
|
81 #include <amrnb/interf_enc.h> |
1297 | 82 #endif |
83 | |
4793
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
84 static const char *nb_bitrate_unsupported = |
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
85 "bitrate not supported: use one of 4.75k, 5.15k, 5.9k, 6.7k, 7.4k, 7.95k, 10.2k or 12.2k\n"; |
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
86 static const char *wb_bitrate_unsupported = |
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
87 "bitrate not supported: use one of 6.6k, 8.85k, 12.65k, 14.25k, 15.85k, 18.25k, 19.85k, 23.05k, or 23.85k\n"; |
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
88 |
1297 | 89 /* Common code for fixed and float version*/ |
90 typedef struct AMR_bitrates | |
91 { | |
4744 | 92 int rate; |
1297 | 93 enum Mode mode; |
94 } AMR_bitrates; | |
95 | |
4744 | 96 /* Match desired bitrate */ |
97 static int getBitrateMode(int bitrate) | |
1297 | 98 { |
4744 | 99 /* make the correspondance between bitrate and mode */ |
100 AMR_bitrates rates[]={ {4750,MR475}, | |
101 {5150,MR515}, | |
102 {5900,MR59}, | |
103 {6700,MR67}, | |
104 {7400,MR74}, | |
105 {7950,MR795}, | |
106 {10200,MR102}, | |
107 {12200,MR122}, | |
1297 | 108 }; |
109 int i; | |
4633 | 110 |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
111 for(i=0;i<8;i++) |
1297 | 112 { |
4744 | 113 if(rates[i].rate==bitrate) |
1297 | 114 { |
115 return(rates[i].mode); | |
116 } | |
117 } | |
4744 | 118 /* no bitrate matching, return an error */ |
119 return -1; | |
1297 | 120 } |
121 | |
4094 | 122 static void amr_decode_fix_avctx(AVCodecContext * avctx) |
123 { | |
124 const int is_amr_wb = 1 + (avctx->codec_id == CODEC_ID_AMR_WB); | |
125 | |
126 if(avctx->sample_rate == 0) | |
127 { | |
128 avctx->sample_rate = 8000 * is_amr_wb; | |
129 } | |
130 | |
131 if(avctx->channels == 0) | |
132 { | |
133 avctx->channels = 1; | |
134 } | |
135 | |
136 avctx->frame_size = 160 * is_amr_wb; | |
137 } | |
138 | |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
139 #ifdef CONFIG_LIBAMR_NB_FIXED |
1297 | 140 /* fixed point version*/ |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
141 /* frame size in serial bitstream file (frame type + serial stream + flags) */ |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
142 #define SERIAL_FRAMESIZE (1+MAX_SERIAL_SIZE+5) |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
143 |
1297 | 144 typedef struct AMRContext { |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
145 int frameCount; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
146 Speech_Decode_FrameState *speech_decoder_state; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
147 enum RXFrameType rx_type; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
148 enum Mode mode; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
149 Word16 reset_flag; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
150 Word16 reset_flag_old; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
151 |
4744 | 152 int enc_bitrate; |
1297 | 153 Speech_Encode_FrameState *enstate; |
154 sid_syncState *sidstate; | |
155 enum TXFrameType tx_frametype; | |
156 } AMRContext; | |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
157 |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
158 static int amr_nb_decode_init(AVCodecContext * avctx) |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
159 { |
1297 | 160 AMRContext *s = avctx->priv_data; |
4633 | 161 |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
162 s->frameCount=0; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
163 s->speech_decoder_state=NULL; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
164 s->rx_type = (enum RXFrameType)0; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
165 s->mode= (enum Mode)0; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
166 s->reset_flag=0; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
167 s->reset_flag_old=1; |
2967 | 168 |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
169 if(Speech_Decode_Frame_init(&s->speech_decoder_state, "Decoder")) |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
170 { |
1825 | 171 av_log(avctx, AV_LOG_ERROR, "Speech_Decode_Frame_init error\n"); |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
172 return -1; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
173 } |
4094 | 174 |
175 amr_decode_fix_avctx(avctx); | |
176 | |
177 if(avctx->channels > 1) | |
178 { | |
179 av_log(avctx, AV_LOG_ERROR, "amr_nb: multichannel decoding not supported\n"); | |
180 return -1; | |
181 } | |
182 | |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
183 return 0; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
184 } |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
185 |
1297 | 186 static int amr_nb_encode_init(AVCodecContext * avctx) |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
187 { |
1297 | 188 AMRContext *s = avctx->priv_data; |
4633 | 189 |
1297 | 190 s->frameCount=0; |
191 s->speech_decoder_state=NULL; | |
192 s->rx_type = (enum RXFrameType)0; | |
193 s->mode= (enum Mode)0; | |
194 s->reset_flag=0; | |
195 s->reset_flag_old=1; | |
2967 | 196 |
1297 | 197 if(avctx->sample_rate!=8000) |
198 { | |
4309
1f95aa362562
always print message when error, AV_LOG_DEBUG -> AV_LOG_ERROR
bcoudurier
parents:
4221
diff
changeset
|
199 av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n"); |
1297 | 200 return -1; |
201 } | |
202 | |
203 if(avctx->channels!=1) | |
204 { | |
4309
1f95aa362562
always print message when error, AV_LOG_DEBUG -> AV_LOG_ERROR
bcoudurier
parents:
4221
diff
changeset
|
205 av_log(avctx, AV_LOG_ERROR, "Only mono supported\n"); |
1297 | 206 return -1; |
207 } | |
208 | |
209 avctx->frame_size=160; | |
210 avctx->coded_frame= avcodec_alloc_frame(); | |
211 | |
212 if(Speech_Encode_Frame_init(&s->enstate, 0, "encoder") || sid_sync_init (&s->sidstate)) | |
213 { | |
4309
1f95aa362562
always print message when error, AV_LOG_DEBUG -> AV_LOG_ERROR
bcoudurier
parents:
4221
diff
changeset
|
214 av_log(avctx, AV_LOG_ERROR, "Speech_Encode_Frame_init error\n"); |
1297 | 215 return -1; |
216 } | |
217 | |
4744 | 218 if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0) |
219 { | |
4793
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
220 av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported); |
4744 | 221 return -1; |
222 } | |
1297 | 223 |
224 return 0; | |
225 } | |
226 | |
227 static int amr_nb_encode_close(AVCodecContext * avctx) | |
228 { | |
229 AMRContext *s = avctx->priv_data; | |
4633 | 230 |
1297 | 231 Speech_Encode_Frame_exit(&s->enstate); |
232 sid_sync_exit (&s->sidstate); | |
233 av_freep(&avctx->coded_frame); | |
234 return 0; | |
235 } | |
236 | |
237 static int amr_nb_decode_close(AVCodecContext * avctx) | |
238 { | |
239 AMRContext *s = avctx->priv_data; | |
4633 | 240 |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
241 Speech_Decode_Frame_exit(&s->speech_decoder_state); |
1297 | 242 return 0; |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
243 } |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
244 |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
245 static int amr_nb_decode_frame(AVCodecContext * avctx, |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
246 void *data, int *data_size, |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
247 uint8_t * buf, int buf_size) |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
248 { |
1297 | 249 AMRContext *s = avctx->priv_data; |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
250 uint8_t*amrData=buf; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
251 int offset=0; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
252 UWord8 toc, q, ft; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
253 Word16 serial[SERIAL_FRAMESIZE]; /* coded bits */ |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
254 Word16 *synth; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
255 UWord8 *packed_bits; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
256 static Word16 packed_size[16] = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0}; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
257 int i; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
258 |
1297 | 259 //printf("amr_decode_frame data_size=%i buf=0x%X buf_size=%d frameCount=%d!!\n",*data_size,buf,buf_size,s->frameCount); |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
260 |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
261 synth=data; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
262 |
4781 | 263 toc=amrData[offset]; |
264 /* read rest of the frame based on ToC byte */ | |
265 q = (toc >> 2) & 0x01; | |
266 ft = (toc >> 3) & 0x0F; | |
267 | |
268 //printf("offset=%d, packet_size=%d amrData= 0x%X %X %X %X\n",offset,packed_size[ft],amrData[offset],amrData[offset+1],amrData[offset+2],amrData[offset+3]); | |
269 | |
270 offset++; | |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
271 |
4781 | 272 packed_bits=amrData+offset; |
1297 | 273 |
4781 | 274 offset+=packed_size[ft]; |
1297 | 275 |
4781 | 276 //Unsort and unpack bits |
277 s->rx_type = UnpackBits(q, ft, packed_bits, &s->mode, &serial[1]); | |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
278 |
4781 | 279 //We have a new frame |
280 s->frameCount++; | |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
281 |
4781 | 282 if (s->rx_type == RX_NO_DATA) |
283 { | |
284 s->mode = s->speech_decoder_state->prev_mode; | |
285 } | |
286 else { | |
287 s->speech_decoder_state->prev_mode = s->mode; | |
288 } | |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
289 |
4781 | 290 /* if homed: check if this frame is another homing frame */ |
291 if (s->reset_flag_old == 1) | |
292 { | |
293 /* only check until end of first subframe */ | |
294 s->reset_flag = decoder_homing_frame_test_first(&serial[1], s->mode); | |
295 } | |
296 /* produce encoder homing frame if homed & input=decoder homing frame */ | |
297 if ((s->reset_flag != 0) && (s->reset_flag_old != 0)) | |
298 { | |
299 for (i = 0; i < L_FRAME; i++) | |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
300 { |
4781 | 301 synth[i] = EHF_MASK; |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
302 } |
4781 | 303 } |
304 else | |
305 { | |
306 /* decode frame */ | |
307 Speech_Decode_Frame(s->speech_decoder_state, s->mode, &serial[1], s->rx_type, synth); | |
308 } | |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
309 |
4781 | 310 //Each AMR-frame results in 160 16-bit samples |
4789
bf62c8a0d2fb
Return correct decoded size, decoder is called with only one frame at a time.
diego
parents:
4781
diff
changeset
|
311 *data_size=160*2; |
2967 | 312 |
4781 | 313 /* if not homed: check whether current frame is a homing frame */ |
314 if (s->reset_flag_old == 0) | |
315 { | |
316 /* check whole frame */ | |
317 s->reset_flag = decoder_homing_frame_test(&serial[1], s->mode); | |
318 } | |
319 /* reset decoder if current frame is a homing frame */ | |
320 if (s->reset_flag != 0) | |
321 { | |
322 Speech_Decode_Frame_reset(s->speech_decoder_state); | |
323 } | |
324 s->reset_flag_old = s->reset_flag; | |
2967 | 325 |
1297 | 326 return offset; |
327 } | |
328 | |
329 | |
330 static int amr_nb_encode_frame(AVCodecContext *avctx, | |
2979 | 331 unsigned char *frame/*out*/, int buf_size, void *data/*in*/) |
1297 | 332 { |
333 short serial_data[250] = {0}; | |
334 AMRContext *s = avctx->priv_data; | |
335 int written; | |
2967 | 336 |
1297 | 337 s->reset_flag = encoder_homing_frame_test(data); |
2967 | 338 |
339 Speech_Encode_Frame(s->enstate, s->enc_bitrate, data, &serial_data[1], &s->mode); | |
340 | |
1297 | 341 /* add frame type and mode */ |
342 sid_sync (s->sidstate, s->mode, &s->tx_frametype); | |
2967 | 343 |
1297 | 344 written = PackBits(s->mode, s->enc_bitrate, s->tx_frametype, &serial_data[1], frame); |
2967 | 345 |
1297 | 346 if (s->reset_flag != 0) |
347 { | |
348 Speech_Encode_Frame_reset(s->enstate); | |
349 sid_sync_reset(s->sidstate); | |
350 } | |
351 return written; | |
352 } | |
353 | |
354 | |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
355 #elif defined(CONFIG_LIBAMR_NB) /* Float point version*/ |
1297 | 356 |
357 typedef struct AMRContext { | |
358 int frameCount; | |
359 void * decState; | |
360 int *enstate; | |
4744 | 361 int enc_bitrate; |
1297 | 362 } AMRContext; |
363 | |
364 static int amr_nb_decode_init(AVCodecContext * avctx) | |
365 { | |
366 AMRContext *s = avctx->priv_data; | |
4633 | 367 |
1297 | 368 s->frameCount=0; |
369 s->decState=Decoder_Interface_init(); | |
370 if(!s->decState) | |
371 { | |
1825 | 372 av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\r\n"); |
1297 | 373 return -1; |
374 } | |
4094 | 375 |
376 amr_decode_fix_avctx(avctx); | |
377 | |
378 if(avctx->channels > 1) | |
379 { | |
380 av_log(avctx, AV_LOG_ERROR, "amr_nb: multichannel decoding not supported\n"); | |
381 return -1; | |
382 } | |
383 | |
1297 | 384 return 0; |
385 } | |
386 | |
387 static int amr_nb_encode_init(AVCodecContext * avctx) | |
388 { | |
389 AMRContext *s = avctx->priv_data; | |
4633 | 390 |
1297 | 391 s->frameCount=0; |
2967 | 392 |
1297 | 393 if(avctx->sample_rate!=8000) |
394 { | |
4309
1f95aa362562
always print message when error, AV_LOG_DEBUG -> AV_LOG_ERROR
bcoudurier
parents:
4221
diff
changeset
|
395 av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n"); |
1297 | 396 return -1; |
397 } | |
398 | |
399 if(avctx->channels!=1) | |
400 { | |
4309
1f95aa362562
always print message when error, AV_LOG_DEBUG -> AV_LOG_ERROR
bcoudurier
parents:
4221
diff
changeset
|
401 av_log(avctx, AV_LOG_ERROR, "Only mono supported\n"); |
1297 | 402 return -1; |
403 } | |
404 | |
405 avctx->frame_size=160; | |
406 avctx->coded_frame= avcodec_alloc_frame(); | |
407 | |
408 s->enstate=Encoder_Interface_init(0); | |
409 if(!s->enstate) | |
410 { | |
4309
1f95aa362562
always print message when error, AV_LOG_DEBUG -> AV_LOG_ERROR
bcoudurier
parents:
4221
diff
changeset
|
411 av_log(avctx, AV_LOG_ERROR, "Encoder_Interface_init error\n"); |
1297 | 412 return -1; |
413 } | |
414 | |
4744 | 415 if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0) |
416 { | |
4793
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
417 av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported); |
4744 | 418 return -1; |
419 } | |
1297 | 420 |
421 return 0; | |
422 } | |
423 | |
424 static int amr_nb_decode_close(AVCodecContext * avctx) | |
425 { | |
426 AMRContext *s = avctx->priv_data; | |
4633 | 427 |
1297 | 428 Decoder_Interface_exit(s->decState); |
429 return 0; | |
430 } | |
431 | |
432 static int amr_nb_encode_close(AVCodecContext * avctx) | |
433 { | |
434 AMRContext *s = avctx->priv_data; | |
4633 | 435 |
1297 | 436 Encoder_Interface_exit(s->enstate); |
437 av_freep(&avctx->coded_frame); | |
438 return 0; | |
439 } | |
440 | |
441 static int amr_nb_decode_frame(AVCodecContext * avctx, | |
442 void *data, int *data_size, | |
443 uint8_t * buf, int buf_size) | |
444 { | |
4634 | 445 AMRContext *s = avctx->priv_data; |
1297 | 446 uint8_t*amrData=buf; |
447 static short block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 }; | |
448 enum Mode dec_mode; | |
449 int packet_size; | |
450 | |
2287
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
451 /* av_log(NULL,AV_LOG_DEBUG,"amr_decode_frame buf=%p buf_size=%d frameCount=%d!!\n",buf,buf_size,s->frameCount); */ |
2967 | 452 |
2287
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
453 dec_mode = (buf[0] >> 3) & 0x000F; |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
454 packet_size = block_size[dec_mode]+1; |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
455 |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
456 if(packet_size > buf_size) { |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
457 av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size); |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
458 return -1; |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
459 } |
2967 | 460 |
2287
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
461 s->frameCount++; |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
462 /* av_log(NULL,AV_LOG_DEBUG,"packet_size=%d amrData= 0x%X %X %X %X\n",packet_size,amrData[0],amrData[1],amrData[2],amrData[3]); */ |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
463 /* call decoder */ |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
464 Decoder_Interface_Decode(s->decState, amrData, data, 0); |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
465 *data_size=160*2; |
2967 | 466 |
2287
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
467 return packet_size; |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
468 } |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
469 |
1297 | 470 static int amr_nb_encode_frame(AVCodecContext *avctx, |
2979 | 471 unsigned char *frame/*out*/, int buf_size, void *data/*in*/) |
1297 | 472 { |
4634 | 473 AMRContext *s = avctx->priv_data; |
1297 | 474 int written; |
475 | |
4744 | 476 if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0) |
477 { | |
4793
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
478 av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported); |
4744 | 479 return -1; |
480 } | |
4220
4115a044e31d
allow amr bitrate to be changed "on the fly" through avctx->bitrate.
gpoirier
parents:
4094
diff
changeset
|
481 |
2967 | 482 written = Encoder_Interface_Encode(s->enstate, |
483 s->enc_bitrate, | |
484 data, | |
485 frame, | |
1297 | 486 0); |
2571
b17d868a8f39
04_AMR_no_debug_output.patch by (Calcium | calcium nurs or jp)
michael
parents:
2287
diff
changeset
|
487 /* av_log(NULL,AV_LOG_DEBUG,"amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n",written, s->enc_bitrate, frame[0] ); */ |
1297 | 488 |
489 return written; | |
490 } | |
491 | |
492 #endif | |
493 | |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
494 #if defined(CONFIG_LIBAMR_NB) || defined(CONFIG_LIBAMR_NB_FIXED) |
2895 | 495 |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
496 AVCodec libamr_nb_decoder = |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
497 { |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
498 "libamr_nb", |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
499 CODEC_TYPE_AUDIO, |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
500 CODEC_ID_AMR_NB, |
1297 | 501 sizeof(AMRContext), |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
502 amr_nb_decode_init, |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
503 NULL, |
1297 | 504 amr_nb_decode_close, |
1258
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
505 amr_nb_decode_frame, |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
506 }; |
802614404398
AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents:
diff
changeset
|
507 |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
508 AVCodec libamr_nb_encoder = |
1297 | 509 { |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
510 "libamr_nb", |
1297 | 511 CODEC_TYPE_AUDIO, |
512 CODEC_ID_AMR_NB, | |
513 sizeof(AMRContext), | |
514 amr_nb_encode_init, | |
515 amr_nb_encode_frame, | |
516 amr_nb_encode_close, | |
517 NULL, | |
518 }; | |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
519 |
2895 | 520 #endif |
521 | |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
522 /* -----------AMR wideband ------------*/ |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
523 #ifdef CONFIG_LIBAMR_WB |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
524 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
525 #ifdef _TYPEDEF_H |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
526 //To avoid duplicate typedefs from typdef in amr-nb |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
527 #define typedef_h |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
528 #endif |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
529 |
4843
0e11f292482f
Replace hackish support for amr-nb and amr-wb. Instead of including the source
diego
parents:
4842
diff
changeset
|
530 #include <amrwb/enc_if.h> |
0e11f292482f
Replace hackish support for amr-nb and amr-wb. Instead of including the source
diego
parents:
4842
diff
changeset
|
531 #include <amrwb/dec_if.h> |
0e11f292482f
Replace hackish support for amr-nb and amr-wb. Instead of including the source
diego
parents:
4842
diff
changeset
|
532 #include <amrwb/if_rom.h> |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
533 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
534 /* Common code for fixed and float version*/ |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
535 typedef struct AMRWB_bitrates |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
536 { |
4744 | 537 int rate; |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
538 int mode; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
539 } AMRWB_bitrates; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
540 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
541 static int getWBBitrateMode(int bitrate) |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
542 { |
4744 | 543 /* make the correspondance between bitrate and mode */ |
544 AMRWB_bitrates rates[]={ {6600,0}, | |
545 {8850,1}, | |
546 {12650,2}, | |
547 {14250,3}, | |
548 {15850,4}, | |
549 {18250,5}, | |
550 {19850,6}, | |
551 {23050,7}, | |
552 {23850,8}, | |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
553 }; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
554 int i; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
555 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
556 for(i=0;i<9;i++) |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
557 { |
4744 | 558 if(rates[i].rate==bitrate) |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
559 { |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
560 return(rates[i].mode); |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
561 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
562 } |
4744 | 563 /* no bitrate matching, return an error */ |
564 return -1; | |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
565 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
566 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
567 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
568 typedef struct AMRWBContext { |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
569 int frameCount; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
570 void *state; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
571 int mode; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
572 Word16 allow_dtx; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
573 } AMRWBContext; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
574 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
575 static int amr_wb_encode_init(AVCodecContext * avctx) |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
576 { |
4634 | 577 AMRWBContext *s = avctx->priv_data; |
4633 | 578 |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
579 s->frameCount=0; |
2967 | 580 |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
581 if(avctx->sample_rate!=16000) |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
582 { |
4309
1f95aa362562
always print message when error, AV_LOG_DEBUG -> AV_LOG_ERROR
bcoudurier
parents:
4221
diff
changeset
|
583 av_log(avctx, AV_LOG_ERROR, "Only 16000Hz sample rate supported\n"); |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
584 return -1; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
585 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
586 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
587 if(avctx->channels!=1) |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
588 { |
4309
1f95aa362562
always print message when error, AV_LOG_DEBUG -> AV_LOG_ERROR
bcoudurier
parents:
4221
diff
changeset
|
589 av_log(avctx, AV_LOG_ERROR, "Only mono supported\n"); |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
590 return -1; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
591 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
592 |
4744 | 593 if((s->mode=getWBBitrateMode(avctx->bit_rate))<0) |
594 { | |
4793
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
595 av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported); |
4744 | 596 return -1; |
597 } | |
598 | |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
599 avctx->frame_size=320; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
600 avctx->coded_frame= avcodec_alloc_frame(); |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
601 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
602 s->state = E_IF_init(); |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
603 s->allow_dtx=0; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
604 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
605 return 0; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
606 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
607 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
608 static int amr_wb_encode_close(AVCodecContext * avctx) |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
609 { |
4634 | 610 AMRWBContext *s = avctx->priv_data; |
4633 | 611 |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
612 E_IF_exit(s->state); |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
613 av_freep(&avctx->coded_frame); |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
614 s->frameCount++; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
615 return 0; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
616 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
617 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
618 static int amr_wb_encode_frame(AVCodecContext *avctx, |
2979 | 619 unsigned char *frame/*out*/, int buf_size, void *data/*in*/) |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
620 { |
4634 | 621 AMRWBContext *s = avctx->priv_data; |
4220
4115a044e31d
allow amr bitrate to be changed "on the fly" through avctx->bitrate.
gpoirier
parents:
4094
diff
changeset
|
622 int size; |
4632
260b5f667458
Move the initialization on context definition. In amr.c, only the
takis
parents:
4575
diff
changeset
|
623 |
4744 | 624 if((s->mode=getWBBitrateMode(avctx->bit_rate))<0) |
625 { | |
4793
e69d9ecaaf84
Print a list of valid AMR bitrates if a wrong one is used.
diego
parents:
4789
diff
changeset
|
626 av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported); |
4744 | 627 return -1; |
628 } | |
4220
4115a044e31d
allow amr bitrate to be changed "on the fly" through avctx->bitrate.
gpoirier
parents:
4094
diff
changeset
|
629 size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx); |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
630 return size; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
631 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
632 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
633 static int amr_wb_decode_init(AVCodecContext * avctx) |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
634 { |
4634 | 635 AMRWBContext *s = avctx->priv_data; |
4633 | 636 |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
637 s->frameCount=0; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
638 s->state = D_IF_init(); |
4094 | 639 |
640 amr_decode_fix_avctx(avctx); | |
641 | |
642 if(avctx->channels > 1) | |
643 { | |
644 av_log(avctx, AV_LOG_ERROR, "amr_wb: multichannel decoding not supported\n"); | |
645 return -1; | |
646 } | |
647 | |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
648 return 0; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
649 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
650 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
651 static int amr_wb_decode_frame(AVCodecContext * avctx, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
652 void *data, int *data_size, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
653 uint8_t * buf, int buf_size) |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
654 { |
4634 | 655 AMRWBContext *s = avctx->priv_data; |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
656 uint8_t*amrData=buf; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
657 int mode; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
658 int packet_size; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
659 |
2287
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
660 if(buf_size==0) { |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
661 /* nothing to do */ |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
662 return 0; |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
663 } |
2287
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
664 |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
665 mode = (amrData[0] >> 3) & 0x000F; |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
666 packet_size = block_size[mode]; |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
667 |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
668 if(packet_size > buf_size) { |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
669 av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size+1); |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
670 return -1; |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
671 } |
2967 | 672 |
2287
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
673 s->frameCount++; |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
674 D_IF_decode( s->state, amrData, data, _good_frame); |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
675 *data_size=320*2; |
679642dc54cf
segfault in amr decoder fix patch by (Richard van der Hoff - richvdh0)
michael
parents:
2028
diff
changeset
|
676 return packet_size; |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
677 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
678 |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
679 static int amr_wb_decode_close(AVCodecContext * avctx) |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
680 { |
4634 | 681 AMRWBContext *s = avctx->priv_data; |
4633 | 682 |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
683 D_IF_exit(s->state); |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
684 return 0; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
685 } |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
686 |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
687 AVCodec libamr_wb_decoder = |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
688 { |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
689 "libamr_wb", |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
690 CODEC_TYPE_AUDIO, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
691 CODEC_ID_AMR_WB, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
692 sizeof(AMRWBContext), |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
693 amr_wb_decode_init, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
694 NULL, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
695 amr_wb_decode_close, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
696 amr_wb_decode_frame, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
697 }; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
698 |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
699 AVCodec libamr_wb_encoder = |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
700 { |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
701 "libamr_wb", |
1486
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
702 CODEC_TYPE_AUDIO, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
703 CODEC_ID_AMR_WB, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
704 sizeof(AMRWBContext), |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
705 amr_wb_encode_init, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
706 amr_wb_encode_frame, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
707 amr_wb_encode_close, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
708 NULL, |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
709 }; |
f22010affdce
AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents:
1297
diff
changeset
|
710 |
4898
3df69e140c33
Give libamr decoders/encoders a lib prefix in the name.
diego
parents:
4858
diff
changeset
|
711 #endif //CONFIG_LIBAMR_WB |