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;
86 if( h->sh.i_type == SLICE_TYPE_I )
89 if( h->mb.i_mb_type_left >= 0 && h->mb.i_mb_type_left != I_4x4 )
93 if( h->mb.i_mb_type_top >= 0 && h->mb.i_mb_type_top != I_4x4 )
98 x264_cabac_mb_type_intra( h, cb, i_mb_type, 3+ctx, 3+3, 3+4, 3+5, 3+6, 3+7 );
100 else if( h->sh.i_type == SLICE_TYPE_P )
102 /* prefix: 14, suffix: 17 */
103 if( i_mb_type == P_L0 )
105 if( h->mb.i_partition == D_16x16 )
107 x264_cabac_encode_decision( cb, 14, 0 );
108 x264_cabac_encode_decision( cb, 15, 0 );
109 x264_cabac_encode_decision( cb, 16, 0 );
111 else if( h->mb.i_partition == D_16x8 )
113 x264_cabac_encode_decision( cb, 14, 0 );
114 x264_cabac_encode_decision( cb, 15, 1 );
115 x264_cabac_encode_decision( cb, 17, 1 );
117 else if( h->mb.i_partition == D_8x16 )
119 x264_cabac_encode_decision( cb, 14, 0 );
120 x264_cabac_encode_decision( cb, 15, 1 );
121 x264_cabac_encode_decision( cb, 17, 0 );
124 else if( i_mb_type == P_8x8 )
126 x264_cabac_encode_decision( cb, 14, 0 );
127 x264_cabac_encode_decision( cb, 15, 0 );
128 x264_cabac_encode_decision( cb, 16, 1 );
133 x264_cabac_encode_decision( cb, 14, 1 );
136 x264_cabac_mb_type_intra( h, cb, i_mb_type, 17+0, 17+1, 17+2, 17+2, 17+3, 17+3 );
139 else if( h->sh.i_type == SLICE_TYPE_B )
142 if( h->mb.i_mb_type_left >= 0 && h->mb.i_mb_type_left != B_SKIP && h->mb.i_mb_type_left != B_DIRECT )
146 if( h->mb.i_mb_type_top >= 0 && h->mb.i_mb_type_top != B_SKIP && h->mb.i_mb_type_top != B_DIRECT )
151 if( i_mb_type == B_DIRECT )
153 x264_cabac_encode_decision( cb, 27+ctx, 0 );
155 else if( i_mb_type == B_8x8 )
157 x264_cabac_encode_decision( cb, 27+ctx, 1 );
158 x264_cabac_encode_decision( cb, 27+3, 1 );
159 x264_cabac_encode_decision( cb, 27+4, 1 );
161 x264_cabac_encode_decision( cb, 27+5, 1 );
162 x264_cabac_encode_decision( cb, 27+5, 1 );
163 x264_cabac_encode_decision( cb, 27+5, 1 );
165 else if( IS_INTRA( i_mb_type ) )
168 x264_cabac_encode_decision( cb, 27+ctx, 1 );
169 x264_cabac_encode_decision( cb, 27+3, 1 );
170 x264_cabac_encode_decision( cb, 27+4, 1 );
172 x264_cabac_encode_decision( cb, 27+5, 1 );
173 x264_cabac_encode_decision( cb, 27+5, 0 );
174 x264_cabac_encode_decision( cb, 27+5, 1 );
177 x264_cabac_mb_type_intra( h, cb, i_mb_type, 32+0, 32+1, 32+2, 32+2, 32+3, 32+3 );
181 static const int i_mb_len[9*3] =
193 static const int i_mb_bits[9*3][7] =
195 { 1,1,0,0,0,1 }, { 1,1,0,0,1,0, }, { 1,0,0 }, /* L0 L0 */
196 { 1,1,0,1,0,1 }, { 1,1,0,1,1,0 }, {0}, /* L0 L1 */
197 { 1,1,1,0,0,0,0 }, { 1,1,1,0,0,0,1 }, {0}, /* L0 BI */
198 { 1,1,0,1,1,1 }, { 1,1,1,1,1,0 }, {0}, /* L1 L0 */
199 { 1,1,0,0,1,1 }, { 1,1,0,1,0,0 }, { 1,0,1 }, /* L1 L1 */
200 { 1,1,1,0,0,1,0 }, { 1,1,1,0,0,1,1 }, {0}, /* L1 BI */
201 { 1,1,1,0,1,0,0 }, { 1,1,1,0,1,0,1 }, {0}, /* BI L0 */
202 { 1,1,1,0,1,1,0 }, { 1,1,1,0,1,1,1 }, {0}, /* BI L1 */
203 { 1,1,1,1,0,0,0 }, { 1,1,1,1,0,0,1 }, { 1,1,0,0,0,0 }, /* BI BI */
206 const int idx = (i_mb_type - B_L0_L0) * 3 + (h->mb.i_partition - D_16x8);
209 x264_cabac_encode_decision( cb, 27+ctx, i_mb_bits[idx][0] );
210 x264_cabac_encode_decision( cb, 27+3, i_mb_bits[idx][1] );
211 x264_cabac_encode_decision( cb, 27+5-i_mb_bits[idx][1], i_mb_bits[idx][2] );
212 for( i = 3; i < i_mb_len[idx]; i++ )
213 x264_cabac_encode_decision( cb, 27+5, i_mb_bits[idx][i] );
218 x264_log(h, X264_LOG_ERROR, "unknown SLICE_TYPE unsupported in x264_macroblock_write_cabac\n" );
222 static void x264_cabac_mb_intra4x4_pred_mode( x264_cabac_t *cb, int i_pred, int i_mode )
224 if( i_pred == i_mode )
226 /* b_prev_intra4x4_pred_mode */
227 x264_cabac_encode_decision( cb, 68, 1 );
231 /* b_prev_intra4x4_pred_mode */
232 x264_cabac_encode_decision( cb, 68, 0 );
233 if( i_mode > i_pred )
237 x264_cabac_encode_decision( cb, 69, (i_mode )&0x01 );
238 x264_cabac_encode_decision( cb, 69, (i_mode >> 1)&0x01 );
239 x264_cabac_encode_decision( cb, 69, (i_mode >> 2)&0x01 );
243 static void x264_cabac_mb_intra_chroma_pred_mode( x264_t *h, x264_cabac_t *cb )
245 const int i_mode = x264_mb_pred_mode8x8c_fix[ h->mb.i_chroma_pred_mode ];
248 /* No need to test for I4x4 or I_16x16 as cache_save handle that */
249 if( (h->mb.i_neighbour & MB_LEFT) && h->mb.chroma_pred_mode[h->mb.i_mb_xy - 1] != 0 )
253 if( (h->mb.i_neighbour & MB_TOP) && h->mb.chroma_pred_mode[h->mb.i_mb_xy - h->mb.i_mb_stride] != 0 )
260 x264_cabac_encode_decision( cb, 64 + ctx, 0 );
264 x264_cabac_encode_decision( cb, 64 + ctx, 1 );
265 x264_cabac_encode_decision( cb, 64 + 3, ( i_mode == 1 ? 0 : 1 ) );
268 x264_cabac_encode_decision( cb, 64 + 3, ( i_mode == 2 ? 0 : 1 ) );
273 static void x264_cabac_mb_cbp_luma( x264_t *h, x264_cabac_t *cb )
275 /* TODO: clean up and optimize */
277 for( i8x8 = 0; i8x8 < 4; i8x8++ )
281 int x = block_idx_x[4*i8x8];
282 int y = block_idx_y[4*i8x8];
286 i_mba_xy = h->mb.i_mb_xy;
287 else if( h->mb.i_neighbour & MB_LEFT )
288 i_mba_xy = h->mb.i_mb_xy - 1;
291 i_mbb_xy = h->mb.i_mb_xy;
292 else if( h->mb.i_neighbour & MB_TOP )
293 i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
296 /* No need to test for PCM and SKIP */
299 const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
300 if( ((h->mb.cbp[i_mba_xy] >> i8x8a)&0x01) == 0 )
308 const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
309 if( ((h->mb.cbp[i_mbb_xy] >> i8x8b)&0x01) == 0 )
315 x264_cabac_encode_decision( cb, 73 + ctx, (h->mb.i_cbp_luma >> i8x8)&0x01 );
319 static void x264_cabac_mb_cbp_chroma( x264_t *h, x264_cabac_t *cb )
325 /* No need to test for SKIP/PCM */
326 if( h->mb.i_neighbour & MB_LEFT )
328 cbp_a = (h->mb.cbp[h->mb.i_mb_xy - 1] >> 4)&0x3;
331 if( h->mb.i_neighbour & MB_TOP )
333 cbp_b = (h->mb.cbp[h->mb.i_mb_xy - h->mb.i_mb_stride] >> 4)&0x3;
337 if( cbp_a > 0 ) ctx++;
338 if( cbp_b > 0 ) ctx += 2;
339 if( h->mb.i_cbp_chroma == 0 )
341 x264_cabac_encode_decision( cb, 77 + ctx, 0 );
345 x264_cabac_encode_decision( cb, 77 + ctx, 1 );
348 if( cbp_a == 2 ) ctx++;
349 if( cbp_b == 2 ) ctx += 2;
350 x264_cabac_encode_decision( cb, 77 + ctx, h->mb.i_cbp_chroma > 1 ? 1 : 0 );
354 /* TODO check it with != qp per mb */
355 static void x264_cabac_mb_qp_delta( x264_t *h, x264_cabac_t *cb )
357 int i_mbn_xy = h->mb.i_mb_xy - 1;
358 int i_dqp = h->mb.i_qp - h->mb.i_last_qp;
361 /* No need to test for PCM / SKIP */
362 if( i_mbn_xy >= h->sh.i_first_mb && h->mb.i_last_dqp != 0 &&
363 ( h->mb.type[i_mbn_xy] == I_16x16 || (h->mb.cbp[i_mbn_xy]&0x3f) ) )
370 int val = i_dqp <= 0 ? (-2*i_dqp) : (2*i_dqp - 1);
371 /* dqp is interpreted modulo 52 */
376 x264_cabac_encode_decision( cb, 60 + ctx, 1 );
383 x264_cabac_encode_decision( cb, 60 + ctx, 0 );
386 void x264_cabac_mb_skip( x264_t *h, int b_skip )
390 if( h->mb.i_mb_type_left >= 0 && !IS_SKIP( h->mb.i_mb_type_left ) )
394 if( h->mb.i_mb_type_top >= 0 && !IS_SKIP( h->mb.i_mb_type_top ) )
399 if( h->sh.i_type == SLICE_TYPE_P )
400 x264_cabac_encode_decision( &h->cabac, 11 + ctx, b_skip ? 1 : 0 );
401 else /* SLICE_TYPE_B */
402 x264_cabac_encode_decision( &h->cabac, 24 + ctx, b_skip ? 1 : 0 );
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, 0 );
538 x264_cabac_encode_bypass( cb, 1 );
541 static inline void x264_cabac_mb_mvd( x264_t *h, x264_cabac_t *cb, int i_list, int idx, int width, int height )
547 x264_mb_predict_mv( h, i_list, idx, width, mvp );
548 mdx = h->mb.cache.mv[i_list][x264_scan8[idx]][0] - mvp[0];
549 mdy = h->mb.cache.mv[i_list][x264_scan8[idx]][1] - mvp[1];
552 x264_cabac_mb_mvd_cpn( h, cb, i_list, idx, 0, mdx );
553 x264_cabac_mb_mvd_cpn( h, cb, i_list, idx, 1, mdy );
556 x264_macroblock_cache_mvd( h, block_idx_x[idx], block_idx_y[idx], width, height, i_list, mdx, mdy );
559 static inline void x264_cabac_mb8x8_mvd( x264_t *h, x264_cabac_t *cb, int i_list )
562 for( i = 0; i < 4; i++ )
564 if( !x264_mb_partition_listX_table[i_list][ h->mb.i_sub_partition[i] ] )
569 switch( h->mb.i_sub_partition[i] )
574 x264_cabac_mb_mvd( h, cb, i_list, 4*i, 2, 2 );
579 x264_cabac_mb_mvd( h, cb, i_list, 4*i+0, 2, 1 );
580 x264_cabac_mb_mvd( h, cb, i_list, 4*i+2, 2, 1 );
585 x264_cabac_mb_mvd( h, cb, i_list, 4*i+0, 1, 2 );
586 x264_cabac_mb_mvd( h, cb, i_list, 4*i+1, 1, 2 );
591 x264_cabac_mb_mvd( h, cb, i_list, 4*i+0, 1, 1 );
592 x264_cabac_mb_mvd( h, cb, i_list, 4*i+1, 1, 1 );
593 x264_cabac_mb_mvd( h, cb, i_list, 4*i+2, 1, 1 );
594 x264_cabac_mb_mvd( h, cb, i_list, 4*i+3, 1, 1 );
600 static int x264_cabac_mb_cbf_ctxidxinc( x264_t *h, int i_cat, int i_idx )
602 /* TODO: clean up/optimize */
609 if( i_cat == DCT_LUMA_DC )
611 if( h->mb.i_neighbour & MB_LEFT )
613 i_mba_xy = h->mb.i_mb_xy -1;
614 if( h->mb.type[i_mba_xy] == I_16x16 )
616 i_nza = h->mb.cbp[i_mba_xy]&0x100;
619 if( h->mb.i_neighbour & MB_TOP )
621 i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
622 if( h->mb.type[i_mbb_xy] == I_16x16 )
624 i_nzb = h->mb.cbp[i_mbb_xy]&0x100;
628 else if( i_cat == DCT_LUMA_AC || i_cat == DCT_LUMA_4x4 )
630 int x = block_idx_x[i_idx];
631 int y = block_idx_y[i_idx];
634 i_mba_xy = h->mb.i_mb_xy;
635 else if( h->mb.i_neighbour & MB_LEFT )
636 i_mba_xy = h->mb.i_mb_xy -1;
639 i_mbb_xy = h->mb.i_mb_xy;
640 else if( h->mb.i_neighbour & MB_TOP )
641 i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
643 /* no need to test for skip/pcm */
646 const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
647 if( (h->mb.cbp[i_mba_xy]&0x0f)>> i8x8a )
649 i_nza = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 1];
654 const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
655 if( (h->mb.cbp[i_mbb_xy]&0x0f)>> i8x8b )
657 i_nzb = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 8];
661 else if( i_cat == DCT_CHROMA_DC )
663 /* no need to test skip/pcm */
664 if( h->mb.i_neighbour & MB_LEFT )
666 i_mba_xy = h->mb.i_mb_xy -1;
667 if( h->mb.cbp[i_mba_xy]&0x30 )
669 i_nza = h->mb.cbp[i_mba_xy]&( 0x02 << ( 8 + i_idx) );
672 if( h->mb.i_neighbour & MB_TOP )
674 i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
675 if( h->mb.cbp[i_mbb_xy]&0x30 )
677 i_nzb = h->mb.cbp[i_mbb_xy]&( 0x02 << ( 8 + i_idx) );
681 else if( i_cat == DCT_CHROMA_AC )
684 i_mba_xy = h->mb.i_mb_xy;
685 else if( h->mb.i_neighbour & MB_LEFT )
686 i_mba_xy = h->mb.i_mb_xy - 1;
689 i_mbb_xy = h->mb.i_mb_xy;
690 else if( h->mb.i_neighbour & MB_TOP )
691 i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;
693 /* no need to test skip/pcm */
694 if( i_mba_xy >= 0 && (h->mb.cbp[i_mba_xy]&0x30) == 0x20 )
696 i_nza = h->mb.cache.non_zero_count[x264_scan8[16+i_idx] - 1];
698 if( i_mbb_xy >= 0 && (h->mb.cbp[i_mbb_xy]&0x30) == 0x20 )
700 i_nzb = h->mb.cache.non_zero_count[x264_scan8[16+i_idx] - 8];
704 if( ( i_mba_xy < 0 && IS_INTRA( h->mb.i_type ) ) || i_nza > 0 )
708 if( ( i_mbb_xy < 0 && IS_INTRA( h->mb.i_type ) ) || i_nzb > 0 )
717 static const int significant_coeff_flag_offset[6] = { 105, 120, 134, 149, 152, 402 };
718 static const int last_coeff_flag_offset[6] = { 166, 181, 195, 210, 213, 417 };
719 static const int coeff_abs_level_m1_offset[6] = { 227, 237, 247, 257, 266, 426 };
720 static const int significant_coeff_flag_offset_8x8[63] = {
721 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
722 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
723 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
724 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12
726 static const int last_coeff_flag_offset_8x8[63] = {
727 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
728 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
729 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
730 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
733 static void block_residual_write_cabac( x264_t *h, x264_cabac_t *cb, int i_ctxBlockCat, int i_idx, int *l, int i_count )
735 const int i_ctx_sig = significant_coeff_flag_offset[i_ctxBlockCat];
736 const int i_ctx_last = last_coeff_flag_offset[i_ctxBlockCat];
737 const int i_ctx_level = coeff_abs_level_m1_offset[i_ctxBlockCat];
739 int i_coeff_abs_m1[64];
740 int i_coeff_sign[64];
746 int i_abslevelgt1 = 0;
750 /* i_ctxBlockCat: 0-> DC 16x16 i_idx = 0
751 * 1-> AC 16x16 i_idx = luma4x4idx
752 * 2-> Luma4x4 i_idx = luma4x4idx
753 * 3-> DC Chroma i_idx = iCbCr
754 * 4-> AC Chroma i_idx = 4 * iCbCr + chroma4x4idx
755 * 5-> Luma8x8 i_idx = luma8x8idx
758 for( i = 0; i < i_count; i++ )
762 i_coeff_abs_m1[i_coeff] = abs( l[i] ) - 1;
763 i_coeff_sign[i_coeff] = ( l[i] < 0 );
772 /* coded block flag */
773 x264_cabac_encode_decision( cb, 85 + x264_cabac_mb_cbf_ctxidxinc( h, i_ctxBlockCat, i_idx ), i_coeff != 0 );
778 i_sigmap_size = X264_MIN( i_last+1, i_count-1 );
779 for( i = 0; i < i_sigmap_size; i++ )
782 int i_last_ctxIdxInc;
784 if( i_ctxBlockCat == DCT_LUMA_8x8 )
786 i_sig_ctxIdxInc = significant_coeff_flag_offset_8x8[i];
787 i_last_ctxIdxInc = last_coeff_flag_offset_8x8[i];
790 i_sig_ctxIdxInc = i_last_ctxIdxInc = i;
792 x264_cabac_encode_decision( cb, i_ctx_sig + i_sig_ctxIdxInc, l[i] != 0 );
794 x264_cabac_encode_decision( cb, i_ctx_last + i_last_ctxIdxInc, i == i_last );
797 for( i = i_coeff - 1; i >= 0; i-- )
799 /* write coeff_abs - 1 */
800 const int i_prefix = X264_MIN( i_coeff_abs_m1[i], 14 );
801 const int i_ctxIdxInc = (i_abslevelgt1 ? 0 : X264_MIN( 4, i_abslevel1 + 1 )) + i_ctx_level;
802 x264_cabac_encode_decision( cb, i_ctxIdxInc, i_prefix != 0 );
806 const int i_ctxIdxInc = 5 + X264_MIN( 4, i_abslevelgt1 ) + i_ctx_level;
808 for( j = 0; j < i_prefix - 1; j++ )
809 x264_cabac_encode_decision( cb, i_ctxIdxInc, 1 );
811 x264_cabac_encode_decision( cb, i_ctxIdxInc, 0 );
813 x264_cabac_encode_ue_bypass( cb, 0, i_coeff_abs_m1[i] - 14 );
821 x264_cabac_encode_bypass( cb, i_coeff_sign[i] );
827 void x264_macroblock_write_cabac( x264_t *h, x264_cabac_t *cb )
829 const int i_mb_type = h->mb.i_type;
834 const int i_mb_pos_start = x264_cabac_pos( cb );
838 /* Write the MB type */
839 x264_cabac_mb_type( h, cb );
841 /* PCM special block type UNTESTED */
842 if( i_mb_type == I_PCM )
845 cb->f8_bits_encoded += (384*8) << 8;
848 bs_align_0( s ); /* not sure */
850 for( i = 0; i < 16*16; i++ )
852 const int x = 16 * h->mb.i_mb_x + (i % 16);
853 const int y = 16 * h->mb.i_mb_y + (i / 16);
854 bs_write( s, 8, h->fenc->plane[0][y*h->mb.pic.i_stride[0]+x] );
857 for( i = 0; i < 8*8; i++ )
859 const int x = 8 * h->mb.i_mb_x + (i % 8);
860 const int y = 8 * h->mb.i_mb_y + (i / 8);
861 bs_write( s, 8, h->fenc->plane[1][y*h->mb.pic.i_stride[1]+x] );
864 for( i = 0; i < 8*8; i++ )
866 const int x = 8 * h->mb.i_mb_x + (i % 8);
867 const int y = 8 * h->mb.i_mb_y + (i / 8);
868 bs_write( s, 8, h->fenc->plane[2][y*h->mb.pic.i_stride[2]+x] );
870 x264_cabac_encode_init( cb, s );
875 if( IS_INTRA( i_mb_type ) )
877 if( h->pps->b_transform_8x8_mode && i_mb_type != I_16x16 )
878 x264_cabac_mb_transform_size( h, cb );
880 if( i_mb_type != I_16x16 )
882 int di = (i_mb_type == I_8x8) ? 4 : 1;
883 for( i = 0; i < 16; i += di )
885 const int i_pred = x264_mb_predict_intra4x4_mode( h, i );
886 const int i_mode = x264_mb_pred_mode4x4_fix( h->mb.cache.intra4x4_pred_mode[x264_scan8[i]] );
887 x264_cabac_mb_intra4x4_pred_mode( cb, i_pred, i_mode );
891 x264_cabac_mb_intra_chroma_pred_mode( h, cb );
893 else if( i_mb_type == P_L0 )
895 if( h->mb.i_partition == D_16x16 )
897 if( h->sh.i_num_ref_idx_l0_active > 1 )
899 x264_cabac_mb_ref( h, cb, 0, 0 );
901 x264_cabac_mb_mvd( h, cb, 0, 0, 4, 4 );
903 else if( h->mb.i_partition == D_16x8 )
905 if( h->sh.i_num_ref_idx_l0_active > 1 )
907 x264_cabac_mb_ref( h, cb, 0, 0 );
908 x264_cabac_mb_ref( h, cb, 0, 8 );
910 x264_cabac_mb_mvd( h, cb, 0, 0, 4, 2 );
911 x264_cabac_mb_mvd( h, cb, 0, 8, 4, 2 );
913 else if( h->mb.i_partition == D_8x16 )
915 if( h->sh.i_num_ref_idx_l0_active > 1 )
917 x264_cabac_mb_ref( h, cb, 0, 0 );
918 x264_cabac_mb_ref( h, cb, 0, 4 );
920 x264_cabac_mb_mvd( h, cb, 0, 0, 2, 4 );
921 x264_cabac_mb_mvd( h, cb, 0, 4, 2, 4 );
924 else if( i_mb_type == P_8x8 )
927 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[0] );
928 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[1] );
929 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[2] );
930 x264_cabac_mb_sub_p_partition( cb, h->mb.i_sub_partition[3] );
933 if( h->sh.i_num_ref_idx_l0_active > 1 )
935 x264_cabac_mb_ref( h, cb, 0, 0 );
936 x264_cabac_mb_ref( h, cb, 0, 4 );
937 x264_cabac_mb_ref( h, cb, 0, 8 );
938 x264_cabac_mb_ref( h, cb, 0, 12 );
941 x264_cabac_mb8x8_mvd( h, cb, 0 );
943 else if( i_mb_type == B_8x8 )
946 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[0] );
947 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[1] );
948 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[2] );
949 x264_cabac_mb_sub_b_partition( cb, h->mb.i_sub_partition[3] );
952 for( i_list = 0; i_list < 2; i_list++ )
954 if( ( i_list ? h->sh.i_num_ref_idx_l1_active : h->sh.i_num_ref_idx_l0_active ) == 1 )
956 for( i = 0; i < 4; i++ )
957 if( x264_mb_partition_listX_table[i_list][ h->mb.i_sub_partition[i] ] )
958 x264_cabac_mb_ref( h, cb, i_list, 4*i );
961 x264_cabac_mb8x8_mvd( h, cb, 0 );
962 x264_cabac_mb8x8_mvd( h, cb, 1 );
964 else if( i_mb_type != B_DIRECT )
969 /* init ref list utilisations */
970 for( i = 0; i < 2; i++ )
972 b_list[0][i] = x264_mb_type_list0_table[i_mb_type][i];
973 b_list[1][i] = x264_mb_type_list1_table[i_mb_type][i];
976 for( i_list = 0; i_list < 2; i_list++ )
978 const int i_ref_max = i_list == 0 ? h->sh.i_num_ref_idx_l0_active : h->sh.i_num_ref_idx_l1_active;
982 if( h->mb.i_partition == D_16x16 )
984 if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
986 else if( h->mb.i_partition == D_16x8 )
988 if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
989 if( b_list[i_list][1] ) x264_cabac_mb_ref( h, cb, i_list, 8 );
991 else if( h->mb.i_partition == D_8x16 )
993 if( b_list[i_list][0] ) x264_cabac_mb_ref( h, cb, i_list, 0 );
994 if( b_list[i_list][1] ) x264_cabac_mb_ref( h, cb, i_list, 4 );
998 for( i_list = 0; i_list < 2; i_list++ )
1000 if( h->mb.i_partition == D_16x16 )
1002 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 4 );
1004 else if( h->mb.i_partition == D_16x8 )
1006 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 4, 2 );
1007 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 8, 4, 2 );
1009 else if( h->mb.i_partition == D_8x16 )
1011 if( b_list[i_list][0] ) x264_cabac_mb_mvd( h, cb, i_list, 0, 2, 4 );
1012 if( b_list[i_list][1] ) x264_cabac_mb_mvd( h, cb, i_list, 4, 2, 4 );
1018 i_mb_pos_tex = x264_cabac_pos( cb );
1019 h->stat.frame.i_hdr_bits += i_mb_pos_tex - i_mb_pos_start;
1022 if( i_mb_type != I_16x16 )
1024 x264_cabac_mb_cbp_luma( h, cb );
1025 x264_cabac_mb_cbp_chroma( h, cb );
1028 if( h->mb.cache.b_transform_8x8_allowed && h->mb.i_cbp_luma && !IS_INTRA(i_mb_type) )
1030 x264_cabac_mb_transform_size( h, cb );
1033 if( h->mb.i_cbp_luma > 0 || h->mb.i_cbp_chroma > 0 || i_mb_type == I_16x16 )
1035 x264_cabac_mb_qp_delta( h, cb );
1037 /* write residual */
1038 if( i_mb_type == I_16x16 )
1041 block_residual_write_cabac( h, cb, DCT_LUMA_DC, 0, h->dct.luma16x16_dc, 16 );
1044 if( h->mb.i_cbp_luma != 0 )
1045 for( i = 0; i < 16; i++ )
1046 block_residual_write_cabac( h, cb, DCT_LUMA_AC, i, h->dct.block[i].residual_ac, 15 );
1048 else if( h->mb.b_transform_8x8 )
1050 for( i = 0; i < 4; i++ )
1051 if( h->mb.i_cbp_luma & ( 1 << i ) )
1052 block_residual_write_cabac( h, cb, DCT_LUMA_8x8, i, h->dct.luma8x8[i], 64 );
1056 for( i = 0; i < 16; i++ )
1057 if( h->mb.i_cbp_luma & ( 1 << ( i / 4 ) ) )
1058 block_residual_write_cabac( h, cb, DCT_LUMA_4x4, i, h->dct.block[i].luma4x4, 16 );
1061 if( h->mb.i_cbp_chroma &0x03 ) /* Chroma DC residual present */
1063 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 0, h->dct.chroma_dc[0], 4 );
1064 block_residual_write_cabac( h, cb, DCT_CHROMA_DC, 1, h->dct.chroma_dc[1], 4 );
1066 if( h->mb.i_cbp_chroma&0x02 ) /* Chroma AC residual present */
1068 for( i = 0; i < 8; i++ )
1069 block_residual_write_cabac( h, cb, DCT_CHROMA_AC, i, h->dct.block[16+i].residual_ac, 15 );
1074 if( IS_INTRA( i_mb_type ) )
1075 h->stat.frame.i_itex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;
1077 h->stat.frame.i_ptex_bits += x264_cabac_pos( cb ) - i_mb_pos_tex;