dsputil_h264_altivec.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:14k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 2004 Romain Dolbeau <romain@dolbeau.org>
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  */
  18.  
  19. #include "../dsputil.h"
  20. #include "gcc_fixes.h"
  21. #include "dsputil_altivec.h"
  22. #define PUT_OP_U8_ALTIVEC(d, s, dst) d = s
  23. #define AVG_OP_U8_ALTIVEC(d, s, dst) d = vec_avg(dst, s)
  24. #define OP_U8_ALTIVEC                          PUT_OP_U8_ALTIVEC
  25. #define PREFIX_h264_chroma_mc8_altivec         put_h264_chroma_mc8_altivec
  26. #define PREFIX_h264_chroma_mc8_num             altivec_put_h264_chroma_mc8_num
  27. #define PREFIX_h264_qpel16_h_lowpass_altivec   put_h264_qpel16_h_lowpass_altivec
  28. #define PREFIX_h264_qpel16_h_lowpass_num       altivec_put_h264_qpel16_h_lowpass_num
  29. #define PREFIX_h264_qpel16_v_lowpass_altivec   put_h264_qpel16_v_lowpass_altivec
  30. #define PREFIX_h264_qpel16_v_lowpass_num       altivec_put_h264_qpel16_v_lowpass_num
  31. #define PREFIX_h264_qpel16_hv_lowpass_altivec  put_h264_qpel16_hv_lowpass_altivec
  32. #define PREFIX_h264_qpel16_hv_lowpass_num      altivec_put_h264_qpel16_hv_lowpass_num
  33. #include "dsputil_h264_template_altivec.c"
  34. #undef OP_U8_ALTIVEC
  35. #undef PREFIX_h264_chroma_mc8_altivec
  36. #undef PREFIX_h264_chroma_mc8_num
  37. #undef PREFIX_h264_qpel16_h_lowpass_altivec
  38. #undef PREFIX_h264_qpel16_h_lowpass_num
  39. #undef PREFIX_h264_qpel16_v_lowpass_altivec
  40. #undef PREFIX_h264_qpel16_v_lowpass_num
  41. #undef PREFIX_h264_qpel16_hv_lowpass_altivec
  42. #undef PREFIX_h264_qpel16_hv_lowpass_num
  43. #define OP_U8_ALTIVEC                          AVG_OP_U8_ALTIVEC
  44. #define PREFIX_h264_chroma_mc8_altivec         avg_h264_chroma_mc8_altivec
  45. #define PREFIX_h264_chroma_mc8_num             altivec_avg_h264_chroma_mc8_num
  46. #define PREFIX_h264_qpel16_h_lowpass_altivec   avg_h264_qpel16_h_lowpass_altivec
  47. #define PREFIX_h264_qpel16_h_lowpass_num       altivec_avg_h264_qpel16_h_lowpass_num
  48. #define PREFIX_h264_qpel16_v_lowpass_altivec   avg_h264_qpel16_v_lowpass_altivec
  49. #define PREFIX_h264_qpel16_v_lowpass_num       altivec_avg_h264_qpel16_v_lowpass_num
  50. #define PREFIX_h264_qpel16_hv_lowpass_altivec  avg_h264_qpel16_hv_lowpass_altivec
  51. #define PREFIX_h264_qpel16_hv_lowpass_num      altivec_avg_h264_qpel16_hv_lowpass_num
  52. #include "dsputil_h264_template_altivec.c"
  53. #undef OP_U8_ALTIVEC
  54. #undef PREFIX_h264_chroma_mc8_altivec
  55. #undef PREFIX_h264_chroma_mc8_num
  56. #undef PREFIX_h264_qpel16_h_lowpass_altivec
  57. #undef PREFIX_h264_qpel16_h_lowpass_num
  58. #undef PREFIX_h264_qpel16_v_lowpass_altivec
  59. #undef PREFIX_h264_qpel16_v_lowpass_num
  60. #undef PREFIX_h264_qpel16_hv_lowpass_altivec
  61. #undef PREFIX_h264_qpel16_hv_lowpass_num
  62. #define H264_MC(OPNAME, SIZE, CODETYPE) 
  63. static void OPNAME ## h264_qpel ## SIZE ## _mc00_ ## CODETYPE (uint8_t *dst, uint8_t *src, int stride){
  64.     OPNAME ## pixels ## SIZE ## _ ## CODETYPE(dst, src, stride, SIZE);
  65. }
  66. static void OPNAME ## h264_qpel ## SIZE ## _mc10_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){ 
  67.     uint64_t temp[SIZE*SIZE/8] __align16;
  68.     uint8_t * const half= (uint8_t*)temp;
  69.     put_h264_qpel ## SIZE ## _h_lowpass_ ## CODETYPE(half, src, SIZE, stride);
  70.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, src, half, stride, stride, SIZE);
  71. }
  72. static void OPNAME ## h264_qpel ## SIZE ## _mc20_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  73.     OPNAME ## h264_qpel ## SIZE ## _h_lowpass_ ## CODETYPE(dst, src, stride, stride);
  74. }
  75. static void OPNAME ## h264_qpel ## SIZE ## _mc30_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  76.     uint64_t temp[SIZE*SIZE/8] __align16;
  77.     uint8_t * const half= (uint8_t*)temp;
  78.     put_h264_qpel ## SIZE ## _h_lowpass_ ## CODETYPE(half, src, SIZE, stride);
  79.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, src+1, half, stride, stride, SIZE);
  80. }
  81. static void OPNAME ## h264_qpel ## SIZE ## _mc01_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  82.     uint64_t temp[SIZE*SIZE/8] __align16;
  83.     uint8_t * const half= (uint8_t*)temp;
  84.     put_h264_qpel ## SIZE ## _v_lowpass_ ## CODETYPE(half, src, SIZE, stride);
  85.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, src, half, stride, stride, SIZE);
  86. }
  87. static void OPNAME ## h264_qpel ## SIZE ## _mc02_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  88.     OPNAME ## h264_qpel ## SIZE ## _v_lowpass_ ## CODETYPE(dst, src, stride, stride);
  89. }
  90. static void OPNAME ## h264_qpel ## SIZE ## _mc03_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  91.     uint64_t temp[SIZE*SIZE/8] __align16;
  92.     uint8_t * const half= (uint8_t*)temp;
  93.     put_h264_qpel ## SIZE ## _v_lowpass_ ## CODETYPE(half, src, SIZE, stride);
  94.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, src+stride, half, stride, stride, SIZE);
  95. }
  96. static void OPNAME ## h264_qpel ## SIZE ## _mc11_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  97.     uint64_t temp[SIZE*SIZE/4] __align16;
  98.     uint8_t * const halfH= (uint8_t*)temp;
  99.     uint8_t * const halfV= ((uint8_t*)temp) + SIZE*SIZE;
  100.     put_h264_qpel ## SIZE ## _h_lowpass_ ## CODETYPE(halfH, src, SIZE, stride);
  101.     put_h264_qpel ## SIZE ## _v_lowpass_ ## CODETYPE(halfV, src, SIZE, stride);
  102.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, halfH, halfV, stride, SIZE, SIZE);
  103. }
  104. static void OPNAME ## h264_qpel ## SIZE ## _mc31_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  105.     uint64_t temp[SIZE*SIZE/4] __align16;
  106.     uint8_t * const halfH= (uint8_t*)temp;
  107.     uint8_t * const halfV= ((uint8_t*)temp) + SIZE*SIZE;
  108.     put_h264_qpel ## SIZE ## _h_lowpass_ ## CODETYPE(halfH, src, SIZE, stride);
  109.     put_h264_qpel ## SIZE ## _v_lowpass_ ## CODETYPE(halfV, src+1, SIZE, stride);
  110.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, halfH, halfV, stride, SIZE, SIZE);
  111. }
  112. static void OPNAME ## h264_qpel ## SIZE ## _mc13_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  113.     uint64_t temp[SIZE*SIZE/4] __align16;
  114.     uint8_t * const halfH= (uint8_t*)temp;
  115.     uint8_t * const halfV= ((uint8_t*)temp) + SIZE*SIZE;
  116.     put_h264_qpel ## SIZE ## _h_lowpass_ ## CODETYPE(halfH, src + stride, SIZE, stride);
  117.     put_h264_qpel ## SIZE ## _v_lowpass_ ## CODETYPE(halfV, src, SIZE, stride);
  118.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, halfH, halfV, stride, SIZE, SIZE);
  119. }
  120. static void OPNAME ## h264_qpel ## SIZE ## _mc33_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  121.     uint64_t temp[SIZE*SIZE/4] __align16;
  122.     uint8_t * const halfH= (uint8_t*)temp;
  123.     uint8_t * const halfV= ((uint8_t*)temp) + SIZE*SIZE;
  124.     put_h264_qpel ## SIZE ## _h_lowpass_ ## CODETYPE(halfH, src + stride, SIZE, stride);
  125.     put_h264_qpel ## SIZE ## _v_lowpass_ ## CODETYPE(halfV, src+1, SIZE, stride);
  126.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, halfH, halfV, stride, SIZE, SIZE);
  127. }
  128. static void OPNAME ## h264_qpel ## SIZE ## _mc22_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  129.     uint64_t temp[SIZE*(SIZE+8)/4] __align16;
  130.     int16_t * const tmp= (int16_t*)temp;
  131.     OPNAME ## h264_qpel ## SIZE ## _hv_lowpass_ ## CODETYPE(dst, tmp, src, stride, SIZE, stride);
  132. }
  133. static void OPNAME ## h264_qpel ## SIZE ## _mc21_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  134.     uint64_t temp[SIZE*(SIZE+8)/4 + SIZE*SIZE/4] __align16;
  135.     uint8_t * const halfH= (uint8_t*)temp;
  136.     uint8_t * const halfHV= ((uint8_t*)temp) + SIZE*SIZE;
  137.     int16_t * const tmp= ((int16_t*)temp) + SIZE*SIZE;
  138.     put_h264_qpel ## SIZE ## _h_lowpass_ ## CODETYPE(halfH, src, SIZE, stride);
  139.     put_h264_qpel ## SIZE ## _hv_lowpass_ ## CODETYPE(halfHV, tmp, src, SIZE, SIZE, stride);
  140.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, halfH, halfHV, stride, SIZE, SIZE);
  141. }
  142. static void OPNAME ## h264_qpel ## SIZE ## _mc23_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  143.     uint64_t temp[SIZE*(SIZE+8)/4 + SIZE*SIZE/4] __align16;
  144.     uint8_t * const halfH= (uint8_t*)temp;
  145.     uint8_t * const halfHV= ((uint8_t*)temp) + SIZE*SIZE;
  146.     int16_t * const tmp= ((int16_t*)temp) + SIZE*SIZE;
  147.     put_h264_qpel ## SIZE ## _h_lowpass_ ## CODETYPE(halfH, src + stride, SIZE, stride);
  148.     put_h264_qpel ## SIZE ## _hv_lowpass_ ## CODETYPE(halfHV, tmp, src, SIZE, SIZE, stride);
  149.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, halfH, halfHV, stride, SIZE, SIZE);
  150. }
  151. static void OPNAME ## h264_qpel ## SIZE ## _mc12_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  152.     uint64_t temp[SIZE*(SIZE+8)/4 + SIZE*SIZE/4] __align16;
  153.     uint8_t * const halfV= (uint8_t*)temp;
  154.     uint8_t * const halfHV= ((uint8_t*)temp) + SIZE*SIZE;
  155.     int16_t * const tmp= ((int16_t*)temp) + SIZE*SIZE;
  156.     put_h264_qpel ## SIZE ## _v_lowpass_ ## CODETYPE(halfV, src, SIZE, stride);
  157.     put_h264_qpel ## SIZE ## _hv_lowpass_ ## CODETYPE(halfHV, tmp, src, SIZE, SIZE, stride);
  158.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, halfV, halfHV, stride, SIZE, SIZE);
  159. }
  160. static void OPNAME ## h264_qpel ## SIZE ## _mc32_ ## CODETYPE(uint8_t *dst, uint8_t *src, int stride){
  161.     uint64_t temp[SIZE*(SIZE+8)/4 + SIZE*SIZE/4] __align16;
  162.     uint8_t * const halfV= (uint8_t*)temp;
  163.     uint8_t * const halfHV= ((uint8_t*)temp) + SIZE*SIZE;
  164.     int16_t * const tmp= ((int16_t*)temp) + SIZE*SIZE;
  165.     put_h264_qpel ## SIZE ## _v_lowpass_ ## CODETYPE(halfV, src+1, SIZE, stride);
  166.     put_h264_qpel ## SIZE ## _hv_lowpass_ ## CODETYPE(halfHV, tmp, src, SIZE, SIZE, stride);
  167.     OPNAME ## pixels ## SIZE ## _l2_ ## CODETYPE(dst, halfV, halfHV, stride, SIZE, SIZE);
  168. }
  169. /* from dsputil.c */
  170. static inline void put_pixels8_l2(uint8_t * dst, const uint8_t * src1, const uint8_t * src2, int dst_stride, int src_stride1, int src_stride2, int h) {
  171. int             i;
  172. for (i = 0; i < h; i++) {
  173. uint32_t        a, b;
  174. a = (((const struct unaligned_32 *) (&src1[i * src_stride1]))->l);
  175. b = (((const struct unaligned_32 *) (&src2[i * src_stride2]))->l);
  176. *((uint32_t *) & dst[i * dst_stride]) = rnd_avg32(a, b);
  177. a = (((const struct unaligned_32 *) (&src1[i * src_stride1 + 4]))->l);
  178. b = (((const struct unaligned_32 *) (&src2[i * src_stride2 + 4]))->l);
  179. *((uint32_t *) & dst[i * dst_stride + 4]) = rnd_avg32(a, b);
  180. }
  181. } static inline void avg_pixels8_l2(uint8_t * dst, const uint8_t * src1, const uint8_t * src2, int dst_stride, int src_stride1, int src_stride2, int h) {
  182. int             i;
  183. for (i = 0; i < h; i++) {
  184. uint32_t        a, b;
  185. a = (((const struct unaligned_32 *) (&src1[i * src_stride1]))->l);
  186. b = (((const struct unaligned_32 *) (&src2[i * src_stride2]))->l);
  187. *((uint32_t *) & dst[i * dst_stride]) = rnd_avg32(*((uint32_t *) & dst[i * dst_stride]), rnd_avg32(a, b));
  188. a = (((const struct unaligned_32 *) (&src1[i * src_stride1 + 4]))->l);
  189. b = (((const struct unaligned_32 *) (&src2[i * src_stride2 + 4]))->l);
  190. *((uint32_t *) & dst[i * dst_stride + 4]) = rnd_avg32(*((uint32_t *) & dst[i * dst_stride + 4]), rnd_avg32(a, b));
  191. }
  192. } static inline void put_pixels16_l2(uint8_t * dst, const uint8_t * src1, const uint8_t * src2, int dst_stride, int src_stride1, int src_stride2, int h) {
  193. put_pixels8_l2(dst, src1, src2, dst_stride, src_stride1, src_stride2, h);
  194. put_pixels8_l2(dst + 8, src1 + 8, src2 + 8, dst_stride, src_stride1, src_stride2, h);
  195. } static inline void avg_pixels16_l2(uint8_t * dst, const uint8_t * src1, const uint8_t * src2, int dst_stride, int src_stride1, int src_stride2, int h) {
  196. avg_pixels8_l2(dst, src1, src2, dst_stride, src_stride1, src_stride2, h);
  197. avg_pixels8_l2(dst + 8, src1 + 8, src2 + 8, dst_stride, src_stride1, src_stride2, h);
  198. }
  199. /* UNIMPLEMENTED YET !! */
  200. #define put_pixels16_l2_altivec(d,s1,s2,ds,s1s,h) put_pixels16_l2(d,s1,s2,ds,s1s,16,h)
  201. #define avg_pixels16_l2_altivec(d,s1,s2,ds,s1s,h) avg_pixels16_l2(d,s1,s2,ds,s1s,16,h)
  202. H264_MC(put_, 16, altivec)
  203.      H264_MC(avg_, 16, altivec)
  204. void dsputil_h264_init_ppc(DSPContext* c, AVCodecContext *avctx) {
  205.     
  206. #ifdef HAVE_ALTIVEC
  207.   if (has_altivec()) {
  208.     c->put_h264_chroma_pixels_tab[0] = put_h264_chroma_mc8_altivec;
  209.     c->avg_h264_chroma_pixels_tab[0] = avg_h264_chroma_mc8_altivec;
  210. #define dspfunc(PFX, IDX, NUM) 
  211.     c->PFX ## _pixels_tab[IDX][ 0] = PFX ## NUM ## _mc00_altivec; 
  212.     c->PFX ## _pixels_tab[IDX][ 1] = PFX ## NUM ## _mc10_altivec; 
  213.     c->PFX ## _pixels_tab[IDX][ 2] = PFX ## NUM ## _mc20_altivec; 
  214.     c->PFX ## _pixels_tab[IDX][ 3] = PFX ## NUM ## _mc30_altivec; 
  215.     c->PFX ## _pixels_tab[IDX][ 4] = PFX ## NUM ## _mc01_altivec; 
  216.     c->PFX ## _pixels_tab[IDX][ 5] = PFX ## NUM ## _mc11_altivec; 
  217.     c->PFX ## _pixels_tab[IDX][ 6] = PFX ## NUM ## _mc21_altivec; 
  218.     c->PFX ## _pixels_tab[IDX][ 7] = PFX ## NUM ## _mc31_altivec; 
  219.     c->PFX ## _pixels_tab[IDX][ 8] = PFX ## NUM ## _mc02_altivec; 
  220.     c->PFX ## _pixels_tab[IDX][ 9] = PFX ## NUM ## _mc12_altivec; 
  221.     c->PFX ## _pixels_tab[IDX][10] = PFX ## NUM ## _mc22_altivec; 
  222.     c->PFX ## _pixels_tab[IDX][11] = PFX ## NUM ## _mc32_altivec; 
  223.     c->PFX ## _pixels_tab[IDX][12] = PFX ## NUM ## _mc03_altivec; 
  224.     c->PFX ## _pixels_tab[IDX][13] = PFX ## NUM ## _mc13_altivec; 
  225.     c->PFX ## _pixels_tab[IDX][14] = PFX ## NUM ## _mc23_altivec; 
  226.     c->PFX ## _pixels_tab[IDX][15] = PFX ## NUM ## _mc33_altivec
  227.     
  228.     dspfunc(put_h264_qpel, 0, 16);
  229.     dspfunc(avg_h264_qpel, 0, 16);
  230. #undef dspfunc
  231.     
  232.   } else
  233. #endif /* HAVE_ALTIVEC */
  234.   {
  235.     // Non-AltiVec PPC optimisations
  236.     
  237.     // ... pending ...
  238.   }
  239. }