libavcodec/xan.c File Reference

Xan video decoder for Wing Commander III computer game by Mario Brito (mbrito@student.dei.uc.pt) and Mike Melanson (melanson@pcisys.net). More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
#include "bytestream.h"
#include "get_bits.h"
#include "libavutil/lzo.h"

Go to the source code of this file.

Data Structures

struct  XanContext

Defines

#define BITSTREAM_READER_LE
#define RUNTIME_GAMMA   0
#define VGA__TAG   MKTAG('V', 'G', 'A', ' ')
#define PALT_TAG   MKTAG('P', 'A', 'L', 'T')
#define SHOT_TAG   MKTAG('S', 'H', 'O', 'T')
#define PALETTE_COUNT   256
#define PALETTE_SIZE   (PALETTE_COUNT * 3)
#define PALETTES_MAX   256

Typedefs

typedef struct XanContext XanContext

Functions

static av_cold int xan_decode_init (AVCodecContext *avctx)
static int xan_huffman_decode (unsigned char *dest, int dest_len, const unsigned char *src, int src_len)
static void xan_unpack (unsigned char *dest, int dest_len, const unsigned char *src, int src_len)
 unpack simple compression
static void xan_wc3_output_pixel_run (XanContext *s, const unsigned char *pixel_buffer, int x, int y, int pixel_count)
static void xan_wc3_copy_pixel_run (XanContext *s, int x, int y, int pixel_count, int motion_x, int motion_y)
static int xan_wc3_decode_frame (XanContext *s)
static int xan_decode_frame (AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
static av_cold int xan_decode_end (AVCodecContext *avctx)

Variables

static const uint8_t gamma_lookup [256]
 This is a gamma correction that xan3 applies to all palette entries.
AVCodec ff_xan_wc3_decoder

Detailed Description

Xan video decoder for Wing Commander III computer game by Mario Brito (mbrito@student.dei.uc.pt) and Mike Melanson (melanson@pcisys.net).

The xan_wc3 decoder outputs PAL8 data.

Definition in file xan.c.


Define Documentation

#define BITSTREAM_READER_LE

Definition at line 38 of file xan.c.

#define PALETTE_COUNT   256

Definition at line 48 of file xan.c.

#define PALETTE_SIZE   (PALETTE_COUNT * 3)

Definition at line 49 of file xan.c.

Referenced by xan_decode_frame().

#define PALETTES_MAX   256

Definition at line 50 of file xan.c.

Referenced by xan_decode_frame().

#define PALT_TAG   MKTAG('P', 'A', 'L', 'T')

Definition at line 46 of file xan.c.

Referenced by xan_decode_frame().

#define RUNTIME_GAMMA   0

Definition at line 43 of file xan.c.

#define SHOT_TAG   MKTAG('S', 'H', 'O', 'T')

Definition at line 47 of file xan.c.

Referenced by xan_decode_frame().

#define VGA__TAG   MKTAG('V', 'G', 'A', ' ')

Definition at line 45 of file xan.c.

Referenced by xan_decode_frame().


Typedef Documentation

typedef struct XanContext XanContext

Function Documentation

static av_cold int xan_decode_end ( AVCodecContext avctx  )  [static]

Definition at line 601 of file xan.c.

static int xan_decode_frame ( AVCodecContext avctx,
void *  data,
int *  data_size,
AVPacket avpkt 
) [static]

Definition at line 497 of file xan.c.

static av_cold int xan_decode_init ( AVCodecContext avctx  )  [static]

Definition at line 75 of file xan.c.

static int xan_huffman_decode ( unsigned char *  dest,
int  dest_len,
const unsigned char *  src,
int  src_len 
) [static]

Definition at line 100 of file xan.c.

Referenced by xan_wc3_decode_frame().

static void xan_unpack ( unsigned char *  dest,
int  dest_len,
const unsigned char *  src,
int  src_len 
) [static]

unpack simple compression

Parameters:
dest destination buffer of dest_len, must be padded with at least 130 bytes

Definition at line 138 of file xan.c.

Referenced by xan_wc3_decode_frame().

static void xan_wc3_copy_pixel_run ( XanContext s,
int  x,
int  y,
int  pixel_count,
int  motion_x,
int  motion_y 
) [inline, static]

Definition at line 219 of file xan.c.

Referenced by xan_wc3_decode_frame().

static int xan_wc3_decode_frame ( XanContext s  )  [static]

Definition at line 270 of file xan.c.

Referenced by xan_decode_frame().

static void xan_wc3_output_pixel_run ( XanContext s,
const unsigned char *  pixel_buffer,
int  x,
int  y,
int  pixel_count 
) [inline, static]

Definition at line 189 of file xan.c.

Referenced by xan_wc3_decode_frame().


Variable Documentation

Initial value:
 {
    .name           = "xan_wc3",
    .type           = AVMEDIA_TYPE_VIDEO,
    .id             = CODEC_ID_XAN_WC3,
    .priv_data_size = sizeof(XanContext),
    .init           = xan_decode_init,
    .close          = xan_decode_end,
    .decode         = xan_decode_frame,
    .capabilities   = CODEC_CAP_DR1,
    .long_name      = NULL_IF_CONFIG_SMALL("Wing Commander III / Xan"),
}

Definition at line 618 of file xan.c.

const uint8_t gamma_lookup[256] [static]

This is a gamma correction that xan3 applies to all palette entries.

There is a peculiarity, namely that the values are clamped to 253 - it seems likely that this table was calculated by a buggy fixed-point implementation, the one above under RUNTIME_GAMMA behaves like this for example. The exponent value of 0.8 can be explained by this as well, since 0.8 = 4/5 and thus pow(x, 0.8) is still easy to calculate. Also, the input values are first rotated to the left by 2.

Definition at line 461 of file xan.c.