Merge commit '205a95f7b5178362874bc1e65eae9866723491c1'

* commit '205a95f7b5178362874bc1e65eae9866723491c1':
  wmaenc: alloc/free coded_frame instead of keeping it in the WMACodecContext
  wma: decode directly to the user-provided AVFrame
  wmapro: decode directly to the user-provided AVFrame
  wavpack: decode directly to the user-provided AVFrame

Conflicts:
	libavcodec/wavpack.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2013-02-13 12:49:48 +01:00
commit 0dff771f31
6 changed files with 27 additions and 39 deletions

View File

@ -129,7 +129,6 @@ typedef struct WavpackFrameContext {
typedef struct WavpackContext { typedef struct WavpackContext {
AVCodecContext *avctx; AVCodecContext *avctx;
AVFrame frame;
WavpackFrameContext *fdec[WV_MAX_FRAME_DECODERS]; WavpackFrameContext *fdec[WV_MAX_FRAME_DECODERS];
int fdec_num; int fdec_num;
@ -741,9 +740,6 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx)
s->fdec_num = 0; s->fdec_num = 0;
avcodec_get_frame_defaults(&s->frame);
avctx->coded_frame = &s->frame;
return 0; return 0;
} }
@ -1183,6 +1179,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
WavpackContext *s = avctx->priv_data; WavpackContext *s = avctx->priv_data;
const uint8_t *buf = avpkt->data; const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size; int buf_size = avpkt->size;
AVFrame *frame = data;
int frame_size, ret, frame_flags; int frame_size, ret, frame_flags;
int samplecount = 0; int samplecount = 0;
@ -1218,12 +1215,12 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
} }
/* get output buffer */ /* get output buffer */
s->frame.nb_samples = s->samples + 1; frame->nb_samples = s->samples + 1;
if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) { if ((ret = ff_get_buffer(avctx, frame)) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret; return ret;
} }
s->frame.nb_samples = s->samples; frame->nb_samples = s->samples;
while (buf_size > 0) { while (buf_size > 0) {
if (!s->multichannel) { if (!s->multichannel) {
@ -1244,7 +1241,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if ((samplecount = wavpack_decode_block(avctx, s->block, if ((samplecount = wavpack_decode_block(avctx, s->block,
s->frame.data[0], got_frame_ptr, frame->data[0], got_frame_ptr,
buf, frame_size)) < 0) { buf, frame_size)) < 0) {
wavpack_decode_flush(avctx); wavpack_decode_flush(avctx);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
@ -1253,9 +1250,6 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
buf += frame_size; buf_size -= frame_size; buf += frame_size; buf_size -= frame_size;
} }
if (*got_frame_ptr)
*(AVFrame *)data = s->frame;
return avpkt->size; return avpkt->size;
} }

View File

@ -390,6 +390,11 @@ int ff_wma_end(AVCodecContext *avctx)
av_free(s->int_table[i]); av_free(s->int_table[i]);
} }
#if FF_API_OLD_ENCODE_AUDIO
if (av_codec_is_encoder(avctx->codec))
av_freep(&avctx->coded_frame);
#endif
return 0; return 0;
} }

View File

@ -66,7 +66,6 @@ typedef struct CoefVLCTable {
typedef struct WMACodecContext { typedef struct WMACodecContext {
AVCodecContext* avctx; AVCodecContext* avctx;
AVFrame frame;
GetBitContext gb; GetBitContext gb;
PutBitContext pb; PutBitContext pb;
int version; ///< 1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2) int version; ///< 1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2)

View File

@ -117,9 +117,6 @@ static int wma_decode_init(AVCodecContext * avctx)
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
avcodec_get_frame_defaults(&s->frame);
avctx->coded_frame = &s->frame;
return 0; return 0;
} }
@ -800,6 +797,7 @@ static int wma_decode_frame(WMACodecContext *s, float **samples,
static int wma_decode_superframe(AVCodecContext *avctx, void *data, static int wma_decode_superframe(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt) int *got_frame_ptr, AVPacket *avpkt)
{ {
AVFrame *frame = data;
const uint8_t *buf = avpkt->data; const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size; int buf_size = avpkt->size;
WMACodecContext *s = avctx->priv_data; WMACodecContext *s = avctx->priv_data;
@ -834,12 +832,12 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
} }
/* get output buffer */ /* get output buffer */
s->frame.nb_samples = nb_frames * s->frame_len; frame->nb_samples = nb_frames * s->frame_len;
if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) { if ((ret = ff_get_buffer(avctx, frame)) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret; return ret;
} }
samples = (float **)s->frame.extended_data; samples = (float **)frame->extended_data;
samples_offset = 0; samples_offset = 0;
if (s->use_bit_reservoir) { if (s->use_bit_reservoir) {
@ -918,8 +916,7 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data,
s->frame_len_bits, s->block_len_bits, s->frame_len, s->block_len, s->frame_len_bits, s->block_len_bits, s->frame_len, s->block_len,
(int8_t *)samples - (int8_t *)data, avctx->block_align); (int8_t *)samples - (int8_t *)data, avctx->block_align);
*got_frame_ptr = 1; *got_frame_ptr = 1;
*(AVFrame *)data = s->frame;
return buf_size; return buf_size;
fail: fail:

View File

@ -50,6 +50,11 @@ static int encode_init(AVCodecContext * avctx){
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
#if FF_API_OLD_ENCODE_AUDIO
if (!(avctx->coded_frame = avcodec_alloc_frame()))
return AVERROR(ENOMEM);
#endif
/* extract flag infos */ /* extract flag infos */
flags1 = 0; flags1 = 0;
flags2 = 1; flags2 = 1;
@ -85,11 +90,6 @@ static int encode_init(AVCodecContext * avctx){
avctx->frame_size = avctx->delay = s->frame_len; avctx->frame_size = avctx->delay = s->frame_len;
#if FF_API_OLD_ENCODE_AUDIO
avctx->coded_frame = &s->frame;
avcodec_get_frame_defaults(avctx->coded_frame);
#endif
return 0; return 0;
} }

View File

@ -169,7 +169,6 @@ typedef struct {
typedef struct WMAProDecodeCtx { typedef struct WMAProDecodeCtx {
/* generic decoder variables */ /* generic decoder variables */
AVCodecContext* avctx; ///< codec context for av_log AVCodecContext* avctx; ///< codec context for av_log
AVFrame frame; ///< AVFrame for decoded output
AVFloatDSPContext fdsp; AVFloatDSPContext fdsp;
uint8_t frame_data[MAX_FRAMESIZE + uint8_t frame_data[MAX_FRAMESIZE +
FF_INPUT_BUFFER_PADDING_SIZE];///< compressed frame data FF_INPUT_BUFFER_PADDING_SIZE];///< compressed frame data
@ -471,9 +470,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
avctx->channel_layout = channel_mask; avctx->channel_layout = channel_mask;
avcodec_get_frame_defaults(&s->frame);
avctx->coded_frame = &s->frame;
return 0; return 0;
} }
@ -1304,7 +1300,7 @@ static int decode_subframe(WMAProDecodeCtx *s)
*@return 0 if the trailer bit indicates that this is the last frame, *@return 0 if the trailer bit indicates that this is the last frame,
* 1 if there are additional frames * 1 if there are additional frames
*/ */
static int decode_frame(WMAProDecodeCtx *s, int *got_frame_ptr) static int decode_frame(WMAProDecodeCtx *s, AVFrame *frame, int *got_frame_ptr)
{ {
AVCodecContext *avctx = s->avctx; AVCodecContext *avctx = s->avctx;
GetBitContext* gb = &s->gb; GetBitContext* gb = &s->gb;
@ -1377,8 +1373,8 @@ static int decode_frame(WMAProDecodeCtx *s, int *got_frame_ptr)
} }
/* get output buffer */ /* get output buffer */
s->frame.nb_samples = s->samples_per_frame; frame->nb_samples = s->samples_per_frame;
if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) { if ((ret = ff_get_buffer(avctx, frame)) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
s->packet_loss = 1; s->packet_loss = 1;
return 0; return 0;
@ -1386,7 +1382,7 @@ static int decode_frame(WMAProDecodeCtx *s, int *got_frame_ptr)
/** copy samples to the output buffer */ /** copy samples to the output buffer */
for (i = 0; i < avctx->channels; i++) for (i = 0; i < avctx->channels; i++)
memcpy(s->frame.extended_data[i], s->channel[i].out, memcpy(frame->extended_data[i], s->channel[i].out,
s->samples_per_frame * sizeof(*s->channel[i].out)); s->samples_per_frame * sizeof(*s->channel[i].out));
for (i = 0; i < avctx->channels; i++) { for (i = 0; i < avctx->channels; i++) {
@ -1554,7 +1550,7 @@ static int decode_packet(AVCodecContext *avctx, void *data,
/** decode the cross packet frame if it is valid */ /** decode the cross packet frame if it is valid */
if (!s->packet_loss) if (!s->packet_loss)
decode_frame(s, got_frame_ptr); decode_frame(s, data, got_frame_ptr);
} else if (s->num_saved_bits - s->frame_offset) { } else if (s->num_saved_bits - s->frame_offset) {
av_dlog(avctx, "ignoring %x previously saved bits\n", av_dlog(avctx, "ignoring %x previously saved bits\n",
s->num_saved_bits - s->frame_offset); s->num_saved_bits - s->frame_offset);
@ -1577,7 +1573,7 @@ static int decode_packet(AVCodecContext *avctx, void *data,
(frame_size = show_bits(gb, s->log2_frame_size)) && (frame_size = show_bits(gb, s->log2_frame_size)) &&
frame_size <= remaining_bits(s, gb)) { frame_size <= remaining_bits(s, gb)) {
save_bits(s, gb, frame_size, 0); save_bits(s, gb, frame_size, 0);
s->packet_done = !decode_frame(s, got_frame_ptr); s->packet_done = !decode_frame(s, data, got_frame_ptr);
} else if (!s->len_prefix } else if (!s->len_prefix
&& s->num_saved_bits > get_bits_count(&s->gb)) { && s->num_saved_bits > get_bits_count(&s->gb)) {
/** when the frames do not have a length prefix, we don't know /** when the frames do not have a length prefix, we don't know
@ -1587,7 +1583,7 @@ static int decode_packet(AVCodecContext *avctx, void *data,
therefore we save the incoming packet first, then we append therefore we save the incoming packet first, then we append
the "previous frame" data from the next packet so that the "previous frame" data from the next packet so that
we get a buffer that only contains full frames */ we get a buffer that only contains full frames */
s->packet_done = !decode_frame(s, got_frame_ptr); s->packet_done = !decode_frame(s, data, got_frame_ptr);
} else } else
s->packet_done = 1; s->packet_done = 1;
} }
@ -1603,9 +1599,6 @@ static int decode_packet(AVCodecContext *avctx, void *data,
if (s->packet_loss) if (s->packet_loss)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
if (*got_frame_ptr)
*(AVFrame *)data = s->frame;
return get_bits_count(gb) >> 3; return get_bits_count(gb) >> 3;
} }