cabac.c
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:39k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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