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

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 "config.h"
  24. #include "stdio.h"
  25. #ifndef CHIP_DM642
  26. #include "memory.h"
  27. #endif
  28. #include "T264.h"
  29. #include "utility.h"
  30. #include "intra.h"
  31. #include "cavlc.h"
  32. #include "inter.h"
  33. #include "inter_b.h"
  34. #include "interpolate.h"
  35. #include "estimation.h"
  36. #include "deblock.h"
  37. #include "ratecontrol.h"
  38. #include "stat.h"
  39. #ifndef CHIP_DM642
  40. #include "sse2.h"
  41. #endif
  42. #include "math.h"
  43. #include "dct.h"
  44. #include "predict.h"
  45. #include "bitstream.h"
  46. #include "rbsp.h"
  47. #include "assert.h"
  48. #include "typedecision.h"
  49. //for CABAC
  50. #include "cabac_engine.h"
  51. #include "cabac.h"
  52. const int32_t chroma_qp[] =
  53. {
  54.     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
  55.     11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
  56.     21, 22, 23, 24, 25, 26, 27, 28, 29,
  57.     29, 30, 31, 32, 32, 33, 34, 34, 35, 35,
  58.     36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 39
  59. };
  60. //! convert from H.263 QP to H.26L quant given by: quant=pow(2,QP/6)
  61. static const int32_t qp_cost[52]=
  62. {
  63.     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  64.     1, 1, 1, 1, 2, 2, 2, 2,
  65.     3, 3, 3, 4, 4, 4, 5, 6,
  66.     6, 7, 8, 9,10,11,13,14,
  67.     16,18,20,23,25,29,32,36,
  68.     40,45,51,57,64,72,81,91
  69. };
  70. void
  71. T264_mb_load_context(T264_t* t, int32_t mb_y, int32_t mb_x)
  72. {
  73.     int32_t qpc;
  74.     int32_t i, j;
  75.     t->mb.mb_x = mb_x;
  76.     t->mb.mb_y = mb_y;
  77.     t->mb.mb_xy = t->mb.mb_y * t->mb_stride + t->mb.mb_x;
  78.     t->mb.mb_neighbour = 0;
  79.     if (mb_x != 0)
  80.         t->mb.mb_neighbour |= MB_LEFT;
  81.     if (mb_y != 0)
  82.     {
  83.         t->mb.mb_neighbour |= MB_TOP;
  84.         //if (mb_x != t->mb_stride - 1) //just tell MB is not the top-most
  85.             t->mb.mb_neighbour |= MB_TOPRIGHT;
  86.     }
  87.     t->mb.src_y = t->cur.Y[0]  + (mb_y << 4) * t->stride    + (mb_x << 4);
  88.     t->mb.dst_y  = t->rec->Y[0] + (mb_y << 4) * t->edged_stride    + (mb_x << 4);
  89.     t->mb.src_u = t->cur.U     + (mb_y << 3) * t->stride_uv + (mb_x << 3);
  90.     t->mb.dst_u = t->rec->U + (mb_y << 3) * t->edged_stride_uv + (mb_x << 3);
  91.     t->mb.src_v = t->cur.V     + (mb_y << 3) * t->stride_uv + (mb_x << 3);
  92.     t->mb.dst_v = t->rec->V + (mb_y << 3) * t->edged_stride_uv + (mb_x << 3);
  93.     t->mb.mb_qp_delta = 0;
  94.     /* t->ps.chroma_qp_index_offset maybe modify in ratecontrol */
  95.     qpc = clip3(t->ps.chroma_qp_index_offset + t->qp_y, 0, 51);
  96.     t->qp_uv = chroma_qp[qpc];
  97.     t->mb.lambda = qp_cost[t->qp_y];
  98.     t->mb.context = &t->rec->mb[t->mb.mb_xy];
  99. /*for CABAC, init the mvd_ref */
  100. memset(&(t->mb.mvd_ref[0][0][0]), 0, sizeof(t->mb.mvd_ref));
  101. #define INITINVALIDVEC(vec) vec.refno = -2; vec.x = vec.y = 0;
  102.     INITINVALIDVEC(t->mb.vec_ref[0].vec[0]);
  103.     INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 4].vec[0]);
  104.     INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 4 + 8].vec[0]);
  105.     INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 4 + 16].vec[0]);
  106.     INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 4 + 24].vec[0]);
  107.     INITINVALIDVEC(t->mb.vec_ref[0].vec[1]);
  108.     INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 4].vec[1]);
  109.     INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 4 + 8].vec[1]);
  110.     INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 4 + 16].vec[1]);
  111.     INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 4 + 24].vec[1]);
  112.     
  113.     t->mb.vec_ref[0].part = -1;
  114.     t->mb.vec_ref[IPM_LUMA - 8 + 4].part      = -1;
  115.     t->mb.vec_ref[IPM_LUMA - 8 + 4 + 8].part  = -1;
  116.     t->mb.vec_ref[IPM_LUMA - 8 + 4 + 16].part = -1;
  117.     t->mb.vec_ref[IPM_LUMA - 8 + 4 + 24].part = -1;
  118.     
  119.     t->mb.vec_ref[0].subpart = -1;
  120.     t->mb.vec_ref[IPM_LUMA - 8 + 4].subpart      = -1;
  121.     t->mb.vec_ref[IPM_LUMA - 8 + 4 + 8].subpart  = -1;
  122.     t->mb.vec_ref[IPM_LUMA - 8 + 4 + 16].subpart = -1;
  123.     t->mb.vec_ref[IPM_LUMA - 8 + 4 + 24].subpart = -1;
  124.     memset(t->mb.submb_part, -1, sizeof(uint8_t) * 16);//t->mb.submb_part));
  125.     t->mb.mb_part = -1;
  126.     for(i = 0 ; i < 2 ; i ++)
  127.     {
  128.         for(j = 0 ; j < 16 ; j ++)
  129.         {
  130.             INITINVALIDVEC(t->mb.vec[i][j]);
  131.         }
  132.     }
  133.     t->mb.sad_ref[0] = t->mb.sad_ref[1] = t->mb.sad_ref[2] = 0;
  134.     //intra_4x4 prediction modes and non-zero counts
  135. if( mb_y > 0 )
  136.     {
  137.         int16_t top_xy  = t->mb.mb_xy - t->mb_stride;
  138.         /* intra 4x4 pred mode layout
  139.           ? x x x x
  140.             x
  141.             x
  142.             x
  143.             x
  144.          */        
  145.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 8 + 0] = t->rec->mb[top_xy].mode_i4x4[10];
  146.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 8 + 1] = t->rec->mb[top_xy].mode_i4x4[11];
  147.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 8 + 2] = t->rec->mb[top_xy].mode_i4x4[14];
  148.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 8 + 3] = t->rec->mb[top_xy].mode_i4x4[15];
  149.         t->mb.vec_ref[IPM_LUMA - 8 + 0].vec[0] = t->rec->mb[top_xy].vec[0][12];
  150.         t->mb.vec_ref[IPM_LUMA - 8 + 1].vec[0] = t->rec->mb[top_xy].vec[0][13];
  151.         t->mb.vec_ref[IPM_LUMA - 8 + 2].vec[0] = t->rec->mb[top_xy].vec[0][14];
  152.         t->mb.vec_ref[IPM_LUMA - 8 + 3].vec[0] = t->rec->mb[top_xy].vec[0][15];
  153.         t->mb.vec_ref[IPM_LUMA - 8 + 0].vec[1] = t->rec->mb[top_xy].vec[1][12];
  154.         t->mb.vec_ref[IPM_LUMA - 8 + 1].vec[1] = t->rec->mb[top_xy].vec[1][13];
  155.         t->mb.vec_ref[IPM_LUMA - 8 + 2].vec[1] = t->rec->mb[top_xy].vec[1][14];
  156.         t->mb.vec_ref[IPM_LUMA - 8 + 3].vec[1] = t->rec->mb[top_xy].vec[1][15];
  157.         t->mb.vec_ref[IPM_LUMA - 8 + 0].part = 
  158.         t->mb.vec_ref[IPM_LUMA - 8 + 1].part = 
  159.         t->mb.vec_ref[IPM_LUMA - 8 + 2].part = 
  160.         t->mb.vec_ref[IPM_LUMA - 8 + 3].part = t->rec->mb[top_xy].mb_part;
  161.         t->mb.vec_ref[IPM_LUMA - 8 + 0].subpart = t->rec->mb[top_xy].submb_part[12];
  162.         t->mb.vec_ref[IPM_LUMA - 8 + 1].subpart = t->rec->mb[top_xy].submb_part[13];
  163.         t->mb.vec_ref[IPM_LUMA - 8 + 2].subpart = t->rec->mb[top_xy].submb_part[14];
  164.         t->mb.vec_ref[IPM_LUMA - 8 + 3].subpart = t->rec->mb[top_xy].submb_part[15];
  165.         t->mb.sad_ref[1] = t->rec->mb[top_xy].sad;
  166. //for CABAC, load mvd
  167. t->mb.mvd_ref[0][IPM_LUMA - 8 + 0][0] = t->rec->mb[top_xy].mvd[0][12][0];
  168. t->mb.mvd_ref[0][IPM_LUMA - 8 + 0][1] = t->rec->mb[top_xy].mvd[0][12][1];
  169. t->mb.mvd_ref[0][IPM_LUMA - 8 + 1][0] = t->rec->mb[top_xy].mvd[0][13][0];
  170. t->mb.mvd_ref[0][IPM_LUMA - 8 + 1][1] = t->rec->mb[top_xy].mvd[0][13][1];
  171. t->mb.mvd_ref[0][IPM_LUMA - 8 + 2][0] = t->rec->mb[top_xy].mvd[0][14][0];
  172. t->mb.mvd_ref[0][IPM_LUMA - 8 + 2][1] = t->rec->mb[top_xy].mvd[0][14][1];
  173. t->mb.mvd_ref[0][IPM_LUMA - 8 + 3][0] = t->rec->mb[top_xy].mvd[0][15][0];
  174. t->mb.mvd_ref[0][IPM_LUMA - 8 + 3][1] = t->rec->mb[top_xy].mvd[0][15][1];
  175. t->mb.mvd_ref[1][IPM_LUMA - 8 + 0][0] = t->rec->mb[top_xy].mvd[1][12][0];
  176. t->mb.mvd_ref[1][IPM_LUMA - 8 + 0][1] = t->rec->mb[top_xy].mvd[1][12][1];
  177. t->mb.mvd_ref[1][IPM_LUMA - 8 + 1][0] = t->rec->mb[top_xy].mvd[1][13][0];
  178. t->mb.mvd_ref[1][IPM_LUMA - 8 + 1][1] = t->rec->mb[top_xy].mvd[1][13][1];
  179. t->mb.mvd_ref[1][IPM_LUMA - 8 + 2][0] = t->rec->mb[top_xy].mvd[1][14][0];
  180. t->mb.mvd_ref[1][IPM_LUMA - 8 + 2][1] = t->rec->mb[top_xy].mvd[1][14][1];
  181. t->mb.mvd_ref[1][IPM_LUMA - 8 + 3][0] = t->rec->mb[top_xy].mvd[1][15][0];
  182. t->mb.mvd_ref[1][IPM_LUMA - 8 + 3][1] = t->rec->mb[top_xy].mvd[1][15][1];
  183.         if (mb_x != t->mb_stride - 1)
  184.         {
  185.             int32_t righttop_xy = top_xy + 1;
  186.             t->mb.vec_ref[IPM_LUMA - 8 + 4].vec[0]     = t->rec->mb[righttop_xy].vec[0][12];
  187.             t->mb.vec_ref[IPM_LUMA - 8 + 4].vec[1]     = t->rec->mb[righttop_xy].vec[1][12];
  188.             t->mb.vec_ref[IPM_LUMA - 8 + 4].part    = t->rec->mb[righttop_xy].mb_part;
  189.             t->mb.vec_ref[IPM_LUMA - 8 + 4].subpart = t->rec->mb[righttop_xy].submb_part[12];
  190.             t->mb.sad_ref[2] = t->rec->mb[righttop_xy].sad;
  191.         }
  192.         /* nnz layout:
  193.           ? x x x x ? x x
  194.           x         x
  195.           x         x
  196.           x         ? x x
  197.           x         x
  198.                     x
  199.          */
  200.         t->mb.nnz_ref[NNZ_LUMA - 8 + 0] = t->rec->mb[top_xy].nnz[12];
  201.         t->mb.nnz_ref[NNZ_LUMA - 8 + 1] = t->rec->mb[top_xy].nnz[13];
  202.         t->mb.nnz_ref[NNZ_LUMA - 8 + 2] = t->rec->mb[top_xy].nnz[14];
  203.         t->mb.nnz_ref[NNZ_LUMA - 8 + 3] = t->rec->mb[top_xy].nnz[15];
  204.         t->mb.nnz_ref[NNZ_CHROMA0 - 8 + 0] = t->rec->mb[top_xy].nnz[18];
  205.         t->mb.nnz_ref[NNZ_CHROMA0 - 8 + 1] = t->rec->mb[top_xy].nnz[19];
  206.         t->mb.nnz_ref[NNZ_CHROMA1 - 8 + 0] = t->rec->mb[top_xy].nnz[22];
  207.         t->mb.nnz_ref[NNZ_CHROMA1 - 8 + 1] = t->rec->mb[top_xy].nnz[23];
  208.     }
  209.     else
  210.     {
  211.         /* load intra4x4 */
  212.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 8 + 0] = 
  213.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 8 + 1] = 
  214.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 8 + 2] = 
  215.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 8 + 3] = -1;
  216.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 0].vec[0]);
  217.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 1].vec[0]);
  218.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 2].vec[0]);
  219.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 3].vec[0]);
  220.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 0].vec[1]);
  221.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 1].vec[1]);
  222.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 2].vec[1]);
  223.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 8 + 3].vec[1]);
  224.         t->mb.vec_ref[IPM_LUMA - 8 + 0].part = 
  225.         t->mb.vec_ref[IPM_LUMA - 8 + 1].part = 
  226.         t->mb.vec_ref[IPM_LUMA - 8 + 2].part = 
  227.         t->mb.vec_ref[IPM_LUMA - 8 + 3].part = -1;
  228.         t->mb.vec_ref[IPM_LUMA - 8 + 0].subpart = 
  229.         t->mb.vec_ref[IPM_LUMA - 8 + 1].subpart = 
  230.         t->mb.vec_ref[IPM_LUMA - 8 + 2].subpart = 
  231.         t->mb.vec_ref[IPM_LUMA - 8 + 3].subpart = -1;
  232. //for CABAC, load mvd
  233. t->mb.mvd_ref[0][IPM_LUMA - 8 + 0][0] = 0;
  234. t->mb.mvd_ref[0][IPM_LUMA - 8 + 0][1] = 0;
  235. t->mb.mvd_ref[0][IPM_LUMA - 8 + 1][0] = 0;
  236. t->mb.mvd_ref[0][IPM_LUMA - 8 + 1][1] = 0;
  237. t->mb.mvd_ref[0][IPM_LUMA - 8 + 2][0] = 0;
  238. t->mb.mvd_ref[0][IPM_LUMA - 8 + 2][1] = 0;
  239. t->mb.mvd_ref[0][IPM_LUMA - 8 + 3][0] = 0;
  240. t->mb.mvd_ref[0][IPM_LUMA - 8 + 3][1] = 0;
  241. t->mb.mvd_ref[1][IPM_LUMA - 8 + 0][0] = 0;
  242. t->mb.mvd_ref[1][IPM_LUMA - 8 + 0][1] = 0;
  243. t->mb.mvd_ref[1][IPM_LUMA - 8 + 1][0] = 0;
  244. t->mb.mvd_ref[1][IPM_LUMA - 8 + 1][1] = 0;
  245. t->mb.mvd_ref[1][IPM_LUMA - 8 + 2][0] = 0;
  246. t->mb.mvd_ref[1][IPM_LUMA - 8 + 2][1] = 0;
  247. t->mb.mvd_ref[1][IPM_LUMA - 8 + 3][0] = 0;
  248. t->mb.mvd_ref[1][IPM_LUMA - 8 + 3][1] = 0;
  249.         t->mb.nnz_ref[NNZ_LUMA - 8 + 0] =
  250.         t->mb.nnz_ref[NNZ_LUMA - 8 + 1] =
  251.         t->mb.nnz_ref[NNZ_LUMA - 8 + 2] =
  252.         t->mb.nnz_ref[NNZ_LUMA - 8 + 3] = 0x80;
  253.         t->mb.nnz_ref[NNZ_CHROMA0 - 8 + 0] =
  254.         t->mb.nnz_ref[NNZ_CHROMA0 - 8 + 1] =
  255.         t->mb.nnz_ref[NNZ_CHROMA1 - 8 + 0] =
  256.         t->mb.nnz_ref[NNZ_CHROMA1 - 8 + 1] = 0x80;
  257.     }
  258.     if( mb_x > 0 )
  259.     {
  260.         int16_t left_xy  = t->mb.mb_xy - 1;
  261.         /* load intra4x4 */
  262.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 1 + 0] = t->rec->mb[left_xy].mode_i4x4[5];
  263.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 1 + 8] = t->rec->mb[left_xy].mode_i4x4[7];
  264.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 1 + 16] = t->rec->mb[left_xy].mode_i4x4[13];
  265.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 1 + 24] = t->rec->mb[left_xy].mode_i4x4[15];
  266.         t->mb.vec_ref[IPM_LUMA - 1 + 0].vec[0] = t->rec->mb[left_xy].vec[0][3];
  267.         t->mb.vec_ref[IPM_LUMA - 1 + 8].vec[0] = t->rec->mb[left_xy].vec[0][7];
  268.         t->mb.vec_ref[IPM_LUMA - 1 + 16].vec[0] = t->rec->mb[left_xy].vec[0][11];
  269.         t->mb.vec_ref[IPM_LUMA - 1 + 24].vec[0] = t->rec->mb[left_xy].vec[0][15];
  270.         t->mb.vec_ref[IPM_LUMA - 1 + 0].vec[1] = t->rec->mb[left_xy].vec[1][3];
  271.         t->mb.vec_ref[IPM_LUMA - 1 + 8].vec[1] = t->rec->mb[left_xy].vec[1][7];
  272.         t->mb.vec_ref[IPM_LUMA - 1 + 16].vec[1] = t->rec->mb[left_xy].vec[1][11];
  273.         t->mb.vec_ref[IPM_LUMA - 1 + 24].vec[1] = t->rec->mb[left_xy].vec[1][15];
  274.         t->mb.vec_ref[IPM_LUMA - 1 + 0].part = 
  275.         t->mb.vec_ref[IPM_LUMA - 1 + 8].part = 
  276.         t->mb.vec_ref[IPM_LUMA - 1 + 16].part =
  277.         t->mb.vec_ref[IPM_LUMA - 1 + 24].part = t->rec->mb[left_xy].mb_part;
  278.         t->mb.vec_ref[IPM_LUMA - 8 + 0].subpart = t->rec->mb[left_xy].submb_part[3];
  279.         t->mb.vec_ref[IPM_LUMA - 8 + 8].subpart = t->rec->mb[left_xy].submb_part[7];
  280.         t->mb.vec_ref[IPM_LUMA - 8 + 16].subpart = t->rec->mb[left_xy].submb_part[11];
  281.         t->mb.vec_ref[IPM_LUMA - 8 + 24].subpart = t->rec->mb[left_xy].submb_part[15];
  282.         t->mb.sad_ref[0] = t->rec->mb[left_xy].sad;
  283. //for CABAC, load mvd
  284. t->mb.mvd_ref[0][IPM_LUMA - 1 + 0][0] = t->rec->mb[left_xy].mvd[0][3][0];
  285. t->mb.mvd_ref[0][IPM_LUMA - 1 + 0][1] = t->rec->mb[left_xy].mvd[0][3][1];
  286. t->mb.mvd_ref[0][IPM_LUMA - 1 + 8][0] = t->rec->mb[left_xy].mvd[0][7][0];
  287. t->mb.mvd_ref[0][IPM_LUMA - 1 + 8][1] = t->rec->mb[left_xy].mvd[0][7][1];
  288. t->mb.mvd_ref[0][IPM_LUMA - 1 + 16][0] = t->rec->mb[left_xy].mvd[0][11][0];
  289. t->mb.mvd_ref[0][IPM_LUMA - 1 + 16][1] = t->rec->mb[left_xy].mvd[0][11][1];
  290. t->mb.mvd_ref[0][IPM_LUMA - 1 + 24][0] = t->rec->mb[left_xy].mvd[0][15][0];
  291. t->mb.mvd_ref[0][IPM_LUMA - 1 + 24][1] = t->rec->mb[left_xy].mvd[0][15][1];
  292. t->mb.mvd_ref[1][IPM_LUMA - 1 + 0][0] = t->rec->mb[left_xy].mvd[1][3][0];
  293. t->mb.mvd_ref[1][IPM_LUMA - 1 + 0][1] = t->rec->mb[left_xy].mvd[1][3][1];
  294. t->mb.mvd_ref[1][IPM_LUMA - 1 + 8][0] = t->rec->mb[left_xy].mvd[1][7][0];
  295. t->mb.mvd_ref[1][IPM_LUMA - 1 + 8][1] = t->rec->mb[left_xy].mvd[1][7][1];
  296. t->mb.mvd_ref[1][IPM_LUMA - 1 + 16][0] = t->rec->mb[left_xy].mvd[1][11][0];
  297. t->mb.mvd_ref[1][IPM_LUMA - 1 + 16][1] = t->rec->mb[left_xy].mvd[1][11][1];
  298. t->mb.mvd_ref[1][IPM_LUMA - 1 + 24][0] = t->rec->mb[left_xy].mvd[1][15][0];
  299. t->mb.mvd_ref[1][IPM_LUMA - 1 + 24][1] = t->rec->mb[left_xy].mvd[1][15][1];
  300.         /* load non_zero_count */
  301.         t->mb.nnz_ref[NNZ_LUMA - 1 + 0] = t->rec->mb[left_xy].nnz[3];
  302.         t->mb.nnz_ref[NNZ_LUMA - 1 + 8] = t->rec->mb[left_xy].nnz[7];
  303.         t->mb.nnz_ref[NNZ_LUMA - 1 + 16] = t->rec->mb[left_xy].nnz[11];
  304.         t->mb.nnz_ref[NNZ_LUMA - 1 + 24] = t->rec->mb[left_xy].nnz[15];
  305.         t->mb.nnz_ref[NNZ_CHROMA0 - 1 + 0] = t->rec->mb[left_xy].nnz[17];
  306.         t->mb.nnz_ref[NNZ_CHROMA0 - 1 + 8] = t->rec->mb[left_xy].nnz[19];
  307.         t->mb.nnz_ref[NNZ_CHROMA1 - 1 + 0] = t->rec->mb[left_xy].nnz[21];
  308.         t->mb.nnz_ref[NNZ_CHROMA1 - 1 + 8] = t->rec->mb[left_xy].nnz[23];
  309.     }
  310.     else
  311.     {
  312.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 1 + 0]  = 
  313.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 1 + 8]  = 
  314.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 1 + 16] =
  315.         t->mb.i4x4_pred_mode_ref[IPM_LUMA - 1 + 24] = -1;
  316.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 1 + 0].vec[0]);
  317.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 1 + 8].vec[0]);
  318.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 1 + 16].vec[0]);
  319.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 1 + 24].vec[0]);
  320.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 1 + 0].vec[1]);
  321.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 1 + 8].vec[1]);
  322.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 1 + 16].vec[1]);
  323.         INITINVALIDVEC(t->mb.vec_ref[IPM_LUMA - 1 + 24].vec[1]);
  324.         t->mb.vec_ref[IPM_LUMA - 1 + 0].part  = 
  325.         t->mb.vec_ref[IPM_LUMA - 1 + 8].part  = 
  326.         t->mb.vec_ref[IPM_LUMA - 1 + 16].part =
  327.         t->mb.vec_ref[IPM_LUMA - 1 + 24].part = -1;
  328.         t->mb.vec_ref[IPM_LUMA - 1 + 0].subpart  = 
  329.         t->mb.vec_ref[IPM_LUMA - 1 + 8].subpart  = 
  330.         t->mb.vec_ref[IPM_LUMA - 1 + 16].subpart =
  331.         t->mb.vec_ref[IPM_LUMA - 1 + 24].subpart = -1;
  332. //for CABAC, load mvd
  333. t->mb.mvd_ref[0][IPM_LUMA - 1 + 0][0] = 0;
  334. t->mb.mvd_ref[0][IPM_LUMA - 1 + 0][1] = 0;
  335. t->mb.mvd_ref[0][IPM_LUMA - 1 + 8][0] = 0;
  336. t->mb.mvd_ref[0][IPM_LUMA - 1 + 8][1] = 0;
  337. t->mb.mvd_ref[0][IPM_LUMA - 1 + 16][0] = 0;
  338. t->mb.mvd_ref[0][IPM_LUMA - 1 + 16][1] = 0;
  339. t->mb.mvd_ref[0][IPM_LUMA - 1 + 24][0] = 0;
  340. t->mb.mvd_ref[0][IPM_LUMA - 1 + 24][1] = 0;
  341. t->mb.mvd_ref[1][IPM_LUMA - 1 + 0][0] = 0;
  342. t->mb.mvd_ref[1][IPM_LUMA - 1 + 0][1] = 0;
  343. t->mb.mvd_ref[1][IPM_LUMA - 1 + 8][0] = 0;
  344. t->mb.mvd_ref[1][IPM_LUMA - 1 + 8][1] = 0;
  345. t->mb.mvd_ref[1][IPM_LUMA - 1 + 16][0] = 0;
  346. t->mb.mvd_ref[1][IPM_LUMA - 1 + 16][1] = 0;
  347. t->mb.mvd_ref[1][IPM_LUMA - 1 + 24][0] = 0;
  348. t->mb.mvd_ref[1][IPM_LUMA - 1 + 24][1] = 0;
  349.         t->mb.nnz_ref[NNZ_LUMA - 1 + 0]  =
  350.         t->mb.nnz_ref[NNZ_LUMA - 1 + 8]  =
  351.         t->mb.nnz_ref[NNZ_LUMA - 1 + 16] =
  352.         t->mb.nnz_ref[NNZ_LUMA - 1 + 24] = 0x80;
  353.         t->mb.nnz_ref[NNZ_CHROMA0 - 1 + 0] =
  354.         t->mb.nnz_ref[NNZ_CHROMA0 - 1 + 8] =
  355.         t->mb.nnz_ref[NNZ_CHROMA1 - 1 + 0] =
  356.         t->mb.nnz_ref[NNZ_CHROMA1 - 1 + 8] = 0x80;
  357.     }
  358.     if (mb_x > 0 && mb_y > 0)
  359.     {
  360.         int32_t lefttop_xy = t->mb.mb_xy - t->mb_stride - 1;
  361.         t->mb.vec_ref[0].vec[0] = t->rec->mb[lefttop_xy].vec[0][15];
  362.         t->mb.vec_ref[0].vec[1] = t->rec->mb[lefttop_xy].vec[1][15];
  363.         t->mb.vec_ref[0].subpart = t->rec->mb[lefttop_xy].submb_part[15];
  364.         t->mb.vec_ref[0].part = t->rec->mb[lefttop_xy].mb_part;
  365.     }
  366. //for CABAC
  367. t->mb.mb_mode_uv = Intra_8x8_DC;
  368. #undef INITINVALIDVEC
  369. }
  370. void
  371. T264_mb_save_context(T264_t* t)
  372. {
  373.     memcpy(t->mb.context, &t->mb, sizeof(*t->mb.context));
  374. }
  375. static void
  376. T264_reset_ref(T264_t* t)
  377. {
  378.     int32_t i;
  379.     for(i = 1 ; i < MAX_REFFRAMES ; i ++)
  380.     {
  381.         t->refn[i].poc = -1;
  382.     }
  383.     t->rec = &t->refn[0];
  384.     t->refn[0].poc = 0;
  385. }
  386. static void
  387. T264_load_ref(T264_t* t)
  388. {
  389.     int32_t i;
  390.     t->refl0_num = 0;
  391.     t->refl1_num = 0;
  392.     if (t->slice_type == SLICE_P)
  393.     {
  394.         for(i = 0 ; i < t->param.ref_num ; i ++)
  395.         {
  396.             if (t->refn[i + 1].poc >= 0)
  397.             {
  398.                 t->ref[0][t->refl0_num ++] = &t->refn[i + 1];
  399.             }
  400.         }
  401.     }
  402.     else if (t->slice_type == SLICE_B)
  403.     {
  404.         for(i = 0 ; i < t->param.ref_num; i ++)
  405.         {
  406.             if (t->refn[i + 1].poc < t->cur.poc)
  407.             {
  408.                 if (t->refn[i + 1].poc >= 0)
  409.                     t->ref[0][t->refl0_num ++] = &t->refn[i + 1];
  410.             }
  411.             else
  412.             {
  413.                 // yes, t->refn[i].poc already > 0
  414.                 t->ref[1][t->refl1_num ++] = &t->refn[i + 1];
  415.             }
  416.         }
  417.     }
  418. }
  419. void
  420. T264_extend_border(T264_t* t, T264_frame_t* f)
  421. {
  422.     int32_t i;
  423.     uint8_t* py0;
  424.     uint8_t* pu;
  425.     uint8_t* pv;
  426.     uint8_t* tmpy0;
  427.     uint8_t* tmpu;
  428.     uint8_t* tmpv;
  429.     // top, top-left, top-right
  430.     py0 = f->Y[0] - t->edged_stride;
  431.     pu = f->U - t->edged_stride_uv;
  432.     pv = f->V - t->edged_stride_uv;
  433.     for(i = 0 ; i < (EDGED_HEIGHT >> 1) ; i ++)
  434.     {
  435.         // y
  436.         memcpy(py0, f->Y[0], t->stride);
  437.         memset(py0 - EDGED_WIDTH, f->Y[0][0], EDGED_WIDTH);
  438.         memset(py0 + t->stride, f->Y[0][t->stride - 1], EDGED_WIDTH);
  439.         py0 -= t->edged_stride;
  440.         memcpy(py0, f->Y[0], t->stride);
  441.         memset(py0 - EDGED_WIDTH, f->Y[0][0], EDGED_WIDTH);
  442.         memset(py0 + t->stride, f->Y[0][t->stride - 1], EDGED_WIDTH);
  443.         py0 -= t->edged_stride;
  444.         // u
  445.         memcpy(pu, f->U, t->stride_uv);
  446.         memset(pu - (EDGED_WIDTH >> 1), f->U[0], EDGED_WIDTH >> 1);
  447.         memset(pu + t->stride_uv, f->U[t->stride_uv - 1], EDGED_WIDTH >> 1);
  448.         pu -= t->edged_stride_uv;
  449.         // V
  450.         memcpy(pv, f->V, t->stride_uv);
  451.         memset(pv - (EDGED_WIDTH >> 1), f->V[0], EDGED_WIDTH >> 1);
  452.         memset(pv + t->stride_uv, f->V[t->stride_uv - 1], EDGED_WIDTH >> 1);
  453.         pv -= t->edged_stride_uv;
  454.     }
  455.     // left & right
  456.     py0 = f->Y[0] - EDGED_WIDTH;
  457.     pu = f->U - (EDGED_WIDTH >> 1);
  458.     pv = f->V - (EDGED_WIDTH >> 1);
  459.     for(i = 0 ; i < (t->height >> 1) ; i ++)
  460.     {
  461.         // left
  462.         memset(py0, py0[EDGED_WIDTH], EDGED_WIDTH);
  463.         // right
  464.         memset(&py0[t->stride + EDGED_WIDTH], py0[t->stride + EDGED_WIDTH - 1], EDGED_WIDTH);
  465.         py0 += t->edged_stride;
  466.         memset(py0, py0[EDGED_WIDTH], EDGED_WIDTH);
  467.         memset(&py0[t->stride + EDGED_WIDTH], py0[t->stride + EDGED_WIDTH - 1], EDGED_WIDTH);
  468.         py0 += t->edged_stride;
  469.         // u
  470.         memset(pu, pu[EDGED_WIDTH >> 1], EDGED_WIDTH >> 1);
  471.         memset(&pu[t->stride_uv + (EDGED_WIDTH >> 1)], pu[t->stride_uv + (EDGED_WIDTH >> 1) - 1], EDGED_WIDTH >> 1);
  472.         pu += t->edged_stride_uv;
  473.         // v
  474.         memset(pv, pv[EDGED_WIDTH >> 1], EDGED_WIDTH >> 1);
  475.         memset(&pv[t->stride_uv + (EDGED_WIDTH >> 1)], pv[t->stride_uv + (EDGED_WIDTH >> 1) - 1], EDGED_WIDTH >> 1);
  476.         pv += t->edged_stride_uv;
  477.     }
  478.     // bottom, left-bottom,right-bottom
  479.     py0 = f->Y[0] + t->edged_stride * t->height;
  480.     tmpy0 = f->Y[0] + t->edged_stride * (t->height - 1);
  481.     pu = f->U + t->edged_stride_uv * (t->height >> 1);
  482.     tmpu = f->U + t->edged_stride_uv * ((t->height >> 1) - 1);
  483.     pv = f->V + t->edged_stride_uv * (t->height >> 1);
  484.     tmpv = f->V + t->edged_stride_uv * ((t->height >> 1)- 1);
  485.     for(i = 0 ; i < (EDGED_HEIGHT >> 1) ; i ++)
  486.     {
  487.         // y
  488.         memcpy(py0, tmpy0, t->stride);
  489.         memset(py0 - EDGED_WIDTH, tmpy0[0], EDGED_WIDTH);
  490.         memset(py0 + t->stride, tmpy0[t->stride - 1], EDGED_WIDTH);
  491.         py0 += t->edged_stride;
  492.         memcpy(py0, tmpy0, t->stride);
  493.         memset(py0 - EDGED_WIDTH, tmpy0[0], EDGED_WIDTH);
  494.         memset(py0 + t->stride, tmpy0[t->stride - 1], EDGED_WIDTH);
  495.         py0 += t->edged_stride;
  496.         // u
  497.         memcpy(pu, tmpu, t->stride_uv);
  498.         memset(pu - (EDGED_WIDTH >> 1), tmpu[0], EDGED_WIDTH >> 1);
  499.         memset(pu + t->stride_uv, tmpu[t->stride_uv - 1], EDGED_WIDTH >> 1);
  500.         pu += t->edged_stride_uv;
  501.         // v
  502.         memcpy(pv, tmpv, t->stride_uv);
  503.         memset(pv - (EDGED_WIDTH >> 1), tmpv[0], EDGED_WIDTH >> 1);
  504.         memset(pv + t->stride_uv, tmpv[t->stride_uv - 1], EDGED_WIDTH >> 1);
  505.         pv += t->edged_stride_uv;
  506.     }
  507. }
  508. void
  509. T264_interpolate_halfpel(T264_t* t, T264_frame_t* f)
  510. {
  511.     int32_t src_offset;
  512.     int32_t width, height;
  513.     if (t->flags & (USE_HALFPEL| USE_QUARTPEL))
  514.     {
  515.         src_offset = - 3;
  516.         width      = t->width + 3 + 2;
  517.         height     = t->height;
  518.         t->interpolate_halfpel_h(f->Y[0] + src_offset, t->edged_stride, f->Y[1] + src_offset, t->edged_stride, width, height);
  519.         // extend border
  520.         {
  521.             uint8_t* src, *dst;
  522.             int32_t i;
  523.             // left & right
  524.             dst = f->Y[1] - EDGED_WIDTH;
  525.             src = f->Y[1] - 3;
  526.             for(i = 0 ; i < t->height ; i ++)
  527.             {
  528.                 // left
  529.                 memset(dst, src[0], EDGED_WIDTH - 3);
  530.                 // right
  531.                 memset(&dst[t->stride + EDGED_WIDTH + 2], src[t->stride - 1 + 3 + 2], EDGED_WIDTH - 2);
  532.                 dst += t->edged_stride;
  533.                 src += t->edged_stride;
  534.             }
  535.             // top
  536.             dst = f->Y[1] - EDGED_HEIGHT * t->edged_stride - EDGED_WIDTH;
  537.             src = f->Y[1] - EDGED_WIDTH;
  538.             for(i = 0 ; i < EDGED_HEIGHT ; i ++)
  539.             {
  540.                 memcpy(dst, src, t->edged_stride);
  541.                 dst += t->edged_stride;
  542.             }
  543.             // bottom
  544.             src = f->Y[1] + (t->height - 1) * t->edged_stride - EDGED_WIDTH;
  545.             dst = src + t->edged_stride;
  546.             for(i = 0 ; i < EDGED_HEIGHT ; i ++)
  547.             {
  548.                 memcpy(dst, src, t->edged_stride);
  549.                 dst += t->edged_stride;
  550.             }
  551.         }
  552.         src_offset = - 3 * t->edged_stride;
  553.         width      = t->width;
  554.         height     = t->height + 3 + 2;
  555.         t->interpolate_halfpel_v(f->Y[0] + src_offset, t->edged_stride, f->Y[2] + src_offset, t->edged_stride, width, height);
  556.         // extend border
  557.         {
  558.             uint8_t* src, *dst;
  559.             int32_t i;
  560.             // left & right
  561.             dst = f->Y[2] - 3 * t->edged_stride - EDGED_WIDTH;
  562.             src = f->Y[2] - 3 * t->edged_stride;
  563.             for(i = 0 ; i < t->height + 3 + 2 ; i ++)
  564.             {
  565.                 // left
  566.                 memset(dst, src[0], EDGED_WIDTH);
  567.                 // right
  568.                 memset(&dst[t->stride + EDGED_WIDTH], src[t->stride - 1], EDGED_WIDTH);
  569.                 dst += t->edged_stride;
  570.                 src += t->edged_stride;
  571.             }
  572.             // top
  573.             dst = f->Y[2] - EDGED_HEIGHT * t->edged_stride - EDGED_WIDTH;
  574.             src = f->Y[2] - 3 * t->edged_stride - EDGED_WIDTH;
  575.             for(i = 0 ; i < EDGED_HEIGHT - 3 ; i ++)
  576.             {
  577.                 memcpy(dst, src, t->edged_stride);
  578.                 dst += t->edged_stride;
  579.             }
  580.             // bottom
  581.             src = f->Y[2] + (t->height + 2 - 1) * t->edged_stride - EDGED_WIDTH;
  582.             dst = src + t->edged_stride;
  583.             for(i = 0 ; i < EDGED_HEIGHT - 2 ; i ++)
  584.             {
  585.                 memcpy(dst, src, t->edged_stride);
  586.                 dst += t->edged_stride;
  587.             }
  588.         }
  589.         if (t->flags & USE_FASTINTERPOLATE)
  590.         {
  591.             // NOTE: here just offset -3 is not enough to complete reverting the origin implemention
  592.             //   in Y[2] its border is already extend 3 + 2, the idea border in Y[3] is -3 -3 2 2
  593.             // If u use USE_FASTINTERPOLATE we prefer the speed is the first condition we do not extend the border further
  594.             src_offset = - 3;
  595.             width      = t->width + 3 + 2;
  596.             height     = t->height;
  597.             t->interpolate_halfpel_h(f->Y[2] + src_offset, t->edged_stride, f->Y[3] + src_offset, t->edged_stride, width, height);
  598.             // extend border
  599.             {
  600.                 uint8_t* src, *dst;
  601.                 int32_t i;
  602.                 // left & right
  603.                 dst = f->Y[3] - EDGED_WIDTH;
  604.                 src = f->Y[3] - 3;
  605.                 for(i = 0 ; i < t->height ; i ++)
  606.                 {
  607.                     // left
  608.                     memset(dst, src[0], EDGED_WIDTH - 3);
  609.                     // right
  610.                     memset(&dst[t->stride + EDGED_WIDTH + 2], src[t->stride - 1 + 3 + 2], EDGED_WIDTH - 2);
  611.                     dst += t->edged_stride;
  612.                     src += t->edged_stride;
  613.                 }
  614.                 // top
  615.                 dst = f->Y[3] - EDGED_HEIGHT * t->edged_stride - EDGED_WIDTH;
  616.                 src = f->Y[3] - EDGED_WIDTH;
  617.                 for(i = 0 ; i < EDGED_HEIGHT ; i ++)
  618.                 {
  619.                     memcpy(dst, src, t->edged_stride);
  620.                     dst += t->edged_stride;
  621.                 }
  622.                 // bottom
  623.                 src = f->Y[3] + (t->height - 1) * t->edged_stride - EDGED_WIDTH;
  624.                 dst = src + t->edged_stride;
  625.                 for(i = 0 ; i < EDGED_HEIGHT ; i ++)
  626.                 {
  627.                     memcpy(dst, src, t->edged_stride);
  628.                     dst += t->edged_stride;
  629.                 }
  630.             }
  631.         }
  632.         else
  633.         {
  634.             src_offset = - 3 * t->edged_stride - 3;
  635.             width      = t->width + 3 + 2;
  636.             height     = t->height + 3 + 2;
  637.             t->interpolate_halfpel_hv(f->Y[0] + src_offset, t->edged_stride, f->Y[3] + src_offset, t->edged_stride, width, height);
  638.             // extend border
  639.             {
  640.                 uint8_t* src, *dst;
  641.                 int32_t i;
  642.                 // left & right
  643.                 dst = f->Y[3] - 3 * t->edged_stride - EDGED_WIDTH;
  644.                 src = f->Y[3] - 3 * t->edged_stride - 3;
  645.                 for(i = 0 ; i < t->height + 3 + 2 ; i ++)
  646.                 {
  647.                     // left
  648.                     memset(dst, src[0], EDGED_WIDTH - 3);
  649.                     // right
  650.                     memset(&dst[t->stride + EDGED_WIDTH + 2], src[t->stride - 1 + 3 + 2], EDGED_WIDTH - 2);
  651.                     dst += t->edged_stride;
  652.                     src += t->edged_stride;
  653.                 }
  654.                 // top
  655.                 dst = f->Y[3] - EDGED_HEIGHT * t->edged_stride - EDGED_WIDTH;
  656.                 src = f->Y[3] - 3 * t->edged_stride - EDGED_WIDTH;
  657.                 for(i = 0 ; i < EDGED_HEIGHT - 3 ; i ++)
  658.                 {
  659.                     memcpy(dst, src, t->edged_stride);
  660.                     dst += t->edged_stride;
  661.                 }
  662.                 // bottom
  663.                 src = f->Y[3] + (t->height + 2 - 1) * t->edged_stride - EDGED_WIDTH;
  664.                 dst = src + t->edged_stride;
  665.                 for(i = 0 ; i < EDGED_HEIGHT - 2 ; i ++)
  666.                 {
  667.                     memcpy(dst, src, t->edged_stride);
  668.                     dst += t->edged_stride;
  669.                 }
  670.             }
  671.         }
  672.     }
  673. }
  674. static void
  675. T264_save_ref(T264_t* t)
  676. {
  677.     int32_t i;
  678.     T264_frame_t tmp;
  679.     /* deblock filter exec here */
  680.     if (t->param.disable_filter == 0)
  681.         T264_deblock_frame(t, t->rec);
  682.     /* current only del with i,p */
  683.     T264_extend_border(t, t->rec);
  684.     T264_interpolate_halfpel(t, t->rec);
  685.     tmp = t->refn[t->param.ref_num];
  686.     t->refn[0].poc = t->poc;
  687.     for(i = t->param.ref_num ; i >= 1 ; i --)
  688.     {
  689.         t->refn[i] = t->refn[i - 1];
  690.     }
  691.     t->refn[0] = tmp;
  692.     t->rec = &t->refn[0];
  693. }
  694. void
  695. T264_mb_mode_decision(T264_t* t)
  696. {
  697.     if(t->slice_type == SLICE_P)
  698.     {
  699.         T264_mode_decision_interp_y(t);
  700.     }
  701.     else if(t->slice_type == SLICE_B)
  702.     {
  703.         T264_mode_decision_interb_y(t);
  704.     }
  705.     else if (t->slice_type == SLICE_I)
  706.     {
  707.         T264_mode_decision_intra_y(t);
  708.     }
  709. }
  710. void
  711. T264_mb_encode(T264_t* t)
  712. {
  713.     if(t->mb.mb_mode == P_MODE)
  714.     {
  715.         T264_encode_inter_y(t);
  716.         T264_encode_inter_uv(t);
  717.         t->stat.p_block_num[t->mb.mb_part] ++;
  718.     }
  719.     else if(t->mb.mb_mode == P_SKIP)
  720.     {
  721.         t->stat.skip_block_num++;
  722.     }
  723.     else if (t->mb.mb_mode == B_MODE)
  724.     {
  725.         T264_encode_inter_y(t);
  726.         T264_encode_interb_uv(t);
  727.         t->stat.p_block_num[0] ++;
  728.     }
  729.     else if (t->mb.mb_mode == I_4x4 || t->mb.mb_mode == I_16x16)
  730.     {
  731.         T264_encode_intra_y(t);
  732.         //
  733.         // Chroma
  734.         //
  735.         T264_mode_decision_intra_uv(t);
  736.         T264_encode_intra_uv(t);
  737.         t->stat.i_block_num[t->mb.mb_mode] ++;
  738.     }
  739. }
  740. static void
  741. T264_emms_c()
  742. {
  743. }
  744. void
  745. T264_init_cpu(T264_t* t)
  746. {
  747. #ifndef CHIP_DM642
  748.     if ((t->param.cpu & T264_CPU_FORCE) != T264_CPU_FORCE)
  749.     {
  750.         t->param.cpu = T264_detect_cpu(); 
  751.     }
  752. #endif
  753.     t->pred16x16[Intra_16x16_TOP]    = T264_predict_16x16_mode_0_c;
  754.     t->pred16x16[Intra_16x16_LEFT]   = T264_predict_16x16_mode_1_c;
  755.     t->pred16x16[Intra_16x16_DC]     = T264_predict_16x16_mode_2_c;
  756.     t->pred16x16[Intra_16x16_PLANE]  = T264_predict_16x16_mode_3_c;
  757.     t->pred16x16[Intra_16x16_DCTOP]  = T264_predict_16x16_mode_20_c;
  758.     t->pred16x16[Intra_16x16_DCLEFT] = T264_predict_16x16_mode_21_c;
  759.     t->pred16x16[Intra_16x16_DC128]  = T264_predict_16x16_mode_22_c;
  760.     
  761.     t->pred8x8[Intra_8x8_TOP]    = T264_predict_8x8_mode_0_c;
  762.     t->pred8x8[Intra_8x8_LEFT]   = T264_predict_8x8_mode_1_c;
  763.     t->pred8x8[Intra_8x8_DC]     = T264_predict_8x8_mode_2_c;
  764.     t->pred8x8[Intra_8x8_PLANE]  = T264_predict_8x8_mode_3_c;
  765.     t->pred8x8[Intra_8x8_DCTOP]  = T264_predict_8x8_mode_20_c;
  766.     t->pred8x8[Intra_8x8_DCLEFT] = T264_predict_8x8_mode_21_c;
  767.     t->pred8x8[Intra_8x8_DC128]  = T264_predict_8x8_mode_22_c;
  768.     t->pred4x4[Intra_4x4_TOP]    = T264_predict_4x4_mode_0_c;
  769.     t->pred4x4[Intra_4x4_LEFT]   = T264_predict_4x4_mode_1_c;
  770.     t->pred4x4[Intra_4x4_DC]     = T264_predict_4x4_mode_2_c;
  771.     t->pred4x4[Intra_4x4_DCTOP]  = T264_predict_4x4_mode_20_c;
  772.     t->pred4x4[Intra_4x4_DCLEFT] = T264_predict_4x4_mode_21_c;
  773.     t->pred4x4[Intra_4x4_DC128]  = T264_predict_4x4_mode_22_c;
  774.     t->pred4x4[Intra_4x4_DIAGONAL_DOWNLEFT]  = T264_predict_4x4_mode_3_c;
  775.     t->pred4x4[Intra_4x4_DIAGONAL_DOWNRIGHT]  = T264_predict_4x4_mode_4_c;
  776.     t->pred4x4[Intra_4x4_VERTICAL_RIGHT]  = T264_predict_4x4_mode_5_c;
  777.     t->pred4x4[Intra_4x4_HORIZONTAL_DOWN]  = T264_predict_4x4_mode_6_c;
  778.     t->pred4x4[Intra_4x4_VERTICAL_LEFT]  = T264_predict_4x4_mode_7_c;
  779.     t->pred4x4[Intra_4x4_HORIZONTAL_UP]  = T264_predict_4x4_mode_8_c;
  780.     if (t->flags & USE_SAD)
  781.     {
  782.         t->cmp[MB_16x16] = T264_sad_u_16x16_c;
  783.         t->cmp[MB_16x8]  = T264_sad_u_16x8_c;
  784.         t->cmp[MB_8x16]  = T264_sad_u_8x16_c;
  785.         t->cmp[MB_8x8]   = T264_sad_u_8x8_c;
  786.         t->cmp[MB_8x4]   = T264_sad_u_8x4_c;
  787.         t->cmp[MB_4x8]   = T264_sad_u_4x8_c;
  788.         t->cmp[MB_4x4]   = T264_sad_u_4x4_c;
  789.     }
  790.     else
  791.     {
  792.         t->cmp[MB_16x16] = T264_satd_u_16x16_c;
  793.         t->cmp[MB_16x8]  = T264_satd_u_16x8_c;
  794.         t->cmp[MB_8x16]  = T264_satd_u_8x16_c;
  795.         t->cmp[MB_8x8]   = T264_satd_u_8x8_c;
  796.         t->cmp[MB_8x4]   = T264_satd_u_8x4_c;
  797.         t->cmp[MB_4x8]   = T264_satd_u_4x8_c;
  798.         t->cmp[MB_4x4]   = T264_satd_u_4x4_c;
  799.     }
  800.     t->sad[MB_16x16] = T264_sad_u_16x16_c;
  801.     t->sad[MB_16x8]  = T264_sad_u_16x8_c;
  802.     t->sad[MB_8x16]  = T264_sad_u_8x16_c;
  803.     t->sad[MB_8x8]   = T264_sad_u_8x8_c;
  804.     t->sad[MB_8x4]   = T264_sad_u_8x4_c;
  805.     t->sad[MB_4x8]   = T264_sad_u_4x8_c;
  806.     t->sad[MB_4x4]   = T264_sad_u_4x4_c;
  807.     t->fdct4x4   = dct4x4_c;
  808.     t->fdct4x4dc = dct4x4dc_c;
  809.     t->fdct2x2dc = dct2x2dc_c;
  810.     t->idct4x4   = idct4x4_c;
  811.     t->idct4x4dc = idct4x4dc_c;
  812.     t->idct2x2dc = idct2x2dc_c;
  813.     t->quant4x4    = quant4x4_c;
  814.     t->quant4x4dc  = quant4x4dc_c;
  815.     t->quant2x2dc  = quant2x2dc_c;
  816.     t->iquant4x4   = iquant4x4_c;
  817.     t->iquant4x4dc = iquant4x4dc_c;
  818.     t->iquant2x2dc = iquant2x2dc_c;
  819.     t->expand8to16   = expand8to16_c;
  820.     t->contract16to8 = contract16to8_c;
  821.     t->contract16to8add = contract16to8add_c;
  822.     t->expand8to16sub   = expand8to16sub_c;
  823.     t->memcpy_stride_u = memcpy_stride_u_c;
  824.     t->eighth_pixel_mc_u = T264_eighth_pixel_mc_u_c;
  825.     t->interpolate_halfpel_h = interpolate_halfpel_h_c;
  826.     t->interpolate_halfpel_v = interpolate_halfpel_v_c;
  827.     t->interpolate_halfpel_hv = interpolate_halfpel_hv_c;
  828.     //t->pixel_avg = T264_pixel_avg_c;  //modify by wushangyun for pia optimization
  829.     t->pia[MB_16x16] = T264_pia_u_16x16_c;
  830.     t->pia[MB_16x8]  = T264_pia_u_16x8_c;
  831.     t->pia[MB_8x16]  = T264_pia_u_8x16_c;
  832.     t->pia[MB_8x8]   = T264_pia_u_8x8_c;
  833.     t->pia[MB_8x4]   = T264_pia_u_8x4_c;
  834.     t->pia[MB_4x8]   = T264_pia_u_4x8_c;
  835.     t->pia[MB_4x4]   = T264_pia_u_4x4_c;
  836.     t->pia[MB_2x2]   = T264_pia_u_2x2_c;
  837.     t->T264_satd_16x16_u = T264_satd_i16x16_u_c;
  838.     t->emms = T264_emms_c;
  839.     
  840.     // flags relative
  841.     if (t->flags & USE_FULLSEARCH)
  842.         t->search = T264_spiral_search_full;
  843.     else if (t->flags & USE_DIAMONDSEACH)
  844.         t->search = T264_search;
  845.     else
  846.         t->search = T264_search_full;
  847. #ifndef CHIP_DM642
  848.     if (t->param.cpu & T264_CPU_MMX)
  849.     {
  850.         t->emms = T264_emms_mmx;
  851.         t->fdct4x4 = dct4x4_mmx;
  852.         t->fdct4x4dc = dct4x4dc_mmx;
  853.         t->idct4x4 = idct4x4_mmx;
  854.         t->idct4x4dc = idct4x4dc_mmx;
  855.     t->contract16to8add = contract16to8add_mmx;
  856.     t->expand8to16sub   = expand8to16sub_mmx;
  857.     
  858.         t->pia[MB_4x8]   = T264_pia_u_4x8_mmx;
  859.         t->pia[MB_4x4]   = T264_pia_u_4x4_mmx;
  860.     }
  861.     if (t->param.cpu & T264_CPU_SSE)
  862.     {
  863.         if (t->flags & USE_SAD)
  864.         {
  865.             t->cmp[MB_8x16]  = T264_sad_u_8x16_sse;
  866.             t->cmp[MB_8x8]   = T264_sad_u_8x8_sse;
  867.             t->cmp[MB_8x4]   = T264_sad_u_8x4_sse;
  868.             t->cmp[MB_4x8]   = T264_sad_u_4x8_sse;
  869.             t->cmp[MB_4x4]   = T264_sad_u_4x4_sse;
  870.         }
  871.         t->pia[MB_16x16] = T264_pia_u_16x16_sse;
  872.         t->pia[MB_16x8]  = T264_pia_u_16x8_sse;
  873.         t->pia[MB_8x16]  = T264_pia_u_8x16_sse;
  874.         t->pia[MB_8x8]   = T264_pia_u_8x8_sse;
  875.         t->pia[MB_8x4]   = T264_pia_u_8x4_sse;
  876.         t->sad[MB_8x16]  = T264_sad_u_8x16_sse;
  877.         t->sad[MB_8x8]   = T264_sad_u_8x8_sse;
  878.         t->sad[MB_8x4]   = T264_sad_u_8x4_sse;
  879.         t->sad[MB_4x8]   = T264_sad_u_4x8_sse;
  880.         t->sad[MB_4x4]   = T264_sad_u_4x4_sse;
  881.     }
  882.     if (t->param.cpu & T264_CPU_SSE2)
  883.     {
  884.         t->quant4x4 = quant4x4_sse2;
  885.         t->iquant4x4 = iquant4x4_sse2;
  886.         if (t->flags & USE_SAD)
  887.         {
  888.             t->cmp[MB_16x16] = T264_sad_u_16x16_sse2;
  889.             t->cmp[MB_16x8]  = T264_sad_u_16x8_sse2;
  890.         }
  891.         t->sad[MB_16x16] = T264_sad_u_16x16_sse2;
  892.         t->sad[MB_16x8]  = T264_sad_u_16x8_sse2;
  893.         t->interpolate_halfpel_h = interpolate_halfpel_h_sse2;
  894.         t->interpolate_halfpel_v = interpolate_halfpel_v_sse2;
  895.         t->pia[MB_16x16] = T264_pia_u_16x16_sse2;
  896.         t->pia[MB_16x8]  = T264_pia_u_16x8_sse2;
  897.     }
  898. #endif    
  899. }
  900. static void __inline
  901. T264_init_frame(T264_t* t, uint8_t* src, T264_frame_t* f, int32_t poc)
  902. {
  903.     f->Y[0] = src;
  904.     f->U = f->Y[0] + t->width * t->height;
  905.     f->V = f->U + (t->width * t->height >> 2);
  906.     f->poc = poc;
  907. }
  908. static void __inline
  909. T264_pending_bframe(T264_t* t, uint8_t* src, int32_t poc)
  910. {
  911.     T264_frame_t* f = &t->pending_bframes[t->pending_bframes_num ++];
  912.     memcpy(f->Y[0], src, t->height * t->width + (t->height * t->width >> 1));
  913.     f->poc = poc;
  914. }
  915. // get non zero count & cbp
  916. void
  917. T264_mb_encode_post(T264_t* t)
  918. {
  919.     int32_t i, j;
  920. //for CABAC
  921. int32_t dc_nz, dc_nz0, dc_nz1, cbp_dc;
  922. cbp_dc = 0;
  923.     if (t->mb.mb_mode == I_16x16)
  924.     {
  925.         t->mb.cbp_y = 0;
  926.         for(i = 0; i < 16 ; i ++)
  927.         {
  928.             int32_t x, y;
  929.             const int32_t nz = array_non_zero_count(&(t->mb.dct_y_z[i][1]), 15);
  930.             x = luma_inverse_x[i];
  931.             y = luma_inverse_y[i];
  932.             t->mb.nnz[luma_index[i]] = nz;
  933.             t->mb.nnz_ref[NNZ_LUMA + y * 8 + x] = nz;
  934.             if( nz > 0 )
  935.             {
  936.                 t->mb.cbp_y = 0x0f;
  937.             }
  938.         }
  939. //for CABAC, record the DC non_zero
  940. dc_nz = array_non_zero_count(&(t->mb.dc4x4_z[0]), 16);
  941. if(dc_nz != 0)
  942. {
  943. cbp_dc = 1;
  944. }
  945.     }
  946.     else
  947.     {
  948.         t->mb.cbp_y = 0;
  949.         for(i = 0; i < 16; i ++)
  950.         {
  951.             int32_t x, y;
  952.             const int32_t nz = array_non_zero_count(t->mb.dct_y_z[i], 16);
  953.             x = luma_inverse_x[i];
  954.             y = luma_inverse_y[i];
  955.             t->mb.nnz[luma_index[i]] = nz;
  956.             t->mb.nnz_ref[NNZ_LUMA + y * 8 + x] = nz;
  957.             if( nz > 0 )
  958.             {
  959.                 t->mb.cbp_y |= 1 << (i / 4);
  960.             }
  961.         }
  962.     }
  963.     /* Calculate the chroma patern */
  964.     t->mb.cbp_c = 0;
  965.     for(i = 0; i < 8; i ++)
  966.     {
  967.         int32_t x, y;
  968.         const int nz = array_non_zero_count(&(t->mb.dct_uv_z[i / 4][i % 4][1]), 15);
  969.         t->mb.nnz[i + 16] = nz;
  970.         if (i < 4)
  971.         {
  972.             x = i % 2;
  973.             y = i / 2;
  974.             t->mb.nnz_ref[NNZ_CHROMA0 + y * 8 + x] = nz;
  975.         }
  976.         else
  977.         {
  978.             int32_t j = i - 4;
  979.             x = j % 2;
  980.             y = j / 2;
  981.             t->mb.nnz_ref[NNZ_CHROMA1 + y * 8 + x] = nz;
  982.         }
  983.         if( nz > 0 )
  984.         {
  985.             t->mb.cbp_c = 0x02;    /* dc+ac */
  986.         }
  987.     }
  988. //for CABAC, chroma dc pattern
  989. dc_nz0 = array_non_zero_count(t->mb.dc2x2_z[0], 4) > 0;
  990. dc_nz1 = array_non_zero_count(t->mb.dc2x2_z[1], 4) > 0;
  991.     if(t->mb.cbp_c == 0x00 &&
  992.        (dc_nz0 || dc_nz1))
  993.     {
  994.         t->mb.cbp_c = 0x01;    /* dc only */
  995.     }
  996. if(dc_nz0)
  997. cbp_dc |= 0x02;
  998. if(dc_nz1)
  999. cbp_dc |= 0x04;
  1000.     // really decide SKIP mode
  1001.     if(t->slice_type == SLICE_P)
  1002.     {
  1003.         if (t->mb.mb_part == MB_16x16 && t->mb.cbp_y == 0 && t->mb.cbp_c == 0 && t->mb.vec[0][0].refno == 0)
  1004.         {
  1005.             T264_vector_t vec;
  1006.             T264_predict_mv_skip(t, 0, &vec);
  1007.             if (vec.x == t->mb.vec[0][0].x &&
  1008.                 vec.y == t->mb.vec[0][0].y)
  1009.             {
  1010.                 t->mb.mb_part = MB_16x16;
  1011.                 t->mb.mb_mode = P_SKIP;
  1012.             }
  1013.         }
  1014.     }
  1015.     else if (t->slice_type == SLICE_B)
  1016.     {
  1017.         if (t->mb.is_copy && t->mb.cbp_y == 0 && t->mb.cbp_c == 0)
  1018.         {
  1019.             t->mb.mb_mode = B_SKIP;
  1020.         }
  1021.     }
  1022.     if (t->mb.mb_mode == I_4x4)
  1023.     {
  1024.         int8_t* p = t->mb.i4x4_pred_mode_ref;
  1025.         for(i = 0; i < 16 ; i ++)
  1026.         {
  1027.             int32_t x, y;
  1028.             x = luma_inverse_x[i];
  1029.             y = luma_inverse_y[i];
  1030.             p[IPM_LUMA + y * 8 + x] = t->mb.mode_i4x4[i];
  1031.         }
  1032.     }
  1033.     else
  1034.     {
  1035.         memset(t->mb.mode_i4x4, Intra_4x4_DC, 16 * sizeof(uint8_t));
  1036.     }
  1037.     if (t->mb.mb_mode != I_4x4 && t->mb.mb_mode != I_16x16)
  1038.     {
  1039.         for(i = 0 ; i < 16 ; i ++)
  1040.         {
  1041.             int32_t x, y;
  1042.             x = i % 4;
  1043.             y = i / 4;
  1044.             t->mb.vec_ref[VEC_LUMA + y * 8 + x].vec[0]     = t->mb.vec[0][i];
  1045.             t->mb.vec_ref[VEC_LUMA + y * 8 + x].vec[1]     = t->mb.vec[1][i];
  1046.             t->mb.vec_ref[VEC_LUMA + y * 8 + x].part    = t->mb.mb_part;
  1047.             t->mb.vec_ref[VEC_LUMA + y * 8 + x].subpart = t->mb.submb_part[i];
  1048.         }
  1049.     }
  1050.     else
  1051.     {
  1052.         memset(t->mb.submb_part, -1, sizeof(uint8_t) * 16);//t->mb.submb_part));
  1053.         t->mb.mb_part = -1;
  1054. #define INITINVALIDVEC(vec) vec.refno = -1; vec.x = vec.y = 0;
  1055.         for(i = 0 ; i < 2 ; i ++)
  1056.         {
  1057.             for(j = 0 ; j < 16 ; j ++)
  1058.             {
  1059.                 INITINVALIDVEC(t->mb.vec[i][j]);
  1060.             }
  1061.         }
  1062.     }
  1063. #undef INITINVALIDVEC
  1064. //for CABAC, cbp
  1065. t->mb.cbp = t->mb.cbp_y | (t->mb.cbp_c<<4) | (cbp_dc << 8);
  1066. }
  1067. static uint32_t
  1068. write_dst(uint8_t* src, int32_t nal_pos[4], int32_t nal_num, uint8_t* dst, int32_t dst_size)
  1069. {
  1070.     int32_t i, j, n;
  1071.     int32_t count;
  1072.     int32_t nal_len;
  1073.     n = 0;
  1074.     for(i = 0 ; i < nal_num - 1; i ++)
  1075.     {
  1076.         nal_len = nal_pos[i + 1] - nal_pos[i];
  1077.         
  1078.         // start code 00 00 00 01
  1079.         dst[n ++] = src[0];
  1080.         dst[n ++] = src[1];
  1081.         dst[n ++] = src[2];
  1082.         dst[n ++] = src[3];
  1083.         count = 0;
  1084.         for(j = 4 ; j < nal_len - 1; j ++)
  1085.         {
  1086.             if (src[j] == 0)
  1087.             {
  1088.                 count ++;
  1089.                 if (count >= 2 && src[j + 1] <= 3)
  1090.                 {
  1091.                     dst[n ++] = 0;
  1092.                     dst[n ++] = 3;
  1093.                     count = 0;
  1094.                     continue;
  1095.                 }
  1096.             }
  1097.             else
  1098.             {
  1099.                 count = 0;
  1100.             }
  1101.             dst[n ++] = src[j];
  1102.         }
  1103.         dst[n ++] = src[j];
  1104.         src += nal_len;
  1105.     }
  1106.     return n;
  1107. }
  1108. ///////////////////////////////////////////////////////////
  1109. // interface
  1110. T264_t*
  1111. T264_open(T264_param_t* para)
  1112. {
  1113.     T264_t* t;
  1114.     int32_t i;
  1115.     //
  1116.     // TODO: here check the input param if it is valid
  1117.     //
  1118.     if (para->flags & USE_FORCEBLOCKSIZE)
  1119.         para->flags |= USE_SUBBLOCK;
  1120.     if (para->flags & USE_QUARTPEL)
  1121.         para->flags |= USE_HALFPEL;
  1122.     t = T264_malloc(sizeof(T264_t), CACHE_SIZE);
  1123.     memset(t, 0, sizeof(T264_t));
  1124.     t->mb_width  = para->width >> 4;
  1125.     t->mb_height = para->height >> 4;
  1126.     t->mb_stride = t->mb_width;
  1127.     t->width  = t->mb_width << 4;
  1128.     t->height = t->mb_height << 4;
  1129.     t->edged_width = t->width + 2 * EDGED_WIDTH;
  1130.     t->edged_height = t->height + 2 * EDGED_HEIGHT;
  1131.     t->qp_y   = para->qp;
  1132.     t->flags  = para->flags;
  1133.     t->stride    = t->width;
  1134.     t->stride_uv = t->width >> 1;
  1135.     t->edged_stride = t->edged_width;
  1136.     t->edged_stride_uv = t->edged_width >> 1;
  1137.     t->bs = T264_malloc(sizeof(bs_t), CACHE_SIZE);
  1138.     t->bs_buf = T264_malloc(t->width * t->height << 1, CACHE_SIZE);
  1139.     para->direct_flag = 1;  /* force direct mode */
  1140.     if (para->b_num)
  1141.         para->ref_num ++;
  1142.     for(i = 0 ; i < para->ref_num + 1 ; i ++)
  1143.     {
  1144.         uint8_t* p = T264_malloc(t->edged_width * t->edged_height + (t->edged_width * t->edged_height >> 1), CACHE_SIZE);
  1145.         t->refn[i].Y[0] = p + EDGED_HEIGHT * t->edged_width + EDGED_WIDTH;
  1146.         t->refn[i].U = p + t->edged_width * t->edged_height + (t->edged_width * EDGED_HEIGHT >> 2) + (EDGED_WIDTH >> 1);
  1147.         t->refn[i].V = p + t->edged_width * t->edged_height + (t->edged_width * t->edged_height >> 2) + (t->edged_width * EDGED_HEIGHT >> 2) + (EDGED_WIDTH >> 1);
  1148.         t->refn[i].mb = T264_malloc(t->mb_height * t->mb_width * sizeof(T264_mb_context_t), CACHE_SIZE);
  1149.         p = T264_malloc(t->edged_width * t->edged_height * 3, CACHE_SIZE);
  1150.         t->refn[i].Y[1] = p + EDGED_HEIGHT * t->edged_width + EDGED_WIDTH;
  1151.         t->refn[i].Y[2] = t->refn[i].Y[1] + t->edged_width * t->edged_height;
  1152.         t->refn[i].Y[3] = t->refn[i].Y[2] + t->edged_width * t->edged_height;
  1153.     }
  1154.     for(i = 0 ; i < para->b_num ; i ++)
  1155.     {
  1156.         t->pending_bframes[i].Y[0] = T264_malloc(t->width * t->height + (t->width * t->height >> 1), CACHE_SIZE);
  1157.     }
  1158.     t->param = *para;
  1159.     t->idr_pic_id = -1;
  1160.     t->frame_id = 0;
  1161.     t->last_i_frame_id = 0;
  1162.     T264_init_cpu(t);
  1163.     if (para->enable_rc)
  1164.     {
  1165.         rc_create(t, &t->plugins[t->plug_num]);
  1166.         t->plugins[t->plug_num].proc(t, t->plugins[t->plug_num].handle, STATE_BEFORESEQ);
  1167.         t->plug_num ++;
  1168.     }
  1169.     if (para->enable_stat)
  1170.     {
  1171.         stat_create(t, &t->plugins[t->plug_num]);
  1172.         t->plugins[t->plug_num].proc(t, t->plugins[t->plug_num].handle, STATE_BEFORESEQ);
  1173.         t->plug_num ++;
  1174.     }
  1175.     if (t->flags & USE_EXTRASUBPELSEARCH)
  1176.         t->subpel_pts = 8;
  1177.     else
  1178.         t->subpel_pts = 4;
  1179.     return t;
  1180. }
  1181. void
  1182. T264_close(T264_t* t)
  1183. {
  1184.     int32_t i;
  1185.     for(i = 0 ; i < t->param.ref_num + 1 ; i ++)
  1186.     {
  1187.         T264_free(t->refn[i].Y[0] - (EDGED_HEIGHT * t->edged_width + EDGED_WIDTH));
  1188.         T264_free(t->refn[i].mb);
  1189.         T264_free(t->refn[i].Y[1] - (EDGED_HEIGHT * t->edged_width + EDGED_WIDTH));
  1190.     }
  1191.     for(i = 0 ; i < t->plug_num ; i ++)
  1192.     {
  1193.         t->plugins[i].close(t, &t->plugins[i]);
  1194.     }
  1195.     for(i = 0 ; i < t->param.b_num ; i ++)
  1196.     {
  1197.         T264_free(t->pending_bframes[i].Y[0]);
  1198.     }
  1199.     T264_free(t->bs_buf);
  1200.     T264_free(t->bs);
  1201.     T264_free(t);
  1202. }
  1203. static void __inline
  1204. T264_encode_frame(T264_t* t)
  1205. {
  1206.     int32_t i, j;
  1207. //for test, to be cleaned
  1208. //extern int frame_cabac, mb_cabac, slice_type_cabac;
  1209.     T264_load_ref(t);
  1210.     slice_header_init(t, &t->slice);
  1211.     slice_header_write(t, &t->slice);
  1212.     t->header_bits = eg_len(t->bs) * 8;
  1213.     t->sad_all = 0;
  1214. //for CABAC
  1215. if( t->param.cabac )
  1216. {
  1217. /* alignment needed */
  1218. BitstreamPadOne( t->bs );
  1219. /* init cabac */
  1220. T264_cabac_context_init( &t->cabac, t->slice_type, t->ps.pic_init_qp_minus26+26+t->slice.slice_qp_delta, t->slice.cabac_init_idc );
  1221. T264_cabac_encode_init ( &t->cabac, t->bs );
  1222. }
  1223.     for(i = 0 ; i < t->mb_height ; i ++)
  1224.     {
  1225.         for(j = 0 ; j < t->mb_width ; j ++)
  1226.         {
  1227.             T264_mb_load_context(t, i, j);
  1228.             T264_mb_mode_decision(t);
  1229.             T264_mb_encode(t);
  1230.             T264_mb_encode_post(t);
  1231. if(t->param.cabac)
  1232. {
  1233. T264_mb_save_context(t);
  1234. }
  1235. //SKIP
  1236.             if(t->mb.mb_mode == P_SKIP || t->mb.mb_mode == B_SKIP)
  1237.             {
  1238. if( t->param.cabac )
  1239. {
  1240. if( t->mb.mb_xy > 0 )
  1241. {
  1242. /* not end_of_slice_flag */
  1243. T264_cabac_encode_terminal( &t->cabac, 0 );
  1244. }
  1245. T264_cabac_mb_skip( t, 1 );
  1246. //for CABAC, set MVD to zero
  1247. memset(&(t->mb.context->mvd[0][0][0]), 0, sizeof(t->mb.context->mvd));
  1248. }
  1249. else
  1250. {
  1251.                     t->skip ++;
  1252.                 }
  1253.             }
  1254.             else
  1255.             {
  1256. if( t->param.cabac )
  1257. {
  1258. //for CABAC, set MVD to zero
  1259. memset(&(t->mb.mvd[0][0][0]), 0, sizeof(t->mb.mvd));
  1260. if( t->mb.mb_xy > 0 )
  1261. {
  1262. /* not end_of_slice_flag */
  1263. T264_cabac_encode_terminal( &t->cabac, 0 );
  1264. }
  1265. if( t->slice_type != SLICE_I )
  1266. {
  1267. T264_cabac_mb_skip( t, 0 );
  1268. }
  1269. T264_macroblock_write_cabac( t, t->bs );
  1270. memcpy(&(t->mb.context->mvd[0][0][0]), &(t->mb.mvd[0][0][0]), sizeof(t->mb.context->mvd));
  1271. }
  1272.                 else
  1273.                 {
  1274.                     T264_macroblock_write_cavlc(t);
  1275.                 }
  1276.             }
  1277. if(!t->param.cabac)
  1278. {
  1279.                 T264_mb_save_context(t);
  1280. }
  1281.             t->sad_all += t->mb.sad;
  1282.         }
  1283.     }
  1284. if( t->param.cabac )
  1285. {
  1286. /* end of slice */
  1287. T264_cabac_encode_terminal( &t->cabac, 1 );
  1288. }
  1289. else if (t->skip > 0)
  1290.     {
  1291.         eg_write_ue(t->bs, t->skip);
  1292.         t->skip = 0;
  1293.     }
  1294. if( t->param.cabac )
  1295. {
  1296. int i_cabac_word;
  1297. int pos;
  1298. T264_cabac_encode_flush( &t->cabac );
  1299. /* TODO cabac stuffing things (p209) */
  1300. pos = BitstreamPos( t->bs)/8;
  1301. i_cabac_word = (((3 * t->cabac.i_sym_cnt - 3 * 96 * t->mb_width * t->mb_height)/32) - pos)/3;
  1302. while( i_cabac_word > 0 )
  1303. {
  1304. BitstreamPutBits( t->bs, 16, 0x0000 );
  1305. i_cabac_word--;
  1306. }
  1307. }
  1308.     /* update current pic */
  1309.     if (t->slice_type != SLICE_B)
  1310.     {
  1311.         T264_save_ref(t);
  1312.         t->frame_num = (t->frame_num + 1) % (1 << (t->ss.log2_max_frame_num_minus4 + 4));
  1313.         t->poc += 2;
  1314.     }
  1315.     rbsp_trailing_bits(t);
  1316.     eg_flush(t->bs);
  1317. //for CABAC
  1318. if( t->param.cabac )
  1319. {
  1320. T264_cabac_model_update( &t->cabac, t->slice_type, t->ps.pic_init_qp_minus26+26 + t->slice.slice_qp_delta );
  1321. }
  1322. }
  1323. static int32_t __inline
  1324. T264_flush_frames(T264_t* t, uint8_t* dst, int32_t dst_size)
  1325. {
  1326.     int32_t i, j = 0;
  1327.     int32_t nal_pos[4];     // remember each nal start pos
  1328.     int32_t nal_num;
  1329.     int32_t len = 0;
  1330.     int32_t old_poc = t->poc;
  1331.     // b frames
  1332.     while (t->pending_bframes_num)
  1333.     {
  1334.         t->pending_bframes_num --;
  1335.         t->poc = t->pending_bframes[j].poc;
  1336.         eg_init(t->bs, t->bs_buf, dst_size);
  1337.         T264_init_frame(t, t->pending_bframes[j].Y[0], &t->cur, t->poc);
  1338.         nal_num = 0;
  1339.         nal_pos[nal_num ++] = eg_len(t->bs);
  1340.         nal_unit_init(&t->nal, 0, NAL_SLICE_NOPART);
  1341.         nal_unit_write(t, &t->nal);
  1342.         t->slice_type        = SLICE_B;
  1343.         for(i = 0 ; i < t->plug_num ; i ++)
  1344.         {
  1345.             t->plugins[i].proc(t, t->plugins[i].handle, STATE_BEFOREPIC);
  1346.         }
  1347. T264_encode_frame(t);
  1348.         nal_pos[nal_num ++] = eg_len(t->bs);
  1349.         len += write_dst(t->bs_buf, nal_pos, nal_num, dst + len, dst_size - len);
  1350.         t->emms();
  1351.  
  1352.         t->frame_bits = len * 8;
  1353.         for(i = 0 ; i < t->plug_num ; i ++)
  1354.         {
  1355.             t->plugins[i].proc(t, t->plugins[i].handle, STATE_AFTERPIC);
  1356.         }
  1357.         j ++;
  1358.     }
  1359.     t->poc = old_poc;
  1360.     return len;
  1361. }
  1362. int32_t
  1363. T264_encode(T264_t* t, uint8_t* src, uint8_t* dst, int32_t dst_size)
  1364. {
  1365.     int32_t i;
  1366.     int32_t nal_pos[5];     // remember each nal start pos
  1367.     int32_t nal_num = 0;
  1368.     int32_t len;
  1369.     eg_init(t->bs, t->bs_buf, dst_size);
  1370.     T264_init_frame(t, src, &t->cur, t->poc);
  1371.     t->slice_type = decision_slice_type(t);
  1372.     switch (t->slice_type)
  1373.     {
  1374.     case SLICE_P:
  1375.         nal_pos[nal_num ++] = eg_len(t->bs);
  1376.         nal_unit_init(&t->nal, 1, NAL_SLICE_NOPART);
  1377.         nal_unit_write(t, &t->nal);
  1378.         break;
  1379.     case SLICE_B:
  1380.         // buffer b frame
  1381.         T264_pending_bframe(t, src, t->poc);
  1382.         t->poc += 2;
  1383.         t->frame_id ++;
  1384.         t->frame_no ++;
  1385.         return 0;
  1386.     case SLICE_I:
  1387.         nal_pos[nal_num ++] = eg_len(t->bs);
  1388.         nal_unit_init(&t->nal, 1, NAL_SLICE_NOPART);
  1389.         nal_unit_write(t, &t->nal);
  1390.         /* reset when begin a new gop */
  1391.         t->frame_no = 0;
  1392.         t->last_i_frame_id = t->frame_id;
  1393.         for(i = 0 ; i < t->plug_num ; i ++)
  1394.         {
  1395.             t->plugins[i].proc(t, t->plugins[i].handle, STATE_BEFOREGOP);
  1396.         }
  1397.         break;
  1398.     case SLICE_IDR:
  1399.         // fixed slice type
  1400.         t->slice_type = SLICE_I;
  1401.         if (t->frame_id == 0)
  1402.         {
  1403.             /* only write once */
  1404.             T264_custom_set_t set;
  1405.             nal_pos[nal_num ++] = eg_len(t->bs);
  1406.             nal_unit_init(&t->nal, 1, NAL_CUSTOM_SET);
  1407.             nal_unit_write(t, &t->nal);
  1408.             custom_set_init(t, &set);
  1409.             custom_set_write(t, &set);
  1410.         }
  1411.         // first flush b frames
  1412.         len = T264_flush_frames(t, dst, dst_size);
  1413.         dst += len;
  1414.         dst_size -= len;
  1415.         len = 0;
  1416.         nal_pos[nal_num ++] = eg_len(t->bs);
  1417.         nal_unit_init(&t->nal, 1, NAL_SEQ_SET);
  1418.         nal_unit_write(t, &t->nal);
  1419.         seq_set_init(t, &t->ss);
  1420.         seq_set_write(t, &t->ss);
  1421.         nal_pos[nal_num ++] = eg_len(t->bs);
  1422.         nal_unit_init(&t->nal, 1, NAL_PIC_SET);
  1423.         nal_unit_write(t, &t->nal);
  1424.         pic_set_init(t, &t->ps);
  1425.         pic_set_write(t, &t->ps);
  1426.         nal_pos[nal_num ++] = eg_len(t->bs);
  1427.         nal_unit_init(&t->nal, 1, NAL_SLICE_IDR);
  1428.         nal_unit_write(t, &t->nal);
  1429.         t->idr_pic_id = (t->idr_pic_id + 1) % 65535;
  1430.         t->frame_num = 0;
  1431.         t->last_i_frame_id = t->frame_id;
  1432.         /* reset when begin a new gop */
  1433.         t->frame_no = 0;
  1434.         t->poc = 0;
  1435.         T264_reset_ref(t);
  1436.         for(i = 0 ; i < t->plug_num ; i ++)
  1437.         {
  1438.             t->plugins[i].proc(t, t->plugins[i].handle, STATE_BEFOREGOP);
  1439.         }
  1440.         break;
  1441.     default:
  1442.         assert(0);
  1443.         break;
  1444.     }
  1445.     t->frame_id ++;
  1446.     t->frame_no ++;
  1447.     for(i = 0 ; i < t->plug_num ; i ++)
  1448.     {
  1449.         t->plugins[i].proc(t, t->plugins[i].handle, STATE_BEFOREPIC);
  1450.     }
  1451.     // i or p frame
  1452.     T264_encode_frame(t);
  1453.     nal_pos[nal_num ++] = eg_len(t->bs);
  1454.     len = write_dst(t->bs_buf, nal_pos, nal_num, dst, dst_size);
  1455.     t->emms();
  1456.     t->frame_bits = len * 8;
  1457.     for(i = 0 ; i < t->plug_num ; i ++)
  1458.     {
  1459.         t->plugins[i].proc(t, t->plugins[i].handle, STATE_AFTERPIC);
  1460.     }
  1461.     len += T264_flush_frames(t, dst + len, dst_size - len);
  1462.     return len;
  1463. }