X264 量化分析

34 篇文章 12 订阅
28 篇文章 0 订阅

 一 C语言代码实现

#define QUANT_ONE( coef, mf, f ) \
{ \
    if( (coef) > 0 ) \
        (coef) = (f + (coef)) * (mf) >> 16; \
    else \
        (coef) = - ((f - (coef)) * (mf) >> 16); \
    nz |= (coef); \
}

/*参数说明:
1 dct系数
2 量化矩阵
3 量化因子,
每一个位置的系数,有不同的量化矩阵对应的值*/
static int quant_4x4( dctcoef dct[16], udctcoef mf[16], udctcoef bias[16] )
{
    int nz = 0;
    for( int i = 0; i < 16; i++ )
        QUANT_ONE( dct[i], mf[i], bias[i] );
    return !!nz;
}

二 量化数组

qp 0 [26214, 16132, 26214, 16132, 16132, 10486, 16132, 10486, 26214, 16132, 26214, 16132, 16132, 10486, 16132, 10486]
qp 1 [23832, 14980, 23832, 14980, 14980, 9320, 14980, 9320, 23832, 14980, 23832, 14980, 14980, 9320, 14980, 9320]
qp 2 [20164, 13108, 20164, 13108, 13108, 8388, 13108, 8388, 20164, 13108, 20164, 13108, 13108, 8388, 13108, 8388]
qp 3 [18724, 11650, 18724, 11650, 11650, 7294, 11650, 7294, 18724, 11650, 18724, 11650, 11650, 7294, 11650, 7294]
qp 4 [16384, 10486, 16384, 10486, 10486, 6710, 10486, 6710, 16384, 10486, 16384, 10486, 10486, 6710, 10486, 6710]
qp 5 [14564, 9118, 14564, 9118, 9118, 5786, 9118, 5786, 14564, 9118, 14564, 9118, 9118, 5786, 9118, 5786]
qp 6 [13107, 8066, 13107, 8066, 8066, 5243, 8066, 5243, 13107, 8066, 13107, 8066, 8066, 5243, 8066, 5243]
qp 7 [11916, 7490, 11916, 7490, 7490, 4660, 7490, 4660, 11916, 7490, 11916, 7490, 7490, 4660, 7490, 4660]
qp 8 [10082, 6554, 10082, 6554, 6554, 4194, 6554, 4194, 10082, 6554, 10082, 6554, 6554, 4194, 6554, 4194]
qp 9 [9362, 5825, 9362, 5825, 5825, 3647, 5825, 3647, 9362, 5825, 9362, 5825, 5825, 3647, 5825, 3647]
qp 10 [8192, 5243, 8192, 5243, 5243, 3355, 5243, 3355, 8192, 5243, 8192, 5243, 5243, 3355, 5243, 3355]
qp 11 [7282, 4559, 7282, 4559, 4559, 2893, 4559, 2893, 7282, 4559, 7282, 4559, 4559, 2893, 4559, 2893]
qp 12 [6554, 4033, 6554, 4033, 4033, 2622, 4033, 2622, 6554, 4033, 6554, 4033, 4033, 2622, 4033, 2622]
qp 13 [5958, 3745, 5958, 3745, 3745, 2330, 3745, 2330, 5958, 3745, 5958, 3745, 3745, 2330, 3745, 2330]
qp 14 [5041, 3277, 5041, 3277, 3277, 2097, 3277, 2097, 5041, 3277, 5041, 3277, 3277, 2097, 3277, 2097]
qp 15 [4681, 2913, 4681, 2913, 2913, 1824, 2913, 1824, 4681, 2913, 4681, 2913, 2913, 1824, 2913, 1824]
qp 16 [4096, 2622, 4096, 2622, 2622, 1678, 2622, 1678, 4096, 2622, 4096, 2622, 2622, 1678, 2622, 1678]
qp 17 [3641, 2280, 3641, 2280, 2280, 1447, 2280, 1447, 3641, 2280, 3641, 2280, 2280, 1447, 2280, 1447]
qp 18 [3277, 2017, 3277, 2017, 2017, 1311, 2017, 1311, 3277, 2017, 3277, 2017, 2017, 1311, 2017, 1311]
qp 19 [2979, 1873, 2979, 1873, 1873, 1165, 1873, 1165, 2979, 1873, 2979, 1873, 1873, 1165, 1873, 1165]
qp 20 [2521, 1639, 2521, 1639, 1639, 1049, 1639, 1049, 2521, 1639, 2521, 1639, 1639, 1049, 1639, 1049]
qp 21 [2341, 1456, 2341, 1456, 1456, 912, 1456, 912, 2341, 1456, 2341, 1456, 1456, 912, 1456, 912]
qp 22 [2048, 1311, 2048, 1311, 1311, 839, 1311, 839, 2048, 1311, 2048, 1311, 1311, 839, 1311, 839]
qp 23 [1821, 1140, 1821, 1140, 1140, 723, 1140, 723, 1821, 1140, 1821, 1140, 1140, 723, 1140, 723]
qp 24 [1638, 1008, 1638, 1008, 1008, 655, 1008, 655, 1638, 1008, 1638, 1008, 1008, 655, 1008, 655]
qp 25 [1490, 936, 1490, 936, 936, 583, 936, 583, 1490, 936, 1490, 936, 936, 583, 936, 583]
qp 26 [1260, 819, 1260, 819, 819, 524, 819, 524, 1260, 819, 1260, 819, 819, 524, 819, 524]
qp 27 [1170, 728, 1170, 728, 728, 456, 728, 456, 1170, 728, 1170, 728, 728, 456, 728, 456]
qp 28 [1024, 655, 1024, 655, 655, 419, 655, 419, 1024, 655, 1024, 655, 655, 419, 655, 419]
qp 29 [910, 570, 910, 570, 570, 362, 570, 362, 910, 570, 910, 570, 570, 362, 570, 362]
qp 30 [819, 504, 819, 504, 504, 328, 504, 328, 819, 504, 819, 504, 504, 328, 504, 328]
qp 31 [745, 468, 745, 468, 468, 291, 468, 291, 745, 468, 745, 468, 468, 291, 468, 291]
qp 32 [630, 410, 630, 410, 410, 262, 410, 262, 630, 410, 630, 410, 410, 262, 410, 262]
qp 33 [585, 364, 585, 364, 364, 228, 364, 228, 585, 364, 585, 364, 364, 228, 364, 228]
qp 34 [512, 328, 512, 328, 328, 210, 328, 210, 512, 328, 512, 328, 328, 210, 328, 210]
qp 35 [455, 285, 455, 285, 285, 181, 285, 181, 455, 285, 455, 285, 285, 181, 285, 181]
qp 36 [410, 252, 410, 252, 252, 164, 252, 164, 410, 252, 410, 252, 252, 164, 252, 164]
qp 37 [372, 234, 372, 234, 234, 146, 234, 146, 372, 234, 372, 234, 234, 146, 234, 146]
qp 38 [315, 205, 315, 205, 205, 131, 205, 131, 315, 205, 315, 205, 205, 131, 205, 131]
qp 39 [293, 182, 293, 182, 182, 114, 182, 114, 293, 182, 293, 182, 182, 114, 182, 114]
qp 40 [256, 164, 256, 164, 164, 105, 164, 105, 256, 164, 256, 164, 164, 105, 164, 105]
qp 41 [228, 142, 228, 142, 142, 90, 142, 90, 228, 142, 228, 142, 142, 90, 142, 90]
qp 42 [205, 126, 205, 126, 126, 82, 126, 82, 205, 126, 205, 126, 126, 82, 126, 82]
qp 43 [186, 117, 186, 117, 117, 73, 117, 73, 186, 117, 186, 117, 117, 73, 117, 73]
qp 44 [158, 102, 158, 102, 102, 66, 102, 66, 158, 102, 158, 102, 102, 66, 102, 66]
qp 45 [146, 91, 146, 91, 91, 57, 91, 57, 146, 91, 146, 91, 91, 57, 91, 57]
qp 46 [128, 82, 128, 82, 82, 52, 82, 52, 128, 82, 128, 82, 82, 52, 82, 52]
qp 47 [114, 71, 114, 71, 71, 45, 71, 45, 114, 71, 114, 71, 71, 45, 71, 45]
qp 48 [102, 63, 102, 63, 63, 41, 63, 41, 102, 63, 102, 63, 63, 41, 63, 41]
qp 49 [93, 59, 93, 59, 59, 36, 59, 36, 93, 59, 93, 59, 59, 36, 59, 36]
qp 50 [79, 51, 79, 51, 51, 33, 51, 33, 79, 51, 79, 51, 51, 33, 51, 33]

三 汇编实现

;-----------------------------------------------------------------------------
; int quant_4x4( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
;-----------------------------------------------------------------------------
%macro QUANT_AC 2
cglobal %1, 3,3
%if %2==1
    QUANT_ONE [r0], [r1], [r2], 0, 5
%else
%assign x 0
%rep %2/2
    QUANT_TWO [r0+x], [r0+x+mmsize], [r1+x], [r1+x+mmsize], [r2+x], [r2+x+mmsize], x, 5
%assign x x+mmsize*2
%endrep
%endif
    QUANT_END
    RET
%endmacro

%macro QUANT_ONE 5
;;; %1      (m64)       dct[y][x]
;;; %2      (m64/mmx)   mf[y][x] or mf[0][0] (as uint16_t)
;;; %3      (m64/mmx)   bias[y][x] or bias[0][0] (as uint16_t)
    mova       m1, %1   ; load dct coeffs 加载dct系数
    ABSW       m0, m1, sign //abs一下,并且存下符号位
    paddusw    m0, %3   ; round 取整数
    pmulhuw    m0, %2   ; divide 乘以dct量化矩阵系数,作为除法
    PSIGNW     m0, m1   ; restore sign 把符号位复制上去
    mova       %1, m0   ; store 存储到内存
    ACCUM     por, %5, 0, %4
%endmacro

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值