|
|
|
@ -27,7 +27,7 @@ |
|
|
|
|
#include "audio_frame_queue.h" |
|
|
|
|
#include "internal.h" |
|
|
|
|
|
|
|
|
|
static void amr_decode_fix_avctx(AVCodecContext *avctx) |
|
|
|
|
static int amr_decode_fix_avctx(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
const int is_amr_wb = 1 + (avctx->codec_id == AV_CODEC_ID_AMR_WB); |
|
|
|
|
|
|
|
|
@ -36,12 +36,13 @@ static void amr_decode_fix_avctx(AVCodecContext *avctx) |
|
|
|
|
|
|
|
|
|
if (avctx->channels > 1) { |
|
|
|
|
av_log_missing_feature(avctx, "multi-channel AMR", 0); |
|
|
|
|
return; |
|
|
|
|
return AVERROR_PATCHWELCOME; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avctx->channels = 1; |
|
|
|
|
avctx->channel_layout = AV_CH_LAYOUT_MONO; |
|
|
|
|
avctx->sample_fmt = AV_SAMPLE_FMT_S16; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if CONFIG_LIBOPENCORE_AMRNB |
|
|
|
@ -108,6 +109,10 @@ static const AVClass class = { |
|
|
|
|
static av_cold int amr_nb_decode_init(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
AMRContext *s = avctx->priv_data; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
if ((ret = amr_decode_fix_avctx(avctx)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
s->dec_state = Decoder_Interface_init(); |
|
|
|
|
if (!s->dec_state) { |
|
|
|
@ -115,13 +120,6 @@ static av_cold int amr_nb_decode_init(AVCodecContext *avctx) |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
amr_decode_fix_avctx(avctx); |
|
|
|
|
|
|
|
|
|
if (avctx->channels > 1) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "amr_nb: multichannel decoding not supported\n"); |
|
|
|
|
return AVERROR(ENOSYS); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avcodec_get_frame_defaults(&s->frame); |
|
|
|
|
avctx->coded_frame = &s->frame; |
|
|
|
|
|
|
|
|
@ -323,15 +321,12 @@ typedef struct AMRWBContext { |
|
|
|
|
static av_cold int amr_wb_decode_init(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
AMRWBContext *s = avctx->priv_data; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
s->state = D_IF_init(); |
|
|
|
|
|
|
|
|
|
amr_decode_fix_avctx(avctx); |
|
|
|
|
if ((ret = amr_decode_fix_avctx(avctx)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
if (avctx->channels > 1) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "amr_wb: multichannel decoding not supported\n"); |
|
|
|
|
return AVERROR(ENOSYS); |
|
|
|
|
} |
|
|
|
|
s->state = D_IF_init(); |
|
|
|
|
|
|
|
|
|
avcodec_get_frame_defaults(&s->frame); |
|
|
|
|
avctx->coded_frame = &s->frame; |
|
|
|
|