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

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.  *      2005.1.13 CloudWu modify PIA_u_wxh_c() function
  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. #define Q_BITS          15
  24. #define DQ_BITS         6
  25. #define DQ_ROUND        (1<<(DQ_BITS-1))
  26. #include "stdio.h"
  27. #include "portab.h"
  28. #ifndef CHIP_DM642
  29. #include "malloc.h"
  30. #endif
  31. #include "utility.h"
  32. #ifndef CHIP_DM642
  33. #include "memory.h"
  34. #endif
  35. //
  36. // from xvid
  37. //
  38. void* 
  39. T264_malloc(int32_t size, int32_t alignment)
  40. {
  41.     uint8_t *mem_ptr;
  42.     if (!alignment) {
  43.         /* We have not to satisfy any alignment */
  44.         if ((mem_ptr = (uint8_t *) malloc(size + 1)) != NULL) {
  45.             /* Store (mem_ptr - "real allocated memory") in *(mem_ptr-1) */
  46.             *mem_ptr = (uint8_t)1;
  47.             /* Return the mem_ptr pointer */
  48.             return ((void *)(mem_ptr+1));
  49.         }
  50.     } else {
  51.         uint8_t *tmp;
  52.         /* Allocate the required size memory + alignment so we
  53.         * can realign the data if necessary */
  54.         if ((tmp = (uint8_t *) malloc(size + alignment)) != NULL) {
  55.             /* Align the tmp pointer */
  56.             mem_ptr =
  57.                 (uint8_t *) ((uint32_t) (tmp + alignment - 1) &
  58.                 (~(uint32_t) (alignment - 1)));
  59.             /* Special case where malloc have already satisfied the alignment
  60.             * We must add alignment to mem_ptr because we must store
  61.             * (mem_ptr - tmp) in *(mem_ptr-1)
  62.             * If we do not add alignment to mem_ptr then *(mem_ptr-1) points
  63.             * to a forbidden memory space */
  64.             if (mem_ptr == tmp)
  65.                 mem_ptr += alignment;
  66.             /* (mem_ptr - tmp) is stored in *(mem_ptr-1) so we are able to retrieve
  67.             * the real malloc block allocated and free it in xvid_free */
  68.             *(mem_ptr - 1) = (uint8_t) (mem_ptr - tmp);
  69.             /* Return the aligned pointer */
  70.             return ((void *)mem_ptr);
  71.         }
  72.     }
  73.     return(NULL);
  74. }
  75. void 
  76. T264_free(void* p)
  77. {
  78.     uint8_t *ptr;
  79.     if (p == NULL)
  80.         return;
  81.     /* Aligned pointer */
  82.     ptr = p;
  83.     /* *(ptr - 1) holds the offset to the real allocated block
  84.     * we sub that offset os we free the real pointer */
  85.     ptr -= *(ptr - 1);
  86.     /* Free the memory */
  87.     free(ptr);
  88. }
  89. void
  90. expand8to16_c(uint8_t* src, int32_t src_stride, int32_t quarter_width, int32_t quarter_height, int16_t* dst)
  91. {
  92.     int32_t i, j;
  93.     for(i = 0 ; i < quarter_height * 4 ; i ++)
  94.     {
  95.         for(j = 0 ; j < quarter_width ; j ++)
  96.         {
  97.             dst[i * quarter_width * 4 + j * 4 + 0] = src[0 + j * 4];
  98.             dst[i * quarter_width * 4 + j * 4 + 1] = src[1 + j * 4];
  99.             dst[i * quarter_width * 4 + j * 4 + 2] = src[2 + j * 4];
  100.             dst[i * quarter_width * 4 + j * 4 + 3] = src[3 + j * 4];
  101.         }
  102.         src += src_stride;
  103.     }
  104. }
  105. void
  106. expand8to16sub_c(uint8_t* pred, int32_t quarter_width, int32_t quarter_height, int16_t* dst, uint8_t* src, int32_t src_stride)
  107. {
  108.     int32_t i, j, k;
  109.     uint8_t* start_p;
  110.     uint8_t* start_s;
  111.     
  112.     for(i = 0 ; i < quarter_height ; i ++)
  113.     {
  114.         for(j = 0 ; j < quarter_width ; j ++)
  115.         {
  116.             start_p = pred + i * quarter_width * 4 * 4 + j * 4;
  117.             start_s = src + i * src_stride * 4 + j * 4;
  118.             for(k = 0 ; k < 4 ; k ++)
  119.             {
  120.                 dst[0] = start_s[0] - start_p[0];
  121.                 dst[1] = start_s[1] - start_p[1];
  122.                 dst[2] = start_s[2] - start_p[2];
  123.                 dst[3] = start_s[3] - start_p[3];
  124.                 dst     += 4;
  125.                 start_p += 4 * quarter_width;
  126.                 start_s += src_stride;
  127.             }
  128.         }
  129.     }
  130. }
  131. void
  132. contract16to8_c(int16_t* src, int32_t quarter_width, int32_t quarter_height, uint8_t* dst, int32_t dst_stride)
  133. {
  134.     int32_t i, j;
  135.     for(i = 0 ; i < quarter_height * 4 ; i ++)
  136.     {
  137.         for(j = 0 ; j < quarter_width ; j ++)
  138.         {
  139.             int16_t tmp;
  140.             tmp = src[i * quarter_width * 4 + j * 4 + 0];
  141.             dst[0 + j * 4] = CLIP1(tmp);
  142.             tmp = src[i * quarter_width * 4 + j * 4 + 1];
  143.             dst[1 + j * 4] = CLIP1(tmp);
  144.             tmp = src[i * quarter_width * 4 + j * 4 + 2];
  145.             dst[2 + j * 4] = CLIP1(tmp);
  146.             tmp = src[i * quarter_width * 4 + j * 4 + 3];
  147.             dst[3 + j * 4] = CLIP1(tmp);
  148.         }
  149.         dst += dst_stride;
  150.     }
  151. }
  152. void //assigned
  153. contract16to8add_c(int16_t* src, int32_t quarter_width, int32_t quarter_height, uint8_t* pred, uint8_t* dst, int32_t dst_stride)
  154. {
  155.     int32_t i, j, k;
  156.     uint8_t* start_p;
  157.     uint8_t* start_d;
  158.     for(i = 0 ; i < quarter_height ; i ++)
  159.     {
  160.         for(j = 0 ; j < quarter_width ; j ++)
  161.         {
  162.             start_p = pred + i * quarter_width * 4 * 4 + j * 4;
  163.             start_d = dst + i * dst_stride * 4 + j * 4;
  164.             for(k = 0 ; k < 4 ; k ++)
  165.             {
  166.                 int16_t tmp;
  167.                 tmp = src[0] + start_p[0];
  168.                 start_d[0] = CLIP1(tmp);
  169.                 tmp = src[1] + start_p[1];
  170.                 start_d[1] = CLIP1(tmp);
  171.                 tmp = src[2] + start_p[2];
  172.                 start_d[2] = CLIP1(tmp);
  173.                 tmp = src[3] + start_p[3];
  174.                 start_d[3] = CLIP1(tmp);
  175.                 //tmp = (src[0] + (start_p[0] << DQ_BITS) + DQ_ROUND) >> DQ_BITS;
  176.                 //start_d[0] = CLIP1(tmp);
  177.                 //tmp = (src[1] + (start_p[1] << DQ_BITS) + DQ_ROUND) >> DQ_BITS;
  178.                 //start_d[1] = CLIP1(tmp);
  179.                 //tmp = (src[2] + (start_p[2] << DQ_BITS) + DQ_ROUND) >> DQ_BITS;
  180.                 //start_d[2] = CLIP1(tmp);
  181.                 //tmp = (src[3] + (start_p[3] << DQ_BITS) + DQ_ROUND) >> DQ_BITS;
  182.                 //start_d[3] = CLIP1(tmp);
  183.                 src     += 4;
  184.                 start_p += 4 * quarter_width;
  185.                 start_d += dst_stride;
  186.             }
  187.         }
  188.     }
  189. }
  190. void
  191. memcpy_stride_u_c(void* src, int32_t width, int32_t height, int32_t src_stride, void* dst, int32_t dst_stride)
  192. {
  193.     int32_t i;
  194.     uint8_t* s = src;
  195.     uint8_t* d = dst;
  196.     for(i = 0 ; i < height ; i ++)
  197.     {
  198.         memcpy(d, s, width);
  199.         s += src_stride;
  200.         d += dst_stride;
  201.     }
  202. }
  203. static __inline uint32_t
  204. T264_sad_u_c(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t width, int32_t height, int32_t dst_stride)
  205. {
  206.     int32_t i, j;
  207.     uint32_t sad;
  208.     sad = 0;
  209.     for(i = 0 ; i < height ; i ++)
  210.     {
  211.         for(j = 0 ; j < width ; j ++)
  212.         {
  213.             int32_t tmp = data[j] - src[j];
  214.             sad += ABS(tmp);
  215.         }
  216.         src  += src_stride;
  217.         data += dst_stride;
  218.     }
  219.     return sad;
  220. }
  221. //copied from JM,by cloud wu
  222. static __inline 
  223. uint32_t _satd_4x4_dif_c(int16_t* diff)
  224. {
  225.   int32_t k, satd = 0, m[16], dd, d[16];
  226.     
  227.     /*===== hadamard transform =====*/
  228.     m[ 0] = diff[ 0] + diff[12];
  229.     m[ 4] = diff[ 4] + diff[ 8];
  230.     m[ 8] = diff[ 4] - diff[ 8];
  231.     m[12] = diff[ 0] - diff[12];
  232.     m[ 1] = diff[ 1] + diff[13];
  233.     m[ 5] = diff[ 5] + diff[ 9];
  234.     m[ 9] = diff[ 5] - diff[ 9];
  235.     m[13] = diff[ 1] - diff[13];
  236.     m[ 2] = diff[ 2] + diff[14];
  237.     m[ 6] = diff[ 6] + diff[10];
  238.     m[10] = diff[ 6] - diff[10];
  239.     m[14] = diff[ 2] - diff[14];
  240.     m[ 3] = diff[ 3] + diff[15];
  241.     m[ 7] = diff[ 7] + diff[11];
  242.     m[11] = diff[ 7] - diff[11];
  243.     m[15] = diff[ 3] - diff[15];
  244.     
  245.     d[ 0] = m[ 0] + m[ 4];
  246.     d[ 8] = m[ 0] - m[ 4];
  247.     d[ 4] = m[ 8] + m[12];
  248.     d[12] = m[12] - m[ 8];
  249.     d[ 1] = m[ 1] + m[ 5];
  250.     d[ 9] = m[ 1] - m[ 5];
  251.     d[ 5] = m[ 9] + m[13];
  252.     d[13] = m[13] - m[ 9];
  253.     d[ 2] = m[ 2] + m[ 6];
  254.     d[10] = m[ 2] - m[ 6];
  255.     d[ 6] = m[10] + m[14];
  256.     d[14] = m[14] - m[10];
  257.     d[ 3] = m[ 3] + m[ 7];
  258.     d[11] = m[ 3] - m[ 7];
  259.     d[ 7] = m[11] + m[15];
  260.     d[15] = m[15] - m[11];
  261.     
  262.     m[ 0] = d[ 0] + d[ 3];
  263.     m[ 1] = d[ 1] + d[ 2];
  264.     m[ 2] = d[ 1] - d[ 2];
  265.     m[ 3] = d[ 0] - d[ 3];
  266.     m[ 4] = d[ 4] + d[ 7];
  267.     m[ 5] = d[ 5] + d[ 6];
  268.     m[ 6] = d[ 5] - d[ 6];
  269.     m[ 7] = d[ 4] - d[ 7];
  270.     m[ 8] = d[ 8] + d[11];
  271.     m[ 9] = d[ 9] + d[10];
  272.     m[10] = d[ 9] - d[10];
  273.     m[11] = d[ 8] - d[11];
  274.     m[12] = d[12] + d[15];
  275.     m[13] = d[13] + d[14];
  276.     m[14] = d[13] - d[14];
  277.     m[15] = d[12] - d[15];
  278.     
  279.     d[ 0] = m[ 0] + m[ 1];
  280.     d[ 1] = m[ 0] - m[ 1];
  281.     d[ 2] = m[ 2] + m[ 3];
  282.     d[ 3] = m[ 3] - m[ 2];
  283.     d[ 4] = m[ 4] + m[ 5];
  284.     d[ 5] = m[ 4] - m[ 5];
  285.     d[ 6] = m[ 6] + m[ 7];
  286.     d[ 7] = m[ 7] - m[ 6];
  287.     d[ 8] = m[ 8] + m[ 9];
  288.     d[ 9] = m[ 8] - m[ 9];
  289.     d[10] = m[10] + m[11];
  290.     d[11] = m[11] - m[10];
  291.     d[12] = m[12] + m[13];
  292.     d[13] = m[12] - m[13];
  293.     d[14] = m[14] + m[15];
  294.     d[15] = m[15] - m[14];
  295.     
  296.     /*===== sum up =====*/
  297.     for (dd=d[k=0]; k<16; dd=d[++k])
  298.     {
  299.       satd += (dd < 0 ? -dd : dd);
  300.     }
  301.     satd = ((satd+1)>>1);
  302.     return satd;
  303. }
  304. static __inline uint32_t
  305. T264_satd_u_c(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t width, int32_t height, int32_t dst_stride)
  306. {
  307.     int32_t i, j, n, m;
  308.     uint32_t sad;
  309.     int16_t tmp[16];
  310.     sad = 0;
  311.     for(i = 0 ; i < height ; i += 4)
  312.     {
  313.         for(j = 0 ; j < width ; j += 4)
  314.         {
  315.             uint8_t* tmp_s = src + i * src_stride + j;
  316.             uint8_t* tmp_d = data+ i * dst_stride + j;
  317.             for(n = 0 ; n < 4 ; n ++)
  318.             {
  319.                 for(m = 0 ; m < 4 ; m ++)
  320.                     tmp[n * 4 + m] = tmp_d[m] - tmp_s[m];
  321.                 tmp_d += dst_stride;
  322.                 tmp_s += src_stride;
  323.             }
  324.             sad += _satd_4x4_dif_c(tmp);
  325.         }
  326.     }
  327.     return sad;
  328. }
  329. #define SADFUNC(w, h, base)    
  330. uint32_t                    
  331. T264_##base##_u_##w##x##h##_c(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride)  
  332. {   
  333.     return T264_##base##_u_c(src, src_stride, data, w, h, dst_stride); 
  334. }
  335. SADFUNC(16, 16, sad)
  336. SADFUNC(16, 8,  sad)
  337. SADFUNC(8,  16, sad)
  338. SADFUNC(8,  8,  sad)
  339. SADFUNC(8,  4,  sad)
  340. SADFUNC(4,  8,  sad)
  341. SADFUNC(4,  4,  sad)
  342. SADFUNC(16, 16, satd)
  343. SADFUNC(16, 8,  satd)
  344. SADFUNC(8,  16, satd)
  345. SADFUNC(8,  8,  satd)
  346. SADFUNC(8,  4,  satd)
  347. SADFUNC(4,  8,  satd)
  348. SADFUNC(4,  4,  satd)
  349. /**********************************************************************************
  350.  *
  351.  *  Based on the FUNCTION T264_satd_u_c()
  352.  *  use SATD for 16x16 Intra
  353.  *  Thomascatlee@163.com
  354.  *
  355.  *********************************************************************************/
  356. uint32_t
  357. T264_satd_i16x16_u_c(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride)
  358. {
  359.     return T264_satd_u_c(src,src_stride,  data, 16,16,dst_stride);    
  360. /*    int32_t i, j, n, m, k;
  361.     uint32_t sad;
  362.     int16_t tmp[16];
  363.     int16_t s_dc[16];
  364.     int16_t s[4];
  365.     sad = 0;
  366.     k = 0;
  367.     for(i = 0 ; i < 16 ; i += 4)
  368.     {
  369.         for(j = 0 ; j < 16 ; j += 4)
  370.         {
  371.             uint8_t* tmp_s = src + i * src_stride + j;
  372.             uint8_t* tmp_d = data+ i * dst_stride + j;
  373.             for(n = 0 ; n < 4 ; n ++)
  374.             {
  375.                 for(m = 0 ; m < 4 ; m ++)
  376.                     tmp[n * 4 + m] = tmp_d[m] - tmp_s[m];
  377.                 tmp_d += dst_stride;
  378.                 tmp_s += src_stride;
  379.             }
  380.             for(n = 0 ; n < 4 ; n ++)
  381.             {
  382.                 s[0] = tmp[0 * 4 + n] + tmp[3 * 4 + n];
  383.                 s[3] = tmp[0 * 4 + n] - tmp[3 * 4 + n];
  384.                 s[1] = tmp[1 * 4 + n] + tmp[2 * 4 + n];
  385.                 s[2] = tmp[1 * 4 + n] - tmp[2 * 4 + n];
  386.                 tmp[0 * 4 + n] = s[0] + s[1];
  387.                 tmp[2 * 4 + n] = s[0] - s[1];
  388.                 tmp[1 * 4 + n] = s[3] + s[2];
  389.                 tmp[3 * 4 + n] = s[3] - s[2];
  390.             }
  391.             
  392.             //  Add for get DC coeff
  393.             n = 0;
  394.             s[0] = tmp[n * 4 + 0] + tmp[n * 4 + 3];
  395.             s[3] = tmp[n * 4 + 0] - tmp[n * 4 + 3];
  396.             s[1] = tmp[n * 4 + 1] + tmp[n * 4 + 2];
  397.             s[2] = tmp[n * 4 + 1] - tmp[n * 4 + 2];
  398.             s_dc[k] = ((s[0] + s[1]) >> 2);
  399.             sad += ABS(s[0] - s[1]);
  400.             sad += ABS(s[3] + s[2]);
  401.             sad += ABS(s[3] - s[2]);
  402.             k++;
  403.             
  404.             for(n = 1 ; n < 4 ; n ++)
  405.             {
  406.                 s[0] = tmp[n * 4 + 0] + tmp[n * 4 + 3];
  407.                 s[3] = tmp[n * 4 + 0] - tmp[n * 4 + 3];
  408.                 s[1] = tmp[n * 4 + 1] + tmp[n * 4 + 2];
  409.                 s[2] = tmp[n * 4 + 1] - tmp[n * 4 + 2];
  410.                 sad += ABS(s[0] + s[1]);
  411.                 sad += ABS(s[0] - s[1]);
  412.                 sad += ABS(s[3] + s[2]);
  413.                 sad += ABS(s[3] - s[2]);
  414.              }
  415.            
  416.         }
  417.     }
  418.     //  Hadamard of DC coeff 
  419.     for(n = 0 ; n < 4 ; n ++)
  420.     {
  421.       s[0] = s_dc[0 * 4 + n] + s_dc[3 * 4 + n];
  422.       s[3] = s_dc[0 * 4 + n] - s_dc[3 * 4 + n];
  423.       s[1] = s_dc[1 * 4 + n] + s_dc[2 * 4 + n];
  424.       s[2] = s_dc[1 * 4 + n] - s_dc[2 * 4 + n];
  425.       
  426.       tmp[0 * 4 + n] = s[0] + s[1];
  427.       tmp[2 * 4 + n] = s[0] - s[1];
  428.       tmp[1 * 4 + n] = s[3] + s[2];
  429.       tmp[3 * 4 + n] = s[3] - s[2];
  430.     }
  431.     for(n = 0 ; n < 4 ; n ++)
  432.     {
  433.       s[0] = tmp[n * 4 + 0] + tmp[n * 4 + 3];
  434.       s[3] = tmp[n * 4 + 0] - tmp[n * 4 + 3];
  435.       s[1] = tmp[n * 4 + 1] + tmp[n * 4 + 2];
  436.       s[2] = tmp[n * 4 + 1] - tmp[n * 4 + 2];
  437.       sad += ABS(s[0] + s[1]);
  438.       sad += ABS(s[0] - s[1]);
  439.       sad += ABS(s[3] + s[2]);
  440.       sad += ABS(s[3] - s[2]);
  441.     }
  442.     return sad >> 1;
  443. */
  444. }
  445. //calculate non-zero counts for an array v[i_count]
  446. int32_t 
  447. array_non_zero_count(int16_t *v, int32_t i_count)
  448. {
  449.     int32_t i;
  450.     int32_t i_nz;
  451.     for( i = 0, i_nz = 0; i < i_count; i++ )
  452.     {
  453.         if( v[i] )
  454.         {
  455.             i_nz++;
  456.         }
  457.     }
  458.     return i_nz;
  459. }