#include <stdlib.h>
#include <string.h>
-#include "libavutil/audioconvert.h"
+#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
+#include "internal.h"
#define VMD_HEADER_SIZE 0x330
#define PALETTE_COUNT 256
}
static int vmdvideo_decode_frame(AVCodecContext *avctx,
- void *data, int *data_size,
+ void *data, int *got_frame,
AVPacket *avpkt)
{
const uint8_t *buf = avpkt->data;
return buf_size;
s->frame.reference = 1;
- if (avctx->get_buffer(avctx, &s->frame)) {
+ if (ff_get_buffer(avctx, &s->frame)) {
av_log(s->avctx, AV_LOG_ERROR, "VMD Video: get_buffer() failed\n");
return -1;
}
if (s->frame.data[0])
avctx->release_buffer(avctx, &s->frame);
- *data_size = sizeof(AVFrame);
+ *got_frame = 1;
*(AVFrame*)data = s->prev_frame;
/* report that the buffer was completely consumed */
#define BLOCK_TYPE_SILENCE 3
typedef struct VmdAudioContext {
- AVFrame frame;
int out_bps;
int chunk_size;
} VmdAudioContext;
s->chunk_size = avctx->block_align + avctx->channels * (s->out_bps == 2);
- avcodec_get_frame_defaults(&s->frame);
- avctx->coded_frame = &s->frame;
-
av_log(avctx, AV_LOG_DEBUG, "%d channels, %d bits/sample, "
"block align = %d, sample rate = %d\n",
avctx->channels, avctx->bits_per_coded_sample, avctx->block_align,
static int vmdaudio_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
+ AVFrame *frame = data;
const uint8_t *buf = avpkt->data;
const uint8_t *buf_end;
int buf_size = avpkt->size;
audio_chunks = buf_size / s->chunk_size;
/* get output buffer */
- s->frame.nb_samples = ((silent_chunks + audio_chunks) * avctx->block_align) / avctx->channels;
- if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
+ frame->nb_samples = ((silent_chunks + audio_chunks) * avctx->block_align) /
+ avctx->channels;
+ if ((ret = ff_get_buffer(avctx, frame)) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret;
}
- output_samples_u8 = s->frame.data[0];
- output_samples_s16 = (int16_t *)s->frame.data[0];
+ output_samples_u8 = frame->data[0];
+ output_samples_s16 = (int16_t *)frame->data[0];
/* decode silent chunks */
if (silent_chunks > 0) {
}
}
- *got_frame_ptr = 1;
- *(AVFrame *)data = s->frame;
+ *got_frame_ptr = 1;
return avpkt->size;
}