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

mpeg/mp3

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *
  3. *  T264 AVC CODEC
  4. *
  5. *  Copyright(C) 2004-2005 joylife <joylife_video@yahoo.com.cn>
  6. * 2004-2005 tricro <tricro@hotmail.com>
  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. /*****************************************************************************
  24.  * cabac.c: h264 encoder library
  25.  *****************************************************************************
  26.  * Copyright (C) 2003 Laurent Aimar
  27.  *
  28.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  29.  *
  30.  * This program is free software; you can redistribute it and/or modify
  31.  * it under the terms of the GNU General Public License as published by
  32.  * the Free Software Foundation; either version 2 of the License, or
  33.  * (at your option) any later version.
  34.  *
  35.  * This program is distributed in the hope that it will be useful,
  36.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  37.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  38.  * GNU General Public License for more details.
  39.  *
  40.  * You should have received a copy of the GNU General Public License
  41.  * along with this program; if not, write to the Free Software
  42.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  43.  *****************************************************************************/
  44. /*Note: the CABAC routine is currently referenced from x264 temporarily, with adaptation to 
  45.  *the data structure of T264. It should be modified further in the near future.
  46.  *It's can support B slice, but only with MB mode P16x16, P16x8, P8x16, Direct16x16, B_SKIP
  47.  *ie., B8x8 is not support now
  48. */
  49. #include <stdlib.h>
  50. #include <stdio.h>
  51. #include <string.h>
  52. #include <assert.h>
  53. #include "T264.h"
  54. #include "cabac_engine.h"
  55. #include "inter.h"
  56. /* From ffmpeg
  57. */
  58. #define T264_SCAN8_SIZE (6*8)
  59. #define T264_SCAN8_0 (4+1*8)
  60. static const int T264_scan8[16+2*4] =
  61. {
  62. /* Luma */
  63. VEC_LUMA + 0, VEC_LUMA + 1, VEC_LUMA + 1*8 + 0, VEC_LUMA + 1*8 + 1,
  64. VEC_LUMA + 2, VEC_LUMA + 3, VEC_LUMA + 1*8 + 2, VEC_LUMA + 1*8 + 3,
  65. VEC_LUMA + 2*8 + 0, VEC_LUMA + 2*8 + 1, VEC_LUMA + 3*8 + 0, VEC_LUMA + 3*8 + 1,
  66. VEC_LUMA + 2*8 + 2, VEC_LUMA + 2*8 + 3, VEC_LUMA + 3*8 + 2, VEC_LUMA + 3*8 + 3,
  67. /* Cb */
  68. NNZ_CHROMA0 + 0, NNZ_CHROMA0 + 1,
  69. NNZ_CHROMA0 + 1*8 + 0, NNZ_CHROMA0 + 1*8 + 1,
  70. /* Cr */
  71. NNZ_CHROMA1 + 0, NNZ_CHROMA1 + 1,
  72. NNZ_CHROMA1 + 1*8 + 0, NNZ_CHROMA1 + 1*8 + 1,
  73. };
  74. static const uint8_t block_idx_xy[4][4] =
  75. {
  76. { 0, 2, 8,  10},
  77. { 1, 3, 9,  11},
  78. { 4, 6, 12, 14},
  79. { 5, 7, 13, 15}
  80. };
  81. #define IS_INTRA(mode) (mode == I_4x4 || mode == I_16x16)
  82. #define IS_SKIP(type)  ( (type) == P_SKIP || (type) == B_SKIP )
  83. enum {
  84. INTRA_4x4           = 0,
  85. INTRA_16x16         = 1,
  86. INTRA_PCM           = 2,
  87. P_L0            = 3,
  88. P_8x81          = 4,
  89. P_SKIP1         = 5,
  90. B_DIRECT        = 6,
  91. B_L0_L0         = 7,
  92. B_L0_L1         = 8,
  93. B_L0_BI         = 9,
  94. B_L1_L0         = 10,
  95. B_L1_L1         = 11,
  96. B_L1_BI         = 12,
  97. B_BI_L0         = 13,
  98. B_BI_L1         = 14,
  99. B_BI_BI         = 15,
  100. B_8x81          = 16,
  101. B_SKIP1         = 17,
  102. };
  103. static const int T264_mb_partition_listX_table[][2] = 
  104. {
  105. {0, 0}, //B_DIRECT_8x8 = 100,
  106. {1, 0}, //B_L0_8x8,
  107. {0, 1}, //B_L1_8x8,
  108. {1, 1}, //B_Bi_8x8,
  109. {1, 0}, //B_L0_8x4,
  110. {1, 0}, //B_L0_4x8,
  111. {0, 1}, //B_L1_8x4,
  112. {0, 1}, //B_L1_4x8,
  113. {1, 1}, //B_Bi_8x4,
  114. {1, 1}, //B_Bi_4x8,
  115. {1, 0}, //B_L0_4x4,
  116. {0, 1}, //B_L1_4x4,
  117. {1, 1} //B_Bi_4x4
  118. };
  119. static const int T264_mb_type_list0_table[18][2] =
  120. {
  121. {0,0}, {0,0}, {0,0},    /* INTRA */
  122. {1,1},                  /* P_L0 */
  123. {0,0},                  /* P_8x8 */
  124. {1,1},                  /* P_SKIP */
  125. {0,0},                  /* B_DIRECT */
  126. {1,1}, {1,0}, {1,1},    /* B_L0_* */
  127. {0,1}, {0,0}, {0,1},    /* B_L1_* */
  128. {1,1}, {1,0}, {1,1},    /* B_BI_* */
  129. {0,0},                  /* B_8x8 */
  130. {0,0}                   /* B_SKIP */
  131. };
  132. static const int T264_mb_type_list1_table[18][2] =
  133. {
  134. {0,0}, {0,0}, {0,0},    /* INTRA */
  135. {0,0},                  /* P_L0 */
  136. {0,0},                  /* P_8x8 */
  137. {0,0},                  /* P_SKIP */
  138. {0,0},                  /* B_DIRECT */
  139. {0,0}, {0,1}, {0,1},    /* B_L0_* */
  140. {1,0}, {1,1}, {1,1},    /* B_L1_* */
  141. {1,0}, {1,1}, {1,1},    /* B_BI_* */
  142. {0,0},                  /* B_8x8 */
  143. {0,0}                   /* B_SKIP */
  144. };
  145. static void T264_cabac_mb_type( T264_t *t )
  146. {
  147. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  148.     int32_t mb_mode = t->mb.mb_mode;
  149.     if( t->slice_type == SLICE_I )
  150.     {
  151.         int ctx = 0;
  152.         if( t->mb.mb_x > 0 && mb_ctxs[t->mb.mb_xy-1].mb_mode != I_4x4 )
  153.         {
  154.             ctx++;
  155.         }
  156.         if( t->mb.mb_y > 0 && mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode != I_4x4 )
  157.         {
  158.             ctx++;
  159.         }
  160.         if( mb_mode == I_4x4 )
  161.         {
  162.             T264_cabac_encode_decision( &t->cabac, 3 + ctx, 0 );
  163.         }
  164.         else if(mb_mode == I_16x16)   /* I_16x16 */
  165.         {
  166.             T264_cabac_encode_decision( &t->cabac, 3 + ctx, 1 );
  167.             T264_cabac_encode_terminal( &t->cabac, 0 );
  168.             T264_cabac_encode_decision( &t->cabac, 3 + 3, ( t->mb.cbp_y == 0 ? 0 : 1 ));
  169.             if( t->mb.cbp_c == 0 )
  170.             {
  171.                 T264_cabac_encode_decision( &t->cabac, 3 + 4, 0 );
  172.             }
  173.             else
  174.             {
  175.                 T264_cabac_encode_decision( &t->cabac, 3 + 4, 1 );
  176.                 T264_cabac_encode_decision( &t->cabac, 3 + 5, ( t->mb.cbp_c == 1 ? 0 : 1 ) );
  177.             }
  178.             T264_cabac_encode_decision( &t->cabac, 3 + 6, ( (t->mb.mode_i16x16 / 2) ? 1 : 0 ));
  179.             T264_cabac_encode_decision( &t->cabac, 3 + 7, ( (t->mb.mode_i16x16 % 2) ? 1 : 0 ));
  180.         }
  181. else /* I_PCM */
  182. {
  183. T264_cabac_encode_decision( &t->cabac, 3 + ctx, 1 );
  184. T264_cabac_encode_terminal( &t->cabac, 1 );
  185. }
  186.     }
  187.     else if( t->slice_type == SLICE_P )
  188.     {
  189.         /* prefix: 14, suffix: 17 */
  190.         if( mb_mode == P_MODE )
  191.         {
  192.             if( t->mb.mb_part == MB_16x16 )
  193.             {
  194.                 T264_cabac_encode_decision( &t->cabac, 14, 0 );
  195.                 T264_cabac_encode_decision( &t->cabac, 15, 0 );
  196.                 T264_cabac_encode_decision( &t->cabac, 16, 0 );
  197.             }
  198.             else if( t->mb.mb_part == MB_16x8 )
  199.             {
  200.                 T264_cabac_encode_decision( &t->cabac, 14, 0 );
  201.                 T264_cabac_encode_decision( &t->cabac, 15, 1 );
  202.                 T264_cabac_encode_decision( &t->cabac, 17, 1 );
  203.             }
  204.             else if( t->mb.mb_part == MB_8x16 )
  205.             {
  206.                 T264_cabac_encode_decision( &t->cabac, 14, 0 );
  207.                 T264_cabac_encode_decision( &t->cabac, 15, 1 );
  208.                 T264_cabac_encode_decision( &t->cabac, 17, 0 );
  209.             }
  210. else /* P8x8 mode */
  211. {
  212. T264_cabac_encode_decision( &t->cabac, 14, 0 );
  213. T264_cabac_encode_decision( &t->cabac, 15, 0 );
  214. T264_cabac_encode_decision( &t->cabac, 16, 1 );
  215. }
  216.         }
  217.         else if( mb_mode == I_4x4 )
  218.         {
  219.             /* prefix */
  220.             T264_cabac_encode_decision( &t->cabac, 14, 1 );
  221.             T264_cabac_encode_decision( &t->cabac, 17, 0 );
  222.         }
  223.         else if(mb_mode == I_16x16) /* intra 16x16 */
  224.         {
  225.             /* prefix */
  226.             T264_cabac_encode_decision( &t->cabac, 14, 1 );
  227.             /* suffix */
  228.             T264_cabac_encode_decision( &t->cabac, 17, 1 );
  229.             T264_cabac_encode_terminal( &t->cabac, 0 ); /*ctxIdx == 276 */
  230.             T264_cabac_encode_decision( &t->cabac, 17+1, ( t->mb.cbp_y == 0 ? 0 : 1 ));
  231.             if( t->mb.cbp_c == 0 )
  232.             {
  233.                 T264_cabac_encode_decision( &t->cabac, 17+2, 0 );
  234.             }
  235.             else
  236.             {
  237.                 T264_cabac_encode_decision( &t->cabac, 17+2, 1 );
  238.                 T264_cabac_encode_decision( &t->cabac, 17+2, ( t->mb.cbp_c == 1 ? 0 : 1 ) );
  239.             }
  240.             T264_cabac_encode_decision( &t->cabac, 17+3, ( (t->mb.mode_i16x16 / 2) ? 1 : 0 ));
  241.             T264_cabac_encode_decision( &t->cabac, 17+3, ( (t->mb.mode_i16x16 % 2) ? 1 : 0 ));
  242.         }
  243. else /* I_PCM */
  244. {
  245. /* prefix */
  246. T264_cabac_encode_decision( &t->cabac, 14, 1 );
  247. T264_cabac_encode_decision( &t->cabac, 17, 1 );
  248. T264_cabac_encode_terminal( &t->cabac, 1 ); /*ctxIdx == 276 */
  249. }
  250.     }
  251.     else if( t->slice_type == SLICE_B )
  252.     {
  253. int ctx = 0;
  254. if( t->mb.mb_x > 0 && mb_ctxs[t->mb.mb_xy-1].mb_mode != B_SKIP && !mb_ctxs[t->mb.mb_xy-1].is_copy )
  255. {
  256. ctx++;
  257. }
  258. if( t->mb.mb_y > 0 && mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode != B_SKIP && ! mb_ctxs[t->mb.mb_xy - t->mb_stride].is_copy)
  259. {
  260. ctx++;
  261. }
  262.         
  263.         if( t->mb.is_copy)
  264.         {
  265.             T264_cabac_encode_decision( &t->cabac, 27+ctx, 0 );
  266.         }
  267.         else if( t->mb.mb_part == MB_8x8 )
  268.         {
  269.             T264_cabac_encode_decision( &t->cabac, 27+ctx, 1 );
  270.             T264_cabac_encode_decision( &t->cabac, 27+3,   1 );
  271.             T264_cabac_encode_decision( &t->cabac, 27+4,   1 );
  272.             T264_cabac_encode_decision( &t->cabac, 27+5,   1 );
  273.             T264_cabac_encode_decision( &t->cabac, 27+5,   1 );
  274.             T264_cabac_encode_decision( &t->cabac, 27+5,   1 );
  275.         }
  276.         else if( IS_INTRA( mb_mode ) )
  277.         {
  278.             /* prefix */
  279.             T264_cabac_encode_decision( &t->cabac, 27+ctx, 1 );
  280.             T264_cabac_encode_decision( &t->cabac, 27+3,   1 );
  281.             T264_cabac_encode_decision( &t->cabac, 27+4,   1 );
  282.             T264_cabac_encode_decision( &t->cabac, 27+5,   1 );
  283.             T264_cabac_encode_decision( &t->cabac, 27+5,   0 );
  284.             T264_cabac_encode_decision( &t->cabac, 27+5,   1 );
  285.             /* Suffix */
  286.             if( mb_mode == I_4x4 )
  287.             {
  288.                 T264_cabac_encode_decision( &t->cabac, 32, 0 );
  289.             }
  290. else if(mb_mode == I_16x16)
  291. {
  292. T264_cabac_encode_decision( &t->cabac, 32, 1 );
  293. T264_cabac_encode_terminal( &t->cabac,     0 );
  294. /* TODO */
  295. T264_cabac_encode_decision( &t->cabac, 32+1, ( t->mb.cbp_y == 0 ? 0 : 1 ));
  296. if( t->mb.cbp_c == 0 )
  297. {
  298. T264_cabac_encode_decision( &t->cabac, 32+2, 0 );
  299. }
  300. else
  301. {
  302. T264_cabac_encode_decision( &t->cabac, 32+2, 1 );
  303. T264_cabac_encode_decision( &t->cabac, 32+2, ( t->mb.cbp_c == 1 ? 0 : 1 ) );
  304. }
  305. T264_cabac_encode_decision( &t->cabac, 32+3, ( (t->mb.mode_i16x16 / 2) ? 1 : 0 ));
  306. T264_cabac_encode_decision( &t->cabac, 32+3, ( (t->mb.mode_i16x16 % 2) ? 1 : 0 ));
  307. }
  308.             else /* I_PCM */
  309.             {
  310.                 T264_cabac_encode_decision( &t->cabac, 32, 1 );
  311.                 T264_cabac_encode_terminal( &t->cabac,     1 );
  312.             }
  313.             
  314.         }
  315.         else
  316.         {
  317.             static const int i_mb_len[21] =
  318.             {
  319.                 3, 6, 6,    /* L0 L0 */
  320.                 3, 6, 6,    /* L1 L1 */
  321.                 6, 7, 7,    /* BI BI */
  322.                 6, 6,       /* L0 L1 */
  323.                 6, 6,       /* L1 L0 */
  324.                 7, 7,       /* L0 BI */
  325.                 7, 7,       /* L1 BI */
  326.                 7, 7,       /* BI L0 */
  327.                 7, 7,       /* BI L1 */
  328.             };
  329.             static const int i_mb_bits[21][7] =
  330.             {
  331.                 { 1, 0, 0, },            { 1, 1, 0, 0, 0, 1, },    { 1, 1, 0, 0, 1, 0, },   /* L0 L0 */
  332.                 { 1, 0, 1, },            { 1, 1, 0, 0, 1, 1, },    { 1, 1, 0, 1, 0, 0, },   /* L1 L1 */
  333.                 { 1, 1, 0, 0, 0, 0 ,},   { 1, 1, 1, 1, 0, 0 , 0 }, { 1, 1, 1, 1, 0, 0 , 1 },/* BI BI */
  334.                 { 1, 1, 0, 1, 0, 1, },   { 1, 1, 0, 1, 1, 0, },     /* L0 L1 */
  335.                 { 1, 1, 0, 1, 1, 1, },   { 1, 1, 1, 1, 1, 0, },     /* L1 L0 */
  336.                 { 1, 1, 1, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 1 },   /* L0 BI */
  337.                 { 1, 1, 1, 0, 0, 1, 0 }, { 1, 1, 1, 0, 0, 1, 1 },   /* L1 BI */
  338.                 { 1, 1, 1, 0, 1, 0, 0 }, { 1, 1, 1, 0, 1, 0, 1 },   /* BI L0 */
  339.                 { 1, 1, 1, 0, 1, 1, 0 }, { 1, 1, 1, 0, 1, 1, 1 }    /* BI L1 */
  340.             };
  341.             const int i_partition = t->mb.mb_part;
  342.             int idx = 0;
  343.             int i, b_part_mode, part_mode0, part_mode1;
  344. static const int b_part_mode_map[3][3] = {
  345. { B_L0_L0, B_L0_L1, B_L0_BI },
  346. { B_L1_L0, B_L1_L1, B_L1_BI },
  347. { B_BI_L0, B_BI_L1, B_BI_BI }
  348. };
  349. switch(t->mb.mb_part)
  350. {
  351. case MB_16x16:
  352. part_mode0 = t->mb.mb_part2[0] - B_L0_16x16;
  353. b_part_mode = b_part_mode_map[part_mode0][part_mode0];
  354. break;
  355. case MB_16x8:
  356. part_mode0 = t->mb.mb_part2[0] - B_L0_16x8;
  357. part_mode1 = t->mb.mb_part2[1] - B_L0_16x8;
  358. b_part_mode = b_part_mode_map[part_mode0][part_mode1];
  359. break;
  360. case MB_8x16:
  361. part_mode0 = t->mb.mb_part2[0] - B_L0_8x16;
  362. part_mode1 = t->mb.mb_part2[1] - B_L0_8x16;
  363. b_part_mode = b_part_mode_map[part_mode0][part_mode1];
  364. break;
  365. }
  366.             switch( b_part_mode )
  367.             {
  368.                 /* D_16x16, D_16x8, D_8x16 */
  369.                 case B_BI_BI: idx += 3;
  370.                 case B_L1_L1: idx += 3;
  371.                 case B_L0_L0:
  372.                     if( i_partition == MB_16x8 )
  373.                         idx += 1;
  374.                     else if( i_partition == MB_8x16 )
  375.                         idx += 2;
  376.                     break;
  377.                 /* D_16x8, D_8x16 */
  378.                 case B_BI_L1: idx += 2;
  379.                 case B_BI_L0: idx += 2;
  380.                 case B_L1_BI: idx += 2;
  381.                 case B_L0_BI: idx += 2;
  382.                 case B_L1_L0: idx += 2;
  383.                 case B_L0_L1:
  384.                     idx += 3*3;
  385.                     if( i_partition == MB_8x16 )
  386.                         idx++;
  387.                     break;
  388.                 default:
  389. return;
  390. }
  391.             T264_cabac_encode_decision( &t->cabac, 27+ctx,                         i_mb_bits[idx][0] );
  392.             T264_cabac_encode_decision( &t->cabac, 27+3,                           i_mb_bits[idx][1] );
  393.             T264_cabac_encode_decision( &t->cabac, 27+(i_mb_bits[idx][1] != 0 ? 4 : 5), i_mb_bits[idx][2] );
  394.             for( i = 3; i < i_mb_len[idx]; i++ )
  395.             {
  396.                 T264_cabac_encode_decision( &t->cabac, 27+5,                       i_mb_bits[idx][i] );
  397.             }
  398.         }
  399.     }
  400.     else
  401.     {
  402. //dummy here
  403.     }
  404. }
  405. static void T264_cabac_mb_intra4x4_pred_mode( T264_t *t, int i_pred, int i_mode )
  406. {
  407.     if( i_pred == i_mode )
  408.     {
  409.         /* b_prev_intra4x4_pred_mode */
  410.         T264_cabac_encode_decision( &t->cabac, 68, 1 );
  411.     }
  412.     else
  413.     {
  414.         /* b_prev_intra4x4_pred_mode */
  415.         T264_cabac_encode_decision( &t->cabac, 68, 0 );
  416.         if( i_mode > i_pred  )
  417.         {
  418.             i_mode--;
  419.         }
  420.         T264_cabac_encode_decision( &t->cabac, 69, (i_mode     )&0x01 );
  421.         T264_cabac_encode_decision( &t->cabac, 69, (i_mode >> 1)&0x01 );
  422.         T264_cabac_encode_decision( &t->cabac, 69, (i_mode >> 2)&0x01 );
  423.     }
  424. }
  425. static void T264_cabac_mb_intra8x8_pred_mode( T264_t *t )
  426. {
  427.     const int i_mode  = t->mb.mb_mode_uv;
  428. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  429. int ctx = 0;
  430. if( t->mb.mb_x > 0 && mb_ctxs[t->mb.mb_xy-1].mb_mode_uv != Intra_8x8_DC)
  431. {
  432. ctx++;
  433. }
  434. if( t->mb.mb_y > 0 && mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode_uv != Intra_8x8_DC )
  435. {
  436. ctx++;
  437. }
  438.     if( i_mode == Intra_8x8_DC )
  439.     {
  440.         T264_cabac_encode_decision( &t->cabac, 64 + ctx, Intra_8x8_DC );
  441.     }
  442.     else
  443.     {
  444.         T264_cabac_encode_decision( &t->cabac, 64 + ctx, 1 );
  445.         T264_cabac_encode_decision( &t->cabac, 64 + 3, ( i_mode == 1 ? 0 : 1 ) );
  446.         if( i_mode > 1 )
  447.         {
  448.             T264_cabac_encode_decision( &t->cabac, 64 + 3, ( i_mode == 2 ? 0 : 1 ) );
  449.         }
  450.     }
  451. }
  452. static void T264_cabac_mb_cbp_luma( T264_t *t )
  453. {
  454.     /* TODO: clean up and optimize */
  455. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  456.     int i8x8;
  457.     for( i8x8 = 0; i8x8 < 4; i8x8++ )
  458.     {
  459.         int i_mba_xy = -1;
  460.         int i_mbb_xy = -1;
  461.         int x = luma_inverse_x[4*i8x8];
  462.         int y = luma_inverse_y[4*i8x8];
  463.         int ctx = 0;
  464.         if( x > 0 )
  465.             i_mba_xy = t->mb.mb_xy;
  466.         else if( t->mb.mb_x > 0 )
  467.             i_mba_xy = t->mb.mb_xy - 1;
  468.         if( y > 0 )
  469.             i_mbb_xy = t->mb.mb_xy;
  470.         else if( t->mb.mb_y > 0 )
  471.             i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  472.         /* No need to test for PCM and SKIP */
  473.         if( i_mba_xy >= 0 )
  474.         {
  475.             const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
  476.             if( ((mb_ctxs[i_mba_xy].cbp_y >> i8x8a)&0x01) == 0 )
  477.             {
  478.                 ctx++;
  479.             }
  480.         }
  481.         if( i_mbb_xy >= 0 )
  482.         {
  483.             const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
  484.             if( ((mb_ctxs[i_mbb_xy].cbp_y >> i8x8b)&0x01) == 0 )
  485.             {
  486.                 ctx += 2;
  487.             }
  488.         }
  489.    
  490.         T264_cabac_encode_decision( &t->cabac, 73 + ctx, (t->mb.cbp_y >> i8x8)&0x01 );
  491.     }
  492. }
  493. static void T264_cabac_mb_cbp_chroma( T264_t *t )
  494. {
  495.     int cbp_a = -1;
  496.     int cbp_b = -1;
  497.     int ctx;
  498. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  499.     /* No need to test for SKIP/PCM */
  500.     if( t->mb.mb_x > 0 )
  501.     {
  502.         cbp_a = (mb_ctxs[t->mb.mb_xy - 1].cbp_c)&0x3;
  503.     }
  504.     if( t->mb.mb_y > 0 )
  505.     {
  506.         cbp_b = (mb_ctxs[t->mb.mb_xy - t->mb_stride].cbp_c)&0x3;
  507.     }
  508.     ctx = 0;
  509.     if( cbp_a > 0 ) ctx++;
  510.     if( cbp_b > 0 ) ctx += 2;
  511.     if( t->mb.cbp_c == 0 )
  512.     {
  513.         T264_cabac_encode_decision( &t->cabac, 77 + ctx, 0 );
  514.     }
  515.     else
  516.     {
  517.         T264_cabac_encode_decision( &t->cabac, 77 + ctx, 1 );
  518.         ctx = 4;
  519.         if( cbp_a == 2 ) ctx++;
  520.         if( cbp_b == 2 ) ctx += 2;
  521.         T264_cabac_encode_decision( &t->cabac, 77 + ctx, t->mb.cbp_c > 1 ? 1 : 0 );
  522.     }
  523. }
  524. /* TODO check it with != qp per mb */
  525. static void T264_cabac_mb_qp_delta( T264_t *t )
  526. {
  527.     int i_mbn_xy = t->mb.mb_xy - 1;
  528.     int i_dqp = t->mb.mb_qp_delta;
  529.     int val = i_dqp <= 0 ? (-2*i_dqp) : (2*i_dqp - 1);
  530.     int ctx;
  531. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  532.     /* No need to test for PCM / SKIP */
  533.     if( i_mbn_xy >= 0 && mb_ctxs[i_mbn_xy].mb_qp_delta != 0 &&
  534.         ( mb_ctxs[i_mbn_xy].mb_mode == I_16x16 || mb_ctxs[i_mbn_xy].cbp_y || mb_ctxs[i_mbn_xy].cbp_c) )
  535.         ctx = 1;
  536.     else
  537.         ctx = 0;
  538.     while( val > 0 )
  539.     {
  540.         T264_cabac_encode_decision( &t->cabac,  60 + ctx, 1 );
  541.         if( ctx < 2 )
  542.             ctx = 2;
  543.         else
  544.             ctx = 3;
  545.         val--;
  546.     }
  547.     T264_cabac_encode_decision( &t->cabac,  60 + ctx, 0 );
  548. }
  549. void T264_cabac_mb_skip( T264_t *t, int b_skip )
  550. {
  551. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  552.     int ctx = 0;
  553.     if( t->mb.mb_x > 0 && !IS_SKIP( mb_ctxs[t->mb.mb_xy -1].mb_mode) )
  554.     {
  555.         ctx++;
  556.     }
  557.     if( t->mb.mb_y > 0 && !IS_SKIP( mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode) )
  558.     {
  559.         ctx++;
  560.     }
  561.     if( t->slice_type == SLICE_P )
  562.         T264_cabac_encode_decision( &t->cabac, 11 + ctx, b_skip ? 1 : 0 );
  563.     else /* SLICE_TYPE_B */
  564.         T264_cabac_encode_decision( &t->cabac, 24 + ctx, b_skip ? 1 : 0 );
  565. }
  566. static __inline  void T264_cabac_mb_sub_p_partition( T264_t *t, int i_sub )
  567. {
  568.     if( i_sub == MB_8x8 )
  569.     {
  570.             T264_cabac_encode_decision( &t->cabac, 21, 1 );
  571.     }
  572.     else if( i_sub == MB_8x4 )
  573.     {
  574.             T264_cabac_encode_decision( &t->cabac, 21, 0 );
  575.             T264_cabac_encode_decision( &t->cabac, 22, 0 );
  576.     }
  577.     else if( i_sub == MB_4x8 )
  578.     {
  579.             T264_cabac_encode_decision( &t->cabac, 21, 0 );
  580.             T264_cabac_encode_decision( &t->cabac, 22, 1 );
  581.             T264_cabac_encode_decision( &t->cabac, 23, 1 );
  582.     }
  583.     else if( i_sub == MB_4x4 )
  584.     {
  585.             T264_cabac_encode_decision( &t->cabac, 21, 0 );
  586.             T264_cabac_encode_decision( &t->cabac, 22, 1 );
  587.             T264_cabac_encode_decision( &t->cabac, 23, 0 );
  588.     }
  589. }
  590. static __inline  void T264_cabac_mb_sub_b_partition( T264_t *t, int i_sub )
  591. {
  592.     if( i_sub == B_DIRECT_8x8 )
  593.     {
  594.         T264_cabac_encode_decision( &t->cabac, 36, 0 );
  595.     }
  596.     else if( i_sub == B_L0_8x8 )
  597.     {
  598.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  599.         T264_cabac_encode_decision( &t->cabac, 37, 0 );
  600.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  601.     }
  602.     else if( i_sub == B_L1_8x8 )
  603.     {
  604.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  605.         T264_cabac_encode_decision( &t->cabac, 37, 0 );
  606.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  607.     }
  608.     else if( i_sub == B_Bi_8x8 )
  609.     {
  610.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  611.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  612.         T264_cabac_encode_decision( &t->cabac, 38, 0 );
  613.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  614.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  615.     }
  616.     else if( i_sub == B_L0_8x4 )
  617.     {
  618.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  619.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  620.         T264_cabac_encode_decision( &t->cabac, 38, 0 );
  621.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  622.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  623.     }
  624.     else if( i_sub == B_L0_4x8 )
  625.     {
  626.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  627.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  628.         T264_cabac_encode_decision( &t->cabac, 38, 0 );
  629.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  630.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  631.     }
  632.     else if( i_sub == B_L1_8x4 )
  633.     {
  634.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  635.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  636.         T264_cabac_encode_decision( &t->cabac, 38, 0 );
  637.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  638.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  639.     }
  640.     else if( i_sub == B_L1_4x8 )
  641.     {
  642.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  643.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  644.         T264_cabac_encode_decision( &t->cabac, 38, 1 );
  645.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  646.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  647.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  648.     }
  649.     else if( i_sub == B_Bi_8x4 )
  650.     {
  651.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  652.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  653.         T264_cabac_encode_decision( &t->cabac, 38, 1 );
  654.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  655.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  656.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  657.     }
  658.     else if( i_sub == B_Bi_4x8 )
  659.     {
  660.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  661.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  662.         T264_cabac_encode_decision( &t->cabac, 38, 1 );
  663.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  664.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  665.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  666.     }
  667.     else if( i_sub == B_L0_4x4 )
  668.     {
  669.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  670.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  671.         T264_cabac_encode_decision( &t->cabac, 38, 1 );
  672.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  673.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  674.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  675.     }
  676.     else if( i_sub == B_L1_4x4 )
  677.     {
  678.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  679.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  680.         T264_cabac_encode_decision( &t->cabac, 38, 1 );
  681.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  682.         T264_cabac_encode_decision( &t->cabac, 39, 0 );
  683.     }
  684.     else if( i_sub == B_Bi_4x4 )
  685.     {
  686.         T264_cabac_encode_decision( &t->cabac, 36, 1 );
  687.         T264_cabac_encode_decision( &t->cabac, 37, 1 );
  688.         T264_cabac_encode_decision( &t->cabac, 38, 1 );
  689.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  690.         T264_cabac_encode_decision( &t->cabac, 39, 1 );
  691.     }
  692. }
  693. static __inline  void T264_cabac_mb_ref( T264_t *t, int i_list, int idx )
  694. {
  695. const int i8    = T264_scan8[idx];
  696. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  697. const int i_refa = t->mb.vec_ref[i8 - 1].vec[i_list].refno;
  698.     const int i_refb = t->mb.vec_ref[i8 - 8].vec[i_list].refno;
  699.     int i_ref  = t->mb.vec_ref[i8].vec[i_list].refno;
  700. int a_direct, b_direct;
  701. int ctx  = 0;
  702. int luma_idx = luma_index[idx];
  703. if( t->slice_type==SLICE_B && t->mb.mb_x > 0 && (mb_ctxs[t->mb.mb_xy-1].mb_mode == B_SKIP||mb_ctxs[t->mb.mb_xy-1].is_copy ) && (luma_idx&0x03)==0)
  704. {
  705. a_direct = 1;
  706. }
  707. else
  708. a_direct = 0;
  709. if( t->slice_type==SLICE_B && t->mb.mb_y > 0 && (mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode == B_SKIP||mb_ctxs[t->mb.mb_xy - t->mb_stride].is_copy) && luma_idx<4)
  710. {
  711. b_direct = 1;
  712. }
  713. else
  714. b_direct = 0;
  715.     if( i_refa>0 && !a_direct)
  716.         ctx++;
  717.     if( i_refb>0 && !b_direct)
  718.         ctx += 2;
  719.     while( i_ref > 0 )
  720.     {
  721.         T264_cabac_encode_decision( &t->cabac, 54 + ctx, 1 );
  722.         if( ctx < 4 )
  723.             ctx = 4;
  724.         else
  725.             ctx = 5;
  726.         i_ref--;
  727.     }
  728.     T264_cabac_encode_decision( &t->cabac, 54 + ctx, 0 );
  729. }
  730. static __inline  void  T264_cabac_mb_mvd_cpn( T264_t *t, int i_list, int i8, int l, int mvd )
  731. {
  732.     const int amvd = abs( t->mb.mvd_ref[i_list][i8 - 1][l] ) +
  733.                      abs( t->mb.mvd_ref[i_list][i8 - 8][l] );
  734.     const int i_abs = abs( mvd );
  735.     const int i_prefix = T264_MIN( i_abs, 9 );
  736.     const int ctxbase = (l == 0 ? 40 : 47);
  737.     int ctx;
  738.     int i;
  739.     if( amvd < 3 )
  740.         ctx = 0;
  741.     else if( amvd > 32 )
  742.         ctx = 2;
  743.     else
  744.         ctx = 1;
  745.     for( i = 0; i < i_prefix; i++ )
  746.     {
  747.         T264_cabac_encode_decision( &t->cabac, ctxbase + ctx, 1 );
  748.         if( ctx < 3 )
  749.             ctx = 3;
  750.         else if( ctx < 6 )
  751.             ctx++;
  752.     }
  753.     if( i_prefix < 9 )
  754.     {
  755.         T264_cabac_encode_decision( &t->cabac, ctxbase + ctx, 0 );
  756.     }
  757.     if( i_prefix >= 9 )
  758.     {
  759.         int i_suffix = i_abs - 9;
  760.         int k = 3;
  761.         while( i_suffix >= (1<<k) )
  762.         {
  763.             T264_cabac_encode_bypass( &t->cabac, 1 );
  764.             i_suffix -= 1 << k;
  765.             k++;
  766.         }
  767.         T264_cabac_encode_bypass( &t->cabac, 0 );
  768.         while( k-- )
  769.         {
  770.             T264_cabac_encode_bypass( &t->cabac, (i_suffix >> k)&0x01 );
  771.         }
  772.     }
  773.     /* sign */
  774.     if( mvd > 0 )
  775.         T264_cabac_encode_bypass( &t->cabac, 0 );
  776.     else if( mvd < 0 )
  777.         T264_cabac_encode_bypass( &t->cabac, 1 );
  778. }
  779. static __inline  void  T264_cabac_mb_mvd( T264_t *t, int i_list, int idx, int width, int height )
  780. {
  781.     T264_vector_t mvp;
  782.     int mdx, mdy;
  783. int i, j;
  784. int i8    = T264_scan8[idx];
  785. int luma_idx = luma_index[idx];
  786.     /* Calculate mvd */
  787. mvp.refno = t->mb.vec_ref[i8].vec[i_list].refno;
  788.     T264_predict_mv( t, i_list, luma_idx, width, &mvp );
  789. mdx = t->mb.vec_ref[i8].vec[i_list].x - mvp.x;
  790. mdy = t->mb.vec_ref[i8].vec[i_list].y - mvp.y;
  791.     
  792.     /* encode */
  793.     T264_cabac_mb_mvd_cpn( t, i_list, i8, 0, mdx );
  794.     T264_cabac_mb_mvd_cpn( t, i_list, i8, 1, mdy );
  795. /* save mvd value */
  796. for(j=0; j<height; j++)
  797. {
  798. for(i=0; i<width; i++)
  799. {
  800. t->mb.mvd_ref[i_list][i8+i][0] = mdx;
  801. t->mb.mvd_ref[i_list][i8+i][1] = mdy;
  802. t->mb.mvd[i_list][luma_idx+i][0] = mdx;
  803. t->mb.mvd[i_list][luma_idx+i][1] = mdy;
  804. }
  805. i8 += 8;
  806. luma_idx += 4;
  807. }
  808. }
  809. static __inline void T264_cabac_mb8x8_mvd( T264_t *t, int i_list )
  810. {
  811. int i;
  812. int sub_part;
  813. for( i = 0; i < 4; i++ )
  814. {
  815. sub_part = t->mb.submb_part[luma_index[i<<2]];
  816. if( T264_mb_partition_listX_table[sub_part-B_DIRECT_8x8][i_list] == 0 )
  817. {
  818. continue;
  819. }
  820. switch( sub_part )
  821. {
  822. case B_DIRECT_8x8:
  823. assert(0);
  824. break;
  825. case B_L0_8x8:
  826. case B_L1_8x8:
  827. case B_Bi_8x8:
  828. T264_cabac_mb_mvd( t, i_list, 4*i, 2, 2 );
  829. break;
  830. case B_L0_8x4:
  831. case B_L1_8x4:
  832. case B_Bi_8x4:
  833. T264_cabac_mb_mvd( t, i_list, 4*i+0, 2, 1 );
  834. T264_cabac_mb_mvd( t, i_list, 4*i+2, 2, 1 );
  835. break;
  836. case B_L0_4x8:
  837. case B_L1_4x8:
  838. case B_Bi_4x8:
  839. T264_cabac_mb_mvd( t, i_list, 4*i+0, 1, 2 );
  840. T264_cabac_mb_mvd( t, i_list, 4*i+1, 1, 2 );
  841. break;
  842. case B_L0_4x4:
  843. case B_L1_4x4:
  844. case B_Bi_4x4:
  845. T264_cabac_mb_mvd( t, i_list, 4*i+0, 1, 1 );
  846. T264_cabac_mb_mvd( t, i_list, 4*i+1, 1, 1 );
  847. T264_cabac_mb_mvd( t, i_list, 4*i+2, 1, 1 );
  848. T264_cabac_mb_mvd( t, i_list, 4*i+3, 1, 1 );
  849. break;
  850. }
  851. }
  852. }
  853. static int T264_cabac_mb_cbf_ctxidxinc( T264_t *t, int i_cat, int i_idx )
  854. {
  855.     /* TODO: clean up/optimize */
  856. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  857. T264_mb_context_t *mb_ctx;
  858.     int i_mba_xy = -1;
  859.     int i_mbb_xy = -1;
  860.     int i_nza = -1;
  861.     int i_nzb = -1;
  862.     int ctx = 0;
  863. int cbp;
  864.     if( i_cat == 0 )
  865.     {
  866.         if( t->mb.mb_x > 0 )
  867.         {
  868.             i_mba_xy = t->mb.mb_xy -1;
  869. mb_ctx = &(mb_ctxs[i_mba_xy]);
  870.             if( mb_ctx->mb_mode == I_16x16 )
  871.             {
  872.                 i_nza = (mb_ctx->cbp & 0x100);
  873.             }
  874.         }
  875.         if( t->mb.mb_y > 0 )
  876.         {
  877.             i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  878. mb_ctx = &(mb_ctxs[i_mbb_xy]);
  879.             if( mb_ctx->mb_mode == I_16x16 )
  880.             {
  881.                 i_nzb = (mb_ctx->cbp & 0x100);
  882.             }
  883.         }
  884.     }
  885.     else if( i_cat == 1 || i_cat == 2 )
  886.     {
  887.         int x = luma_inverse_x[i_idx];
  888.         int y = luma_inverse_y[i_idx];
  889. int i8 = T264_scan8[i_idx];
  890.         if( x > 0 )
  891.             i_mba_xy = t->mb.mb_xy;
  892.         else if( t->mb.mb_x > 0 )
  893.             i_mba_xy = t->mb.mb_xy -1;
  894.         if( y > 0 )
  895.             i_mbb_xy = t->mb.mb_xy;
  896.         else if( t->mb.mb_y > 0 )
  897.             i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  898.         /* no need to test for skip/pcm */
  899.         if( i_mba_xy >= 0 )
  900.         {
  901.             const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
  902.             if( (mb_ctxs[i_mba_xy].cbp_y&0x0f)>> i8x8a )
  903.             {
  904.                 i_nza = t->mb.nnz_ref[i8-1];
  905.             }
  906.         }
  907.         if( i_mbb_xy >= 0 )
  908.         {
  909.             const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
  910.             if( (mb_ctxs[i_mbb_xy].cbp_y&0x0f)>> i8x8b )
  911.             {
  912.                 i_nzb = t->mb.nnz_ref[i8 - 8];
  913.             }
  914.         }
  915.     }
  916.     else if( i_cat == 3 )
  917.     {
  918.         /* no need to test skip/pcm */
  919.         if( t->mb.mb_x > 0 )
  920.         {
  921.             i_mba_xy = t->mb.mb_xy -1;
  922. cbp = mb_ctxs[i_mba_xy].cbp;
  923.             if( cbp&0x30 )
  924.             {
  925.                 i_nza = cbp&( 0x02 << ( 8 + i_idx) );
  926.             }
  927.         }
  928.         if( t->mb.mb_y > 0 )
  929.         {
  930.             i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  931. cbp = mb_ctxs[i_mbb_xy].cbp;
  932.             if( cbp&0x30 )
  933.             {
  934.                 i_nzb = cbp&( 0x02 << ( 8 + i_idx) );
  935.             }
  936.         }
  937.     }
  938.     else if( i_cat == 4 )
  939.     {
  940.         int idxc = i_idx% 4;
  941.         if( idxc == 1 || idxc == 3 )
  942.             i_mba_xy = t->mb.mb_xy;
  943.         else if( t->mb.mb_x > 0 )
  944.             i_mba_xy = t->mb.mb_xy - 1;
  945.         if( idxc == 2 || idxc == 3 )
  946.             i_mbb_xy = t->mb.mb_xy;
  947.         else if( t->mb.mb_y > 0 )
  948.             i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  949.         /* no need to test skip/pcm */
  950.         if( i_mba_xy >= 0 && (mb_ctxs[i_mba_xy].cbp&0x30) == 0x20 )
  951.         {
  952.             i_nza = t->mb.nnz_ref[T264_scan8[16+i_idx] - 1];
  953.         }
  954.         if( i_mbb_xy >= 0 && (mb_ctxs[i_mbb_xy].cbp&0x30) == 0x20 )
  955.         {
  956.             i_nzb = t->mb.nnz_ref[T264_scan8[16+i_idx] - 8];
  957.         }
  958.     }
  959.     if( ( i_mba_xy < 0  && IS_INTRA( t->mb.mb_mode ) ) || i_nza > 0 )
  960.     {
  961.         ctx++;
  962.     }
  963.     if( ( i_mbb_xy < 0  && IS_INTRA( t->mb.mb_mode ) ) || i_nzb > 0 )
  964.     {
  965.         ctx += 2;
  966.     }
  967.     return 4 * i_cat + ctx;
  968. }
  969. static void block_residual_write_cabac( T264_t *t, int i_ctxBlockCat, int i_idx, int16_t *l, int i_count )
  970. {
  971.     static const int significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
  972.     static const int last_significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
  973.     static const int coeff_abs_level_m1_offset[5] = { 0, 10, 20, 30, 39 };
  974.     int i_coeff_abs_m1[16];
  975.     int i_coeff_sign[16];
  976.     int i_coeff = 0;
  977.     int i_last  = 0;
  978.     int i_abslevel1 = 0;
  979.     int i_abslevelgt1 = 0;
  980.     int i;
  981.     /* i_ctxBlockCat: 0-> DC 16x16  i_idx = 0
  982.      *                1-> AC 16x16  i_idx = luma4x4idx
  983.      *                2-> Luma4x4   i_idx = luma4x4idx
  984.      *                3-> DC Chroma i_idx = iCbCr
  985.      *                4-> AC Chroma i_idx = 4 * iCbCr + chroma4x4idx
  986.      */
  987.     //fprintf( stderr, "l[] = " );
  988.     for( i = 0; i < i_count; i++ )
  989.     {
  990.         //fprintf( stderr, "%d ", l[i] );
  991.         if( l[i] != 0 )
  992.         {
  993.             i_coeff_abs_m1[i_coeff] = abs( l[i] ) - 1;
  994.             i_coeff_sign[i_coeff]   = ( l[i] < 0 ? 1 : 0);
  995.             i_coeff++;
  996.             i_last = i;
  997.         }
  998.     }
  999.     //fprintf( stderr, "n" );
  1000.     if( i_coeff == 0 )
  1001.     {
  1002.         /* codec block flag */
  1003.         T264_cabac_encode_decision( &t->cabac,  85 + T264_cabac_mb_cbf_ctxidxinc( t, i_ctxBlockCat, i_idx ), 0 );
  1004.         return;
  1005.     }
  1006.     /* block coded */
  1007.     T264_cabac_encode_decision( &t->cabac,  85 + T264_cabac_mb_cbf_ctxidxinc( t, i_ctxBlockCat, i_idx ), 1 );
  1008.     for( i = 0; i < i_count - 1; i++ )
  1009.     {
  1010.         int i_ctxIdxInc;
  1011.         i_ctxIdxInc = T264_MIN( i, i_count - 2 );
  1012.         if( l[i] != 0 )
  1013.         {
  1014.             T264_cabac_encode_decision( &t->cabac, 105 + significant_coeff_flag_offset[i_ctxBlockCat] + i_ctxIdxInc, 1 );
  1015.             T264_cabac_encode_decision( &t->cabac, 166 + last_significant_coeff_flag_offset[i_ctxBlockCat] + i_ctxIdxInc, i == i_last ? 1 : 0 );
  1016.         }
  1017.         else
  1018.         {
  1019.             T264_cabac_encode_decision( &t->cabac, 105 + significant_coeff_flag_offset[i_ctxBlockCat] + i_ctxIdxInc, 0 );
  1020.         }
  1021.         if( i == i_last )
  1022.         {
  1023.             break;
  1024.         }
  1025.     }
  1026.     for( i = i_coeff - 1; i >= 0; i-- )
  1027.     {
  1028.         int i_prefix;
  1029.         int i_ctxIdxInc;
  1030.         /* write coeff_abs - 1 */
  1031.         /* prefix */
  1032.         i_prefix = T264_MIN( i_coeff_abs_m1[i], 14 );
  1033.         i_ctxIdxInc = (i_abslevelgt1 != 0 ? 0 : T264_MIN( 4, i_abslevel1 + 1 )) + coeff_abs_level_m1_offset[i_ctxBlockCat];
  1034.         if( i_prefix == 0 )
  1035.         {
  1036.             T264_cabac_encode_decision( &t->cabac,  227 + i_ctxIdxInc, 0 );
  1037.         }
  1038.         else
  1039.         {
  1040.             int j;
  1041.             T264_cabac_encode_decision( &t->cabac,  227 + i_ctxIdxInc, 1 );
  1042.             i_ctxIdxInc = 5 + T264_MIN( 4, i_abslevelgt1 ) + coeff_abs_level_m1_offset[i_ctxBlockCat];
  1043.             for( j = 0; j < i_prefix - 1; j++ )
  1044.             {
  1045.                 T264_cabac_encode_decision( &t->cabac,  227 + i_ctxIdxInc, 1 );
  1046.             }
  1047.             if( i_prefix < 14 )
  1048.             {
  1049.                 T264_cabac_encode_decision( &t->cabac,  227 + i_ctxIdxInc, 0 );
  1050.             }
  1051.         }
  1052.         /* suffix */
  1053.         if( i_coeff_abs_m1[i] >= 14 )
  1054.         {
  1055.             int k = 0;
  1056.             int i_suffix = i_coeff_abs_m1[i] - 14;
  1057.             while( i_suffix >= (1<<k) )
  1058.             {
  1059.                 T264_cabac_encode_bypass( &t->cabac, 1 );
  1060.                 i_suffix -= 1 << k;
  1061.                 k++;
  1062.             }
  1063.             T264_cabac_encode_bypass( &t->cabac, 0 );
  1064.             while( k-- )
  1065.             {
  1066.                 T264_cabac_encode_bypass( &t->cabac, (i_suffix >> k)&0x01 );
  1067.             }
  1068.         }
  1069.         /* write sign */
  1070.         T264_cabac_encode_bypass( &t->cabac, i_coeff_sign[i] );
  1071.         if( i_coeff_abs_m1[i] == 0 )
  1072.         {
  1073.             i_abslevel1++;
  1074.         }
  1075.         else
  1076.         {
  1077.             i_abslevelgt1++;
  1078.         }
  1079.     }
  1080. }
  1081. static int8_t
  1082. T264_mb_predict_intra4x4_mode(T264_t *t, int32_t idx)
  1083. {
  1084. int32_t x, y;
  1085. int8_t nA, nB, pred_blk;
  1086. x = luma_inverse_x[idx];
  1087. y = luma_inverse_y[idx];
  1088. nA = t->mb.i4x4_pred_mode_ref[IPM_LUMA + x + y * 8 - 1];
  1089. nB = t->mb.i4x4_pred_mode_ref[IPM_LUMA + x + y * 8 - 8];
  1090. pred_blk  = T264_MIN(nA, nB);
  1091. if( pred_blk < 0 )
  1092. return Intra_4x4_DC;
  1093. return pred_blk;
  1094. }
  1095. void T264_macroblock_write_cabac( T264_t *t, bs_t *s )
  1096. {
  1097.     const int i_mb_type = t->mb.mb_mode;
  1098.     const int i_mb_pos_start = BitstreamPos( s );
  1099.     int       i_mb_pos_tex;
  1100.     int i;
  1101.     /* Write the MB type */
  1102.     T264_cabac_mb_type( t );
  1103.     /* PCM special block type UNTESTED */
  1104. /* no PCM here*/
  1105.     if( IS_INTRA( i_mb_type ) )
  1106.     {
  1107.         /* Prediction */
  1108.         if( i_mb_type == I_4x4 )
  1109.         {
  1110.             for( i = 0; i < 16; i++ )
  1111.             {
  1112.                 const int i_pred = T264_mb_predict_intra4x4_mode( t, i );
  1113.                 const int i_mode = t->mb.i4x4_pred_mode_ref[T264_scan8[i]];
  1114.                 T264_cabac_mb_intra4x4_pred_mode( t, i_pred, i_mode );
  1115.             }
  1116.         }
  1117.         T264_cabac_mb_intra8x8_pred_mode( t );
  1118.     }
  1119.     else if( i_mb_type == P_MODE )
  1120.     {
  1121.         if( t->mb.mb_part == MB_16x16 )
  1122.         {
  1123.             if( t->ps.num_ref_idx_l0_active_minus1 > 0 )
  1124.             {
  1125.                 T264_cabac_mb_ref( t, 0, 0 );
  1126.             }
  1127.             T264_cabac_mb_mvd( t, 0, 0, 4, 4 );
  1128.         }
  1129.         else if( t->mb.mb_part == MB_16x8 )
  1130.         {
  1131.             if( t->ps.num_ref_idx_l0_active_minus1 > 0 )
  1132.             {
  1133.                 T264_cabac_mb_ref( t, 0, 0 );
  1134.                 T264_cabac_mb_ref( t, 0, 8 );
  1135.             }
  1136.             T264_cabac_mb_mvd( t, 0, 0, 4, 2 );
  1137.             T264_cabac_mb_mvd( t, 0, 8, 4, 2 );
  1138.         }
  1139.         else if( t->mb.mb_part == MB_8x16 )
  1140.         {
  1141.             if( t->ps.num_ref_idx_l0_active_minus1 > 0 )
  1142.             {
  1143.                 T264_cabac_mb_ref( t, 0, 0 );
  1144.                 T264_cabac_mb_ref( t, 0, 4 );
  1145.             }
  1146.             T264_cabac_mb_mvd( t, 0, 0, 2, 4 );
  1147.             T264_cabac_mb_mvd( t, 0, 4, 2, 4 );
  1148.         }
  1149. else /* 8x8 */
  1150. {
  1151. /* sub mb type */
  1152. T264_cabac_mb_sub_p_partition( t, t->mb.submb_part[0] );
  1153. T264_cabac_mb_sub_p_partition( t, t->mb.submb_part[2] );
  1154. T264_cabac_mb_sub_p_partition( t, t->mb.submb_part[8] );
  1155. T264_cabac_mb_sub_p_partition( t, t->mb.submb_part[10] );
  1156. /* ref 0 */
  1157. if( t->ps.num_ref_idx_l0_active_minus1 > 0 )
  1158. {
  1159. T264_cabac_mb_ref( t, 0, 0 );
  1160. T264_cabac_mb_ref( t, 0, 4 );
  1161. T264_cabac_mb_ref( t, 0, 8 );
  1162. T264_cabac_mb_ref( t, 0, 12 );
  1163. }
  1164. for( i = 0; i < 4; i++ )
  1165. {
  1166. switch( t->mb.submb_part[luma_index[i<<2]] )
  1167. {
  1168. case MB_8x8:
  1169. T264_cabac_mb_mvd( t, 0, 4*i, 2, 2 );
  1170. break;
  1171. case MB_8x4:
  1172. T264_cabac_mb_mvd( t, 0, 4*i+0, 2, 1 );
  1173. T264_cabac_mb_mvd( t, 0, 4*i+2, 2, 1 );
  1174. break;
  1175. case MB_4x8:
  1176. T264_cabac_mb_mvd( t, 0, 4*i+0, 1, 2 );
  1177. T264_cabac_mb_mvd( t, 0, 4*i+1, 1, 2 );
  1178. break;
  1179. case MB_4x4:
  1180. T264_cabac_mb_mvd( t, 0, 4*i+0, 1, 1 );
  1181. T264_cabac_mb_mvd( t, 0, 4*i+1, 1, 1 );
  1182. T264_cabac_mb_mvd( t, 0, 4*i+2, 1, 1 );
  1183. T264_cabac_mb_mvd( t, 0, 4*i+3, 1, 1 );
  1184. break;
  1185. }
  1186. }
  1187. }
  1188.     }
  1189.     else if( i_mb_type == B_MODE )
  1190.     {
  1191. if((t->mb.mb_part==MB_16x16&&t->mb.is_copy!=1) || (t->mb.mb_part==MB_16x8) || (t->mb.mb_part==MB_8x16))
  1192. {
  1193. /* to be changed here*/
  1194. /* All B mode */
  1195. int i_list;
  1196. int b_list[2][2];
  1197. const int i_partition = t->mb.mb_part;
  1198. int b_part_mode, part_mode0, part_mode1;
  1199. static const int b_part_mode_map[3][3] = {
  1200. { B_L0_L0, B_L0_L1, B_L0_BI },
  1201. { B_L1_L0, B_L1_L1, B_L1_BI },
  1202. { B_BI_L0, B_BI_L1, B_BI_BI }
  1203. };
  1204. switch(t->mb.mb_part)
  1205. {
  1206. case MB_16x16:
  1207. part_mode0 = t->mb.mb_part2[0] - B_L0_16x16;
  1208. b_part_mode = b_part_mode_map[part_mode0][part_mode0];
  1209. break;
  1210. case MB_16x8:
  1211. part_mode0 = t->mb.mb_part2[0] - B_L0_16x8;
  1212. part_mode1 = t->mb.mb_part2[1] - B_L0_16x8;
  1213. b_part_mode = b_part_mode_map[part_mode0][part_mode1];
  1214. break;
  1215. case MB_8x16:
  1216. part_mode0 = t->mb.mb_part2[0] - B_L0_8x16;
  1217. part_mode1 = t->mb.mb_part2[1] - B_L0_8x16;
  1218. b_part_mode = b_part_mode_map[part_mode0][part_mode1];
  1219. break;
  1220. }
  1221. /* init ref list utilisations */
  1222. for( i = 0; i < 2; i++ )
  1223. {
  1224. b_list[0][i] = T264_mb_type_list0_table[b_part_mode][i];
  1225. b_list[1][i] = T264_mb_type_list1_table[b_part_mode][i];
  1226. }
  1227. for( i_list = 0; i_list < 2; i_list++ )
  1228. {
  1229. const int i_ref_max = i_list == 0 ? t->ps.num_ref_idx_l0_active_minus1+1 : t->ps.num_ref_idx_l1_active_minus1+1;
  1230. if( i_ref_max > 1 )
  1231. {
  1232. if( t->mb.mb_part == MB_16x16 )
  1233. {
  1234. if( b_list[i_list][0] ) T264_cabac_mb_ref( t, i_list, 0 );
  1235. }
  1236. else if( t->mb.mb_part == MB_16x8 )
  1237. {
  1238. if( b_list[i_list][0] ) T264_cabac_mb_ref( t, i_list, 0 );
  1239. if( b_list[i_list][1] ) T264_cabac_mb_ref( t, i_list, 8 );
  1240. }
  1241. else if( t->mb.mb_part == MB_8x16 )
  1242. {
  1243. if( b_list[i_list][0] ) T264_cabac_mb_ref( t, i_list, 0 );
  1244. if( b_list[i_list][1] ) T264_cabac_mb_ref( t, i_list, 4 );
  1245. }
  1246. }
  1247. }
  1248. for( i_list = 0; i_list < 2; i_list++ )
  1249. {
  1250. if( t->mb.mb_part == MB_16x16 )
  1251. {
  1252. if( b_list[i_list][0] ) T264_cabac_mb_mvd( t, i_list, 0, 4, 4 );
  1253. }
  1254. else if( t->mb.mb_part == MB_16x8 )
  1255. {
  1256. if( b_list[i_list][0] ) T264_cabac_mb_mvd( t, i_list, 0, 4, 2 );
  1257. if( b_list[i_list][1] ) T264_cabac_mb_mvd( t, i_list, 8, 4, 2 );
  1258. }
  1259. else if( t->mb.mb_part == MB_8x16 )
  1260. {
  1261. if( b_list[i_list][0] ) T264_cabac_mb_mvd( t, i_list, 0, 2, 4 );
  1262. if( b_list[i_list][1] ) T264_cabac_mb_mvd( t, i_list, 4, 2, 4 );
  1263. }
  1264. }
  1265. }
  1266. else if(t->mb.mb_part==MB_16x16 && t->mb.is_copy)
  1267. {
  1268. }
  1269. else /* B8x8 */
  1270. {
  1271. /* TODO */
  1272. int i_list;
  1273. /* sub mb type */
  1274. T264_cabac_mb_sub_b_partition( t, t->mb.submb_part[0] );
  1275. T264_cabac_mb_sub_b_partition( t, t->mb.submb_part[2] );
  1276. T264_cabac_mb_sub_b_partition( t, t->mb.submb_part[8] );
  1277. T264_cabac_mb_sub_b_partition( t, t->mb.submb_part[10] );
  1278. /* ref */
  1279. for( i_list = 0; i_list < 2; i_list++ )
  1280. {
  1281. if( ( i_list ? t->ps.num_ref_idx_l1_active_minus1 : t->ps.num_ref_idx_l0_active_minus1 ) == 0 )
  1282. continue;
  1283. for( i = 0; i < 4; i++ )
  1284. {
  1285. int sub_part = t->mb.submb_part[luma_index[i<<2]]-B_DIRECT_8x8;
  1286. if( T264_mb_partition_listX_table[sub_part][i_list] == 1 )
  1287. {
  1288. T264_cabac_mb_ref( t, i_list, 4*i );
  1289. }
  1290. }
  1291. }
  1292. T264_cabac_mb8x8_mvd( t, 0 );
  1293. T264_cabac_mb8x8_mvd( t, 1 );
  1294. }
  1295.     }
  1296.     
  1297.     i_mb_pos_tex = BitstreamPos( s );
  1298.     
  1299.     if( i_mb_type != I_16x16 )
  1300.     {
  1301.         T264_cabac_mb_cbp_luma( t );
  1302.         T264_cabac_mb_cbp_chroma( t );
  1303.     }
  1304.     if( t->mb.cbp_y > 0 || t->mb.cbp_c > 0 || i_mb_type == I_16x16 )
  1305.     {
  1306.         T264_cabac_mb_qp_delta( t );
  1307.         /* write residual */
  1308.         if( i_mb_type == I_16x16 )
  1309.         {
  1310.             /* DC Luma */
  1311.             block_residual_write_cabac( t, 0, 0, t->mb.dc4x4_z, 16 );
  1312.             if( t->mb.cbp_y != 0 )
  1313.             {
  1314.                 /* AC Luma */
  1315.                 for( i = 0; i < 16; i++ )
  1316.                 {
  1317.                     block_residual_write_cabac( t, 1, i, &(t->mb.dct_y_z[i][1]), 15 );
  1318.                 }
  1319.             }
  1320.         }
  1321.         else
  1322.         {
  1323. if(t->frame_num == 1)
  1324. t->frame_num = 1;
  1325.             for( i = 0; i < 16; i++ )
  1326.             {
  1327.                 if( t->mb.cbp_y & ( 1 << ( i / 4 ) ) )
  1328.                 {
  1329.                     block_residual_write_cabac( t, 2, i, &(t->mb.dct_y_z[i][0]), 16 );
  1330.                 }
  1331.             }
  1332.         }
  1333.         if( t->mb.cbp_c&0x03 )    /* Chroma DC residual present */
  1334.         {
  1335.             block_residual_write_cabac( t, 3, 0, &(t->mb.dc2x2_z[0][0]), 4 );
  1336.             block_residual_write_cabac( t, 3, 1, &(t->mb.dc2x2_z[1][0]), 4 );
  1337.         }
  1338.         if( t->mb.cbp_c&0x02 ) /* Chroma AC residual present */
  1339.         {
  1340.             for( i = 0; i < 8; i++ )
  1341.             {
  1342.                 block_residual_write_cabac( t, 4, i, &(t->mb.dct_uv_z[i>>2][i&0x03][1]), 15);
  1343.             }
  1344.         }
  1345.     }
  1346. /*
  1347.     if( IS_INTRA( i_mb_type ) )
  1348.         t->stat.frame.i_itex_bits += bs_pos(s) - i_mb_pos_tex;
  1349.     else
  1350.         t->stat.frame.i_ptex_bits += bs_pos(s) - i_mb_pos_tex;
  1351. */
  1352. }