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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file transform.c
  4.  *
  5.  * brief
  6.  *    Transform functions
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Alexis Michael Tourapis
  11.  * date
  12.  *    01. July 2007
  13.  **************************************************************************
  14.  */
  15. #include "global.h"
  16. #include "transform.h"
  17. static int tmp[64];
  18. void forward4x4(int (*block)[16], int (*tblock)[16], int pos_y, int pos_x)
  19. {
  20.   int i, ii;  
  21.   int *pTmp = tmp, *pblock;
  22.   static int p0,p1,p2,p3;
  23.   static int t0,t1,t2,t3;
  24.   // Horizontal
  25.   for (i=pos_y; i < pos_y + BLOCK_SIZE; i++)
  26.   {
  27.     pblock = &block[i][pos_x];
  28.     p0 = *(pblock++);
  29.     p1 = *(pblock++);
  30.     p2 = *(pblock++);
  31.     p3 = *(pblock  );
  32.     t0 = p0 + p3;
  33.     t1 = p1 + p2;
  34.     t2 = p1 - p2;
  35.     t3 = p0 - p3;
  36.     *(pTmp++) =  t0 + t1;
  37.     *(pTmp++) = (t3 << 1) + t2;
  38.     *(pTmp++) =  t0 - t1;    
  39.     *(pTmp++) =  t3 - (t2 << 1);
  40.   }
  41.   // Vertical 
  42.   for (i=0; i < BLOCK_SIZE; i++)
  43.   {
  44.     pTmp = tmp + i;
  45.     p0 = *pTmp;
  46.     p1 = *(pTmp += BLOCK_SIZE);
  47.     p2 = *(pTmp += BLOCK_SIZE);
  48.     p3 = *(pTmp += BLOCK_SIZE);
  49.     t0 = p0 + p3;
  50.     t1 = p1 + p2;
  51.     t2 = p1 - p2;
  52.     t3 = p0 - p3;
  53.     ii = pos_x + i;
  54.     tblock[pos_y    ][ii] = t0 +  t1;
  55.     tblock[pos_y + 1][ii] = t2 + (t3 << 1);
  56.     tblock[pos_y + 2][ii] = t0 -  t1;
  57.     tblock[pos_y + 3][ii] = t3 - (t2 << 1);
  58.   }
  59. }
  60. void inverse4x4(int (*tblock)[16], int (*block)[16], int pos_y, int pos_x)
  61. {
  62.   int i, ii;  
  63.   int *pTmp = tmp, *pblock;
  64.   static int p0,p1,p2,p3;
  65.   static int t0,t1,t2,t3;
  66.   // Horizontal
  67.   for (i = pos_y; i < pos_y + BLOCK_SIZE; i++)
  68.   {
  69.     pblock = &tblock[i][pos_x];
  70.     t0 = *(pblock++);
  71.     t1 = *(pblock++);
  72.     t2 = *(pblock++);
  73.     t3 = *(pblock  );
  74.     p0 =  t0 + t2;
  75.     p1 =  t0 - t2;
  76.     p2 = (t1 >> 1) - t3;
  77.     p3 =  t1 + (t3 >> 1);
  78.     *(pTmp++) = p0 + p3;
  79.     *(pTmp++) = p1 + p2;
  80.     *(pTmp++) = p1 - p2;
  81.     *(pTmp++) = p0 - p3;
  82.   }
  83.   //  Vertical 
  84.   for (i = 0; i < BLOCK_SIZE; i++)
  85.   {
  86.     pTmp = tmp + i;
  87.     t0 = *pTmp;
  88.     t1 = *(pTmp += BLOCK_SIZE);
  89.     t2 = *(pTmp += BLOCK_SIZE);
  90.     t3 = *(pTmp += BLOCK_SIZE);
  91.     p0 = t0 + t2;
  92.     p1 = t0 - t2;
  93.     p2 =(t1 >> 1) - t3;
  94.     p3 = t1 + (t3 >> 1);
  95.     ii = i + pos_x;
  96.     block[pos_y    ][ii] = p0 + p3;
  97.     block[pos_y + 1][ii] = p1 + p2;
  98.     block[pos_y + 2][ii] = p1 - p2;
  99.     block[pos_y + 3][ii] = p0 - p3;
  100.   }
  101. }
  102. void hadamard4x4(int (*block)[4], int (*tblock)[4])
  103. {
  104.   int i;
  105.   int *pTmp = tmp, *pblock;
  106.   static int p0,p1,p2,p3;
  107.   static int t0,t1,t2,t3;
  108.   // Horizontal
  109.   for (i = 0; i < BLOCK_SIZE; i++)
  110.   {
  111.     pblock = block[i];
  112.     p0 = *(pblock++);
  113.     p1 = *(pblock++);
  114.     p2 = *(pblock++);
  115.     p3 = *(pblock  );
  116.     t0 = p0 + p3;
  117.     t1 = p1 + p2;
  118.     t2 = p1 - p2;
  119.     t3 = p0 - p3;
  120.     *(pTmp++) = t0 + t1;
  121.     *(pTmp++) = t3 + t2;
  122.     *(pTmp++) = t0 - t1;    
  123.     *(pTmp++) = t3 - t2;
  124.   }
  125.   // Vertical 
  126.   for (i = 0; i < BLOCK_SIZE; i++)
  127.   {
  128.     pTmp = tmp + i;
  129.     p0 = *pTmp;
  130.     p1 = *(pTmp += BLOCK_SIZE);
  131.     p2 = *(pTmp += BLOCK_SIZE);
  132.     p3 = *(pTmp += BLOCK_SIZE);
  133.     t0 = p0 + p3;
  134.     t1 = p1 + p2;
  135.     t2 = p1 - p2;
  136.     t3 = p0 - p3;
  137.     tblock[0][i] = (t0 + t1) >> 1;
  138.     tblock[1][i] = (t2 + t3) >> 1;
  139.     tblock[2][i] = (t0 - t1) >> 1;
  140.     tblock[3][i] = (t3 - t2) >> 1;
  141.   }
  142. }
  143. void ihadamard4x4(int (*tblock)[4], int (*block)[4])
  144. {
  145.   int i;  
  146.   int *pTmp = tmp, *pblock;
  147.   static int p0,p1,p2,p3;
  148.   static int t0,t1,t2,t3;
  149.   // Horizontal
  150.   for (i = 0; i < BLOCK_SIZE; i++)
  151.   {
  152.     pblock = tblock[i];
  153.     t0 = *(pblock++);
  154.     t1 = *(pblock++);
  155.     t2 = *(pblock++);
  156.     t3 = *(pblock  );
  157.     p0 = t0 + t2;
  158.     p1 = t0 - t2;
  159.     p2 = t1 - t3;
  160.     p3 = t1 + t3;
  161.     *(pTmp++) = p0 + p3;
  162.     *(pTmp++) = p1 + p2;
  163.     *(pTmp++) = p1 - p2;
  164.     *(pTmp++) = p0 - p3;
  165.   }
  166.   //  Vertical 
  167.   for (i = 0; i < BLOCK_SIZE; i++)
  168.   {
  169.     pTmp = tmp + i;
  170.     t0 = *pTmp;
  171.     t1 = *(pTmp += BLOCK_SIZE);
  172.     t2 = *(pTmp += BLOCK_SIZE);
  173.     t3 = *(pTmp += BLOCK_SIZE);
  174.     p0 = t0 + t2;
  175.     p1 = t0 - t2;
  176.     p2 = t1 - t3;
  177.     p3 = t1 + t3;
  178.     
  179.     block[0][i] = p0 + p3;
  180.     block[1][i] = p1 + p2;
  181.     block[2][i] = p1 - p2;
  182.     block[3][i] = p0 - p3;
  183.   }
  184. }
  185. void hadamard4x2(int (*block)[4], int (*tblock)[4])
  186. {
  187.   int i;
  188.   int *pTmp = tmp;
  189.   static int p0,p1,p2,p3;
  190.   static int t0,t1,t2,t3;
  191.   // Horizontal
  192.   *(pTmp++) = block[0][0] + block[1][0];
  193.   *(pTmp++) = block[0][1] + block[1][1];
  194.   *(pTmp++) = block[0][2] + block[1][2];
  195.   *(pTmp++) = block[0][3] + block[1][3];
  196.   *(pTmp++) = block[0][0] - block[1][0];
  197.   *(pTmp++) = block[0][1] - block[1][1];
  198.   *(pTmp++) = block[0][2] - block[1][2];
  199.   *(pTmp  ) = block[0][3] - block[1][3];
  200.   // Vertical
  201.   pTmp = tmp;
  202.   for (i=0;i<2;i++)
  203.   {      
  204.     p0 = *(pTmp++);
  205.     p1 = *(pTmp++);
  206.     p2 = *(pTmp++);
  207.     p3 = *(pTmp++);
  208.     t0 = p0 + p3;
  209.     t1 = p1 + p2;
  210.     t2 = p1 - p2;
  211.     t3 = p0 - p3;
  212.     tblock[i][0] = (t0 + t1);
  213.     tblock[i][1] = (t3 + t2);
  214.     tblock[i][2] = (t0 - t1);      
  215.     tblock[i][3] = (t3 - t2);
  216.   }
  217. }
  218. void ihadamard4x2(int (*tblock)[4], int (*block)[4])
  219. {
  220.   int i;  
  221.   int *pTmp = tmp;
  222.   static int p0,p1,p2,p3;
  223.   static int t0,t1,t2,t3;
  224.   // Horizontal
  225.   *(pTmp++) = tblock[0][0] + tblock[1][0];
  226.   *(pTmp++) = tblock[0][1] + tblock[1][1];
  227.   *(pTmp++) = tblock[0][2] + tblock[1][2];
  228.   *(pTmp++) = tblock[0][3] + tblock[1][3];
  229.   *(pTmp++) = tblock[0][0] - tblock[1][0];
  230.   *(pTmp++) = tblock[0][1] - tblock[1][1];
  231.   *(pTmp++) = tblock[0][2] - tblock[1][2];
  232.   *(pTmp  ) = tblock[0][3] - tblock[1][3];
  233.   // Vertical
  234.   pTmp = tmp;
  235.   for (i = 0; i < 2; i++)
  236.   {
  237.     p0 = *(pTmp++);
  238.     p1 = *(pTmp++);
  239.     p2 = *(pTmp++);
  240.     p3 = *(pTmp++);
  241.     t0 = p0 + p2;
  242.     t1 = p0 - p2;
  243.     t2 = p1 - p3;
  244.     t3 = p1 + p3;
  245.     // coefficients (transposed)
  246.     block[0][i] = t0 + t3;
  247.     block[1][i] = t1 + t2;
  248.     block[2][i] = t1 - t2;
  249.     block[3][i] = t0 - t3;
  250.   }
  251. }
  252. //following functions perform 8 additions, 8 assignments. Should be a bit faster
  253. void hadamard2x2(int (*block)[16], int tblock[4])
  254. {
  255.   static int p0,p1,p2,p3;
  256.   p0 = block[0][0] + block[0][4];
  257.   p1 = block[0][0] - block[0][4];
  258.   p2 = block[4][0] + block[4][4];
  259.   p3 = block[4][0] - block[4][4];
  260.  
  261.   tblock[0] = (p0 + p2);
  262.   tblock[1] = (p1 + p3);
  263.   tblock[2] = (p0 - p2);
  264.   tblock[3] = (p1 - p3);
  265. }
  266. void ihadamard2x2(int tblock[4], int block[4])
  267. {
  268.   static int t0,t1,t2,t3;
  269.   t0 = tblock[0] + tblock[1];
  270.   t1 = tblock[0] - tblock[1];
  271.   t2 = tblock[2] + tblock[3];
  272.   t3 = tblock[2] - tblock[3];
  273.   block[0] = (t0 + t2);
  274.   block[1] = (t1 + t3);
  275.   block[2] = (t0 - t2);
  276.   block[3] = (t1 - t3);
  277. }
  278. /*
  279. void hadamard2x2(int (*block)[16], int tblock[4])
  280. {
  281.   //12 additions, 4 assignments
  282.     tblock[0] = (block[0][0] + block[0][4] + block[4][0] + block[4][4]);
  283.     tblock[1] = (block[0][0] - block[0][4] + block[4][0] - block[4][4]);
  284.     tblock[2] = (block[0][0] + block[0][4] - block[4][0] - block[4][4]);
  285.     tblock[3] = (block[0][0] - block[0][4] - block[4][0] + block[4][4]);
  286. }
  287. void ihadamard2x2(int tblock[4], int block[4])
  288. {
  289.     block[0] = (tblock[0] + tblock[1] + tblock[2] + tblock[3]);
  290.     block[1] = (tblock[0] - tblock[1] + tblock[2] - tblock[3]);
  291.     block[2] = (tblock[0] + tblock[1] - tblock[2] - tblock[3]);
  292.     block[3] = (tblock[0] - tblock[1] - tblock[2] + tblock[3]);
  293. }
  294. */
  295. void forward8x8(int (*block)[16], int (*tblock)[16], int pos_y, int pos_x)
  296. {
  297.   int i, ii;  
  298.   int *pTmp = tmp, *pblock;
  299.   static int a0, a1, a2, a3;
  300.   static int p0, p1, p2, p3, p4, p5 ,p6, p7;
  301.   static int b0, b1, b2, b3, b4, b5, b6, b7;
  302.   // Horizontal
  303.   for (i=pos_y; i < pos_y + BLOCK_SIZE_8x8; i++)
  304.   {
  305.     pblock = &block[i][pos_x];
  306.     p0 = *(pblock++);
  307.     p1 = *(pblock++);
  308.     p2 = *(pblock++);
  309.     p3 = *(pblock++);
  310.     p4 = *(pblock++);
  311.     p5 = *(pblock++);
  312.     p6 = *(pblock++);
  313.     p7 = *(pblock  );
  314.     a0 = p0 + p7;
  315.     a1 = p1 + p6;
  316.     a2 = p2 + p5;
  317.     a3 = p3 + p4;
  318.     b0 = a0 + a3;
  319.     b1 = a1 + a2;
  320.     b2 = a0 - a3;
  321.     b3 = a1 - a2;
  322.     a0 = p0 - p7;
  323.     a1 = p1 - p6;
  324.     a2 = p2 - p5;
  325.     a3 = p3 - p4;
  326.     b4 = a1 + a2 + ((a0 >> 1) + a0);
  327.     b5 = a0 - a3 - ((a2 >> 1) + a2);
  328.     b6 = a0 + a3 - ((a1 >> 1) + a1);
  329.     b7 = a1 - a2 + ((a3 >> 1) + a3);
  330.     *(pTmp++) =  b0 + b1;
  331.     *(pTmp++) =  b4 + (b7 >> 2);
  332.     *(pTmp++) =  b2 + (b3 >> 1);
  333.     *(pTmp++) =  b5 + (b6 >> 2);
  334.     *(pTmp++) =  b0 - b1;
  335.     *(pTmp++) =  b6 - (b5 >> 2);
  336.     *(pTmp++) = (b2 >> 1) - b3;                 
  337.     *(pTmp++) = (b4 >> 2) - b7;
  338.   }
  339.   // Vertical 
  340.   for (i=0; i < BLOCK_SIZE_8x8; i++)
  341.   {
  342.     pTmp = tmp + i;
  343.     p0 = *pTmp;
  344.     p1 = *(pTmp += BLOCK_SIZE_8x8);
  345.     p2 = *(pTmp += BLOCK_SIZE_8x8);
  346.     p3 = *(pTmp += BLOCK_SIZE_8x8);
  347.     p4 = *(pTmp += BLOCK_SIZE_8x8);
  348.     p5 = *(pTmp += BLOCK_SIZE_8x8);
  349.     p6 = *(pTmp += BLOCK_SIZE_8x8);
  350.     p7 = *(pTmp += BLOCK_SIZE_8x8);
  351.     a0 = p0 + p7;
  352.     a1 = p1 + p6;
  353.     a2 = p2 + p5;
  354.     a3 = p3 + p4;
  355.     b0 = a0 + a3;
  356.     b1 = a1 + a2;
  357.     b2 = a0 - a3;
  358.     b3 = a1 - a2;
  359.     a0 = p0 - p7;
  360.     a1 = p1 - p6;
  361.     a2 = p2 - p5;
  362.     a3 = p3 - p4;
  363.     b4 = a1 + a2 + ((a0 >> 1) + a0);
  364.     b5 = a0 - a3 - ((a2 >> 1) + a2);
  365.     b6 = a0 + a3 - ((a1 >> 1) + a1);
  366.     b7 = a1 - a2 + ((a3 >> 1) + a3);
  367.     ii = pos_x + i;
  368.     tblock[pos_y    ][ii] =  b0 + b1;
  369.     tblock[pos_y + 1][ii] =  b4 + (b7 >> 2);
  370.     tblock[pos_y + 2][ii] =  b2 + (b3 >> 1);
  371.     tblock[pos_y + 3][ii] =  b5 + (b6 >> 2);
  372.     tblock[pos_y + 4][ii] =  b0 - b1;
  373.     tblock[pos_y + 5][ii] =  b6 - (b5 >> 2);
  374.     tblock[pos_y + 6][ii] = (b2 >> 1) - b3;
  375.     tblock[pos_y + 7][ii] = (b4 >> 2) - b7;
  376.   }
  377. }
  378. void inverse8x8(int (*tblock)[16], int (*block)[16], int pos_y, int pos_x)
  379. {
  380.   int i, ii;
  381.   int *pTmp = tmp, *pblock;
  382.   static int a0, a1, a2, a3;
  383.   static int p0, p1, p2, p3, p4, p5 ,p6, p7;  
  384.   static int b0, b1, b2, b3, b4, b5, b6, b7;
  385.   // Horizontal  
  386.   for (i=pos_y; i < pos_y + BLOCK_SIZE_8x8; i++)
  387.   {
  388.     pblock = &tblock[i][pos_x];
  389.     p0 = *(pblock++);
  390.     p1 = *(pblock++);
  391.     p2 = *(pblock++);
  392.     p3 = *(pblock++);
  393.     p4 = *(pblock++);
  394.     p5 = *(pblock++);
  395.     p6 = *(pblock++);
  396.     p7 = *(pblock  );
  397.     a0 = p0 + p4;
  398.     a1 = p0 - p4;
  399.     a2 = p6 - (p2 >> 1);
  400.     a3 = p2 + (p6 >> 1);
  401.     b0 =  a0 + a3;
  402.     b2 =  a1 - a2;
  403.     b4 =  a1 + a2;
  404.     b6 =  a0 - a3;
  405.     a0 = -p3 + p5 - p7 - (p7 >> 1);    
  406.     a1 =  p1 + p7 - p3 - (p3 >> 1);    
  407.     a2 = -p1 + p7 + p5 + (p5 >> 1);    
  408.     a3 =  p3 + p5 + p1 + (p1 >> 1);
  409.     
  410.     b1 =  a0 + (a3>>2);    
  411.     b3 =  a1 + (a2>>2);    
  412.     b5 =  a2 - (a1>>2);
  413.     b7 =  a3 - (a0>>2);                
  414.     *(pTmp++) = b0 + b7;
  415.     *(pTmp++) = b2 - b5;
  416.     *(pTmp++) = b4 + b3;
  417.     *(pTmp++) = b6 + b1;
  418.     *(pTmp++) = b6 - b1;
  419.     *(pTmp++) = b4 - b3;
  420.     *(pTmp++) = b2 + b5;
  421.     *(pTmp++) = b0 - b7;
  422.   }
  423.   //  Vertical 
  424.   for (i=0; i < BLOCK_SIZE_8x8; i++)
  425.   {
  426.     pTmp = tmp + i;
  427.     p0 = *pTmp;
  428.     p1 = *(pTmp += BLOCK_SIZE_8x8);
  429.     p2 = *(pTmp += BLOCK_SIZE_8x8);
  430.     p3 = *(pTmp += BLOCK_SIZE_8x8);
  431.     p4 = *(pTmp += BLOCK_SIZE_8x8);
  432.     p5 = *(pTmp += BLOCK_SIZE_8x8);
  433.     p6 = *(pTmp += BLOCK_SIZE_8x8);
  434.     p7 = *(pTmp += BLOCK_SIZE_8x8);
  435.     a0 =  p0 + p4;
  436.     a1 =  p0 - p4;
  437.     a2 =  p6 - (p2>>1);
  438.     a3 =  p2 + (p6>>1);
  439.     b0 = a0 + a3;
  440.     b2 = a1 - a2;
  441.     b4 = a1 + a2;
  442.     b6 = a0 - a3;
  443.     a0 = -p3 + p5 - p7 - (p7 >> 1);
  444.     a1 =  p1 + p7 - p3 - (p3 >> 1);
  445.     a2 = -p1 + p7 + p5 + (p5 >> 1);
  446.     a3 =  p3 + p5 + p1 + (p1 >> 1);
  447.     b1 =  a0 + (a3 >> 2);
  448.     b7 =  a3 - (a0 >> 2);
  449.     b3 =  a1 + (a2 >> 2);
  450.     b5 =  a2 - (a1 >> 2);
  451.     ii = i + pos_x;
  452.     block[pos_y    ][ii] = b0 + b7;
  453.     block[pos_y + 1][ii] = b2 - b5;
  454.     block[pos_y + 2][ii] = b4 + b3;
  455.     block[pos_y + 3][ii] = b6 + b1;
  456.     block[pos_y + 4][ii] = b6 - b1;
  457.     block[pos_y + 5][ii] = b4 - b3;
  458.     block[pos_y + 6][ii] = b2 + b5;
  459.     block[pos_y + 7][ii] = b0 - b7;
  460.   }
  461. }