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

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * dct.c: h264 encoder library
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id$
  6.  *
  7.  * Authors: Eric Petit <titer@m0k.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #ifdef SYS_LINUX
  24. #include <altivec.h>
  25. #endif
  26. #include "common/common.h"
  27. #include "ppccommon.h"
  28. #define VEC_DCT(a0,a1,a2,a3,b0,b1,b2,b3) 
  29.     b1 = vec_add( a0, a3 );              
  30.     b3 = vec_add( a1, a2 );              
  31.     b0 = vec_add( b1, b3 );              
  32.     b2 = vec_sub( b1, b3 );              
  33.     a0 = vec_sub( a0, a3 );              
  34.     a1 = vec_sub( a1, a2 );              
  35.     b1 = vec_add( a0, a0 );              
  36.     b1 = vec_add( b1, a1 );              
  37.     b3 = vec_sub( a0, a1 );              
  38.     b3 = vec_sub( b3, a1 )
  39. void x264_sub4x4_dct_altivec( int16_t dct[4][4],
  40.         uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  41. {
  42.     PREP_DIFF;
  43.     PREP_STORE8;
  44.     vec_s16_t dct0v, dct1v, dct2v, dct3v;
  45.     vec_s16_t tmp0v, tmp1v, tmp2v, tmp3v;
  46.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, dct0v );
  47.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, dct1v );
  48.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, dct2v );
  49.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, dct3v );
  50.     VEC_DCT( dct0v, dct1v, dct2v, dct3v, tmp0v, tmp1v, tmp2v, tmp3v );
  51.     VEC_TRANSPOSE_4( tmp0v, tmp1v, tmp2v, tmp3v,
  52.                      dct0v, dct1v, dct2v, dct3v );
  53.     VEC_DCT( dct0v, dct1v, dct2v, dct3v, tmp0v, tmp1v, tmp2v, tmp3v );
  54.     VEC_TRANSPOSE_4( tmp0v, tmp1v, tmp2v, tmp3v,
  55.                      dct0v, dct1v, dct2v, dct3v );
  56.     VEC_STORE8( dct0v, dct[0] );
  57.     VEC_STORE8( dct1v, dct[1] );
  58.     VEC_STORE8( dct2v, dct[2] );
  59.     VEC_STORE8( dct3v, dct[3] );
  60. }
  61. void x264_sub8x8_dct_altivec( int16_t dct[4][4][4],
  62.         uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  63. {
  64.     PREP_DIFF;
  65.     PREP_STORE8_HL;
  66.     vec_s16_t dct0v, dct1v, dct2v, dct3v, dct4v, dct5v, dct6v, dct7v;
  67.     vec_s16_t tmp0v, tmp1v, tmp2v, tmp3v, tmp4v, tmp5v, tmp6v, tmp7v;
  68.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, dct0v );
  69.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, dct1v );
  70.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, dct2v );
  71.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, dct3v );
  72.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, dct4v );
  73.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, dct5v );
  74.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, dct6v );
  75.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, dct7v );
  76.     VEC_DCT( dct0v, dct1v, dct2v, dct3v, tmp0v, tmp1v, tmp2v, tmp3v );
  77.     VEC_DCT( dct4v, dct5v, dct6v, dct7v, tmp4v, tmp5v, tmp6v, tmp7v );
  78.     VEC_TRANSPOSE_8( tmp0v, tmp1v, tmp2v, tmp3v,
  79.                      tmp4v, tmp5v, tmp6v, tmp7v,
  80.                      dct0v, dct1v, dct2v, dct3v,
  81.                      dct4v, dct5v, dct6v, dct7v );
  82.     VEC_DCT( dct0v, dct1v, dct2v, dct3v, tmp0v, tmp1v, tmp2v, tmp3v );
  83.     VEC_DCT( dct4v, dct5v, dct6v, dct7v, tmp4v, tmp5v, tmp6v, tmp7v );
  84.     VEC_TRANSPOSE_8( tmp0v, tmp1v, tmp2v, tmp3v,
  85.                      tmp4v, tmp5v, tmp6v, tmp7v,
  86.                      dct0v, dct1v, dct2v, dct3v,
  87.                      dct4v, dct5v, dct6v, dct7v );
  88.     VEC_STORE8_H( dct0v, dct[0][0] );
  89.     VEC_STORE8_L( dct0v, dct[1][0] );
  90.     VEC_STORE8_H( dct1v, dct[0][1] );
  91.     VEC_STORE8_L( dct1v, dct[1][1] );
  92.     VEC_STORE8_H( dct2v, dct[0][2] );
  93.     VEC_STORE8_L( dct2v, dct[1][2] );
  94.     VEC_STORE8_H( dct3v, dct[0][3] );
  95.     VEC_STORE8_L( dct3v, dct[1][3] );
  96.     VEC_STORE8_H( dct4v, dct[2][0] );
  97.     VEC_STORE8_L( dct4v, dct[3][0] );
  98.     VEC_STORE8_H( dct5v, dct[2][1] );
  99.     VEC_STORE8_L( dct5v, dct[3][1] );
  100.     VEC_STORE8_H( dct6v, dct[2][2] );
  101.     VEC_STORE8_L( dct6v, dct[3][2] );
  102.     VEC_STORE8_H( dct7v, dct[2][3] );
  103.     VEC_STORE8_L( dct7v, dct[3][3] );
  104. }
  105.     
  106. void x264_sub16x16_dct_altivec( int16_t dct[16][4][4],
  107.         uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 ) 
  108. {
  109.     PREP_DIFF;
  110.     PREP_STORE8_HL;
  111.     vec_s16_t dcth0v, dcth1v, dcth2v, dcth3v,
  112.               dcth4v, dcth5v, dcth6v, dcth7v,
  113.               dctl0v, dctl1v, dctl2v, dctl3v,
  114.               dctl4v, dctl5v, dctl6v, dctl7v;
  115.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  116.               temp4v, temp5v, temp6v, temp7v;
  117.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth0v, dctl0v );
  118.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth1v, dctl1v );
  119.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth2v, dctl2v );
  120.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth3v, dctl3v );
  121.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth4v, dctl4v );
  122.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth5v, dctl5v );
  123.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth6v, dctl6v );
  124.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth7v, dctl7v );
  125.     VEC_DCT( dcth0v, dcth1v, dcth2v, dcth3v,
  126.              temp0v, temp1v, temp2v, temp3v );
  127.     VEC_DCT( dcth4v, dcth5v, dcth6v, dcth7v,
  128.              temp4v, temp5v, temp6v, temp7v );
  129.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  130.                      temp4v, temp5v, temp6v, temp7v,
  131.                      dcth0v, dcth1v, dcth2v, dcth3v,
  132.                      dcth4v, dcth5v, dcth6v, dcth7v );
  133.     VEC_DCT( dcth0v, dcth1v, dcth2v, dcth3v,
  134.              temp0v, temp1v, temp2v, temp3v );
  135.     VEC_DCT( dcth4v, dcth5v, dcth6v, dcth7v,
  136.              temp4v, temp5v, temp6v, temp7v );
  137.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  138.                      temp4v, temp5v, temp6v, temp7v,
  139.                      dcth0v, dcth1v, dcth2v, dcth3v,
  140.                      dcth4v, dcth5v, dcth6v, dcth7v );
  141.     VEC_STORE8_H( dcth0v, dct[0][0] );
  142.     VEC_STORE8_L( dcth0v, dct[1][0] );
  143.     VEC_STORE8_H( dcth1v, dct[0][1] );
  144.     VEC_STORE8_L( dcth1v, dct[1][1] );
  145.     VEC_STORE8_H( dcth2v, dct[0][2] );
  146.     VEC_STORE8_L( dcth2v, dct[1][2] );
  147.     VEC_STORE8_H( dcth3v, dct[0][3] );
  148.     VEC_STORE8_L( dcth3v, dct[1][3] );
  149.     VEC_STORE8_H( dcth4v, dct[2][0] );
  150.     VEC_STORE8_L( dcth4v, dct[3][0] );
  151.     VEC_STORE8_H( dcth5v, dct[2][1] );
  152.     VEC_STORE8_L( dcth5v, dct[3][1] );
  153.     VEC_STORE8_H( dcth6v, dct[2][2] );
  154.     VEC_STORE8_L( dcth6v, dct[3][2] );
  155.     VEC_STORE8_H( dcth7v, dct[2][3] );
  156.     VEC_STORE8_L( dcth7v, dct[3][3] );
  157.     VEC_DCT( dctl0v, dctl1v, dctl2v, dctl3v,
  158.              temp0v, temp1v, temp2v, temp3v );
  159.     VEC_DCT( dctl4v, dctl5v, dctl6v, dctl7v,
  160.              temp4v, temp5v, temp6v, temp7v );
  161.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  162.                      temp4v, temp5v, temp6v, temp7v,
  163.                      dctl0v, dctl1v, dctl2v, dctl3v,
  164.                      dctl4v, dctl5v, dctl6v, dctl7v );
  165.     VEC_DCT( dctl0v, dctl1v, dctl2v, dctl3v,
  166.              temp0v, temp1v, temp2v, temp3v );
  167.     VEC_DCT( dctl4v, dctl5v, dctl6v, dctl7v,
  168.              temp4v, temp5v, temp6v, temp7v );
  169.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  170.                      temp4v, temp5v, temp6v, temp7v,
  171.                      dctl0v, dctl1v, dctl2v, dctl3v,
  172.                      dctl4v, dctl5v, dctl6v, dctl7v );
  173.     VEC_STORE8_H( dctl0v, dct[4][0] );
  174.     VEC_STORE8_L( dctl0v, dct[5][0] );
  175.     VEC_STORE8_H( dctl1v, dct[4][1] );
  176.     VEC_STORE8_L( dctl1v, dct[5][1] );
  177.     VEC_STORE8_H( dctl2v, dct[4][2] );
  178.     VEC_STORE8_L( dctl2v, dct[5][2] );
  179.     VEC_STORE8_H( dctl3v, dct[4][3] );
  180.     VEC_STORE8_L( dctl3v, dct[5][3] );
  181.     VEC_STORE8_H( dctl4v, dct[6][0] );
  182.     VEC_STORE8_L( dctl4v, dct[7][0] );
  183.     VEC_STORE8_H( dctl5v, dct[6][1] );
  184.     VEC_STORE8_L( dctl5v, dct[7][1] );
  185.     VEC_STORE8_H( dctl6v, dct[6][2] );
  186.     VEC_STORE8_L( dctl6v, dct[7][2] );
  187.     VEC_STORE8_H( dctl7v, dct[6][3] );
  188.     VEC_STORE8_L( dctl7v, dct[7][3] );
  189.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth0v, dctl0v );
  190.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth1v, dctl1v );
  191.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth2v, dctl2v );
  192.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth3v, dctl3v );
  193.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth4v, dctl4v );
  194.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth5v, dctl5v );
  195.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth6v, dctl6v );
  196.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, dcth7v, dctl7v );
  197.     VEC_DCT( dcth0v, dcth1v, dcth2v, dcth3v,
  198.              temp0v, temp1v, temp2v, temp3v );
  199.     VEC_DCT( dcth4v, dcth5v, dcth6v, dcth7v,
  200.              temp4v, temp5v, temp6v, temp7v );
  201.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  202.                      temp4v, temp5v, temp6v, temp7v,
  203.                      dcth0v, dcth1v, dcth2v, dcth3v,
  204.                      dcth4v, dcth5v, dcth6v, dcth7v );
  205.     VEC_DCT( dcth0v, dcth1v, dcth2v, dcth3v,
  206.              temp0v, temp1v, temp2v, temp3v );
  207.     VEC_DCT( dcth4v, dcth5v, dcth6v, dcth7v,
  208.              temp4v, temp5v, temp6v, temp7v );
  209.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  210.                      temp4v, temp5v, temp6v, temp7v,
  211.                      dcth0v, dcth1v, dcth2v, dcth3v,
  212.                      dcth4v, dcth5v, dcth6v, dcth7v );
  213.     VEC_STORE8_H( dcth0v, dct[8][0] );
  214.     VEC_STORE8_L( dcth0v, dct[9][0] );
  215.     VEC_STORE8_H( dcth1v, dct[8][1] );
  216.     VEC_STORE8_L( dcth1v, dct[9][1] );
  217.     VEC_STORE8_H( dcth2v, dct[8][2] );
  218.     VEC_STORE8_L( dcth2v, dct[9][2] );
  219.     VEC_STORE8_H( dcth3v, dct[8][3] );
  220.     VEC_STORE8_L( dcth3v, dct[9][3] );
  221.     VEC_STORE8_H( dcth4v, dct[10][0] );
  222.     VEC_STORE8_L( dcth4v, dct[11][0] );
  223.     VEC_STORE8_H( dcth5v, dct[10][1] );
  224.     VEC_STORE8_L( dcth5v, dct[11][1] );
  225.     VEC_STORE8_H( dcth6v, dct[10][2] );
  226.     VEC_STORE8_L( dcth6v, dct[11][2] );
  227.     VEC_STORE8_H( dcth7v, dct[10][3] );
  228.     VEC_STORE8_L( dcth7v, dct[11][3] );
  229.     VEC_DCT( dctl0v, dctl1v, dctl2v, dctl3v,
  230.              temp0v, temp1v, temp2v, temp3v );
  231.     VEC_DCT( dctl4v, dctl5v, dctl6v, dctl7v,
  232.              temp4v, temp5v, temp6v, temp7v );
  233.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  234.                      temp4v, temp5v, temp6v, temp7v,
  235.                      dctl0v, dctl1v, dctl2v, dctl3v,
  236.                      dctl4v, dctl5v, dctl6v, dctl7v );
  237.     VEC_DCT( dctl0v, dctl1v, dctl2v, dctl3v,
  238.              temp0v, temp1v, temp2v, temp3v );
  239.     VEC_DCT( dctl4v, dctl5v, dctl6v, dctl7v,
  240.              temp4v, temp5v, temp6v, temp7v );
  241.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  242.                      temp4v, temp5v, temp6v, temp7v,
  243.                      dctl0v, dctl1v, dctl2v, dctl3v,
  244.                      dctl4v, dctl5v, dctl6v, dctl7v );
  245.     VEC_STORE8_H( dctl0v, dct[12][0] );
  246.     VEC_STORE8_L( dctl0v, dct[13][0] );
  247.     VEC_STORE8_H( dctl1v, dct[12][1] );
  248.     VEC_STORE8_L( dctl1v, dct[13][1] );
  249.     VEC_STORE8_H( dctl2v, dct[12][2] );
  250.     VEC_STORE8_L( dctl2v, dct[13][2] );
  251.     VEC_STORE8_H( dctl3v, dct[12][3] );
  252.     VEC_STORE8_L( dctl3v, dct[13][3] );
  253.     VEC_STORE8_H( dctl4v, dct[14][0] );
  254.     VEC_STORE8_L( dctl4v, dct[15][0] );
  255.     VEC_STORE8_H( dctl5v, dct[14][1] );
  256.     VEC_STORE8_L( dctl5v, dct[15][1] );
  257.     VEC_STORE8_H( dctl6v, dct[14][2] );
  258.     VEC_STORE8_L( dctl6v, dct[15][2] );
  259.     VEC_STORE8_H( dctl7v, dct[14][3] );
  260.     VEC_STORE8_L( dctl7v, dct[15][3] );
  261. }