| @@ -169,7 +169,6 @@ typedef struct { | |||
| typedef struct WMAProDecodeCtx { | |||
| /* generic decoder variables */ | |||
| AVCodecContext* avctx; ///< codec context for av_log | |||
| AVFrame frame; ///< AVFrame for decoded output | |||
| AVFloatDSPContext fdsp; | |||
| uint8_t frame_data[MAX_FRAMESIZE + | |||
| FF_INPUT_BUFFER_PADDING_SIZE];///< compressed frame data | |||
| @@ -461,9 +460,6 @@ static av_cold int decode_init(AVCodecContext *avctx) | |||
| avctx->channel_layout = channel_mask; | |||
| avcodec_get_frame_defaults(&s->frame); | |||
| avctx->coded_frame = &s->frame; | |||
| return 0; | |||
| } | |||
| @@ -1293,7 +1289,7 @@ static int decode_subframe(WMAProDecodeCtx *s) | |||
| *@return 0 if the trailer bit indicates that this is the last frame, | |||
| * 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; | |||
| GetBitContext* gb = &s->gb; | |||
| @@ -1366,8 +1362,8 @@ static int decode_frame(WMAProDecodeCtx *s, int *got_frame_ptr) | |||
| } | |||
| /* get output buffer */ | |||
| s->frame.nb_samples = s->samples_per_frame; | |||
| if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) { | |||
| frame->nb_samples = s->samples_per_frame; | |||
| if ((ret = ff_get_buffer(avctx, frame)) < 0) { | |||
| av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |||
| s->packet_loss = 1; | |||
| return 0; | |||
| @@ -1375,7 +1371,7 @@ static int decode_frame(WMAProDecodeCtx *s, int *got_frame_ptr) | |||
| /** copy samples to the output buffer */ | |||
| 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)); | |||
| for (i = 0; i < avctx->channels; i++) { | |||
| @@ -1543,7 +1539,7 @@ static int decode_packet(AVCodecContext *avctx, void *data, | |||
| /** decode the cross packet frame if it is valid */ | |||
| 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) { | |||
| av_dlog(avctx, "ignoring %x previously saved bits\n", | |||
| s->num_saved_bits - s->frame_offset); | |||
| @@ -1566,7 +1562,7 @@ static int decode_packet(AVCodecContext *avctx, void *data, | |||
| (frame_size = show_bits(gb, s->log2_frame_size)) && | |||
| frame_size <= remaining_bits(s, gb)) { | |||
| 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 | |||
| && s->num_saved_bits > get_bits_count(&s->gb)) { | |||
| /** when the frames do not have a length prefix, we don't know | |||
| @@ -1576,7 +1572,7 @@ static int decode_packet(AVCodecContext *avctx, void *data, | |||
| therefore we save the incoming packet first, then we append | |||
| the "previous frame" data from the next packet so that | |||
| 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 | |||
| s->packet_done = 1; | |||
| } | |||
| @@ -1592,9 +1588,6 @@ static int decode_packet(AVCodecContext *avctx, void *data, | |||
| if (s->packet_loss) | |||
| return AVERROR_INVALIDDATA; | |||
| if (*got_frame_ptr) | |||
| *(AVFrame *)data = s->frame; | |||
| return get_bits_count(gb) >> 3; | |||
| } | |||