diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-12-23 20:02:46 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2013-02-12 12:22:39 -0500 |
commit | 4a2b26fc1b1ad123eba473a20e270f2b0ba92bca (patch) | |
tree | b2f55fdbb93dabd03f63bd94d61cfd14b4f5aaf7 /libavcodec/takdec.c | |
parent | 903b62cc0b883094b3e0330c7fe87ca4a5ace91e (diff) | |
download | ffmpeg-4a2b26fc1b1ad123eba473a20e270f2b0ba92bca.tar.gz |
tak: decode directly to the user-provided AVFrame
Diffstat (limited to 'libavcodec/takdec.c')
-rw-r--r-- | libavcodec/takdec.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/libavcodec/takdec.c b/libavcodec/takdec.c index 1a2cc3bed7..48a424ebb7 100644 --- a/libavcodec/takdec.c +++ b/libavcodec/takdec.c @@ -45,7 +45,6 @@ typedef struct MCDParam { typedef struct TAKDecContext { AVCodecContext *avctx; // parent AVCodecContext - AVFrame frame; // AVFrame for decoded output DSPContext dsp; TAKStreamInfo ti; GetBitContext gb; // bitstream reader initialized to start at the current frame @@ -176,8 +175,6 @@ static av_cold int tak_decode_init(AVCodecContext *avctx) ff_dsputil_init(&s->dsp, avctx); s->avctx = avctx; - avcodec_get_frame_defaults(&s->frame); - avctx->coded_frame = &s->frame; set_sample_rate_params(avctx); @@ -675,6 +672,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *pkt) { TAKDecContext *s = avctx->priv_data; + AVFrame *frame = data; GetBitContext *gb = &s->gb; int chan, i, ret, hsize; @@ -741,8 +739,8 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, s->nb_samples = s->ti.last_frame_samples ? s->ti.last_frame_samples : s->ti.frame_samples; - s->frame.nb_samples = s->nb_samples; - if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) + frame->nb_samples = s->nb_samples; + if ((ret = ff_get_buffer(avctx, frame)) < 0) return ret; if (avctx->bits_per_coded_sample <= 16) { @@ -759,7 +757,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, return ret; } else { for (chan = 0; chan < avctx->channels; chan++) - s->decoded[chan] = (int32_t *)s->frame.extended_data[chan]; + s->decoded[chan] = (int32_t *)frame->extended_data[chan]; } if (s->nb_samples < 16) { @@ -877,7 +875,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, switch (avctx->sample_fmt) { case AV_SAMPLE_FMT_U8P: for (chan = 0; chan < avctx->channels; chan++) { - uint8_t *samples = (uint8_t *)s->frame.extended_data[chan]; + uint8_t *samples = (uint8_t *)frame->extended_data[chan]; int32_t *decoded = s->decoded[chan]; for (i = 0; i < s->nb_samples; i++) samples[i] = decoded[i] + 0x80; @@ -885,7 +883,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, break; case AV_SAMPLE_FMT_S16P: for (chan = 0; chan < avctx->channels; chan++) { - int16_t *samples = (int16_t *)s->frame.extended_data[chan]; + int16_t *samples = (int16_t *)frame->extended_data[chan]; int32_t *decoded = s->decoded[chan]; for (i = 0; i < s->nb_samples; i++) samples[i] = decoded[i]; @@ -893,15 +891,14 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, break; case AV_SAMPLE_FMT_S32P: for (chan = 0; chan < avctx->channels; chan++) { - int32_t *samples = (int32_t *)s->frame.extended_data[chan]; + int32_t *samples = (int32_t *)frame->extended_data[chan]; for (i = 0; i < s->nb_samples; i++) samples[i] <<= 8; } break; } - *got_frame_ptr = 1; - *(AVFrame *)data = s->frame; + *got_frame_ptr = 1; return pkt->size; } |