dct.c
上传用户:sunbaby
上传日期:2013-05-31
资源大小:242k
文件大小:10k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  *
  3.  *  T264 AVC CODEC
  4.  *
  5.  *  Copyright(C) 2004-2005 llcc <lcgate1@yahoo.com.cn>
  6.  *               2004-2005 visionany <visionany@yahoo.com.cn>
  7.  *
  8.  *  This program is free software ; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation ; either version 2 of the License, or
  11.  *  (at your option) any later version.
  12.  *
  13.  *  This program is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with this program ; if not, write to the Free Software
  20.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  21.  *
  22.  ****************************************************************************/
  23. #include "stdio.h"
  24. #include "T264.h"
  25. #define Q_BITS          15
  26. #define DQ_BITS         6
  27. #define DQ_ROUND        (1<<(DQ_BITS-1))
  28. //////////////////////////////////////////////////////
  29. // static var
  30. DECLARE_ALIGNED2_MATRIX_H(quant, 6, 4 * 4, int16_t, CACHE_SIZE) = 
  31. {
  32.     13107, 8066, 13107, 8066, 8066, 5243, 8066, 5243,     13107, 8066, 13107, 8066, 8066, 5243, 8066, 5243,     11916, 7490, 11916, 7490, 7490, 4660, 7490, 4660,     11916, 7490, 11916, 7490, 7490, 4660, 7490, 4660,     10082, 6554, 10082, 6554, 6554, 4194, 6554, 4194,     10082, 6554, 10082, 6554, 6554, 4194, 6554, 4194,      9362, 5825,  9362, 5825, 5825, 3647, 5825, 3647,      9362, 5825,  9362, 5825, 5825, 3647, 5825, 3647,      8192, 5243,  8192, 5243, 5243, 3355, 5243, 3355,      8192, 5243,  8192, 5243, 5243, 3355, 5243, 3355,      7282, 4559,  7282, 4559, 4559, 2893, 4559, 2893,      7282, 4559,  7282, 4559, 4559, 2893, 4559, 2893 };
  33. DECLARE_ALIGNED2_MATRIX_H(dequant, 6, 4 * 4, int16_t, CACHE_SIZE) = 
  34. {
  35.     10, 13, 10, 13, 13, 16, 13, 16, 10, 13, 10, 13, 13, 16, 13, 16,     11, 14, 11, 14, 14, 18, 14, 18, 11, 14, 11, 14, 14, 18, 14, 18,     13, 16, 13, 16, 16, 20, 16, 20, 13, 16, 13, 16, 16, 20, 16, 20,     14, 18, 14, 18, 18, 23, 18, 23, 14, 18, 14, 18, 18, 23, 18, 23,     16, 20, 16, 20, 20, 25, 20, 25, 16, 20, 16, 20, 20, 25, 20, 25,     18, 23, 18, 23, 23, 29, 23, 29, 18, 23, 18, 23, 23, 29, 23, 29 };
  36. //////////////////////////////////////////////////////
  37. // DCT & IDCT
  38. void 
  39. dct4x4_c(int16_t* data)
  40. {
  41.     int32_t i;
  42.     int16_t s[4];
  43.     //
  44.     // horizontal
  45.     //
  46.     for(i = 0 ; i < 4 ; i ++)
  47.     {
  48.         s[0] = data[i * 4 + 0] + data[i * 4 + 3];
  49.         s[3] = data[i * 4 + 0] - data[i * 4 + 3];
  50.         s[1] = data[i * 4 + 1] + data[i * 4 + 2];
  51.         s[2] = data[i * 4 + 1] - data[i * 4 + 2];
  52.         data[i * 4 + 0] = s[0] + s[1];
  53.         data[i * 4 + 2] = s[0] - s[1];
  54.         data[i * 4 + 1] = (s[3] << 1) + s[2];
  55.         data[i * 4 + 3] = s[3] - (s[2] << 1);
  56.     }
  57.     //
  58.     // vertical
  59.     //
  60.     for(i = 0 ; i < 4 ; i ++)
  61.     {
  62.         s[0] = data[0 * 4 + i] + data[3 * 4 + i];
  63.         s[3] = data[0 * 4 + i] - data[3 * 4 + i];
  64.         s[1] = data[1 * 4 + i] + data[2 * 4 + i];
  65.         s[2] = data[1 * 4 + i] - data[2 * 4 + i];
  66.         data[0 * 4 + i] = s[0] + s[1];
  67.         data[2 * 4 + i] = s[0] - s[1];
  68.         data[1 * 4 + i] = (s[3] << 1) + s[2];
  69.         data[3 * 4 + i] = s[3] - (s[2] << 1);
  70.     }
  71. }
  72. void 
  73. dct4x4dc_c(int16_t* data)
  74. {
  75.     int32_t i;
  76.     int16_t s[4];
  77.     for(i = 0 ; i < 4 ; i ++)
  78.     {
  79.         s[0] = data[i * 4 + 0] + data[i * 4 + 3];
  80.         s[3] = data[i * 4 + 0] - data[i * 4 + 3];
  81.         s[1] = data[i * 4 + 1] + data[i * 4 + 2];
  82.         s[2] = data[i * 4 + 1] - data[i * 4 + 2];
  83.         data[i * 4 + 0] = s[0] + s[1];
  84.         data[i * 4 + 2] = s[0] - s[1];
  85.         data[i * 4 + 1] = s[3] + s[2];
  86.         data[i * 4 + 3] = s[3] - s[2];
  87.     }
  88.     for(i = 0 ; i < 4 ; i ++)
  89.     {
  90.         s[0] = data[0 * 4 + i] + data[3 * 4 + i];
  91.         s[3] = data[0 * 4 + i] - data[3 * 4 + i];
  92.         s[1] = data[1 * 4 + i] + data[2 * 4 + i];
  93.         s[2] = data[1 * 4 + i] - data[2 * 4 + i];
  94.         data[0 * 4 + i] = (s[0] + s[1] + 1) >> 1;
  95.         data[2 * 4 + i] = (s[0] - s[1] + 1) >> 1;
  96.         data[1 * 4 + i] = (s[3] + s[2] + 1) >> 1;
  97.         data[3 * 4 + i] = (s[3] - s[2] + 1) >> 1;
  98.     }
  99. }
  100. void 
  101. dct2x2dc_c(int16_t* data)
  102. {   
  103.     int16_t s[4];
  104.     s[0] = data[0];
  105.     s[1] = data[1];
  106.     s[2] = data[2];
  107.     s[3] = data[3];
  108.     data[0] = s[0] + s[2] + s[1] + s[3];
  109.     data[1] = s[0] + s[2] - s[1] - s[3];
  110.     data[2] = s[0] - s[2] + s[1] - s[3];
  111.     data[3] = s[0] - s[2] - s[1] + s[3];
  112. }
  113. void
  114. idct4x4_c(int16_t* data)
  115. {
  116.     int32_t i;
  117.     int16_t s[4];
  118.     for (i = 0; i < 4; i ++)
  119.     {
  120.         s[0] = data[i * 4 + 0] + data[i * 4 + 2];
  121.         s[1] = data[i * 4 + 0] - data[i * 4 + 2];
  122.         s[2] = (data[i * 4 + 1] >> 1) - data[i * 4 + 3];
  123.         s[3] = data[i * 4 + 1] + (data[i * 4 + 3] >> 1);
  124.         data[i * 4 + 0] = s[0] + s[3];
  125.         data[i * 4 + 3] = s[0] - s[3];
  126.         data[i * 4 + 1] = s[1] + s[2];
  127.         data[i * 4 + 2] = s[1] - s[2];
  128.     }
  129.     for (i = 0; i < 4; i ++)
  130.     {
  131.         s[0] = data[0 * 4 + i] + data[2 * 4 + i];
  132.         s[1] = data[0 * 4 + i] - data[2 * 4 + i];
  133.         s[2] = (data[1 * 4 + i] >> 1) - data[3 * 4 + i];
  134.         s[3] = data[1 * 4 + i] + (data[3 * 4 + i] >> 1);
  135.         data[0 * 4 + i] = (s[0] + s[3] + 32) >> 6;
  136.         data[3 * 4 + i] = (s[0] - s[3] + 32) >> 6;
  137.         data[1 * 4 + i] = (s[1] + s[2] + 32) >> 6;
  138.         data[2 * 4 + i] = (s[1] - s[2] + 32) >> 6;
  139.     }
  140. }
  141. void 
  142. idct4x4dc_c(int16_t* data)
  143. {
  144.     int32_t i;
  145.     int16_t s[4];
  146.     for (i = 0; i < 4; i ++)
  147.     {
  148.         s[0] = data[i * 4 + 0] + data[i * 4 + 2];
  149.         s[1] = data[i * 4 + 0] - data[i * 4 + 2];
  150.         s[2] = data[i * 4 + 1] - data[i * 4 + 3];
  151.         s[3] = data[i * 4 + 1] + data[i * 4 + 3];
  152.         data[i * 4 + 0] = s[0] + s[3];
  153.         data[i * 4 + 3] = s[0] - s[3];
  154.         data[i * 4 + 1] = s[1] + s[2];
  155.         data[i * 4 + 2] = s[1] - s[2];
  156.     }
  157.     for (i = 0; i < 4; i ++)
  158.     {
  159.         s[0] = data[0 * 4 + i] + data[2 * 4 + i];
  160.         s[1] = data[0 * 4 + i] - data[2 * 4 + i];
  161.         s[2] = data[1 * 4 + i] - data[3 * 4 + i];
  162.         s[3] = data[1 * 4 + i] + data[3 * 4 + i];
  163.         data[0 * 4 + i] = s[0] + s[3];
  164.         data[3 * 4 + i] = s[0] - s[3];
  165.         data[1 * 4 + i] = s[1] + s[2];
  166.         data[2 * 4 + i] = s[1] - s[2];
  167.     }
  168. }
  169. void 
  170. idct2x2dc_c(int16_t* data)
  171. {
  172.     int16_t s[4];
  173.     s[0] = data[0];
  174.     s[1] = data[1];
  175.     s[2] = data[2];
  176.     s[3] = data[3];
  177.     data[0] = s[0] + s[2] + s[1] + s[3];
  178.     data[1] = s[0] + s[2] - s[1] - s[3];
  179.     data[2] = s[0] - s[2] + s[1] - s[3];
  180.     data[3] = s[0] - s[2] - s[1] + s[3];
  181. }
  182. ///////////////////////////////////////////////////////////
  183. // Quant & IQuant
  184. void
  185. quant4x4_c(int16_t* data, const int32_t Qp, int32_t is_intra)
  186. {
  187.     const int32_t qbits    = 15 + Qp / 6;
  188.     const int32_t mf_index = Qp % 6;
  189.     int32_t i;
  190.     const int32_t f = (1 << qbits) / (is_intra ? 3 : 6);
  191.     for(i = 0 ; i < 16 ; i ++)
  192.     {
  193.         if (data[i] > 0)
  194.             data[i] = (data[i] * quant[mf_index][i] + f) >> qbits;
  195.         else
  196.             data[i] = -((-(data[i] * quant[mf_index][i]) + f) >> qbits);
  197.     }
  198. }
  199. void
  200. quant4x4dc_c(int16_t* data, const int32_t Qp)
  201. {
  202.     const int32_t qbits    = 15 + Qp / 6;
  203.     const int32_t mf_index = Qp % 6;
  204.     const int32_t mf00 = quant[mf_index][0];
  205.     const int32_t f2 = (2 << qbits) / 3; // Only 16x16 intra mode
  206.     int32_t i;
  207.     for(i = 0 ; i < 16 ; i ++)
  208.     {
  209.         if (data[i] > 0)
  210.             data[i] = (data[i] * mf00 + f2) >> (qbits + 1);
  211.         else
  212.             data[i] = -((-(data[i] * mf00) + f2) >> (qbits + 1));
  213.     }
  214. }
  215. void
  216. quant2x2dc_c(int16_t* data, const int32_t Qp, int32_t is_intra)
  217. {
  218.     const int32_t qbits    = 15 + Qp / 6;
  219.     const int32_t mf_index = Qp % 6;
  220.     const int32_t mf00 = quant[mf_index][0];
  221.     const int32_t f2 = (2 << qbits) / (is_intra ? 3 : 6);
  222.     int32_t i;
  223.     for(i = 0 ; i < 4 ; i ++)
  224.     {
  225.         if (data[i] > 0)
  226.             data[i] = (data[i] * mf00 + f2) >> (qbits + 1);
  227.         else
  228.             data[i] = -((-(data[i] * mf00) + f2) >> (qbits + 1));
  229.     }
  230. }
  231. void
  232. iquant4x4_c(int16_t* data, const int32_t Qp)
  233. {
  234.     const int32_t qbits = Qp / 6;
  235.     const int32_t index_mf = Qp % 6;
  236.     int32_t i;
  237.     for(i = 0 ; i < 16 ; i ++)
  238.     {
  239.         data[i] = (data[i] * dequant[index_mf][i]) << qbits;
  240.     }    
  241. }
  242. void
  243. iquant4x4dc_c(int16_t* data, const int32_t Qp)
  244. {
  245.     const int32_t qbits = Qp / 6 - 2;
  246.     int32_t i;
  247.     if (qbits >= 0)
  248.     {
  249.         const int32_t mf_index = Qp % 6;
  250.         const int32_t dmf = dequant[mf_index][0] << qbits;
  251.         for(i = 0 ; i < 16 ; i ++)
  252.         {
  253.             data[i] = data[i] * dmf;
  254.         }
  255.     }
  256.     else
  257.     {
  258.         const int32_t dmf = dequant[Qp % 6][0];
  259.         const int32_t t2  = 1 << (1 + qbits);
  260.         for(i = 0 ; i < 16 ; i ++)
  261.         {
  262.             data[i] = (data[i] * dmf + t2) >> (-qbits);
  263.         }
  264.     }
  265. }
  266. void
  267. iquant2x2dc_c(int16_t* data, const int32_t Qp)
  268. {
  269.     const int32_t qbits = Qp / 6 - 1;
  270.     if (qbits >= 0 )
  271.     {
  272.         const int32_t dmf = dequant[Qp % 6][0] << qbits;
  273.         data[0] = data[0] * dmf;
  274.         data[1] = data[1] * dmf;
  275.         data[2] = data[2] * dmf;
  276.         data[3] = data[3] * dmf;
  277.     }
  278.     else
  279.     {
  280.         const int32_t dmf = dequant[Qp % 6][0];
  281.         data[0] = (data[0] * dmf) >> 1;
  282.         data[1] = (data[1] * dmf) >> 1;
  283.         data[2] = (data[2] * dmf) >> 1;
  284.         data[3] = (data[3] * dmf) >> 1;
  285.     }
  286. }