|
|
|
@ -96,7 +96,6 @@ |
|
|
|
|
#define AMR_AGC_ALPHA 0.9 |
|
|
|
|
|
|
|
|
|
typedef struct AMRContext { |
|
|
|
|
AVFrame avframe; ///< AVFrame for decoded samples
|
|
|
|
|
AMRNBFrame frame; ///< decoded AMR parameters (lsf coefficients, codebook indexes, etc)
|
|
|
|
|
uint8_t bad_frame_indicator; ///< bad frame ? 1 : 0
|
|
|
|
|
enum Mode cur_frame_mode; |
|
|
|
@ -177,9 +176,6 @@ static av_cold int amrnb_decode_init(AVCodecContext *avctx) |
|
|
|
|
for (i = 0; i < 4; i++) |
|
|
|
|
p->prediction_error[i] = MIN_ENERGY; |
|
|
|
|
|
|
|
|
|
avcodec_get_frame_defaults(&p->avframe); |
|
|
|
|
avctx->coded_frame = &p->avframe; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -936,6 +932,7 @@ static int amrnb_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
AMRContext *p = avctx->priv_data; // pointer to private data
|
|
|
|
|
AVFrame *frame = data; |
|
|
|
|
const uint8_t *buf = avpkt->data; |
|
|
|
|
int buf_size = avpkt->size; |
|
|
|
|
float *buf_out; // pointer to the output data buffer
|
|
|
|
@ -947,12 +944,12 @@ static int amrnb_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
const float *synth_fixed_vector; // pointer to the fixed vector that synthesis should use
|
|
|
|
|
|
|
|
|
|
/* get output buffer */ |
|
|
|
|
p->avframe.nb_samples = AMR_BLOCK_SIZE; |
|
|
|
|
if ((ret = ff_get_buffer(avctx, &p->avframe)) < 0) { |
|
|
|
|
frame->nb_samples = AMR_BLOCK_SIZE; |
|
|
|
|
if ((ret = ff_get_buffer(avctx, frame)) < 0) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
buf_out = (float *)p->avframe.data[0]; |
|
|
|
|
buf_out = (float *)frame->data[0]; |
|
|
|
|
|
|
|
|
|
p->cur_frame_mode = unpack_bitstream(p, buf, buf_size); |
|
|
|
|
if (p->cur_frame_mode == NO_DATA) { |
|
|
|
@ -1058,8 +1055,7 @@ static int amrnb_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
ff_weighted_vector_sumf(p->lsf_avg, p->lsf_avg, p->lsf_q[3], |
|
|
|
|
0.84, 0.16, LP_FILTER_ORDER); |
|
|
|
|
|
|
|
|
|
*got_frame_ptr = 1; |
|
|
|
|
*(AVFrame *)data = p->avframe; |
|
|
|
|
*got_frame_ptr = 1; |
|
|
|
|
|
|
|
|
|
/* return the amount of bytes consumed if everything was OK */ |
|
|
|
|
return frame_sizes_nb[p->cur_frame_mode] + 1; // +7 for rounding and +8 for TOC
|
|
|
|
|