*/
/**
- * @file xan.c
+ * @file libavcodec/xan.c
* Xan video decoder for Wing Commander III computer game
* by Mario Brito (mbrito@student.dei.uc.pt)
* and Mike Melanson (melanson@pcisys.net)
#include <string.h>
#include <unistd.h>
+#include "libavutil/intreadwrite.h"
#include "avcodec.h"
typedef struct XanContext {
} XanContext;
-static int xan_decode_init(AVCodecContext *avctx)
+static av_cold int xan_decode_init(AVCodecContext *avctx)
{
XanContext *s = avctx->priv_data;
size = opcode & 3;
if (dest + size > dest_end)
return;
- bytecopy(dest, src, size); dest += size; src += size;
+ memcpy(dest, src, size); dest += size; src += size;
size = ((opcode & 0x1c) >> 2) + 3;
if (dest + size > dest_end)
size = byte1 >> 6;
if (dest + size > dest_end)
return;
- bytecopy (dest, src, size); dest += size; src += size;
+ memcpy(dest, src, size); dest += size; src += size;
size = (opcode & 0x3f) + 4;
if (dest + size > dest_end)
size = opcode & 3;
if (dest + size > dest_end)
return;
- bytecopy (dest, src, size); dest += size; src += size;
+ memcpy(dest, src, size); dest += size; src += size;
size = byte3 + 5 + ((opcode & 0xc) << 6);
if (dest + size > dest_end)
if (dest + size > dest_end)
return;
- bytecopy (dest, src, size); dest += size; src += size;
+ memcpy(dest, src, size); dest += size; src += size;
}
}
size = opcode & 3;
- bytecopy(dest, src, size); dest += size; src += size;
+ memcpy(dest, src, size); dest += size; src += size;
}
static inline void xan_wc3_output_pixel_run(XanContext *s,
static int xan_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
- const uint8_t *buf, int buf_size)
+ AVPacket *avpkt)
{
+ const uint8_t *buf = avpkt->data;
+ int buf_size = avpkt->size;
XanContext *s = avctx->priv_data;
AVPaletteControl *palette_control = avctx->palctrl;
if (s->last_frame.data[0])
avctx->release_buffer(avctx, &s->last_frame);
- /* shuffle frames */
- s->last_frame = s->current_frame;
-
*data_size = sizeof(AVFrame);
*(AVFrame*)data = s->current_frame;
+ /* shuffle frames */
+ FFSWAP(AVFrame, s->current_frame, s->last_frame);
+
/* always report that the buffer was completely consumed */
return buf_size;
}
-static int xan_decode_end(AVCodecContext *avctx)
+static av_cold int xan_decode_end(AVCodecContext *avctx)
{
XanContext *s = avctx->priv_data;
- /* release the last frame */
+ /* release the frames */
if (s->last_frame.data[0])
avctx->release_buffer(avctx, &s->last_frame);
+ if (s->current_frame.data[0])
+ avctx->release_buffer(avctx, &s->current_frame);
av_free(s->buffer1);
av_free(s->buffer2);
xan_decode_end,
xan_decode_frame,
CODEC_CAP_DR1,
+ .long_name = NULL_IF_CONFIG_SMALL("Wing Commander III / Xan"),
};
/*