📄 rdoq_cabac.c
字号:
levelDataStruct *dataLevel;
for (k = 0; k <= maxK; k++)
{
levelTabMin[k] = 0;
}
if (noCoeff > 0)
{
if (noCoeff > 1)
{
kStart = kInit; kBest = 0; first = 1;
lagrAcc = 0;
for (k = kStart; k <= kStop; k++)
{
lagrAcc += levelData[k].errLevel[0];
}
if (levelData[kStart].noLevels > 2)
{
lagrAcc -= levelData[kStart].errLevel[0];
lagrLastMin=lambda * (cabacEstBits->lastBits[pos2ctx_last[type][kStart]][1] - cabacEstBits->lastBits[pos2ctx_last[type][kStart]][0]) + lagrAcc;
kBest = kStart;
kStart++;
first = 0;
}
for (k = kStart; k <= kStop; k++)
{
dataLevel = &levelData[k];
lagrMin = dataLevel->errLevel[0] + lambda * cabacEstBits->significantBits[pos2ctx_map[type][k]][0];
lagrAcc -= dataLevel->errLevel[0];
if (dataLevel->noLevels > 1)
{
estBits = SIGN_BITS + cabacEstBits->significantBits[pos2ctx_map[type][k]][1]+
cabacEstBits->greaterOneBits[0][4][0];
lagrLast = dataLevel->errLevel[1] + lambda * (estBits + cabacEstBits->lastBits[pos2ctx_last[type][k]][1]) + lagrAcc;
lagr = dataLevel->errLevel[1] + lambda * (estBits + cabacEstBits->lastBits[pos2ctx_last[type][k]][0]);
lagrMin = (lagr < lagrMin) ? lagr : lagrMin;
if (lagrLast < lagrLastMin || first==1)
{
kBest = k;
first = 0;
lagrLastMin = lagrLast;
}
}
lagrAcc += lagrMin;
}
kStart = kBest;
}
else
{
kStart = kStop;
}
lagrTabMin = 0;
for (k = 0; k <= kStart; k++)
{
lagrTabMin += levelData[k].errLevel[0];
}
// Initial Lagrangian calculation
lagrTab=0;
//////////////////////////
lagrTabMin += (lambda*estCBP);
iBest = 0; first = 1;
for (k = kStart; k >= 0; k--)
{
dataLevel = &levelData[k];
last = (k == kStart);
if (!last)
{
lagrMin = dataLevel->errLevel[0] + lambda * cabacEstBits->significantBits[pos2ctx_map[type][k]][0];
iBest = 0;
first = 0;
}
for (i = 1; i < dataLevel->noLevels; i++)
{
estBits = SIGN_BITS + cabacEstBits->significantBits[pos2ctx_map[type][k]][1];
estBits += cabacEstBits->lastBits[pos2ctx_last[type][k]][last];
// greater than 1
greater_one = (dataLevel->level[i] > 1);
c1Tab[i] = c1;
c2Tab[i] = c2;
ctx = imin(c1Tab[i], 4);
estBits += cabacEstBits->greaterOneBits[0][ctx][greater_one];
// magnitude if greater than 1
if (greater_one)
{
ctx = imin(c2Tab[i], max_c2[type]);
if ( (dataLevel->level[i] - 2) < MAX_PREC_COEFF)
{
estBits += precalcUnaryLevelTab[cabacEstBits->greaterOneState[ctx]][dataLevel->level[i] - 2];
}
else
{
estBits += est_unary_exp_golomb_level_encode(dataLevel->level[i] - 2, ctx, type);
}
c1Tab[i] = 0;
c2Tab[i]++;
}
else if (c1Tab[i])
{
c1Tab[i]++;
}
lagr = dataLevel->errLevel[i] + lambda*estBits;
if (lagr<lagrMin || first==1)
{
iBest = i;
lagrMin=lagr;
first = 0;
}
}
if (iBest>0)
{
c1 = c1Tab[iBest];
c2 = c2Tab[iBest];
}
levelTab[k] = dataLevel->level[iBest];
lagrTab += lagrMin;
}
///////////////////////////////////
if (lagrTab < lagrTabMin)
{
memcpy(levelTabMin, levelTab, (kStart + 1) * sizeof(int));
}
}
}
/*!
****************************************************************************
* \brief
* estimate unary exp golomb bit cost
****************************************************************************
*/
int est_unary_exp_golomb_level_encode(unsigned int symbol, int ctx, int type)
{
estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
unsigned int l = symbol, k = 1;
unsigned int exp_start = 13; // 15-2 : 0,1 level decision always sent
int estBits;
if (symbol==0)
{
estBits = cabacEstBits->greaterOneBits[1][ctx][0];
return (estBits);
}
else
{
estBits = cabacEstBits->greaterOneBits[1][ctx][1];
// this could be done using min of the two conditionals * value
while (((--l)>0) && (++k <= exp_start))
{
estBits += cabacEstBits->greaterOneBits[1][ctx][1];
}
if (symbol < exp_start)
{
estBits += cabacEstBits->greaterOneBits[1][ctx][0];
}
else
{
estBits+=est_exp_golomb_encode_eq_prob(symbol - exp_start);
}
}
return(estBits);
}
/*!
****************************************************************************
* \brief
* Initialize levelData
****************************************************************************
*/
int init_trellis_data_4x4_CABAC(int (*tblock)[16], int block_x, 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;
static int *m7;
int end_coeff_ctr = ( ( type == LUMA_4x4 ) ? 16 : 15 );
int q_bits = Q_BITS + qp_per;
int q_offset = ( 1 << (q_bits - 1) );
int level, lowerInt, k;
double err, estErr;
for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
{
i = *p_scan++; // horizontal position
j = *p_scan++; // vertical position
m7 = &tblock[j][block_x + i];
if (*m7 == 0)
{
dataLevel->levelDouble = 0;
dataLevel->level[0] = 0;
dataLevel->noLevels = 1;
err = 0.0;
dataLevel->errLevel[0] = 0.0;
}
else
{
estErr = ((double) estErr4x4[qp_rem][j][i]) / norm_factor_4x4;
dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
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] = 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);
}
/*
****************************************************************************
* \brief
* Initialize levelData
****************************************************************************
*/
int init_trellis_data_8x8_CABAC(int (*tblock)[16], int block_x, int qp_per, int qp_rem, int **levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,
levelDataStruct *dataLevel, int* kStart, int* kStop, int symbolmode)
{
int noCoeff = 0;
static int *m7;
int i, j, coeff_ctr, end_coeff_ctr = 64;
int q_bits = Q_BITS_8 + qp_per;
int q_offset = ( 1 << (q_bits - 1) );
double err, estErr;
int level, lowerInt, k;
for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
{
i = *p_scan++; // horizontal position
j = *p_scan++; // vertical position
m7 = &tblock[j][block_x + i];
if (*m7 == 0)
{
dataLevel->levelDouble = 0;
dataLevel->level[0] = 0;
dataLevel->noLevels = 1;
err = 0.0;
dataLevel->errLevel[0] = 0.0;
}
else
{
estErr = (double) estErr8x8[qp_rem][j][i] / norm_factor_8x8;
dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
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] = 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);
}
/*!
****************************************************************************
* \brief
* Initialize levelData for Luma DC
****************************************************************************
*/
int init_trellis_data_DC_CABAC(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 noCoeff = 0;
int i, j, coeff_ctr, end_coeff_ctr = 16;
int q_bits = Q_BITS + qp_per + 1;
int q_offset = ( 1 << (q_bits - 1) );
int level, lowerInt, k;
int *m7;
double err, 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++)
{
i = *p_scan++; // horizontal position
j = *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] = 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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -