libavcodec/indeo3.c File Reference

This is a decoder for Intel Indeo Video v3. More...

#include "libavutil/imgutils.h"
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
#include "dsputil.h"
#include "bytestream.h"
#include "get_bits.h"
#include "indeo3data.h"

Go to the source code of this file.

Data Structures

struct  Plane
struct  Cell
struct  Indeo3DecodeContext

Defines

#define BS_8BIT_PEL   (1 << 1)
 8bit pixel bitdepth indicator
#define BS_KEYFRAME   (1 << 2)
 intra frame indicator
#define BS_MV_Y_HALF   (1 << 4)
 vertical mv halfpel resolution indicator
#define BS_MV_X_HALF   (1 << 5)
 horizontal mv halfpel resolution indicator
#define BS_NONREF   (1 << 8)
 nonref (discardable) frame indicator
#define BS_BUFFER   9
 indicates which of two frame buffers should be used
#define CELL_STACK_MAX   20
#define AVG_32(dst, src, ref)   AV_WN32A(dst, ((AV_RN32A(src) + AV_RN32A(ref)) >> 1) & 0x7F7F7F7FUL)
#define AVG_64(dst, src, ref)   AV_WN64A(dst, ((AV_RN64A(src) + AV_RN64A(ref)) >> 1) & 0x7F7F7F7F7F7F7F7FULL)
#define BUFFER_PRECHECK
#define RLE_BLOCK_COPY
#define RLE_BLOCK_COPY_8
#define RLE_LINES_COPY   copy_block4(dst, ref, row_offset, row_offset, num_lines << v_zoom)
#define RLE_LINES_COPY_M10
#define APPLY_DELTA_4
#define APPLY_DELTA_8
#define APPLY_DELTA_1011_INTER
#define SPLIT_CELL(size, new_size)   (new_size) = ((size) > 2) ? ((((size) + 2) >> 2) << 1) : 1
#define UPDATE_BITPOS(n)
#define RESYNC_BITSTREAM
#define CHECK_CELL
#define OS_HDR_ID   MKBETAG('F', 'R', 'M', 'H')

Enumerations

enum  {
  RLE_ESC_F9 = 249, RLE_ESC_FA = 250, RLE_ESC_FB = 251, RLE_ESC_FC = 252,
  RLE_ESC_FD = 253, RLE_ESC_FE = 254, RLE_ESC_FF = 255
}
enum  {
  IV3_NOERR = 0, IV3_BAD_RLE = 1, IV3_BAD_DATA = 2, IV3_BAD_COUNTER = 3,
  IV3_UNSUPPORTED = 4, IV3_OUT_OF_DATA = 5
}
enum  { H_SPLIT = 0, V_SPLIT = 1, INTRA_NULL = 2, INTER_DATA = 3 }

Functions

static av_cold void build_requant_tab (void)
static av_cold int allocate_frame_buffers (Indeo3DecodeContext *ctx, AVCodecContext *avctx)
static av_cold void free_frame_buffers (Indeo3DecodeContext *ctx)
static void copy_cell (Indeo3DecodeContext *ctx, Plane *plane, Cell *cell)
 Copy pixels of the cell(x + mv_x, y + mv_y) from the previous frame into the cell(x, y) in the current frame.
static uint64_t replicate64 (uint64_t a)
static uint32_t replicate32 (uint32_t a)
static void fill_64 (uint8_t *dst, const uint64_t pix, int32_t n, int32_t row_offset)
static int decode_cell_data (Cell *cell, uint8_t *block, uint8_t *ref_block, int pitch, int h_zoom, int v_zoom, int mode, const vqEntry *delta[2], int swap_quads[2], const uint8_t **data_ptr, const uint8_t *last_ptr)
static int decode_cell (Indeo3DecodeContext *ctx, AVCodecContext *avctx, Plane *plane, Cell *cell, const uint8_t *data_ptr, const uint8_t *last_ptr)
 Decode a vector-quantized cell.
static int parse_bintree (Indeo3DecodeContext *ctx, AVCodecContext *avctx, Plane *plane, int code, Cell *ref_cell, const int depth, const int strip_width)
static int decode_plane (Indeo3DecodeContext *ctx, AVCodecContext *avctx, Plane *plane, const uint8_t *data, int32_t data_size, int32_t strip_width)
static int decode_frame_headers (Indeo3DecodeContext *ctx, AVCodecContext *avctx, const uint8_t *buf, int buf_size)
static void output_plane (const Plane *plane, int buf_sel, uint8_t *dst, int dst_pitch)
 Convert and output the current plane.
static av_cold int decode_init (AVCodecContext *avctx)
static int decode_frame (AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
static av_cold int decode_close (AVCodecContext *avctx)

Variables

static uint8_t requant_tab [8][128]
AVCodec ff_indeo3_decoder


Detailed Description

This is a decoder for Intel Indeo Video v3.

It is based on vector quantization, run-length coding and motion compensation. Known container formats: .avi and .mov Known FOURCCs: 'IV31', 'IV32'

See also:
http://wiki.multimedia.cx/index.php?title=Indeo_3

Definition in file indeo3.c.


Define Documentation

#define APPLY_DELTA_1011_INTER

Value:

if (mode == 10) { \
        AV_WN32A(dst                 , \
                 AV_RN32A(dst                 ) + delta_tab->deltas_m10[dyad1]);\
        AV_WN32A(dst + 4             , \
                 AV_RN32A(dst + 4             ) + delta_tab->deltas_m10[dyad2]);\
        AV_WN32A(dst + row_offset    , \
                 AV_RN32A(dst + row_offset    ) + delta_tab->deltas_m10[dyad1]);\
        AV_WN32A(dst + row_offset + 4, \
                 AV_RN32A(dst + row_offset + 4) + delta_tab->deltas_m10[dyad2]);\
    } else { \
        AV_WN16A(dst                 , \
                 AV_RN16A(dst                 ) + delta_tab->deltas[dyad1]);\
        AV_WN16A(dst + 2             , \
                 AV_RN16A(dst + 2             ) + delta_tab->deltas[dyad2]);\
        AV_WN16A(dst + row_offset    , \
                 AV_RN16A(dst + row_offset    ) + delta_tab->deltas[dyad1]);\
        AV_WN16A(dst + row_offset + 2, \
                 AV_RN16A(dst + row_offset + 2) + delta_tab->deltas[dyad2]);\
    }

Definition at line 381 of file indeo3.c.

Referenced by decode_cell_data().

#define APPLY_DELTA_4

Value:

AV_WN16A(dst + line_offset    , AV_RN16A(ref    ) + delta_tab->deltas[dyad1]);\
    AV_WN16A(dst + line_offset + 2, AV_RN16A(ref + 2) + delta_tab->deltas[dyad2]);\
    if (mode >= 3) {\
        if (is_top_of_cell && !cell->ypos) {\
            AV_COPY32(dst, dst + row_offset);\
        } else {\
            AVG_32(dst, ref, dst + row_offset);\
        }\
    }

Definition at line 348 of file indeo3.c.

Referenced by decode_cell_data().

#define APPLY_DELTA_8

Value:

/* apply two 32-bit VQ deltas to next even line */\
    if (is_top_of_cell) { \
        AV_WN32A(dst + row_offset    , \
                 replicate32(AV_RN32A(ref    )) + delta_tab->deltas_m10[dyad1]);\
        AV_WN32A(dst + row_offset + 4, \
                 replicate32(AV_RN32A(ref + 4)) + delta_tab->deltas_m10[dyad2]);\
    } else { \
        AV_WN32A(dst + row_offset    , \
                 AV_RN32A(ref    ) + delta_tab->deltas_m10[dyad1]);\
        AV_WN32A(dst + row_offset + 4, \
                 AV_RN32A(ref + 4) + delta_tab->deltas_m10[dyad2]);\
    } \
    /* odd lines are not coded but rather interpolated/replicated */\
    /* first line of the cell on the top of image? - replicate */\
    /* otherwise - interpolate */\
    if (is_top_of_cell && !cell->ypos) {\
        AV_COPY64(dst, dst + row_offset);\
    } else \
        AVG_64(dst, ref, dst + row_offset);

Definition at line 359 of file indeo3.c.

Referenced by decode_cell_data().

#define AVG_32 ( dst,
src,
ref   )     AV_WN32A(dst, ((AV_RN32A(src) + AV_RN32A(ref)) >> 1) & 0x7F7F7F7FUL)

Definition at line 265 of file indeo3.c.

#define AVG_64 ( dst,
src,
ref   )     AV_WN64A(dst, ((AV_RN64A(src) + AV_RN64A(ref)) >> 1) & 0x7F7F7F7F7F7F7F7FULL)

Definition at line 268 of file indeo3.c.

#define BS_8BIT_PEL   (1 << 1)

8bit pixel bitdepth indicator

Definition at line 54 of file indeo3.c.

Referenced by decode_frame_headers().

#define BS_BUFFER   9

indicates which of two frame buffers should be used

Definition at line 59 of file indeo3.c.

Referenced by decode_frame().

#define BS_KEYFRAME   (1 << 2)

intra frame indicator

Definition at line 55 of file indeo3.c.

Referenced by decode_frame().

#define BS_MV_X_HALF   (1 << 5)

horizontal mv halfpel resolution indicator

Definition at line 57 of file indeo3.c.

Referenced by decode_frame_headers().

#define BS_MV_Y_HALF   (1 << 4)

vertical mv halfpel resolution indicator

Definition at line 56 of file indeo3.c.

Referenced by decode_frame_headers().

#define BS_NONREF   (1 << 8)

nonref (discardable) frame indicator

Definition at line 58 of file indeo3.c.

Referenced by decode_frame().

#define BUFFER_PRECHECK

Value:

if (*data_ptr >= last_ptr) \
    return IV3_OUT_OF_DATA; \

Definition at line 319 of file indeo3.c.

Referenced by decode_cell_data().

#define CELL_STACK_MAX   20

Definition at line 70 of file indeo3.c.

Referenced by decode_plane().

#define CHECK_CELL

Value:

if (curr_cell.xpos + curr_cell.width > (plane->width >> 2) ||               \
        curr_cell.ypos + curr_cell.height > (plane->height >> 2)) {             \
        av_log(avctx, AV_LOG_ERROR, "Invalid cell: x=%d, y=%d, w=%d, h=%d\n",   \
               curr_cell.xpos, curr_cell.ypos, curr_cell.width, curr_cell.height); \
        return AVERROR_INVALIDDATA;                                                              \
    }

Definition at line 703 of file indeo3.c.

Referenced by parse_bintree().

#define OS_HDR_ID   MKBETAG('F', 'R', 'M', 'H')

Definition at line 833 of file indeo3.c.

Referenced by decode_frame_headers().

#define RESYNC_BITSTREAM

Value:

if (ctx->need_resync && !(get_bits_count(&ctx->gb) & 7)) { \
        skip_bits_long(&ctx->gb, ctx->skip_bits);              \
        ctx->skip_bits   = 0;                                  \
        ctx->need_resync = 0;                                  \
    }

Definition at line 696 of file indeo3.c.

Referenced by parse_bintree().

#define RLE_BLOCK_COPY

Value:

if (cell->mv_ptr || !skip_flag) \
        copy_block4(dst, ref, row_offset, row_offset, 4 << v_zoom)

Definition at line 323 of file indeo3.c.

Referenced by decode_cell_data().

#define RLE_BLOCK_COPY_8

Value:

pix64 = AV_RN64A(ref);\
    if (is_first_row) {/* special prediction case: top line of a cell */\
        pix64 = replicate64(pix64);\
        fill_64(dst + row_offset, pix64, 7, row_offset);\
        AVG_64(dst, ref, dst + row_offset);\
    } else \
        fill_64(dst, pix64, 8, row_offset)

Definition at line 327 of file indeo3.c.

Referenced by decode_cell_data().

#define RLE_LINES_COPY   copy_block4(dst, ref, row_offset, row_offset, num_lines << v_zoom)

Definition at line 336 of file indeo3.c.

Referenced by decode_cell_data().

#define RLE_LINES_COPY_M10

Value:

pix64 = AV_RN64A(ref);\
    if (is_top_of_cell) {\
        pix64 = replicate64(pix64);\
        fill_64(dst + row_offset, pix64, (num_lines << 1) - 1, row_offset);\
        AVG_64(dst, ref, dst + row_offset);\
    } else \
        fill_64(dst, pix64, num_lines << 1, row_offset)

Definition at line 339 of file indeo3.c.

Referenced by decode_cell_data().

#define SPLIT_CELL ( size,
new_size   )     (new_size) = ((size) > 2) ? ((((size) + 2) >> 2) << 1) : 1

Definition at line 690 of file indeo3.c.

Referenced by parse_bintree().

#define UPDATE_BITPOS (  ) 

Value:

ctx->skip_bits  += (n); \
    ctx->need_resync = 1

Definition at line 692 of file indeo3.c.

Referenced by parse_bintree().


Enumeration Type Documentation

anonymous enum

Enumerator:
RLE_ESC_F9  same as RLE_ESC_FA + do the same with next block
RLE_ESC_FA  INTRA: skip block, INTER: copy data from reference.
RLE_ESC_FB  apply null delta to N blocks / skip N blocks
RLE_ESC_FC  same as RLE_ESC_FD + do the same with next block
RLE_ESC_FD  apply null delta to all remaining lines of this block
RLE_ESC_FE  apply null delta to all lines up to the 3rd line
RLE_ESC_FF  apply null delta to all lines up to the 2nd line

Definition at line 42 of file indeo3.c.

anonymous enum

Enumerator:
IV3_NOERR 
IV3_BAD_RLE 
IV3_BAD_DATA 
IV3_BAD_COUNTER 
IV3_UNSUPPORTED 
IV3_OUT_OF_DATA 

Definition at line 309 of file indeo3.c.

anonymous enum

Enumerator:
H_SPLIT 
V_SPLIT 
INTRA_NULL 
INTER_DATA 

Definition at line 682 of file indeo3.c.


Function Documentation

static av_cold int allocate_frame_buffers ( Indeo3DecodeContext ctx,
AVCodecContext avctx 
) [static]

Definition at line 149 of file indeo3.c.

Referenced by decode_frame_headers(), and decode_init().

static av_cold void build_requant_tab ( void   )  [static]

Definition at line 117 of file indeo3.c.

Referenced by decode_init().

static void copy_cell ( Indeo3DecodeContext ctx,
Plane plane,
Cell cell 
) [static]

Copy pixels of the cell(x + mv_x, y + mv_y) from the previous frame into the cell(x, y) in the current frame.

Parameters:
ctx pointer to the decoder context
plane pointer to the plane descriptor
cell pointer to the cell descriptor

Definition at line 221 of file indeo3.c.

Referenced by decode_cell(), and parse_bintree().

static int decode_cell ( Indeo3DecodeContext ctx,
AVCodecContext avctx,
Plane plane,
Cell cell,
const uint8_t *  data_ptr,
const uint8_t *  last_ptr 
) [static]

Decode a vector-quantized cell.

It consists of several routines, each of which handles one or more "modes" with which a cell can be encoded.

Parameters:
ctx pointer to the decoder context
avctx ptr to the AVCodecContext
plane pointer to the plane descriptor
cell pointer to the cell descriptor
data_ptr pointer to the compressed data
last_ptr pointer to the last byte to catch reads past end of buffer
Returns:
number of consumed bytes or negative number in case of error

Definition at line 556 of file indeo3.c.

Referenced by parse_bintree().

static int decode_cell_data ( Cell cell,
uint8_t *  block,
uint8_t *  ref_block,
int  pitch,
int  h_zoom,
int  v_zoom,
int  mode,
const vqEntry delta[2],
int  swap_quads[2],
const uint8_t **  data_ptr,
const uint8_t *  last_ptr 
) [static]

Definition at line 403 of file indeo3.c.

Referenced by decode_cell().

static av_cold int decode_close ( AVCodecContext avctx  )  [static]

Definition at line 1055 of file indeo3.c.

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

Definition at line 993 of file indeo3.c.

static int decode_frame_headers ( Indeo3DecodeContext ctx,
AVCodecContext avctx,
const uint8_t *  buf,
int  buf_size 
) [static]

Definition at line 835 of file indeo3.c.

Referenced by decode_frame().

static av_cold int decode_init ( AVCodecContext avctx  )  [static]

Definition at line 975 of file indeo3.c.

static int decode_plane ( Indeo3DecodeContext ctx,
AVCodecContext avctx,
Plane plane,
const uint8_t *  data,
int32_t  data_size,
int32_t  strip_width 
) [static]

Definition at line 799 of file indeo3.c.

static void fill_64 ( uint8_t *  dst,
const uint64_t  pix,
int32_t  n,
int32_t  row_offset 
) [inline, static]

Definition at line 300 of file indeo3.c.

static av_cold void free_frame_buffers ( Indeo3DecodeContext ctx  )  [static]

Definition at line 202 of file indeo3.c.

Referenced by decode_close(), and decode_frame_headers().

static void output_plane ( const Plane plane,
int  buf_sel,
uint8_t *  dst,
int  dst_pitch 
) [static]

Convert and output the current plane.

All pixel values will be upsampled by shifting right by one bit.

Parameters:
[in] plane pointer to the descriptor of the plane being processed
[in] buf_sel indicates which frame buffer the input data stored in
[out] dst pointer to the buffer receiving converted pixels
[in] dst_pitch pitch for moving to the next y line

Definition at line 952 of file indeo3.c.

Referenced by decode_frame(), and render_slice().

static int parse_bintree ( Indeo3DecodeContext ctx,
AVCodecContext avctx,
Plane plane,
int  code,
Cell ref_cell,
const int  depth,
const int  strip_width 
) [static]

Definition at line 712 of file indeo3.c.

Referenced by decode_plane().

static uint32_t replicate32 ( uint32_t  a  )  [inline, static]

Definition at line 287 of file indeo3.c.

static uint64_t replicate64 ( uint64_t  a  )  [inline, static]

Definition at line 276 of file indeo3.c.


Variable Documentation

Initial value:

 {
    .name           = "indeo3",
    .type           = AVMEDIA_TYPE_VIDEO,
    .id             = CODEC_ID_INDEO3,
    .priv_data_size = sizeof(Indeo3DecodeContext),
    .init           = decode_init,
    .close          = decode_close,
    .decode         = decode_frame,
    .long_name      = NULL_IF_CONFIG_SMALL("Intel Indeo 3"),
}

Definition at line 1067 of file indeo3.c.

uint8_t requant_tab[8][128] [static]

Definition at line 110 of file indeo3.c.

Referenced by build_requant_tab(), and decode_cell().


Generated on Fri Oct 26 02:43:48 2012 for FFmpeg by  doxygen 1.5.8