diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-12-23 18:45:55 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2013-02-12 12:21:22 -0500 |
commit | 19b2cb268f5eb8fad3c4f6db9e7874dd52c7ad0c (patch) | |
tree | a6034efaf1f9c54535ab8ca69bc0edc167bd436b /libavcodec/libopusdec.c | |
parent | 0cd08367dd6a443b89b7d6d39590ea27269689ad (diff) | |
download | ffmpeg-19b2cb268f5eb8fad3c4f6db9e7874dd52c7ad0c.tar.gz |
libopus: decode directly to the user-provided AVFrame
Diffstat (limited to 'libavcodec/libopusdec.c')
-rw-r--r-- | libavcodec/libopusdec.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/libavcodec/libopusdec.c b/libavcodec/libopusdec.c index 15fa493498..0bf040b33b 100644 --- a/libavcodec/libopusdec.c +++ b/libavcodec/libopusdec.c @@ -32,7 +32,6 @@ struct libopus_context { OpusMSDecoder *dec; - AVFrame frame; }; #define OPUS_HEAD_SIZE 19 @@ -95,8 +94,7 @@ static av_cold int libopus_decode_init(AVCodecContext *avc) opus_strerror(ret)); avc->delay = 3840; /* Decoder delay (in samples) at 48kHz */ - avcodec_get_frame_defaults(&opus->frame); - avc->coded_frame = &opus->frame; + return 0; } @@ -110,14 +108,15 @@ static av_cold int libopus_decode_close(AVCodecContext *avc) #define MAX_FRAME_SIZE (960 * 6) -static int libopus_decode(AVCodecContext *avc, void *frame, +static int libopus_decode(AVCodecContext *avc, void *data, int *got_frame_ptr, AVPacket *pkt) { struct libopus_context *opus = avc->priv_data; + AVFrame *frame = data; int ret, nb_samples; - opus->frame.nb_samples = MAX_FRAME_SIZE; - ret = ff_get_buffer(avc, &opus->frame); + frame->nb_samples = MAX_FRAME_SIZE; + ret = ff_get_buffer(avc, frame); if (ret < 0) { av_log(avc, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; @@ -125,12 +124,12 @@ static int libopus_decode(AVCodecContext *avc, void *frame, if (avc->sample_fmt == AV_SAMPLE_FMT_S16) nb_samples = opus_multistream_decode(opus->dec, pkt->data, pkt->size, - (opus_int16 *)opus->frame.data[0], - opus->frame.nb_samples, 0); + (opus_int16 *)frame->data[0], + frame->nb_samples, 0); else nb_samples = opus_multistream_decode_float(opus->dec, pkt->data, pkt->size, - (float *)opus->frame.data[0], - opus->frame.nb_samples, 0); + (float *)frame->data[0], + frame->nb_samples, 0); if (nb_samples < 0) { av_log(avc, AV_LOG_ERROR, "Decoding error: %s\n", @@ -138,9 +137,9 @@ static int libopus_decode(AVCodecContext *avc, void *frame, return ff_opus_error_to_averror(nb_samples); } - opus->frame.nb_samples = nb_samples; - *(AVFrame *)frame = opus->frame; - *got_frame_ptr = 1; + frame->nb_samples = nb_samples; + *got_frame_ptr = 1; + return pkt->size; } |