x265的DCT

news/2024/9/16 19:12:02/

文章目录

  • DCT相关背景知识
      • DCT变换系数矩阵
          • 32x32变换矩阵系数
          • 其他尺寸变换矩阵系数
      • 变换计算过程
          • 流程图
  • 代码实现
      • 数据
          • 残差变换系数
          • 对应残差
      • 我的简单实现
          • 实现细节
          • 实现代码
      • x265对应代码实现
      • openHEVC代码实现

DCT相关背景知识

DCT变换系数矩阵

标准提供了32x32的系数矩阵,4x4、8x8、16x16的矩阵都可以从中提取出来

32x32变换矩阵系数

左半边
右半边

其他尺寸变换矩阵系数

其他尺寸矩阵变换系数
从上面来看,4x4的变换矩阵,系数为:
[ 64 64 64 64 83 36 − 36 − 83 64 − 64 − 64 64 36 − 83 83 − 36 ] \begin{bmatrix} 64 & 64 & 64 & 64 \\ 83 & 36 & -36 & -83 \\ 64 & -64 & -64 & 64 \\ 36 & -83 & 83 & -36 \end{bmatrix} 64836436643664836436648364836436
其他尺寸的变换系数矩阵也可以从图中对应找到

变换计算过程

流程图

流程图
需要注意的是:

  1. 左乘表示列变换,右乘表示行变换
  2. 反变换的过程中,进行了两次Scale

伸缩矩阵,具体定义为:
伸缩矩阵

代码实现

数据

残差变换系数

残差变换系数

对应残差

残差

我的简单实现

实现细节
  1. 实现公式
    R = D T ⋅ C × S I T 1 ⋅ D × S I T 2 R = D^T \cdot C \times S_{IT1} \cdot D \times S_{IT2} R=DTC×SIT1D×SIT2
  2. 暂时忽略伸缩
    R = D T ⋅ C ⋅ D R = D^T \cdot C \cdot D R=DTCD
  3. 稍加处理
    R = ( C T ⋅ D ) T ⋅ D R = { (C^T \cdot D) }^T \cdot D R=(CTD)TD
  4. 重点来了,到这里之后。
    就可以把公式可以分成两部分
    T m p = C T ⋅ D R = T m p T ⋅ D Tmp =C^T \cdot D \\ R = { Tmp }^T \cdot D Tmp=CTDR=TmpTD
  5. 加入伸缩
    T m p = C T ⋅ D × S I T 1 R = T m p T ⋅ D × S I T 2 Tmp =C^T \cdot D \times S_{IT1} \\ R = { Tmp }^T \cdot D \times S_{IT2} Tmp=CTD×SIT1R=TmpTD×SIT2
  6. 也就是说,我们可以这样定义函数。
    y = f u n ( a , b , s ) = a T ⋅ b × s y = fun(a,b,s) = a^T \cdot b \times s y=fun(a,b,s)=aTb×s
    函数步骤为:先转置,再列变换,然后伸缩
    也就是说,我们只需要实现这个函数,然后调用两次即可
实现代码
// 变换系数
static const signed char transform[32][32] = {{ 64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64 },{ 90,  90,  88,  85,  82,  78,  73,  67,  61,  54,  46,  38,  31,  22,  13,   4,-4, -13, -22, -31, -38, -46, -54, -61, -67, -73, -78, -82, -85, -88, -90, -90 },{ 90,  87,  80,  70,  57,  43,  25,   9,  -9, -25, -43, -57, -70, -80, -87, -90,-90, -87, -80, -70, -57, -43, -25,  -9,   9,  25,  43,  57,  70,  80,  87,  90 },{ 90,  82,  67,  46,  22,  -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13,13,  38,  61,  78,  88,  90,  85,  73,  54,  31,   4, -22, -46, -67, -82, -90 },{ 89,  75,  50,  18, -18, -50, -75, -89, -89, -75, -50, -18,  18,  50,  75,  89,89,  75,  50,  18, -18, -50, -75, -89, -89, -75, -50, -18,  18,  50,  75,  89 },{ 88,  67,  31, -13, -54, -82, -90, -78, -46, -4,   38,  73,  90,  85,  61,  22,-22, -61, -85, -90, -73, -38,   4,  46,  78,  90,  82,  54,  13, -31, -67, -88 },{ 87,  57,   9, -43, -80, -90, -70, -25,  25,  70,  90,  80,  43,  -9, -57, -87,-87, -57,  -9,  43,  80,  90,  70,  25, -25, -70, -90, -80, -43,   9,  57,  87 },{ 85,  46, -13, -67, -90, -73, -22,  38,  82,  88,  54,  -4, -61, -90, -78, -31,31,  78,  90,  61,   4, -54, -88, -82, -38,  22,  73,  90,  67,  13, -46, -85 },{ 83,  36, -36, -83, -83, -36,  36,  83,  83,  36, -36, -83, -83, -36,  36,  83,83,  36, -36, -83, -83, -36,  36,  83,  83,  36, -36, -83, -83, -36,  36,  83 },{ 82,  22, -54, -90, -61,  13,  78,  85,  31, -46, -90, -67,   4,  73,  88,  38,-38, -88, -73,  -4,  67,  90,  46, -31, -85, -78, -13,  61,  90,  54, -22, -82 },{ 80,   9, -70, -87, -25,  57,  90,  43, -43, -90, -57,  25,  87,  70,  -9, -80,-80,  -9,  70,  87,  25, -57, -90, -43,  43,  90,  57, -25, -87, -70,   9,  80 },{ 78,  -4, -82, -73,  13,  85,  67, -22, -88, -61,  31,  90,  54, -38, -90, -46,46,  90,  38, -54, -90, -31,  61,  88,  22, -67, -85, -13,  73,  82,   4, -78 },{ 75, -18, -89, -50,  50,  89,  18, -75, -75,  18,  89,  50, -50, -89, -18,  75,75, -18, -89, -50,  50,  89,  18, -75, -75,  18,  89,  50, -50, -89, -18,  75 },{ 73, -31, -90, -22,  78,  67, -38, -90, -13,  82,  61, -46, -88,  -4,  85,  54,-54, -85,   4,  88,  46, -61, -82,  13,  90,  38, -67, -78,  22,  90,  31, -73 },{ 70, -43, -87,   9,  90,  25, -80, -57,  57,  80, -25, -90,  -9,  87,  43, -70,-70,  43,  87,  -9, -90, -25,  80,  57, -57, -80,  25,  90,   9, -87, -43,  70 },{ 67, -54, -78,  38,  85, -22, -90,   4,  90,  13, -88, -31,  82,  46, -73, -61,61,  73, -46, -82,  31,  88, -13, -90,  -4,  90,  22, -85, -38,  78,  54, -67 },{ 64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64,64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64 },{ 61, -73, -46,  82,  31, -88, -13,  90,  -4, -90,  22,  85, -38, -78,  54,  67,-67, -54,  78,  38, -85, -22,  90,   4, -90,  13,  88, -31, -82,  46,  73, -61 },{ 57, -80, -25,  90,  -9, -87,  43,  70, -70, -43,  87,   9, -90,  25,  80, -57,-57,  80,  25, -90,   9,  87, -43, -70,  70,  43, -87,  -9,  90, -25, -80,  57 },{ 54, -85,  -4,  88, -46, -61,  82,  13, -90,  38,  67, -78, -22,  90, -31, -73,73,  31, -90,  22,  78, -67, -38,  90, -13, -82,  61,  46, -88,   4,  85, -54 },{ 50, -89,  18,  75, -75, -18,  89, -50, -50,  89, -18, -75,  75,  18, -89,  50,50, -89,  18,  75, -75, -18,  89, -50, -50,  89, -18, -75,  75,  18, -89,  50 },{ 46, -90,  38,  54, -90,  31,  61, -88,  22,  67, -85,  13,  73, -82,   4,  78,-78,  -4,  82, -73, -13,  85, -67, -22,  88, -61, -31,  90, -54, -38,  90, -46 },{ 43, -90,  57,  25, -87,  70,   9, -80,  80,  -9, -70,  87, -25, -57,  90, -43,-43,  90, -57, -25,  87, -70,  -9,  80, -80,   9,  70, -87,  25,  57, -90,  43 },{ 38, -88,  73,  -4, -67,  90, -46, -31,  85, -78,  13,  61, -90,  54,  22, -82,82, -22, -54,  90, -61, -13,  78, -85,  31,  46, -90,  67,   4, -73,  88, -38 },{ 36, -83,  83, -36, -36,  83, -83,  36,  36, -83,  83, -36, -36,  83, -83,  36,36, -83,  83, -36, -36,  83, -83,  36,  36, -83,  83, -36, -36,  83, -83,  36 },{ 31, -78,  90, -61,   4,  54, -88,  82, -38, -22,  73, -90,  67, -13, -46,  85,-85,  46,  13, -67,  90, -73,  22,  38, -82,  88, -54,  -4,  61, -90,  78, -31 },{ 25, -70,  90, -80,  43,   9, -57,  87, -87,  57,  -9, -43,  80, -90,  70, -25,-25,  70, -90,  80, -43,  -9,  57, -87,  87, -57,   9,  43, -80,  90, -70,  25 },{ 22, -61,  85, -90,  73, -38,  -4,  46, -78,  90, -82,  54, -13, -31,  67, -88,88, -67,  31,  13, -54,  82, -90,  78, -46,   4,  38, -73,  90, -85,  61, -22 },{ 18, -50,  75, -89,  89, -75,  50, -18, -18,  50, -75,  89, -89,  75, -50,  18,18, -50,  75, -89,  89, -75,  50, -18, -18,  50, -75,  89, -89,  75, -50,  18 },{ 13, -38,  61, -78,  88, -90,  85, -73,  54, -31,   4,  22, -46,  67, -82,  90,-90,  82, -67,  46, -22,  -4,  31, -54,  73, -85,  90, -88,  78, -61,  38, -13 },{  9, -25,  43, -57,  70, -80,  87, -90,  90, -87,  80, -70,  57, -43,  25, -9,-9,  25, -43,  57, -70,  80, -87,  90, -90,  87, -80,  70, -57,  43, -25,   9 },{  4, -13,  22, -31,  38, -46,  54, -61,  67, -73,  78, -82,  85, -88,  90, -90,90, -90,  88, -85,  82, -78,  73, -67,  61, -54,  46, -38,  31, -22,  13,  -4 },
};// 残差变换系数
short coeffs1[16 * 16] = {
-8730, -180,  -90,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,0,    0,  -90,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,90,    0,  -90,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,90,    0,  -90,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,90,    0,  -90,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,90,    0,  -90,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,90,    0,  -90,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,90,    0,  -90,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0
};// 
static void func(short* src, short* dst, int s) {short add = (1 << (s - 1));for (int r1 = 0; r1 < 16; ++r1) {for (int c2 = 0; c2 < 16; ++c2) {int tmp = 0;for (int t = 0; t < 16; ++t)tmp += src[r1 + t * 16] * transform[2 * t][c2];dst[r1 * 16 + c2] = ((tmp + add) >> s);}}
}static void MyIDCT(short* src, short* dst) {func(src, dst, 7);func(dst, src, 12);
}

x265对应代码实现

const short g_t16[16][16] =
{{ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 },{ 90, 87, 80, 70, 57, 43, 25,  9, -9, -25, -43, -57, -70, -80, -87, -90 },{ 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89 },{ 87, 57,  9, -43, -80, -90, -70, -25, 25, 70, 90, 80, 43, -9, -57, -87 },{ 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83 },{ 80,  9, -70, -87, -25, 57, 90, 43, -43, -90, -57, 25, 87, 70, -9, -80 },{ 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75 },{ 70, -43, -87,  9, 90, 25, -80, -57, 57, 80, -25, -90, -9, 87, 43, -70 },{ 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64 },{ 57, -80, -25, 90, -9, -87, 43, 70, -70, -43, 87,  9, -90, 25, 80, -57 },{ 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50 },{ 43, -90, 57, 25, -87, 70,  9, -80, 80, -9, -70, 87, -25, -57, 90, -43 },{ 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36 },{ 25, -70, 90, -80, 43,  9, -57, 87, -87, 57, -9, -43, 80, -90, 70, -25 },{ 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18 },{  9, -25, 43, -57, 70, -80, 87, -90, 90, -87, 80, -70, 57, -43, 25, -9 }
};static void partialButterflyInverse16(const short* src, short* dst, int shift, int line)
{int j, k;int E[8], O[8];int EE[4], EO[4];int EEE[2], EEO[2];int add = 1 << (shift - 1);for (j = 0; j < line; j++){/* Utilizing symmetry properties to the maximum to minimize the number of multiplications */for (k = 0; k < 8; k++){O[k] = g_t16[1][k] * src[line] + g_t16[3][k] * src[3 * line] + g_t16[5][k] * src[5 * line] + g_t16[7][k] * src[7 * line] +g_t16[9][k] * src[9 * line] + g_t16[11][k] * src[11 * line] + g_t16[13][k] * src[13 * line] + g_t16[15][k] * src[15 * line];}for (k = 0; k < 4; k++){EO[k] = g_t16[2][k] * src[2 * line] + g_t16[6][k] * src[6 * line] + g_t16[10][k] * src[10 * line] + g_t16[14][k] * src[14 * line];}EEO[0] = g_t16[4][0] * src[4 * line] + g_t16[12][0] * src[12 * line];EEE[0] = g_t16[0][0] * src[0] + g_t16[8][0] * src[8 * line];EEO[1] = g_t16[4][1] * src[4 * line] + g_t16[12][1] * src[12 * line];EEE[1] = g_t16[0][1] * src[0] + g_t16[8][1] * src[8 * line];/* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */for (k = 0; k < 2; k++){EE[k] = EEE[k] + EEO[k];EE[k + 2] = EEE[1 - k] - EEO[1 - k];}for (k = 0; k < 4; k++){E[k] = EE[k] + EO[k];E[k + 4] = EE[3 - k] - EO[3 - k];}for (k = 0; k < 8; k++){dst[k] = (short)x265_clip3(-32768, 32767, (E[k] + O[k] + add) >> shift);dst[k + 8] = (short)x265_clip3(-32768, 32767, (E[7 - k] - O[7 - k] + add) >> shift);}src++;dst += 16;}
}static void idct16_c(const short* src, short* dst, __int64 dstStride)
{const int shift_1st = 7;const int shift_2nd = 12 - (X265_DEPTH - 8);ALIGN_VAR_32(short, coef[16 * 16]);ALIGN_VAR_32(short, block[16 * 16]);partialButterflyInverse16(src, coef, shift_1st, 16);partialButterflyInverse16(coef, block, shift_2nd, 16);for (int i = 0; i < 16; i++){memcpy(&dst[i * dstStride], &block[i * 16], 16 * sizeof(short));}
}

openHEVC代码实现

static const signed char transform[32][32] = {{ 64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64 },{ 90,  90,  88,  85,  82,  78,  73,  67,  61,  54,  46,  38,  31,  22,  13,   4,-4, -13, -22, -31, -38, -46, -54, -61, -67, -73, -78, -82, -85, -88, -90, -90 },{ 90,  87,  80,  70,  57,  43,  25,   9,  -9, -25, -43, -57, -70, -80, -87, -90,-90, -87, -80, -70, -57, -43, -25,  -9,   9,  25,  43,  57,  70,  80,  87,  90 },{ 90,  82,  67,  46,  22,  -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13,13,  38,  61,  78,  88,  90,  85,  73,  54,  31,   4, -22, -46, -67, -82, -90 },{ 89,  75,  50,  18, -18, -50, -75, -89, -89, -75, -50, -18,  18,  50,  75,  89,89,  75,  50,  18, -18, -50, -75, -89, -89, -75, -50, -18,  18,  50,  75,  89 },{ 88,  67,  31, -13, -54, -82, -90, -78, -46, -4,   38,  73,  90,  85,  61,  22,-22, -61, -85, -90, -73, -38,   4,  46,  78,  90,  82,  54,  13, -31, -67, -88 },{ 87,  57,   9, -43, -80, -90, -70, -25,  25,  70,  90,  80,  43,  -9, -57, -87,-87, -57,  -9,  43,  80,  90,  70,  25, -25, -70, -90, -80, -43,   9,  57,  87 },{ 85,  46, -13, -67, -90, -73, -22,  38,  82,  88,  54,  -4, -61, -90, -78, -31,31,  78,  90,  61,   4, -54, -88, -82, -38,  22,  73,  90,  67,  13, -46, -85 },{ 83,  36, -36, -83, -83, -36,  36,  83,  83,  36, -36, -83, -83, -36,  36,  83,83,  36, -36, -83, -83, -36,  36,  83,  83,  36, -36, -83, -83, -36,  36,  83 },{ 82,  22, -54, -90, -61,  13,  78,  85,  31, -46, -90, -67,   4,  73,  88,  38,-38, -88, -73,  -4,  67,  90,  46, -31, -85, -78, -13,  61,  90,  54, -22, -82 },{ 80,   9, -70, -87, -25,  57,  90,  43, -43, -90, -57,  25,  87,  70,  -9, -80,-80,  -9,  70,  87,  25, -57, -90, -43,  43,  90,  57, -25, -87, -70,   9,  80 },{ 78,  -4, -82, -73,  13,  85,  67, -22, -88, -61,  31,  90,  54, -38, -90, -46,46,  90,  38, -54, -90, -31,  61,  88,  22, -67, -85, -13,  73,  82,   4, -78 },{ 75, -18, -89, -50,  50,  89,  18, -75, -75,  18,  89,  50, -50, -89, -18,  75,75, -18, -89, -50,  50,  89,  18, -75, -75,  18,  89,  50, -50, -89, -18,  75 },{ 73, -31, -90, -22,  78,  67, -38, -90, -13,  82,  61, -46, -88,  -4,  85,  54,-54, -85,   4,  88,  46, -61, -82,  13,  90,  38, -67, -78,  22,  90,  31, -73 },{ 70, -43, -87,   9,  90,  25, -80, -57,  57,  80, -25, -90,  -9,  87,  43, -70,-70,  43,  87,  -9, -90, -25,  80,  57, -57, -80,  25,  90,   9, -87, -43,  70 },{ 67, -54, -78,  38,  85, -22, -90,   4,  90,  13, -88, -31,  82,  46, -73, -61,61,  73, -46, -82,  31,  88, -13, -90,  -4,  90,  22, -85, -38,  78,  54, -67 },{ 64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64,64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64,  64, -64, -64,  64 },{ 61, -73, -46,  82,  31, -88, -13,  90,  -4, -90,  22,  85, -38, -78,  54,  67,-67, -54,  78,  38, -85, -22,  90,   4, -90,  13,  88, -31, -82,  46,  73, -61 },{ 57, -80, -25,  90,  -9, -87,  43,  70, -70, -43,  87,   9, -90,  25,  80, -57,-57,  80,  25, -90,   9,  87, -43, -70,  70,  43, -87,  -9,  90, -25, -80,  57 },{ 54, -85,  -4,  88, -46, -61,  82,  13, -90,  38,  67, -78, -22,  90, -31, -73,73,  31, -90,  22,  78, -67, -38,  90, -13, -82,  61,  46, -88,   4,  85, -54 },{ 50, -89,  18,  75, -75, -18,  89, -50, -50,  89, -18, -75,  75,  18, -89,  50,50, -89,  18,  75, -75, -18,  89, -50, -50,  89, -18, -75,  75,  18, -89,  50 },{ 46, -90,  38,  54, -90,  31,  61, -88,  22,  67, -85,  13,  73, -82,   4,  78,-78,  -4,  82, -73, -13,  85, -67, -22,  88, -61, -31,  90, -54, -38,  90, -46 },{ 43, -90,  57,  25, -87,  70,   9, -80,  80,  -9, -70,  87, -25, -57,  90, -43,-43,  90, -57, -25,  87, -70,  -9,  80, -80,   9,  70, -87,  25,  57, -90,  43 },{ 38, -88,  73,  -4, -67,  90, -46, -31,  85, -78,  13,  61, -90,  54,  22, -82,82, -22, -54,  90, -61, -13,  78, -85,  31,  46, -90,  67,   4, -73,  88, -38 },{ 36, -83,  83, -36, -36,  83, -83,  36,  36, -83,  83, -36, -36,  83, -83,  36,36, -83,  83, -36, -36,  83, -83,  36,  36, -83,  83, -36, -36,  83, -83,  36 },{ 31, -78,  90, -61,   4,  54, -88,  82, -38, -22,  73, -90,  67, -13, -46,  85,-85,  46,  13, -67,  90, -73,  22,  38, -82,  88, -54,  -4,  61, -90,  78, -31 },{ 25, -70,  90, -80,  43,   9, -57,  87, -87,  57,  -9, -43,  80, -90,  70, -25,-25,  70, -90,  80, -43,  -9,  57, -87,  87, -57,   9,  43, -80,  90, -70,  25 },{ 22, -61,  85, -90,  73, -38,  -4,  46, -78,  90, -82,  54, -13, -31,  67, -88,88, -67,  31,  13, -54,  82, -90,  78, -46,   4,  38, -73,  90, -85,  61, -22 },{ 18, -50,  75, -89,  89, -75,  50, -18, -18,  50, -75,  89, -89,  75, -50,  18,18, -50,  75, -89,  89, -75,  50, -18, -18,  50, -75,  89, -89,  75, -50,  18 },{ 13, -38,  61, -78,  88, -90,  85, -73,  54, -31,   4,  22, -46,  67, -82,  90,-90,  82, -67,  46, -22,  -4,  31, -54,  73, -85,  90, -88,  78, -61,  38, -13 },{  9, -25,  43, -57,  70, -80,  87, -90,  90, -87,  80, -70,  57, -43,  25, -9,-9,  25, -43,  57, -70,  80, -87,  90, -90,  87, -80,  70, -57,  43, -25,   9 },{  4, -13,  22, -31,  38, -46,  54, -61,  67, -73,  78, -82,  85, -88,  90, -90,90, -90,  88, -85,  82, -78,  73, -67,  61, -54,  46, -38,  31, -22,  13,  -4 },
};
static __forceinline short av_clip_int16(int a)
{if ((a + 0x8000U) & ~0xFFFF) return (a >> 31) ^ 0x7FFF;else                      return a;
}#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
#define SET(dst, x)   (dst) = (x)
#define SCALE(dst, x) (dst) = av_clip_int16(((x) + add) >> shift)#define TR_4(dst, src, dstep, sstep, assign, end)                 \do {                                                          \const int e0 = 64 * src[0 * sstep] + 64 * src[2 * sstep]; \const int e1 = 64 * src[0 * sstep] - 64 * src[2 * sstep]; \const int o0 = 83 * src[1 * sstep] + 36 * src[3 * sstep]; \const int o1 = 36 * src[1 * sstep] - 83 * src[3 * sstep]; \\assign(dst[0 * dstep], e0 + o0);                          \assign(dst[1 * dstep], e1 + o1);                          \assign(dst[2 * dstep], e1 - o1);                          \assign(dst[3 * dstep], e0 - o0);                          \} while (0)#define TR_8(dst, src, dstep, sstep, assign, end)                 \do {                                                          \int i, j;                                                 \int e_8[4];                                               \int o_8[4] = { 0 };                                       \for (i = 0; i < 4; i++)                                   \for (j = 1; j < end; j += 2)                          \o_8[i] += transform[4 * j][i] * src[j * sstep];   \TR_4(e_8, src, 1, 2 * sstep, SET, 4);                     \\for (i = 0; i < 4; i++) {                                 \assign(dst[i * dstep], e_8[i] + o_8[i]);              \assign(dst[(7 - i) * dstep], e_8[i] - o_8[i]);        \}                                                         \} while (0)#define TR_16(dst, src, dstep, sstep, assign, end)                \do {                                                          \int i, j;                                                 \int e_16[8];                                              \int o_16[8] = { 0 };                                      \for (i = 0; i < 8; i++)                                   \for (j = 1; j < end; j += 2)                          \o_16[i] += transform[2 * j][i] * src[j * sstep];  \TR_8(e_16, src, 1, 2 * sstep, SET, 8);                    \\for (i = 0; i < 8; i++) {                                 \assign(dst[i * dstep], e_16[i] + o_16[i]);            \assign(dst[(15 - i) * dstep], e_16[i] - o_16[i]);     \}                                                         \} while (0)static void idct_16x16_8(short* coeffs, int col_limit) {int i;int      shift = 7;int      add = 1 << (shift - 1);short* src = coeffs;int limit = FFMIN(col_limit, 16);int limit2 = FFMIN(col_limit + 4, 16);for (i = 0; i < 16; i++) {TR_16(src, src, 16, 16, SCALE, limit2);                  if (limit2 < 16 && i%4 == 0 && !!i)                        limit2 -= 4;                                         src++;                                                    }      shift = 20 - BIT_DEPTH;                                       add = 1 << (shift - 1);                                     for (i = 0; i < 16; i++) {TR_16(coeffs, coeffs, 1, 1, SCALE, limit);             coeffs += 16;                                              }                                                             
};

http://www.ppmy.cn/news/262955.html

相关文章

环保数采仪环境污染在线监控设备 上传监控平台

1. 概述 AF-HK100 环保数采仪是应环保领域各级国控、省控及市控污染源环境在线监控&#xff08;监测&#xff09;系统的需求而开发研制的产品&#xff0c;通过模拟通道、开关通道、数字通道&#xff08;RS232/485/LoRa&#xff09;与前端各类监测仪器/仪表实现无缝连接&#xf…

网络设备监控

原文网址:http://knowhow.innovatedigital.com/network-device-monitoring.html 网络设备包括交换机&#xff0c;路由器和防火墙是任何IT环境的重要组成部分。HQ深覆盖面的操作系统和支持SNMP为基础的应用管理&#xff0c;可以监控代理管理的网络设备&#xff0c;如思科系统&a…

室内监控摄像机能做什么?安装在室内有哪些好处?

室内监控摄像机能做什么&#xff1f;安装在室内&#xff0c;主要是用于办公室&#xff0c;家庭&#xff0c;商铺&#xff0c;工厂以及仓库等。监控什么&#xff1f;监控小孩老人的动态&#xff0c;查看保姆的做事态度&#xff0c;查看家里宠物的生活习性。喜欢在凉台养植物的&a…

云呐|机房监控服务平台,机房监控服务平台有哪些

机房动环监控平台提供平台、万级站点连接能力、电源、电池、油机、空调、烟雾、浸水、门禁、温湿度、视频等智能终端统一连接&#xff0c;提供集中运维监控能力。根据大规模运维管理&#xff0c;积累大量运维数据&#xff0c;降低运维费用&#xff0c;提高运维水平。动环采集一…

安防视频监控直播的画面都是如何采集的?

我们公司这几天在做摄像头对接流媒体服务器推流的测试&#xff0c;突然想起来我好像还没有就直播画面的采集写过什么&#xff0c;所以今天我就来讲一下采集。采集是整个视频推流过程中的第一个环节&#xff0c;它从系统的采集设备中获取原始视频数据&#xff0c;将其输出到下一…

安防监控如何存储?

安防监控是有多个部位组成&#xff0c;比如是需要摄像机、录像机、显示器、交换机等工具。接受录像以后再上传到安防监控系统&#xff0c;并从摄像到图像显示和记录构成独立完整的系统。每年无论是大型的机房监控还是安防监控的视频存储是一大问题。 面对云视频存储的性能、安全…

机械设备远程实时监控方案

摘要&#xff1a;伴随着我国市场经济的不断发展&#xff0c;目前机械设备的使用范围越来越广泛。但是&#xff0c;由于机械设备使用时不容易管理&#xff0c;并且比较分散&#xff0c;同时也存在长期使用的一些机械设备逐渐老化以及操作工在使用机械设备时操作不当而引起设备的…

家用小型监控器安装位置与功能

家用小型监控器安装的位置可选性很多&#xff0c;比如壁橱&#xff0c;酒柜&#xff0c;书架等&#xff0c;这些易于隐藏又不会被注意的角落正是家用小型监控器发挥作用的位置。为什么家用摄像机的体积越来越小&#xff0c;而且功能却越来越强大呢。从速名网的数据可以看出&…

监控产品

海康解码器 主动解码 又称动态解码&#xff0c;由解码器主动连接编码器请求数据流&#xff0c;常见应用&#xff1a;解码上墙&#xff0c;远程录像回放上墙&#xff0c;轮巡解码。 被动解码 解码器不会发起请求,其他设备向解码器上传数据&#xff0c;解码器只有接到数据…

数据监控平台

数据监控平台 监控平台需要实时监控业务指标数据&#xff0c;系统特点&#xff1a;高并发&#xff0c;大数据&#xff0c;低延迟。主要使用的技术&#xff1a; HBase存储海量数据&#xff0c;ScriptEngine引擎&#xff0c;MySQL分表&#xff0c;Redis集群。 高并发&#xf…

监控器材产品如何做好软文?

软文是一种有效的市场宣传手段&#xff0c;是宣传形式之一&#xff0c;是一种以自然、温和的方式来宣传商品、服务的手段。在当前市场竞争激烈的情况下&#xff0c;软文的重要性越来越凸显&#xff0c;是监控器材产品引流宣传的有效手段。可以有效地扩大产品影响力&#xff0c;…

监控平台(二)

Cacti Cacti 在英文中的意思是仙人掌的意思&#xff0c;Cacti 是一套基于 PHP、MySQL、SNMP 及 RRDTool 开发的网络流量监测图形分析工具。它通过 snmpget 来获取数据&#xff0c;使用 RRDtool 绘画图形&#xff0c;而且你完全可以不需要了解 RRDtool 复杂的参数。它提供了非常…

驱动操作控制LED灯

控制LED灯&#xff1a; 驱动如何操作寄存器 rgb_led灯的寄存器是物理地址&#xff0c;在linux内核启动之后&#xff0c; 在使用地址的时候&#xff0c;操作的全是虚拟地址。需要将物理地址 转化为虚拟地址。在驱动代码中操作的虚拟地址就相当于 操作实际的物理地址。 物理地址&…

Mac使用DBeaver连接达梦数据库

Mac使用DBeaver连接达梦数据库 下载达梦驱动包 达梦数据库 在下载页面随便选择一个系统并下载下来。 下载下来的是zip的压缩包解压出来就是一个ISO文件&#xff0c;然后我们打开ISO文件进入目录&#xff1a;/dameng/source/drivers/jdbc 进入目录后找到这几个驱动包&#x…

超市冷柜中板栗冷藏保鲜特性

超市冷柜中板栗冷藏保鲜特性&#xff1a;首先板栗是呼吸跃变型果实&#xff0c;板栗采后水分含量高&#xff0c;呼吸作用十分旺盛&#xff0c;存放不当易发生腐烂、失水、发芽及虫害等。其次板栗采后怕热、怕于、怕湿、怕冻&#xff0c;要注意保证贮运条件适当&#xff0c;否则…

2021-2027全球与中国立式双门冷柜市场现状及未来发展趋势

本报告研究全球与中国市场立式双门冷柜的产能、产量、销量、销售额、价格及未来趋势。重点分析全球与中国市场的主要厂商产品特点、产品规格、价格、销量、销售收入及全球和中国市场主要生产商的市场份额。历史数据为2016至2020年&#xff0c;预测数据为2021至2027年。 主要生产…

深化管理、提升IT的数据平台建设方案

谈到信息化&#xff0c;每个企业有每个企业的业务模式&#xff0c;每个企业有每个企业不同的思考。落地有效的信息化建设一定紧跟着企业的发展&#xff0c;围绕业务和管理&#xff0c;来提升效率&#xff0c;创造价值。 对于企业如何在发展的不同阶段提升信息化建设&#xff0…

世界第一家完成两百万次AI验箱自动箱况检测,上亿次集装箱识别,产品运行时长超660万小时,全球No.1集装箱人工智能企业中集飞瞳

世界第一家完成两百万次AI验箱自动箱况检测&#xff0c;上亿次集装箱识别&#xff0c;产品累计运行时长超660万小时&#xff0c;全球No.1集装箱人工智能AI企业中集飞瞳。中集飞瞳全球港航人工智能独角兽&#xff0c;成熟港航人工智能AI产品行业第一&#xff0c;人工智能产品与人…

冷柜不“冷” 酸奶“短命”

“长春明天有望达到38℃&#xff0c;大家出门注意翻面儿&#xff0c;注意火候&#xff0c;带上孜然&#xff0c;辣椒面儿&#xff0c;千万别烤老了&#xff01;”这几天&#xff0c;遭遇高温的长春人充分发挥“乐观主义精神”&#xff0c;在聊天群里转发各种调侃气温的段子。 “…

24通道分体式高频RFID读写器|读卡器在智能药品冷柜领域的应用与方案

24通道高频RFID读写器|读卡器HX9299TZF-FZ24是一款采用13.56MHZ的ISO/IEC 15693 协议电子标签读写器&#xff0c;全数字信号处理设计&#xff0c;结合专有的高效电子标签碰撞处理算法&#xff0c;在保持高识读率的同时&#xff0c;实现对电子标签的快速读写处理&#xff0c;广泛…