2 * AMR Audio decoder stub
3 * Copyright (c) 2003 The FFmpeg project
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "libavutil/avstring.h"
25 #include "libavutil/channel_layout.h"
26 #include "libavutil/common.h"
27 #include "libavutil/opt.h"
29 #include "audio_frame_queue.h"
32 static int amr_decode_fix_avctx(AVCodecContext
*avctx
)
34 const int is_amr_wb
= 1 + (avctx
->codec_id
== AV_CODEC_ID_AMR_WB
);
36 avctx
->sample_rate
= 8000 * is_amr_wb
;
38 if (avctx
->channels
> 1) {
39 avpriv_report_missing_feature(avctx
, "multi-channel AMR");
40 return AVERROR_PATCHWELCOME
;
44 avctx
->channel_layout
= AV_CH_LAYOUT_MONO
;
45 avctx
->sample_fmt
= AV_SAMPLE_FMT_S16
;
49 #if CONFIG_LIBOPENCORE_AMRNB
51 #include <opencore-amrnb/interf_dec.h>
52 #include <opencore-amrnb/interf_enc.h>
54 typedef struct AMRContext
{
65 #if CONFIG_LIBOPENCORE_AMRNB_DECODER
66 static av_cold
int amr_nb_decode_init(AVCodecContext
*avctx
)
68 AMRContext
*s
= avctx
->priv_data
;
71 if ((ret
= amr_decode_fix_avctx(avctx
)) < 0)
74 s
->dec_state
= Decoder_Interface_init();
76 av_log(avctx
, AV_LOG_ERROR
, "Decoder_Interface_init error\n");
83 static av_cold
int amr_nb_decode_close(AVCodecContext
*avctx
)
85 AMRContext
*s
= avctx
->priv_data
;
87 Decoder_Interface_exit(s
->dec_state
);
92 static int amr_nb_decode_frame(AVCodecContext
*avctx
, void *data
,
93 int *got_frame_ptr
, AVPacket
*avpkt
)
95 AVFrame
*frame
= data
;
96 const uint8_t *buf
= avpkt
->data
;
97 int buf_size
= avpkt
->size
;
98 AMRContext
*s
= avctx
->priv_data
;
99 static const uint8_t block_size
[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
101 int packet_size
, ret
;
103 ff_dlog(avctx
, "amr_decode_frame buf=%p buf_size=%d frame_count=%d!!\n",
104 buf
, buf_size
, avctx
->frame_number
);
106 /* get output buffer */
107 frame
->nb_samples
= 160;
108 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0) {
109 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
113 dec_mode
= (buf
[0] >> 3) & 0x000F;
114 packet_size
= block_size
[dec_mode
] + 1;
116 if (packet_size
> buf_size
) {
117 av_log(avctx
, AV_LOG_ERROR
, "AMR frame too short (%d, should be %d)\n",
118 buf_size
, packet_size
);
119 return AVERROR_INVALIDDATA
;
122 ff_dlog(avctx
, "packet_size=%d buf= 0x%"PRIx8
" %"PRIx8
" %"PRIx8
" %"PRIx8
"\n",
123 packet_size
, buf
[0], buf
[1], buf
[2], buf
[3]);
125 Decoder_Interface_Decode(s
->dec_state
, buf
, (short *)frame
->data
[0], 0);
132 AVCodec ff_libopencore_amrnb_decoder
= {
133 .name
= "libopencore_amrnb",
134 .long_name
= NULL_IF_CONFIG_SMALL("OpenCORE AMR-NB (Adaptive Multi-Rate Narrow-Band)"),
135 .type
= AVMEDIA_TYPE_AUDIO
,
136 .id
= AV_CODEC_ID_AMR_NB
,
137 .priv_data_size
= sizeof(AMRContext
),
138 .init
= amr_nb_decode_init
,
139 .close
= amr_nb_decode_close
,
140 .decode
= amr_nb_decode_frame
,
141 .capabilities
= AV_CODEC_CAP_DR1
,
143 #endif /* CONFIG_LIBOPENCORE_AMRNB_DECODER */
145 #if CONFIG_LIBOPENCORE_AMRNB_ENCODER
146 /* Common code for fixed and float version*/
147 typedef struct AMR_bitrates
{
152 /* Match desired bitrate */
153 static int get_bitrate_mode(int bitrate
, void *log_ctx
)
155 /* make the correspondence between bitrate and mode */
156 static const AMR_bitrates rates
[] = {
157 { 4750, MR475
}, { 5150, MR515
}, { 5900, MR59
}, { 6700, MR67
},
158 { 7400, MR74
}, { 7950, MR795
}, { 10200, MR102
}, { 12200, MR122
}
160 int i
, best
= -1, min_diff
= 0;
163 for (i
= 0; i
< 8; i
++) {
164 if (rates
[i
].rate
== bitrate
)
165 return rates
[i
].mode
;
166 if (best
< 0 || abs(rates
[i
].rate
- bitrate
) < min_diff
) {
168 min_diff
= abs(rates
[i
].rate
- bitrate
);
171 /* no bitrate matching exactly, log a warning */
172 snprintf(log_buf
, sizeof(log_buf
), "bitrate not supported: use one of ");
173 for (i
= 0; i
< 8; i
++)
174 av_strlcatf(log_buf
, sizeof(log_buf
), "%.2fk, ", rates
[i
].rate
/ 1000.f
);
175 av_strlcatf(log_buf
, sizeof(log_buf
), "using %.2fk", rates
[best
].rate
/ 1000.f
);
176 av_log(log_ctx
, AV_LOG_WARNING
, "%s\n", log_buf
);
181 static const AVOption options
[] = {
182 { "dtx", "Allow DTX (generate comfort noise)", offsetof(AMRContext
, enc_dtx
), AV_OPT_TYPE_INT
, { .i64
= 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM
| AV_OPT_FLAG_ENCODING_PARAM
},
186 static const AVClass
class = {
187 .class_name
= "libopencore_amrnb",
188 .item_name
= av_default_item_name
,
190 .version
= LIBAVUTIL_VERSION_INT
,
193 static av_cold
int amr_nb_encode_init(AVCodecContext
*avctx
)
195 AMRContext
*s
= avctx
->priv_data
;
197 if (avctx
->sample_rate
!= 8000) {
198 av_log(avctx
, AV_LOG_ERROR
, "Only 8000Hz sample rate supported\n");
199 return AVERROR(ENOSYS
);
202 if (avctx
->channels
!= 1) {
203 av_log(avctx
, AV_LOG_ERROR
, "Only mono supported\n");
204 return AVERROR(ENOSYS
);
207 avctx
->frame_size
= 160;
208 avctx
->initial_padding
= 50;
209 ff_af_queue_init(avctx
, &s
->afq
);
211 s
->enc_state
= Encoder_Interface_init(s
->enc_dtx
);
213 av_log(avctx
, AV_LOG_ERROR
, "Encoder_Interface_init error\n");
217 s
->enc_mode
= get_bitrate_mode(avctx
->bit_rate
, avctx
);
218 s
->enc_bitrate
= avctx
->bit_rate
;
223 static av_cold
int amr_nb_encode_close(AVCodecContext
*avctx
)
225 AMRContext
*s
= avctx
->priv_data
;
227 Encoder_Interface_exit(s
->enc_state
);
228 ff_af_queue_close(&s
->afq
);
232 static int amr_nb_encode_frame(AVCodecContext
*avctx
, AVPacket
*avpkt
,
233 const AVFrame
*frame
, int *got_packet_ptr
)
235 AMRContext
*s
= avctx
->priv_data
;
237 int16_t *flush_buf
= NULL
;
238 const int16_t *samples
= frame
? (const int16_t *)frame
->data
[0] : NULL
;
240 if (s
->enc_bitrate
!= avctx
->bit_rate
) {
241 s
->enc_mode
= get_bitrate_mode(avctx
->bit_rate
, avctx
);
242 s
->enc_bitrate
= avctx
->bit_rate
;
245 if ((ret
= ff_alloc_packet(avpkt
, 32))) {
246 av_log(avctx
, AV_LOG_ERROR
, "Error getting output packet\n");
251 if (frame
->nb_samples
< avctx
->frame_size
) {
252 flush_buf
= av_mallocz(avctx
->frame_size
* sizeof(*flush_buf
));
254 return AVERROR(ENOMEM
);
255 memcpy(flush_buf
, samples
, frame
->nb_samples
* sizeof(*flush_buf
));
257 if (frame
->nb_samples
< avctx
->frame_size
- avctx
->initial_padding
)
258 s
->enc_last_frame
= -1;
260 if ((ret
= ff_af_queue_add(&s
->afq
, frame
)) < 0) {
261 av_freep(&flush_buf
);
265 if (s
->enc_last_frame
< 0)
267 flush_buf
= av_mallocz(avctx
->frame_size
* sizeof(*flush_buf
));
269 return AVERROR(ENOMEM
);
271 s
->enc_last_frame
= -1;
274 written
= Encoder_Interface_Encode(s
->enc_state
, s
->enc_mode
, samples
,
276 ff_dlog(avctx
, "amr_nb_encode_frame encoded %d bytes, bitrate %d, first byte was %#02"PRIx8
"\n",
277 written
, s
->enc_mode
, *frame
->data
[0]);
279 /* Get the next frame pts/duration */
280 ff_af_queue_remove(&s
->afq
, avctx
->frame_size
, &avpkt
->pts
,
283 avpkt
->size
= written
;
285 av_freep(&flush_buf
);
289 AVCodec ff_libopencore_amrnb_encoder
= {
290 .name
= "libopencore_amrnb",
291 .long_name
= NULL_IF_CONFIG_SMALL("OpenCORE AMR-NB (Adaptive Multi-Rate Narrow-Band)"),
292 .type
= AVMEDIA_TYPE_AUDIO
,
293 .id
= AV_CODEC_ID_AMR_NB
,
294 .priv_data_size
= sizeof(AMRContext
),
295 .init
= amr_nb_encode_init
,
296 .encode2
= amr_nb_encode_frame
,
297 .close
= amr_nb_encode_close
,
298 .capabilities
= AV_CODEC_CAP_DELAY
| AV_CODEC_CAP_SMALL_LAST_FRAME
,
299 .sample_fmts
= (const enum AVSampleFormat
[]){ AV_SAMPLE_FMT_S16
,
300 AV_SAMPLE_FMT_NONE
},
301 .priv_class
= &class,
303 #endif /* CONFIG_LIBOPENCORE_AMRNB_ENCODER */
305 #endif /* CONFIG_LIBOPENCORE_AMRNB */
307 /* -----------AMR wideband ------------*/
308 #if CONFIG_LIBOPENCORE_AMRWB_DECODER
310 #include <opencore-amrwb/dec_if.h>
311 #include <opencore-amrwb/if_rom.h>
313 typedef struct AMRWBContext
{
317 static av_cold
int amr_wb_decode_init(AVCodecContext
*avctx
)
319 AMRWBContext
*s
= avctx
->priv_data
;
322 if ((ret
= amr_decode_fix_avctx(avctx
)) < 0)
325 s
->state
= D_IF_init();
330 static int amr_wb_decode_frame(AVCodecContext
*avctx
, void *data
,
331 int *got_frame_ptr
, AVPacket
*avpkt
)
333 AVFrame
*frame
= data
;
334 const uint8_t *buf
= avpkt
->data
;
335 int buf_size
= avpkt
->size
;
336 AMRWBContext
*s
= avctx
->priv_data
;
339 static const uint8_t block_size
[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
341 /* get output buffer */
342 frame
->nb_samples
= 320;
343 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0) {
344 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
348 mode
= (buf
[0] >> 3) & 0x000F;
349 packet_size
= block_size
[mode
];
351 if (packet_size
> buf_size
) {
352 av_log(avctx
, AV_LOG_ERROR
, "AMR frame too short (%d, should be %d)\n",
353 buf_size
, packet_size
+ 1);
354 return AVERROR_INVALIDDATA
;
357 D_IF_decode(s
->state
, buf
, (short *)frame
->data
[0], _good_frame
);
364 static int amr_wb_decode_close(AVCodecContext
*avctx
)
366 AMRWBContext
*s
= avctx
->priv_data
;
372 AVCodec ff_libopencore_amrwb_decoder
= {
373 .name
= "libopencore_amrwb",
374 .long_name
= NULL_IF_CONFIG_SMALL("OpenCORE AMR-WB (Adaptive Multi-Rate Wide-Band)"),
375 .type
= AVMEDIA_TYPE_AUDIO
,
376 .id
= AV_CODEC_ID_AMR_WB
,
377 .priv_data_size
= sizeof(AMRWBContext
),
378 .init
= amr_wb_decode_init
,
379 .close
= amr_wb_decode_close
,
380 .decode
= amr_wb_decode_frame
,
381 .capabilities
= AV_CODEC_CAP_DR1
,
382 .wrapper_name
= "libopencore_amrwb",
385 #endif /* CONFIG_LIBOPENCORE_AMRWB_DECODER */