FFmpeg  4.0
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
sanm.c File Reference
#include "libavutil/avassert.h"
#include "libavutil/bswap.h"
#include "libavutil/imgutils.h"
#include "avcodec.h"
#include "bytestream.h"
#include "copy_block.h"
#include "internal.h"

Go to the source code of this file.

Data Structures

struct  SANMVideoContext
 
struct  SANMFrameHeader
 

Macros

#define NGLYPHS   256
 
#define GLYPH_COORD_VECT_SIZE   16
 
#define PALETTE_SIZE   256
 
#define PALETTE_DELTA   768
 

Typedefs

typedef int(* frm_decoder) (SANMVideoContext *ctx)
 

Enumerations

enum  GlyphEdge {
  LEFT_EDGE, TOP_EDGE, RIGHT_EDGE, BOTTOM_EDGE,
  NO_EDGE
}
 
enum  GlyphDir {
  DIR_LEFT, DIR_UP, DIR_RIGHT, DIR_DOWN,
  NO_DIR
}
 

Functions

static enum GlyphEdge which_edge (int x, int y, int edge_size)
 Return enum GlyphEdge of box where point (x, y) lies. More...
 
static enum GlyphDir which_direction (enum GlyphEdge edge0, enum GlyphEdge edge1)
 
static void interp_point (int8_t *points, int x0, int y0, int x1, int y1, int pos, int npoints)
 
static void make_glyphs (int8_t *pglyphs, const int8_t *xvec, const int8_t *yvec, const int side_length)
 Construct glyphs by iterating through vector coordinates. More...
 
static void init_sizes (SANMVideoContext *ctx, int width, int height)
 
static void destroy_buffers (SANMVideoContext *ctx)
 
static av_cold int init_buffers (SANMVideoContext *ctx)
 
static void rotate_bufs (SANMVideoContext *ctx, int rotate_code)
 
static av_cold int decode_init (AVCodecContext *avctx)
 
static av_cold int decode_end (AVCodecContext *avctx)
 
static int rle_decode (SANMVideoContext *ctx, uint8_t *dst, const int out_size)
 
static int old_codec1 (SANMVideoContext *ctx, int top, int left, int width, int height)
 
static void codec37_mv (uint8_t *dst, const uint8_t *src, int height, int stride, int x, int y)
 
static int old_codec37 (SANMVideoContext *ctx, int top, int left, int width, int height)
 
static int process_block (SANMVideoContext *ctx, uint8_t *dst, uint8_t *prev1, uint8_t *prev2, int stride, int tbl, int size)
 
static int old_codec47 (SANMVideoContext *ctx, int top, int left, int width, int height)
 
static int process_frame_obj (SANMVideoContext *ctx)
 
static int decode_0 (SANMVideoContext *ctx)
 
static int decode_nop (SANMVideoContext *ctx)
 
static void copy_block (uint16_t *pdest, uint16_t *psrc, int block_size, ptrdiff_t pitch)
 
static void fill_block (uint16_t *pdest, uint16_t color, int block_size, ptrdiff_t pitch)
 
static int draw_glyph (SANMVideoContext *ctx, uint16_t *dst, int index, uint16_t fg_color, uint16_t bg_color, int block_size, ptrdiff_t pitch)
 
static int opcode_0xf7 (SANMVideoContext *ctx, int cx, int cy, int block_size, ptrdiff_t pitch)
 
static int opcode_0xf8 (SANMVideoContext *ctx, int cx, int cy, int block_size, ptrdiff_t pitch)
 
static int good_mvec (SANMVideoContext *ctx, int cx, int cy, int mx, int my, int block_size)
 
static int codec2subblock (SANMVideoContext *ctx, int cx, int cy, int blk_size)
 
static int decode_2 (SANMVideoContext *ctx)
 
static int decode_3 (SANMVideoContext *ctx)
 
static int decode_4 (SANMVideoContext *ctx)
 
static int decode_5 (SANMVideoContext *ctx)
 
static int decode_6 (SANMVideoContext *ctx)
 
static int decode_8 (SANMVideoContext *ctx)
 
static int read_frame_header (SANMVideoContext *ctx, SANMFrameHeader *hdr)
 
static void fill_frame (uint16_t *pbuf, int buf_size, uint16_t color)
 
static int copy_output (SANMVideoContext *ctx, SANMFrameHeader *hdr)
 
static int decode_frame (AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *pkt)
 

Variables

static const int8_t glyph4_x [GLYPH_COORD_VECT_SIZE]
 
static const int8_t glyph4_y [GLYPH_COORD_VECT_SIZE]
 
static const int8_t glyph8_x [GLYPH_COORD_VECT_SIZE]
 
static const int8_t glyph8_y [GLYPH_COORD_VECT_SIZE]
 
static const int8_t motion_vectors [256][2]
 
static const int8_t c37_mv []
 
static const frm_decoder v1_decoders []
 
AVCodec ff_sanm_decoder
 

Macro Definition Documentation

◆ NGLYPHS

#define NGLYPHS   256

Definition at line 32 of file sanm.c.

Referenced by draw_glyph().

◆ GLYPH_COORD_VECT_SIZE

#define GLYPH_COORD_VECT_SIZE   16

Definition at line 33 of file sanm.c.

Referenced by make_glyphs().

◆ PALETTE_SIZE

#define PALETTE_SIZE   256

Definition at line 34 of file sanm.c.

Referenced by decode_frame(), and decode_init().

◆ PALETTE_DELTA

#define PALETTE_DELTA   768

Definition at line 35 of file sanm.c.

Referenced by decode_frame().

Typedef Documentation

◆ frm_decoder

typedef int(* frm_decoder) (SANMVideoContext *ctx)

Definition at line 1312 of file sanm.c.

Enumeration Type Documentation

◆ GlyphEdge

enum GlyphEdge
Enumerator
LEFT_EDGE 
TOP_EDGE 
RIGHT_EDGE 
BOTTOM_EDGE 
NO_EDGE 

Definition at line 303 of file sanm.c.

◆ GlyphDir

enum GlyphDir
Enumerator
DIR_LEFT 
DIR_UP 
DIR_RIGHT 
DIR_DOWN 
NO_DIR 

Definition at line 311 of file sanm.c.

Function Documentation

◆ which_edge()

static enum GlyphEdge which_edge ( int  x,
int  y,
int  edge_size 
)
static

Return enum GlyphEdge of box where point (x, y) lies.

Parameters
xx point coordinate
yy point coordinate
edge_sizebox width/height.

Definition at line 326 of file sanm.c.

Referenced by make_glyphs().

◆ which_direction()

static enum GlyphDir which_direction ( enum GlyphEdge  edge0,
enum GlyphEdge  edge1 
)
static

Definition at line 342 of file sanm.c.

Referenced by make_glyphs().

◆ interp_point()

static void interp_point ( int8_t *  points,
int  x0,
int  y0,
int  x1,
int  y1,
int  pos,
int  npoints 
)
static

Definition at line 365 of file sanm.c.

Referenced by make_glyphs().

◆ make_glyphs()

static void make_glyphs ( int8_t *  pglyphs,
const int8_t *  xvec,
const int8_t *  yvec,
const int  side_length 
)
static

Construct glyphs by iterating through vector coordinates.

Parameters
pglyphspointer to table where glyphs are stored
xvecpointer to x component of vector coordinates
yvecpointer to y component of vector coordinates
side_lengthglyph width/height.

Definition at line 385 of file sanm.c.

Referenced by decode_init().

◆ init_sizes()

static void init_sizes ( SANMVideoContext ctx,
int  width,
int  height 
)
static

Definition at line 437 of file sanm.c.

Referenced by decode_init(), destroy_buffers(), and process_frame_obj().

◆ destroy_buffers()

static void destroy_buffers ( SANMVideoContext ctx)
static

Definition at line 450 of file sanm.c.

Referenced by decode_end(), and init_buffers().

◆ init_buffers()

static av_cold int init_buffers ( SANMVideoContext ctx)
static

Definition at line 463 of file sanm.c.

Referenced by decode_init(), and process_frame_obj().

◆ rotate_bufs()

static void rotate_bufs ( SANMVideoContext ctx,
int  rotate_code 
)
static

Definition at line 481 of file sanm.c.

Referenced by decode_frame(), and old_codec37().

◆ decode_init()

static av_cold int decode_init ( AVCodecContext avctx)
static

Definition at line 488 of file sanm.c.

◆ decode_end()

static av_cold int decode_end ( AVCodecContext avctx)
static

Definition at line 522 of file sanm.c.

◆ rle_decode()

static int rle_decode ( SANMVideoContext ctx,
uint8_t dst,
const int  out_size 
)
static

Definition at line 531 of file sanm.c.

Referenced by decode_5(), decode_8(), old_codec37(), and old_codec47().

◆ old_codec1()

static int old_codec1 ( SANMVideoContext ctx,
int  top,
int  left,
int  width,
int  height 
)
static

Definition at line 557 of file sanm.c.

Referenced by process_frame_obj().

◆ codec37_mv()

static void codec37_mv ( uint8_t dst,
const uint8_t src,
int  height,
int  stride,
int  x,
int  y 
)
inlinestatic

Definition at line 604 of file sanm.c.

Referenced by old_codec37().

◆ old_codec37()

static int old_codec37 ( SANMVideoContext ctx,
int  top,
int  left,
int  width,
int  height 
)
static

Definition at line 623 of file sanm.c.

Referenced by process_frame_obj().

◆ process_block()

static int process_block ( SANMVideoContext ctx,
uint8_t dst,
uint8_t prev1,
uint8_t prev2,
int  stride,
int  tbl,
int  size 
)
static

Definition at line 769 of file sanm.c.

Referenced by old_codec47().

◆ old_codec47()

static int old_codec47 ( SANMVideoContext ctx,
int  top,
int  left,
int  width,
int  height 
)
static

Definition at line 859 of file sanm.c.

Referenced by process_frame_obj().

◆ process_frame_obj()

static int process_frame_obj ( SANMVideoContext ctx)
static

Definition at line 950 of file sanm.c.

Referenced by decode_frame().

◆ decode_0()

static int decode_0 ( SANMVideoContext ctx)
static

Definition at line 991 of file sanm.c.

◆ decode_nop()

static int decode_nop ( SANMVideoContext ctx)
static

Definition at line 1008 of file sanm.c.

◆ copy_block()

static void copy_block ( uint16_t *  pdest,
uint16_t *  psrc,
int  block_size,
ptrdiff_t  pitch 
)
static

Definition at line 1014 of file sanm.c.

Referenced by codec2subblock().

◆ fill_block()

static void fill_block ( uint16_t *  pdest,
uint16_t  color,
int  block_size,
ptrdiff_t  pitch 
)
static

Definition at line 1033 of file sanm.c.

Referenced by codec2subblock().

◆ draw_glyph()

static int draw_glyph ( SANMVideoContext ctx,
uint16_t *  dst,
int  index,
uint16_t  fg_color,
uint16_t  bg_color,
int  block_size,
ptrdiff_t  pitch 
)
static

Definition at line 1043 of file sanm.c.

Referenced by opcode_0xf7(), and opcode_0xf8().

◆ opcode_0xf7()

static int opcode_0xf7 ( SANMVideoContext ctx,
int  cx,
int  cy,
int  block_size,
ptrdiff_t  pitch 
)
static

Definition at line 1065 of file sanm.c.

Referenced by codec2subblock().

◆ opcode_0xf8()

static int opcode_0xf8 ( SANMVideoContext ctx,
int  cx,
int  cy,
int  block_size,
ptrdiff_t  pitch 
)
static

Definition at line 1099 of file sanm.c.

Referenced by codec2subblock().

◆ good_mvec()

static int good_mvec ( SANMVideoContext ctx,
int  cx,
int  cy,
int  mx,
int  my,
int  block_size 
)
static

Definition at line 1127 of file sanm.c.

Referenced by codec2subblock().

◆ codec2subblock()

static int codec2subblock ( SANMVideoContext ctx,
int  cx,
int  cy,
int  blk_size 
)
static

Definition at line 1143 of file sanm.c.

Referenced by decode_2().

◆ decode_2()

static int decode_2 ( SANMVideoContext ctx)
static

Definition at line 1228 of file sanm.c.

◆ decode_3()

static int decode_3 ( SANMVideoContext ctx)
static

Definition at line 1240 of file sanm.c.

◆ decode_4()

static int decode_4 ( SANMVideoContext ctx)
static

Definition at line 1246 of file sanm.c.

◆ decode_5()

static int decode_5 ( SANMVideoContext ctx)
static

Definition at line 1252 of file sanm.c.

◆ decode_6()

static int decode_6 ( SANMVideoContext ctx)
static

Definition at line 1275 of file sanm.c.

◆ decode_8()

static int decode_8 ( SANMVideoContext ctx)
static

Definition at line 1290 of file sanm.c.

◆ read_frame_header()

static int read_frame_header ( SANMVideoContext ctx,
SANMFrameHeader hdr 
)
static

Definition at line 1319 of file sanm.c.

Referenced by decode_frame().

◆ fill_frame()

static void fill_frame ( uint16_t *  pbuf,
int  buf_size,
uint16_t  color 
)
static

Definition at line 1359 of file sanm.c.

Referenced by decode_frame().

◆ copy_output()

static int copy_output ( SANMVideoContext ctx,
SANMFrameHeader hdr 
)
static

Definition at line 1365 of file sanm.c.

Referenced by decode_frame().

◆ decode_frame()

static int decode_frame ( AVCodecContext avctx,
void data,
int got_frame_ptr,
AVPacket pkt 
)
static

Definition at line 1387 of file sanm.c.

Variable Documentation

◆ glyph4_x

const int8_t glyph4_x[GLYPH_COORD_VECT_SIZE]
static
Initial value:
= {
0, 1, 2, 3, 3, 3, 3, 2, 1, 0, 0, 0, 1, 2, 2, 1
}

Definition at line 37 of file sanm.c.

Referenced by decode_init().

◆ glyph4_y

const int8_t glyph4_y[GLYPH_COORD_VECT_SIZE]
static
Initial value:
= {
0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 2, 1, 1, 1, 2, 2
}

Definition at line 41 of file sanm.c.

Referenced by decode_init().

◆ glyph8_x

const int8_t glyph8_x[GLYPH_COORD_VECT_SIZE]
static
Initial value:
= {
0, 2, 5, 7, 7, 7, 7, 7, 7, 5, 2, 0, 0, 0, 0, 0
}

Definition at line 45 of file sanm.c.

Referenced by decode_init().

◆ glyph8_y

const int8_t glyph8_y[GLYPH_COORD_VECT_SIZE]
static
Initial value:
= {
0, 0, 0, 0, 1, 3, 4, 6, 7, 7, 7, 7, 6, 4, 3, 1
}

Definition at line 49 of file sanm.c.

Referenced by decode_init().

◆ motion_vectors

const int8_t motion_vectors[256][2]
static

Definition at line 53 of file sanm.c.

Referenced by codec2subblock(), and process_block().

◆ c37_mv

const int8_t c37_mv[]
static

Definition at line 107 of file sanm.c.

Referenced by old_codec37().

◆ v1_decoders

const frm_decoder v1_decoders[]
static
Initial value:
= {
}
static int decode_5(SANMVideoContext *ctx)
Definition: sanm.c:1252
static int decode_3(SANMVideoContext *ctx)
Definition: sanm.c:1240
static int decode_nop(SANMVideoContext *ctx)
Definition: sanm.c:1008
static int decode_6(SANMVideoContext *ctx)
Definition: sanm.c:1275
static int decode_2(SANMVideoContext *ctx)
Definition: sanm.c:1228
static int decode_8(SANMVideoContext *ctx)
Definition: sanm.c:1290
static int decode_0(SANMVideoContext *ctx)
Definition: sanm.c:991
static int decode_4(SANMVideoContext *ctx)
Definition: sanm.c:1246

Definition at line 1314 of file sanm.c.

Referenced by decode_frame().

◆ ff_sanm_decoder

AVCodec ff_sanm_decoder
Initial value:
= {
.name = "sanm",
.long_name = NULL_IF_CONFIG_SMALL("LucasArts SANM/Smush video"),
.priv_data_size = sizeof(SANMVideoContext),
.close = decode_end,
.capabilities = AV_CODEC_CAP_DR1,
}
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *pkt)
Definition: sanm.c:1387
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:42
static av_cold int decode_init(AVCodecContext *avctx)
Definition: sanm.c:488
static av_cold int decode_end(AVCodecContext *avctx)
Definition: sanm.c:522
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:959

Definition at line 1516 of file sanm.c.