diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c index e6216c9e5e..c8b3a2c1bc 100644 --- a/libavcodec/libopencore-amr.c +++ b/libavcodec/libopencore-amr.c @@ -81,6 +81,7 @@ typedef struct AMRContext { void *dec_state; void *enc_state; int enc_bitrate; + int enc_mode; } AMRContext; static av_cold int amr_nb_decode_init(AVCodecContext *avctx) @@ -181,7 +182,8 @@ static av_cold int amr_nb_encode_init(AVCodecContext *avctx) return -1; } - s->enc_bitrate = get_bitrate_mode(avctx->bit_rate, avctx); + s->enc_mode = get_bitrate_mode(avctx->bit_rate, avctx); + s->enc_bitrate = avctx->bit_rate; return 0; } @@ -202,12 +204,15 @@ static int amr_nb_encode_frame(AVCodecContext *avctx, AMRContext *s = avctx->priv_data; int written; - s->enc_bitrate = get_bitrate_mode(avctx->bit_rate, avctx); + if (s->enc_bitrate != avctx->bit_rate) { + s->enc_mode = get_bitrate_mode(avctx->bit_rate, avctx); + s->enc_bitrate = avctx->bit_rate; + } - written = Encoder_Interface_Encode(s->enc_state, s->enc_bitrate, data, + written = Encoder_Interface_Encode(s->enc_state, s->enc_mode, data, frame, 0); av_dlog(avctx, "amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n", - written, s->enc_bitrate, frame[0]); + written, s->enc_mode, frame[0]); return written; } diff --git a/libavcodec/libvo-amrwbenc.c b/libavcodec/libvo-amrwbenc.c index b194bf04bb..d3db5f847a 100644 --- a/libavcodec/libvo-amrwbenc.c +++ b/libavcodec/libvo-amrwbenc.c @@ -27,6 +27,7 @@ typedef struct AMRWBContext { void *state; int mode; + int last_bitrate; int allow_dtx; } AMRWBContext; @@ -70,7 +71,8 @@ static av_cold int amr_wb_encode_init(AVCodecContext *avctx) return AVERROR(ENOSYS); } - s->mode = get_wb_bitrate_mode(avctx->bit_rate, avctx); + s->mode = get_wb_bitrate_mode(avctx->bit_rate, avctx); + s->last_bitrate = avctx->bit_rate; avctx->frame_size = 320; avctx->coded_frame = avcodec_alloc_frame(); @@ -97,7 +99,10 @@ static int amr_wb_encode_frame(AVCodecContext *avctx, AMRWBContext *s = avctx->priv_data; int size; - s->mode = get_wb_bitrate_mode(avctx->bit_rate, avctx); + if (s->last_bitrate != avctx->bit_rate) { + s->mode = get_wb_bitrate_mode(avctx->bit_rate, avctx); + s->last_bitrate = avctx->bit_rate; + } size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx); return size; }