quant.c
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:13k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

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. #include "common/common.h"
  21. #include "ppccommon.h"
  22. #include "quant.h"            
  23. // quant of a whole 4x4 block, unrolled 2x and "pre-scheduled"
  24. #define QUANT_16_U( idx0, idx1 )                                             
  25. temp1v = vec_ld((idx0), *dct);                                               
  26. temp2v = vec_ld((idx1), *dct);                                               
  27. mfvA = vec_ld((idx0), mf);                                                   
  28. mfvB = vec_ld((idx1), mf);                                                   
  29. biasvA = vec_ld((idx0), bias);                                               
  30. biasvB = vec_ld((idx1), bias);                                               
  31. mskA = vec_cmplt(temp1v, zero_s16v);                                         
  32. mskB = vec_cmplt(temp2v, zero_s16v);                                         
  33. coefvA = (vec_u16_t)vec_max(vec_sub(zero_s16v, temp1v), temp1v);             
  34. coefvB = (vec_u16_t)vec_max(vec_sub(zero_s16v, temp2v), temp2v);             
  35. coefvA = vec_adds(coefvA, biasvA);                                           
  36. coefvB = vec_adds(coefvB, biasvB);                                           
  37. multEvenvA = vec_mule(coefvA, mfvA);                                         
  38. multOddvA = vec_mulo(coefvA, mfvA);                                          
  39. multEvenvB = vec_mule(coefvB, mfvB);                                         
  40. multOddvB = vec_mulo(coefvB, mfvB);                                          
  41. multEvenvA = vec_sr(multEvenvA, i_qbitsv);                                   
  42. multOddvA = vec_sr(multOddvA, i_qbitsv);                                     
  43. multEvenvB = vec_sr(multEvenvB, i_qbitsv);                                   
  44. multOddvB = vec_sr(multOddvB, i_qbitsv);                                     
  45. temp1v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvA, multOddvA), vec_mergel(multEvenvA, multOddvA)); 
  46. temp2v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvB, multOddvB), vec_mergel(multEvenvB, multOddvB)); 
  47. temp1v = vec_xor(temp1v, mskA);                                              
  48. temp2v = vec_xor(temp2v, mskB);                                              
  49. temp1v = vec_adds(temp1v, vec_and(mskA, one));                               
  50. vec_st(temp1v, (idx0), (int16_t*)dct);                                       
  51. temp2v = vec_adds(temp2v, vec_and(mskB, one));                               
  52. nz = vec_or(nz, vec_or(temp1v, temp2v));                                     
  53. vec_st(temp2v, (idx1), (int16_t*)dct);
  54.                 
  55. int x264_quant_4x4_altivec( int16_t dct[4][4], uint16_t mf[16], uint16_t bias[16] )
  56. {
  57.     LOAD_ZERO;
  58.     vector bool short mskA;
  59.     vec_u32_t i_qbitsv;
  60.     vec_u16_t coefvA;
  61.     vec_u32_t multEvenvA, multOddvA;
  62.     vec_u16_t mfvA;
  63.     vec_u16_t biasvA;
  64.     vec_s16_t one = vec_splat_s16(1);;
  65.     vec_s16_t nz = zero_s16v;
  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.     vec_u32_u qbits_u;
  73.     qbits_u.s[0]=16;
  74.     i_qbitsv = vec_splat(qbits_u.v, 0);
  75.     QUANT_16_U( 0, 16 );
  76.     return vec_any_ne(nz, zero_s16v);
  77. }
  78. // DC quant of a whole 4x4 block, unrolled 2x and "pre-scheduled"
  79. #define QUANT_16_U_DC( idx0, idx1 )                             
  80. temp1v = vec_ld((idx0), *dct);                                  
  81. temp2v = vec_ld((idx1), *dct);                                  
  82. mskA = vec_cmplt(temp1v, zero_s16v);                            
  83. mskB = vec_cmplt(temp2v, zero_s16v);                            
  84. coefvA = (vec_u16_t)vec_max(vec_sub(zero_s16v, temp1v), temp1v);
  85. coefvB = (vec_u16_t)vec_max(vec_sub(zero_s16v, temp2v), temp2v);
  86. coefvA = vec_add(coefvA, biasv);                                
  87. coefvB = vec_add(coefvB, biasv);                                
  88. multEvenvA = vec_mule(coefvA, mfv);                             
  89. multOddvA = vec_mulo(coefvA, mfv);                              
  90. multEvenvB = vec_mule(coefvB, mfv);                             
  91. multOddvB = vec_mulo(coefvB, mfv);                              
  92. multEvenvA = vec_sr(multEvenvA, i_qbitsv);                      
  93. multOddvA = vec_sr(multOddvA, i_qbitsv);                        
  94. multEvenvB = vec_sr(multEvenvB, i_qbitsv);                      
  95. multOddvB = vec_sr(multOddvB, i_qbitsv);                        
  96. temp1v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvA, multOddvA), vec_mergel(multEvenvA, multOddvA)); 
  97. temp2v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvB, multOddvB), vec_mergel(multEvenvB, multOddvB)); 
  98. temp1v = vec_xor(temp1v, mskA);                                 
  99. temp2v = vec_xor(temp2v, mskB);                                 
  100. temp1v = vec_add(temp1v, vec_and(mskA, one));                   
  101. vec_st(temp1v, (idx0), (int16_t*)dct);                          
  102. temp2v = vec_add(temp2v, vec_and(mskB, one));                   
  103. nz = vec_or(nz, vec_or(temp1v, temp2v));                        
  104. vec_st(temp2v, (idx1), (int16_t*)dct);
  105. int x264_quant_4x4_dc_altivec( int16_t dct[4][4], int mf, int bias )
  106. {
  107.     LOAD_ZERO;
  108.     vector bool short mskA;
  109.     vec_u32_t i_qbitsv;
  110.     vec_u16_t coefvA;
  111.     vec_u32_t multEvenvA, multOddvA;
  112.     vec_s16_t one = vec_splat_s16(1);
  113.     vec_s16_t nz = zero_s16v;
  114.     vector bool short mskB;
  115.     vec_u16_t coefvB;
  116.     vec_u32_t multEvenvB, multOddvB;
  117.     vec_s16_t temp1v, temp2v;
  118.     vec_u16_t mfv;
  119.     vec_u16_t biasv;
  120.     vec_u16_u mf_u;
  121.     mf_u.s[0]=mf;
  122.     mfv = vec_splat( mf_u.v, 0 );
  123.     vec_u32_u qbits_u;
  124.     qbits_u.s[0]=16;
  125.     i_qbitsv = vec_splat(qbits_u.v, 0);
  126.     vec_u16_u bias_u;
  127.     bias_u.s[0]=bias;
  128.     biasv = vec_splat(bias_u.v, 0);
  129.     QUANT_16_U_DC( 0, 16 );
  130.     return vec_any_ne(nz, zero_s16v);
  131. }
  132. // DC quant of a whole 2x2 block
  133. #define QUANT_4_U_DC( idx0 )                                    
  134. const vec_u16_t sel = (vec_u16_t) CV(-1,-1,-1,-1,0,0,0,0);      
  135. temp1v = vec_ld((idx0), *dct);                                  
  136. mskA = vec_cmplt(temp1v, zero_s16v);                            
  137. coefvA = (vec_u16_t)vec_max(vec_sub(zero_s16v, temp1v), temp1v);
  138. coefvA = vec_add(coefvA, biasv);                                
  139. multEvenvA = vec_mule(coefvA, mfv);                             
  140. multOddvA = vec_mulo(coefvA, mfv);                              
  141. multEvenvA = vec_sr(multEvenvA, i_qbitsv);                      
  142. multOddvA = vec_sr(multOddvA, i_qbitsv);                        
  143. temp2v = (vec_s16_t) vec_packs(vec_mergeh(multEvenvA, multOddvA), vec_mergel(multEvenvA, multOddvA)); 
  144. temp2v = vec_xor(temp2v, mskA);                                 
  145. temp2v = vec_add(temp2v, vec_and(mskA, one));                   
  146. temp1v = vec_sel(temp1v, temp2v, sel);                          
  147. nz = vec_or(nz, temp1v);                                        
  148. vec_st(temp1v, (idx0), (int16_t*)dct);
  149. int x264_quant_2x2_dc_altivec( int16_t dct[2][2], int mf, int bias )
  150. {
  151.     LOAD_ZERO;
  152.     vector bool short mskA;
  153.     vec_u32_t i_qbitsv;
  154.     vec_u16_t coefvA;
  155.     vec_u32_t multEvenvA, multOddvA;
  156.     vec_s16_t one = vec_splat_s16(1);
  157.     vec_s16_t nz = zero_s16v;
  158.     vec_s16_t temp1v, temp2v;
  159.     vec_u16_t mfv;
  160.     vec_u16_t biasv;
  161.     vec_u16_u mf_u;
  162.     mf_u.s[0]=mf;
  163.     mfv = vec_splat( mf_u.v, 0 );
  164.     vec_u32_u qbits_u;
  165.     qbits_u.s[0]=16;
  166.     i_qbitsv = vec_splat(qbits_u.v, 0);
  167.     vec_u16_u bias_u;
  168.     bias_u.s[0]=bias;
  169.     biasv = vec_splat(bias_u.v, 0);
  170.     static const vec_s16_t mask2 = CV(-1, -1, -1, -1,  0, 0, 0, 0);
  171.     QUANT_4_U_DC(0);
  172.     return vec_any_ne(vec_and(nz, mask2), zero_s16v);
  173. }
  174. int x264_quant_8x8_altivec( int16_t dct[8][8], uint16_t mf[64], uint16_t bias[64] )
  175. {
  176.     LOAD_ZERO;
  177.     vector bool short mskA;
  178.     vec_u32_t i_qbitsv;
  179.     vec_u16_t coefvA;
  180.     vec_u32_t multEvenvA, multOddvA;
  181.     vec_u16_t mfvA;
  182.     vec_u16_t biasvA;
  183.     vec_s16_t one = vec_splat_s16(1);;
  184.     vec_s16_t nz = zero_s16v;
  185.     vector bool short mskB;
  186.     vec_u16_t coefvB;
  187.     vec_u32_t multEvenvB, multOddvB;
  188.     vec_u16_t mfvB;
  189.     vec_u16_t biasvB;
  190.     vec_s16_t temp1v, temp2v;
  191.     
  192.     vec_u32_u qbits_u;
  193.     qbits_u.s[0]=16;
  194.     i_qbitsv = vec_splat(qbits_u.v, 0);
  195.     
  196.     int i;
  197.     for ( i=0; i<4; i++ ) {
  198.       QUANT_16_U( i*2*16, i*2*16+16 );
  199.     }
  200.     return vec_any_ne(nz, zero_s16v);
  201. }
  202. #define DEQUANT_SHL()                                                
  203. {                                                                    
  204.     dctv = vec_ld(0, dct[y]);                                        
  205.     mf1v = vec_ld(0, dequant_mf[i_mf][y]);                           
  206.     mf2v = vec_ld(16, dequant_mf[i_mf][y]);                          
  207.     mfv  = vec_packs(mf1v, mf2v);                                    
  208.                                                                      
  209.     multEvenvA = vec_mule(dctv, mfv);                                
  210.     multOddvA = vec_mulo(dctv, mfv);                                 
  211.     dctv = (vec_s16_t) vec_packs(vec_mergeh(multEvenvA, multOddvA),  
  212.                                  vec_mergel(multEvenvA, multOddvA)); 
  213.     dctv = vec_sl(dctv, i_qbitsv);                                   
  214.     vec_st(dctv, 0, dct[y]);                                         
  215. }
  216. #define DEQUANT_SHR()                                          
  217. {                                                              
  218.     dctv = vec_ld(0, dct[y]);                                  
  219.     dct1v = vec_mergeh(dctv, dctv);                            
  220.     dct2v = vec_mergel(dctv, dctv);                            
  221.     mf1v = vec_ld(0, dequant_mf[i_mf][y]);                     
  222.     mf2v = vec_ld(16, dequant_mf[i_mf][y]);                    
  223.                                                                
  224.     multEvenvA = vec_mule(dct1v, (vec_s16_t)mf1v);             
  225.     multOddvA = vec_mulo(dct1v, (vec_s16_t)mf1v);              
  226.     temp1v = vec_add(vec_sl(multEvenvA, sixteenv), multOddvA); 
  227.     temp1v = vec_add(temp1v, fv);                              
  228.     temp1v = vec_sra(temp1v, i_qbitsv);                        
  229.                                                                
  230.     multEvenvA = vec_mule(dct2v, (vec_s16_t)mf2v);             
  231.     multOddvA = vec_mulo(dct2v, (vec_s16_t)mf2v);              
  232.     temp2v = vec_add(vec_sl(multEvenvA, sixteenv), multOddvA); 
  233.     temp2v = vec_add(temp2v, fv);                              
  234.     temp2v = vec_sra(temp2v, i_qbitsv);                        
  235.                                                                
  236.     dctv = (vec_s16_t)vec_packs(temp1v, temp2v);               
  237.     vec_st(dctv, 0, dct[y]);                                   
  238. }
  239. void x264_dequant_4x4_altivec( int16_t dct[4][4], int dequant_mf[6][4][4], int i_qp )
  240. {
  241.     const int i_mf = i_qp%6;
  242.     const int i_qbits = i_qp/6 - 4;
  243.     int y;
  244.     vec_s16_t dctv;
  245.     vec_s16_t dct1v, dct2v;
  246.     vec_s32_t mf1v, mf2v;
  247.     vec_s16_t mfv;
  248.     vec_s32_t multEvenvA, multOddvA;
  249.     vec_s32_t temp1v, temp2v;
  250.     if( i_qbits >= 0 )
  251.     {
  252.         vec_u16_t i_qbitsv;
  253.         vec_u16_u qbits_u;
  254.         qbits_u.s[0]=i_qbits;
  255.         i_qbitsv = vec_splat(qbits_u.v, 0);
  256.         for( y = 0; y < 4; y+=2 )
  257.             DEQUANT_SHL();
  258.     }
  259.     else
  260.     {
  261.         const int f = 1 << (-i_qbits-1);
  262.         vec_s32_t fv;
  263.         vec_u32_u f_u;
  264.         f_u.s[0]=f;
  265.         fv = (vec_s32_t)vec_splat(f_u.v, 0);
  266.         vec_u32_t i_qbitsv;
  267.         vec_u32_u qbits_u;
  268.         qbits_u.s[0]=-i_qbits;
  269.         i_qbitsv = vec_splat(qbits_u.v, 0);
  270.         vec_u32_t sixteenv;
  271.         vec_u32_u sixteen_u;
  272.         sixteen_u.s[0]=16;
  273.         sixteenv = vec_splat(sixteen_u.v, 0);
  274.         for( y = 0; y < 4; y+=2 )
  275.             DEQUANT_SHR();
  276.     }
  277. }
  278. void x264_dequant_8x8_altivec( int16_t dct[8][8], int dequant_mf[6][8][8], int i_qp )
  279. {
  280.     const int i_mf = i_qp%6;
  281.     const int i_qbits = i_qp/6 - 6;
  282.     int y;
  283.     vec_s16_t dctv;
  284.     vec_s16_t dct1v, dct2v;
  285.     vec_s32_t mf1v, mf2v;
  286.     vec_s16_t mfv;
  287.     vec_s32_t multEvenvA, multOddvA;
  288.     vec_s32_t temp1v, temp2v;
  289.     if( i_qbits >= 0 )
  290.     {
  291.         vec_u16_t i_qbitsv;
  292.         vec_u16_u qbits_u;
  293.         qbits_u.s[0]=i_qbits;
  294.         i_qbitsv = vec_splat(qbits_u.v, 0);
  295.         for( y = 0; y < 8; y++ )
  296.             DEQUANT_SHL();
  297.     }
  298.     else
  299.     {
  300.         const int f = 1 << (-i_qbits-1);
  301.         vec_s32_t fv;
  302.         vec_u32_u f_u;
  303.         f_u.s[0]=f;
  304.         fv = (vec_s32_t)vec_splat(f_u.v, 0);
  305.         vec_u32_t i_qbitsv;
  306.         vec_u32_u qbits_u;
  307.         qbits_u.s[0]=-i_qbits;
  308.         i_qbitsv = vec_splat(qbits_u.v, 0);
  309.         vec_u32_t sixteenv;
  310.         vec_u32_u sixteen_u;
  311.         sixteen_u.s[0]=16;
  312.         sixteenv = vec_splat(sixteen_u.v, 0);
  313.         for( y = 0; y < 8; y++ )
  314.             DEQUANT_SHR();
  315.     }
  316. }