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 $
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
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.
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.
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 *****************************************************************************/
27 #include "common/common.h"
28 #include "macroblock.h"
30 static inline void x264_cabac_encode_ue_bypass( x264_cabac_t *cb, int exp_bits, int val )
33 cb->f8_bits_encoded += ( bs_size_ue( val + (1<<exp_bits)-1 ) - exp_bits ) << 8;
36 for( k = exp_bits; val >= (1<<k); k++ )
38 x264_cabac_encode_bypass( cb, 1 );
41 x264_cabac_encode_bypass( cb, 0 );
43 x264_cabac_encode_bypass( cb, (val >> k)&0x01 );
47 static inline void x264_cabac_mb_type_intra( x264_t *h, x264_cabac_t *cb, int i_mb_type,
48 int ctx0, int ctx1, int ctx2, int ctx3, int ctx4, int ctx5 )
50 if( i_mb_type == I_4x4 || i_mb_type == I_8x8 )
52 x264_cabac_encode_decision( cb, ctx0, 0 );
54 else if( i_mb_type == I_PCM )
56 x264_cabac_encode_decision( cb, ctx0, 1 );
57 x264_cabac_encode_terminal( cb, 1 );
58 x264_cabac_encode_flush( cb );
62 int i_pred = x264_mb_pred_mode16x16_fix[h->mb.i_intra16x16_pred_mode];
64 x264_cabac_encode_decision( cb, ctx0, 1 );
65 x264_cabac_encode_terminal( cb, 0 );
67 x264_cabac_encode_decision( cb, ctx1, ( h->mb.i_cbp_luma == 0 ? 0 : 1 ));
68 if( h->mb.i_cbp_chroma == 0 )
70 x264_cabac_encode_decision( cb, ctx2, 0 );
74 x264_cabac_encode_decision( cb, ctx2, 1 );
75 x264_cabac_encode_decision( cb, ctx3, ( h->mb.i_cbp_chroma == 1 ? 0 : 1 ) );
77 x264_cabac_encode_decision( cb, ctx4, ( (i_pred / 2) ? 1 : 0 ));
78 x264_cabac_encode_decision( cb, ctx5, ( (i_pred % 2) ? 1 : 0 ));
82 static void x264_cabac_mb_type( x264_t *h, x264_cabac_t *cb )
84 const int i_mb_type = h->mb.i_type;
87 (!(h->mb.i_mb_y & 1) || IS_SKIP(h->mb.type[h->mb.i_mb_xy - h->mb.i_mb_stride])) )
89 x264_cabac_encode_decision( cb, 70 + h->mb.cache.i_neighbour_interlaced, h->mb.b_interlaced );
92 if( h->sh.i_type == SLICE_TYPE_I )
95 if( h->mb.i_mb_type_left >= 0 && h->mb.i_mb_type_left != I_4x4 )
99 if( h->mb.i_mb_type_top >= 0 && h->mb.i_mb_type_top != I_4x4 )
104 x264_cabac_mb_type_intra( h, cb, i_mb_type, 3+ctx, 3+3, 3+4, 3+5, 3+6, 3+7 );
106 else if( h->sh.i_type == SLICE_TYPE_P )
108 /* prefix: 14, suffix: 17 */
109 if( i_mb_type == P_L0 )
111 if( h->mb.i_partition == D_16x16 )
113 x264_cabac_encode_decision( cb, 14, 0 );
114 x264_cabac_encode_decision( cb, 15, 0 );
115 x264_cabac_encode_decision( cb, 16, 0 );
117 else if( h->mb.i_partition == D_16x8 )
119 x264_cabac_encode_decision( cb, 14, 0 );
120 x264_cabac_encode_decision( cb, 15, 1 );
121 x264_cabac_encode_decision( cb, 17, 1 );
123 else if( h->mb.i_partition == D_8x16 )
125 x264_cabac_encode_decision( cb, 14, 0 );
126 x264_cabac_encode_decision( cb, 15, 1 );
127 x264_cabac_encode_decision( cb, 17, 0 );
130 else if( i_mb_type == P_8x8 )
132 x264_cabac_encode_decision( cb, 14, 0 );
133 x264_cabac_encode_decision( cb, 15, 0 );
134 x264_cabac_encode_decision( cb, 16, 1 );
139 x264_cabac_encode_decision( cb, 14, 1 );
142 x264_cabac_mb_type_intra( h, cb, i_mb_type, 17+0, 17+1, 17+2, 17+2, 17+3, 17+3 );
145 else if( h->sh.i_type == SLICE_TYPE_B )
148 if( h->mb.i_mb_type_left >= 0 && h->mb.i_mb_type_left != B_SKIP && h->mb.i_mb_type_left != B_DIRECT )
152 if( h->mb.i_mb_type_top >= 0 && h->mb.i_mb_type_top != B_SKIP && h->mb.i_mb_type_top != B_DIRECT )
157 if( i_mb_type == B_DIRECT )
159 x264_cabac_encode_decision( cb, 27+ctx, 0 );
161 else if( i_mb_type == B_8x8 )
163 x264_cabac_encode_decision( cb, 27+ctx, 1 );
164 x264_cabac_encode_decision( cb, 27+3, 1 );
165 x264_cabac_encode_decision( cb, 27+4, 1 );
167 x264_cabac_encode_decision( cb, 27+5, 1 );
168 x264_cabac_encode_decision( cb, 27+5, 1 );
169 x264_cabac_encode_decision( cb, 27+5, 1 );
171 else if( IS_INTRA( i_mb_type ) )
174 x264_cabac_encode_decision( cb, 27+ctx, 1 );
175 x264_cabac_encode_decision( cb, 27+3, 1 );
176 x264_cabac_encode_decision( cb, 27+4, 1 );
178 x264_cabac_encode_decision( cb, 27+5, 1 );
179 x264_cabac_encode_decision( cb, 27+5, 0 );
180 x264_cabac_encode_decision( cb, 27+5, 1 );
183 x264_cabac_mb_type_intra( h, cb, i_mb_type, 32+0, 32+1, 32+2, 32+2, 32+3, 32+3 );
187 static const int i_mb_len[9*3] =
199 static const int i_mb_bits[9*3][7] =
201 { 1,1,0,0,0,1 }, { 1,1,0,0,1,0, }, { 1,0,0 }, /* L0 L0 */
202 { 1,1,0,1,0,1 }, { 1,1,0,1,1,0 }, {0}, /* L0 L1 */
203 { 1,1,1,0,0,0,0 }, { 1,1,1,0,0,0,1 }, {0}, /* L0 BI */
204 { 1,1,0,1,1,1 }, { 1,1,1,1,1,0 }, {0}, /* L1 L0 */
205 { 1,1,0,0,1,1 }, { 1,1,0,1,0,0 }, { 1,0,1 }, /* L1 L1 */
206 { 1,1,1,0,0,1,0 }, { 1,1,1,0,0,1,1 }, {0}, /* L1 BI */
207 { 1,1,1,0,1,0,0 }, { 1,1,1,0,1,0,1 }, {0}, /* BI L0 */
208 { 1,1,1,0,1,1,0 }, { 1,1,1,0,1,1,1 }, {0}, /* BI L1 */
209 { 1,1,1,1,0,0,0 }, { 1,1,1,1,0,0,1 }, { 1,1,0,0,0,0 }, /* BI BI */
212 const int idx = (i_mb_type - B_L0_L0) * 3 + (h->mb.i_partition - D_16x8);
215 x264_cabac_encode_decision( cb, 27+ctx, i_mb_bits[idx][0] );
216 x264_cabac_encode_decision( cb, 27+3, i_mb_bits[idx][1] );
217 x264_cabac_encode_decision( cb, 27+5-i_mb_bits[idx][1], i_mb_bits[idx][2] );
218 for( i = 3; i < i_mb_len[idx]; i++ )
219 x264_cabac_encode_decision( cb, 27+5, i_mb_bits[idx][i] );
224 x264_log(h, X264_LOG_ERROR, "unknown SLICE_TYPE unsupported in x264_macroblock_write_cabac\n" );
228 static void x264_cabac_mb_intra4x4_pred_mode( x264_cabac_t *cb, int i_pred, int i_mode )
230 if( i_pred == i_mode )
232 /* b_prev_intra4x4_pred_mode */
233 x264_cabac_encode_decision( cb, 68, 1 );
237 /* b_prev_intra4x4_pred_mode */
238 x264_cabac_encode_decision( cb, 68, 0 );
239 if( i_mode > i_pred )
243 x264_cabac_encode_decision( cb, 69, (i_mode )&0x01 );
244 x264_cabac_encode_decision( cb, 69, (i_mode >> 1)&0x01 );
245 x264_cabac_encode_decision( cb, 69, (i_mode >> 2)&0x01 );
249 static void x264_cabac_mb_intra_chroma_pred_mode( x264_t *h, x264_cabac_t *cb )
251 const int i_mode = x264_mb_pred_mode8x8c_fix[ h->mb.i_chroma_pred_mode ];
254 /* No need to test for I4x4 or I_16x16 as cache_save handle that */
255 if( (h->mb.i_neighbour & MB_LEFT) && h->mb.chroma_pred_mode[h->mb.i_mb_xy - 1] != 0 )
259 if( (h->mb.i_neighbour & MB_TOP) && h->mb.chroma_pred_mode[h->mb.i_mb_top_xy] != 0 )
264 x264_cabac_encode_decision( cb, 64 + ctx, i_mode > 0 );
267 x264_cabac_encode_decision( cb, 64 + 3, i_mode > 1 );
270 x264_cabac_encode_decision( cb, 64 + 3, i_mode > 2 );
275 static void x264_cabac_mb_cbp_luma( x264_t *h, x264_cabac_t *cb )
277 /* TODO: clean up and optimize */
279 for( i8x8 = 0; i8x8 < 4; i8x8++ )
283 int x = block_idx_x[4*i8x8];
284 int y = block_idx_y[4*i8x8];
288 i_mba_xy = h->mb.i_mb_xy;
289 else if( h->mb.i_neighbour & MB_LEFT )
290 i_mba_xy = h->mb.i_mb_xy - 1;
293 i_mbb_xy = h->mb.i_mb_xy;
294 else if( h->mb.i_neighbour & MB_TOP )
295 i_mbb_xy = h->mb.i_mb_top_xy;
298 /* No need to test for PCM and SKIP */
301 const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
302 if( ((h->mb.cbp[i_mba_xy] >> i8x8a)&0x01) == 0 )
310 const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
311 if( ((h->mb.cbp[i_mbb_xy] >> i8x8b)&0x01) == 0 )
317 x264_cabac_encode_decision( cb, 73 + ctx, (h->mb.i_cbp_luma >> i8x8)&0x01 );
321 static void x264_cabac_mb_cbp_chroma( x264_t *h, x264_cabac_t *cb )
327 /* No need to test for SKIP/PCM */
328 if( h->mb.i_neighbour & MB_LEFT )
330 cbp_a = (h->mb.cbp[h->mb.i_mb_xy - 1] >> 4)&0x3;
333 if( h->mb.i_neighbour & MB_TOP )
335 cbp_b = (h->mb.cbp[h->mb.i_mb_top_xy] >> 4)&0x3;
339 if( cbp_a > 0 ) ctx++;
340 if( cbp_b > 0 ) ctx += 2;
341 if( h->mb.i_cbp_chroma == 0 )
343 x264_cabac_encode_decision( cb, 77 + ctx, 0 );
347 x264_cabac_encode_decision( cb, 77 + ctx, 1 );
350 if( cbp_a == 2 ) ctx++;
351 if( cbp_b == 2 ) ctx += 2;
352 x264_cabac_encode_decision( cb, 77 + ctx, h->mb.i_cbp_chroma > 1 );
356 /* TODO check it with != qp per mb */
357 static void x264_cabac_mb_qp_delta( x264_t *h, x264_cabac_t *cb )
359 int i_mbn_xy = h->mb.i_mb_prev_xy;
360 int i_dqp = h->mb.i_qp - h->mb.i_last_qp;
363 /* No need to test for PCM / SKIP */
364 if( h->mb.i_neighbour && h->mb.i_last_dqp != 0 &&
365 ( h->mb.type[i_mbn_xy] == I_16x16 || (h->mb.cbp[i_mbn_xy]&0x3f) ) )
372 int val = i_dqp <= 0 ? (-2*i_dqp) : (2*i_dqp - 1);
373 /* dqp is interpreted modulo 52 */
374 if( val >= 51 && val != 52 )
378 x264_cabac_encode_decision( cb, 60 + ctx, 1 );
385 x264_cabac_encode_decision( cb, 60 + ctx, 0 );
388 void x264_cabac_mb_skip( x264_t *h, int b_skip )
392 if( h->mb.i_mb_type_left >= 0 && !IS_SKIP( h->mb.i_mb_type_left ) )
396 if( h->mb.i_mb_type_top >= 0 && !IS_SKIP( h->mb.i_mb_type_top ) )
401 ctx += (h->sh.i_type == SLICE_TYPE_P) ? 11 : 24;
402 x264_cabac_encode_decision( &h->cabac, ctx, b_skip );
405 static inline void x264_cabac_mb_sub_p_partition( x264_cabac_t *cb, int i_sub )
407 if( i_sub == D_L0_8x8 )
409 x264_cabac_encode_decision( cb, 21, 1 );
411 else if( i_sub == D_L0_8x4 )
413 x264_cabac_encode_decision( cb, 21, 0 );
414 x264_cabac_encode_decision( cb, 22, 0 );
416 else if( i_sub == D_L0_4x8 )
418 x264_cabac_encode_decision( cb, 21, 0 );
419 x264_cabac_encode_decision( cb, 22, 1 );
420 x264_cabac_encode_decision( cb, 23, 1 );
422 else if( i_sub == D_L0_4x4 )
424 x264_cabac_encode_decision( cb, 21, 0 );
425 x264_cabac_encode_decision( cb, 22, 1 );
426 x264_cabac_encode_decision( cb, 23, 0 );
430 static inline void x264_cabac_mb_sub_b_partition( x264_cabac_t *cb, int i_sub )
432 #define WRITE_SUB_3(a,b,c) {\
433 x264_cabac_encode_decision( cb, 36, a );\
434 x264_cabac_encode_decision( cb, 37, b );\
435 x264_cabac_encode_decision( cb, 39, c );\
437 #define WRITE_SUB_5(a,b,c,d,e) {\
438 x264_cabac_encode_decision( cb, 36, a );\
439 x264_cabac_encode_decision( cb, 37, b );\
440 x264_cabac_encode_decision( cb, 38, c );\
441 x264_cabac_encode_decision( cb, 39, d );\
442 x264_cabac_encode_decision( cb, 39, e );\
444 #define WRITE_SUB_6(a,b,c,d,e,f) {\
445 WRITE_SUB_5(a,b,c,d,e)\
446 x264_cabac_encode_decision( cb, 39, f );\
452 x264_cabac_encode_decision( cb, 36, 0 );
454 case D_L0_8x8: WRITE_SUB_3(1,0,0); break;
455 case D_L1_8x8: WRITE_SUB_3(1,0,1); break;
456 case D_BI_8x8: WRITE_SUB_5(1,1,0,0,0); break;
457 case D_L0_8x4: WRITE_SUB_5(1,1,0,0,1); break;
458 case D_L0_4x8: WRITE_SUB_5(1,1,0,1,0); break;
459 case D_L1_8x4: WRITE_SUB_5(1,1,0,1,1); break;
460 case D_L1_4x8: WRITE_SUB_6(1,1,1,0,0,0); break;
461 case D_BI_8x4: WRITE_SUB_6(1,1,1,0,0,1); break;
462 case D_BI_4x8: WRITE_SUB_6(1,1,1,0,1,0); break;
463 case D_L0_4x4: WRITE_SUB_6(1,1,1,0,1,1); break;
464 case D_L1_4x4: WRITE_SUB_5(1,1,1,1,0); break;
465 case D_BI_4x4: WRITE_SUB_5(1,1,1,1,1); break;
469 static inline void x264_cabac_mb_transform_size( x264_t *h, x264_cabac_t *cb )
471 int ctx = 399 + h->mb.cache.i_neighbour_transform_size;
472 x264_cabac_encode_decision( cb, ctx, h->mb.b_transform_8x8 );
475 static inline void x264_cabac_mb_ref( x264_t *h, x264_cabac_t *cb, int i_list, int idx )
477 const int i8 = x264_scan8[idx];
478 const int i_refa = h->mb.cache.ref[i_list][i8 - 1];
479 const int i_refb = h->mb.cache.ref[i_list][i8 - 8];
480 int i_ref = h->mb.cache.ref[i_list][i8];
483 if( i_refa > 0 && !h->mb.cache.skip[i8 - 1])
485 if( i_refb > 0 && !h->mb.cache.skip[i8 - 8])
490 x264_cabac_encode_decision( cb, 54 + ctx, 1 );
498 x264_cabac_encode_decision( cb, 54 + ctx, 0 );
503 static inline void x264_cabac_mb_mvd_cpn( x264_t *h, x264_cabac_t *cb, int i_list, int idx, int l, int mvd )
505 const int amvd = abs( h->mb.cache.mvd[i_list][x264_scan8[idx] - 1][l] ) +
506 abs( h->mb.cache.mvd[i_list][x264_scan8[idx] - 8][l] );
507 const int i_abs = abs( mvd );
508 const int i_prefix = X264_MIN( i_abs, 9 );
509 const int ctxbase = (l == 0 ? 40 : 47);
521 for( i = 0; i < i_prefix; i++ )
523 x264_cabac_encode_decision( cb, ctxbase + ctx, 1 );
530 x264_cabac_encode_decision( cb, ctxbase + ctx, 0 );
532 x264_cabac_encode_ue_bypass( cb, 3, i_abs - 9 );
536 x264_cabac_encode_bypass( cb, mvd < 0 );
539 static inline void x264_cabac_mb_mvd( x264_t *h, x264_cabac_t *cb, int i_list, int idx, int width, int height )
545 x264_mb_predict_mv( h, i_list, idx, width, mvp );
546 mdx = h->mb.cache.mv[i_list][x264_scan8[idx]][0] - mvp[0];
547 mdy = h->mb.cache.mv[i_list][x264_scan8[idx]][1] - mvp[1];
550 x264_cabac_mb_mvd_cpn( h, cb, i_list, idx, 0, mdx );
551 x264_cabac_mb_mvd_cpn( h, cb, i_list, idx, 1, mdy );
554 x264_macroblock_cache_mvd( h, block_idx_x[idx], block_idx_y[idx], width, height, i_list, mdx, mdy );
557 static inline void x264_cabac_mb8x8_mvd( x264_t *h, x264_cabac_t *cb, int i_list, int i )
559 if( !x264_mb_partition_listX_table[i_list][ h->mb.i_sub_partition[i] ] )
562 switch( h->mb.i_sub_partition[i] )
567 x264_cabac_mb_mvd( h, cb, i_list, 4*i, 2, 2 );
572 x264_cabac_mb_mvd( h, cb, i_list, 4*i+0, 2, 1 );
573 x264_cabac_mb_mvd( h, cb, i_list, 4*i+2, 2, 1 );
578 x264_cabac_mb_mvd( h, cb, i_list, 4*i+0, 1, 2 );
579 x264_cabac_mb_mvd( h, cb, i_list, 4*i+1, 1, 2 );
584 x264_cabac_mb_mvd( h, cb, i_list, 4*i+0, 1, 1 );
585 x264_cabac_mb_mvd( h, cb, i_list, 4*i+1, 1, 1 );
586 x264_cabac_mb_mvd( h, cb, i_list, 4*i+2, 1, 1 );
587 x264_cabac_mb_mvd( h, cb, i_list, 4*i+3, 1, 1 );
592 static int x264_cabac_mb_cbf_ctxidxinc( x264_t *h, int i_cat, int i_idx )
600 if( i_cat == DCT_LUMA_DC )
602 if( h->mb.i_neighbour & MB_LEFT )
604 i_mba_xy = h->mb.i_mb_xy - 1;
605 if( h->mb.i_mb_type_left == I_16x16 )
606 i_nza = h->mb.cbp[i_mba_xy] & 0x100;
608 if( h->mb.i_neighbour & MB_TOP )
610 i_mbb_xy = h->mb.i_mb_top_xy;
611 if( h->mb.i_mb_type_top == I_16x16 )
612 i_nzb = h->mb.cbp[i_mbb_xy] & 0x100;
615 else if( i_cat == DCT_LUMA_AC || i_cat == DCT_LUMA_4x4 )
617 if( i_idx & ~10 ) // block_idx_x > 0
618 i_mba_xy = h->mb.i_mb_xy;
619 else if( h->mb.i_neighbour & MB_LEFT )
620 i_mba_xy = h->mb.i_mb_xy - 1;
622 if( i_idx & ~5 ) // block_idx_y > 0
623 i_mbb_xy = h->mb.i_mb_xy;
624 else if( h->mb.i_neighbour & MB_TOP )
625 i_mbb_xy = h->mb.i_mb_top_xy;
627 /* no need to test for skip/pcm */
629 i_nza = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 1];
631 i_nzb = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 8];
633 else if( i_cat == DCT_CHROMA_DC )
635 /* no need to test skip/pcm */
636 if( h->mb.i_neighbour & MB_LEFT )
638 i_mba_xy = h->mb.i_mb_xy - 1;
639 i_nza = h->mb.cbp[i_mba_xy] & (0x200 << i_idx);
641 if( h->mb.i_neighbour & MB_TOP )
643 i_mbb_xy = h->mb.i_mb_top_xy;
644 i_nzb = h->mb.cbp[i_mbb_xy] & (0x200 << i_idx);
647 else if( i_cat == DCT_CHROMA_AC )
650 i_mba_xy = h->mb.i_mb_xy;
651 else if( h->mb.i_neighbour & MB_LEFT )
652 i_mba_xy = h->mb.i_mb_xy - 1;
655 i_mbb_xy = h->mb.i_mb_xy;
656 else if( h->mb.i_neighbour & MB_TOP )
657 i_mbb_xy = h->mb.i_mb_top_xy;
659 /* no need to test skip/pcm */
661 i_nza = h->mb.cache.non_zero_count[x264_scan8[16+i_idx] - 1];
663 i_nzb = h->mb.cache.non_zero_count[x264_scan8[16+i_idx] - 8];
666 if( IS_INTRA( h->mb.i_type ) )
683 static const int significant_coeff_flag_offset[2][6] = {
684 { 105, 120, 134, 149, 152, 402 },
685 { 277, 292, 306, 321, 324, 436 }
687 static const int last_coeff_flag_offset[2][6] = {
688 { 166, 181, 195, 210, 213, 417 },
689 { 338, 353, 367, 382, 385, 451 }
691 static const int coeff_abs_level_m1_offset[6] =
692 { 227, 237, 247, 257, 266, 426 };
693 static const int significant_coeff_flag_offset_8x8[2][63] =
695 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
696 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
697 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
698 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12
700 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
701 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
702 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
703 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14
705 static const int last_coeff_flag_offset_8x8[63] = {
706 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
707 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
708 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
709 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
711 static const int identity[16] =
712 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
714 static void block_residual_write_cabac( x264_t *h, x264_cabac_t *cb, int i_ctxBlockCat, int i_idx, int *l, int i_count )
716 const int i_ctx_sig = significant_coeff_flag_offset[h->mb.b_interlaced][i_ctxBlockCat];
717 const int i_ctx_last = last_coeff_flag_offset[h->mb.b_interlaced][i_ctxBlockCat];
718 const int i_ctx_level = coeff_abs_level_m1_offset[i_ctxBlockCat];
720 int i_coeff_abs_m1[64];
721 int i_coeff_sign[64];
727 int i_abslevelgt1 = 0;
731 const int *significant_coeff_flag_offset;
732 const int *last_coeff_flag_offset;
734 /* i_ctxBlockCat: 0-> DC 16x16 i_idx = 0
735 * 1-> AC 16x16 i_idx = luma4x4idx
736 * 2-> Luma4x4 i_idx = luma4x4idx
737 * 3-> DC Chroma i_idx = iCbCr
738 * 4-> AC Chroma i_idx = 4 * iCbCr + chroma4x4idx
739 * 5-> Luma8x8 i_idx = luma8x8idx
742 for( i = 0; i < i_count; i++ )
746 i_coeff_abs_m1[i_coeff] = abs( l[i] ) - 1;
747 i_coeff_sign[i_coeff] = ( l[i] < 0 );
756 /* coded block flag */
757 x264_cabac_encode_decision( cb, 85 + x264_cabac_mb_cbf_ctxidxinc( h, i_ctxBlockCat, i_idx ), i_coeff != 0 );
762 significant_coeff_flag_offset = (i_ctxBlockCat == DCT_LUMA_8x8)
763 ? significant_coeff_flag_offset_8x8[h->mb.b_interlaced]
765 last_coeff_flag_offset = (i_ctxBlockCat == DCT_LUMA_8x8)
766 ? last_coeff_flag_offset_8x8 : identity;
768 i_sigmap_size = X264_MIN( i_last+1, i_count-1 );
769 for( i = 0; i < i_sigmap_size; i++ )
771 x264_cabac_encode_decision( cb, i_ctx_sig + significant_coeff_flag_offset[i], l[i] != 0 );
773 x264_cabac_encode_decision( cb, i_ctx_last + last_coeff_flag_offset[i], i == i_last );
776 for( i = i_coeff - 1; i >= 0; i-- )
778 /* write coeff_abs - 1 */
779 const int i_prefix = X264_MIN( i_coeff_abs_m1[i], 14 );
780 const int i_ctxIdxInc = (i_abslevelgt1 ? 0 : X264_MIN( 4, i_abslevel1 + 1 )) + i_ctx_level;
781 x264_cabac_encode_decision( cb, i_ctxIdxInc, i_prefix != 0 );
785 const int i_ctxIdxInc = 5 + X264_MIN( 4, i_abslevelgt1 ) + i_ctx_level;
787 for( j = 0; j < i_prefix - 1; j++ )
788 x264_cabac_encode_decision( cb, i_ctxIdxInc, 1 );
790 x264_cabac_encode_decision( cb, i_ctxIdxInc, 0 );
792 x264_cabac_encode_ue_bypass( cb, 0, i_coeff_abs_m1[i] - 14 );
800 x264_cabac_encode_bypass( cb, i_coeff_sign[i] );
806 void x264_macroblock_write_cabac( x264_t *h, x264_cabac_t *cb )
808 const int i_mb_type = h->mb.i_type;
813 const int i_mb_pos_start = x264_cabac_pos( cb );
817 /* Write the MB type */
818 x264_cabac_mb_type( h, cb );
820 /* PCM special block type UNTESTED */
821 if( i_mb_type == I_PCM )
824 cb->f8_bits_encoded += (384*8) << 8;
827 bs_align_0( s ); /* not sure */
829 for( i = 0; i < 16*16; i++ )
831 const int x = 16 * h->mb.i_mb_x + (i % 16);
832 const int y = 16 * h->mb.i_mb_y + (i / 16);
833 bs_write( s, 8, h->fenc->plane[0][y*h->mb.pic.i_stride[0]+x] );
836 for( i = 0; i < 8*8; i++ )
838 const int x = 8 * h->mb.i_mb_x + (i % 8);
839 const int y = 8 * h->mb.i_mb_y + (i / 8);
840 bs_write( s, 8, h->fenc->plane[1][y*h->mb.pic.i_stride[1]+x] );
843 for( i = 0; i < 8*8; i++ )
845 const int x = 8 * h->mb.i_mb_x + (i % 8);
846 const int y = 8 * h->mb.i_mb_y + (i / 8);
847 bs_write( s, 8, h->fenc->plane[2][y*h->mb.pic.i_stride[2]+x] );
849 x264_cabac_encode_init( cb, s );
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 = (i_mb_type == I_8x8) ? 4 : 1;
862 for( 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 );
870 x264_cabac_mb_intra_chroma_pred_mode( h, cb );
872 else if( i_mb_type == P_L0 )
874 if( h->mb.i_partition == D_16x16 )
876 if( h->mb.pic.i_fref[0] > 1 )
878 x264_cabac_mb_ref( h, cb, 0, 0 );
880 x264_cabac_mb_mvd( h, cb, 0, 0, 4, 4 );
882 else if( h->mb.i_partition == D_16x8 )
884 if( h->mb.pic.i_fref[0] > 1 )
886 x264_cabac_mb_ref( h, cb, 0, 0 );
887 x264_cabac_mb_ref( h, cb, 0, 8 );
889 x264_cabac_mb_mvd( h, cb, 0, 0, 4, 2 );
890 x264_cabac_mb_mvd( h, cb, 0, 8, 4, 2 );
892 else if( h->mb.i_partition == D_8x16 )
894 if( h->mb.pic.i_fref[0] > 1 )
896 x264_cabac_mb_ref( h, cb, 0, 0 );
897 x264_cabac_mb_ref( h, cb, 0, 4 );
899 x264_cabac_mb_mvd( h, cb, 0, 0, 2, 4 );
900 x264_cabac_mb_mvd( h, cb, 0, 4, 2, 4 );
903 else if( i_mb_type == P_8x8 )
906 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[0] );
907 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[1] );
908 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[2] );
909 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[3] );
912 if( h->mb.pic.i_fref[0] > 1 )
914 x264_cabac_mb_ref( h, cb, 0, 0 );
915 x264_cabac_mb_ref( h, cb, 0, 4 );
916 x264_cabac_mb_ref( h, cb, 0, 8 );
917 x264_cabac_mb_ref( h, cb, 0, 12 );
920 for( i = 0; i < 4; i++ )
921 x264_cabac_mb8x8_mvd( h, cb, 0, i );
923 else if( i_mb_type == B_8x8 )
926 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[0] );
927 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[1] );
928 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[2] );
929 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[3] );
932 for( i_list = 0; i_list < 2; i_list++ )
934 if( ( i_list ? h->mb.pic.i_fref[1] : h->mb.pic.i_fref[0] ) == 1 )
936 for( i = 0; i < 4; i++ )
937 if( x264_mb_partition_listX_table[i_list][ h->mb.i_sub_partition[i] ] )
938 x264_cabac_mb_ref( h, cb, i_list, 4*i );
941 for( i = 0; i < 4; i++ )
942 x264_cabac_mb8x8_mvd( h, cb, 0, i );
943 for( i = 0; i < 4; i++ )
944 x264_cabac_mb8x8_mvd( h, cb, 1, i );
946 else if( i_mb_type != B_DIRECT )
951 /* init ref list utilisations */
952 for( i = 0; i < 2; i++ )
954 b_list[0][i] = x264_mb_type_list0_table[i_mb_type][i];
955 b_list[1][i] = x264_mb_type_list1_table[i_mb_type][i];
958 for( i_list = 0; i_list < 2; i_list++ )
960 const int i_ref_max = i_list == 0 ? h->mb.pic.i_fref[0] : h->mb.pic.i_fref[1];
964 if( h->mb.i_partition == D_16x16 )
966 if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
968 else if( h->mb.i_partition == D_16x8 )
970 if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
971 if( b_list[i_list][1] ) x264_cabac_mb_ref( h, cb, i_list, 8 );
973 else if( h->mb.i_partition == D_8x16 )
975 if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
976 if( b_list[i_list][1] ) x264_cabac_mb_ref( h, cb, i_list, 4 );
980 for( i_list = 0; i_list < 2; i_list++ )
982 if( h->mb.i_partition == D_16x16 )
984 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 4 );
986 else if( h->mb.i_partition == D_16x8 )
988 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 2 );
989 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 8, 4, 2 );
991 else if( h->mb.i_partition == D_8x16 )
993 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 2, 4 );
994 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 4, 2, 4 );
1000 i_mb_pos_tex = x264_cabac_pos( cb );
1001 h->stat.frame.i_hdr_bits += i_mb_pos_tex - i_mb_pos_start;
1004 if( i_mb_type != I_16x16 )
1006 x264_cabac_mb_cbp_luma( h, cb );
1007 x264_cabac_mb_cbp_chroma( h, cb );
1010 if( h->mb.cache.b_transform_8x8_allowed && h->mb.i_cbp_luma && !IS_INTRA(i_mb_type) )
1012 x264_cabac_mb_transform_size( h, cb );
1015 if( h->mb.i_cbp_luma > 0 || h->mb.i_cbp_chroma > 0 || i_mb_type == I_16x16 )
1017 x264_cabac_mb_qp_delta( h, cb );
1019 /* write residual */
1020 if( i_mb_type == I_16x16 )
1023 block_residual_write_cabac( h, cb, DCT_LUMA_DC, 0, h->dct.luma16x16_dc, 16 );
1026 if( h->mb.i_cbp_luma != 0 )
1027 for( i = 0; i < 16; i++ )
1028 block_residual_write_cabac( h, cb, DCT_LUMA_AC, i, h->dct.block[i].residual_ac, 15 );
1030 else if( h->mb.b_transform_8x8 )
1032 for( i = 0; i < 4; i++ )
1033 if( h->mb.i_cbp_luma & ( 1 << i ) )
1034 block_residual_write_cabac( h, cb, DCT_LUMA_8x8, i, h->dct.luma8x8[i], 64 );
1038 for( i = 0; i < 16; i++ )
1039 if( h->mb.i_cbp_luma & ( 1 << ( i / 4 ) ) )
1040 block_residual_write_cabac( h, cb, DCT_LUMA_4x4, i, h->dct.block[i].luma4x4, 16 );
1043 if( h->mb.i_cbp_chroma &0x03 ) /* Chroma DC residual present */
1045 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 0, h->dct.chroma_dc[0], 4 );
1046 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 1, h->dct.chroma_dc[1], 4 );
1048 if( h->mb.i_cbp_chroma&0x02 ) /* Chroma AC residual present */
1050 for( i = 0; i < 8; i++ )
1051 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i, h->dct.block[16+i].residual_ac, 15 );
1056 if( IS_INTRA( i_mb_type ) )
1057 h->stat.frame.i_itex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;
1059 h->stat.frame.i_ptex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;
1064 /*****************************************************************************
1065 * RD only; doesn't generate a valid bitstream
1066 * doesn't write cbp or chroma dc (I don't know how much this matters)
1067 * works on all partition sizes except 16x16
1068 * for sub8x8, call once per 8x8 block
1069 *****************************************************************************/
1070 void x264_partition_size_cabac( x264_t *h, x264_cabac_t *cb, int i8, int i_pixel )
1072 const int i_mb_type = h->mb.i_type;
1075 if( i_mb_type == P_8x8 )
1077 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[i8] );
1078 if( h->mb.pic.i_fref[0] > 1 )
1079 x264_cabac_mb_ref( h, cb, 0, 4*i8 );
1080 x264_cabac_mb8x8_mvd( h, cb, 0, i8 );
1082 else if( i_mb_type == P_L0 )
1084 if( h->mb.pic.i_fref[0] > 1 )
1085 x264_cabac_mb_ref( h, cb, 0, 4*i8 );
1086 if( h->mb.i_partition == D_16x8 )
1087 x264_cabac_mb_mvd( h, cb, 0, 4*i8, 4, 2 );
1089 x264_cabac_mb_mvd( h, cb, 0, 4*i8, 2, 4 );
1091 else if( i_mb_type == B_8x8 )
1093 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[i8] );
1095 if( h->mb.pic.i_fref[0] > 1
1096 && x264_mb_partition_listX_table[0][ h->mb.i_sub_partition[i8] ] )
1097 x264_cabac_mb_ref( h, cb, 0, 4*i8 );
1098 if( h->mb.pic.i_fref[1] > 1
1099 && x264_mb_partition_listX_table[1][ h->mb.i_sub_partition[i8] ] )
1100 x264_cabac_mb_ref( h, cb, 1, 4*i8 );
1102 x264_cabac_mb8x8_mvd( h, cb, 0, i8 );
1103 x264_cabac_mb8x8_mvd( h, cb, 1, i8 );
1107 x264_log(h, X264_LOG_ERROR, "invalid/unhandled mb_type\n" );
1111 for( j = (i_pixel < PIXEL_8x8); j >= 0; j-- )
1113 if( h->mb.i_cbp_luma & (1 << i8) )
1115 if( h->mb.b_transform_8x8 )
1116 block_residual_write_cabac( h, cb, DCT_LUMA_8x8, i8, h->dct.luma8x8[i8], 64 );
1120 for( i4 = 0; i4 < 4; i4++ )
1121 block_residual_write_cabac( h, cb, DCT_LUMA_4x4, i4+i8*4, h->dct.block[i4+i8*4].luma4x4, 16 );
1125 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i8, h->dct.block[16+i8 ].residual_ac, 15 );
1126 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i8+4, h->dct.block[16+i8+4].residual_ac, 15 );
1128 i8 += x264_pixel_size[i_pixel].h >> 3;
1132 static void x264_partition_i8x8_size_cabac( x264_t *h, x264_cabac_t *cb, int i8, int i_mode )
1134 const int i_pred = x264_mb_predict_intra4x4_mode( h, 4*i8 );
1135 i_mode = x264_mb_pred_mode4x4_fix( i_mode );
1136 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
1137 block_residual_write_cabac( h, cb, DCT_LUMA_8x8, 4*i8, h->dct.luma8x8[i8], 64 );
1140 static void x264_partition_i4x4_size_cabac( x264_t *h, x264_cabac_t *cb, int i4, int i_mode )
1142 const int i_pred = x264_mb_predict_intra4x4_mode( h, i4 );
1143 i_mode = x264_mb_pred_mode4x4_fix( i_mode );
1144 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
1145 block_residual_write_cabac( h, cb, DCT_LUMA_4x4, i4, h->dct.block[i4].luma4x4, 16 );
1148 static void x264_i8x8_chroma_size_cabac( x264_t *h, x264_cabac_t *cb )
1150 x264_cabac_mb_intra_chroma_pred_mode( h, cb );
1151 if( h->mb.i_cbp_chroma > 0 )
1153 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 0, h->dct.chroma_dc[0], 4 );
1154 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 1, h->dct.chroma_dc[1], 4 );
1156 if( h->mb.i_cbp_chroma == 2 )
1159 for( i = 0; i < 8; i++ )
1160 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i, h->dct.block[16+i].residual_ac, 15 );