#include "libavutil/internal.h"
#include "avcodec.h"
#include "dsputil.h"
#include "mpegvideo.h"
#include "golomb.h"
#include "internal.h"
#include "mathops.h"
#include "rectangle.h"
#include "thread.h"
#include "rv34vlc.h"
#include "rv34data.h"
#include "rv34.h"
Go to the source code of this file.
Functions | |
static void | ZERO8x2 (void *dst, int stride) |
av_cold int | ff_rv34_decode_init (AVCodecContext *avctx) |
Initialize decoder. | |
int | ff_rv34_decode_init_thread_copy (AVCodecContext *avctx) |
int | ff_rv34_decode_update_thread_context (AVCodecContext *dst, const AVCodecContext *src) |
static int | get_slice_offset (AVCodecContext *avctx, const uint8_t *buf, int n) |
static int | finish_frame (AVCodecContext *avctx, AVFrame *pict) |
int | ff_rv34_decode_frame (AVCodecContext *avctx, void *data, int *got_picture_ptr, AVPacket *avpkt) |
av_cold int | ff_rv34_decode_end (AVCodecContext *avctx) |
RV30/40 4x4 block decoding functions | |
static int | rv34_decode_cbp (GetBitContext *gb, RV34VLC *vlc, int table) |
Decode coded block pattern. | |
static void | decode_coeff (DCTELEM *dst, int coef, int esc, GetBitContext *gb, VLC *vlc, int q) |
Get one coefficient value from the bistream and store it. | |
static void | decode_subblock (DCTELEM *dst, int code, const int is_block2, GetBitContext *gb, VLC *vlc, int q) |
Decode 2x2 subblock of coefficients. | |
static void | decode_subblock1 (DCTELEM *dst, int code, GetBitContext *gb, VLC *vlc, int q) |
Decode a single coefficient. | |
static void | decode_subblock3 (DCTELEM *dst, int code, GetBitContext *gb, VLC *vlc, int q_dc, int q_ac1, int q_ac2) |
static int | rv34_decode_block (DCTELEM *dst, GetBitContext *gb, RV34VLC *rvlc, int fc, int sc, int q_dc, int q_ac1, int q_ac2) |
Decode coefficients for 4x4 block. | |
RV30/40 bitstream parsing | |
int | ff_rv34_get_start_offset (GetBitContext *gb, int mb_size) |
Decode starting slice position. | |
static RV34VLC * | choose_vlc_set (int quant, int mod, int type) |
Select VLC set for decoding from current quantizer, modifier and frame type. | |
static int | rv34_decode_intra_mb_header (RV34DecContext *r, int8_t *intra_types) |
Decode intra macroblock header and return CBP in case of success, -1 otherwise. | |
static int | rv34_decode_inter_mb_header (RV34DecContext *r, int8_t *intra_types) |
Decode inter macroblock header and return CBP in case of success, -1 otherwise. | |
Variables | |
static const int | rv34_mb_type_to_lavc [12] |
translation of RV30/40 macroblock types to lavc ones | |
static RV34VLC | intra_vlcs [NUM_INTRA_TABLES] |
static RV34VLC | inter_vlcs [NUM_INTER_TABLES] |
motion vector related code (prediction, reconstruction, motion compensation) | |
#define | GET_PTS_DIFF(a, b) ((a - b + 8192) & 0x1FFF) |
static const uint8_t | part_sizes_w [RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2 } |
macroblock partition width in 8x8 blocks | |
static const uint8_t | part_sizes_h [RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2 } |
macroblock partition height in 8x8 blocks | |
static const uint8_t | avail_indexes [4] = { 6, 7, 10, 11 } |
availability index for subblocks | |
static const int | chroma_coeffs [3] = { 0, 3, 5 } |
static const int | num_mvs [RV34_MB_TYPES] = { 0, 0, 1, 4, 1, 1, 0, 0, 2, 2, 2, 1 } |
number of motion vectors in each macroblock type | |
static int | rv34_decode_mv (RV34DecContext *r, int block_type) |
Decode motion vector differences and perform motion vector reconstruction and motion compensation. | |
static void | rv34_pred_mv (RV34DecContext *r, int block_type, int subblock_no, int dmv_no) |
motion vector prediction | |
static int | calc_add_mv (RV34DecContext *r, int dir, int val) |
Calculate motion vector component that should be added for direct blocks. | |
static void | rv34_pred_b_vector (int A[2], int B[2], int C[2], int A_avail, int B_avail, int C_avail, int *mx, int *my) |
Predict motion vector for B-frame macroblock. | |
static void | rv34_pred_mv_b (RV34DecContext *r, int block_type, int dir) |
motion vector prediction for B-frames | |
static void | rv34_pred_mv_rv3 (RV34DecContext *r, int block_type, int dir) |
motion vector prediction - RV3 version | |
static void | rv34_mc (RV34DecContext *r, const int block_type, const int xoff, const int yoff, int mv_off, const int width, const int height, int dir, const int thirdpel, int weighted, qpel_mc_func(*qpel_mc)[16], h264_chroma_mc_func(*chroma_mc)) |
generic motion compensation function | |
static void | rv34_mc_1mv (RV34DecContext *r, const int block_type, const int xoff, const int yoff, int mv_off, const int width, const int height, int dir) |
static void | rv4_weight (RV34DecContext *r) |
static void | rv34_mc_2mv (RV34DecContext *r, const int block_type) |
static void | rv34_mc_2mv_skip (RV34DecContext *r) |
RV30/40 VLC generating functions | |
static const int | table_offs [] |
static VLC_TYPE | table_data [117592][2] |
static void | rv34_gen_vlc (const uint8_t *bits, int size, VLC *vlc, const uint8_t *insyms, const int num) |
Generate VLC from codeword lengths. | |
static av_cold void | rv34_init_tables (void) |
Initialize all tables. | |
Macroblock reconstruction functions | |
static const int | ittrans [9] |
mapping of RV30/40 intra prediction types to standard H.264 types | |
static const int | ittrans16 [4] |
mapping of RV30/40 intra 16x16 prediction types to standard H.264 types | |
static void | rv34_pred_4x4_block (RV34DecContext *r, uint8_t *dst, int stride, int itype, int up, int left, int down, int right) |
Perform 4x4 intra prediction. | |
static int | adjust_pred16 (int itype, int up, int left) |
static void | rv34_process_block (RV34DecContext *r, uint8_t *pdst, int stride, int fc, int sc, int q_dc, int q_ac) |
static void | rv34_output_i16x16 (RV34DecContext *r, int8_t *intra_types, int cbp) |
static void | rv34_output_intra (RV34DecContext *r, int8_t *intra_types, int cbp) |
static int | is_mv_diff_gt_3 (int16_t(*motion_val)[2], int step) |
static int | rv34_set_deblock_coef (RV34DecContext *r) |
static int | rv34_decode_inter_macroblock (RV34DecContext *r, int8_t *intra_types) |
static int | rv34_decode_intra_macroblock (RV34DecContext *r, int8_t *intra_types) |
static int | check_slice_end (RV34DecContext *r, MpegEncContext *s) |
static void | rv34_decoder_free (RV34DecContext *r) |
static int | rv34_decoder_alloc (RV34DecContext *r) |
static int | rv34_decoder_realloc (RV34DecContext *r) |
static int | rv34_decode_slice (RV34DecContext *r, int end, const uint8_t *buf, int buf_size) |
Definition in file rv34.c.
#define GET_PTS_DIFF | ( | a, | |||
b | ) | ((a - b + 8192) & 0x1FFF) |
static int adjust_pred16 | ( | int | itype, | |
int | up, | |||
int | left | |||
) | [inline, static] |
static int calc_add_mv | ( | RV34DecContext * | r, | |
int | dir, | |||
int | val | |||
) | [static] |
Calculate motion vector component that should be added for direct blocks.
Definition at line 517 of file rv34.c.
Referenced by rv34_decode_mv().
static int check_slice_end | ( | RV34DecContext * | r, | |
MpegEncContext * | s | |||
) | [static] |
static RV34VLC* choose_vlc_set | ( | int | quant, | |
int | mod, | |||
int | type | |||
) | [inline, static] |
Select VLC set for decoding from current quantizer, modifier and frame type.
Definition at line 340 of file rv34.c.
Referenced by rv34_decode_inter_macroblock(), rv34_decode_inter_mb_header(), and rv34_decode_intra_mb_header().
static void decode_coeff | ( | DCTELEM * | dst, | |
int | coef, | |||
int | esc, | |||
GetBitContext * | gb, | |||
VLC * | vlc, | |||
int | q | |||
) | [inline, static] |
Get one coefficient value from the bistream and store it.
Definition at line 219 of file rv34.c.
Referenced by decode_subblock(), decode_subblock1(), and decode_subblock3().
static void decode_subblock | ( | DCTELEM * | dst, | |
int | code, | |||
const int | is_block2, | |||
GetBitContext * | gb, | |||
VLC * | vlc, | |||
int | q | |||
) | [inline, static] |
Decode 2x2 subblock of coefficients.
Definition at line 239 of file rv34.c.
Referenced by rv34_decode_block().
static void decode_subblock1 | ( | DCTELEM * | dst, | |
int | code, | |||
GetBitContext * | gb, | |||
VLC * | vlc, | |||
int | q | |||
) | [inline, static] |
Decode a single coefficient.
Definition at line 257 of file rv34.c.
Referenced by rv34_decode_block().
static void decode_subblock3 | ( | DCTELEM * | dst, | |
int | code, | |||
GetBitContext * | gb, | |||
VLC * | vlc, | |||
int | q_dc, | |||
int | q_ac1, | |||
int | q_ac2 | |||
) | [inline, static] |
av_cold int ff_rv34_decode_end | ( | AVCodecContext * | avctx | ) |
int ff_rv34_decode_frame | ( | AVCodecContext * | avctx, | |
void * | data, | |||
int * | got_picture_ptr, | |||
AVPacket * | avpkt | |||
) |
av_cold int ff_rv34_decode_init | ( | AVCodecContext * | avctx | ) |
Initialize decoder.
Definition at line 1469 of file rv34.c.
Referenced by rv30_decode_init(), and rv40_decode_init().
int ff_rv34_decode_init_thread_copy | ( | AVCodecContext * | avctx | ) |
int ff_rv34_decode_update_thread_context | ( | AVCodecContext * | dst, | |
const AVCodecContext * | src | |||
) |
int ff_rv34_get_start_offset | ( | GetBitContext * | gb, | |
int | mb_size | |||
) |
Decode starting slice position.
common decoding functions
Definition at line 328 of file rv34.c.
Referenced by rv30_parse_slice_header(), and rv40_parse_slice_header().
static int finish_frame | ( | AVCodecContext * | avctx, | |
AVFrame * | pict | |||
) | [static] |
Definition at line 1567 of file rv34.c.
Referenced by ff_rv34_decode_frame(), and shorten_decode_frame().
static int get_slice_offset | ( | AVCodecContext * | avctx, | |
const uint8_t * | buf, | |||
int | n | |||
) | [static] |
static int is_mv_diff_gt_3 | ( | int16_t(*) | motion_val[2], | |
int | step | |||
) | [static] |
static int rv34_decode_block | ( | DCTELEM * | dst, | |
GetBitContext * | gb, | |||
RV34VLC * | rvlc, | |||
int | fc, | |||
int | sc, | |||
int | q_dc, | |||
int | q_ac1, | |||
int | q_ac2 | |||
) | [static] |
Decode coefficients for 4x4 block.
This is done by filling 2x2 subblocks with decoded coefficients in this order (the same for subblocks and subblock coefficients): o--o / / o--o
Definition at line 285 of file rv34.c.
Referenced by rv34_decode_inter_macroblock(), rv34_output_i16x16(), and rv34_process_block().
static int rv34_decode_cbp | ( | GetBitContext * | gb, | |
RV34VLC * | vlc, | |||
int | table | |||
) | [static] |
Decode coded block pattern.
Definition at line 186 of file rv34.c.
Referenced by rv34_decode_inter_mb_header(), and rv34_decode_intra_mb_header().
static int rv34_decode_inter_macroblock | ( | RV34DecContext * | r, | |
int8_t * | intra_types | |||
) | [static] |
static int rv34_decode_inter_mb_header | ( | RV34DecContext * | r, | |
int8_t * | intra_types | |||
) | [static] |
Decode inter macroblock header and return CBP in case of success, -1 otherwise.
Definition at line 386 of file rv34.c.
Referenced by rv34_decode_inter_macroblock().
static int rv34_decode_intra_macroblock | ( | RV34DecContext * | r, | |
int8_t * | intra_types | |||
) | [static] |
static int rv34_decode_intra_mb_header | ( | RV34DecContext * | r, | |
int8_t * | intra_types | |||
) | [static] |
Decode intra macroblock header and return CBP in case of success, -1 otherwise.
Definition at line 351 of file rv34.c.
Referenced by rv34_decode_intra_macroblock().
static int rv34_decode_mv | ( | RV34DecContext * | r, | |
int | block_type | |||
) | [static] |
Decode motion vector differences and perform motion vector reconstruction and motion compensation.
Definition at line 840 of file rv34.c.
Referenced by rv34_decode_inter_mb_header().
static int rv34_decode_slice | ( | RV34DecContext * | r, | |
int | end, | |||
const uint8_t * | buf, | |||
int | buf_size | |||
) | [static] |
static int rv34_decoder_alloc | ( | RV34DecContext * | r | ) | [static] |
Definition at line 1353 of file rv34.c.
Referenced by ff_rv34_decode_init(), ff_rv34_decode_init_thread_copy(), and rv34_decoder_realloc().
static void rv34_decoder_free | ( | RV34DecContext * | r | ) | [static] |
Definition at line 1341 of file rv34.c.
Referenced by ff_rv34_decode_end(), rv34_decoder_alloc(), and rv34_decoder_realloc().
static int rv34_decoder_realloc | ( | RV34DecContext * | r | ) | [static] |
Definition at line 1380 of file rv34.c.
Referenced by ff_rv34_decode_frame(), and ff_rv34_decode_update_thread_context().
static void rv34_gen_vlc | ( | const uint8_t * | bits, | |
int | size, | |||
VLC * | vlc, | |||
const uint8_t * | insyms, | |||
const int | num | |||
) | [static] |
Generate VLC from codeword lengths.
bits | codeword lengths (zeroes are accepted) | |
size | length of input data | |
vlc | output VLC | |
insyms | symbols for input codes (NULL for default ones) | |
num | VLC table number (for static initialization) |
Definition at line 107 of file rv34.c.
Referenced by rv34_init_tables().
static av_cold void rv34_init_tables | ( | void | ) | [static] |
static void rv34_mc | ( | RV34DecContext * | r, | |
const int | block_type, | |||
const int | xoff, | |||
const int | yoff, | |||
int | mv_off, | |||
const int | width, | |||
const int | height, | |||
int | dir, | |||
const int | thirdpel, | |||
int | weighted, | |||
qpel_mc_func(*) | qpel_mc[16], | |||
h264_chroma_mc_func * | chroma_mc | |||
) | [inline, static] |
generic motion compensation function
r | decoder context | |
block_type | type of the current block | |
xoff | horizontal offset from the start of the current block | |
yoff | vertical offset from the start of the current block | |
mv_off | offset to the motion vector information | |
width | width of the current partition in 8x8 blocks | |
height | height of the current partition in 8x8 blocks | |
dir | motion compensation direction (i.e. from the last or the next reference frame) | |
thirdpel | motion vectors are specified in 1/3 of pixel | |
qpel_mc | a set of functions used to perform luma motion compensation | |
chroma_mc | a set of functions used to perform chroma motion compensation |
Definition at line 662 of file rv34.c.
Referenced by rv34_mc_1mv(), rv34_mc_2mv(), and rv34_mc_2mv_skip().
static void rv34_mc_1mv | ( | RV34DecContext * | r, | |
const int | block_type, | |||
const int | xoff, | |||
const int | yoff, | |||
int | mv_off, | |||
const int | width, | |||
const int | height, | |||
int | dir | |||
) | [static] |
static void rv34_mc_2mv | ( | RV34DecContext * | r, | |
const int | block_type | |||
) | [static] |
static void rv34_mc_2mv_skip | ( | RV34DecContext * | r | ) | [static] |
static void rv34_output_i16x16 | ( | RV34DecContext * | r, | |
int8_t * | intra_types, | |||
int | cbp | |||
) | [static] |
Definition at line 1008 of file rv34.c.
Referenced by rv34_decode_inter_macroblock(), and rv34_decode_intra_macroblock().
static void rv34_output_intra | ( | RV34DecContext * | r, | |
int8_t * | intra_types, | |||
int | cbp | |||
) | [static] |
Definition at line 1071 of file rv34.c.
Referenced by rv34_decode_inter_macroblock(), and rv34_decode_intra_macroblock().
static void rv34_pred_4x4_block | ( | RV34DecContext * | r, | |
uint8_t * | dst, | |||
int | stride, | |||
int | itype, | |||
int | up, | |||
int | left, | |||
int | down, | |||
int | right | |||
) | [static] |
Perform 4x4 intra prediction.
Definition at line 949 of file rv34.c.
Referenced by rv34_output_intra().
static void rv34_pred_b_vector | ( | int | A[2], | |
int | B[2], | |||
int | C[2], | |||
int | A_avail, | |||
int | B_avail, | |||
int | C_avail, | |||
int * | mx, | |||
int * | my | |||
) | [inline, static] |
Predict motion vector for B-frame macroblock.
Definition at line 527 of file rv34.c.
Referenced by rv34_pred_mv_b().
static void rv34_pred_mv | ( | RV34DecContext * | r, | |
int | block_type, | |||
int | subblock_no, | |||
int | dmv_no | |||
) | [static] |
motion vector prediction
Motion prediction performed for the block by using median prediction of motion vectors from the left, top and right top blocks but in corner cases some other vectors may be used instead.
Definition at line 463 of file rv34.c.
Referenced by rv34_decode_mv().
static void rv34_pred_mv_b | ( | RV34DecContext * | r, | |
int | block_type, | |||
int | dir | |||
) | [static] |
motion vector prediction for B-frames
Definition at line 547 of file rv34.c.
Referenced by rv34_decode_mv().
static void rv34_pred_mv_rv3 | ( | RV34DecContext * | r, | |
int | block_type, | |||
int | dir | |||
) | [static] |
motion vector prediction - RV3 version
Definition at line 599 of file rv34.c.
Referenced by rv34_decode_mv().
static void rv34_process_block | ( | RV34DecContext * | r, | |
uint8_t * | pdst, | |||
int | stride, | |||
int | fc, | |||
int | sc, | |||
int | q_dc, | |||
int | q_ac | |||
) | [inline, static] |
Definition at line 992 of file rv34.c.
Referenced by rv34_decode_inter_macroblock(), rv34_output_i16x16(), and rv34_output_intra().
static int rv34_set_deblock_coef | ( | RV34DecContext * | r | ) | [static] |
static void rv4_weight | ( | RV34DecContext * | r | ) | [static] |
static void ZERO8x2 | ( | void * | dst, | |
int | stride | |||
) | [inline, static] |
const uint8_t avail_indexes[4] = { 6, 7, 10, 11 } [static] |
availability index for subblocks
Definition at line 454 of file rv34.c.
Referenced by rv34_pred_mv(), and rv34_pred_mv_rv3().
const int chroma_coeffs[3] = { 0, 3, 5 } [static] |
RV34VLC inter_vlcs[NUM_INTER_TABLES] [static] |
RV34VLC intra_vlcs[NUM_INTRA_TABLES] [static] |
const int ittrans[9] [static] |
Initial value:
{ DC_PRED, VERT_PRED, HOR_PRED, DIAG_DOWN_RIGHT_PRED, DIAG_DOWN_LEFT_PRED, VERT_RIGHT_PRED, VERT_LEFT_PRED, HOR_UP_PRED, HOR_DOWN_PRED, }
const int ittrans16[4] [static] |
Initial value:
mapping of RV30/40 intra 16x16 prediction types to standard H.264 types
const int num_mvs[RV34_MB_TYPES] = { 0, 0, 1, 4, 1, 1, 0, 0, 2, 2, 2, 1 } [static] |
number of motion vectors in each macroblock type
Definition at line 834 of file rv34.c.
Referenced by tgv_decode_inter().
const uint8_t part_sizes_h[RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2 } [static] |
macroblock partition height in 8x8 blocks
Definition at line 451 of file rv34.c.
Referenced by rv34_pred_mv().
const uint8_t part_sizes_w[RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2 } [static] |
macroblock partition width in 8x8 blocks
Definition at line 448 of file rv34.c.
Referenced by rv34_pred_mv().
const int rv34_mb_type_to_lavc[12] [static] |
Initial value:
{ MB_TYPE_INTRA, MB_TYPE_INTRA16x16 | MB_TYPE_SEPARATE_DC, MB_TYPE_16x16 | MB_TYPE_L0, MB_TYPE_8x8 | MB_TYPE_L0, MB_TYPE_16x16 | MB_TYPE_L0, MB_TYPE_16x16 | MB_TYPE_L1, MB_TYPE_SKIP, MB_TYPE_DIRECT2 | MB_TYPE_16x16, MB_TYPE_16x8 | MB_TYPE_L0, MB_TYPE_8x16 | MB_TYPE_L0, MB_TYPE_16x16 | MB_TYPE_L0L1, MB_TYPE_16x16 | MB_TYPE_L0 | MB_TYPE_SEPARATE_DC }
Definition at line 51 of file rv34.c.
Referenced by rv34_decode_inter_mb_header().
VLC_TYPE table_data[117592][2] [static] |
const int table_offs[] [static] |
Initial value:
{ 0, 1818, 3622, 4144, 4698, 5234, 5804, 5868, 5900, 5932, 5996, 6252, 6316, 6348, 6380, 7674, 8944, 10274, 11668, 12250, 14060, 15846, 16372, 16962, 17512, 18148, 18180, 18212, 18244, 18308, 18564, 18628, 18660, 18692, 20036, 21314, 22648, 23968, 24614, 26384, 28190, 28736, 29366, 29938, 30608, 30640, 30672, 30704, 30768, 31024, 31088, 31120, 31184, 32570, 33898, 35236, 36644, 37286, 39020, 40802, 41368, 42052, 42692, 43348, 43380, 43412, 43444, 43476, 43604, 43668, 43700, 43732, 45100, 46430, 47778, 49160, 49802, 51550, 53340, 53972, 54648, 55348, 55994, 56122, 56154, 56186, 56218, 56346, 56410, 56442, 56474, 57878, 59290, 60636, 62036, 62682, 64460, 64524, 64588, 64716, 64844, 66076, 67466, 67978, 68542, 69064, 69648, 70296, 72010, 72074, 72138, 72202, 72330, 73572, 74936, 75454, 76030, 76566, 77176, 77822, 79582, 79646, 79678, 79742, 79870, 81180, 82536, 83064, 83672, 84242, 84934, 85576, 87384, 87448, 87480, 87544, 87672, 88982, 90340, 90902, 91598, 92182, 92846, 93488, 95246, 95278, 95310, 95374, 95502, 96878, 98266, 98848, 99542, 100234, 100884, 101524, 103320, 103352, 103384, 103416, 103480, 104874, 106222, 106910, 107584, 108258, 108902, 109544, 111366, 111398, 111430, 111462, 111494, 112878, 114320, 114988, 115660, 116310, 116950, 117592 }
Definition at line 76 of file rv34.c.
Referenced by rv34_gen_vlc().