1 /*****************************************************************************
2 * cabac.c: cabac bitstream writing
3 *****************************************************************************
4 * Copyright (C) 2003-2011 x264 project
6 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
7 * Loren Merritt <lorenm@u.washington.edu>
8 * Fiona Glaser <fiona@x264.com>
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.
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.
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.
24 * This program is also available under a commercial proprietary license.
25 * For more information, contact us at licensing@x264.com.
26 *****************************************************************************/
28 #include "common/common.h"
29 #include "macroblock.h"
35 static inline void x264_cabac_mb_type_intra( x264_t *h, x264_cabac_t *cb, int i_mb_type,
36 int ctx0, int ctx1, int ctx2, int ctx3, int ctx4, int ctx5 )
38 if( i_mb_type == I_4x4 || i_mb_type == I_8x8 )
40 x264_cabac_encode_decision_noup( cb, ctx0, 0 );
43 else if( i_mb_type == I_PCM )
45 x264_cabac_encode_decision_noup( cb, ctx0, 1 );
46 x264_cabac_encode_flush( h, cb );
51 int i_pred = x264_mb_pred_mode16x16_fix[h->mb.i_intra16x16_pred_mode];
53 x264_cabac_encode_decision_noup( cb, ctx0, 1 );
54 x264_cabac_encode_terminal( cb );
56 x264_cabac_encode_decision_noup( cb, ctx1, !!h->mb.i_cbp_luma );
57 if( h->mb.i_cbp_chroma == 0 )
58 x264_cabac_encode_decision_noup( cb, ctx2, 0 );
61 x264_cabac_encode_decision( cb, ctx2, 1 );
62 x264_cabac_encode_decision_noup( cb, ctx3, h->mb.i_cbp_chroma>>1 );
64 x264_cabac_encode_decision( cb, ctx4, i_pred>>1 );
65 x264_cabac_encode_decision_noup( cb, ctx5, i_pred&1 );
70 static void x264_cabac_field_decoding_flag( x264_t *h, x264_cabac_t *cb )
73 ctx += h->mb.field_decoding_flag & !!h->mb.i_mb_x;
74 ctx += (h->mb.i_mb_top_mbpair_xy >= 0
75 && h->mb.slice_table[h->mb.i_mb_top_mbpair_xy] == h->sh.i_first_mb
76 && h->mb.field[h->mb.i_mb_top_mbpair_xy]);
78 x264_cabac_encode_decision_noup( cb, 70 + ctx, MB_INTERLACED );
79 h->mb.field_decoding_flag = MB_INTERLACED;
83 static void x264_cabac_mb_type( x264_t *h, x264_cabac_t *cb )
85 const int i_mb_type = h->mb.i_type;
89 (!(h->mb.i_mb_y & 1) || IS_SKIP(h->mb.type[h->mb.i_mb_xy - h->mb.i_mb_stride])) )
91 x264_cabac_field_decoding_flag( h, cb );
95 if( h->sh.i_type == SLICE_TYPE_I )
98 if( (h->mb.i_neighbour & MB_LEFT) && h->mb.i_mb_type_left[0] != I_4x4 )
100 if( (h->mb.i_neighbour & MB_TOP) && h->mb.i_mb_type_top != I_4x4 )
103 x264_cabac_mb_type_intra( h, cb, i_mb_type, 3+ctx, 3+3, 3+4, 3+5, 3+6, 3+7 );
105 else if( h->sh.i_type == SLICE_TYPE_P )
107 /* prefix: 14, suffix: 17 */
108 if( i_mb_type == P_L0 )
110 x264_cabac_encode_decision_noup( cb, 14, 0 );
111 x264_cabac_encode_decision_noup( cb, 15, h->mb.i_partition != D_16x16 );
112 x264_cabac_encode_decision_noup( cb, 17-(h->mb.i_partition == D_16x16), h->mb.i_partition == D_16x8 );
114 else if( i_mb_type == P_8x8 )
116 x264_cabac_encode_decision_noup( cb, 14, 0 );
117 x264_cabac_encode_decision_noup( cb, 15, 0 );
118 x264_cabac_encode_decision_noup( cb, 16, 1 );
123 x264_cabac_encode_decision_noup( cb, 14, 1 );
126 x264_cabac_mb_type_intra( h, cb, i_mb_type, 17+0, 17+1, 17+2, 17+2, 17+3, 17+3 );
129 else //if( h->sh.i_type == SLICE_TYPE_B )
132 if( (h->mb.i_neighbour & MB_LEFT) && h->mb.i_mb_type_left[0] != B_SKIP && h->mb.i_mb_type_left[0] != B_DIRECT )
134 if( (h->mb.i_neighbour & MB_TOP) && h->mb.i_mb_type_top != B_SKIP && h->mb.i_mb_type_top != B_DIRECT )
137 if( i_mb_type == B_DIRECT )
139 x264_cabac_encode_decision_noup( cb, 27+ctx, 0 );
142 x264_cabac_encode_decision_noup( cb, 27+ctx, 1 );
144 if( i_mb_type == B_8x8 )
146 x264_cabac_encode_decision_noup( cb, 27+3, 1 );
147 x264_cabac_encode_decision_noup( cb, 27+4, 1 );
148 x264_cabac_encode_decision( cb, 27+5, 1 );
149 x264_cabac_encode_decision( cb, 27+5, 1 );
150 x264_cabac_encode_decision_noup( cb, 27+5, 1 );
152 else if( IS_INTRA( i_mb_type ) )
155 x264_cabac_encode_decision_noup( cb, 27+3, 1 );
156 x264_cabac_encode_decision_noup( cb, 27+4, 1 );
157 x264_cabac_encode_decision( cb, 27+5, 1 );
158 x264_cabac_encode_decision( cb, 27+5, 0 );
159 x264_cabac_encode_decision( cb, 27+5, 1 );
162 x264_cabac_mb_type_intra( h, cb, i_mb_type, 32+0, 32+1, 32+2, 32+2, 32+3, 32+3 );
166 static const uint8_t i_mb_bits[9*3] =
168 0x31, 0x29, 0x4, /* L0 L0 */
169 0x35, 0x2d, 0, /* L0 L1 */
170 0x43, 0x63, 0, /* L0 BI */
171 0x3d, 0x2f, 0, /* L1 L0 */
172 0x39, 0x25, 0x6, /* L1 L1 */
173 0x53, 0x73, 0, /* L1 BI */
174 0x4b, 0x6b, 0, /* BI L0 */
175 0x5b, 0x7b, 0, /* BI L1 */
176 0x47, 0x67, 0x21 /* BI BI */
179 const int idx = (i_mb_type - B_L0_L0) * 3 + (h->mb.i_partition - D_16x8);
180 int bits = i_mb_bits[idx];
182 x264_cabac_encode_decision_noup( cb, 27+3, bits&1 );
183 x264_cabac_encode_decision( cb, 27+5-(bits&1), (bits>>1)&1 ); bits >>= 2;
186 x264_cabac_encode_decision( cb, 27+5, bits&1 ); bits >>= 1;
187 x264_cabac_encode_decision( cb, 27+5, bits&1 ); bits >>= 1;
188 x264_cabac_encode_decision( cb, 27+5, bits&1 ); bits >>= 1;
190 x264_cabac_encode_decision_noup( cb, 27+5, bits&1 );
196 static void x264_cabac_mb_intra4x4_pred_mode( x264_cabac_t *cb, int i_pred, int i_mode )
198 if( i_pred == i_mode )
199 x264_cabac_encode_decision( cb, 68, 1 );
202 x264_cabac_encode_decision( cb, 68, 0 );
203 if( i_mode > i_pred )
205 x264_cabac_encode_decision( cb, 69, (i_mode )&0x01 );
206 x264_cabac_encode_decision( cb, 69, (i_mode >> 1)&0x01 );
207 x264_cabac_encode_decision( cb, 69, (i_mode >> 2) );
211 static void x264_cabac_mb_intra_chroma_pred_mode( x264_t *h, x264_cabac_t *cb )
213 int i_mode = x264_mb_chroma_pred_mode_fix[h->mb.i_chroma_pred_mode];
216 /* No need to test for I4x4 or I_16x16 as cache_save handle that */
217 if( (h->mb.i_neighbour & MB_LEFT) && h->mb.chroma_pred_mode[h->mb.i_mb_left_xy[0]] != 0 )
219 if( (h->mb.i_neighbour & MB_TOP) && h->mb.chroma_pred_mode[h->mb.i_mb_top_xy] != 0 )
222 x264_cabac_encode_decision_noup( cb, 64 + ctx, i_mode > 0 );
225 x264_cabac_encode_decision( cb, 64 + 3, i_mode > 1 );
227 x264_cabac_encode_decision_noup( cb, 64 + 3, i_mode > 2 );
231 static void x264_cabac_mb_cbp_luma( x264_t *h, x264_cabac_t *cb )
233 int cbp = h->mb.i_cbp_luma;
234 int cbp_l = h->mb.cache.i_cbp_left;
235 int cbp_t = h->mb.cache.i_cbp_top;
236 x264_cabac_encode_decision ( cb, 76 - ((cbp_l >> 1) & 1) - ((cbp_t >> 1) & 2), (cbp >> 0) & 1 );
237 x264_cabac_encode_decision ( cb, 76 - ((cbp >> 0) & 1) - ((cbp_t >> 2) & 2), (cbp >> 1) & 1 );
238 x264_cabac_encode_decision ( cb, 76 - ((cbp_l >> 3) & 1) - ((cbp << 1) & 2), (cbp >> 2) & 1 );
239 x264_cabac_encode_decision_noup( cb, 76 - ((cbp >> 2) & 1) - ((cbp >> 0) & 2), (cbp >> 3) & 1 );
242 static void x264_cabac_mb_cbp_chroma( x264_t *h, x264_cabac_t *cb )
244 int cbp_a = h->mb.cache.i_cbp_left & 0x30;
245 int cbp_b = h->mb.cache.i_cbp_top & 0x30;
248 if( cbp_a && h->mb.cache.i_cbp_left != -1 ) ctx++;
249 if( cbp_b && h->mb.cache.i_cbp_top != -1 ) ctx+=2;
250 if( h->mb.i_cbp_chroma == 0 )
251 x264_cabac_encode_decision_noup( cb, 77 + ctx, 0 );
254 x264_cabac_encode_decision_noup( cb, 77 + ctx, 1 );
257 if( cbp_a == 0x20 ) ctx++;
258 if( cbp_b == 0x20 ) ctx += 2;
259 x264_cabac_encode_decision_noup( cb, 77 + ctx, h->mb.i_cbp_chroma >> 1 );
263 static void x264_cabac_mb_qp_delta( x264_t *h, x264_cabac_t *cb )
265 int i_dqp = h->mb.i_qp - h->mb.i_last_qp;
268 /* Avoid writing a delta quant if we have an empty i16x16 block, e.g. in a completely flat background area */
269 if( h->mb.i_type == I_16x16 && !h->mb.cbp[h->mb.i_mb_xy] )
272 h->mb.i_qp = h->mb.i_last_qp;
277 /* Since, per the above, empty-CBP I16x16 blocks never have delta quants,
278 * we don't have to check for them. */
279 ctx = h->mb.i_last_dqp && h->mb.cbp[h->mb.i_mb_prev_xy];
283 int val = i_dqp <= 0 ? (-2*i_dqp) : (2*i_dqp - 1);
284 /* dqp is interpreted modulo (QP_MAX_SPEC+1) */
285 if( val >= QP_MAX_SPEC && val != QP_MAX_SPEC+1 )
286 val = 2*QP_MAX_SPEC+1 - val;
289 x264_cabac_encode_decision( cb, 60 + ctx, 1 );
293 x264_cabac_encode_decision_noup( cb, 60 + ctx, 0 );
297 void x264_cabac_mb_skip( x264_t *h, int b_skip )
299 int ctx = h->mb.cache.i_neighbour_skip + 11;
300 if( h->sh.i_type != SLICE_TYPE_P )
302 x264_cabac_encode_decision( &h->cabac, ctx, b_skip );
306 static inline void x264_cabac_mb_sub_p_partition( x264_cabac_t *cb, int i_sub )
308 if( i_sub == D_L0_8x8 )
310 x264_cabac_encode_decision( cb, 21, 1 );
313 x264_cabac_encode_decision( cb, 21, 0 );
314 if( i_sub == D_L0_8x4 )
315 x264_cabac_encode_decision( cb, 22, 0 );
318 x264_cabac_encode_decision( cb, 22, 1 );
319 x264_cabac_encode_decision( cb, 23, i_sub == D_L0_4x8 );
323 static ALWAYS_INLINE void x264_cabac_mb_sub_b_partition( x264_cabac_t *cb, int i_sub )
325 if( i_sub == D_DIRECT_8x8 )
327 x264_cabac_encode_decision( cb, 36, 0 );
330 x264_cabac_encode_decision( cb, 36, 1 );
331 if( i_sub == D_BI_8x8 )
333 x264_cabac_encode_decision( cb, 37, 1 );
334 x264_cabac_encode_decision( cb, 38, 0 );
335 x264_cabac_encode_decision( cb, 39, 0 );
336 x264_cabac_encode_decision( cb, 39, 0 );
339 x264_cabac_encode_decision( cb, 37, 0 );
340 x264_cabac_encode_decision( cb, 39, i_sub == D_L1_8x8 );
343 static ALWAYS_INLINE void x264_cabac_mb_transform_size( x264_t *h, x264_cabac_t *cb )
345 int ctx = 399 + h->mb.cache.i_neighbour_transform_size;
346 x264_cabac_encode_decision_noup( cb, ctx, h->mb.b_transform_8x8 );
349 static void x264_cabac_mb_ref( x264_t *h, x264_cabac_t *cb, int i_list, int idx )
351 const int i8 = x264_scan8[idx];
352 const int i_refa = h->mb.cache.ref[i_list][i8 - 1];
353 const int i_refb = h->mb.cache.ref[i_list][i8 - 8];
356 if( i_refa > 0 && !h->mb.cache.skip[i8 - 1] )
358 if( i_refb > 0 && !h->mb.cache.skip[i8 - 8] )
361 for( int i_ref = h->mb.cache.ref[i_list][i8]; i_ref > 0; i_ref-- )
363 x264_cabac_encode_decision( cb, 54 + ctx, 1 );
366 x264_cabac_encode_decision( cb, 54 + ctx, 0 );
369 static ALWAYS_INLINE int x264_cabac_mb_mvd_cpn( x264_t *h, x264_cabac_t *cb, int i_list, int idx, int l, int mvd, int ctx )
371 const int i_abs = abs( mvd );
372 const int ctxbase = l ? 47 : 40;
375 x264_cabac_encode_decision( cb, ctxbase + ctx, 0 );
378 x264_cabac_encode_decision( cb, ctxbase + ctx, 1 );
381 for( int i = 1; i < i_abs; i++ )
382 x264_cabac_encode_decision( cb, ctxbase + i + 2, 1 );
383 x264_cabac_encode_decision( cb, ctxbase + i_abs + 2, 0 );
384 x264_cabac_encode_bypass( cb, mvd >> 31 );
388 x264_cabac_encode_decision( cb, ctxbase + 3, 1 );
389 x264_cabac_encode_decision( cb, ctxbase + 4, 1 );
390 x264_cabac_encode_decision( cb, ctxbase + 5, 1 );
393 cb->f8_bits_encoded += cabac_size_unary[i_abs - 3][cb->state[ctxbase+6]];
394 cb->state[ctxbase+6] = cabac_transition_unary[i_abs - 3][cb->state[ctxbase+6]];
398 cb->f8_bits_encoded += cabac_size_5ones[cb->state[ctxbase+6]];
399 cb->state[ctxbase+6] = cabac_transition_5ones[cb->state[ctxbase+6]];
400 x264_cabac_encode_ue_bypass( cb, 3, i_abs - 9 );
405 static const uint8_t ctxes[8] = { 3,4,5,6,6,6,6,6 };
408 x264_cabac_encode_decision( cb, ctxbase + ctx, 0 );
411 x264_cabac_encode_decision( cb, ctxbase + ctx, 1 );
414 for( int i = 1; i < i_abs; i++ )
415 x264_cabac_encode_decision( cb, ctxbase + ctxes[i-1], 1 );
416 x264_cabac_encode_decision( cb, ctxbase + ctxes[i_abs-1], 0 );
420 for( int i = 1; i < 9; i++ )
421 x264_cabac_encode_decision( cb, ctxbase + ctxes[i-1], 1 );
422 x264_cabac_encode_ue_bypass( cb, 3, i_abs - 9 );
424 x264_cabac_encode_bypass( cb, mvd >> 31 );
427 /* Since we don't need to keep track of MVDs larger than 66, just cap the value.
428 * This lets us store MVDs as 8-bit values instead of 16-bit. */
429 return X264_MIN( i_abs, 66 );
432 static NOINLINE uint16_t x264_cabac_mb_mvd( x264_t *h, x264_cabac_t *cb, int i_list, int idx, int width )
434 ALIGNED_4( int16_t mvp[2] );
438 x264_mb_predict_mv( h, i_list, idx, width, mvp );
439 mdx = h->mb.cache.mv[i_list][x264_scan8[idx]][0] - mvp[0];
440 mdy = h->mb.cache.mv[i_list][x264_scan8[idx]][1] - mvp[1];
441 uint16_t amvd = x264_cabac_mvd_sum(h->mb.cache.mvd[i_list][x264_scan8[idx] - 1],
442 h->mb.cache.mvd[i_list][x264_scan8[idx] - 8]);
445 mdx = x264_cabac_mb_mvd_cpn( h, cb, i_list, idx, 0, mdx, amvd&0xFF );
446 mdy = x264_cabac_mb_mvd_cpn( h, cb, i_list, idx, 1, mdy, amvd>>8 );
448 return pack8to16(mdx,mdy);
451 #define x264_cabac_mb_mvd(h,cb,i_list,idx,width,height)\
454 uint16_t mvd = x264_cabac_mb_mvd(h,cb,i_list,idx,width);\
455 x264_macroblock_cache_mvd( h, block_idx_x[idx], block_idx_y[idx], width, height, i_list, mvd );\
458 static inline void x264_cabac_mb8x8_mvd( x264_t *h, x264_cabac_t *cb, int i )
460 switch( h->mb.i_sub_partition[i] )
463 x264_cabac_mb_mvd( h, cb, 0, 4*i, 2, 2 );
466 x264_cabac_mb_mvd( h, cb, 0, 4*i+0, 2, 1 );
467 x264_cabac_mb_mvd( h, cb, 0, 4*i+2, 2, 1 );
470 x264_cabac_mb_mvd( h, cb, 0, 4*i+0, 1, 2 );
471 x264_cabac_mb_mvd( h, cb, 0, 4*i+1, 1, 2 );
474 x264_cabac_mb_mvd( h, cb, 0, 4*i+0, 1, 1 );
475 x264_cabac_mb_mvd( h, cb, 0, 4*i+1, 1, 1 );
476 x264_cabac_mb_mvd( h, cb, 0, 4*i+2, 1, 1 );
477 x264_cabac_mb_mvd( h, cb, 0, 4*i+3, 1, 1 );
484 /* ctx_block_cat: 0-> DC 16x16 i_idx = 0
485 * 1-> AC 16x16 i_idx = luma4x4idx
486 * 2-> Luma4x4 i_idx = luma4x4idx
487 * 3-> DC Chroma i_idx = iCbCr
488 * 4-> AC Chroma i_idx = numChroma4x4Blks * iCbCr + chroma4x4idx
489 * 5-> Luma8x8 i_idx = luma8x8idx
492 static int ALWAYS_INLINE x264_cabac_mb_cbf_ctxidxinc( x264_t *h, int i_cat, int i_idx, int b_intra )
494 static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
501 case DCT_CHROMAU_8x8:
502 case DCT_CHROMAV_8x8:
507 case DCT_CHROMAU_4x4:
509 case DCT_CHROMAV_4x4:
510 i_nza = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 1];
511 i_nzb = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 8];
512 if( x264_constant_p(b_intra) && !b_intra )
513 return base_ctx[i_cat] + ((2*i_nzb + i_nza)&0x7f);
516 i_nza &= 0x7f + (b_intra << 7);
517 i_nzb &= 0x7f + (b_intra << 7);
518 return base_ctx[i_cat] + 2*!!i_nzb + !!i_nza;
524 i_nza = (h->mb.cache.i_cbp_left >> (8 + i_idx)) & 1;
525 i_nzb = (h->mb.cache.i_cbp_top >> (8 + i_idx)) & 1;
526 return base_ctx[i_cat] + 2*i_nzb + i_nza;
529 i_nza = h->mb.cache.i_cbp_left != -1 ? (h->mb.cache.i_cbp_left >> (8 + i_idx)) & 1 : b_intra;
530 i_nzb = h->mb.cache.i_cbp_top != -1 ? (h->mb.cache.i_cbp_top >> (8 + i_idx)) & 1 : b_intra;
531 return base_ctx[i_cat] + 2*i_nzb + i_nza;
537 static const uint16_t significant_coeff_flag_offset[2][14] =
539 { 105+0, 105+15, 105+29, 105+44, 105+47, 402, 484+0, 484+15, 484+29, 660, 528+0, 528+15, 528+29, 718 },
540 { 277+0, 277+15, 277+29, 277+44, 277+47, 436, 776+0, 776+15, 776+29, 675, 820+0, 820+15, 820+29, 733 }
542 static const uint16_t last_coeff_flag_offset[2][14] =
544 { 166+0, 166+15, 166+29, 166+44, 166+47, 417, 572+0, 572+15, 572+29, 690, 616+0, 616+15, 616+29, 748 },
545 { 338+0, 338+15, 338+29, 338+44, 338+47, 451, 864+0, 864+15, 864+29, 699, 908+0, 908+15, 908+29, 757 }
547 static const uint16_t coeff_abs_level_m1_offset[14] =
549 227+0, 227+10, 227+20, 227+30, 227+39, 426, 952+0, 952+10, 952+20, 708, 982+0, 982+10, 982+20, 766
551 static const uint8_t significant_coeff_flag_offset_8x8[2][63] =
553 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
554 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
555 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
556 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12
558 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
559 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
560 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
561 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14
563 static const uint8_t last_coeff_flag_offset_8x8[63] =
565 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
566 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
567 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
568 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
570 static const uint8_t coeff_flag_offset_chroma_422_dc[7] = { 0, 0, 1, 1, 2, 2, 2 }; /* MIN( i/2, 2 ) */
572 // node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
573 // 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
574 /* map node ctx => cabac ctx for level=1 */
575 static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
576 /* map node ctx => cabac ctx for level>1 */
577 static const uint8_t coeff_abs_levelgt1_ctx[8] = { 5, 5, 5, 5, 6, 7, 8, 9 };
578 /* 4:2:2 chroma dc uses a slightly different state machine for some reason, also note that
579 * 4:2:0 chroma dc doesn't use the last state so it has identical output with both arrays. */
580 static const uint8_t coeff_abs_levelgt1_ctx_chroma_dc[8] = { 5, 5, 5, 5, 6, 7, 8, 8 };
581 static const uint8_t coeff_abs_level_transition[2][8] = {
582 /* update node ctx after coding a level=1 */
583 { 1, 2, 3, 3, 4, 5, 6, 7 },
584 /* update node ctx after coding a level>1 */
585 { 4, 4, 4, 4, 5, 6, 7, 7 }
587 static const uint8_t count_cat_m1[14] = {15, 14, 15, 3, 14, 63, 15, 14, 15, 63, 15, 14, 15, 63};
590 static ALWAYS_INLINE void block_residual_write_cabac_internal( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l, int chroma422dc )
592 int ctx_sig = significant_coeff_flag_offset[MB_INTERLACED][ctx_block_cat];
593 int ctx_last = last_coeff_flag_offset[MB_INTERLACED][ctx_block_cat];
594 int ctx_level = coeff_abs_level_m1_offset[ctx_block_cat];
595 int coeff_idx = -1, node_ctx = 0;
596 int last = h->quantf.coeff_last[ctx_block_cat]( l );
597 const uint8_t *levelgt1_ctx = chroma422dc ? coeff_abs_levelgt1_ctx_chroma_dc : coeff_abs_levelgt1_ctx;
600 #define WRITE_SIGMAP( sig_off, last_off )\
607 coeffs[++coeff_idx] = l[i];\
608 x264_cabac_encode_decision( cb, ctx_sig + sig_off, 1 );\
611 x264_cabac_encode_decision( cb, ctx_last + last_off, 1 );\
615 x264_cabac_encode_decision( cb, ctx_last + last_off, 0 );\
618 x264_cabac_encode_decision( cb, ctx_sig + sig_off, 0 );\
619 if( ++i == count_m1 )\
621 coeffs[++coeff_idx] = l[i];\
630 WRITE_SIGMAP( coeff_flag_offset_chroma_422_dc[i], coeff_flag_offset_chroma_422_dc[i] )
634 int count_m1 = count_cat_m1[ctx_block_cat];
637 const uint8_t *sig_offset = significant_coeff_flag_offset_8x8[MB_INTERLACED];
638 WRITE_SIGMAP( sig_offset[i], last_coeff_flag_offset_8x8[i] )
646 /* write coeff_abs - 1 */
647 int coeff = coeffs[coeff_idx];
648 int abs_coeff = abs(coeff);
649 int coeff_sign = coeff >> 31;
650 int ctx = coeff_abs_level1_ctx[node_ctx] + ctx_level;
654 x264_cabac_encode_decision( cb, ctx, 1 );
655 ctx = levelgt1_ctx[node_ctx] + ctx_level;
656 for( int i = X264_MIN( abs_coeff, 15 ) - 2; i > 0; i-- )
657 x264_cabac_encode_decision( cb, ctx, 1 );
659 x264_cabac_encode_decision( cb, ctx, 0 );
661 x264_cabac_encode_ue_bypass( cb, 0, abs_coeff - 15 );
663 node_ctx = coeff_abs_level_transition[1][node_ctx];
667 x264_cabac_encode_decision( cb, ctx, 0 );
668 node_ctx = coeff_abs_level_transition[0][node_ctx];
671 x264_cabac_encode_bypass( cb, coeff_sign );
672 } while( --coeff_idx >= 0 );
674 static void block_residual_write_cabac( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l )
676 block_residual_write_cabac_internal( h, cb, ctx_block_cat, l, 0 );
678 static void block_residual_write_cabac_422_dc( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l )
680 /* Template a version specifically for chroma 4:2:2 DC in order to avoid
681 * slowing down everything else due to the added complexity. */
682 block_residual_write_cabac_internal( h, cb, DCT_CHROMA_DC, l, 1 );
684 #define block_residual_write_cabac_8x8( h, cb, cat, l ) block_residual_write_cabac( h, cb, cat, l )
687 /* Faster RDO by merging sigmap and level coding. Note that for 8x8dct and chroma 4:2:2 dc this is
688 * slightly incorrect because the sigmap is not reversible (contexts are repeated). However, there
689 * is nearly no quality penalty for this (~0.001db) and the speed boost (~30%) is worth it. */
690 static void ALWAYS_INLINE block_residual_write_cabac_internal( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l, int b_8x8, int chroma422dc )
692 const uint8_t *sig_offset = significant_coeff_flag_offset_8x8[MB_INTERLACED];
693 int ctx_sig = significant_coeff_flag_offset[MB_INTERLACED][ctx_block_cat];
694 int ctx_last = last_coeff_flag_offset[MB_INTERLACED][ctx_block_cat];
695 int ctx_level = coeff_abs_level_m1_offset[ctx_block_cat];
696 int last = h->quantf.coeff_last[ctx_block_cat]( l );
697 int coeff_abs = abs(l[last]);
698 int ctx = coeff_abs_level1_ctx[0] + ctx_level;
700 const uint8_t *levelgt1_ctx = chroma422dc ? coeff_abs_levelgt1_ctx_chroma_dc : coeff_abs_levelgt1_ctx;
702 if( last != (b_8x8 ? 63 : chroma422dc ? 7 : count_cat_m1[ctx_block_cat]) )
704 x264_cabac_encode_decision( cb, ctx_sig + (b_8x8 ? sig_offset[last] :
705 chroma422dc ? coeff_flag_offset_chroma_422_dc[last] : last), 1 );
706 x264_cabac_encode_decision( cb, ctx_last + (b_8x8 ? last_coeff_flag_offset_8x8[last] :
707 chroma422dc ? coeff_flag_offset_chroma_422_dc[last] : last), 1 );
712 x264_cabac_encode_decision( cb, ctx, 1 );
713 ctx = levelgt1_ctx[0] + ctx_level;
716 cb->f8_bits_encoded += cabac_size_unary[coeff_abs-1][cb->state[ctx]];
717 cb->state[ctx] = cabac_transition_unary[coeff_abs-1][cb->state[ctx]];
721 cb->f8_bits_encoded += cabac_size_unary[14][cb->state[ctx]];
722 cb->state[ctx] = cabac_transition_unary[14][cb->state[ctx]];
723 x264_cabac_encode_ue_bypass( cb, 0, coeff_abs - 15 );
725 node_ctx = coeff_abs_level_transition[1][0];
729 x264_cabac_encode_decision( cb, ctx, 0 );
730 node_ctx = coeff_abs_level_transition[0][0];
731 x264_cabac_encode_bypass( cb, 0 ); // sign
734 for( int i = last-1 ; i >= 0; i-- )
738 coeff_abs = abs(l[i]);
739 x264_cabac_encode_decision( cb, ctx_sig + (b_8x8 ? sig_offset[i] :
740 chroma422dc ? coeff_flag_offset_chroma_422_dc[i] : i), 1 );
741 x264_cabac_encode_decision( cb, ctx_last + (b_8x8 ? last_coeff_flag_offset_8x8[i] :
742 chroma422dc ? coeff_flag_offset_chroma_422_dc[i] : i), 0 );
743 ctx = coeff_abs_level1_ctx[node_ctx] + ctx_level;
747 x264_cabac_encode_decision( cb, ctx, 1 );
748 ctx = levelgt1_ctx[node_ctx] + ctx_level;
751 cb->f8_bits_encoded += cabac_size_unary[coeff_abs-1][cb->state[ctx]];
752 cb->state[ctx] = cabac_transition_unary[coeff_abs-1][cb->state[ctx]];
756 cb->f8_bits_encoded += cabac_size_unary[14][cb->state[ctx]];
757 cb->state[ctx] = cabac_transition_unary[14][cb->state[ctx]];
758 x264_cabac_encode_ue_bypass( cb, 0, coeff_abs - 15 );
760 node_ctx = coeff_abs_level_transition[1][node_ctx];
764 x264_cabac_encode_decision( cb, ctx, 0 );
765 node_ctx = coeff_abs_level_transition[0][node_ctx];
766 x264_cabac_encode_bypass( cb, 0 );
770 x264_cabac_encode_decision( cb, ctx_sig + (b_8x8 ? sig_offset[i] :
771 chroma422dc ? coeff_flag_offset_chroma_422_dc[i] : i), 0 );
775 static void block_residual_write_cabac_8x8( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l )
777 block_residual_write_cabac_internal( h, cb, ctx_block_cat, l, 1, 0 );
779 static void block_residual_write_cabac_422_dc( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l )
781 block_residual_write_cabac_internal( h, cb, DCT_CHROMA_DC, l, 0, 1 );
783 static void block_residual_write_cabac( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l )
785 block_residual_write_cabac_internal( h, cb, ctx_block_cat, l, 0, 0 );
789 #define block_residual_write_cabac_cbf_internal( h, cb, ctx_block_cat, i_idx, l, b_intra, name )\
792 int ctxidxinc = x264_cabac_mb_cbf_ctxidxinc( h, ctx_block_cat, i_idx, b_intra );\
793 if( h->mb.cache.non_zero_count[x264_scan8[i_idx]] )\
795 x264_cabac_encode_decision( cb, ctxidxinc, 1 );\
796 block_residual_write_cabac##name( h, cb, ctx_block_cat, l );\
799 x264_cabac_encode_decision( cb, ctxidxinc, 0 );\
802 #define block_residual_write_cabac_dc_cbf( h, cb, ctx_block_cat, i_idx, l, b_intra )\
803 block_residual_write_cabac_cbf_internal( h, cb, ctx_block_cat, i_idx, l, b_intra, )
805 #define block_residual_write_cabac_cbf( h, cb, ctx_block_cat, i_idx, l, b_intra )\
806 block_residual_write_cabac_cbf_internal( h, cb, ctx_block_cat, i_idx, l, b_intra, )
808 #define block_residual_write_cabac_8x8_cbf( h, cb, ctx_block_cat, i_idx, l, b_intra )\
809 block_residual_write_cabac_cbf_internal( h, cb, ctx_block_cat, i_idx, l, b_intra, _8x8 )
811 #define block_residual_write_cabac_422_dc_cbf( h, cb, ch, b_intra )\
812 block_residual_write_cabac_cbf_internal( h, cb, DCT_CHROMA_DC, CHROMA_DC+(ch), h->dct.chroma_dc[ch], b_intra, _422_dc )
814 static ALWAYS_INLINE void x264_macroblock_write_cabac_internal( x264_t *h, x264_cabac_t *cb, int plane_count, int chroma )
816 const int i_mb_type = h->mb.i_type;
820 const int i_mb_pos_start = x264_cabac_pos( cb );
824 /* Write the MB type */
825 x264_cabac_mb_type( h, cb );
828 if( i_mb_type == I_PCM )
830 i_mb_pos_tex = x264_cabac_pos( cb );
831 h->stat.frame.i_mv_bits += i_mb_pos_tex - i_mb_pos_start;
834 bs_init( &s, cb->p, cb->p_end - cb->p );
836 for( int p = 0; p < plane_count; p++ )
837 for( int i = 0; i < 256; i++ )
838 bs_write( &s, BIT_DEPTH, h->mb.pic.p_fenc[p][i] );
840 for( int ch = 1; ch < 3; ch++ )
841 for( int i = 0; i < 16>>h->mb.chroma_v_shift; i++ )
842 for( int j = 0; j < 8; j++ )
843 bs_write( &s, BIT_DEPTH, h->mb.pic.p_fenc[ch][i*FENC_STRIDE+j] );
847 x264_cabac_encode_init_core( cb );
849 h->stat.frame.i_tex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;
854 if( IS_INTRA( i_mb_type ) )
856 if( h->pps->b_transform_8x8_mode && i_mb_type != I_16x16 )
857 x264_cabac_mb_transform_size( h, cb );
859 if( i_mb_type != I_16x16 )
861 int di = h->mb.b_transform_8x8 ? 4 : 1;
862 for( int i = 0; i < 16; i += di )
864 const int i_pred = x264_mb_predict_intra4x4_mode( h, i );
865 const int i_mode = x264_mb_pred_mode4x4_fix( h->mb.cache.intra4x4_pred_mode[x264_scan8[i]] );
866 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
871 x264_cabac_mb_intra_chroma_pred_mode( h, cb );
873 else if( i_mb_type == P_L0 )
875 if( h->mb.i_partition == D_16x16 )
877 if( h->mb.pic.i_fref[0] > 1 )
879 x264_cabac_mb_ref( h, cb, 0, 0 );
881 x264_cabac_mb_mvd( h, cb, 0, 0, 4, 4 );
883 else if( h->mb.i_partition == D_16x8 )
885 if( h->mb.pic.i_fref[0] > 1 )
887 x264_cabac_mb_ref( h, cb, 0, 0 );
888 x264_cabac_mb_ref( h, cb, 0, 8 );
890 x264_cabac_mb_mvd( h, cb, 0, 0, 4, 2 );
891 x264_cabac_mb_mvd( h, cb, 0, 8, 4, 2 );
893 else //if( h->mb.i_partition == D_8x16 )
895 if( h->mb.pic.i_fref[0] > 1 )
897 x264_cabac_mb_ref( h, cb, 0, 0 );
898 x264_cabac_mb_ref( h, cb, 0, 4 );
900 x264_cabac_mb_mvd( h, cb, 0, 0, 2, 4 );
901 x264_cabac_mb_mvd( h, cb, 0, 4, 2, 4 );
904 else if( i_mb_type == P_8x8 )
907 for( int i = 0; i < 4; i++ )
908 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[i] );
911 if( h->mb.pic.i_fref[0] > 1 )
913 x264_cabac_mb_ref( h, cb, 0, 0 );
914 x264_cabac_mb_ref( h, cb, 0, 4 );
915 x264_cabac_mb_ref( h, cb, 0, 8 );
916 x264_cabac_mb_ref( h, cb, 0, 12 );
919 for( int i = 0; i < 4; i++ )
920 x264_cabac_mb8x8_mvd( h, cb, i );
922 else if( i_mb_type == B_8x8 )
925 for( int i = 0; i < 4; i++ )
926 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[i] );
929 if( h->mb.pic.i_fref[0] > 1 )
930 for( int i = 0; i < 4; i++ )
931 if( x264_mb_partition_listX_table[0][ h->mb.i_sub_partition[i] ] )
932 x264_cabac_mb_ref( h, cb, 0, 4*i );
934 if( h->mb.pic.i_fref[1] > 1 )
935 for( int i = 0; i < 4; i++ )
936 if( x264_mb_partition_listX_table[1][ h->mb.i_sub_partition[i] ] )
937 x264_cabac_mb_ref( h, cb, 1, 4*i );
939 for( int i = 0; i < 4; i++ )
940 if( x264_mb_partition_listX_table[0][ h->mb.i_sub_partition[i] ] )
941 x264_cabac_mb_mvd( h, cb, 0, 4*i, 2, 2 );
943 for( int i = 0; i < 4; i++ )
944 if( x264_mb_partition_listX_table[1][ h->mb.i_sub_partition[i] ] )
945 x264_cabac_mb_mvd( h, cb, 1, 4*i, 2, 2 );
947 else if( i_mb_type != B_DIRECT )
950 const uint8_t (*b_list)[2] = x264_mb_type_list_table[i_mb_type];
951 if( h->mb.pic.i_fref[0] > 1 )
954 x264_cabac_mb_ref( h, cb, 0, 0 );
955 if( b_list[0][1] && h->mb.i_partition != D_16x16 )
956 x264_cabac_mb_ref( h, cb, 0, 8 >> (h->mb.i_partition == D_8x16) );
958 if( h->mb.pic.i_fref[1] > 1 )
961 x264_cabac_mb_ref( h, cb, 1, 0 );
962 if( b_list[1][1] && h->mb.i_partition != D_16x16 )
963 x264_cabac_mb_ref( h, cb, 1, 8 >> (h->mb.i_partition == D_8x16) );
965 for( i_list = 0; i_list < 2; i_list++ )
967 if( h->mb.i_partition == D_16x16 )
969 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 4 );
971 else if( h->mb.i_partition == D_16x8 )
973 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 2 );
974 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 8, 4, 2 );
976 else //if( h->mb.i_partition == D_8x16 )
978 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 2, 4 );
979 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 4, 2, 4 );
985 i_mb_pos_tex = x264_cabac_pos( cb );
986 h->stat.frame.i_mv_bits += i_mb_pos_tex - i_mb_pos_start;
989 if( i_mb_type != I_16x16 )
991 x264_cabac_mb_cbp_luma( h, cb );
993 x264_cabac_mb_cbp_chroma( h, cb );
996 if( x264_mb_transform_8x8_allowed( h ) && h->mb.i_cbp_luma )
998 x264_cabac_mb_transform_size( h, cb );
1001 if( h->mb.i_cbp_luma || (chroma && h->mb.i_cbp_chroma) || i_mb_type == I_16x16 )
1003 const int b_intra = IS_INTRA( i_mb_type );
1004 x264_cabac_mb_qp_delta( h, cb );
1006 /* write residual */
1007 if( i_mb_type == I_16x16 )
1010 for( int p = 0; p < plane_count; p++ )
1012 block_residual_write_cabac_dc_cbf( h, cb, ctx_cat_plane[DCT_LUMA_DC][p], LUMA_DC+p, h->dct.luma16x16_dc[p], 1 );
1015 if( h->mb.i_cbp_luma )
1016 for( int i = p*16; i < p*16+16; i++ )
1017 block_residual_write_cabac_cbf( h, cb, ctx_cat_plane[DCT_LUMA_AC][p], i, h->dct.luma4x4[i]+1, 1 );
1020 else if( h->mb.b_transform_8x8 )
1022 if( plane_count == 3 )
1024 ALIGNED_4( uint8_t nnzbak[3][8] );
1026 /* Stupid nnz munging in the case that neighbors don't have
1027 * 8x8 transform enabled. */
1028 #define BACKUP( dst, src, res )\
1032 #define RESTORE( dst, src, res )\
1035 #define MUNGE_8x8_NNZ( MUNGE )\
1036 if( (h->mb.i_neighbour & MB_LEFT) && !h->mb.mb_transform_size[h->mb.i_mb_left_xy[0]] )\
1038 MUNGE( nnzbak[0][0], h->mb.cache.non_zero_count[x264_scan8[16*0+ 0] - 1], 0x80 )\
1039 MUNGE( nnzbak[0][1], h->mb.cache.non_zero_count[x264_scan8[16*0+ 2] - 1], 0x80 )\
1040 MUNGE( nnzbak[1][0], h->mb.cache.non_zero_count[x264_scan8[16*1+ 0] - 1], 0x80 )\
1041 MUNGE( nnzbak[1][1], h->mb.cache.non_zero_count[x264_scan8[16*1+ 2] - 1], 0x80 )\
1042 MUNGE( nnzbak[2][0], h->mb.cache.non_zero_count[x264_scan8[16*2+ 0] - 1], 0x80 )\
1043 MUNGE( nnzbak[2][1], h->mb.cache.non_zero_count[x264_scan8[16*2+ 2] - 1], 0x80 )\
1045 if( (h->mb.i_neighbour & MB_LEFT) && !h->mb.mb_transform_size[h->mb.i_mb_left_xy[1]] )\
1047 MUNGE( nnzbak[0][2], h->mb.cache.non_zero_count[x264_scan8[16*0+ 8] - 1], 0x80 )\
1048 MUNGE( nnzbak[0][3], h->mb.cache.non_zero_count[x264_scan8[16*0+10] - 1], 0x80 )\
1049 MUNGE( nnzbak[1][2], h->mb.cache.non_zero_count[x264_scan8[16*1+ 8] - 1], 0x80 )\
1050 MUNGE( nnzbak[1][3], h->mb.cache.non_zero_count[x264_scan8[16*1+10] - 1], 0x80 )\
1051 MUNGE( nnzbak[2][2], h->mb.cache.non_zero_count[x264_scan8[16*2+ 8] - 1], 0x80 )\
1052 MUNGE( nnzbak[2][3], h->mb.cache.non_zero_count[x264_scan8[16*2+10] - 1], 0x80 )\
1054 if( (h->mb.i_neighbour & MB_TOP) && !h->mb.mb_transform_size[h->mb.i_mb_top_xy] )\
1056 MUNGE( M32( &nnzbak[0][4] ), M32( &h->mb.cache.non_zero_count[x264_scan8[16*0] - 8] ), 0x80808080U )\
1057 MUNGE( M32( &nnzbak[1][4] ), M32( &h->mb.cache.non_zero_count[x264_scan8[16*1] - 8] ), 0x80808080U )\
1058 MUNGE( M32( &nnzbak[2][4] ), M32( &h->mb.cache.non_zero_count[x264_scan8[16*2] - 8] ), 0x80808080U )\
1061 MUNGE_8x8_NNZ( BACKUP )
1063 for( int p = 0; p < 3; p++ )
1064 for( int i = 0; i < 4; i++ )
1065 if( h->mb.i_cbp_luma & ( 1 << i ) )
1066 block_residual_write_cabac_8x8_cbf( h, cb, ctx_cat_plane[DCT_LUMA_8x8][p], i*4+p*16, h->dct.luma8x8[i+p*4], b_intra );
1068 MUNGE_8x8_NNZ( RESTORE )
1072 for( int i = 0; i < 4; i++ )
1073 if( h->mb.i_cbp_luma & ( 1 << i ) )
1074 block_residual_write_cabac_8x8( h, cb, DCT_LUMA_8x8, h->dct.luma8x8[i] );
1079 for( int p = 0; p < plane_count; p++ )
1080 for( int i = 0; i < 16; i++ )
1081 if( h->mb.i_cbp_luma & ( 1 << ( i >> 2 ) ) )
1082 block_residual_write_cabac_cbf( h, cb, ctx_cat_plane[DCT_LUMA_4x4][p], i+p*16, h->dct.luma4x4[i+p*16], b_intra );
1085 if( chroma && h->mb.i_cbp_chroma ) /* Chroma DC residual present */
1087 if( CHROMA_FORMAT == CHROMA_422 )
1089 block_residual_write_cabac_422_dc_cbf( h, cb, 0, b_intra );
1090 block_residual_write_cabac_422_dc_cbf( h, cb, 1, b_intra );
1094 block_residual_write_cabac_dc_cbf( h, cb, DCT_CHROMA_DC, CHROMA_DC+0, h->dct.chroma_dc[0], b_intra );
1095 block_residual_write_cabac_dc_cbf( h, cb, DCT_CHROMA_DC, CHROMA_DC+1, h->dct.chroma_dc[1], b_intra );
1098 if( h->mb.i_cbp_chroma == 2 ) /* Chroma AC residual present */
1100 int step = 8 << h->mb.chroma_v_shift;
1101 for( int i = 16; i < 3*16; i += step )
1102 for( int j = i; j < i+4; j++ )
1103 block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_AC, j, h->dct.luma4x4[j]+1, b_intra );
1109 h->stat.frame.i_tex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;
1113 void x264_macroblock_write_cabac( x264_t *h, x264_cabac_t *cb )
1116 x264_macroblock_write_cabac_internal( h, cb, 3, 0 );
1118 x264_macroblock_write_cabac_internal( h, cb, 1, 1 );
1122 /*****************************************************************************
1123 * RD only; doesn't generate a valid bitstream
1124 * doesn't write cbp or chroma dc (I don't know how much this matters)
1125 * doesn't write ref (never varies between calls, so no point in doing so)
1126 * only writes subpartition for p8x8, needed for sub-8x8 mode decision RDO
1127 * works on all partition sizes except 16x16
1128 *****************************************************************************/
1129 static void x264_partition_size_cabac( x264_t *h, x264_cabac_t *cb, int i8, int i_pixel )
1131 const int i_mb_type = h->mb.i_type;
1132 int b_8x16 = h->mb.i_partition == D_8x16;
1133 int plane_count = CHROMA444 ? 3 : 1;
1135 if( i_mb_type == P_8x8 )
1137 x264_cabac_mb8x8_mvd( h, cb, i8 );
1138 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[i8] );
1140 else if( i_mb_type == P_L0 )
1141 x264_cabac_mb_mvd( h, cb, 0, 4*i8, 4>>b_8x16, 2<<b_8x16 );
1142 else if( i_mb_type > B_DIRECT && i_mb_type < B_8x8 )
1144 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 );
1145 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 );
1147 else //if( i_mb_type == B_8x8 )
1149 if( x264_mb_partition_listX_table[0][ h->mb.i_sub_partition[i8] ] )
1150 x264_cabac_mb_mvd( h, cb, 0, 4*i8, 2, 2 );
1151 if( x264_mb_partition_listX_table[1][ h->mb.i_sub_partition[i8] ] )
1152 x264_cabac_mb_mvd( h, cb, 1, 4*i8, 2, 2 );
1155 for( int j = (i_pixel < PIXEL_8x8); j >= 0; j-- )
1157 if( h->mb.i_cbp_luma & (1 << i8) )
1159 if( h->mb.b_transform_8x8 )
1162 for( int p = 0; p < 3; p++ )
1163 block_residual_write_cabac_8x8_cbf( h, cb, ctx_cat_plane[DCT_LUMA_8x8][p], i8*4+p*16, h->dct.luma8x8[i8+p*4], 0 );
1165 block_residual_write_cabac_8x8( h, cb, DCT_LUMA_8x8, h->dct.luma8x8[i8] );
1168 for( int p = 0; p < plane_count; p++ )
1169 for( int i4 = 0; i4 < 4; i4++ )
1170 block_residual_write_cabac_cbf( h, cb, ctx_cat_plane[DCT_LUMA_4x4][p], i4+i8*4+p*16, h->dct.luma4x4[i4+i8*4+p*16], 0 );
1173 if( h->mb.i_cbp_chroma )
1175 if( CHROMA_FORMAT == CHROMA_422 )
1177 int offset = (5*i8) & 0x09;
1178 block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_AC, 16+offset, h->dct.luma4x4[16+offset]+1, 0 );
1179 block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_AC, 18+offset, h->dct.luma4x4[18+offset]+1, 0 );
1180 block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_AC, 32+offset, h->dct.luma4x4[32+offset]+1, 0 );
1181 block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_AC, 34+offset, h->dct.luma4x4[34+offset]+1, 0 );
1185 block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_AC, 16+i8, h->dct.luma4x4[16+i8]+1, 0 );
1186 block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_AC, 32+i8, h->dct.luma4x4[32+i8]+1, 0 );
1190 i8 += x264_pixel_size[i_pixel].h >> 3;
1194 static void x264_subpartition_size_cabac( x264_t *h, x264_cabac_t *cb, int i4, int i_pixel )
1196 int b_8x4 = i_pixel == PIXEL_8x4;
1197 int plane_count = CHROMA444 ? 3 : 1;
1198 if( i_pixel == PIXEL_4x4 )
1199 x264_cabac_mb_mvd( h, cb, 0, i4, 1, 1 );
1201 x264_cabac_mb_mvd( h, cb, 0, i4, 1+b_8x4, 2-b_8x4 );
1202 for( int p = 0; p < plane_count; p++ )
1204 block_residual_write_cabac_cbf( h, cb, ctx_cat_plane[DCT_LUMA_4x4][p], p*16+i4, h->dct.luma4x4[p*16+i4], 0 );
1205 if( i_pixel != PIXEL_4x4 )
1206 block_residual_write_cabac_cbf( h, cb, ctx_cat_plane[DCT_LUMA_4x4][p], p*16+i4+2-b_8x4, h->dct.luma4x4[p*16+i4+2-b_8x4], 0 );
1210 static void x264_partition_i8x8_size_cabac( x264_t *h, x264_cabac_t *cb, int i8, int i_mode )
1212 const int i_pred = x264_mb_predict_intra4x4_mode( h, 4*i8 );
1213 i_mode = x264_mb_pred_mode4x4_fix( i_mode );
1214 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
1215 x264_cabac_mb_cbp_luma( h, cb );
1216 if( h->mb.i_cbp_luma & (1 << i8) )
1219 for( int p = 0; p < 3; p++ )
1220 block_residual_write_cabac_8x8_cbf( h, cb, ctx_cat_plane[DCT_LUMA_8x8][p], i8*4+p*16, h->dct.luma8x8[i8+p*4], 1 );
1222 block_residual_write_cabac_8x8( h, cb, DCT_LUMA_8x8, h->dct.luma8x8[i8] );
1226 static void x264_partition_i4x4_size_cabac( x264_t *h, x264_cabac_t *cb, int i4, int i_mode )
1228 const int i_pred = x264_mb_predict_intra4x4_mode( h, i4 );
1229 int plane_count = CHROMA444 ? 3 : 1;
1230 i_mode = x264_mb_pred_mode4x4_fix( i_mode );
1231 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
1232 for( int p = 0; p < plane_count; p++ )
1233 block_residual_write_cabac_cbf( h, cb, ctx_cat_plane[DCT_LUMA_4x4][p], i4+p*16, h->dct.luma4x4[i4+p*16], 1 );
1236 static void x264_chroma_size_cabac( x264_t *h, x264_cabac_t *cb )
1238 x264_cabac_mb_intra_chroma_pred_mode( h, cb );
1239 x264_cabac_mb_cbp_chroma( h, cb );
1240 if( h->mb.i_cbp_chroma )
1242 if( CHROMA_FORMAT == CHROMA_422 )
1244 block_residual_write_cabac_422_dc_cbf( h, cb, 0, 1 );
1245 block_residual_write_cabac_422_dc_cbf( h, cb, 1, 1 );
1249 block_residual_write_cabac_dc_cbf( h, cb, DCT_CHROMA_DC, CHROMA_DC+0, h->dct.chroma_dc[0], 1 );
1250 block_residual_write_cabac_dc_cbf( h, cb, DCT_CHROMA_DC, CHROMA_DC+1, h->dct.chroma_dc[1], 1 );
1253 if( h->mb.i_cbp_chroma == 2 )
1255 int step = 8 << h->mb.chroma_v_shift;
1256 for( int i = 16; i < 3*16; i += step )
1257 for( int j = i; j < i+4; j++ )
1258 block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_AC, j, h->dct.luma4x4[j]+1, 1 );