FFmpeg
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Functions | Variables
xan.c File Reference

Xan video decoder for Wing Commander III computer game by Mario Brito (mbrit.nosp@m.o@st.nosp@m.udent.nosp@m..dei.nosp@m..uc.p.nosp@m.t) and Mike Melanson (melan.nosp@m.son@.nosp@m.pcisy.nosp@m.s.ne.nosp@m.t) More...

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

Go to the source code of this file.

Data Structures

struct  XanContext
 

Macros

#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
 

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 *got_frame, 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 (mbrit.nosp@m.o@st.nosp@m.udent.nosp@m..dei.nosp@m..uc.p.nosp@m.t) and Mike Melanson (melan.nosp@m.son@.nosp@m.pcisy.nosp@m.s.ne.nosp@m.t)

The xan_wc3 decoder outputs PAL8 data.

Definition in file xan.c.

Macro Definition Documentation

#define BITSTREAM_READER_LE

Definition at line 39 of file xan.c.

#define RUNTIME_GAMMA   0

Definition at line 43 of file xan.c.

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

Definition at line 45 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 SHOT_TAG   MKTAG('S', 'H', 'O', 'T')

Definition at line 47 of file xan.c.

Referenced by xan_decode_frame().

#define PALETTE_COUNT   256

Definition at line 48 of file xan.c.

Referenced by xan_decode_frame().

#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().

Function Documentation

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
destdestination 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_output_pixel_run ( XanContext s,
const unsigned char *  pixel_buffer,
int  x,
int  y,
int  pixel_count 
)
inlinestatic

Definition at line 192 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 
)
inlinestatic

Definition at line 222 of file xan.c.

Referenced by xan_wc3_decode_frame().

static int xan_wc3_decode_frame ( XanContext s)
static

Definition at line 273 of file xan.c.

Referenced by xan_decode_frame().

static int xan_decode_frame ( AVCodecContext avctx,
void data,
int *  got_frame,
AVPacket avpkt 
)
static

Definition at line 517 of file xan.c.

static av_cold int xan_decode_end ( AVCodecContext avctx)
static

Definition at line 621 of file xan.c.

Variable Documentation

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 481 of file xan.c.

AVCodec ff_xan_wc3_decoder
Initial value:
= {
.name = "xan_wc3",
.priv_data_size = sizeof(XanContext),
.capabilities = CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("Wing Commander III / Xan"),
}

Definition at line 638 of file xan.c.