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

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * ppccommon.h: h264 encoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Eric Petit <eric.petit@lapsus.org>
  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. /***********************************************************************
  21.  * For constant vectors, use parentheses on OS X and braces on Linux
  22.  **********************************************************************/
  23. #ifdef SYS_MACOSX
  24. #define CV(a...) (a)
  25. #else
  26. #define CV(a...) {a}
  27. #endif
  28. /***********************************************************************
  29.  * Vector types
  30.  **********************************************************************/
  31. #define vec_u8_t  vector unsigned char
  32. #define vec_s8_t  vector signed char
  33. #define vec_u16_t vector unsigned short
  34. #define vec_s16_t vector signed short
  35. #define vec_u32_t vector unsigned int
  36. #define vec_s32_t vector signed int
  37. typedef union {
  38.   unsigned int s[4];
  39.   vector unsigned int v;
  40. } vect_int_u;
  41. typedef union {
  42.   unsigned short s[8];
  43.   vector unsigned short v;
  44. } vect_ushort_u;
  45. typedef union {
  46.   signed short s[8];
  47.   vector signed short v;
  48. } vect_sshort_u;
  49. /***********************************************************************
  50.  * Null vector
  51.  **********************************************************************/
  52. #define LOAD_ZERO const vec_u8_t zerov = vec_splat_u8( 0 )
  53. #define zero_u8v  (vec_u8_t)  zerov
  54. #define zero_s8v  (vec_s8_t)  zerov
  55. #define zero_u16v (vec_u16_t) zerov
  56. #define zero_s16v (vec_s16_t) zerov
  57. #define zero_u32v (vec_u32_t) zerov
  58. #define zero_s32v (vec_s32_t) zerov
  59. /***********************************************************************
  60.  * 8 <-> 16 bits conversions
  61.  **********************************************************************/
  62. #define vec_u8_to_u16_h(v) (vec_u16_t) vec_mergeh( zero_u8v, (vec_u8_t) v )
  63. #define vec_u8_to_u16_l(v) (vec_u16_t) vec_mergel( zero_u8v, (vec_u8_t) v )
  64. #define vec_u8_to_s16_h(v) (vec_s16_t) vec_mergeh( zero_u8v, (vec_u8_t) v )
  65. #define vec_u8_to_s16_l(v) (vec_s16_t) vec_mergel( zero_u8v, (vec_u8_t) v )
  66. #define vec_u8_to_u16(v) vec_u8_to_u16_h(v)
  67. #define vec_u8_to_s16(v) vec_u8_to_s16_h(v)
  68. #define vec_u16_to_u8(v) vec_pack( v, zero_u16v )
  69. #define vec_s16_to_u8(v) vec_packsu( v, zero_s16v )
  70. /***********************************************************************
  71.  * PREP_LOAD: declares two vectors required to perform unaligned loads
  72.  * VEC_LOAD:  loads n bytes from u8 * p into vector v of type t
  73.  **********************************************************************/
  74. #define PREP_LOAD 
  75.     vec_u8_t _hv, _lv
  76. #define VEC_LOAD( p, v, n, t )                  
  77.     _hv = vec_ld( 0, p );                       
  78.     v   = (t) vec_lvsl( 0, p );                 
  79.     _lv = vec_ld( n - 1, p );                   
  80.     v   = (t) vec_perm( _hv, _lv, (vec_u8_t) v )
  81. /***********************************************************************
  82.  * PREP_STORE##n: declares required vectors to store n bytes to a
  83.  *                potentially unaligned address
  84.  * VEC_STORE##n:  stores n bytes from vector v to address p
  85.  **********************************************************************/
  86. #define PREP_STORE16 
  87.     vec_u8_t _tmp1v, _tmp2v 
  88. #define VEC_STORE16( v, p ) 
  89.     _hv    = vec_ld( 0, p ); 
  90.     _tmp2v = vec_lvsl( 0, p ); 
  91.     _lv    = vec_ld( 15, p ); 
  92.     _tmp1v = vec_perm( _lv, _hv, _tmp2v ); 
  93.     _tmp2v = vec_lvsr( 0, p ); 
  94.     _lv    = vec_perm( (vec_u8_t) v, _tmp1v, _tmp2v ); 
  95.     vec_st( _lv, 15, (uint8_t *) p ); 
  96.     _hv    = vec_perm( _tmp1v, (vec_u8_t) v, _tmp2v ); 
  97.     vec_st( _hv, 0, (uint8_t *) p )
  98. #define PREP_STORE8 
  99.     PREP_STORE16; 
  100.     vec_u8_t _tmp3v, _tmp4v; 
  101.     const vec_u8_t sel_h = 
  102.         (vec_u8_t) CV(-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0)
  103. #define PREP_STORE8_HL 
  104.     PREP_STORE8; 
  105.     const vec_u8_t sel_l = 
  106.         (vec_u8_t) CV(0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1)
  107. #define VEC_STORE8 VEC_STORE8_H
  108. #define VEC_STORE8_H( v, p ) 
  109.     _tmp3v = vec_lvsr( 0, (uint8_t *) p ); 
  110.     _tmp4v = vec_perm( (vec_u8_t) v, (vec_u8_t) v, _tmp3v ); 
  111.     _lv    = vec_ld( 7, (uint8_t *) p ); 
  112.     _tmp1v = vec_perm( sel_h, zero_u8v, _tmp3v ); 
  113.     _lv    = vec_sel( _lv, _tmp4v, _tmp1v ); 
  114.     vec_st( _lv, 7, (uint8_t *) p ); 
  115.     _hv    = vec_ld( 0, (uint8_t *) p ); 
  116.     _tmp2v = vec_perm( zero_u8v, sel_h, _tmp3v ); 
  117.     _hv    = vec_sel( _hv, _tmp4v, _tmp2v ); 
  118.     vec_st( _hv, 0, (uint8_t *) p )
  119. #define VEC_STORE8_L( v, p ) 
  120.     _tmp3v = vec_lvsr( 8, (uint8_t *) p ); 
  121.     _tmp4v = vec_perm( (vec_u8_t) v, (vec_u8_t) v, _tmp3v ); 
  122.     _lv    = vec_ld( 7, (uint8_t *) p ); 
  123.     _tmp1v = vec_perm( sel_l, zero_u8v, _tmp3v ); 
  124.     _lv    = vec_sel( _lv, _tmp4v, _tmp1v ); 
  125.     vec_st( _lv, 7, (uint8_t *) p ); 
  126.     _hv    = vec_ld( 0, (uint8_t *) p ); 
  127.     _tmp2v = vec_perm( zero_u8v, sel_l, _tmp3v ); 
  128.     _hv    = vec_sel( _hv, _tmp4v, _tmp2v ); 
  129.     vec_st( _hv, 0, (uint8_t *) p )
  130. #define PREP_STORE4 
  131.     PREP_STORE16; 
  132.     vec_u8_t _tmp3v; 
  133.     const vec_u8_t sel = 
  134.         (vec_u8_t) CV(-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0)
  135. #define VEC_STORE4( v, p ) 
  136.     _tmp3v = vec_lvsr( 0, p ); 
  137.     v      = vec_perm( v, v, _tmp3v ); 
  138.     _lv    = vec_ld( 3, p ); 
  139.     _tmp1v = vec_perm( sel, zero_u8v, _tmp3v ); 
  140.     _lv    = vec_sel( _lv, v, _tmp1v ); 
  141.     vec_st( _lv, 3, p ); 
  142.     _hv    = vec_ld( 0, p ); 
  143.     _tmp2v = vec_perm( zero_u8v, sel, _tmp3v ); 
  144.     _hv    = vec_sel( _hv, v, _tmp2v ); 
  145.     vec_st( _hv, 0, p )
  146. /***********************************************************************
  147.  * VEC_TRANSPOSE_8
  148.  ***********************************************************************
  149.  * Transposes a 8x8 matrix of s16 vectors
  150.  **********************************************************************/
  151. #define VEC_TRANSPOSE_8(a0,a1,a2,a3,a4,a5,a6,a7,b0,b1,b2,b3,b4,b5,b6,b7) 
  152.     b0 = vec_mergeh( a0, a4 ); 
  153.     b1 = vec_mergel( a0, a4 ); 
  154.     b2 = vec_mergeh( a1, a5 ); 
  155.     b3 = vec_mergel( a1, a5 ); 
  156.     b4 = vec_mergeh( a2, a6 ); 
  157.     b5 = vec_mergel( a2, a6 ); 
  158.     b6 = vec_mergeh( a3, a7 ); 
  159.     b7 = vec_mergel( a3, a7 ); 
  160.     a0 = vec_mergeh( b0, b4 ); 
  161.     a1 = vec_mergel( b0, b4 ); 
  162.     a2 = vec_mergeh( b1, b5 ); 
  163.     a3 = vec_mergel( b1, b5 ); 
  164.     a4 = vec_mergeh( b2, b6 ); 
  165.     a5 = vec_mergel( b2, b6 ); 
  166.     a6 = vec_mergeh( b3, b7 ); 
  167.     a7 = vec_mergel( b3, b7 ); 
  168.     b0 = vec_mergeh( a0, a4 ); 
  169.     b1 = vec_mergel( a0, a4 ); 
  170.     b2 = vec_mergeh( a1, a5 ); 
  171.     b3 = vec_mergel( a1, a5 ); 
  172.     b4 = vec_mergeh( a2, a6 ); 
  173.     b5 = vec_mergel( a2, a6 ); 
  174.     b6 = vec_mergeh( a3, a7 ); 
  175.     b7 = vec_mergel( a3, a7 )
  176. /***********************************************************************
  177.  * VEC_TRANSPOSE_4
  178.  ***********************************************************************
  179.  * Transposes a 4x4 matrix of s16 vectors.
  180.  * Actually source and destination are 8x4. The low elements of the
  181.  * source are discarded and the low elements of the destination mustn't
  182.  * be used.
  183.  **********************************************************************/
  184. #define VEC_TRANSPOSE_4(a0,a1,a2,a3,b0,b1,b2,b3) 
  185.     b0 = vec_mergeh( a0, a0 ); 
  186.     b1 = vec_mergeh( a1, a0 ); 
  187.     b2 = vec_mergeh( a2, a0 ); 
  188.     b3 = vec_mergeh( a3, a0 ); 
  189.     a0 = vec_mergeh( b0, b2 ); 
  190.     a1 = vec_mergel( b0, b2 ); 
  191.     a2 = vec_mergeh( b1, b3 ); 
  192.     a3 = vec_mergel( b1, b3 ); 
  193.     b0 = vec_mergeh( a0, a2 ); 
  194.     b1 = vec_mergel( a0, a2 ); 
  195.     b2 = vec_mergeh( a1, a3 ); 
  196.     b3 = vec_mergel( a1, a3 )
  197. /***********************************************************************
  198.  * VEC_DIFF_H
  199.  ***********************************************************************
  200.  * p1, p2:    u8 *
  201.  * i1, i2, n: int
  202.  * d:         s16v
  203.  *
  204.  * Loads n bytes from p1 and p2, do the diff of the high elements into
  205.  * d, increments p1 and p2 by i1 and i2
  206.  **********************************************************************/
  207. #define PREP_DIFF           
  208.     LOAD_ZERO;              
  209.     PREP_LOAD;              
  210.     vec_s16_t pix1v, pix2v;
  211. #define VEC_DIFF_H(p1,i1,p2,i2,n,d)      
  212.     VEC_LOAD( p1, pix1v, n, vec_s16_t ); 
  213.     pix1v = vec_u8_to_s16( pix1v );      
  214.     VEC_LOAD( p2, pix2v, n, vec_s16_t ); 
  215.     pix2v = vec_u8_to_s16( pix2v );      
  216.     d     = vec_sub( pix1v, pix2v );     
  217.     p1   += i1;                          
  218.     p2   += i2
  219. /***********************************************************************
  220.  * VEC_DIFF_HL
  221.  ***********************************************************************
  222.  * p1, p2: u8 *
  223.  * i1, i2: int
  224.  * dh, dl: s16v
  225.  *
  226.  * Loads 16 bytes from p1 and p2, do the diff of the high elements into
  227.  * dh, the diff of the low elements into dl, increments p1 and p2 by i1
  228.  * and i2
  229.  **********************************************************************/
  230. #define VEC_DIFF_HL(p1,i1,p2,i2,dh,dl)    
  231.     VEC_LOAD( p1, pix1v, 16, vec_s16_t ); 
  232.     temp0v = vec_u8_to_s16_h( pix1v );    
  233.     temp1v = vec_u8_to_s16_l( pix1v );    
  234.     VEC_LOAD( p2, pix2v, 16, vec_s16_t ); 
  235.     temp2v = vec_u8_to_s16_h( pix2v );    
  236.     temp3v = vec_u8_to_s16_l( pix2v );    
  237.     dh     = vec_sub( temp0v, temp2v );   
  238.     dl     = vec_sub( temp1v, temp3v );   
  239.     p1    += i1;                          
  240.     p2    += i2
  241. /***********************************************************************
  242. * VEC_DIFF_H_8BYTE_ALIGNED
  243. ***********************************************************************
  244. * p1, p2:    u8 *
  245. * i1, i2, n: int
  246. * d:         s16v
  247. *
  248. * Loads n bytes from p1 and p2, do the diff of the high elements into
  249. * d, increments p1 and p2 by i1 and i2
  250. * Slightly faster when we know we are loading/diffing 8bytes which
  251. * are 8 byte aligned. Reduces need for two loads and two vec_lvsl()'s
  252. **********************************************************************/
  253. #define PREP_DIFF_8BYTEALIGNED 
  254. LOAD_ZERO;                     
  255. vec_s16_t pix1v, pix2v;        
  256. vec_u8_t pix1v8, pix2v8;       
  257. vec_u8_t permPix1, permPix2;   
  258. permPix1 = vec_lvsl(0, pix1);  
  259. permPix2 = vec_lvsl(0, pix2);  
  260. #define VEC_DIFF_H_8BYTE_ALIGNED(p1,i1,p2,i2,n,d)     
  261. pix1v8 = vec_perm(vec_ld(0,p1), zero_u8v, permPix1);  
  262. pix2v8 = vec_perm(vec_ld(0, p2), zero_u8v, permPix2); 
  263. pix1v = vec_u8_to_s16( pix1v8 );                      
  264. pix2v = vec_u8_to_s16( pix2v8 );                      
  265. d = vec_sub( pix1v, pix2v);                           
  266. p1 += i1;                                             
  267. p2 += i2;