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 cb->f8_bits_encoded += cabac_prefix_size[i_prefix][cb->state[i_ctxIdxInc]];
788 cb->state[i_ctxIdxInc] = cabac_prefix_transition[i_prefix][cb->state[i_ctxIdxInc]];
791 for( j = 0; j < i_prefix - 1; j++ )
792 x264_cabac_encode_decision( cb, i_ctxIdxInc, 1 );
794 x264_cabac_encode_decision( cb, i_ctxIdxInc, 0 );
797 x264_cabac_encode_ue_bypass( cb, 0, i_coeff_abs_m1[i] - 14 );
808 x264_cabac_encode_bypass( cb, i_coeff_sign[i] );
814 void x264_macroblock_write_cabac( x264_t *h, x264_cabac_t *cb )
816 const int i_mb_type = h->mb.i_type;
821 const int i_mb_pos_start = x264_cabac_pos( cb );
825 /* Write the MB type */
826 x264_cabac_mb_type( h, cb );
828 /* PCM special block type UNTESTED */
829 if( i_mb_type == I_PCM )
832 cb->f8_bits_encoded += (384*8) << 8;
834 if( cb->p + 385 >= cb->p_end )
835 return; //FIXME throw an error
837 for( i = 0; i < 16; i++ )
839 memcpy( cb->p, h->fenc->plane[0] + i*h->mb.pic.i_stride[0], 16 );
843 for( i = 0; i < 8; i++ )
845 memcpy( cb->p, h->fenc->plane[1] + i*h->mb.pic.i_stride[1], 8 );
849 for( i = 0; i < 8; i++ )
851 memcpy( cb->p, h->fenc->plane[2] + i*h->mb.pic.i_stride[2], 8 );
854 x264_cabac_encode_init( cb, cb->p, cb->p_end );
859 if( IS_INTRA( i_mb_type ) )
861 if( h->pps->b_transform_8x8_mode && i_mb_type != I_16x16 )
862 x264_cabac_mb_transform_size( h, cb );
864 if( i_mb_type != I_16x16 )
866 int di = (i_mb_type == I_8x8) ? 4 : 1;
867 for( i = 0; i < 16; i += di )
869 const int i_pred = x264_mb_predict_intra4x4_mode( h, i );
870 const int i_mode = x264_mb_pred_mode4x4_fix( h->mb.cache.intra4x4_pred_mode[x264_scan8[i]] );
871 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
875 x264_cabac_mb_intra_chroma_pred_mode( h, cb );
877 else if( i_mb_type == P_L0 )
879 if( h->mb.i_partition == D_16x16 )
881 if( h->mb.pic.i_fref[0] > 1 )
883 x264_cabac_mb_ref( h, cb, 0, 0 );
885 x264_cabac_mb_mvd( h, cb, 0, 0, 4, 4 );
887 else if( h->mb.i_partition == D_16x8 )
889 if( h->mb.pic.i_fref[0] > 1 )
891 x264_cabac_mb_ref( h, cb, 0, 0 );
892 x264_cabac_mb_ref( h, cb, 0, 8 );
894 x264_cabac_mb_mvd( h, cb, 0, 0, 4, 2 );
895 x264_cabac_mb_mvd( h, cb, 0, 8, 4, 2 );
897 else if( h->mb.i_partition == D_8x16 )
899 if( h->mb.pic.i_fref[0] > 1 )
901 x264_cabac_mb_ref( h, cb, 0, 0 );
902 x264_cabac_mb_ref( h, cb, 0, 4 );
904 x264_cabac_mb_mvd( h, cb, 0, 0, 2, 4 );
905 x264_cabac_mb_mvd( h, cb, 0, 4, 2, 4 );
908 else if( i_mb_type == P_8x8 )
911 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[0] );
912 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[1] );
913 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[2] );
914 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[3] );
917 if( h->mb.pic.i_fref[0] > 1 )
919 x264_cabac_mb_ref( h, cb, 0, 0 );
920 x264_cabac_mb_ref( h, cb, 0, 4 );
921 x264_cabac_mb_ref( h, cb, 0, 8 );
922 x264_cabac_mb_ref( h, cb, 0, 12 );
925 for( i = 0; i < 4; i++ )
926 x264_cabac_mb8x8_mvd( h, cb, 0, i );
928 else if( i_mb_type == B_8x8 )
931 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[0] );
932 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[1] );
933 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[2] );
934 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[3] );
937 for( i_list = 0; i_list < 2; i_list++ )
939 if( ( i_list ? h->mb.pic.i_fref[1] : h->mb.pic.i_fref[0] ) == 1 )
941 for( i = 0; i < 4; i++ )
942 if( x264_mb_partition_listX_table[i_list][ h->mb.i_sub_partition[i] ] )
943 x264_cabac_mb_ref( h, cb, i_list, 4*i );
946 for( i = 0; i < 4; i++ )
947 x264_cabac_mb8x8_mvd( h, cb, 0, i );
948 for( i = 0; i < 4; i++ )
949 x264_cabac_mb8x8_mvd( h, cb, 1, i );
951 else if( i_mb_type != B_DIRECT )
956 /* init ref list utilisations */
957 for( i = 0; i < 2; i++ )
959 b_list[0][i] = x264_mb_type_list0_table[i_mb_type][i];
960 b_list[1][i] = x264_mb_type_list1_table[i_mb_type][i];
963 for( i_list = 0; i_list < 2; i_list++ )
965 const int i_ref_max = i_list == 0 ? h->mb.pic.i_fref[0] : h->mb.pic.i_fref[1];
969 if( h->mb.i_partition == D_16x16 )
971 if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
973 else if( h->mb.i_partition == D_16x8 )
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, 8 );
978 else if( h->mb.i_partition == D_8x16 )
980 if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
981 if( b_list[i_list][1] ) x264_cabac_mb_ref( h, cb, i_list, 4 );
985 for( i_list = 0; i_list < 2; i_list++ )
987 if( h->mb.i_partition == D_16x16 )
989 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 4 );
991 else if( h->mb.i_partition == D_16x8 )
993 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 2 );
994 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 8, 4, 2 );
996 else if( h->mb.i_partition == D_8x16 )
998 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 2, 4 );
999 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 4, 2, 4 );
1005 i_mb_pos_tex = x264_cabac_pos( cb );
1006 h->stat.frame.i_hdr_bits += i_mb_pos_tex - i_mb_pos_start;
1009 if( i_mb_type != I_16x16 )
1011 x264_cabac_mb_cbp_luma( h, cb );
1012 x264_cabac_mb_cbp_chroma( h, cb );
1015 if( h->mb.cache.b_transform_8x8_allowed && h->mb.i_cbp_luma && !IS_INTRA(i_mb_type) )
1017 x264_cabac_mb_transform_size( h, cb );
1020 if( h->mb.i_cbp_luma > 0 || h->mb.i_cbp_chroma > 0 || i_mb_type == I_16x16 )
1022 x264_cabac_mb_qp_delta( h, cb );
1024 /* write residual */
1025 if( i_mb_type == I_16x16 )
1028 block_residual_write_cabac( h, cb, DCT_LUMA_DC, 0, h->dct.luma16x16_dc, 16 );
1031 if( h->mb.i_cbp_luma != 0 )
1032 for( i = 0; i < 16; i++ )
1033 block_residual_write_cabac( h, cb, DCT_LUMA_AC, i, h->dct.block[i].residual_ac, 15 );
1035 else if( h->mb.b_transform_8x8 )
1037 for( i = 0; i < 4; i++ )
1038 if( h->mb.i_cbp_luma & ( 1 << i ) )
1039 block_residual_write_cabac( h, cb, DCT_LUMA_8x8, i, h->dct.luma8x8[i], 64 );
1043 for( i = 0; i < 16; i++ )
1044 if( h->mb.i_cbp_luma & ( 1 << ( i / 4 ) ) )
1045 block_residual_write_cabac( h, cb, DCT_LUMA_4x4, i, h->dct.block[i].luma4x4, 16 );
1048 if( h->mb.i_cbp_chroma &0x03 ) /* Chroma DC residual present */
1050 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 0, h->dct.chroma_dc[0], 4 );
1051 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 1, h->dct.chroma_dc[1], 4 );
1053 if( h->mb.i_cbp_chroma&0x02 ) /* Chroma AC residual present */
1055 for( i = 0; i < 8; i++ )
1056 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i, h->dct.block[16+i].residual_ac, 15 );
1061 if( IS_INTRA( i_mb_type ) )
1062 h->stat.frame.i_itex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;
1064 h->stat.frame.i_ptex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;
1069 /*****************************************************************************
1070 * RD only; doesn't generate a valid bitstream
1071 * doesn't write cbp or chroma dc (I don't know how much this matters)
1072 * works on all partition sizes except 16x16
1073 * for sub8x8, call once per 8x8 block
1074 *****************************************************************************/
1075 void x264_partition_size_cabac( x264_t *h, x264_cabac_t *cb, int i8, int i_pixel )
1077 const int i_mb_type = h->mb.i_type;
1080 if( i_mb_type == P_8x8 )
1082 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[i8] );
1083 if( h->mb.pic.i_fref[0] > 1 )
1084 x264_cabac_mb_ref( h, cb, 0, 4*i8 );
1085 x264_cabac_mb8x8_mvd( h, cb, 0, i8 );
1087 else if( i_mb_type == P_L0 )
1089 if( h->mb.pic.i_fref[0] > 1 )
1090 x264_cabac_mb_ref( h, cb, 0, 4*i8 );
1091 if( h->mb.i_partition == D_16x8 )
1092 x264_cabac_mb_mvd( h, cb, 0, 4*i8, 4, 2 );
1094 x264_cabac_mb_mvd( h, cb, 0, 4*i8, 2, 4 );
1096 else if( i_mb_type == B_8x8 )
1098 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[i8] );
1100 if( h->mb.pic.i_fref[0] > 1
1101 && x264_mb_partition_listX_table[0][ h->mb.i_sub_partition[i8] ] )
1102 x264_cabac_mb_ref( h, cb, 0, 4*i8 );
1103 if( h->mb.pic.i_fref[1] > 1
1104 && x264_mb_partition_listX_table[1][ h->mb.i_sub_partition[i8] ] )
1105 x264_cabac_mb_ref( h, cb, 1, 4*i8 );
1107 x264_cabac_mb8x8_mvd( h, cb, 0, i8 );
1108 x264_cabac_mb8x8_mvd( h, cb, 1, i8 );
1112 x264_log(h, X264_LOG_ERROR, "invalid/unhandled mb_type\n" );
1116 for( j = (i_pixel < PIXEL_8x8); j >= 0; j-- )
1118 if( h->mb.i_cbp_luma & (1 << i8) )
1120 if( h->mb.b_transform_8x8 )
1121 block_residual_write_cabac( h, cb, DCT_LUMA_8x8, i8, h->dct.luma8x8[i8], 64 );
1125 for( i4 = 0; i4 < 4; i4++ )
1126 block_residual_write_cabac( h, cb, DCT_LUMA_4x4, i4+i8*4, h->dct.block[i4+i8*4].luma4x4, 16 );
1130 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i8, h->dct.block[16+i8 ].residual_ac, 15 );
1131 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i8+4, h->dct.block[16+i8+4].residual_ac, 15 );
1133 i8 += x264_pixel_size[i_pixel].h >> 3;
1137 static void x264_partition_i8x8_size_cabac( x264_t *h, x264_cabac_t *cb, int i8, int i_mode )
1139 const int i_pred = x264_mb_predict_intra4x4_mode( h, 4*i8 );
1140 i_mode = x264_mb_pred_mode4x4_fix( i_mode );
1141 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
1142 block_residual_write_cabac( h, cb, DCT_LUMA_8x8, 4*i8, h->dct.luma8x8[i8], 64 );
1145 static void x264_partition_i4x4_size_cabac( x264_t *h, x264_cabac_t *cb, int i4, int i_mode )
1147 const int i_pred = x264_mb_predict_intra4x4_mode( h, i4 );
1148 i_mode = x264_mb_pred_mode4x4_fix( i_mode );
1149 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
1150 block_residual_write_cabac( h, cb, DCT_LUMA_4x4, i4, h->dct.block[i4].luma4x4, 16 );
1153 static void x264_i8x8_chroma_size_cabac( x264_t *h, x264_cabac_t *cb )
1155 x264_cabac_mb_intra_chroma_pred_mode( h, cb );
1156 if( h->mb.i_cbp_chroma > 0 )
1158 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 0, h->dct.chroma_dc[0], 4 );
1159 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 1, h->dct.chroma_dc[1], 4 );
1161 if( h->mb.i_cbp_chroma == 2 )
1164 for( i = 0; i < 8; i++ )
1165 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i, h->dct.block[16+i].residual_ac, 15 );