Files

203 lines
9.2 KiB
C

/*!
***************************************************************************
* \file
* rdoq.h
*
* \brief
* Headerfile for trellis based mode decision
*
* \author
* Limin Liu <lliu@dolby.com>
* Alexis Michael Tourapis <alexismt@ieee.org>
***************************************************************************
*/
#ifndef _RDOQ_H_
#define _RDOQ_H_
#include <math.h>
#define SIGN_BITS 1
static const int estErr4x4[6][4][4] =
{
{
{25600, 27040, 25600, 27040},
{27040, 25600, 27040, 25600},
{25600, 27040, 25600, 27040},
{27040, 25600, 27040, 25600}
},
{
{30976, 31360, 30976, 31360},
{31360, 32400, 31360, 32400},
{30976, 31360, 30976, 31360},
{31360, 32400, 31360, 32400}
},
{
{43264, 40960, 43264, 40960},
{40960, 40000, 40960, 40000},
{43264, 40960, 43264, 40960},
{40960, 40000, 40960, 40000}
},
{
{50176, 51840, 50176, 51840},
{51840, 52900, 51840, 52900},
{50176, 51840, 50176, 51840},
{51840, 52900, 51840, 52900}
},
{
{65536, 64000, 65536, 64000},
{64000, 62500, 64000, 62500},
{65536, 64000, 65536, 64000},
{64000, 62500, 64000, 62500}
},
{
{82944, 84640, 82944, 84640},
{84640, 84100, 84640, 84100},
{82944, 84640, 82944, 84640},
{84640, 84100, 84640, 84100}
}
};
static const int estErr8x8[6][8][8]={
{
{6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056},
{6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
{6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560},
{6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
{6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056},
{6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
{6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560},
{6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201}
},
{
{7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736},
{8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
{8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560},
{8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
{7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736},
{8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
{8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560},
{8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770}
},
{
{11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696},
{10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
{11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160},
{10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
{11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696},
{10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
{11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160},
{10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652}
},
{
{12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296},
{12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
{12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840},
{12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
{12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296},
{12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
{12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840},
{12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156}
},
{
{16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400},
{16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
{16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640},
{16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
{16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400},
{16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
{16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640},
{16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116}
},
{
{21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376},
{21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
{21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440},
{21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
{21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376},
{21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
{21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440},
{21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376}
}
};
struct est_bits_cabac
{
int significantBits[16][2];
int lastBits[16][2];
int greaterOneBits[2][5][2]; // c1 and c2
int greaterOneState[5];
int blockCbpBits[4][2]; // c1 and c2
};
typedef struct est_bits_cabac estBitsCabacStruct;
typedef struct level_data_struct
{
int level[3];
int levelDouble;
double errLevel[3];
int noLevels;
int coeff_ctr;
int pre_level;
int sign;
} levelDataStruct;
extern void init_rdoq_slice(Slice *currSlice);
/*----------CAVLC related functions----------*/
extern void est_RunLevel_CAVLC(Macroblock *currMB, levelDataStruct *levelData, int *levelTrellis, int block_type,
int b8, int b4, int coeff_num, double lambda);
extern int est_CAVLC_bits (VideoParameters *p_Vid, int level_to_enc[16], int sign_to_enc[16], int nnz, int block_type);
/*----------CABAC related functions----------*/
extern void precalculate_unary_exp_golomb_level(VideoParameters *p_Vid);
extern int est_unary_exp_golomb_level_bits(unsigned int symbol, int bits0, int bits1);
extern int est_exp_golomb_encode_eq_prob (unsigned int symbol);
extern void estRunLevel_CABAC (Macroblock* currMB, int context);
extern int est_write_and_store_CBP_block_bit(Macroblock* currMB, int type);
extern void est_writeRunLevel_CABAC(Macroblock *currMB, levelDataStruct levelData[], int levelTabMin[], int type, double lambda, int kStart,
int kStop, int noCoeff, int estCBP);
extern void init_trellis_data_4x4_CAVLC(Macroblock *currMB, int **tblock, int block_x, int qp_per, int qp_rem,
LevelQuantParams **q_params_4x4, const byte *p_scan,
levelDataStruct *dataLevel, int type);
extern int init_trellis_data_4x4_CABAC(Macroblock *currMB, int **tblock,
struct quant_methods *q_method, const byte *p_scan,
levelDataStruct *dataLevel, int* kStart, int* kStop, int type);
extern void init_trellis_data_8x8_CAVLC(Macroblock *currMB, int **tblock, int block_x, int qp_per, int qp_rem,
LevelQuantParams **q_params_8x8, const byte *p_scan,
levelDataStruct levelData[4][16]);
extern int init_trellis_data_8x8_CABAC(Macroblock *currMB, int **tblock, int block_x, int qp_per, int qp_rem,
LevelQuantParams **q_params_8x8, const byte *p_scan,
levelDataStruct *dataLevel, int* kStart, int* kStop);
extern void init_trellis_data_DC_CAVLC(Macroblock *currMB, int **tblock, int qp_per, int qp_rem,
LevelQuantParams *q_params_4x4, const byte *p_scan,
levelDataStruct *dataLevel);
extern int init_trellis_data_DC_CABAC(Macroblock *currMB, int **tblock, int qp_per, int qp_rem,
LevelQuantParams *q_params_4x4, const byte *p_scan,
levelDataStruct *dataLevel, int* kStart, int* kStop);
extern int init_trellis_data_DC_cr_CAVLC(Macroblock *currMB, int **tblock, int qp_per, int qp_rem,
LevelQuantParams *q_params_4x4, const byte *p_scan,
levelDataStruct *dataLevel);
extern int init_trellis_data_DC_cr_CABAC(Macroblock *currMB, int **tblock, int qp_per, int qp_rem,
LevelQuantParams *q_params_4x4, const byte *p_scan,
levelDataStruct *dataLevel, int* kStart, int* kStop);
extern void RDOQ_update_mode (Slice *currSlice, RD_PARAMS *enc_mb);
extern void copy_rddata_trellis (Macroblock *currMB, RD_DATA *dest, RD_DATA *src);
extern void updateMV_mp (Macroblock *currMB, distblk *m_cost, short ref, int list, int h, int v, int blocktype, int block8x8);
extern void trellis_coding (Macroblock *currMB);
extern void get_dQP_table (Slice *currSlice);
#endif // _RDOQ_H_