quant.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:13k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2. * quant.c: h264 encoder
  3. *****************************************************************************
  4. * Copyright (C) 2007 Guillaume Poirier <gpoirier@mplayerhq.hu>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  19. *****************************************************************************/
  20. #if defined SYS_LINUX
  21. #include <altivec.h>
  22. #endif
  23. #include "common/common.h"
  24. #include "ppccommon.h"
  25. #include "quant.h"            
  26. // quant of a whole 4x4 block, unrolled 2x and "pre-scheduled"
  27. #define QUANT_16_U( idx0, idx1 )                                             
  28. temp1v = vec_ld((idx0), *dct);                                               
  29. temp2v = vec_ld((idx1), *dct);                                               
  30. mfvA = vec_ld((idx0), mf);                                                   
  31. mfvB = vec_ld((idx1), mf);                                                   
  32. biasvA = vec_ld((idx0), bias);                                               
  33. biasvB = vec_ld((idx1), bias);                                               
  34. mskA = vec_cmplt(temp1v, zerov);                                             
  35. mskB = vec_cmplt(temp2v, zerov);                                             
  36. coefvA = (vec_u16_t)vec_max(vec_sub(zerov, temp1v), temp1v);                 
  37. coefvB = (vec_u16_t)vec_max(vec_sub(zerov, temp2v), temp2v);                 
  38. coefvA = vec_adds(coefvA, biasvA);                                           
  39. coefvB = vec_adds(coefvB, biasvB);                                           
  40. multEvenvA = vec_mule(coefvA, mfvA);                                         
  41. multOddvA = vec_mulo(coefvA, mfvA);                                          
  42. multEvenvB = vec_mule(coefvB, mfvB);                                         
  43. multOddvB = vec_mulo(coefvB, mfvB);                                          
  44. multEvenvA = vec_sr(multEvenvA, i_qbitsv);                                   
  45. multOddvA = vec_sr(multOddvA, i_qbitsv);                                     
  46. multEvenvB = vec_sr(multEvenvB, i_qbitsv);                                   
  47. multOddvB = vec_sr(multOddvB, i_qbitsv);                                     
  48. temp1v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvA, multOddvA), vec_mergel(multEvenvA, multOddvA)); 
  49. temp2v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvB, multOddvB), vec_mergel(multEvenvB, multOddvB)); 
  50. temp1v = vec_xor(temp1v, mskA);                                              
  51. temp2v = vec_xor(temp2v, mskB);                                              
  52. temp1v = vec_adds(temp1v, vec_and(mskA, one));                               
  53. vec_st(temp1v, (idx0), (int16_t*)dct);                                       
  54. temp2v = vec_adds(temp2v, vec_and(mskB, one));                               
  55. vec_st(temp2v, (idx1), (int16_t*)dct);
  56.                 
  57. void x264_quant_4x4_altivec( int16_t dct[4][4], uint16_t mf[16], uint16_t bias[16] )
  58. {
  59.     vector bool short mskA;
  60.     vec_u32_t i_qbitsv;
  61.     vec_u16_t coefvA;
  62.     vec_u32_t multEvenvA, multOddvA;
  63.     vec_u16_t mfvA;
  64.     vec_u16_t biasvA;
  65.     vec_s16_t zerov, one;
  66.     vector bool short mskB;
  67.     vec_u16_t coefvB;
  68.     vec_u32_t multEvenvB, multOddvB;
  69.     vec_u16_t mfvB;
  70.     vec_u16_t biasvB;
  71.     vec_s16_t temp1v, temp2v;
  72.     vect_int_u qbits_u;
  73.     qbits_u.s[0]=16;
  74.     i_qbitsv = vec_splat(qbits_u.v, 0);
  75.     zerov = vec_splat_s16(0);
  76.     one = vec_splat_s16(1);
  77.     QUANT_16_U( 0, 16 );
  78. }
  79. // DC quant of a whole 4x4 block, unrolled 2x and "pre-scheduled"
  80. #define QUANT_16_U_DC( idx0, idx1 )                             
  81. temp1v = vec_ld((idx0), *dct);                                  
  82. temp2v = vec_ld((idx1), *dct);                                  
  83. mskA = vec_cmplt(temp1v, zerov);                                
  84. mskB = vec_cmplt(temp2v, zerov);                                
  85. coefvA = (vec_u16_t) vec_max(vec_sub(zerov, temp1v), temp1v);   
  86. coefvB = (vec_u16_t) vec_max(vec_sub(zerov, temp2v), temp2v);   
  87. coefvA = vec_add(coefvA, biasv);                                
  88. coefvB = vec_add(coefvB, biasv);                                
  89. multEvenvA = vec_mule(coefvA, mfv);                             
  90. multOddvA = vec_mulo(coefvA, mfv);                              
  91. multEvenvB = vec_mule(coefvB, mfv);                             
  92. multOddvB = vec_mulo(coefvB, mfv);                              
  93. multEvenvA = vec_sr(multEvenvA, i_qbitsv);                      
  94. multOddvA = vec_sr(multOddvA, i_qbitsv);                        
  95. multEvenvB = vec_sr(multEvenvB, i_qbitsv);                      
  96. multOddvB = vec_sr(multOddvB, i_qbitsv);                        
  97. temp1v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvA, multOddvA), vec_mergel(multEvenvA, multOddvA)); 
  98. temp2v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvB, multOddvB), vec_mergel(multEvenvB, multOddvB)); 
  99. temp1v = vec_xor(temp1v, mskA);                                 
  100. temp2v = vec_xor(temp2v, mskB);                                 
  101. temp1v = vec_add(temp1v, vec_and(mskA, one));                   
  102. vec_st(temp1v, (idx0), (int16_t*)dct);                          
  103. temp2v = vec_add(temp2v, vec_and(mskB, one));                   
  104. vec_st(temp2v, (idx1), (int16_t*)dct);
  105. void x264_quant_4x4_dc_altivec( int16_t dct[4][4], int mf, int bias )
  106. {
  107.     vector bool short mskA;
  108.     vec_u32_t i_qbitsv;
  109.     vec_u16_t coefvA;
  110.     vec_u32_t multEvenvA, multOddvA;
  111.     vec_s16_t zerov, one;
  112.     vector bool short mskB;
  113.     vec_u16_t coefvB;
  114.     vec_u32_t multEvenvB, multOddvB;
  115.     vec_s16_t temp1v, temp2v;
  116.     vec_u16_t mfv;
  117.     vec_u16_t biasv;
  118.     vect_ushort_u mf_u;
  119.     mf_u.s[0]=mf;
  120.     mfv = vec_splat( mf_u.v, 0 );
  121.     vect_int_u qbits_u;
  122.     qbits_u.s[0]=16;
  123.     i_qbitsv = vec_splat(qbits_u.v, 0);
  124.     vect_ushort_u bias_u;
  125.     bias_u.s[0]=bias;
  126.     biasv = vec_splat(bias_u.v, 0);
  127.     zerov = vec_splat_s16(0);
  128.     one = vec_splat_s16(1);
  129.     QUANT_16_U_DC( 0, 16 );
  130. }
  131. // DC quant of a whole 2x2 block
  132. #define QUANT_4_U_DC( idx0 )                                    
  133. const vec_u16_t sel = (vec_u16_t) CV(-1,-1,-1,-1,0,0,0,0);      
  134. temp1v = vec_ld((idx0), *dct);                                  
  135. mskA = vec_cmplt(temp1v, zerov);                                
  136. coefvA = (vec_u16_t) vec_max(vec_sub(zerov, temp1v), temp1v);   
  137. coefvA = vec_add(coefvA, biasv);                                
  138. multEvenvA = vec_mule(coefvA, mfv);                             
  139. multOddvA = vec_mulo(coefvA, mfv);                              
  140. multEvenvA = vec_sr(multEvenvA, i_qbitsv);                      
  141. multOddvA = vec_sr(multOddvA, i_qbitsv);                        
  142. temp2v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvA, multOddvA), vec_mergel(multEvenvA, multOddvA)); 
  143. temp2v = vec_xor(temp2v, mskA);                                 
  144. temp2v = vec_add(temp2v, vec_and(mskA, one));                   
  145. temp1v = vec_sel(temp1v, temp2v, sel);                          
  146. vec_st(temp1v, (idx0), (int16_t*)dct);
  147. void x264_quant_2x2_dc_altivec( int16_t dct[2][2], int mf, int bias )
  148. {
  149.     vector bool short mskA;
  150.     vec_u32_t i_qbitsv;
  151.     vec_u16_t coefvA;
  152.     vec_u32_t multEvenvA, multOddvA;
  153.     vec_s16_t zerov, one;
  154.     vec_s16_t temp1v, temp2v;
  155.     vec_u16_t mfv;
  156.     vec_u16_t biasv;
  157.     vect_ushort_u mf_u;
  158.     mf_u.s[0]=mf;
  159.     mfv = vec_splat( mf_u.v, 0 );
  160.     vect_int_u qbits_u;
  161.     qbits_u.s[0]=16;
  162.     i_qbitsv = vec_splat(qbits_u.v, 0);
  163.     vect_ushort_u bias_u;
  164.     bias_u.s[0]=bias;
  165.     biasv = vec_splat(bias_u.v, 0);
  166.     zerov = vec_splat_s16(0);
  167.     one = vec_splat_s16(1);
  168.     QUANT_4_U_DC(0);
  169. }
  170. void x264_quant_8x8_altivec( int16_t dct[8][8], uint16_t mf[64], uint16_t bias[64] )
  171. {
  172.     vector bool short mskA;
  173.     vec_u32_t i_qbitsv;
  174.     vec_u16_t coefvA;
  175.     vec_u32_t multEvenvA, multOddvA;
  176.     vec_u16_t mfvA;
  177.     vec_u16_t biasvA;
  178.     vec_s16_t zerov, one;
  179.     
  180.     vector bool short mskB;
  181.     vec_u16_t coefvB;
  182.     vec_u32_t multEvenvB, multOddvB;
  183.     vec_u16_t mfvB;
  184.     vec_u16_t biasvB;
  185.     
  186.     vec_s16_t temp1v, temp2v;
  187.     
  188.     vect_int_u qbits_u;
  189.     qbits_u.s[0]=16;
  190.     i_qbitsv = vec_splat(qbits_u.v, 0);
  191.     zerov = vec_splat_s16(0);
  192.     one = vec_splat_s16(1);
  193.     
  194.     int i;
  195.     for ( i=0; i<4; i++ ) {
  196.       QUANT_16_U( i*2*16, i*2*16+16 );
  197.     }
  198. }
  199. #define DEQUANT_SHL()                                                
  200. {                                                                    
  201.     dctv = vec_ld(0, dct[y]);                                        
  202.     mf1v = vec_ld(0, dequant_mf[i_mf][y]);                           
  203.     mf2v = vec_ld(16, dequant_mf[i_mf][y]);                          
  204.     mfv  = vec_packs(mf1v, mf2v);                                    
  205.                                                                      
  206.     multEvenvA = vec_mule(dctv, mfv);                                
  207.     multOddvA = vec_mulo(dctv, mfv);                                 
  208.     dctv = (vec_s16_t) vec_packs(vec_mergeh(multEvenvA, multOddvA),  
  209.                                  vec_mergel(multEvenvA, multOddvA)); 
  210.     dctv = vec_sl(dctv, i_qbitsv);                                   
  211.     vec_st(dctv, 0, dct[y]);                                         
  212. }
  213. #define DEQUANT_SHR()                                          
  214. {                                                              
  215.     dctv = vec_ld(0, dct[y]);                                  
  216.     dct1v = vec_mergeh(dctv, dctv);                            
  217.     dct2v = vec_mergel(dctv, dctv);                            
  218.     mf1v = vec_ld(0, dequant_mf[i_mf][y]);                     
  219.     mf2v = vec_ld(16, dequant_mf[i_mf][y]);                    
  220.                                                                
  221.     multEvenvA = vec_mule(dct1v, (vec_s16_t)mf1v);             
  222.     multOddvA = vec_mulo(dct1v, (vec_s16_t)mf1v);              
  223.     temp1v = vec_add(vec_sl(multEvenvA, sixteenv), multOddvA); 
  224.     temp1v = vec_add(temp1v, fv);                              
  225.     temp1v = vec_sra(temp1v, i_qbitsv);                        
  226.                                                                
  227.     multEvenvA = vec_mule(dct2v, (vec_s16_t)mf2v);             
  228.     multOddvA = vec_mulo(dct2v, (vec_s16_t)mf2v);              
  229.     temp2v = vec_add(vec_sl(multEvenvA, sixteenv), multOddvA); 
  230.     temp2v = vec_add(temp2v, fv);                              
  231.     temp2v = vec_sra(temp2v, i_qbitsv);                        
  232.                                                                
  233.     dctv = (vec_s16_t)vec_packs(temp1v, temp2v);               
  234.     vec_st(dctv, 0, dct[y]);                                   
  235. }
  236. void x264_dequant_4x4_altivec( int16_t dct[4][4], int dequant_mf[6][4][4], int i_qp )
  237. {
  238.     const int i_mf = i_qp%6;
  239.     const int i_qbits = i_qp/6 - 4;
  240.     int y;
  241.     vec_s16_t dctv;
  242.     vec_s16_t dct1v, dct2v;
  243.     vec_s32_t mf1v, mf2v;
  244.     vec_s16_t mfv;
  245.     vec_s32_t multEvenvA, multOddvA;
  246.     vec_s32_t temp1v, temp2v;
  247.     if( i_qbits >= 0 )
  248.     {
  249.         vec_u16_t i_qbitsv;
  250.         vect_ushort_u qbits_u;
  251.         qbits_u.s[0]=i_qbits;
  252.         i_qbitsv = vec_splat(qbits_u.v, 0);
  253.         for( y = 0; y < 4; y+=2 )
  254.             DEQUANT_SHL();
  255.     }
  256.     else
  257.     {
  258.         const int f = 1 << (-i_qbits-1);
  259.         vec_s32_t fv;
  260.         vect_int_u f_u;
  261.         f_u.s[0]=f;
  262.         fv = (vec_s32_t)vec_splat(f_u.v, 0);
  263.         vec_u32_t i_qbitsv;
  264.         vect_int_u qbits_u;
  265.         qbits_u.s[0]=-i_qbits;
  266.         i_qbitsv = vec_splat(qbits_u.v, 0);
  267.         vec_u32_t sixteenv;
  268.         vect_int_u sixteen_u;
  269.         sixteen_u.s[0]=16;
  270.         sixteenv = vec_splat(sixteen_u.v, 0);
  271.         for( y = 0; y < 4; y+=2 )
  272.             DEQUANT_SHR();
  273.     }
  274. }
  275. void x264_dequant_8x8_altivec( int16_t dct[8][8], int dequant_mf[6][8][8], int i_qp )
  276. {
  277.     const int i_mf = i_qp%6;
  278.     const int i_qbits = i_qp/6 - 6;
  279.     int y;
  280.     vec_s16_t dctv;
  281.     vec_s16_t dct1v, dct2v;
  282.     vec_s32_t mf1v, mf2v;
  283.     vec_s16_t mfv;
  284.     vec_s32_t multEvenvA, multOddvA;
  285.     vec_s32_t temp1v, temp2v;
  286.     if( i_qbits >= 0 )
  287.     {
  288.         vec_u16_t i_qbitsv;
  289.         vect_ushort_u qbits_u;
  290.         qbits_u.s[0]=i_qbits;
  291.         i_qbitsv = vec_splat(qbits_u.v, 0);
  292.         for( y = 0; y < 8; y++ )
  293.             DEQUANT_SHL();
  294.     }
  295.     else
  296.     {
  297.         const int f = 1 << (-i_qbits-1);
  298.         vec_s32_t fv;
  299.         vect_int_u f_u;
  300.         f_u.s[0]=f;
  301.         fv = (vec_s32_t)vec_splat(f_u.v, 0);
  302.         vec_u32_t i_qbitsv;
  303.         vect_int_u qbits_u;
  304.         qbits_u.s[0]=-i_qbits;
  305.         i_qbitsv = vec_splat(qbits_u.v, 0);
  306.         vec_u32_t sixteenv;
  307.         vect_int_u sixteen_u;
  308.         sixteen_u.s[0]=16;
  309.         sixteenv = vec_splat(sixteen_u.v, 0);
  310.         for( y = 0; y < 8; y++ )
  311.             DEQUANT_SHR();
  312.     }
  313. }