*/
#include "avcodec.h"
+#include "internal.h"
+#include "libavutil/common.h"
/*
* Adapted to libavcodec by Francois Revol <revol@free.fr>
} ChannelData;
typedef struct MACEContext {
- AVFrame frame;
ChannelData chd[2];
} MACEContext;
return current;
}
-static void chomp3(ChannelData *chd, int16_t *output, uint8_t val,
- int tab_idx,
- uint32_t numChannels)
+static void chomp3(ChannelData *chd, int16_t *output, uint8_t val, int tab_idx)
{
int16_t current = read_table(chd, val, tab_idx);
*output = QT_8S_2_16S(current);
}
-static void chomp6(ChannelData *chd, int16_t *output, uint8_t val,
- int tab_idx,
- uint32_t numChannels)
+static void chomp6(ChannelData *chd, int16_t *output, uint8_t val, int tab_idx)
{
int16_t current = read_table(chd, val, tab_idx);
output[0] = QT_8S_2_16S(chd->previous + chd->prev2 -
((chd->prev2-current) >> 2));
- output[numChannels] = QT_8S_2_16S(chd->previous + current +
- ((chd->prev2-current) >> 2));
+ output[1] = QT_8S_2_16S(chd->previous + current +
+ ((chd->prev2-current) >> 2));
chd->prev2 = chd->previous;
chd->previous = current;
}
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;
+ if (avctx->channels > 2 || avctx->channels < 1)
+ return AVERROR(EINVAL);
+ avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
return 0;
}
static int mace_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
+ AVFrame *frame = data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
- int16_t *samples;
+ int16_t **samples;
MACEContext *ctx = avctx->priv_data;
int i, j, k, l, ret;
- int is_mace3 = (avctx->codec_id == CODEC_ID_MACE3);
+ int is_mace3 = (avctx->codec_id == AV_CODEC_ID_MACE3);
/* get output buffer */
- ctx->frame.nb_samples = 3 * (buf_size << (1 - is_mace3)) / avctx->channels;
- if ((ret = avctx->get_buffer(avctx, &ctx->frame)) < 0) {
+ frame->nb_samples = 3 * (buf_size << (1 - is_mace3)) / avctx->channels;
+ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret;
}
- samples = (int16_t *)ctx->frame.data[0];
+ samples = (int16_t **)frame->extended_data;
for(i = 0; i < avctx->channels; i++) {
- int16_t *output = samples + i;
+ int16_t *output = samples[i];
for (j=0; j < buf_size / (avctx->channels << is_mace3); j++)
for (k=0; k < (1 << is_mace3); k++) {
for (l=0; l < 3; l++) {
if (is_mace3)
- chomp3(&ctx->chd[i], output, val[1][l], l,
- avctx->channels);
+ chomp3(&ctx->chd[i], output, val[1][l], l);
else
- chomp6(&ctx->chd[i], output, val[0][l], l,
- avctx->channels);
+ chomp6(&ctx->chd[i], output, val[0][l], l);
- output += avctx->channels << (1-is_mace3);
+ output += 1 << (1-is_mace3);
}
}
}
- *got_frame_ptr = 1;
- *(AVFrame *)data = ctx->frame;
+ *got_frame_ptr = 1;
return buf_size;
}
AVCodec ff_mace3_decoder = {
.name = "mace3",
+ .long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 3:1"),
.type = AVMEDIA_TYPE_AUDIO,
- .id = CODEC_ID_MACE3,
+ .id = AV_CODEC_ID_MACE3,
.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"),
+ .capabilities = AV_CODEC_CAP_DR1,
+ .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
+ AV_SAMPLE_FMT_NONE },
};
AVCodec ff_mace6_decoder = {
.name = "mace6",
+ .long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 6:1"),
.type = AVMEDIA_TYPE_AUDIO,
- .id = CODEC_ID_MACE6,
+ .id = AV_CODEC_ID_MACE6,
.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"),
+ .capabilities = AV_CODEC_CAP_DR1,
+ .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
+ AV_SAMPLE_FMT_NONE },
};
-