Skip to content

Instantly share code, notes, and snippets.

@Mainvooid
Last active January 3, 2019 04:26
Show Gist options
  • Select an option

  • Save Mainvooid/cb049e10de449f24844c766b1d760cee to your computer and use it in GitHub Desktop.

Select an option

Save Mainvooid/cb049e10de449f24844c766b1d760cee to your computer and use it in GitHub Desktop.
根据编码质量修改原始量化表,NPP实现与普通实现对比 #C++ #NPP
#include <iostream>
#include <npp.h>
using namespace std;
unsigned char _STD_Y_QT[64] =
{
16, 11, 10, 16, 24, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 16, 24, 40, 57, 69, 56,
14, 17, 22, 29, 51, 87, 80, 62,
18, 22, 37, 56, 68, 109, 103, 77,
24, 35, 55, 64, 81, 104, 113, 92,
49, 64, 78, 87, 103, 121, 120, 101,
72, 92, 95, 98, 112, 100, 103, 99
};
unsigned char _STD_UV_QT[64] =
{
17, 18, 24, 47, 99, 99, 99, 99,
18, 21, 26, 66, 99, 99, 99, 99,
24, 26, 56, 99, 99, 99, 99, 99,
47, 66, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99
};
unsigned char _STD_Y_QT_npp[64] =
{
16, 11, 10, 16, 24, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 16, 24, 40, 57, 69, 56,
14, 17, 22, 29, 51, 87, 80, 62,
18, 22, 37, 56, 68, 109, 103, 77,
24, 35, 55, 64, 81, 104, 113, 92,
49, 64, 78, 87, 103, 121, 120, 101,
72, 92, 95, 98, 112, 100, 103, 99
};
unsigned char _STD_UV_QT_npp[64] =
{
17, 18, 24, 47, 99, 99, 99, 99,
18, 21, 26, 66, 99, 99, 99, 99,
24, 26, 56, 99, 99, 99, 99, 99,
47, 66, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99
};
void nppsetQTByQuality(int nQualityFactor) {
nppiQuantFwdRawTableInit_JPEG_8u(_STD_Y_QT_npp, nQualityFactor);
nppiQuantFwdRawTableInit_JPEG_8u(_STD_UV_QT_npp, nQualityFactor);
}
void setQTByQuality(int quality)
{
float s;
if (quality < 50)
s = 5000.0f / quality;
else s = 200.0f - 2 * quality;
for (size_t i = 0; i < 64; i++) {
// 亮度
float luminVal = (float)_STD_Y_QT[i];
luminVal = floor((s * luminVal + 50.0f) / 100.0f);
if (luminVal < 1)
luminVal = 1;
else if (luminVal > 255)
luminVal = 255;
_STD_Y_QT[i] = (unsigned char)luminVal;
// 色度
float chromaVal = (float)_STD_UV_QT[i];
chromaVal = floor((s * chromaVal + 50.0f) / 100.0f);
if (chromaVal < 1)
chromaVal = 1;
else if (chromaVal > 255)
chromaVal = 255;
_STD_UV_QT[i] = (unsigned char)chromaVal;
}
}
void printResult() {
for (size_t i = 0; i < 64; i++)
{
if (i % 8 == 0)
{
cout << endl;
}
cout << (int)_STD_Y_QT[i] << ",";
}
cout << endl;
for (size_t i = 0; i < 64; i++)
{
if (i % 8 == 0)
{
cout << endl;
}
cout << (int)_STD_UV_QT[i] << ",";
}
cout << endl;
}
int main()
{
cout << "setQTByQuality:" << endl;
setQTByQuality(90);
printResult();
cout << endl;
cout << "nppsetQTByQuality:" << endl;
nppsetQTByQuality(90);
printResult();
}
/*
结果完全相同.
setQTByQuality:
3,2,2,3,5,8,10,12,
2,2,3,4,5,12,12,11,
3,3,3,5,8,11,14,11,
3,3,4,6,10,17,16,12,
4,4,7,11,14,22,21,15,
5,7,11,13,16,21,23,18,
10,13,16,17,21,24,24,20,
14,18,19,20,22,20,21,20,
3,4,5,9,20,20,20,20,
4,4,5,13,20,20,20,20,
5,5,11,20,20,20,20,20,
9,13,20,20,20,20,20,20,
20,20,20,20,20,20,20,20,
20,20,20,20,20,20,20,20,
20,20,20,20,20,20,20,20,
20,20,20,20,20,20,20,20,
nppsetQTByQuality:
3,2,2,3,5,8,10,12,
2,2,3,4,5,12,12,11,
3,3,3,5,8,11,14,11,
3,3,4,6,10,17,16,12,
4,4,7,11,14,22,21,15,
5,7,11,13,16,21,23,18,
10,13,16,17,21,24,24,20,
14,18,19,20,22,20,21,20,
3,4,5,9,20,20,20,20,
4,4,5,13,20,20,20,20,
5,5,11,20,20,20,20,20,
9,13,20,20,20,20,20,20,
20,20,20,20,20,20,20,20,
20,20,20,20,20,20,20,20,
20,20,20,20,20,20,20,20,
20,20,20,20,20,20,20,20,
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment