1/* 2 * AMR Audio decoder stub 3 * Copyright (c) 2003 The FFmpeg project 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 22#include "config_components.h" 23 24#include <inttypes.h> 25 26#include "libavutil/avstring.h" 27#include "libavutil/channel_layout.h" 28#include "libavutil/common.h" 29#include "libavutil/opt.h" 30#include "avcodec.h" 31#include "audio_frame_queue.h" 32#include "codec_internal.h" 33#include "encode.h" 34#include "internal.h" 35 36#if CONFIG_LIBOPENCORE_AMRNB_DECODER || CONFIG_LIBOPENCORE_AMRWB_DECODER 37static int amr_decode_fix_avctx(AVCodecContext *avctx) 38{ 39 const int is_amr_wb = 1 + (avctx->codec_id == AV_CODEC_ID_AMR_WB); 40 41 if (!avctx->sample_rate) 42 avctx->sample_rate = 8000 * is_amr_wb; 43 44 if (avctx->ch_layout.nb_channels > 1) { 45 avpriv_report_missing_feature(avctx, "multi-channel AMR"); 46 return AVERROR_PATCHWELCOME; 47 } 48 49 av_channel_layout_uninit(&avctx->ch_layout); 50 avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; 51 avctx->sample_fmt = AV_SAMPLE_FMT_S16; 52 return 0; 53} 54#endif 55 56#if CONFIG_LIBOPENCORE_AMRNB 57 58#include <opencore-amrnb/interf_dec.h> 59#include <opencore-amrnb/interf_enc.h> 60 61typedef struct AMRContext { 62 AVClass *av_class; 63 void *dec_state; 64 void *enc_state; 65 int enc_bitrate; 66 int enc_mode; 67 int enc_dtx; 68 int enc_last_frame; 69 AudioFrameQueue afq; 70} AMRContext; 71 72#if CONFIG_LIBOPENCORE_AMRNB_DECODER 73static av_cold int amr_nb_decode_init(AVCodecContext *avctx) 74{ 75 AMRContext *s = avctx->priv_data; 76 int ret; 77 78 if ((ret = amr_decode_fix_avctx(avctx)) < 0) 79 return ret; 80 81 s->dec_state = Decoder_Interface_init(); 82 if (!s->dec_state) { 83 av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\n"); 84 return -1; 85 } 86 87 return 0; 88} 89 90static av_cold int amr_nb_decode_close(AVCodecContext *avctx) 91{ 92 AMRContext *s = avctx->priv_data; 93 94 Decoder_Interface_exit(s->dec_state); 95 96 return 0; 97} 98 99static int amr_nb_decode_frame(AVCodecContext *avctx, AVFrame *frame, 100 int *got_frame_ptr, AVPacket *avpkt) 101{ 102 const uint8_t *buf = avpkt->data; 103 int buf_size = avpkt->size; 104 AMRContext *s = avctx->priv_data; 105 static const uint8_t block_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 }; 106 enum Mode dec_mode; 107 int packet_size, ret; 108 109 ff_dlog(avctx, "amr_decode_frame buf=%p buf_size=%d frame_count=%d!!\n", 110 buf, buf_size, avctx->frame_number); 111 112 /* get output buffer */ 113 frame->nb_samples = 160; 114 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 115 return ret; 116 117 dec_mode = (buf[0] >> 3) & 0x000F; 118 packet_size = block_size[dec_mode] + 1; 119 120 if (packet_size > buf_size) { 121 av_log(avctx, AV_LOG_ERROR, "AMR frame too short (%d, should be %d)\n", 122 buf_size, packet_size); 123 return AVERROR_INVALIDDATA; 124 } 125 126 ff_dlog(avctx, "packet_size=%d buf= 0x%"PRIx8" %"PRIx8" %"PRIx8" %"PRIx8"\n", 127 packet_size, buf[0], buf[1], buf[2], buf[3]); 128 /* call decoder */ 129 Decoder_Interface_Decode(s->dec_state, buf, (short *)frame->data[0], 0); 130 131 *got_frame_ptr = 1; 132 133 return packet_size; 134} 135 136const FFCodec ff_libopencore_amrnb_decoder = { 137 .p.name = "libopencore_amrnb", 138 .p.long_name = NULL_IF_CONFIG_SMALL("OpenCORE AMR-NB (Adaptive Multi-Rate Narrow-Band)"), 139 .p.type = AVMEDIA_TYPE_AUDIO, 140 .p.id = AV_CODEC_ID_AMR_NB, 141 .priv_data_size = sizeof(AMRContext), 142 .init = amr_nb_decode_init, 143 .close = amr_nb_decode_close, 144 FF_CODEC_DECODE_CB(amr_nb_decode_frame), 145 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, 146}; 147#endif /* CONFIG_LIBOPENCORE_AMRNB_DECODER */ 148 149#if CONFIG_LIBOPENCORE_AMRNB_ENCODER 150/* Common code for fixed and float version*/ 151typedef struct AMR_bitrates { 152 int rate; 153 enum Mode mode; 154} AMR_bitrates; 155 156/* Match desired bitrate */ 157static int get_bitrate_mode(int bitrate, void *log_ctx) 158{ 159 /* make the correspondence between bitrate and mode */ 160 static const AMR_bitrates rates[] = { 161 { 4750, MR475 }, { 5150, MR515 }, { 5900, MR59 }, { 6700, MR67 }, 162 { 7400, MR74 }, { 7950, MR795 }, { 10200, MR102 }, { 12200, MR122 } 163 }; 164 int i, best = -1, min_diff = 0; 165 char log_buf[200]; 166 167 for (i = 0; i < 8; i++) { 168 if (rates[i].rate == bitrate) 169 return rates[i].mode; 170 if (best < 0 || abs(rates[i].rate - bitrate) < min_diff) { 171 best = i; 172 min_diff = abs(rates[i].rate - bitrate); 173 } 174 } 175 /* no bitrate matching exactly, log a warning */ 176 snprintf(log_buf, sizeof(log_buf), "bitrate not supported: use one of "); 177 for (i = 0; i < 8; i++) 178 av_strlcatf(log_buf, sizeof(log_buf), "%.2fk, ", rates[i].rate / 1000.f); 179 av_strlcatf(log_buf, sizeof(log_buf), "using %.2fk", rates[best].rate / 1000.f); 180 av_log(log_ctx, AV_LOG_WARNING, "%s\n", log_buf); 181 182 return best; 183} 184 185static const AVOption options[] = { 186 { "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 }, 187 { NULL } 188}; 189 190static const AVClass amrnb_class = { 191 .class_name = "libopencore_amrnb", 192 .item_name = av_default_item_name, 193 .option = options, 194 .version = LIBAVUTIL_VERSION_INT, 195}; 196 197static av_cold int amr_nb_encode_init(AVCodecContext *avctx) 198{ 199 AMRContext *s = avctx->priv_data; 200 201 if (avctx->sample_rate != 8000 && avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) { 202 av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n"); 203 return AVERROR(ENOSYS); 204 } 205 206 if (avctx->ch_layout.nb_channels != 1) { 207 av_log(avctx, AV_LOG_ERROR, "Only mono supported\n"); 208 return AVERROR(ENOSYS); 209 } 210 211 avctx->frame_size = 160; 212 avctx->initial_padding = 50; 213 ff_af_queue_init(avctx, &s->afq); 214 215 s->enc_state = Encoder_Interface_init(s->enc_dtx); 216 if (!s->enc_state) { 217 av_log(avctx, AV_LOG_ERROR, "Encoder_Interface_init error\n"); 218 return -1; 219 } 220 221 s->enc_mode = get_bitrate_mode(avctx->bit_rate, avctx); 222 s->enc_bitrate = avctx->bit_rate; 223 224 return 0; 225} 226 227static av_cold int amr_nb_encode_close(AVCodecContext *avctx) 228{ 229 AMRContext *s = avctx->priv_data; 230 231 Encoder_Interface_exit(s->enc_state); 232 ff_af_queue_close(&s->afq); 233 return 0; 234} 235 236static int amr_nb_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 237 const AVFrame *frame, int *got_packet_ptr) 238{ 239 AMRContext *s = avctx->priv_data; 240 int written, ret; 241 int16_t *flush_buf = NULL; 242 const int16_t *samples = frame ? (const int16_t *)frame->data[0] : NULL; 243 244 if (s->enc_bitrate != avctx->bit_rate) { 245 s->enc_mode = get_bitrate_mode(avctx->bit_rate, avctx); 246 s->enc_bitrate = avctx->bit_rate; 247 } 248 249 if ((ret = ff_alloc_packet(avctx, avpkt, 32)) < 0) 250 return ret; 251 252 if (frame) { 253 if (frame->nb_samples < avctx->frame_size) { 254 flush_buf = av_calloc(avctx->frame_size, sizeof(*flush_buf)); 255 if (!flush_buf) 256 return AVERROR(ENOMEM); 257 memcpy(flush_buf, samples, frame->nb_samples * sizeof(*flush_buf)); 258 samples = flush_buf; 259 if (frame->nb_samples < avctx->frame_size - avctx->initial_padding) 260 s->enc_last_frame = -1; 261 } 262 if ((ret = ff_af_queue_add(&s->afq, frame)) < 0) { 263 av_freep(&flush_buf); 264 return ret; 265 } 266 } else { 267 if (s->enc_last_frame < 0) 268 return 0; 269 flush_buf = av_calloc(avctx->frame_size, sizeof(*flush_buf)); 270 if (!flush_buf) 271 return AVERROR(ENOMEM); 272 samples = flush_buf; 273 s->enc_last_frame = -1; 274 } 275 276 written = Encoder_Interface_Encode(s->enc_state, s->enc_mode, samples, 277 avpkt->data, 0); 278 ff_dlog(avctx, "amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n", 279 written, s->enc_mode, avpkt->data[0]); 280 281 /* Get the next frame pts/duration */ 282 ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, 283 &avpkt->duration); 284 285 avpkt->size = written; 286 *got_packet_ptr = 1; 287 av_freep(&flush_buf); 288 return 0; 289} 290 291const FFCodec ff_libopencore_amrnb_encoder = { 292 .p.name = "libopencore_amrnb", 293 .p.long_name = NULL_IF_CONFIG_SMALL("OpenCORE AMR-NB (Adaptive Multi-Rate Narrow-Band)"), 294 .p.type = AVMEDIA_TYPE_AUDIO, 295 .p.id = AV_CODEC_ID_AMR_NB, 296 .priv_data_size = sizeof(AMRContext), 297 .init = amr_nb_encode_init, 298 FF_CODEC_ENCODE_CB(amr_nb_encode_frame), 299 .close = amr_nb_encode_close, 300 .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SMALL_LAST_FRAME, 301 .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, 302 AV_SAMPLE_FMT_NONE }, 303 .p.priv_class = &amrnb_class, 304}; 305#endif /* CONFIG_LIBOPENCORE_AMRNB_ENCODER */ 306 307#endif /* CONFIG_LIBOPENCORE_AMRNB */ 308 309/* -----------AMR wideband ------------*/ 310#if CONFIG_LIBOPENCORE_AMRWB_DECODER 311 312#include <opencore-amrwb/dec_if.h> 313#include <opencore-amrwb/if_rom.h> 314 315typedef struct AMRWBContext { 316 void *state; 317} AMRWBContext; 318 319static av_cold int amr_wb_decode_init(AVCodecContext *avctx) 320{ 321 AMRWBContext *s = avctx->priv_data; 322 int ret; 323 324 if ((ret = amr_decode_fix_avctx(avctx)) < 0) 325 return ret; 326 327 s->state = D_IF_init(); 328 329 return 0; 330} 331 332static int amr_wb_decode_frame(AVCodecContext *avctx, AVFrame *frame, 333 int *got_frame_ptr, AVPacket *avpkt) 334{ 335 const uint8_t *buf = avpkt->data; 336 int buf_size = avpkt->size; 337 AMRWBContext *s = avctx->priv_data; 338 int mode, ret; 339 int packet_size; 340 static const uint8_t block_size[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1}; 341 342 /* get output buffer */ 343 frame->nb_samples = 320; 344 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 345 return ret; 346 347 mode = (buf[0] >> 3) & 0x000F; 348 packet_size = block_size[mode]; 349 350 if (packet_size > buf_size) { 351 av_log(avctx, AV_LOG_ERROR, "AMR frame too short (%d, should be %d)\n", 352 buf_size, packet_size + 1); 353 return AVERROR_INVALIDDATA; 354 } 355 if (!packet_size) { 356 av_log(avctx, AV_LOG_ERROR, "amr packet_size invalid\n"); 357 return AVERROR_INVALIDDATA; 358 } 359 360 D_IF_decode(s->state, buf, (short *)frame->data[0], _good_frame); 361 362 *got_frame_ptr = 1; 363 364 return packet_size; 365} 366 367static int amr_wb_decode_close(AVCodecContext *avctx) 368{ 369 AMRWBContext *s = avctx->priv_data; 370 371 D_IF_exit(s->state); 372 return 0; 373} 374 375const FFCodec ff_libopencore_amrwb_decoder = { 376 .p.name = "libopencore_amrwb", 377 .p.long_name = NULL_IF_CONFIG_SMALL("OpenCORE AMR-WB (Adaptive Multi-Rate Wide-Band)"), 378 .p.type = AVMEDIA_TYPE_AUDIO, 379 .p.id = AV_CODEC_ID_AMR_WB, 380 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, 381 .p.wrapper_name = "libopencore_amrwb", 382 .priv_data_size = sizeof(AMRWBContext), 383 .init = amr_wb_decode_init, 384 .close = amr_wb_decode_close, 385 FF_CODEC_DECODE_CB(amr_wb_decode_frame), 386}; 387 388#endif /* CONFIG_LIBOPENCORE_AMRWB_DECODER */ 389