📄 block.c
字号:
{ // 4
{ -30, -61, -80, -74},
{ 71, 73, -11, -77},
{ -85, 28, 68, -62},
{ -57, 81, -73, 35},
},
{ // 5
{ -29, -57, -79, -78},
{ 72, 74, -7, -75},
{ -83, 26, 71, -61},
{ -58, 83, -71, 32},
},
{ // 6
{ -32, -61, -79, -74},
{ 70, 73, -14, -77},
{ -85, 31, 67, -61},
{ -56, 79, -74, 38},
},
{ // 7
{ -34, -61, -77, -75},
{ 71, 71, -10, -79},
{ 83, -28, -72, 59},
{ 57, -83, 72, -32},
},
{ // 8
{ -45, -61, -71, -74},
{ 91, 51, -31, -68},
{ -68, 67, 54, -66},
{ -38, 74, -86, 45},
},
};
const int KLTRow[9][4][4]=
{
{ // 0
{ -41, 86, -74, -42},
{ -62, 56, 56, 79},
{ -75, -26, 58, -82},
{ -72, -71, -66, 41},
},
{ // 1
{ -37, 75, 79, 56},
{ -61, 67, -33, -84},
{ -74, -13, -74, 73},
{ -76, -78, 60, -30},
},
{ // 2
{ -44, 84, -73, -45},
{ -63, 56, 51, 82},
{ -73, -25, 65, -79},
{ -72, -75, -65, 36},
},
{ // 3
{ -47, 87, -71, -39},
{ -65, 50, 64, 75},
{ -73, -34, 52, -85},
{ -68, -71, -68, 46},
},
{ // 4
{ -31, 72, -81, -60},
{ -60, 73, 29, 81},
{ -78, -13, 70, -72},
{ -75, -75, -63, 34},
},
{ // 5
{ -34, 76, -82, -53},
{ -61, 70, 39, 79},
{ -78, -18, 65, -76},
{ -74, -74, -63, 39},
},
{ // 6
{ -31, 73, 83, 57},
{ -60, 71, -28, -83},
{ -77, -9, -71, 73},
{ -76, -77, 60, -31},
},
{ // 7
{ -46, 86, -72, -40},
{ -65, 52, 62, 75},
{ -73, -34, 53, -84},
{ -68, -72, -68, 46},
},
{ // 8
{ -34, 75, 81, 55},
{ -60, 69, -33, -83},
{ -76, -12, -72, 73},
{ -76, -77, 61, -32},
},
};
/*!
*************************************************************************************
* \brief
* Perform mode-dependent inverse 4x4 directional transform
*
* \para itransklt_sep()
* <paragraph>
*
* \author
* - Yan Ye <yye@qualcomm.com>
*************************************************************************************
*/
void itransklt_sep( struct img_par *img, //!< image parameters
int ioff, //!< index to 4x4 block
int joff, //!<
int i0, //!<
int j0,
int ipmode)
{
int i, j, k;
int shift = 20, shiftby2 = 1<<(shift-1);
int ilev[BLOCK_SIZE][BLOCK_SIZE],
temp2D[BLOCK_SIZE][BLOCK_SIZE], y2D [BLOCK_SIZE][BLOCK_SIZE];
for(j = 0; j < BLOCK_SIZE; j++)
for(i = 0; i < BLOCK_SIZE; i++)
{
ilev[j][i] = img->cof[i0][j0][i][j];
}
// inverse transform, column first
for (i=0;i<(BLOCK_SIZE);i++)
{
for (j=0;j<(BLOCK_SIZE);j++)
{
temp2D[i][j] = 0;
for(k = 0; k < BLOCK_SIZE; k++)
temp2D[i][j]+=KLTCol[ipmode][k][i]*(ilev[k][j]);
}
}
// inverse transform, row second
for (i=0;i<(BLOCK_SIZE);i++)
{
for (j=0;j<(BLOCK_SIZE);j++)
{
y2D[i][j] = 0;
for(k = 0; k < BLOCK_SIZE; k++)
y2D[i][j]+=temp2D[i][k]*KLTRow[ipmode][j][k];
}
}
for(j = 0; j < BLOCK_SIZE; j++)
for(i = 0; i < BLOCK_SIZE; i++)
{
int temp = max(0,min(img->max_imgpel_value,(y2D[j][i]+((long)img->mpr[i+ioff][j+joff] <<shift)+shiftby2)>>shift));
img->m7[i][j] = temp;
}
}
const int KLTCol16[4][16][16]=
{
{
{ -26, -27, -28, -30, -31, -32, -32, -33, -33, -34, -34, -34, -34, -34, -34, -34},
{ 39, 41, 40, 38, 32, 27, 21, 16, -3, -9, -17, -24, -34, -39, -44, -46},
{ 36, 36, 29, 20, 0, -12, -24, -32, -49, -45, -36, -22, 6, 24, 40, 49},
{ -40, -36, -22, -3, 32, 46, 51, 45, -21, -33, -37, -33, -13, 3, 19, 29},
{ -21, -14, 3, 18, 29, 19, 0, -19, -52, -32, 6, 43, 60, 33, -17, -58},
{ 50, 26, -18, -53, -51, -13, 34, 57, -12, -22, -16, 2, 28, 21, -4, -27},
{ -28, -6, 24, 32, -9, -27, -16, 15, 56, 6, -48, -49, 26, 48, 11, -39},
{ 49, -2, -52, -36, 39, 46, -7, -52, 22, 20, -12, -31, 0, 29, 14, -23},
{ -27, 14, 30, -10, -30, 12, 27, -13, -45, 33, 44, -32, -46, 36, 42, -38},
{ 41, -37, -39, 41, 34, -46, -30, 49, -25, 2, 26, -3, -31, 13, 26, -20},
{ -19, 25, 8, -27, 18, 6, -20, 6, 40, -53, -12, 57, -49, 1, 51, -31},
{ 35, -51, -7, 52, -55, 10, 51, -40, 22, -20, -12, 27, -16, -4, 18, -10},
{ -11, 24, -21, 6, 16, -31, 28, -10, -24, 55, -53, 20, 22, -52, 52, -21},
{ -25, 55, -53, 23, 18, -48, 52, -25, 13, -22, 16, -2, -17, 33, -30, 12},
{ 14, -32, 39, -30, 26, -29, 20, -6, -14, 35, -47, 40, -40, 48, -37, 14},
{ 15, -33, 43, -39, 41, -49, 41, -22, 18, -32, 37, -30, 26, -28, 20, -8},
},
{
{ -27, -30, -32, -33, -33, -34, -34, -34, -34, -33, -33, -33, -32, -31, -30, -28},
{ 47, 46, 41, 35, 28, 20, 11, 4, -8, -14, -22, -29, -35, -39, -42, -42},
{ 53, 42, 22, 4, -15, -28, -39, -45, -37, -29, -15, -3, 15, 27, 38, 42},
{ -43, -22, 5, 24, 37, 37, 30, 17, -37, -45, -43, -34, -13, 9, 32, 44},
{ 54, 11, -34, -53, -33, 0, 34, 51, 22, 2, -20, -35, -30, -9, 17, 32},
{ -29, 2, 27, 28, -1, -22, -30, -20, 51, 42, 7, -31, -56, -31, 16, 51},
{ 33, -16, -46, -22, 51, 46, -4, -49, -24, 12, 35, 25, -31, -32, -1, 27},
{ -24, 22, 32, -7, -38, -15, 24, 31, -49, -19, 39, 51, -20, -48, -14, 34},
{ 35, -42, -28, 48, 20, -39, -25, 34, 20, -27, -23, 27, 28, -34, -30, 36},
{ -26, 37, 14, -46, 2, 34, 0, -28, 41, -11, -43, 11, 49, -26, -42, 38},
{ 20, -36, 6, 35, -50, 15, 46, -36, -27, 39, 9, -41, 35, -3, -37, 26},
{ -15, 28, -10, -22, 46, -24, -33, 41, -45, 39, 25, -51, 28, 9, -35, 21},
{ 7, -18, 18, -7, -9, 20, -18, 5, 22, -45, 36, -4, -38, 69, -64, 27},
{ -23, 59, -65, 35, 9, -42, 51, -27, 10, -9, 0, 7, -17, 25, -22, 8},
{ -11, 29, -39, 33, -35, 45, -34, 11, 17, -43, 52, -37, 28, -29, 21, -8},
{ 7, -20, 30, -30, 37, -48, 44, -25, 26, -47, 49, -36, 25, -22, 15, -6},
},
{
{ -25, -28, -31, -32, -33, -34, -35, -36, -35, -34, -34, -33, -32, -31, -29, -27},
{ 49, 47, 42, 36, 27, 19, 10, 3, -8, -14, -22, -28, -34, -38, -41, -40},
{ 50, 41, 24, 6, -15, -28, -38, -43, -37, -28, -15, -2, 16, 30, 41, 46},
{ -38, -23, 0, 20, 38, 40, 34, 20, -34, -45, -45, -37, -12, 10, 31, 41},
{ -54, -16, 32, 56, 37, 2, -33, -50, -24, -5, 17, 32, 30, 11, -15, -32},
{ 31, 2, -27, -32, 0, 24, 31, 17, -52, -41, -4, 36, 53, 27, -17, -49},
{ -30, 12, 42, 20, -45, -43, 3, 47, 27, -13, -41, -27, 34, 38, 1, -35},
{ 33, -20, -41, 1, 43, 16, -26, -31, 47, 19, -33, -45, 16, 45, 13, -35},
{ -34, 39, 31, -45, -25, 42, 28, -42, -19, 31, 20, -32, -22, 33, 24, -30},
{ 25, -32, -13, 40, -2, -34, 4, 31, -48, 15, 47, -18, -47, 29, 38, -36},
{ -26, 42, -1, -41, 51, -11, -46, 36, 17, -34, 2, 33, -38, 7, 35, -25},
{ 15, -28, 7, 23, -40, 20, 29, -36, 44, -41, -20, 53, -38, -3, 41, -25},
{ -22, 52, -53, 24, 17, -49, 52, -23, -11, 31, -33, 15, 8, -24, 26, -11},
{ 13, -33, 37, -22, 3, 13, -22, 16, -26, 50, -42, 11, 27, -56, 55, -24},
{ 13, -33, 44, -37, 38, -46, 36, -14, -7, 24, -34, 30, -32, 41, -34, 14},
{ 7, -19, 27, -27, 33, -42, 39, -23, 25, -44, 49, -39, 35, -36, 27, -11},
},
{
{ -21, -24, -27, -30, -32, -34, -35, -36, -36, -36, -35, -35, -34, -33, -31, -29},
{ 42, 43, 42, 38, 32, 25, 16, 9, -1, -9, -18, -26, -33, -39, -43, -44},
{ 45, 42, 31, 17, -4, -18, -31, -39, -44, -37, -23, -8, 11, 26, 40, 47},
{ -40, -31, -10, 12, 36, 44, 42, 31, -28, -40, -43, -36, -16, 5, 25, 36},
{ 47, 23, -17, -46, -46, -15, 23, 48, 34, 12, -16, -37, -36, -14, 16, 37},
{ -35, -11, 22, 39, 16, -14, -35, -33, 46, 39, 8, -27, -50, -28, 15, 47},
{ 30, 0, -34, -33, 30, 38, 7, -31, -39, 5, 46, 40, -38, -44, -4, 35},
{ -39, 9, 47, 21, -45, -34, 18, 45, -39, -19, 27, 41, -13, -37, -12, 26},
{ 34, -28, -35, 30, 33, -32, -32, 33, 31, -32, -31, 34, 30, -34, -30, 33},
{ -32, 34, 27, -41, -17, 39, 13, -39, 39, -14, -39, 17, 42, -27, -36, 33},
{ 30, -39, -9, 42, -40, 6, 39, -27, -28, 39, 8, -40, 41, -8, -40, 30},
{ -24, 35, 0, -35, 46, -16, -37, 38, -38, 37, 17, -46, 34, 1, -36, 23},
{ 19, -42, 39, -15, -20, 47, -47, 19, 17, -43, 43, -19, -13, 35, -37, 16},
{ -19, 44, -45, 22, 7, -29, 36, -20, 22, -41, 34, -9, -24, 49, -47, 20},
{ -15, 36, -43, 32, -30, 37, -28, 9, 10, -31, 41, -33, 35, -47, 38, -14},
{ 11, -28, 36, -33, 37, -47, 41, -22, 21, -39, 43, -34, 30, -32, 24, -8},
},
};
const int KLTRow16[4][16][16]=
{
{
{ -23, 41, 40, -47, -44, 32, -41, 37, -38, 22, -37, 6, -28, 2, -14, -6},
{ -27, 44, 39, -34, -26, 8, 6, -17, 35, -26, 50, -9, 66, -5, 31, 14},
{ -29, 43, 29, -5, 11, -25, 46, -44, 31, -9, 6, 1, -74, 5, -33, -17},
{ -31, 40, 16, 23, 41, -38, 33, -4, -35, 29, -61, 11, 52, 1, 12, 5},
{ -31, 34, 0, 41, 45, -11, -34, 44, -30, -3, 61, -18, -33, -11, 26, 23},
{ -33, 24, -20, 43, 15, 30, -44, 11, 43, -24, -13, 8, 30, 18, -54, -50},
{ -34, 13, -39, 32, -24, 47, -4, -32, 30, 4, -39, 13, -25, -17, 49, 52},
{ -36, 5, -47, 12, -42, 25, 39, -24, -54, 37, 40, -32, 13, 13, -24, -22},
{ -35, -2, -45, -18, -31, -41, 24, 42, -12, -56, -2, 56, -5, -20, 18, -24},
{ -35, -11, -36, -35, -6, -50, -15, 24, 34, 16, -11, -42, 4, 36, -34, 58},
{ -35, -21, -18, -42, 27, -18, -40, -30, 16, 41, -2, -19, -5, -40, 40, -60},
{ -34, -30, 0, -36, 45, 24, -21, -44, -35, -14, 19, 61, 4, 37, -18, 29},
{ -34, -36, 16, -18, 33, 44, 36, 21, -11, -47, -23, -53, 2, -49, -19, 9},
{ -33, -40, 30, 9, 5, 23, 37, 45, 29, 26, 3, 7, -9, 67, 44, -26},
{ -31, -41, 40, 32, -26, -15, 0, 10, 19, 46, 22, 41, 9, -58, -39, 21},
{ -27, -37, 39, 40, -41, -38, -36, -38, -30, -45, -17, -32, -4, 24, 16, -8},
},
{
{ -23, -34, 37, 37, -38, 41, -38, 45, -38, 23, -32, 32, -6, 1, 34, 13},
{ -26, -39, 40, 35, -29, 22, -7, -5, 23, -21, 37, -40, 10, -2, -72, -28},
{ -28, -41, 34, 19, 1, -18, 34, -49, 39, -18, 15, -10, -7, 5, 74, 29},
{ -30, -39, 23, -4, 32, -46, 37, -22, -21, 23, -48, 51, 3, -14, -48, -9},
{ -31, -35, 5, -31, 49, -31, -13, 44, -40, 16, 26, -55, -2, 30, 23, -30},
{ -33, -28, -15, -45, 29, 12, -38, 30, 31, -35, 14, 20, 5, -45, -16, 62},
{ -34, -20, -31, -45, -7, 43, -16, -25, 37, -9, -20, 34, -4, 45, 12, -63},
{ -35, -12, -40, -29, -35, 36, 24, -40, -35, 46, -12, -50, 0, -31, -6, 28},
{ -35, -2, -47, 11, -45, -24, 42, 24, -34, -31, 51, 41, 3, 37, -8, 17},
{ -35, 8, -42, 33, -23, -42, 0, 35, 32, -11, -34, -20, -5, -60, 21, -44},
{ -35, 18, -29, 45, 15, -23, -42, -12, 30, 30, -28, -18, 10, 62, -22, 45},
{ -35, 28, -12, 41, 44, 16, -34, -44, -29, 15, 54, 30, -24, -35, 9, -23},
{ -34, 36, 10, 19, 41, 44, 34, 5, -27, -57, -35, -17, 56, 5, 7, -1},
{ -34, 42, 27, -7, 13, 27, 47, 38, 28, 19, -2, -4, -82, 10, -14, 10},
{ -33, 44, 39, -29, -21, -12, 4, 14, 28, 55, 31, 18, 70, -9, 10, -8},
{ -30, 42, 41, -38, -40, -40, -43, -32, -32, -46, -19, -11, -28, 4, -3, 2},
},
{
{ -23, 43, 45, -42, -43, 36, -38, -37, 38, -28, 28, -15, -23, 21, -2, -4},
{ -28, 46, 41, -30, -22, 8, 6, 18, -36, 35, -38, 23, 54, -49, 5, 10},
{ -31, 43, 28, -3, 15, -28, 43, 43, -31, 11, -4, -3, -60, 56, -5, -12},
{ -33, 38, 11, 24, 43, -40, 29, 3, 37, -41, 48, -26, 37, -37, -7, 1},
{ -34, 30, -8, 41, 43, -8, -35, -44, 27, 9, -50, 45, -15, 14, 32, 27},
{ -35, 20, -26, 42, 11, 30, -41, -15, -40, 28, 12, -27, 8, -1, -55, -56},
{ -36, 9, -39, 30, -26, 44, -2, 32, -29, -9, 33, -25, -5, -2, 55, 57},
{ -36, 1, -44, 10, -45, 23, 36, 31, 43, -34, -24, 53, 1, -1, -35, -24},
{ -36, -6, -41, -24, -35, -39, 28, -37, 25, 43, -24, -56, 5, 3, 33, -23},
{ -35, -14, -31, -40, -8, -47, -13, -30, -35, -3, 29, 29, -11, -2, -52, 56},
{ -34, -23, -15, -45, 26, -17, -41, 24, -23, -37, 11, 27, 12, 4, 54, -58},
{ -33, -32, 3, -36, 45, 25, -24, 46, 33, 2, -43, -48, -17, -16, -31, 29},
{ -32, -37, 19, -14, 34, 45, 38, -15, 20, 51, 43, 29, 35, 41, 4, 3},
{ -30, -40, 32, 12, 5, 24, 41, -45, -29, -22, -7, 2, -55, -60, 11, -16},
{ -27, -41, 41, 34, -25, -15, -1, -12, -24, -48, -36, -25, 49, 52, -10, 13},
{ -24, -37, 41, 41, -39, -41, -40, 37, 31, 44, 29, 16, -20, -21, 4, -5},
},
{
{ -19, 37, 41, -42, 45, -39, 35, 39, 38, -25, 33, -25, -8, 32, -4, -6},
{ -23, 42, 42, -34, 28, -13, 1, -10, -29, 27, -39, 32, 18, -73, 10, 15},
{ -27, 42, 34, -12, -8, 24, -36, -46, -36, 16, -15, 5, -16, 78, -10, -17},
{ -30, 40, 21, 13, -39, 42, -35, -17, 28, -31, 51, -41, 6, -49, -3, 3},
{ -32, 34, 4, 36, -47, 17, 26, 45, 37, -10, -37, 52, -1, 22, 25, 31},
{ -34, 26, -16, 44, -20, -22, 38, 27, -36, 33, 1, -23, 3, -14, -45, -64},
{ -36, 17, -33, 39, 17, -44, 9, -26, -36, 6, 24, -31, -3, 11, 45, 65},
{ -37, 8, -41, 22, 41, -31, -28, -42, 40, -42, -6, 50, -1, -7, -28, -28},
{ -37, 1, -45, -17, 38, 35, -35, 32, 31, 38, -41, -47, 7, 3, 34, -18},
{ -36, -8, -37, -36, 16, 46, 5, 32, -33, -1, 32, 27, -14, 1, -61, 47},
{ -36, -19, -22, -44, -20, 20, 43, -18, -28, -33, 23, 21, 17, 0, 63, -48},
{ -35, -29, -4, -39, -43, -20, 36, -45, 30, -2, -50, -40, -24, -5, -33, 23},
{ -34, -35, 13, -20, -37, -45, -39, 10, 23, 54, 39, 24, 51, 14, -2, 3},
{ -32, -41, 29, 6, -9, -26, -45, 39, -26, -24, -6, 3, -79, -17, 20, -13},
{ -30, -43, 40, 30, 23, 13, -3, 13, -26, -51, -31, -23, 70, 13, -17, 10},
{ -27, -41, 43, 40, 40, 41, 40, -30, 30, 47, 25, 15, -28, -5, 7, -4},
},
};
static int KLTCol16inProd[4][16], KLTRow16inProd[4][16];
/*!
*************************************************************************************
* \brief
* Compute inner product for the input 16x16 matrix
*
* \para compute_inner_product16x16()
* <paragraph>
*
* \author
* - Yan Ye <yye@qualcomm.com>
*************************************************************************************
*/
void compute_inner_product16x16(int matrix[16][16], int isLeft, int *inner_prod)
{
int i, j;
if(isLeft)
for(i = 0; i < 16; i++)
{
inner_prod[i] = 0;
for(j = 0; j < 8; j++)
{
inner_prod[i] += matrix[i][2*j+1]*matrix[i][2*j];
}
}
else
for(i = 0; i < 16; i++)
{
inner_prod[i] = 0;
for(j = 0; j < 8; j++)
{
inner_prod[i] += matrix[2*j+1][i]*matrix[2*j][i];
}
}
}
/*!
*************************************************************************************
* \brief
* Precompute inner products for all 16x16 transform matrices
*
* \para precompute_all_inner_product16x16()
* <paragraph>
*
* \author
* - Yan Ye <yye@qualcomm.com>
*************************************************************************************
*/
void precompute_all_inner_product16x16()
{
int i, j, k;
int temp2D[16][16];
for(i = 0; i < 4; i++)
{
for(j = 0; j < 16; j++)
for(k = 0; k < 16; k++)
temp2D[j][k] = KL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -