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

RV30/40 decoder common data. More...

#include "libavutil/imgutils.h"
#include "libavutil/internal.h"
#include "avcodec.h"
#include "error_resilience.h"
#include "mpegutils.h"
#include "mpegvideo.h"
#include "golomb.h"
#include "internal.h"
#include "mathops.h"
#include "mpeg_er.h"
#include "qpeldsp.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. More...
 
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)
 
static AVRational update_sar (int old_w, int old_h, AVRational sar, int new_w, int new_h)
 
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. More...
 
static void decode_coeff (int16_t *dst, int coef, int esc, GetBitContext *gb, VLC *vlc, int q)
 Get one coefficient value from the bitstream and store it. More...
 
static void decode_subblock (int16_t *dst, int code, const int is_block2, GetBitContext *gb, VLC *vlc, int q)
 Decode 2x2 subblock of coefficients. More...
 
static void decode_subblock1 (int16_t *dst, int code, GetBitContext *gb, VLC *vlc, int q)
 Decode a single coefficient. More...
 
static void decode_subblock3 (int16_t *dst, int code, GetBitContext *gb, VLC *vlc, int q_dc, int q_ac1, int q_ac2)
 
static int rv34_decode_block (int16_t *dst, GetBitContext *gb, RV34VLC *rvlc, int fc, int sc, int q_dc, int q_ac1, int q_ac2)
 Decode coefficients for 4x4 block. More...
 
RV30/40 bitstream parsing
int ff_rv34_get_start_offset (GetBitContext *gb, int mb_size)
 Decode starting slice position. More...
 
static RV34VLCchoose_vlc_set (int quant, int mod, int type)
 Select VLC set for decoding from current quantizer, modifier and frame type. More...
 
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. More...
 
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. More...
 

Variables

static const int rv34_mb_type_to_lavc [12]
 translation of RV30/40 macroblock types to lavc ones More...
 
static RV34VLC intra_vlcs [NUM_INTRA_TABLES]
 
static RV34VLC inter_vlcs [NUM_INTER_TABLES]
 

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. More...
 
static av_cold void rv34_init_tables (void)
 Initialize all tables. More...
 

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 More...
 
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 More...
 
static const uint8_t avail_indexes [4] = { 6, 7, 10, 11 }
 availability index for subblocks More...
 
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 More...
 
static int rv34_decode_mv (RV34DecContext *r, int block_type)
 Decode motion vector differences and perform motion vector reconstruction and motion compensation. More...
 
static void rv34_pred_mv (RV34DecContext *r, int block_type, int subblock_no, int dmv_no)
 motion vector prediction More...
 
static int calc_add_mv (RV34DecContext *r, int dir, int val)
 Calculate motion vector component that should be added for direct blocks. More...
 
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. More...
 
static void rv34_pred_mv_b (RV34DecContext *r, int block_type, int dir)
 motion vector prediction for B-frames More...
 
static void rv34_pred_mv_rv3 (RV34DecContext *r, int block_type, int dir)
 motion vector prediction - RV3 version More...
 
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 More...
 
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)
 

Macroblock reconstruction functions

static const int ittrans [9]
 mapping of RV30/40 intra prediction types to standard H.264 types More...
 
static const int ittrans16 [4]
 mapping of RV30/40 intra 16x16 prediction types to standard H.264 types More...
 
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. More...
 
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)
 

Detailed Description

RV30/40 decoder common data.

Definition in file rv34.c.

Macro Definition Documentation

#define GET_PTS_DIFF (   a,
  b 
)    (((a) - (b) + 8192) & 0x1FFF)

Definition at line 514 of file rv34.c.

Referenced by ff_rv34_decode_frame().

Function Documentation

static void ZERO8x2 ( void dst,
int  stride 
)
inlinestatic

Definition at line 46 of file rv34.c.

Referenced by rv34_decode_mv(), and rv34_pred_mv_b().

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 857 of file rv34.c.

Referenced by rv34_decode_inter_mb_header().

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.

Parameters
bitscodeword lengths (zeroes are accepted)
sizelength of input data
vlcoutput VLC
insymssymbols for input codes (NULL for default ones)
numVLC table number (for static initialization)

Definition at line 109 of file rv34.c.

Referenced by rv34_init_tables().

static av_cold void rv34_init_tables ( void  )
static

Initialize all tables.

Definition at line 145 of file rv34.c.

Referenced by ff_rv34_decode_init().

static int rv34_decode_cbp ( GetBitContext gb,
RV34VLC vlc,
int  table 
)
static

Decode coded block pattern.

Definition at line 188 of file rv34.c.

Referenced by rv34_decode_inter_mb_header(), and rv34_decode_intra_mb_header().

static void decode_coeff ( int16_t *  dst,
int  coef,
int  esc,
GetBitContext gb,
VLC vlc,
int  q 
)
inlinestatic

Get one coefficient value from the bitstream and store it.

Definition at line 221 of file rv34.c.

Referenced by decode_subblock(), decode_subblock1(), and decode_subblock3().

static void decode_subblock ( int16_t *  dst,
int  code,
const int  is_block2,
GetBitContext gb,
VLC vlc,
int  q 
)
inlinestatic

Decode 2x2 subblock of coefficients.

Definition at line 241 of file rv34.c.

Referenced by rv34_decode_block().

static void decode_subblock1 ( int16_t *  dst,
int  code,
GetBitContext gb,
VLC vlc,
int  q 
)
inlinestatic

Decode a single coefficient.

Definition at line 259 of file rv34.c.

Referenced by rv34_decode_block().

static void decode_subblock3 ( int16_t *  dst,
int  code,
GetBitContext gb,
VLC vlc,
int  q_dc,
int  q_ac1,
int  q_ac2 
)
inlinestatic

Definition at line 265 of file rv34.c.

Referenced by rv34_decode_block().

static int rv34_decode_block ( int16_t *  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 287 of file rv34.c.

Referenced by rv34_decode_inter_macroblock(), rv34_output_i16x16(), and rv34_process_block().

int ff_rv34_get_start_offset ( GetBitContext gb,
int  mb_size 
)

Decode starting slice position.

common decoding functions

Todo:
Maybe replace with ff_h263_decode_mba() ?

Definition at line 330 of file rv34.c.

Referenced by rv30_parse_slice_header(), and rv40_parse_slice_header().

static RV34VLC* choose_vlc_set ( int  quant,
int  mod,
int  type 
)
inlinestatic

Select VLC set for decoding from current quantizer, modifier and frame type.

Definition at line 342 of file rv34.c.

Referenced by rv34_decode_inter_macroblock(), rv34_decode_inter_mb_header(), and rv34_decode_intra_mb_header().

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 353 of file rv34.c.

Referenced by rv34_decode_intra_macroblock().

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 388 of file rv34.c.

Referenced by rv34_decode_inter_macroblock().

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 465 of file rv34.c.

Referenced by rv34_decode_mv().

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 519 of file rv34.c.

Referenced by rv34_decode_mv().

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 
)
inlinestatic

Predict motion vector for B-frame macroblock.

Definition at line 529 of file rv34.c.

Referenced by rv34_pred_mv_b().

static void rv34_pred_mv_b ( RV34DecContext r,
int  block_type,
int  dir 
)
static

motion vector prediction for B-frames

Definition at line 549 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 601 of file rv34.c.

Referenced by rv34_decode_mv().

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 
)
inlinestatic

generic motion compensation function

Parameters
rdecoder context
block_typetype of the current block
xoffhorizontal offset from the start of the current block
yoffvertical offset from the start of the current block
mv_offoffset to the motion vector information
widthwidth of the current partition in 8x8 blocks
heightheight of the current partition in 8x8 blocks
dirmotion compensation direction (i.e. from the last or the next reference frame)
thirdpelmotion vectors are specified in 1/3 of pixel
qpel_mca set of functions used to perform luma motion compensation
chroma_mca set of functions used to perform chroma motion compensation

Definition at line 664 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

Definition at line 780 of file rv34.c.

Referenced by rv34_decode_mv().

static void rv4_weight ( RV34DecContext r)
static

Definition at line 789 of file rv34.c.

Referenced by rv34_mc_2mv(), and rv34_mc_2mv_skip().

static void rv34_mc_2mv ( RV34DecContext r,
const int  block_type 
)
static

Definition at line 811 of file rv34.c.

Referenced by rv34_decode_mv().

static void rv34_mc_2mv_skip ( RV34DecContext r)
static

Definition at line 830 of file rv34.c.

Referenced by rv34_decode_mv().

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 966 of file rv34.c.

Referenced by rv34_output_intra().

static int adjust_pred16 ( int  itype,
int  up,
int  left 
)
inlinestatic

Definition at line 993 of file rv34.c.

Referenced by rv34_output_i16x16().

static void rv34_process_block ( RV34DecContext r,
uint8_t pdst,
int  stride,
int  fc,
int  sc,
int  q_dc,
int  q_ac 
)
inlinestatic

Definition at line 1009 of file rv34.c.

Referenced by rv34_decode_inter_macroblock(), rv34_output_i16x16(), and rv34_output_intra().

static void rv34_output_i16x16 ( RV34DecContext r,
int8_t *  intra_types,
int  cbp 
)
static

Definition at line 1025 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 1088 of file rv34.c.

Referenced by rv34_decode_inter_macroblock(), and rv34_decode_intra_macroblock().

static int is_mv_diff_gt_3 ( int16_t(*)  motion_val[2],
int  step 
)
static

Definition at line 1152 of file rv34.c.

Referenced by rv34_set_deblock_coef().

static int rv34_set_deblock_coef ( RV34DecContext r)
static

Definition at line 1164 of file rv34.c.

Referenced by rv34_decode_inter_macroblock().

static int rv34_decode_inter_macroblock ( RV34DecContext r,
int8_t *  intra_types 
)
static

Definition at line 1194 of file rv34.c.

Referenced by rv34_decode_slice().

static int rv34_decode_intra_macroblock ( RV34DecContext r,
int8_t *  intra_types 
)
static

Definition at line 1302 of file rv34.c.

Referenced by rv34_decode_slice().

static int check_slice_end ( RV34DecContext r,
MpegEncContext s 
)
static

Definition at line 1342 of file rv34.c.

Referenced by rv34_decode_slice().

static void rv34_decoder_free ( RV34DecContext r)
static

Definition at line 1358 of file rv34.c.

Referenced by ff_rv34_decode_end(), rv34_decoder_alloc(), and rv34_decoder_realloc().

static int rv34_decoder_alloc ( RV34DecContext r)
static
static int rv34_decoder_realloc ( RV34DecContext r)
static

Definition at line 1397 of file rv34.c.

Referenced by ff_rv34_decode_frame(), and ff_rv34_decode_update_thread_context().

static int rv34_decode_slice ( RV34DecContext r,
int  end,
const uint8_t buf,
int  buf_size 
)
static

Definition at line 1404 of file rv34.c.

Referenced by ff_rv34_decode_frame().

av_cold int ff_rv34_decode_init ( AVCodecContext avctx)

Initialize decoder.

Definition at line 1486 of file rv34.c.

Referenced by rv30_decode_init(), and rv40_decode_init().

int ff_rv34_decode_init_thread_copy ( AVCodecContext avctx)

Definition at line 1528 of file rv34.c.

int ff_rv34_decode_update_thread_context ( AVCodecContext dst,
const AVCodecContext src 
)

Definition at line 1556 of file rv34.c.

static int get_slice_offset ( AVCodecContext avctx,
const uint8_t buf,
int  n 
)
static

Definition at line 1588 of file rv34.c.

Referenced by ff_rv34_decode_frame().

static int finish_frame ( AVCodecContext avctx,
AVFrame pict 
)
static

Definition at line 1594 of file rv34.c.

Referenced by ff_rv34_decode_frame(), and shorten_decode_frame().

static AVRational update_sar ( int  old_w,
int  old_h,
AVRational  sar,
int  new_w,
int  new_h 
)
static

Definition at line 1624 of file rv34.c.

Referenced by ff_rv34_decode_frame().

int ff_rv34_decode_frame ( AVCodecContext avctx,
void data,
int *  got_picture_ptr,
AVPacket avpkt 
)

Definition at line 1634 of file rv34.c.

av_cold int ff_rv34_decode_end ( AVCodecContext avctx)

Definition at line 1844 of file rv34.c.

Variable Documentation

const int rv34_mb_type_to_lavc[12]
static
Initial value:
= {
}
#define MB_TYPE_INTRA16x16
Definition: avcodec.h:1141
#define MB_TYPE_SKIP
Definition: avcodec.h:1151
#define MB_TYPE_INTRA
Definition: mpegutils.h:75
#define MB_TYPE_SEPARATE_DC
Definition: rv34.h:36
#define MB_TYPE_DIRECT2
Definition: avcodec.h:1148
#define MB_TYPE_L0L1
Definition: avcodec.h:1158
#define MB_TYPE_L1
Definition: avcodec.h:1157
#define MB_TYPE_8x16
Definition: avcodec.h:1145
#define MB_TYPE_16x16
Definition: avcodec.h:1143
#define MB_TYPE_8x8
Definition: avcodec.h:1146
#define MB_TYPE_16x8
Definition: avcodec.h:1144
#define MB_TYPE_L0
Definition: avcodec.h:1156

translation of RV30/40 macroblock types to lavc ones

Definition at line 53 of file rv34.c.

Referenced by rv34_decode_inter_mb_header().

RV34VLC intra_vlcs[NUM_INTRA_TABLES]
static

Definition at line 69 of file rv34.c.

RV34VLC inter_vlcs[NUM_INTER_TABLES]
static

Definition at line 69 of file rv34.c.

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 78 of file rv34.c.

Referenced by rv34_gen_vlc().

VLC_TYPE table_data[117592][2]
static

Definition at line 99 of file rv34.c.

Referenced by ff_ivi_init_static_vlc(), and rv34_gen_vlc().

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 450 of file rv34.c.

Referenced by rv34_pred_mv().

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 453 of file rv34.c.

Referenced by rv34_pred_mv().

const uint8_t avail_indexes[4] = { 6, 7, 10, 11 }
static

availability index for subblocks

Definition at line 456 of file rv34.c.

Referenced by rv34_pred_mv(), and rv34_pred_mv_rv3().

const int chroma_coeffs[3] = { 0, 3, 5 }
static

Definition at line 647 of file rv34.c.

Referenced by rv34_mc().

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 851 of file rv34.c.

Referenced by tgv_decode_inter().

const int ittrans[9]
static
Initial value:

mapping of RV30/40 intra prediction types to standard H.264 types

Definition at line 953 of file rv34.c.

const int ittrans16[4]
static
Initial value:
= {
}
#define VERT_PRED8x8
Definition: h264pred.h:70
#define HOR_PRED8x8
Definition: h264pred.h:69
#define PLANE_PRED8x8
Definition: h264pred.h:71
#define DC_PRED8x8
Definition: h264pred.h:68

mapping of RV30/40 intra 16x16 prediction types to standard H.264 types

Definition at line 959 of file rv34.c.