2 * AMR Audio decoder stub
3 * Copyright (c) 2003 the ffmpeg project
5 * This file is part of FFmpeg.
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.
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.
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
24 static void amr_decode_fix_avctx(AVCodecContext
*avctx
)
26 const int is_amr_wb
= 1 + (avctx
->codec_id
== CODEC_ID_AMR_WB
);
28 if (!avctx
->sample_rate
)
29 avctx
->sample_rate
= 8000 * is_amr_wb
;
34 avctx
->frame_size
= 160 * is_amr_wb
;
35 avctx
->sample_fmt
= SAMPLE_FMT_S16
;
38 #if CONFIG_LIBOPENCORE_AMRNB
40 #include <opencore-amrnb/interf_dec.h>
41 #include <opencore-amrnb/interf_enc.h>
43 static const char nb_bitrate_unsupported
[] =
44 "bitrate not supported: use one of 4.75k, 5.15k, 5.9k, 6.7k, 7.4k, 7.95k, 10.2k or 12.2k\n";
46 /* Common code for fixed and float version*/
47 typedef struct AMR_bitrates
{
52 /* Match desired bitrate */
53 static int getBitrateMode(int bitrate
)
55 /* make the correspondance between bitrate and mode */
56 AMR_bitrates rates
[] = { { 4750, MR475
},
66 for (i
= 0; i
< 8; i
++)
67 if (rates
[i
].rate
== bitrate
)
69 /* no bitrate matching, return an error */
73 typedef struct AMRContext
{
80 static av_cold
int amr_nb_decode_init(AVCodecContext
*avctx
)
82 AMRContext
*s
= avctx
->priv_data
;
85 s
->decState
= Decoder_Interface_init();
87 av_log(avctx
, AV_LOG_ERROR
, "Decoder_Interface_init error\r\n");
91 amr_decode_fix_avctx(avctx
);
93 if (avctx
->channels
> 1) {
94 av_log(avctx
, AV_LOG_ERROR
, "amr_nb: multichannel decoding not supported\n");
101 static av_cold
int amr_nb_decode_close(AVCodecContext
*avctx
)
103 AMRContext
*s
= avctx
->priv_data
;
105 Decoder_Interface_exit(s
->decState
);
109 static int amr_nb_decode_frame(AVCodecContext
*avctx
, void *data
,
110 int *data_size
, AVPacket
*avpkt
)
112 const uint8_t *buf
= avpkt
->data
;
113 int buf_size
= avpkt
->size
;
114 AMRContext
*s
= avctx
->priv_data
;
115 const uint8_t *amrData
= buf
;
116 static const uint8_t block_size
[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
120 /* av_log(NULL, AV_LOG_DEBUG, "amr_decode_frame buf=%p buf_size=%d frameCount=%d!!\n",
121 buf, buf_size, s->frameCount); */
123 dec_mode
= (buf
[0] >> 3) & 0x000F;
124 packet_size
= block_size
[dec_mode
] + 1;
126 if (packet_size
> buf_size
) {
127 av_log(avctx
, AV_LOG_ERROR
, "amr frame too short (%u, should be %u)\n",
128 buf_size
, packet_size
);
133 /* av_log(NULL, AV_LOG_DEBUG, "packet_size=%d amrData= 0x%X %X %X %X\n",
134 packet_size, amrData[0], amrData[1], amrData[2], amrData[3]); */
136 Decoder_Interface_Decode(s
->decState
, amrData
, data
, 0);
137 *data_size
= 160 * 2;
142 AVCodec libopencore_amrnb_decoder
= {
151 .long_name
= NULL_IF_CONFIG_SMALL("OpenCORE Adaptive Multi-Rate (AMR) Narrow-Band"),
154 static av_cold
int amr_nb_encode_init(AVCodecContext
*avctx
)
156 AMRContext
*s
= avctx
->priv_data
;
160 if (avctx
->sample_rate
!= 8000) {
161 av_log(avctx
, AV_LOG_ERROR
, "Only 8000Hz sample rate supported\n");
165 if (avctx
->channels
!= 1) {
166 av_log(avctx
, AV_LOG_ERROR
, "Only mono supported\n");
170 avctx
->frame_size
= 160;
171 avctx
->coded_frame
= avcodec_alloc_frame();
173 s
->enstate
=Encoder_Interface_init(0);
175 av_log(avctx
, AV_LOG_ERROR
, "Encoder_Interface_init error\n");
179 if ((s
->enc_bitrate
= getBitrateMode(avctx
->bit_rate
)) < 0) {
180 av_log(avctx
, AV_LOG_ERROR
, nb_bitrate_unsupported
);
187 static av_cold
int amr_nb_encode_close(AVCodecContext
*avctx
)
189 AMRContext
*s
= avctx
->priv_data
;
191 Encoder_Interface_exit(s
->enstate
);
192 av_freep(&avctx
->coded_frame
);
196 static int amr_nb_encode_frame(AVCodecContext
*avctx
,
197 unsigned char *frame
/*out*/,
198 int buf_size
, void *data
/*in*/)
200 AMRContext
*s
= avctx
->priv_data
;
203 if ((s
->enc_bitrate
= getBitrateMode(avctx
->bit_rate
)) < 0) {
204 av_log(avctx
, AV_LOG_ERROR
, nb_bitrate_unsupported
);
208 written
= Encoder_Interface_Encode(s
->enstate
, s
->enc_bitrate
, data
,
210 /* av_log(NULL, AV_LOG_DEBUG, "amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n",
211 written, s->enc_bitrate, frame[0] ); */
216 AVCodec libopencore_amrnb_encoder
= {
225 .sample_fmts
= (enum SampleFormat
[]){SAMPLE_FMT_S16
,SAMPLE_FMT_NONE
},
226 .long_name
= NULL_IF_CONFIG_SMALL("OpenCORE Adaptive Multi-Rate (AMR) Narrow-Band"),
231 /* -----------AMR wideband ------------*/
232 #if CONFIG_LIBOPENCORE_AMRWB
235 //To avoid duplicate typedefs from typedef in amr-nb
239 #include <opencore-amrwb/dec_if.h>
240 #include <opencore-amrwb/if_rom.h>
242 static const char wb_bitrate_unsupported
[] =
243 "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";
245 /* Common code for fixed and float version*/
246 typedef struct AMRWB_bitrates
{
251 typedef struct AMRWBContext
{
258 static av_cold
int amr_wb_decode_init(AVCodecContext
*avctx
)
260 AMRWBContext
*s
= avctx
->priv_data
;
263 s
->state
= D_IF_init();
265 amr_decode_fix_avctx(avctx
);
267 if (avctx
->channels
> 1) {
268 av_log(avctx
, AV_LOG_ERROR
, "amr_wb: multichannel decoding not supported\n");
275 static int amr_wb_decode_frame(AVCodecContext
*avctx
, void *data
,
276 int *data_size
, AVPacket
*avpkt
)
278 const uint8_t *buf
= avpkt
->data
;
279 int buf_size
= avpkt
->size
;
280 AMRWBContext
*s
= avctx
->priv_data
;
281 const uint8_t *amrData
= buf
;
284 static const uint8_t block_size
[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
290 mode
= (amrData
[0] >> 3) & 0x000F;
291 packet_size
= block_size
[mode
];
293 if (packet_size
> buf_size
) {
294 av_log(avctx
, AV_LOG_ERROR
, "amr frame too short (%u, should be %u)\n",
295 buf_size
, packet_size
+ 1);
300 D_IF_decode(s
->state
, amrData
, data
, _good_frame
);
301 *data_size
= 320 * 2;
305 static int amr_wb_decode_close(AVCodecContext
*avctx
)
307 AMRWBContext
*s
= avctx
->priv_data
;
313 AVCodec libopencore_amrwb_decoder
= {
317 sizeof(AMRWBContext
),
322 .long_name
= NULL_IF_CONFIG_SMALL("OpenCORE Adaptive Multi-Rate (AMR) Wide-Band"),
325 #endif /* CONFIG_LIBOPENCORE_AMRWB */