00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _RDOQ_H_
00018 #define _RDOQ_H_
00019
00020 #include <math.h>
00021
00022
00023 #define MAX_PREC_COEFF 25
00024 #define SIGN_BITS 1
00025
00026 typedef struct
00027 {
00028 int significantBits[16][2];
00029 int lastBits[16][2];
00030 int greaterOneBits[2][5][2];
00031 int greaterOneState[5];
00032 int blockCbpBits[4][2];
00033 } estBitsCabacStruct;
00034
00035 typedef struct
00036 {
00037 int level[3];
00038 int levelDouble;
00039 double errLevel[3];
00040 int noLevels;
00041 int coeff_ctr;
00042 int pre_level;
00043 int sign;
00044 } levelDataStruct;
00045
00046 extern double norm_factor_4x4;
00047 extern double norm_factor_8x8;
00048
00049
00050 void init_rdoq_slice(int slice_type, int symbol_mode);
00051
00052
00053 void est_RunLevel_CAVLC(levelDataStruct *levelData, int *levelTrellis, int block_type,
00054 int b8, int b4, int coeff_num, double lambda);
00055 int est_CAVLC_bits(levelDataStruct *levelData, int level_to_enc[16], int sign_to_enc[16], int nnz, int block_type);
00056
00057
00058 void precalculate_unary_exp_golomb_level();
00059 int est_unary_exp_golomb_level_bits(unsigned int symbol, int bits0, int bits1);
00060 int est_exp_golomb_encode_eq_prob(unsigned int symbol);
00061
00062 void estRunLevel_CABAC (Slice *currSlice, Macroblock* currMB, int context);
00063 void est_CBP_block_bit (Slice *currSlice, Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type);
00064 void est_significance_map (Slice *currSlice, Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type);
00065 void est_significant_coefficients (Slice *currSlice, Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type);
00066 int biari_no_bits (EncodingEnvironmentPtr eep, signed short symbol, BiContextTypePtr bi_ct );
00067 int biari_state (EncodingEnvironmentPtr eep, signed short symbol, BiContextTypePtr bi_ct );
00068 int est_write_and_store_CBP_block_bit(Macroblock* currMB, int type);
00069 void est_writeRunLevel_CABAC(levelDataStruct levelData[], int levelTabMin[], int type, double lambda, int kStart,
00070 int kStop, int noCoeff, int estCBP);
00071 int est_unary_exp_golomb_level_encode(unsigned int symbol, int ctx, int type);
00072
00073 void init_trellis_data_4x4_CAVLC(int **tblock, int block_x, int qp_per, int qp_rem,
00074 int **levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,
00075 levelDataStruct *dataLevel, int type);
00076 int init_trellis_data_4x4_CABAC(int **tblock, int block_x, int qp_per, int qp_rem,
00077 int **levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,
00078 levelDataStruct *dataLevel, int* kStart, int* kStop, int type);
00079 void init_trellis_data_8x8_CAVLC(int **tblock, int block_x, int qp_per, int qp_rem,
00080 int **levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,
00081 levelDataStruct levelData[4][16]);
00082 int init_trellis_data_8x8_CABAC(int **tblock, int block_x, int qp_per, int qp_rem,
00083 int **levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,
00084 levelDataStruct *dataLevel, int* kStart, int* kStop, int symbolmode);
00085 void init_trellis_data_DC_CAVLC(int **tblock, int qp_per, int qp_rem,
00086 int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,
00087 levelDataStruct *dataLevel, int type);
00088 int init_trellis_data_DC_CABAC(int **tblock, int qp_per, int qp_rem,
00089 int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,
00090 levelDataStruct *dataLevel, int* kStart, int* kStop);
00091 int init_trellis_data_DC_cr_CAVLC(int **tblock, int qp_per, int qp_rem,
00092 int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,
00093 levelDataStruct *dataLevel);
00094 int init_trellis_data_DC_cr_CABAC(int **tblock, int qp_per, int qp_rem,
00095 int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,
00096 levelDataStruct *dataLevel, int* kStart, int* kStop);
00097
00098 void RDOQ_update_mode(RD_PARAMS *enc_mb, int bslice);
00099 void copy_rddata_trellis (RD_DATA *dest, RD_DATA *src);
00100 void updateMV_mp(int *m_cost, short ref, int list, int h, int v, int blocktype, int *lambda_factor, int block8x8);
00101 void trellis_coding(Slice *currSlice, Macroblock *currMB, int CurrentMbAddr, Boolean prev_recode_mb);
00102
00103 #endif // _RDOQ_H_
00104