| @@ -111,7 +111,6 @@ typedef struct { | |||||
| //@} | //@} | ||||
| //@{ | //@{ | ||||
| /** data buffers */ | /** data buffers */ | ||||
| float *outSamples[2]; | |||||
| uint8_t* decoded_bytes_buffer; | uint8_t* decoded_bytes_buffer; | ||||
| float tempBuf[1070]; | float tempBuf[1070]; | ||||
| //@} | //@} | ||||
| @@ -197,7 +196,7 @@ static int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){ | |||||
| } | } | ||||
| static av_cold int init_atrac3_transforms(ATRAC3Context *q, int is_float) { | |||||
| static av_cold int init_atrac3_transforms(ATRAC3Context *q) { | |||||
| float enc_window[256]; | float enc_window[256]; | ||||
| int i; | int i; | ||||
| @@ -213,7 +212,7 @@ static av_cold int init_atrac3_transforms(ATRAC3Context *q, int is_float) { | |||||
| } | } | ||||
| /* Initialize the MDCT transform. */ | /* Initialize the MDCT transform. */ | ||||
| return ff_mdct_init(&q->mdct_ctx, 9, 1, is_float ? 1.0 / 32768 : 1.0); | |||||
| return ff_mdct_init(&q->mdct_ctx, 9, 1, 1.0 / 32768); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -226,7 +225,6 @@ static av_cold int atrac3_decode_close(AVCodecContext *avctx) | |||||
| av_free(q->pUnits); | av_free(q->pUnits); | ||||
| av_free(q->decoded_bytes_buffer); | av_free(q->decoded_bytes_buffer); | ||||
| av_freep(&q->outSamples[0]); | |||||
| ff_mdct_end(&q->mdct_ctx); | ff_mdct_end(&q->mdct_ctx); | ||||
| @@ -837,8 +835,6 @@ static int atrac3_decode_frame(AVCodecContext *avctx, void *data, | |||||
| ATRAC3Context *q = avctx->priv_data; | ATRAC3Context *q = avctx->priv_data; | ||||
| int result; | int result; | ||||
| const uint8_t* databuf; | const uint8_t* databuf; | ||||
| float *samples_flt; | |||||
| int16_t *samples_s16; | |||||
| if (buf_size < avctx->block_align) { | if (buf_size < avctx->block_align) { | ||||
| av_log(avctx, AV_LOG_ERROR, | av_log(avctx, AV_LOG_ERROR, | ||||
| @@ -852,8 +848,6 @@ static int atrac3_decode_frame(AVCodecContext *avctx, void *data, | |||||
| av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | ||||
| return result; | return result; | ||||
| } | } | ||||
| samples_flt = (float *)q->frame.data[0]; | |||||
| samples_s16 = (int16_t *)q->frame.data[0]; | |||||
| /* Check if we need to descramble and what buffer to pass on. */ | /* Check if we need to descramble and what buffer to pass on. */ | ||||
| if (q->scrambled_stream) { | if (q->scrambled_stream) { | ||||
| @@ -863,27 +857,13 @@ static int atrac3_decode_frame(AVCodecContext *avctx, void *data, | |||||
| databuf = buf; | databuf = buf; | ||||
| } | } | ||||
| if (q->channels == 1 && avctx->sample_fmt == AV_SAMPLE_FMT_FLT) | |||||
| result = decodeFrame(q, databuf, &samples_flt); | |||||
| else | |||||
| result = decodeFrame(q, databuf, q->outSamples); | |||||
| result = decodeFrame(q, databuf, (float **)q->frame.extended_data); | |||||
| if (result != 0) { | if (result != 0) { | ||||
| av_log(NULL,AV_LOG_ERROR,"Frame decoding error!\n"); | av_log(NULL,AV_LOG_ERROR,"Frame decoding error!\n"); | ||||
| return result; | return result; | ||||
| } | } | ||||
| /* interleave */ | |||||
| if (q->channels == 2 && avctx->sample_fmt == AV_SAMPLE_FMT_FLT) { | |||||
| q->fmt_conv.float_interleave(samples_flt, | |||||
| (const float **)q->outSamples, | |||||
| SAMPLES_PER_FRAME, 2); | |||||
| } else if (avctx->sample_fmt == AV_SAMPLE_FMT_S16) { | |||||
| q->fmt_conv.float_to_int16_interleave(samples_s16, | |||||
| (const float **)q->outSamples, | |||||
| SAMPLES_PER_FRAME, q->channels); | |||||
| } | |||||
| *got_frame_ptr = 1; | *got_frame_ptr = 1; | ||||
| *(AVFrame *)data = q->frame; | *(AVFrame *)data = q->frame; | ||||
| @@ -1005,12 +985,9 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) | |||||
| vlcs_initialized = 1; | vlcs_initialized = 1; | ||||
| } | } | ||||
| if (avctx->request_sample_fmt == AV_SAMPLE_FMT_FLT) | |||||
| avctx->sample_fmt = AV_SAMPLE_FMT_FLT; | |||||
| else | |||||
| avctx->sample_fmt = AV_SAMPLE_FMT_S16; | |||||
| avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; | |||||
| if ((ret = init_atrac3_transforms(q, avctx->sample_fmt == AV_SAMPLE_FMT_FLT))) { | |||||
| if ((ret = init_atrac3_transforms(q))) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n"); | av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n"); | ||||
| av_freep(&q->decoded_bytes_buffer); | av_freep(&q->decoded_bytes_buffer); | ||||
| return ret; | return ret; | ||||
| @@ -1048,15 +1025,6 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) | |||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| } | } | ||||
| if (avctx->channels > 1 || avctx->sample_fmt == AV_SAMPLE_FMT_S16) { | |||||
| q->outSamples[0] = av_mallocz(SAMPLES_PER_FRAME * avctx->channels * sizeof(*q->outSamples[0])); | |||||
| q->outSamples[1] = q->outSamples[0] + SAMPLES_PER_FRAME; | |||||
| if (!q->outSamples[0]) { | |||||
| atrac3_decode_close(avctx); | |||||
| return AVERROR(ENOMEM); | |||||
| } | |||||
| } | |||||
| avcodec_get_frame_defaults(&q->frame); | avcodec_get_frame_defaults(&q->frame); | ||||
| avctx->coded_frame = &q->frame; | avctx->coded_frame = &q->frame; | ||||
| @@ -1075,4 +1043,6 @@ AVCodec ff_atrac3_decoder = | |||||
| .decode = atrac3_decode_frame, | .decode = atrac3_decode_frame, | ||||
| .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1, | .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("Atrac 3 (Adaptive TRansform Acoustic Coding 3)"), | .long_name = NULL_IF_CONFIG_SMALL("Atrac 3 (Adaptive TRansform Acoustic Coding 3)"), | ||||
| .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, | |||||
| AV_SAMPLE_FMT_NONE }, | |||||
| }; | }; | ||||