📄 q_offsets.c
字号:
item--;
for (i = 0; i < item; i += cnt)
{
cnt = 0;
if (0 > (MapIdx = CheckOffsetParameterName (items[i + cnt], &type)))
{
snprintf (errortext, ET_SIZE,
" Parsing error in config file: Parameter Name '%s' not recognized.",
items[i + cnt]);
error (errortext, 300);
}
cnt++;
if (strcmp ("=", items[i + cnt]))
{
snprintf (errortext, ET_SIZE,
" Parsing error in config file: '=' expected as the second token in each item.");
error (errortext, 300);
}
cnt++;
if (!type) //4x4 Matrix
{
range = 16;
OffsetList = OffsetList4x4input[MapIdx];
offset4x4_check[MapIdx] = 1; //to indicate matrix found in cfg file
}
else //8x8 matrix
{
range = 64;
OffsetList = OffsetList8x8input[MapIdx];
offset8x8_check[MapIdx] = 1; //to indicate matrix found in cfg file
}
for (j = 0; j < range; j++)
{
if (1 != sscanf (items[i + cnt + j], "%d", &IntContent))
{
snprintf (errortext, ET_SIZE,
" Parsing error: Expected numerical value for Parameter of %s, found '%s'.",
items[i], items[i + cnt + j]);
error (errortext, 300);
}
OffsetList[j] = (short) IntContent; //save value in matrix
}
cnt += j;
printf (".");
}
}
/*!
***********************************************************************
* \brief
* Initialise Q offset matrix values.
***********************************************************************
*/
void Init_QOffsetMatrix ()
{
char *content;
allocate_QOffsets ();
if (input->OffsetMatrixPresentFlag)
{
printf ("Parsing Quantization Offset Matrix file %s ",
input->QOffsetMatrixFile);
content = GetConfigFileContent (input->QOffsetMatrixFile, 0);
if (content != '\0')
ParseQOffsetMatrix (content, strlen (content));
else
{
printf
("\nError: %s\nProceeding with default values for all matrices.",
errortext);
input->OffsetMatrixPresentFlag = 0;
}
printf ("\n");
free (content);
}
//! Now set up all offset params. This process could be reused if we wish to re-init offsets
InitOffsetParam ();
}
/*!
************************************************************************
* \brief
* Intit quantization offset params
*
* \par Input:
* none
*
* \par Output:
* none
************************************************************************
*/
void InitOffsetParam ()
{
int i, k;
int max_qp_luma = (4 + 6*(input->BitDepthLuma) - MIN_QP);
int max_qp_cr = (4 + 6*(input->BitDepthChroma) - MIN_QP);
for (i = 0; i < (input->AdaptRoundingFixed ? 1 : imax(max_qp_luma, max_qp_cr)); i++)
{
if (input->OffsetMatrixPresentFlag)
{
memcpy(&(OffsetList4x4[i][0][0]),&(OffsetList4x4input[0][0]), 15 * 16 * sizeof(short));
memcpy(&(OffsetList8x8[i][0][0]),&(OffsetList8x8input[0][0]), 15 * 64 * sizeof(short));
}
else
{
// 0 (INTRA4X4_LUMA_INTRA)
memcpy(&(OffsetList4x4[i][0][0]),&(Offset_intra_default_intra[0]), 16 * sizeof(short));
for (k = 1; k < 3; k++) // 1,2 (INTRA4X4_CHROMA_INTRA)
memcpy(&(OffsetList4x4[i][k][0]),&(Offset_intra_default_chroma[0]), 16 * sizeof(short));
for (k = 3; k < 9; k++) // 3,4,5,6,7,8 (INTRA4X4_LUMA/CHROMA_INTERP/INTERB)
memcpy(&(OffsetList4x4[i][k][0]),&(Offset_intra_default_inter[0]), 16 * sizeof(short));
for (k = 9; k < 15; k++) // 9,10,11,12,13,14 (INTER4X4)
memcpy(&(OffsetList4x4[i][k][0]),&(Offset_inter_default[0]), 16 * sizeof(short));
// 0 (INTRA8X8_LUMA_INTRA)
memcpy(&(OffsetList8x8[i][0][0]),&(Offset8_intra_default_intra[0]), 64 * sizeof(short));
for (k = 1; k < 3; k++) // 1,2 (INTRA8X8_LUMA_INTERP/INTERB)
memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_intra_default_inter[0]), 64 * sizeof(short));
for (k = 3; k < 5; k++) // 3,4 (INTER8X8_LUMA_INTERP/INTERB)
memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_inter_default[0]), 64 * sizeof(short));
// 5 (INTRA8X8_CHROMAU_INTRA)
memcpy(&(OffsetList8x8[i][5][0]),&(Offset8_intra_default_chroma[0]), 64 * sizeof(short));
for (k = 6; k < 8; k++) // 6,7 (INTRA8X8_CHROMAU_INTERP/INTERB)
memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_intra_default_inter[0]), 64 * sizeof(short));
for (k = 8; k < 10; k++) // 8,9 (INTER8X8_CHROMAU_INTERP/INTERB)
memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_inter_default[0]), 64 * sizeof(short));
// 10 (INTRA8X8_CHROMAV_INTRA)
memcpy(&(OffsetList8x8[i][10][0]),&(Offset8_intra_default_chroma[0]), 64 * sizeof(short));
for (k = 11; k < 13; k++) // 11,12 (INTRA8X8_CHROMAV_INTERP/INTERB)
memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_intra_default_inter[0]), 64 * sizeof(short));
for (k = 13; k < 15; k++) // 8,9 (INTER8X8_CHROMAV_INTERP/INTERB)
memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_inter_default[0]), 64 * sizeof(short));
}
}
}
/*!
************************************************************************
* \brief
* Calculation of the quantization offset params at the frame level
*
* \par Input:
* none
*
* \par Output:
* none
************************************************************************
*/
void CalculateOffsetParam ()
{
int i, j, k, l, temp;
int qp_per, qp;
int img_type = (img->type == SI_SLICE ? I_SLICE : (img->type == SP_SLICE ? P_SLICE : img->type));
int max_qp_scale = imax(img->bitdepth_luma_qp_scale, img->bitdepth_chroma_qp_scale);
int max_qp = 51 + max_qp_scale - MIN_QP;
AdaptRndWeight = input->AdaptRndWFactor[img->nal_reference_idc != 0][img_type];
AdaptRndCrWeight = input->AdaptRndCrWFactor[img->nal_reference_idc != 0][img_type];
for (qp = 0; qp < max_qp + 1; qp++)
{
k = qp_per_matrix [qp];
qp_per = Q_BITS + k - OffsetBits;
l = input->AdaptRoundingFixed ? 0 : qp;
for (j = 0; j < 4; j++)
{
for (i = 0; i < 4; i++)
{
temp = (j << 2) + i;
if (img_type == I_SLICE)
{
LevelOffset4x4Luma[1][qp][j][i] = (int) OffsetList4x4[l][0][temp] << qp_per;
LevelOffset4x4Chroma[0][1][qp][j][i] = (int) OffsetList4x4[l][1][temp] << qp_per;
LevelOffset4x4Chroma[1][1][qp][j][i] = (int) OffsetList4x4[l][2][temp] << qp_per;
}
else if (img_type == B_SLICE)
{
LevelOffset4x4Luma[1][qp][j][i] = (int) OffsetList4x4[l][6][temp] << qp_per;
LevelOffset4x4Chroma[0][1][qp][j][i] = (int) OffsetList4x4[l][7][temp] << qp_per;
LevelOffset4x4Chroma[1][1][qp][j][i] = (int) OffsetList4x4[l][8][temp] << qp_per;
}
else
{
LevelOffset4x4Luma[1][qp][j][i] = (int) OffsetList4x4[l][3][temp] << qp_per;
LevelOffset4x4Chroma[0][1][qp][j][i] = (int) OffsetList4x4[l][4][temp] << qp_per;
LevelOffset4x4Chroma[1][1][qp][j][i] = (int) OffsetList4x4[l][5][temp] << qp_per;
}
if (img_type == B_SLICE)
{
LevelOffset4x4Luma[0][qp][j][i] = (int) OffsetList4x4[l][12][temp] << qp_per;
LevelOffset4x4Chroma[0][0][qp][j][i] = (int) OffsetList4x4[l][13][temp] << qp_per;
LevelOffset4x4Chroma[1][0][qp][j][i] = (int) OffsetList4x4[l][14][temp] << qp_per;
}
else
{
LevelOffset4x4Luma[0][qp][j][i] = (int) OffsetList4x4[l][9][temp] << qp_per;
LevelOffset4x4Chroma[0][0][qp][j][i] = (int) OffsetList4x4[l][10][temp] << qp_per;
LevelOffset4x4Chroma[1][0][qp][j][i] = (int) OffsetList4x4[l][11][temp] << qp_per;
}
}
}
}
// setting for 4x4 luma quantization offset
if( IS_INDEPENDENT(input) )
{
if( img->colour_plane_id == 0 )
{
ptLevelOffset4x4Luma = LevelOffset4x4Luma;
}
else if( img->colour_plane_id == 1 )
{
ptLevelOffset4x4Luma = LevelOffset4x4Chroma[0];
}
else if( img->colour_plane_id == 2 )
{
ptLevelOffset4x4Luma = LevelOffset4x4Chroma[1];
}
}
else
{
ptLevelOffset4x4Luma = LevelOffset4x4Luma;
}
}
/*!
************************************************************************
* \brief
* Calculate the quantisation offset parameters
*
************************************************************************
*/
void CalculateOffset8Param ()
{
int i, j, k, temp;
int q_bits, qp;
int max_qp_scale = imax(img->bitdepth_luma_qp_scale, img->bitdepth_chroma_qp_scale);
int max_qp = 51 + max_qp_scale - MIN_QP;
for (qp = 0; qp < max_qp + 1; qp++)
{
q_bits = Q_BITS_8 + qp_per_matrix[qp] - OffsetBits;
k = input->AdaptRoundingFixed ? 0 : qp;
for (j = 0; j < 8; j++)
{
for (i = 0; i < 8; i++)
{
temp = (j << 3) + i;
// INTRA8X8
if (img->type == I_SLICE)
LevelOffset8x8Luma[1][qp][j][i] = (int) OffsetList8x8[k][0][temp] << q_bits;
else if (img->type == B_SLICE)
LevelOffset8x8Luma[1][qp][j][i] = (int) OffsetList8x8[k][2][temp] << q_bits;
else
LevelOffset8x8Luma[1][qp][j][i] = (int) OffsetList8x8[k][1][temp] << q_bits;
// INTER8X8
if (img->type == B_SLICE)
LevelOffset8x8Luma[0][qp][j][i] = (int) OffsetList8x8[k][4][temp] << q_bits;
else
LevelOffset8x8Luma[0][qp][j][i] = (int) OffsetList8x8[k][3][temp] << q_bits;
// INTRA8X8 CHROMAU
if (img->type == I_SLICE)
LevelOffset8x8Chroma[0][1][qp][j][i] = (int) OffsetList8x8[k][5][temp] << q_bits;
else if (img->type == B_SLICE)
LevelOffset8x8Chroma[0][1][qp][j][i] = (int) OffsetList8x8[k][7][temp] << q_bits;
else
LevelOffset8x8Chroma[0][1][qp][j][i] = (int) OffsetList8x8[k][6][temp] << q_bits;
// INTER8X8 CHROMAU
if (img->type == B_SLICE)
LevelOffset8x8Chroma[0][0][qp][j][i] = (int) OffsetList8x8[k][9][temp] << q_bits;
else
LevelOffset8x8Chroma[0][0][qp][j][i] = (int) OffsetList8x8[k][8][temp] << q_bits;
// INTRA8X8 CHROMAV
if (img->type == I_SLICE)
LevelOffset8x8Chroma[1][1][qp][j][i] = (int) OffsetList8x8[k][10][temp] << q_bits;
else if (img->type == B_SLICE)
LevelOffset8x8Chroma[1][1][qp][j][i] = (int) OffsetList8x8[k][12][temp] << q_bits;
else
LevelOffset8x8Chroma[1][1][qp][j][i] = (int) OffsetList8x8[k][11][temp] << q_bits;
// INTER8X8 CHROMAV
if (img->type == B_SLICE)
LevelOffset8x8Chroma[1][0][qp][j][i] = (int) OffsetList8x8[k][14][temp] << q_bits;
else
LevelOffset8x8Chroma[1][0][qp][j][i] = (int) OffsetList8x8[k][13][temp] << q_bits;
}
}
}
// setting for 8x8 luma quantization offset
if( IS_INDEPENDENT(input) )
{
if( img->colour_plane_id == 0 )
{
ptLevelOffset8x8Luma = LevelOffset8x8Luma;
}
else if( img->colour_plane_id == 1 )
{
ptLevelOffset8x8Luma = LevelOffset8x8Chroma[0];
}
else if( img->colour_plane_id == 2 )
{
ptLevelOffset8x8Luma = LevelOffset8x8Chroma[1];
}
}
else
{
ptLevelOffset8x8Luma = LevelOffset8x8Luma;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -