diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-12-23 17:05:40 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2013-02-12 12:21:21 -0500 |
commit | 5932e2d7d2c0b2d6a3a6184e964e923fb7a9d076 (patch) | |
tree | 40e2963ca250222f87dfe63c8ae0a00823c6b4c7 | |
parent | da28bb3f4a7c650de7e2b767c69a64433c347fe7 (diff) | |
download | ffmpeg-5932e2d7d2c0b2d6a3a6184e964e923fb7a9d076.tar.gz |
ape: decode directly to the user-provided AVFrame
-rw-r--r-- | libavcodec/apedec.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 61eecfe273..f3635836d0 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -129,7 +129,6 @@ typedef struct APEPredictor { typedef struct APEContext { AVClass *class; ///< class for AVOptions AVCodecContext *avctx; - AVFrame frame; DSPContext dsp; int channels; int samples; ///< samples left to decode in current frame @@ -235,9 +234,6 @@ static av_cold int ape_decode_init(AVCodecContext *avctx) ff_dsputil_init(&s->dsp, avctx); avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO; - avcodec_get_frame_defaults(&s->frame); - avctx->coded_frame = &s->frame; - return 0; filter_alloc_fail: ape_decode_close(avctx); @@ -826,6 +822,7 @@ static void ape_unpack_stereo(APEContext *ctx, int count) static int ape_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { + AVFrame *frame = data; const uint8_t *buf = avpkt->data; APEContext *s = avctx->priv_data; uint8_t *sample8; @@ -909,8 +906,8 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data, s->decoded[1] = s->decoded_buffer + FFALIGN(blockstodecode, 8); /* get output buffer */ - s->frame.nb_samples = blockstodecode; - if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) { + frame->nb_samples = blockstodecode; + if ((ret = ff_get_buffer(avctx, frame)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } @@ -932,21 +929,21 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data, switch (s->bps) { case 8: for (ch = 0; ch < s->channels; ch++) { - sample8 = (uint8_t *)s->frame.data[ch]; + sample8 = (uint8_t *)frame->data[ch]; for (i = 0; i < blockstodecode; i++) *sample8++ = (s->decoded[ch][i] + 0x80) & 0xff; } break; case 16: for (ch = 0; ch < s->channels; ch++) { - sample16 = (int16_t *)s->frame.data[ch]; + sample16 = (int16_t *)frame->data[ch]; for (i = 0; i < blockstodecode; i++) *sample16++ = s->decoded[ch][i]; } break; case 24: for (ch = 0; ch < s->channels; ch++) { - sample24 = (int32_t *)s->frame.data[ch]; + sample24 = (int32_t *)frame->data[ch]; for (i = 0; i < blockstodecode; i++) *sample24++ = s->decoded[ch][i] << 8; } @@ -955,8 +952,7 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data, s->samples -= blockstodecode; - *got_frame_ptr = 1; - *(AVFrame *)data = s->frame; + *got_frame_ptr = 1; return bytes_used; } |