} ChannelData;
typedef struct MACEContext {
+ AVFrame frame;
ChannelData chd[2];
} MACEContext;
static av_cold int mace_decode_init(AVCodecContext * avctx)
{
+ MACEContext *ctx = avctx->priv_data;
+
if (avctx->channels > 2)
return -1;
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+
+ avcodec_get_frame_defaults(&ctx->frame);
+ avctx->coded_frame = &ctx->frame;
+
return 0;
}
-static int mace_decode_frame(AVCodecContext *avctx,
- void *data, int *data_size,
- AVPacket *avpkt)
+static int mace_decode_frame(AVCodecContext *avctx, void *data,
+ int *got_frame_ptr, AVPacket *avpkt)
{
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
- int16_t *samples = data;
+ int16_t *samples;
MACEContext *ctx = avctx->priv_data;
- int i, j, k, l;
+ int i, j, k, l, ret;
int is_mace3 = (avctx->codec_id == CODEC_ID_MACE3);
- if (*data_size < (3 * buf_size << (2-is_mace3))) {
- av_log(avctx, AV_LOG_ERROR, "Output buffer too small!\n");
- return -1;
+ /* get output buffer */
+ ctx->frame.nb_samples = 3 * (buf_size << (1 - is_mace3)) / avctx->channels;
+ if ((ret = avctx->get_buffer(avctx, &ctx->frame)) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+ return ret;
}
+ samples = (int16_t *)ctx->frame.data[0];
for(i = 0; i < avctx->channels; i++) {
int16_t *output = samples + i;
}
}
- *data_size = 3 * buf_size << (2-is_mace3);
+ *got_frame_ptr = 1;
+ *(AVFrame *)data = ctx->frame;
return buf_size;
}
.priv_data_size = sizeof(MACEContext),
.init = mace_decode_init,
.decode = mace_decode_frame,
+ .capabilities = CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 3:1"),
};
.priv_data_size = sizeof(MACEContext),
.init = mace_decode_init,
.decode = mace_decode_frame,
+ .capabilities = CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 6:1"),
};