predict.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.  *
  8.  *
  9.  *  Cloud Wu 2004-9-30 add intra prediction mode 3-8
  10.  *
  11.  *  This program is free software ; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation ; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program ; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  24.  *
  25.  ****************************************************************************/
  26. #include "portab.h"
  27. #include "predict.h"
  28. #ifndef CHIP_DM642
  29. #include <memory.h>
  30. #endif
  31. //
  32. // Vertical
  33. //
  34. void
  35. T264_predict_16x16_mode_0_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  36. {
  37.     int32_t i, j;
  38.     for(i = 0 ; i < 16 ; i ++)
  39.     {
  40.         for(j = 0 ; j < 16 ; j ++)
  41.         {
  42.             dst[j] = top[j];
  43.         }
  44.         dst += dst_stride;
  45.     }
  46. }
  47. //
  48. // Horizontal
  49. //
  50. void
  51. T264_predict_16x16_mode_1_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  52. {
  53.     int32_t i, j;
  54.     for(i = 0 ; i < 16 ; i ++)
  55.     {
  56.         for(j = 0 ; j < 16 ; j ++)
  57.         {
  58.             dst[j] = left[i];
  59.         }
  60.         dst += dst_stride;
  61.     }
  62. }
  63. //
  64. // top & left all available
  65. //
  66. void
  67. T264_predict_16x16_mode_2_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  68. {
  69.     int32_t H, V, m;
  70.     int32_t i, j;
  71.     H = V = 0;
  72.     for(i = 0 ; i < 16 ; i ++)
  73.     {
  74.         H += top[i];
  75.         V += left[i];
  76.     }
  77.     m = (H + V + 16) >> 5;
  78.     for(i = 0 ; i < 16 ; i ++)
  79.     {
  80.         for(j = 0 ; j < 16 ; j ++)
  81.         {
  82.             dst[j] = m;
  83.         }
  84.         dst += dst_stride;
  85.     }
  86. }
  87. //
  88. // top available
  89. //
  90. void
  91. T264_predict_16x16_mode_20_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  92. {
  93.     int32_t H, m;
  94.     int32_t i, j;
  95.     H = 0;
  96.     for(i = 0 ; i < 16 ; i ++)
  97.     {
  98.         H += top[i];
  99.     }
  100.     m = (H + 8) >> 4;
  101.     for(i = 0 ; i < 16 ; i ++)
  102.     {
  103.         for(j = 0 ; j < 16 ; j ++)
  104.         {
  105.             dst[j] = m;
  106.         }
  107.         dst += dst_stride;
  108.     }
  109. }
  110. //
  111. // left available
  112. //
  113. void
  114. T264_predict_16x16_mode_21_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  115. {
  116.     int32_t V, m;
  117.     int32_t i, j;
  118.     V = 0;
  119.     for(i = 0 ; i < 16 ; i ++)
  120.     {
  121.         V += left[i];
  122.     }
  123.     m = (V + 8) >> 4;
  124.     for(i = 0 ; i < 16 ; i ++)
  125.     {
  126.         for(j = 0 ; j < 16 ; j ++)
  127.         {
  128.             dst[j] = m;
  129.         }
  130.         dst += dst_stride;
  131.     }
  132. }
  133. //
  134. // none available
  135. //
  136. void
  137. T264_predict_16x16_mode_22_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  138. {
  139.     int32_t i, j;
  140.     for(i = 0 ; i < 16 ; i ++)
  141.     {
  142.         for(j = 0 ; j < 16 ; j ++)
  143.         {
  144.             dst[j] = 128;
  145.         }
  146.         dst += dst_stride;
  147.     }
  148. }
  149. //
  150. // Plane
  151. //
  152. void
  153. T264_predict_16x16_mode_3_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  154. {
  155.     int32_t a, b, c, H, V;
  156.     int32_t i, j;
  157.     H = V = 0;
  158.     for(i = 0 ; i < 8 ; i ++)
  159.     {
  160.         H += (i + 1) * (top[8 + i] - top[6 - i]);
  161.         V += (i + 1) * (left[8 + i] - left[6 - i]);
  162.     }
  163.     a = (left[15] + top[15]) << 4;
  164.     b = (5 * H + 32) >> 6;
  165.     c = (5 * V + 32) >> 6;
  166.     for(i = 0 ; i < 16 ; i ++)
  167.     {
  168.         for(j = 0 ; j < 16 ; j ++)
  169.         {
  170.             int32_t tmp = (a + b * (j - 7) + c * (i - 7) + 16) >> 5;
  171.             tmp = CLIP1(tmp);
  172.             dst[j] = tmp;
  173.         }
  174.         dst += dst_stride;
  175.     }
  176. }
  177. //Mode 0: Vertical
  178. void T264_predict_4x4_mode_0_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  179. {
  180.     int32_t i, j;
  181.     
  182.     for(i = 0; i < 4; i++)
  183.     {
  184.         for(j = 0; j < 4; j++)
  185.         {
  186.             dst[j] = top[j];
  187.         }
  188.         dst += dst_stride;
  189.     }
  190. }
  191. //Mode 1: Horizontal
  192. void T264_predict_4x4_mode_1_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  193. {
  194.     int32_t i, j;
  195.     for(i = 0; i < 4; i++)
  196.     {
  197.         for(j = 0; j < 4; j++)
  198.         {
  199.             dst[j] = left[i];
  200.         }
  201.         dst += dst_stride;
  202.     }
  203. }
  204. //Mode 2: DC
  205. void T264_predict_4x4_mode_2_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  206. {
  207.     int32_t i, j;
  208.     int32_t H, V, m;
  209.     H = V = 0;
  210.     for(i = 0; i < 4; i++)
  211.     {
  212.         H += top[i];
  213.         V += left[i];
  214.     }
  215.     m = (H + V + 4) >> 3;
  216.     for(i = 0; i < 4; i++)
  217.     {
  218.         for(j = 0; j < 4; j++)
  219.         {
  220.             dst[j] = m;
  221.         }
  222.         dst += dst_stride;
  223.     }
  224. }
  225. //Mode 20 DC top
  226. void T264_predict_4x4_mode_20_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  227. {
  228.     int32_t i, j;
  229.     int32_t V, m;
  230.     V = 0;
  231.     for(i = 0; i < 4; i++)
  232.     {
  233.         V += top[i];
  234.     }
  235.     m = (V + 2) >> 2;
  236.     for(i = 0; i < 4; i++)
  237.     {
  238.         for(j = 0; j < 4; j++)
  239.         {
  240.             dst[j] =  m;
  241.         }
  242.         dst += dst_stride;
  243.     }
  244. }
  245. //Mode 21 DC left
  246. void T264_predict_4x4_mode_21_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  247. {
  248.     int32_t i, j;
  249.     int32_t H, m;
  250.     H = 0;
  251.     for(i = 0; i < 4; i++)
  252.     {
  253.         H += left[i];
  254.     }
  255.     m = (H + 2) >> 2;
  256.     for(i = 0; i < 4; i++)
  257.     {
  258.         for(j = 0; j < 4; j++)
  259.         {
  260.             dst[j] = m;
  261.         }
  262.         dst += dst_stride;
  263.     }
  264. }
  265. //Mode 22 DC 128
  266. void T264_predict_4x4_mode_22_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  267. {
  268.     memset(dst,128,16);
  269. }
  270. //Mode 3 Intra_4x4_DIAGONAL_DOWNLEFT when Top are available
  271. void T264_predict_4x4_mode_3_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  272. {
  273. uint8_t *cur_dst = dst;
  274. *cur_dst = (top[0] + top[2] + (top[1] << 1) + 2) >> 2;
  275.     *(cur_dst + 1) = *(cur_dst + 4) = (top[1] + top[3] + (top[2] << 1) + 2) >> 2;
  276.     *(cur_dst + 2) = *(cur_dst + 5) = *(cur_dst + 8) = (top[2] + top[4] + (top[3] << 1) + 2) >> 2;
  277.     *(cur_dst + 3) =  *(cur_dst + 6) =  *(cur_dst + 9) =  *(cur_dst + 12) = (top[3] + top[5] + (top[4] << 1) + 2) >> 2;
  278.     *(cur_dst + 7) =  *(cur_dst + 10) = *(cur_dst + 13) = (top[4] + top[6] + (top[5] << 1) + 2) >> 2;
  279.     *(cur_dst + 11) =  *(cur_dst + 14) = (top[5] + top[7] + (top[6] << 1) + 2) >> 2;
  280.     *(cur_dst + 15) = (top[6] + (top[7] << 1) + top[7] + 2) >> 2;
  281. }
  282. //Mode 4 Intra_4x4_DIAGONAL_DOWNRIGHT when Top and left are available
  283. void T264_predict_4x4_mode_4_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  284. {
  285. uint8_t *cur_dst = dst;
  286.     *(cur_dst + 12) = (left[3] + (left[2] << 1) + left[1] + 2) >> 2; 
  287.     *(cur_dst + 8) = *(cur_dst + 13) = (left[2] + (left[1] << 1) + left[0] + 2) >> 2; 
  288.     *(cur_dst + 4) = *(cur_dst + 9) = *(cur_dst + 14) = (left[1] + (left[0] << 1) + *(left - 1) + 2) >> 2; 
  289.     *(cur_dst) = *(cur_dst + 5) = *(cur_dst + 10) = *(cur_dst + 15) = (left[0] + (*(left - 1) << 1) + top[0] + 2) >> 2; 
  290.     *(cur_dst + 1) = *(cur_dst + 6) = *(cur_dst + 11) = (*(top - 1) + (top[0] << 1) + top[1] + 2) >> 2;
  291.     *(cur_dst + 2) = *(cur_dst + 7) = (top[0] + (top[1] << 1) + top[2] + 2) >> 2;
  292.     *(cur_dst + 3) = (top[1] + (top[2] << 1) + top[3] + 2) >> 2;
  293. }
  294. //Mode 5 Intra_4x4_VERTICAL_RIGHT when Top and left are available
  295. void T264_predict_4x4_mode_5_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  296. {
  297. uint8_t *cur_dst = dst;
  298. *cur_dst = *(cur_dst + 9) = (*(top - 1) + top[0] + 1) >> 1;
  299.     *(cur_dst + 1) = *(cur_dst + 10) = (top[0] + top[1] + 1) >> 1;
  300.     *(cur_dst + 2) = *(cur_dst + 11) = (top[1] + top[2] + 1) >> 1;
  301.     *(cur_dst + 3) = (top[2] + top[3] + 1) >> 1;
  302.     *(cur_dst + 4) = *(cur_dst + 13) = (left[0] + (*(top - 1) << 1) + top[0] + 2) >> 2;
  303.     *(cur_dst + 5) = *(cur_dst + 14) = (*(top - 1) + (top[0] << 1) + top[1] + 2) >> 2;
  304.     *(cur_dst + 6) = *(cur_dst + 15) = (top[0] + (top[1] << 1) + top[2] + 2) >> 2;
  305.     *(cur_dst + 7) = (top[1] + (top[2] << 1) + top[3] + 2) >> 2;
  306.     *(cur_dst + 8) = (*(top - 1) + (left[0] << 1) + left[1] + 2) >> 2;
  307.     *(cur_dst + 12) = (left[0] + (left[1] << 1) + left[2] + 2) >> 2;
  308. }
  309. //Mode 6 Intra_4x4_HORIZONTAL_DOWN when Top and left are available
  310. void T264_predict_4x4_mode_6_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  311. {
  312. uint8_t *cur_dst = dst;
  313. *cur_dst = *(cur_dst + 6) = (*(top - 1) + left[0] + 1) >> 1;
  314.     *(cur_dst + 1) = *(cur_dst + 7) = (left[0] + (*(left - 1) << 1) + top[0] + 2) >> 2;
  315.     *(cur_dst + 2) = (*(top - 1) + (top[0] << 1) + top[1] + 2) >> 2;
  316.     *(cur_dst + 3) = (top[0] + (top[1] << 1) + top[2] + 2) >> 2;
  317.     *(cur_dst + 4) = *(cur_dst + 10) = (left[0] + left[1] + 1) >> 1;
  318.     *(cur_dst + 5) = *(cur_dst + 11) = (*(left - 1) + (left[0] << 1) + left[1] + 2) >> 2;
  319.     *(cur_dst + 8) = *(cur_dst + 14) = (left[1] + left[2] + 1) >> 1;
  320.     *(cur_dst + 9) = *(cur_dst + 15) = (left[0] + (left[1] << 1) + left[2] + 2) >> 2;
  321.     *(cur_dst + 12) = (left[2] + left[3] + 1) >> 1;
  322.     *(cur_dst + 13) = (left[1] + (left[2] << 1) + left[3] + 2)  >> 2;
  323. }
  324. //Mode 7 Intra_4x4_VERTICAL_LEFT when Top are available
  325. void T264_predict_4x4_mode_7_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  326. {
  327. uint8_t *cur_dst = dst;
  328. *cur_dst = (top[0] + top[1] + 1) >> 1;
  329.     *(cur_dst + 1) = *(cur_dst + 8) = (top[1] + top[2] + 1) >> 1;
  330.     *(cur_dst + 2) = *(cur_dst + 9) = (top[2] + top[3] + 1) >> 1;;
  331.     *(cur_dst + 3) = *(cur_dst + 10) = (top[3] + top[4] + 1) >> 1;
  332.     *(cur_dst + 11) = (top[4] + top[5] + 1) >> 1;
  333.     *(cur_dst + 4) = (top[0] + (top[1] << 1) + top[2] + 2) >> 2;
  334.     *(cur_dst + 5) = *(cur_dst + 12) = (top[1] + (top[2] << 1) + top[3] + 2) >> 2;
  335.     *(cur_dst + 6) = *(cur_dst + 13) = (top[2] + (top[3] << 1) + top[4] + 2) >> 2;
  336.     *(cur_dst + 7) = *(cur_dst + 14) = (top[3] + (top[4] << 1) + top[5] + 2) >> 2;
  337.     *(cur_dst + 15) = (top[4] + (top[5] << 1) + top[6] + 2) >> 2;
  338. }
  339. //Mode 8 Intra_4x4_HORIZONTAL_UP when Left are available
  340. void T264_predict_4x4_mode_8_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  341. {
  342. uint8_t *cur_dst = dst;
  343. *cur_dst = (left[0] + left[1] + 1) >> 1;
  344.     *(cur_dst + 1) = (left[0] + 2*left[1] + left[2] + 2) >> 2;
  345.     *(cur_dst + 2) = *(cur_dst + 4) = (left[1] + left[2] + 1) >> 1;
  346.     *(cur_dst + 3) = *(cur_dst + 5) = (left[1] + 2*left[2] + left[3] + 2) >> 2;
  347.     *(cur_dst + 6) = *(cur_dst + 8) = (left[2] + left[3] + 1) >> 1;
  348.     *(cur_dst + 7) = *(cur_dst + 9) = (left[2] +  (left[3] << 1) + left[3] + 2) >> 2;
  349.    *(cur_dst + 12) = *(cur_dst + 10) = *(cur_dst + 11) = *(cur_dst + 13) 
  350. = *(cur_dst + 14) = *(cur_dst + 15) = left[3];
  351. }
  352. //
  353. // Vertical
  354. //
  355. void
  356. T264_predict_8x8_mode_0_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  357. {
  358.     int32_t i, j;
  359.     for(i = 0 ; i < 8 ; i ++)
  360.     {
  361.         for(j = 0 ; j < 8 ; j ++)
  362.         {
  363.             dst[j] = top[j];
  364.         }
  365.         dst += dst_stride;
  366.     }
  367. }
  368. //
  369. // Horizontal
  370. //
  371. void
  372. T264_predict_8x8_mode_1_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  373. {
  374.     int32_t i, j;
  375.     for(i = 0 ; i < 8 ; i ++)
  376.     {
  377.         for(j = 0 ; j < 8 ; j ++)
  378.         {
  379.             dst[j] = left[i];
  380.         }
  381.         dst += dst_stride;
  382.     }
  383. }
  384. //
  385. // top & left all available
  386. //
  387. void
  388. T264_predict_8x8_mode_2_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  389. {
  390.     int32_t H1, V1;
  391.     int32_t H2, V2;
  392.     int32_t m[4];
  393.     int32_t i, j;
  394.     H1 = V1 = H2 = V2 = 0;
  395.     for(i = 0 ; i < 4 ; i ++)
  396.     {
  397.         H1   += top[i];
  398.         V1   += left[i];
  399.         H2   += top[i + 4];
  400.         V2   += left[i + 4];
  401.     }
  402.     m[0] = (H1 + V1 + 4) >> 3;
  403.     m[1] = (H2 + 2) >> 2;
  404.     m[2] = (V2 + 2) >> 2;
  405.     m[3] = (H2 + V2 + 4) >> 3;
  406.     for(i = 0 ; i < 4 ; i ++)
  407.     {
  408.         for(j = 0 ; j < 4 ; j ++)
  409.         {
  410.             dst[j] = m[0];
  411.         }
  412.         for(      ; j < 8 ; j ++)
  413.         {
  414.             dst[j] = m[1];
  415.         }
  416.         dst += dst_stride;
  417.     }
  418.     for(     ; i < 8 ; i ++)
  419.     {
  420.         for(j = 0 ; j < 4 ; j ++)
  421.         {
  422.             dst[j] = m[2];
  423.         }
  424.         for(      ; j < 8 ; j ++)
  425.         {
  426.             dst[j] = m[3];
  427.         }
  428.         dst += dst_stride;
  429.     }
  430. }
  431. //
  432. // top available
  433. //
  434. void
  435. T264_predict_8x8_mode_20_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  436. {
  437.     int32_t H1, m1;
  438.     int32_t H2, m2;
  439.     int32_t i, j;
  440.     H1 = H2 = 0;
  441.     for(i = 0 ; i < 4 ; i ++)
  442.     {
  443.         H1 += top[i];
  444.         H2 += top[i + 4];
  445.     }
  446.     m1 = (H1 + 2) >> 2;
  447.     m2 = (H2 + 2) >> 2;
  448.     for(i = 0 ; i < 8 ; i ++)
  449.     {
  450.         for(j = 0 ; j < 4 ; j ++)
  451.         {
  452.             dst[j] = m1;
  453.         }
  454.         for(      ; j < 8 ; j ++)
  455.         {
  456.             dst[j] = m2;
  457.         }
  458.         dst += dst_stride;
  459.     }
  460. }
  461. //
  462. // left available
  463. //
  464. void
  465. T264_predict_8x8_mode_21_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  466. {
  467.     int32_t V1, m1;
  468.     int32_t V2, m2;
  469.     int32_t i, j;
  470.     V1 = V2 = 0;
  471.     for(i = 0 ; i < 4 ; i ++)
  472.     {
  473.         V1 += left[i];
  474.         V2 += left[i + 4];
  475.     }
  476.     m1 = (V1 + 2) >> 2;
  477.     m2 = (V2 + 2) >> 2;
  478.     for(i = 0 ; i < 4 ; i ++)
  479.     {
  480.         for(j = 0 ; j < 8 ; j ++)
  481.         {
  482.             dst[j] = m1;
  483.         }
  484.         dst += dst_stride;
  485.     }
  486.     for(      ; i < 8 ; i ++)
  487.     {
  488.         for(j = 0 ; j < 8 ; j ++)
  489.         {
  490.             dst[j] = m2;
  491.         }
  492.         dst += dst_stride;
  493.     }
  494. }
  495. //
  496. // none available
  497. //
  498. void
  499. T264_predict_8x8_mode_22_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  500. {
  501.     int32_t i, j;
  502.     for(i = 0 ; i < 8 ; i ++)
  503.     {
  504.         for(j = 0 ; j < 8 ; j ++)
  505.         {
  506.             dst[j] = 128;
  507.         }
  508.         dst += dst_stride;
  509.     }
  510. }
  511. //
  512. // Plane
  513. //
  514. void
  515. T264_predict_8x8_mode_3_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
  516. {
  517.     int32_t a, b, c, H, V;
  518.     int32_t i, j;
  519.     H = V = 0;
  520.     for(i = 0 ; i < 4 ; i ++)
  521.     {
  522.         H += (i + 1) * (top[4 + i] - top[2 - i]);
  523.         V += (i + 1) * (left[4 + i] - left[2 - i]);
  524.     }
  525.     a = (left[7] + top[7]) << 4;
  526.     b = (17 * H + 16) >> 5;
  527.     c = (17 * V + 16) >> 5;
  528.     for(i = 0 ; i < 8 ; i ++)
  529.     {
  530.         for(j = 0 ; j < 8 ; j ++)
  531.         {
  532.             int32_t tmp = (a + b * (j - 3) + c * (i - 3) + 16) >> 5;
  533.             dst[j] = CLIP1(tmp);
  534.         }
  535.         dst += dst_stride;
  536.     }
  537. }