cabac.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:34k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * cabac.c: h264 encoder library
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id: cabac.c,v 1.1 2004/06/03 19:27:08 fenrir Exp $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include "common/common.h"
  26. #include "macroblock.h"
  27. static inline void x264_cabac_encode_ue_bypass( x264_cabac_t *cb, int exp_bits, int val )
  28. {
  29. #ifdef RDO_SKIP_BS
  30.     cb->f8_bits_encoded += ( bs_size_ue( val + (1<<exp_bits)-1 ) - exp_bits ) << 8;
  31. #else
  32.     int k;
  33.     for( k = exp_bits; val >= (1<<k); k++ )
  34.     {
  35.         x264_cabac_encode_bypass( cb, 1 );
  36.         val -= 1 << k;
  37.     }
  38.     x264_cabac_encode_bypass( cb, 0 );
  39.     while( k-- )
  40.         x264_cabac_encode_bypass( cb, (val >> k)&0x01 );
  41. #endif
  42. }
  43. static inline void x264_cabac_mb_type_intra( x264_t *h, x264_cabac_t *cb, int i_mb_type,
  44.                     int ctx0, int ctx1, int ctx2, int ctx3, int ctx4, int ctx5 )
  45. {
  46.     if( i_mb_type == I_4x4 || i_mb_type == I_8x8 )
  47.     {
  48.         x264_cabac_encode_decision( cb, ctx0, 0 );
  49.     }
  50.     else if( i_mb_type == I_PCM )
  51.     {
  52.         x264_cabac_encode_decision( cb, ctx0, 1 );
  53.         x264_cabac_encode_terminal( cb,       1 );
  54.         x264_cabac_encode_flush( cb );
  55.     }
  56.     else
  57.     {
  58.         int i_pred = x264_mb_pred_mode16x16_fix[h->mb.i_intra16x16_pred_mode];
  59.         x264_cabac_encode_decision( cb, ctx0, 1 );
  60.         x264_cabac_encode_terminal( cb,       0 );
  61.         x264_cabac_encode_decision( cb, ctx1, ( h->mb.i_cbp_luma == 0 ? 0 : 1 ));
  62.         if( h->mb.i_cbp_chroma == 0 )
  63.         {
  64.             x264_cabac_encode_decision( cb, ctx2, 0 );
  65.         }
  66.         else
  67.         {
  68.             x264_cabac_encode_decision( cb, ctx2, 1 );
  69.             x264_cabac_encode_decision( cb, ctx3, ( h->mb.i_cbp_chroma == 1 ? 0 : 1 ) );
  70.         }
  71.         x264_cabac_encode_decision( cb, ctx4, ( (i_pred / 2) ? 1 : 0 ));
  72.         x264_cabac_encode_decision( cb, ctx5, ( (i_pred % 2) ? 1 : 0 ));
  73.     }
  74. }
  75. static void x264_cabac_mb_type( x264_t *h, x264_cabac_t *cb )
  76. {
  77.     const int i_mb_type = h->mb.i_type;
  78.     if( h->sh.i_type == SLICE_TYPE_I )
  79.     {
  80.         int ctx = 0;
  81.         if( h->mb.i_mb_type_left >= 0 && h->mb.i_mb_type_left != I_4x4 )
  82.         {
  83.             ctx++;
  84.         }
  85.         if( h->mb.i_mb_type_top >= 0 && h->mb.i_mb_type_top != I_4x4 )
  86.         {
  87.             ctx++;
  88.         }
  89.         x264_cabac_mb_type_intra( h, cb, i_mb_type, 3+ctx, 3+3, 3+4, 3+5, 3+6, 3+7 );
  90.     }
  91.     else if( h->sh.i_type == SLICE_TYPE_P )
  92.     {
  93.         /* prefix: 14, suffix: 17 */
  94.         if( i_mb_type == P_L0 )
  95.         {
  96.             if( h->mb.i_partition == D_16x16 )
  97.             {
  98.                 x264_cabac_encode_decision( cb, 14, 0 );
  99.                 x264_cabac_encode_decision( cb, 15, 0 );
  100.                 x264_cabac_encode_decision( cb, 16, 0 );
  101.             }
  102.             else if( h->mb.i_partition == D_16x8 )
  103.             {
  104.                 x264_cabac_encode_decision( cb, 14, 0 );
  105.                 x264_cabac_encode_decision( cb, 15, 1 );
  106.                 x264_cabac_encode_decision( cb, 17, 1 );
  107.             }
  108.             else if( h->mb.i_partition == D_8x16 )
  109.             {
  110.                 x264_cabac_encode_decision( cb, 14, 0 );
  111.                 x264_cabac_encode_decision( cb, 15, 1 );
  112.                 x264_cabac_encode_decision( cb, 17, 0 );
  113.             }
  114.         }
  115.         else if( i_mb_type == P_8x8 )
  116.         {
  117.             x264_cabac_encode_decision( cb, 14, 0 );
  118.             x264_cabac_encode_decision( cb, 15, 0 );
  119.             x264_cabac_encode_decision( cb, 16, 1 );
  120.         }
  121.         else /* intra */
  122.         {
  123.             /* prefix */
  124.             x264_cabac_encode_decision( cb, 14, 1 );
  125.             /* suffix */
  126.             x264_cabac_mb_type_intra( h, cb, i_mb_type, 17+0, 17+1, 17+2, 17+2, 17+3, 17+3 );
  127.         }
  128.     }
  129.     else if( h->sh.i_type == SLICE_TYPE_B )
  130.     {
  131.         int ctx = 0;
  132.         if( h->mb.i_mb_type_left >= 0 && h->mb.i_mb_type_left != B_SKIP && h->mb.i_mb_type_left != B_DIRECT )
  133.         {
  134.             ctx++;
  135.         }
  136.         if( h->mb.i_mb_type_top >= 0 && h->mb.i_mb_type_top != B_SKIP && h->mb.i_mb_type_top != B_DIRECT )
  137.         {
  138.             ctx++;
  139.         }
  140.         if( i_mb_type == B_DIRECT )
  141.         {
  142.             x264_cabac_encode_decision( cb, 27+ctx, 0 );
  143.         }
  144.         else if( i_mb_type == B_8x8 )
  145.         {
  146.             x264_cabac_encode_decision( cb, 27+ctx, 1 );
  147.             x264_cabac_encode_decision( cb, 27+3,   1 );
  148.             x264_cabac_encode_decision( cb, 27+4,   1 );
  149.             x264_cabac_encode_decision( cb, 27+5,   1 );
  150.             x264_cabac_encode_decision( cb, 27+5,   1 );
  151.             x264_cabac_encode_decision( cb, 27+5,   1 );
  152.         }
  153.         else if( IS_INTRA( i_mb_type ) )
  154.         {
  155.             /* prefix */
  156.             x264_cabac_encode_decision( cb, 27+ctx, 1 );
  157.             x264_cabac_encode_decision( cb, 27+3,   1 );
  158.             x264_cabac_encode_decision( cb, 27+4,   1 );
  159.             x264_cabac_encode_decision( cb, 27+5,   1 );
  160.             x264_cabac_encode_decision( cb, 27+5,   0 );
  161.             x264_cabac_encode_decision( cb, 27+5,   1 );
  162.             /* suffix */
  163.             x264_cabac_mb_type_intra( h, cb, i_mb_type, 32+0, 32+1, 32+2, 32+2, 32+3, 32+3 );
  164.         }
  165.         else
  166.         {
  167.             static const int i_mb_len[9*3] =
  168.             {
  169.                 6, 6, 3,    /* L0 L0 */
  170.                 6, 6, 0,    /* L0 L1 */
  171.                 7, 7, 0,    /* L0 BI */
  172.                 6, 6, 0,    /* L1 L0 */
  173.                 6, 6, 3,    /* L1 L1 */
  174.                 7, 7, 0,    /* L1 BI */
  175.                 7, 7, 0,    /* BI L0 */
  176.                 7, 7, 0,    /* BI L1 */
  177.                 7, 7, 6,    /* BI BI */
  178.             };
  179.             static const int i_mb_bits[9*3][7] =
  180.             {
  181.                 { 1,1,0,0,0,1   }, { 1,1,0,0,1,0,  }, { 1,0,0 },       /* L0 L0 */
  182.                 { 1,1,0,1,0,1   }, { 1,1,0,1,1,0   }, {0},             /* L0 L1 */
  183.                 { 1,1,1,0,0,0,0 }, { 1,1,1,0,0,0,1 }, {0},             /* L0 BI */
  184.                 { 1,1,0,1,1,1   }, { 1,1,1,1,1,0   }, {0},             /* L1 L0 */
  185.                 { 1,1,0,0,1,1   }, { 1,1,0,1,0,0   }, { 1,0,1 },       /* L1 L1 */
  186.                 { 1,1,1,0,0,1,0 }, { 1,1,1,0,0,1,1 }, {0},             /* L1 BI */
  187.                 { 1,1,1,0,1,0,0 }, { 1,1,1,0,1,0,1 }, {0},             /* BI L0 */
  188.                 { 1,1,1,0,1,1,0 }, { 1,1,1,0,1,1,1 }, {0},             /* BI L1 */
  189.                 { 1,1,1,1,0,0,0 }, { 1,1,1,1,0,0,1 }, { 1,1,0,0,0,0 }, /* BI BI */
  190.             };
  191.             const int idx = (i_mb_type - B_L0_L0) * 3 + (h->mb.i_partition - D_16x8);
  192.             int i;
  193.             x264_cabac_encode_decision( cb, 27+ctx, i_mb_bits[idx][0] );
  194.             x264_cabac_encode_decision( cb, 27+3,   i_mb_bits[idx][1] );
  195.             x264_cabac_encode_decision( cb, 27+5-i_mb_bits[idx][1], i_mb_bits[idx][2] );
  196.             for( i = 3; i < i_mb_len[idx]; i++ )
  197.                 x264_cabac_encode_decision( cb, 27+5, i_mb_bits[idx][i] );
  198.         }
  199.     }
  200.     else
  201.     {
  202.         x264_log(h, X264_LOG_ERROR, "unknown SLICE_TYPE unsupported in x264_macroblock_write_cabacn" );
  203.     }
  204. }
  205. static void x264_cabac_mb_intra4x4_pred_mode( x264_cabac_t *cb, int i_pred, int i_mode )
  206. {
  207.     if( i_pred == i_mode )
  208.     {
  209.         /* b_prev_intra4x4_pred_mode */
  210.         x264_cabac_encode_decision( cb, 68, 1 );
  211.     }
  212.     else
  213.     {
  214.         /* b_prev_intra4x4_pred_mode */
  215.         x264_cabac_encode_decision( cb, 68, 0 );
  216.         if( i_mode > i_pred  )
  217.         {
  218.             i_mode--;
  219.         }
  220.         x264_cabac_encode_decision( cb, 69, (i_mode     )&0x01 );
  221.         x264_cabac_encode_decision( cb, 69, (i_mode >> 1)&0x01 );
  222.         x264_cabac_encode_decision( cb, 69, (i_mode >> 2)&0x01 );
  223.     }
  224. }
  225. static void x264_cabac_mb_intra_chroma_pred_mode( x264_t *h, x264_cabac_t *cb )
  226. {
  227.     const int i_mode = x264_mb_pred_mode8x8c_fix[ h->mb.i_chroma_pred_mode ];
  228.     int       ctx = 0;
  229.     /* No need to test for I4x4 or I_16x16 as cache_save handle that */
  230.     if( (h->mb.i_neighbour & MB_LEFT) && h->mb.chroma_pred_mode[h->mb.i_mb_xy - 1] != 0 )
  231.     {
  232.         ctx++;
  233.     }
  234.     if( (h->mb.i_neighbour & MB_TOP) && h->mb.chroma_pred_mode[h->mb.i_mb_xy - h->mb.i_mb_stride] != 0 )
  235.     {
  236.         ctx++;
  237.     }
  238.     if( i_mode == 0 )
  239.     {
  240.         x264_cabac_encode_decision( cb, 64 + ctx, 0 );
  241.     }
  242.     else
  243.     {
  244.         x264_cabac_encode_decision( cb, 64 + ctx, 1 );
  245.         x264_cabac_encode_decision( cb, 64 + 3, ( i_mode == 1 ? 0 : 1 ) );
  246.         if( i_mode > 1 )
  247.         {
  248.             x264_cabac_encode_decision( cb, 64 + 3, ( i_mode == 2 ? 0 : 1 ) );
  249.         }
  250.     }
  251. }
  252. static void x264_cabac_mb_cbp_luma( x264_t *h, x264_cabac_t *cb )
  253. {
  254.     /* TODO: clean up and optimize */
  255.     int i8x8;
  256.     for( i8x8 = 0; i8x8 < 4; i8x8++ )
  257.     {
  258.         int i_mba_xy = -1;
  259.         int i_mbb_xy = -1;
  260.         int x = block_idx_x[4*i8x8];
  261.         int y = block_idx_y[4*i8x8];
  262.         int ctx = 0;
  263.         if( x > 0 )
  264.             i_mba_xy = h->mb.i_mb_xy;
  265.         else if( h->mb.i_neighbour & MB_LEFT )
  266.             i_mba_xy = h->mb.i_mb_xy - 1;
  267.         if( y > 0 )
  268.             i_mbb_xy = h->mb.i_mb_xy;
  269.         else if( h->mb.i_neighbour & MB_TOP )
  270.             i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
  271.         /* No need to test for PCM and SKIP */
  272.         if( i_mba_xy >= 0 )
  273.         {
  274.             const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
  275.             if( ((h->mb.cbp[i_mba_xy] >> i8x8a)&0x01) == 0 )
  276.             {
  277.                 ctx++;
  278.             }
  279.         }
  280.         if( i_mbb_xy >= 0 )
  281.         {
  282.             const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
  283.             if( ((h->mb.cbp[i_mbb_xy] >> i8x8b)&0x01) == 0 )
  284.             {
  285.                 ctx += 2;
  286.             }
  287.         }
  288.         x264_cabac_encode_decision( cb, 73 + ctx, (h->mb.i_cbp_luma >> i8x8)&0x01 );
  289.     }
  290. }
  291. static void x264_cabac_mb_cbp_chroma( x264_t *h, x264_cabac_t *cb )
  292. {
  293.     int cbp_a = -1;
  294.     int cbp_b = -1;
  295.     int ctx;
  296.     /* No need to test for SKIP/PCM */
  297.     if( h->mb.i_neighbour & MB_LEFT )
  298.     {
  299.         cbp_a = (h->mb.cbp[h->mb.i_mb_xy - 1] >> 4)&0x3;
  300.     }
  301.     if( h->mb.i_neighbour & MB_TOP )
  302.     {
  303.         cbp_b = (h->mb.cbp[h->mb.i_mb_xy - h->mb.i_mb_stride] >> 4)&0x3;
  304.     }
  305.     ctx = 0;
  306.     if( cbp_a > 0 ) ctx++;
  307.     if( cbp_b > 0 ) ctx += 2;
  308.     if( h->mb.i_cbp_chroma == 0 )
  309.     {
  310.         x264_cabac_encode_decision( cb, 77 + ctx, 0 );
  311.     }
  312.     else
  313.     {
  314.         x264_cabac_encode_decision( cb, 77 + ctx, 1 );
  315.         ctx = 4;
  316.         if( cbp_a == 2 ) ctx++;
  317.         if( cbp_b == 2 ) ctx += 2;
  318.         x264_cabac_encode_decision( cb, 77 + ctx, h->mb.i_cbp_chroma > 1 ? 1 : 0 );
  319.     }
  320. }
  321. /* TODO check it with != qp per mb */
  322. static void x264_cabac_mb_qp_delta( x264_t *h, x264_cabac_t *cb )
  323. {
  324.     int i_mbn_xy = h->mb.i_mb_xy - 1;
  325.     int i_dqp = h->mb.i_qp - h->mb.i_last_qp;
  326.     int ctx;
  327.     /* No need to test for PCM / SKIP */
  328.     if( i_mbn_xy >= h->sh.i_first_mb && h->mb.i_last_dqp != 0 &&
  329.         ( h->mb.type[i_mbn_xy] == I_16x16 || (h->mb.cbp[i_mbn_xy]&0x3f) ) )
  330.         ctx = 1;
  331.     else
  332.         ctx = 0;
  333.     if( i_dqp != 0 )
  334.     {
  335.         int val = i_dqp <= 0 ? (-2*i_dqp) : (2*i_dqp - 1);
  336.         /* dqp is interpreted modulo 52 */
  337.         if( val > 52 )
  338.             val = 103 - val;
  339.         while( val-- )
  340.         {
  341.             x264_cabac_encode_decision( cb, 60 + ctx, 1 );
  342.             if( ctx < 2 )
  343.                 ctx = 2;
  344.             else
  345.                 ctx = 3;
  346.         }
  347.     }
  348.     x264_cabac_encode_decision( cb, 60 + ctx, 0 );
  349. }
  350. void x264_cabac_mb_skip( x264_t *h, int b_skip )
  351. {
  352.     int ctx = 0;
  353.     if( h->mb.i_mb_type_left >= 0 && !IS_SKIP( h->mb.i_mb_type_left ) )
  354.     {
  355.         ctx++;
  356.     }
  357.     if( h->mb.i_mb_type_top >= 0 && !IS_SKIP( h->mb.i_mb_type_top ) )
  358.     {
  359.         ctx++;
  360.     }
  361.     if( h->sh.i_type == SLICE_TYPE_P )
  362.         x264_cabac_encode_decision( &h->cabac, 11 + ctx, b_skip ? 1 : 0 );
  363.     else /* SLICE_TYPE_B */
  364.         x264_cabac_encode_decision( &h->cabac, 24 + ctx, b_skip ? 1 : 0 );
  365. }
  366. static inline void x264_cabac_mb_sub_p_partition( x264_cabac_t *cb, int i_sub )
  367. {
  368.     if( i_sub == D_L0_8x8 )
  369.     {
  370.         x264_cabac_encode_decision( cb, 21, 1 );
  371.     }
  372.     else if( i_sub == D_L0_8x4 )
  373.     {
  374.         x264_cabac_encode_decision( cb, 21, 0 );
  375.         x264_cabac_encode_decision( cb, 22, 0 );
  376.     }
  377.     else if( i_sub == D_L0_4x8 )
  378.     {
  379.         x264_cabac_encode_decision( cb, 21, 0 );
  380.         x264_cabac_encode_decision( cb, 22, 1 );
  381.         x264_cabac_encode_decision( cb, 23, 1 );
  382.     }
  383.     else if( i_sub == D_L0_4x4 )
  384.     {
  385.         x264_cabac_encode_decision( cb, 21, 0 );
  386.         x264_cabac_encode_decision( cb, 22, 1 );
  387.         x264_cabac_encode_decision( cb, 23, 0 );
  388.     }
  389. }
  390. static inline void x264_cabac_mb_sub_b_partition( x264_cabac_t *cb, int i_sub )
  391. {
  392. #define WRITE_SUB_3(a,b,c) {
  393.         x264_cabac_encode_decision( cb, 36, a );
  394.         x264_cabac_encode_decision( cb, 37, b );
  395.         x264_cabac_encode_decision( cb, 39, c );
  396.     }
  397. #define WRITE_SUB_5(a,b,c,d,e) {
  398.         x264_cabac_encode_decision( cb, 36, a );
  399.         x264_cabac_encode_decision( cb, 37, b );
  400.         x264_cabac_encode_decision( cb, 38, c );
  401.         x264_cabac_encode_decision( cb, 39, d );
  402.         x264_cabac_encode_decision( cb, 39, e );
  403.     }
  404. #define WRITE_SUB_6(a,b,c,d,e,f) {
  405.         WRITE_SUB_5(a,b,c,d,e)
  406.         x264_cabac_encode_decision( cb, 39, f );
  407.     }
  408.     switch( i_sub )
  409.     {
  410.         case D_DIRECT_8x8:
  411.             x264_cabac_encode_decision( cb, 36, 0 );
  412.             break;
  413.         case D_L0_8x8: WRITE_SUB_3(1,0,0); break;
  414.         case D_L1_8x8: WRITE_SUB_3(1,0,1); break;
  415.         case D_BI_8x8: WRITE_SUB_5(1,1,0,0,0); break;
  416.         case D_L0_8x4: WRITE_SUB_5(1,1,0,0,1); break;
  417.         case D_L0_4x8: WRITE_SUB_5(1,1,0,1,0); break;
  418.         case D_L1_8x4: WRITE_SUB_5(1,1,0,1,1); break;
  419.         case D_L1_4x8: WRITE_SUB_6(1,1,1,0,0,0); break;
  420.         case D_BI_8x4: WRITE_SUB_6(1,1,1,0,0,1); break;
  421.         case D_BI_4x8: WRITE_SUB_6(1,1,1,0,1,0); break;
  422.         case D_L0_4x4: WRITE_SUB_6(1,1,1,0,1,1); break;
  423.         case D_L1_4x4: WRITE_SUB_5(1,1,1,1,0); break;
  424.         case D_BI_4x4: WRITE_SUB_5(1,1,1,1,1); break;
  425.     }
  426. }
  427. static inline void x264_cabac_mb_transform_size( x264_t *h, x264_cabac_t *cb )
  428. {
  429.     int ctx = 399 + h->mb.cache.i_neighbour_transform_size;
  430.     x264_cabac_encode_decision( cb, ctx, h->mb.b_transform_8x8 );
  431. }
  432. static inline void x264_cabac_mb_ref( x264_t *h, x264_cabac_t *cb, int i_list, int idx )
  433. {
  434.     const int i8 = x264_scan8[idx];
  435.     const int i_refa = h->mb.cache.ref[i_list][i8 - 1];
  436.     const int i_refb = h->mb.cache.ref[i_list][i8 - 8];
  437.     int i_ref  = h->mb.cache.ref[i_list][i8];
  438.     int ctx  = 0;
  439.     if( i_refa > 0 && !h->mb.cache.skip[i8 - 1])
  440.         ctx++;
  441.     if( i_refb > 0 && !h->mb.cache.skip[i8 - 8])
  442.         ctx += 2;
  443.     while( i_ref > 0 )
  444.     {
  445.         x264_cabac_encode_decision( cb, 54 + ctx, 1 );
  446.         if( ctx < 4 )
  447.             ctx = 4;
  448.         else
  449.             ctx = 5;
  450.         i_ref--;
  451.     }
  452.     x264_cabac_encode_decision( cb, 54 + ctx, 0 );
  453. }
  454. static inline void  x264_cabac_mb_mvd_cpn( x264_t *h, x264_cabac_t *cb, int i_list, int idx, int l, int mvd )
  455. {
  456.     const int amvd = abs( h->mb.cache.mvd[i_list][x264_scan8[idx] - 1][l] ) +
  457.                      abs( h->mb.cache.mvd[i_list][x264_scan8[idx] - 8][l] );
  458.     const int i_abs = abs( mvd );
  459.     const int i_prefix = X264_MIN( i_abs, 9 );
  460.     const int ctxbase = (l == 0 ? 40 : 47);
  461.     int ctx;
  462.     int i;
  463.     if( amvd < 3 )
  464.         ctx = 0;
  465.     else if( amvd > 32 )
  466.         ctx = 2;
  467.     else
  468.         ctx = 1;
  469.     for( i = 0; i < i_prefix; i++ )
  470.     {
  471.         x264_cabac_encode_decision( cb, ctxbase + ctx, 1 );
  472.         if( ctx < 3 )
  473.             ctx = 3;
  474.         else if( ctx < 6 )
  475.             ctx++;
  476.     }
  477.     if( i_prefix < 9 )
  478.         x264_cabac_encode_decision( cb, ctxbase + ctx, 0 );
  479.     else
  480.         x264_cabac_encode_ue_bypass( cb, 3, i_abs - 9 );
  481.     /* sign */
  482.     if( mvd > 0 )
  483.         x264_cabac_encode_bypass( cb, 0 );
  484.     else if( mvd < 0 )
  485.         x264_cabac_encode_bypass( cb, 1 );
  486. }
  487. static inline void x264_cabac_mb_mvd( x264_t *h, x264_cabac_t *cb, int i_list, int idx, int width, int height )
  488. {
  489.     int mvp[2];
  490.     int mdx, mdy;
  491.     /* Calculate mvd */
  492.     x264_mb_predict_mv( h, i_list, idx, width, mvp );
  493.     mdx = h->mb.cache.mv[i_list][x264_scan8[idx]][0] - mvp[0];
  494.     mdy = h->mb.cache.mv[i_list][x264_scan8[idx]][1] - mvp[1];
  495.     /* encode */
  496.     x264_cabac_mb_mvd_cpn( h, cb, i_list, idx, 0, mdx );
  497.     x264_cabac_mb_mvd_cpn( h, cb, i_list, idx, 1, mdy );
  498.     /* save value */
  499.     x264_macroblock_cache_mvd( h, block_idx_x[idx], block_idx_y[idx], width, height, i_list, mdx, mdy );
  500. }
  501. static inline void x264_cabac_mb8x8_mvd( x264_t *h, x264_cabac_t *cb, int i_list )
  502. {
  503.     int i;
  504.     for( i = 0; i < 4; i++ )
  505.     {
  506.         if( !x264_mb_partition_listX_table[i_list][ h->mb.i_sub_partition[i] ] )
  507.         {
  508.             continue;
  509.         }
  510.         switch( h->mb.i_sub_partition[i] )
  511.         {
  512.             case D_L0_8x8:
  513.             case D_L1_8x8:
  514.             case D_BI_8x8:
  515.                 x264_cabac_mb_mvd( h, cb, i_list, 4*i, 2, 2 );
  516.                 break;
  517.             case D_L0_8x4:
  518.             case D_L1_8x4:
  519.             case D_BI_8x4:
  520.                 x264_cabac_mb_mvd( h, cb, i_list, 4*i+0, 2, 1 );
  521.                 x264_cabac_mb_mvd( h, cb, i_list, 4*i+2, 2, 1 );
  522.                 break;
  523.             case D_L0_4x8:
  524.             case D_L1_4x8:
  525.             case D_BI_4x8:
  526.                 x264_cabac_mb_mvd( h, cb, i_list, 4*i+0, 1, 2 );
  527.                 x264_cabac_mb_mvd( h, cb, i_list, 4*i+1, 1, 2 );
  528.                 break;
  529.             case D_L0_4x4:
  530.             case D_L1_4x4:
  531.             case D_BI_4x4:
  532.                 x264_cabac_mb_mvd( h, cb, i_list, 4*i+0, 1, 1 );
  533.                 x264_cabac_mb_mvd( h, cb, i_list, 4*i+1, 1, 1 );
  534.                 x264_cabac_mb_mvd( h, cb, i_list, 4*i+2, 1, 1 );
  535.                 x264_cabac_mb_mvd( h, cb, i_list, 4*i+3, 1, 1 );
  536.                 break;
  537.         }
  538.     }
  539. }
  540. static int x264_cabac_mb_cbf_ctxidxinc( x264_t *h, int i_cat, int i_idx )
  541. {
  542.     /* TODO: clean up/optimize */
  543.     int i_mba_xy = -1;
  544.     int i_mbb_xy = -1;
  545.     int i_nza = -1;
  546.     int i_nzb = -1;
  547.     int ctx = 4 * i_cat;
  548.     if( i_cat == DCT_LUMA_DC )
  549.     {
  550.         if( h->mb.i_neighbour & MB_LEFT )
  551.         {
  552.             i_mba_xy = h->mb.i_mb_xy -1;
  553.             if( h->mb.type[i_mba_xy] == I_16x16 )
  554.             {
  555.                 i_nza = h->mb.cbp[i_mba_xy]&0x100;
  556.             }
  557.         }
  558.         if( h->mb.i_neighbour & MB_TOP )
  559.         {
  560.             i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
  561.             if( h->mb.type[i_mbb_xy] == I_16x16 )
  562.             {
  563.                 i_nzb = h->mb.cbp[i_mbb_xy]&0x100;
  564.             }
  565.         }
  566.     }
  567.     else if( i_cat == DCT_LUMA_AC || i_cat == DCT_LUMA_4x4 )
  568.     {
  569.         int x = block_idx_x[i_idx];
  570.         int y = block_idx_y[i_idx];
  571.         if( x > 0 )
  572.             i_mba_xy = h->mb.i_mb_xy;
  573.         else if( h->mb.i_neighbour & MB_LEFT )
  574.             i_mba_xy = h->mb.i_mb_xy -1;
  575.         if( y > 0 )
  576.             i_mbb_xy = h->mb.i_mb_xy;
  577.         else if( h->mb.i_neighbour & MB_TOP )
  578.             i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
  579.         /* no need to test for skip/pcm */
  580.         if( i_mba_xy >= 0 )
  581.         {
  582.             const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
  583.             if( (h->mb.cbp[i_mba_xy]&0x0f)>> i8x8a )
  584.             {
  585.                 i_nza = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 1];
  586.             }
  587.         }
  588.         if( i_mbb_xy >= 0 )
  589.         {
  590.             const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
  591.             if( (h->mb.cbp[i_mbb_xy]&0x0f)>> i8x8b )
  592.             {
  593.                 i_nzb = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 8];
  594.             }
  595.         }
  596.     }
  597.     else if( i_cat == DCT_CHROMA_DC )
  598.     {
  599.         /* no need to test skip/pcm */
  600.         if( h->mb.i_neighbour & MB_LEFT )
  601.         {
  602.             i_mba_xy = h->mb.i_mb_xy -1;
  603.             if( h->mb.cbp[i_mba_xy]&0x30 )
  604.             {
  605.                 i_nza = h->mb.cbp[i_mba_xy]&( 0x02 << ( 8 + i_idx) );
  606.             }
  607.         }
  608.         if( h->mb.i_neighbour & MB_TOP )
  609.         {
  610.             i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
  611.             if( h->mb.cbp[i_mbb_xy]&0x30 )
  612.             {
  613.                 i_nzb = h->mb.cbp[i_mbb_xy]&( 0x02 << ( 8 + i_idx) );
  614.             }
  615.         }
  616.     }
  617.     else if( i_cat == DCT_CHROMA_AC )
  618.     {
  619.         if( i_idx & 1 )
  620.             i_mba_xy = h->mb.i_mb_xy;
  621.         else if( h->mb.i_neighbour & MB_LEFT )
  622.             i_mba_xy = h->mb.i_mb_xy - 1;
  623.         if( i_idx & 2 )
  624.             i_mbb_xy = h->mb.i_mb_xy;
  625.         else if( h->mb.i_neighbour & MB_TOP )
  626.             i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
  627.         /* no need to test skip/pcm */
  628.         if( i_mba_xy >= 0 && (h->mb.cbp[i_mba_xy]&0x30) == 0x20 )
  629.         {
  630.             i_nza = h->mb.cache.non_zero_count[x264_scan8[16+i_idx] - 1];
  631.         }
  632.         if( i_mbb_xy >= 0 && (h->mb.cbp[i_mbb_xy]&0x30) == 0x20 )
  633.         {
  634.             i_nzb = h->mb.cache.non_zero_count[x264_scan8[16+i_idx] - 8];
  635.         }
  636.     }
  637.     if( ( i_mba_xy < 0  && IS_INTRA( h->mb.i_type ) ) || i_nza > 0 )
  638.     {
  639.         ctx++;
  640.     }
  641.     if( ( i_mbb_xy < 0  && IS_INTRA( h->mb.i_type ) ) || i_nzb > 0 )
  642.     {
  643.         ctx += 2;
  644.     }
  645.     return ctx;
  646. }
  647. static const int significant_coeff_flag_offset[6] = { 105, 120, 134, 149, 152, 402 };
  648. static const int last_coeff_flag_offset[6] = { 166, 181, 195, 210, 213, 417 };
  649. static const int coeff_abs_level_m1_offset[6] = { 227, 237, 247, 257, 266, 426 };
  650. static const int significant_coeff_flag_offset_8x8[63] = {
  651.     0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
  652.     4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
  653.     7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
  654.    12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12
  655. };
  656. static const int last_coeff_flag_offset_8x8[63] = {
  657.     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  658.     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  659.     3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  660.     5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
  661. };
  662. static void block_residual_write_cabac( x264_t *h, x264_cabac_t *cb, int i_ctxBlockCat, int i_idx, int *l, int i_count )
  663. {
  664.     const int i_ctx_sig = significant_coeff_flag_offset[i_ctxBlockCat];
  665.     const int i_ctx_last = last_coeff_flag_offset[i_ctxBlockCat];
  666.     const int i_ctx_level = coeff_abs_level_m1_offset[i_ctxBlockCat];
  667.     int i_coeff_abs_m1[64];
  668.     int i_coeff_sign[64];
  669.     int i_coeff = 0;
  670.     int i_last  = 0;
  671.     int i_sigmap_size;
  672.     int i_abslevel1 = 0;
  673.     int i_abslevelgt1 = 0;
  674.     int i;
  675.     /* i_ctxBlockCat: 0-> DC 16x16  i_idx = 0
  676.      *                1-> AC 16x16  i_idx = luma4x4idx
  677.      *                2-> Luma4x4   i_idx = luma4x4idx
  678.      *                3-> DC Chroma i_idx = iCbCr
  679.      *                4-> AC Chroma i_idx = 4 * iCbCr + chroma4x4idx
  680.      *                5-> Luma8x8   i_idx = luma8x8idx
  681.      */
  682.     for( i = 0; i < i_count; i++ )
  683.     {
  684.         if( l[i] != 0 )
  685.         {
  686.             i_coeff_abs_m1[i_coeff] = abs( l[i] ) - 1;
  687.             i_coeff_sign[i_coeff]   = ( l[i] < 0 );
  688.             i_coeff++;
  689.             i_last = i;
  690.         }
  691.     }
  692.     if( i_count != 64 )
  693.     {
  694.         /* coded block flag */
  695.         x264_cabac_encode_decision( cb, 85 + x264_cabac_mb_cbf_ctxidxinc( h, i_ctxBlockCat, i_idx ), i_coeff != 0 );
  696.         if( i_coeff == 0 )
  697.             return;
  698.     }
  699.     i_sigmap_size = X264_MIN( i_last+1, i_count-1 );
  700.     for( i = 0; i < i_sigmap_size; i++ )
  701.     {
  702.         int i_sig_ctxIdxInc;
  703.         int i_last_ctxIdxInc;
  704.         if( i_ctxBlockCat == DCT_LUMA_8x8 )
  705.         {
  706.             i_sig_ctxIdxInc = significant_coeff_flag_offset_8x8[i];
  707.             i_last_ctxIdxInc = last_coeff_flag_offset_8x8[i];
  708.         }
  709.         else
  710.             i_sig_ctxIdxInc = i_last_ctxIdxInc = i;
  711.         x264_cabac_encode_decision( cb, i_ctx_sig + i_sig_ctxIdxInc, l[i] != 0 );
  712.         if( l[i] != 0 )
  713.             x264_cabac_encode_decision( cb, i_ctx_last + i_last_ctxIdxInc, i == i_last );
  714.     }
  715.     for( i = i_coeff - 1; i >= 0; i-- )
  716.     {
  717.         /* write coeff_abs - 1 */
  718.         const int i_prefix = X264_MIN( i_coeff_abs_m1[i], 14 );
  719.         const int i_ctxIdxInc = (i_abslevelgt1 ? 0 : X264_MIN( 4, i_abslevel1 + 1 )) + i_ctx_level;
  720.         x264_cabac_encode_decision( cb, i_ctxIdxInc, i_prefix != 0 );
  721.         if( i_prefix != 0 )
  722.         {
  723.             const int i_ctxIdxInc = 5 + X264_MIN( 4, i_abslevelgt1 ) + i_ctx_level;
  724.             int j;
  725.             for( j = 0; j < i_prefix - 1; j++ )
  726.                 x264_cabac_encode_decision( cb, i_ctxIdxInc, 1 );
  727.             if( i_prefix < 14 )
  728.                 x264_cabac_encode_decision( cb, i_ctxIdxInc, 0 );
  729.             else /* suffix */
  730.                 x264_cabac_encode_ue_bypass( cb, 0, i_coeff_abs_m1[i] - 14 );
  731.             i_abslevelgt1++;
  732.         }
  733.         else
  734.             i_abslevel1++;
  735.         /* write sign */
  736.         x264_cabac_encode_bypass( cb, i_coeff_sign[i] );
  737.     }
  738. }
  739. void x264_macroblock_write_cabac( x264_t *h, x264_cabac_t *cb )
  740. {
  741.     const int i_mb_type = h->mb.i_type;
  742.     int i_list;
  743.     int i;
  744. #ifndef RDO_SKIP_BS
  745.     const int i_mb_pos_start = x264_cabac_pos( cb );
  746.     int       i_mb_pos_tex;
  747. #endif
  748.     /* Write the MB type */
  749.     x264_cabac_mb_type( h, cb );
  750.     /* PCM special block type UNTESTED */
  751.     if( i_mb_type == I_PCM )
  752.     {
  753. #ifdef RDO_SKIP_BS
  754.         cb->f8_bits_encoded += (384*8) << 8;
  755. #else
  756.         bs_t *s = cb->s;
  757.         bs_align_0( s );    /* not sure */
  758.         /* Luma */
  759.         for( i = 0; i < 16*16; i++ )
  760.         {
  761.             const int x = 16 * h->mb.i_mb_x + (i % 16);
  762.             const int y = 16 * h->mb.i_mb_y + (i / 16);
  763.             bs_write( s, 8, h->fenc->plane[0][y*h->mb.pic.i_stride[0]+x] );
  764.         }
  765.         /* Cb */
  766.         for( i = 0; i < 8*8; i++ )
  767.         {
  768.             const int x = 8 * h->mb.i_mb_x + (i % 8);
  769.             const int y = 8 * h->mb.i_mb_y + (i / 8);
  770.             bs_write( s, 8, h->fenc->plane[1][y*h->mb.pic.i_stride[1]+x] );
  771.         }
  772.         /* Cr */
  773.         for( i = 0; i < 8*8; i++ )
  774.         {
  775.             const int x = 8 * h->mb.i_mb_x + (i % 8);
  776.             const int y = 8 * h->mb.i_mb_y + (i / 8);
  777.             bs_write( s, 8, h->fenc->plane[2][y*h->mb.pic.i_stride[2]+x] );
  778.         }
  779.         x264_cabac_encode_init( cb, s );
  780. #endif
  781.         return;
  782.     }
  783.     if( IS_INTRA( i_mb_type ) )
  784.     {
  785.         if( h->pps->b_transform_8x8_mode && i_mb_type != I_16x16 )
  786.             x264_cabac_mb_transform_size( h, cb );
  787.         if( i_mb_type != I_16x16 )
  788.         {
  789.             int di = (i_mb_type == I_8x8) ? 4 : 1;
  790.             for( i = 0; i < 16; i += di )
  791.             {
  792.                 const int i_pred = x264_mb_predict_intra4x4_mode( h, i );
  793.                 const int i_mode = x264_mb_pred_mode4x4_fix( h->mb.cache.intra4x4_pred_mode[x264_scan8[i]] );
  794.                 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
  795.             }
  796.         }
  797.         x264_cabac_mb_intra_chroma_pred_mode( h, cb );
  798.     }
  799.     else if( i_mb_type == P_L0 )
  800.     {
  801.         if( h->mb.i_partition == D_16x16 )
  802.         {
  803.             if( h->sh.i_num_ref_idx_l0_active > 1 )
  804.             {
  805.                 x264_cabac_mb_ref( h, cb, 0, 0 );
  806.             }
  807.             x264_cabac_mb_mvd( h, cb, 0, 0, 4, 4 );
  808.         }
  809.         else if( h->mb.i_partition == D_16x8 )
  810.         {
  811.             if( h->sh.i_num_ref_idx_l0_active > 1 )
  812.             {
  813.                 x264_cabac_mb_ref( h, cb, 0, 0 );
  814.                 x264_cabac_mb_ref( h, cb, 0, 8 );
  815.             }
  816.             x264_cabac_mb_mvd( h, cb, 0, 0, 4, 2 );
  817.             x264_cabac_mb_mvd( h, cb, 0, 8, 4, 2 );
  818.         }
  819.         else if( h->mb.i_partition == D_8x16 )
  820.         {
  821.             if( h->sh.i_num_ref_idx_l0_active > 1 )
  822.             {
  823.                 x264_cabac_mb_ref( h, cb, 0, 0 );
  824.                 x264_cabac_mb_ref( h, cb, 0, 4 );
  825.             }
  826.             x264_cabac_mb_mvd( h, cb, 0, 0, 2, 4 );
  827.             x264_cabac_mb_mvd( h, cb, 0, 4, 2, 4 );
  828.         }
  829.     }
  830.     else if( i_mb_type == P_8x8 )
  831.     {
  832.         /* sub mb type */
  833.         x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[0] );
  834.         x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[1] );
  835.         x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[2] );
  836.         x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[3] );
  837.         /* ref 0 */
  838.         if( h->sh.i_num_ref_idx_l0_active > 1 )
  839.         {
  840.             x264_cabac_mb_ref( h, cb, 0, 0 );
  841.             x264_cabac_mb_ref( h, cb, 0, 4 );
  842.             x264_cabac_mb_ref( h, cb, 0, 8 );
  843.             x264_cabac_mb_ref( h, cb, 0, 12 );
  844.         }
  845.         x264_cabac_mb8x8_mvd( h, cb, 0 );
  846.     }
  847.     else if( i_mb_type == B_8x8 )
  848.     {
  849.         /* sub mb type */
  850.         x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[0] );
  851.         x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[1] );
  852.         x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[2] );
  853.         x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[3] );
  854.         /* ref */
  855.         for( i_list = 0; i_list < 2; i_list++ )
  856.         {
  857.             if( ( i_list ? h->sh.i_num_ref_idx_l1_active : h->sh.i_num_ref_idx_l0_active ) == 1 )
  858.                 continue;
  859.             for( i = 0; i < 4; i++ )
  860.                 if( x264_mb_partition_listX_table[i_list][ h->mb.i_sub_partition[i] ] )
  861.                     x264_cabac_mb_ref( h, cb, i_list, 4*i );
  862.         }
  863.         x264_cabac_mb8x8_mvd( h, cb, 0 );
  864.         x264_cabac_mb8x8_mvd( h, cb, 1 );
  865.     }
  866.     else if( i_mb_type != B_DIRECT )
  867.     {
  868.         /* All B mode */
  869.         int b_list[2][2];
  870.         /* init ref list utilisations */
  871.         for( i = 0; i < 2; i++ )
  872.         {
  873.             b_list[0][i] = x264_mb_type_list0_table[i_mb_type][i];
  874.             b_list[1][i] = x264_mb_type_list1_table[i_mb_type][i];
  875.         }
  876.         for( i_list = 0; i_list < 2; i_list++ )
  877.         {
  878.             const int i_ref_max = i_list == 0 ? h->sh.i_num_ref_idx_l0_active : h->sh.i_num_ref_idx_l1_active;
  879.             if( i_ref_max > 1 )
  880.             {
  881.                 if( h->mb.i_partition == D_16x16 )
  882.                 {
  883.                     if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
  884.                 }
  885.                 else if( h->mb.i_partition == D_16x8 )
  886.                 {
  887.                     if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
  888.                     if( b_list[i_list][1] ) x264_cabac_mb_ref( h, cb, i_list, 8 );
  889.                 }
  890.                 else if( h->mb.i_partition == D_8x16 )
  891.                 {
  892.                     if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
  893.                     if( b_list[i_list][1] ) x264_cabac_mb_ref( h, cb, i_list, 4 );
  894.                 }
  895.             }
  896.         }
  897.         for( i_list = 0; i_list < 2; i_list++ )
  898.         {
  899.             if( h->mb.i_partition == D_16x16 )
  900.             {
  901.                 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 4 );
  902.             }
  903.             else if( h->mb.i_partition == D_16x8 )
  904.             {
  905.                 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 2 );
  906.                 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 8, 4, 2 );
  907.             }
  908.             else if( h->mb.i_partition == D_8x16 )
  909.             {
  910.                 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 2, 4 );
  911.                 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 4, 2, 4 );
  912.             }
  913.         }
  914.     }
  915. #ifndef RDO_SKIP_BS
  916.     i_mb_pos_tex = x264_cabac_pos( cb );
  917.     h->stat.frame.i_hdr_bits += i_mb_pos_tex - i_mb_pos_start;
  918. #endif
  919.     if( i_mb_type != I_16x16 )
  920.     {
  921.         x264_cabac_mb_cbp_luma( h, cb );
  922.         x264_cabac_mb_cbp_chroma( h, cb );
  923.     }
  924.     if( h->mb.cache.b_transform_8x8_allowed && h->mb.i_cbp_luma && !IS_INTRA(i_mb_type) )
  925.     {
  926.         x264_cabac_mb_transform_size( h, cb );
  927.     }
  928.     if( h->mb.i_cbp_luma > 0 || h->mb.i_cbp_chroma > 0 || i_mb_type == I_16x16 )
  929.     {
  930.         x264_cabac_mb_qp_delta( h, cb );
  931.         /* write residual */
  932.         if( i_mb_type == I_16x16 )
  933.         {
  934.             /* DC Luma */
  935.             block_residual_write_cabac( h, cb, DCT_LUMA_DC, 0, h->dct.luma16x16_dc, 16 );
  936.             /* AC Luma */
  937.             if( h->mb.i_cbp_luma != 0 )
  938.                 for( i = 0; i < 16; i++ )
  939.                     block_residual_write_cabac( h, cb, DCT_LUMA_AC, i, h->dct.block[i].residual_ac, 15 );
  940.         }
  941.         else if( h->mb.b_transform_8x8 )
  942.         {
  943.             for( i = 0; i < 4; i++ )
  944.                 if( h->mb.i_cbp_luma & ( 1 << i ) )
  945.                     block_residual_write_cabac( h, cb, DCT_LUMA_8x8, i, h->dct.luma8x8[i], 64 );
  946.         }
  947.         else
  948.         {
  949.             for( i = 0; i < 16; i++ )
  950.                 if( h->mb.i_cbp_luma & ( 1 << ( i / 4 ) ) )
  951.                     block_residual_write_cabac( h, cb, DCT_LUMA_4x4, i, h->dct.block[i].luma4x4, 16 );
  952.         }
  953.         if( h->mb.i_cbp_chroma &0x03 )    /* Chroma DC residual present */
  954.         {
  955.             block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 0, h->dct.chroma_dc[0], 4 );
  956.             block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 1, h->dct.chroma_dc[1], 4 );
  957.         }
  958.         if( h->mb.i_cbp_chroma&0x02 ) /* Chroma AC residual present */
  959.         {
  960.             for( i = 0; i < 8; i++ )
  961.                 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i, h->dct.block[16+i].residual_ac, 15 );
  962.         }
  963.     }
  964. #ifndef RDO_SKIP_BS
  965.     if( IS_INTRA( i_mb_type ) )
  966.         h->stat.frame.i_itex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;
  967.     else
  968.         h->stat.frame.i_ptex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;
  969. #endif
  970. }