#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, int luma_width, int luma_height) |
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 |
It is based on vector quantization, run-length coding and motion compensation. Known container formats: .avi and .mov Known FOURCCs: 'IV31', 'IV32'
Definition in file indeo3.c.
#define APPLY_DELTA_1011_INTER |
Value:
if (mode == 10) { \ AV_WN32A(dst , \ (AV_RN32A(dst ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ AV_WN32A(dst + 4 , \ (AV_RN32A(dst + 4 ) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ AV_WN32A(dst + row_offset , \ (AV_RN32A(dst + row_offset ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ AV_WN32A(dst + row_offset + 4, \ (AV_RN32A(dst + row_offset + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ } else { \ AV_WN16A(dst , \ (AV_RN16A(dst ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ AV_WN16A(dst + 2 , \ (AV_RN16A(dst + 2 ) + delta_tab->deltas[dyad2]) & 0x7F7F);\ AV_WN16A(dst + row_offset , \ (AV_RN16A(dst + row_offset ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ AV_WN16A(dst + row_offset + 2, \ (AV_RN16A(dst + row_offset + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\ }
Definition at line 390 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]) & 0x7F7F);\ AV_WN16A(dst + line_offset + 2,\ (AV_RN16A(ref + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\ 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 355 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]) & 0x7F7F7F7F);\ AV_WN32A(dst + row_offset + 4, \ (replicate32(AV_RN32A(ref + 4)) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ } else { \ AV_WN32A(dst + row_offset , \ (AV_RN32A(ref ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ AV_WN32A(dst + row_offset + 4, \ (AV_RN32A(ref + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ } \ /* 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 368 of file indeo3.c.
Referenced by decode_cell_data().
#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) |
#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 326 of file indeo3.c.
Referenced by decode_cell_data().
#define CELL_STACK_MAX 20 |
#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 725 of file indeo3.c.
Referenced by parse_bintree().
#define OS_HDR_ID MKBETAG('F', 'R', 'M', 'H') |
#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 718 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 330 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 334 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) |
#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 346 of file indeo3.c.
Referenced by decode_cell_data().
#define UPDATE_BITPOS | ( | n | ) |
Value:
ctx->skip_bits += (n); \ ctx->need_resync = 1
Definition at line 714 of file indeo3.c.
Referenced by parse_bintree().
anonymous enum |
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 |
anonymous enum |
anonymous enum |
static av_cold int allocate_frame_buffers | ( | Indeo3DecodeContext * | ctx, | |
AVCodecContext * | avctx, | |||
int | luma_width, | |||
int | luma_height | |||
) | [static] |
static av_cold void build_requant_tab | ( | void | ) | [static] |
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.
ctx | pointer to the decoder context | |
plane | pointer to the plane descriptor | |
cell | pointer to the cell descriptor |
Definition at line 228 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.
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 |
Definition at line 565 of file indeo3.c.
Referenced by parse_bintree().
static av_cold int decode_close | ( | AVCodecContext * | avctx | ) | [static] |
static int decode_frame | ( | AVCodecContext * | avctx, | |
void * | data, | |||
int * | data_size, | |||
AVPacket * | avpkt | |||
) | [static] |
static int decode_frame_headers | ( | Indeo3DecodeContext * | ctx, | |
AVCodecContext * | avctx, | |||
const uint8_t * | buf, | |||
int | buf_size | |||
) | [static] |
static av_cold int decode_init | ( | AVCodecContext * | avctx | ) | [static] |
static int decode_plane | ( | Indeo3DecodeContext * | ctx, | |
AVCodecContext * | avctx, | |||
Plane * | plane, | |||
const uint8_t * | data, | |||
int32_t | data_size, | |||
int32_t | strip_width | |||
) | [static] |
static void fill_64 | ( | uint8_t * | dst, | |
const uint64_t | pix, | |||
int32_t | n, | |||
int32_t | row_offset | |||
) | [inline, static] |
static av_cold void free_frame_buffers | ( | Indeo3DecodeContext * | ctx | ) | [static] |
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.
[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 1011 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] |
static uint32_t replicate32 | ( | uint32_t | a | ) | [inline, static] |
static uint64_t replicate64 | ( | uint64_t | a | ) | [inline, static] |
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"), }
uint8_t requant_tab[8][128] [static] |