📄 rdoq.c
字号:
/*!
*************************************************************************************
* \file rdoq.c
*
* \brief
* Rate Distortion Optimized Quantization based on VCEG-AH21
*************************************************************************************
*/
#include "contributors.h"
#include <math.h>
#include <float.h>
#include "global.h"
#include "image.h"
#include "fmo.h"
#include "macroblock.h"
#include "mb_access.h"
#include "ratectl.h"
#include "rdoq.h"
#include "mv-search.h"
#define RDOQ_BASE 0
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}
}
};
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}
}
};
extern int *mvbits;
double norm_factor_4x4;
double norm_factor_8x8;
extern void SetMotionVectorPredictor (Macroblock *currMB, short pmv[2], char **refPic,
short ***tmp_mv, short ref_frame,
int list, int mb_x, int mb_y,
int blockshape_x, int blockshape_y);
/*!
****************************************************************************
* \brief
* Initialize the parameters related to RDO_Q in slice level
****************************************************************************
*/
void init_rdoq_slice(int slice_type, int symbol_mode)
{
//norm_factor_4x4 = (double) ((int64) 1 << (2 * DQ_BITS + 19)); // norm factor 4x4 is basically (1<<31)
//norm_factor_8x8 = (double) ((int64) 1 << (2 * Q_BITS_8 + 9)); // norm factor 8x8 is basically (1<<41)
norm_factor_4x4 = pow(2, (2 * DQ_BITS + 19));
norm_factor_8x8 = pow(2, (2 * Q_BITS_8 + 9));
}
/*!
****************************************************************************
* \brief
* Initialize levelData for Chroma DC
****************************************************************************
*/
int init_trellis_data_DC_cr(int (*tblock)[4], int qp_per, int qp_rem,
int levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,
levelDataStruct *dataLevel, int* kStart, int* kStop, int type)
{
int noCoeff = 0;
int i, j, coeff_ctr, end_coeff_ctr = ( (type == CHROMA_DC) ? 4 : 8 );
static int *m7;
int q_bits = Q_BITS + qp_per + 1;
int q_offset = ( 1 << (q_bits - 1) );
double err;
int level, lowerInt, k;
double estErr = (double) estErr4x4[qp_rem][0][0] / norm_factor_4x4; // note that we could also use int64
for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
{
j = *p_scan++; // horizontal position
i = *p_scan++; // vertical position
m7 = &tblock[j][i];
if (*m7 == 0)
{
dataLevel->levelDouble = 0;
dataLevel->level[0] = 0;
dataLevel->noLevels = 1;
err = 0.0;
dataLevel->errLevel[0] = 0.0;
}
else
{
dataLevel->levelDouble = iabs(*m7 * levelscale);
level = (dataLevel->levelDouble >> q_bits);
lowerInt=( ((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
dataLevel->level[0] = 0;
if (level == 0 && lowerInt == 1)
{
dataLevel->noLevels = 1;
}
else if (level == 0 && lowerInt == 0)
{
dataLevel->level[1] = level + 1;
dataLevel->noLevels = 2;
*kStop = coeff_ctr;
noCoeff++;
}
else if (level > 0 && lowerInt == 1)
{
dataLevel->level[1] = level;
dataLevel->noLevels = 2;
*kStop = coeff_ctr;
noCoeff++;
}
else
{
dataLevel->level[1] = level;
dataLevel->level[2] = level + 1;
dataLevel->noLevels = 3;
*kStop = coeff_ctr;
*kStart = coeff_ctr;
noCoeff++;
}
for (k = 0; k < dataLevel->noLevels; k++)
{
err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
dataLevel->errLevel[k] = (err * err * estErr);
}
}
dataLevel++;
}
return (noCoeff);
}
void trellis_mp(Macroblock *currMB, int CurrentMbAddr, Boolean prev_recode_mb)
{
int masterQP = 0, deltaQP;
int qp_left, qp_up;
#if RDOQ_BASE
const int deltaQPTabB[] = {0, 1, -1, 2, 3, -2, 4, 5, -3};
const int deltaQPTabP[] = {0, -1, 1, -2, 2, -3, 3, -4, 4};
#endif
int deltaQPCnt;
int qp_anchor;
int prev_mb = FmoGetPreviousMBNr(img->current_mb_nr);
int qp_offset = (img->type == B_SLICE) ? (params->RDOQ_QP_Num / 3): (params->RDOQ_QP_Num >> 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -