📄 q_matrix.c
字号:
/*!
*************************************************************************************
* \file q_matrix.c
*
* \brief
* read q_matrix parameters from input file: q_matrix.cfg
*
*************************************************************************************
*/
#include "global.h"
#include "memalloc.h"
extern char *GetConfigFileContent (char *Filename, int error_type);
#define MAX_ITEMS_TO_PARSE 1000
const int quant_coef[6][4][4] = {
{{13107, 8066,13107, 8066},{ 8066, 5243, 8066, 5243},{13107, 8066,13107, 8066},{ 8066, 5243, 8066, 5243}},
{{11916, 7490,11916, 7490},{ 7490, 4660, 7490, 4660},{11916, 7490,11916, 7490},{ 7490, 4660, 7490, 4660}},
{{10082, 6554,10082, 6554},{ 6554, 4194, 6554, 4194},{10082, 6554,10082, 6554},{ 6554, 4194, 6554, 4194}},
{{ 9362, 5825, 9362, 5825},{ 5825, 3647, 5825, 3647},{ 9362, 5825, 9362, 5825},{ 5825, 3647, 5825, 3647}},
{{ 8192, 5243, 8192, 5243},{ 5243, 3355, 5243, 3355},{ 8192, 5243, 8192, 5243},{ 5243, 3355, 5243, 3355}},
{{ 7282, 4559, 7282, 4559},{ 4559, 2893, 4559, 2893},{ 7282, 4559, 7282, 4559},{ 4559, 2893, 4559, 2893}}
};
const int dequant_coef[6][4][4] = {
{{10, 13, 10, 13},{ 13, 16, 13, 16},{10, 13, 10, 13},{ 13, 16, 13, 16}},
{{11, 14, 11, 14},{ 14, 18, 14, 18},{11, 14, 11, 14},{ 14, 18, 14, 18}},
{{13, 16, 13, 16},{ 16, 20, 16, 20},{13, 16, 13, 16},{ 16, 20, 16, 20}},
{{14, 18, 14, 18},{ 18, 23, 18, 23},{14, 18, 14, 18},{ 18, 23, 18, 23}},
{{16, 20, 16, 20},{ 20, 25, 20, 25},{16, 20, 16, 20},{ 20, 25, 20, 25}},
{{18, 23, 18, 23},{ 23, 29, 23, 29},{18, 23, 18, 23},{ 23, 29, 23, 29}}
};
const int quant_coef8[6][8][8] =
{
{
{13107, 12222, 16777, 12222, 13107, 12222, 16777, 12222},
{12222, 11428, 15481, 11428, 12222, 11428, 15481, 11428},
{16777, 15481, 20972, 15481, 16777, 15481, 20972, 15481},
{12222, 11428, 15481, 11428, 12222, 11428, 15481, 11428},
{13107, 12222, 16777, 12222, 13107, 12222, 16777, 12222},
{12222, 11428, 15481, 11428, 12222, 11428, 15481, 11428},
{16777, 15481, 20972, 15481, 16777, 15481, 20972, 15481},
{12222, 11428, 15481, 11428, 12222, 11428, 15481, 11428}
},
{
{11916, 11058, 14980, 11058, 11916, 11058, 14980, 11058},
{11058, 10826, 14290, 10826, 11058, 10826, 14290, 10826},
{14980, 14290, 19174, 14290, 14980, 14290, 19174, 14290},
{11058, 10826, 14290, 10826, 11058, 10826, 14290, 10826},
{11916, 11058, 14980, 11058, 11916, 11058, 14980, 11058},
{11058, 10826, 14290, 10826, 11058, 10826, 14290, 10826},
{14980, 14290, 19174, 14290, 14980, 14290, 19174, 14290},
{11058, 10826, 14290, 10826, 11058, 10826, 14290, 10826}
},
{
{10082, 9675, 12710, 9675, 10082, 9675, 12710, 9675},
{9675, 8943, 11985, 8943, 9675, 8943, 11985, 8943},
{12710, 11985, 15978, 11985, 12710, 11985, 15978, 11985},
{9675, 8943, 11985, 8943, 9675, 8943, 11985, 8943},
{10082, 9675, 12710, 9675, 10082, 9675, 12710, 9675},
{9675, 8943, 11985, 8943, 9675, 8943, 11985, 8943},
{12710, 11985, 15978, 11985, 12710, 11985, 15978, 11985},
{9675, 8943, 11985, 8943, 9675, 8943, 11985, 8943}
},
{
{9362, 8931, 11984, 8931, 9362, 8931, 11984, 8931},
{8931, 8228, 11259, 8228, 8931, 8228, 11259, 8228},
{11984, 11259, 14913, 11259, 11984, 11259, 14913, 11259},
{8931, 8228, 11259, 8228, 8931, 8228, 11259, 8228},
{9362, 8931, 11984, 8931, 9362, 8931, 11984, 8931},
{8931, 8228, 11259, 8228, 8931, 8228, 11259, 8228},
{11984, 11259, 14913, 11259, 11984, 11259, 14913, 11259},
{8931, 8228, 11259, 8228, 8931, 8228, 11259, 8228}
},
{
{8192, 7740, 10486, 7740, 8192, 7740, 10486, 7740},
{7740, 7346, 9777, 7346, 7740, 7346, 9777, 7346},
{10486, 9777, 13159, 9777, 10486, 9777, 13159, 9777},
{7740, 7346, 9777, 7346, 7740, 7346, 9777, 7346},
{8192, 7740, 10486, 7740, 8192, 7740, 10486, 7740},
{7740, 7346, 9777, 7346, 7740, 7346, 9777, 7346},
{10486, 9777, 13159, 9777, 10486, 9777, 13159, 9777},
{7740, 7346, 9777, 7346, 7740, 7346, 9777, 7346}
},
{
{7282, 6830, 9118, 6830, 7282, 6830, 9118, 6830},
{6830, 6428, 8640, 6428, 6830, 6428, 8640, 6428},
{9118, 8640, 11570, 8640, 9118, 8640, 11570, 8640},
{6830, 6428, 8640, 6428, 6830, 6428, 8640, 6428},
{7282, 6830, 9118, 6830, 7282, 6830, 9118, 6830},
{6830, 6428, 8640, 6428, 6830, 6428, 8640, 6428},
{9118, 8640, 11570, 8640, 9118, 8640, 11570, 8640},
{6830, 6428, 8640, 6428, 6830, 6428, 8640, 6428}
}
};
const int dequant_coef8[6][8][8] =
{
{
{20, 19, 25, 19, 20, 19, 25, 19},
{19, 18, 24, 18, 19, 18, 24, 18},
{25, 24, 32, 24, 25, 24, 32, 24},
{19, 18, 24, 18, 19, 18, 24, 18},
{20, 19, 25, 19, 20, 19, 25, 19},
{19, 18, 24, 18, 19, 18, 24, 18},
{25, 24, 32, 24, 25, 24, 32, 24},
{19, 18, 24, 18, 19, 18, 24, 18}
},
{
{22, 21, 28, 21, 22, 21, 28, 21},
{21, 19, 26, 19, 21, 19, 26, 19},
{28, 26, 35, 26, 28, 26, 35, 26},
{21, 19, 26, 19, 21, 19, 26, 19},
{22, 21, 28, 21, 22, 21, 28, 21},
{21, 19, 26, 19, 21, 19, 26, 19},
{28, 26, 35, 26, 28, 26, 35, 26},
{21, 19, 26, 19, 21, 19, 26, 19}
},
{
{26, 24, 33, 24, 26, 24, 33, 24},
{24, 23, 31, 23, 24, 23, 31, 23},
{33, 31, 42, 31, 33, 31, 42, 31},
{24, 23, 31, 23, 24, 23, 31, 23},
{26, 24, 33, 24, 26, 24, 33, 24},
{24, 23, 31, 23, 24, 23, 31, 23},
{33, 31, 42, 31, 33, 31, 42, 31},
{24, 23, 31, 23, 24, 23, 31, 23}
},
{
{28, 26, 35, 26, 28, 26, 35, 26},
{26, 25, 33, 25, 26, 25, 33, 25},
{35, 33, 45, 33, 35, 33, 45, 33},
{26, 25, 33, 25, 26, 25, 33, 25},
{28, 26, 35, 26, 28, 26, 35, 26},
{26, 25, 33, 25, 26, 25, 33, 25},
{35, 33, 45, 33, 35, 33, 45, 33},
{26, 25, 33, 25, 26, 25, 33, 25}
},
{
{32, 30, 40, 30, 32, 30, 40, 30},
{30, 28, 38, 28, 30, 28, 38, 28},
{40, 38, 51, 38, 40, 38, 51, 38},
{30, 28, 38, 28, 30, 28, 38, 28},
{32, 30, 40, 30, 32, 30, 40, 30},
{30, 28, 38, 28, 30, 28, 38, 28},
{40, 38, 51, 38, 40, 38, 51, 38},
{30, 28, 38, 28, 30, 28, 38, 28}
},
{
{36, 34, 46, 34, 36, 34, 46, 34},
{34, 32, 43, 32, 34, 32, 43, 32},
{46, 43, 58, 43, 46, 43, 58, 43},
{34, 32, 43, 32, 34, 32, 43, 32},
{36, 34, 46, 34, 36, 34, 46, 34},
{34, 32, 43, 32, 34, 32, 43, 32},
{46, 43, 58, 43, 46, 43, 58, 43},
{34, 32, 43, 32, 34, 32, 43, 32}
}
};
int matrix4x4_check[6] = {0, 0, 0, 0, 0, 0};
int matrix8x8_check[6] = {0, 0, 0, 0, 0, 0};
static const char MatrixType4x4[6][20] =
{
"INTRA4X4_LUMA",
"INTRA4X4_CHROMAU",
"INTRA4X4_CHROMAV",
"INTER4X4_LUMA",
"INTER4X4_CHROMAU",
"INTER4X4_CHROMAV"
};
static const char MatrixType8x8[6][20] =
{
"INTRA8X8_LUMA",
"INTER8X8_LUMA",
"INTRA8X8_CHROMAU", // only for 4:4:4
"INTER8X8_CHROMAU", // only for 4:4:4
"INTRA8X8_CHROMAV", // only for 4:4:4
"INTER8X8_CHROMAV" // only for 4:4:4
};
int *****LevelScale4x4Comp;
int *****LevelScale8x8Comp;
int *****InvLevelScale4x4Comp;
int *****InvLevelScale8x8Comp;
short ScalingList4x4input[6][16];
short ScalingList8x8input[6][64];
short ScalingList4x4[6][16];
short ScalingList8x8[6][64];
short UseDefaultScalingMatrix4x4Flag[6];
short UseDefaultScalingMatrix8x8Flag[6];
int *qp_per_matrix;
int *qp_rem_matrix;
static const short Quant_intra_default[16] =
{
6,13,20,28,
13,20,28,32,
20,28,32,37,
28,32,37,42
};
static const short Quant_inter_default[16] =
{
10,14,20,24,
14,20,24,27,
20,24,27,30,
24,27,30,34
};
static const short Quant8_intra_default[64] =
{
6,10,13,16,18,23,25,27,
10,11,16,18,23,25,27,29,
13,16,18,23,25,27,29,31,
16,18,23,25,27,29,31,33,
18,23,25,27,29,31,33,36,
23,25,27,29,31,33,36,38,
25,27,29,31,33,36,38,40,
27,29,31,33,36,38,40,42
};
static const short Quant8_inter_default[64] =
{
9,13,15,17,19,21,22,24,
13,13,17,19,21,22,24,25,
15,17,19,21,22,24,25,27,
17,19,21,22,24,25,27,28,
19,21,22,24,25,27,28,30,
21,22,24,25,27,28,30,32,
22,24,25,27,28,30,32,33,
24,25,27,28,30,32,33,35
};
/*!
***********************************************************************
* \brief
* Check the parameter name.
* \param s
* parameter name string
* \param type
* 4x4 or 8x8 matrix type
* \return
* the index number if the string is a valid parameter name, \n
* -1 for error
***********************************************************************
*/
int CheckParameterName (char *s, int *type)
{
int i = 0;
*type = 0;
while ((MatrixType4x4[i] != NULL) && (i<6))
{
if (0==strcmp (MatrixType4x4[i], s))
return i;
else
i++;
}
i = 0;
*type = 1;
while ((MatrixType8x8[i] != NULL) && (i<6))
{
if (0==strcmp (MatrixType8x8[i], s))
return i;
else
i++;
}
return -1;
}
/*!
***********************************************************************
* \brief
* Parse the Q matrix values read from cfg file.
* \param buf
* buffer to be parsed
* \param bufsize
* buffer size of buffer
***********************************************************************
*/
void ParseMatrix (char *buf, int bufsize)
{
char *items[MAX_ITEMS_TO_PARSE];
int MapIdx;
int item = 0;
int InString = 0, InItem = 0;
char *p = buf;
char *bufend = &buf[bufsize];
int IntContent;
int i, j, range, type, cnt;
short *ScalingList;
while (p < bufend)
{
switch (*p)
{
case 13:
p++;
break;
case '#': // Found comment
*p = '\0'; // Replace '#' with '\0' in case of comment immediately following integer or string
while (*p != '\n' && p < bufend) // Skip till EOL or EOF, whichever comes first
p++;
InString = 0;
InItem = 0;
break;
case '\n':
InItem = 0;
InString = 0;
*p++='\0';
break;
case ' ':
case '\t': // Skip whitespace, leave state unchanged
if (InString)
p++;
else
{ // Terminate non-strings once whitespace is found
*p++ = '\0';
InItem = 0;
}
break;
case '"': // Begin/End of String
*p++ = '\0';
if (!InString)
{
items[item++] = p;
InItem = ~InItem;
}
else
InItem = 0;
InString = ~InString; // Toggle
break;
case ',':
p++;
InItem = 0;
break;
default:
if (!InItem)
{
items[item++] = p;
InItem = ~InItem;
}
p++;
}
}
item--;
for (i=0; i<item; i+=cnt)
{
cnt=0;
if (0 > (MapIdx = CheckParameterName (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;
ScalingList = ScalingList4x4input[MapIdx];
matrix4x4_check[MapIdx] = 1; //to indicate matrix found in cfg file
}
else //8x8 matrix
{
range = 64;
ScalingList = ScalingList8x8input[MapIdx];
matrix8x8_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);
}
ScalingList[j] = (short)IntContent; //save value in matrix
}
cnt+=j;
printf (".");
}
}
/*!
***********************************************************************
* \brief
* Check Q Matrix values. If invalid values found in matrix,
* whole matrix will be patch with default value 16.
***********************************************************************
*/
void PatchMatrix(void)
{
short *ScalingList;
int i, cnt, fail;
for(i=0; i<6; i++)
{
if(params->ScalingListPresentFlag[i])
{
ScalingList=ScalingList4x4input[i];
if(matrix4x4_check[i])
{
fail=0;
for(cnt=0; cnt<16; cnt++)
{
if(ScalingList[cnt]<0 || ScalingList[cnt]>255) // ScalingList[0]=0 to indicate use default matrix
{
fail=1;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -