1 /****************************************************************************** 2 * 3 * Copyright (C) 2015 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 21 /** 22 ******************************************************************************* 23 * @file 24 * ih264e_cabac.c 25 * 26 * @brief 27 * Contains all functions to encode in CABAC entropy mode 28 * 29 * 30 * @author 31 * Doney Alex 32 * 33 * @par List of Functions: 34 * 35 * 36 * @remarks 37 * None 38 * 39 ******************************************************************************* 40 */ 41 42 /*****************************************************************************/ 43 /* File Includes */ 44 /*****************************************************************************/ 45 46 /* System include files */ 47 #include <stdio.h> 48 #include <assert.h> 49 #include <limits.h> 50 #include <string.h> 51 52 /* User include files */ 53 #include "ih264e_config.h" 54 #include "ih264_typedefs.h" 55 #include "iv2.h" 56 #include "ive2.h" 57 #include "ih264_debug.h" 58 #include "ih264_defs.h" 59 #include "ih264e_defs.h" 60 #include "ih264_macros.h" 61 #include "ih264e_error.h" 62 #include "ih264e_bitstream.h" 63 #include "ime_distortion_metrics.h" 64 #include "ime_defs.h" 65 #include "ime_structs.h" 66 #include "ih264_error.h" 67 #include "ih264_structs.h" 68 #include "ih264_trans_quant_itrans_iquant.h" 69 #include "ih264_inter_pred_filters.h" 70 #include "ih264_mem_fns.h" 71 #include "ih264_padding.h" 72 #include "ih264_platform_macros.h" 73 #include "ih264_intra_pred_filters.h" 74 #include "ih264_deblk_edge_filters.h" 75 #include "ih264_cabac_tables.h" 76 #include "irc_cntrl_param.h" 77 #include "irc_frame_info_collector.h" 78 #include "ih264e_rate_control.h" 79 #include "ih264e_cabac_structs.h" 80 #include "ih264e_structs.h" 81 #include "ih264e_cabac.h" 82 #include "ih264e_encode_header.h" 83 #include "ih264_cavlc_tables.h" 84 #include "ih264e_cavlc.h" 85 #include "ih264e_statistics.h" 86 #include "ih264e_trace.h" 87 88 /*****************************************************************************/ 89 /* Function Definitions */ 90 /*****************************************************************************/ 91 92 93 94 95 /** 96 ******************************************************************************* 97 * 98 * @brief 99 * Encodes mb_skip_flag using CABAC entropy coding mode. 100 * 101 * @param[in] u1_mb_skip_flag 102 * mb_skip_flag 103 * 104 * @param[in] ps_cabac_ctxt 105 * Pointer to cabac context structure 106 * 107 * @param[in] u4_ctxidx_offset 108 * ctxIdxOffset for mb_skip_flag context 109 * 110 * @returns 111 * 112 * @remarks 113 * None 114 * 115 ******************************************************************************* 116 */ 117 static void ih264e_cabac_enc_mb_skip(UWORD8 u1_mb_skip_flag, 118 cabac_ctxt_t *ps_cabac_ctxt, 119 UWORD32 u4_ctxidx_offset) 120 { 121 122 UWORD8 u4_ctx_inc; 123 WORD8 a, b; 124 a = ((ps_cabac_ctxt->ps_left_ctxt_mb_info->u1_mb_type & CAB_SKIP_MASK) ? 125 0 : 1); 126 b = ((ps_cabac_ctxt->ps_top_ctxt_mb_info->u1_mb_type & CAB_SKIP_MASK) ? 127 0 : 1); 128 129 u4_ctx_inc = a + b; 130 /* Encode the bin */ 131 ih264e_cabac_encode_bin(ps_cabac_ctxt, 132 (UWORD32) u1_mb_skip_flag, 133 ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctxidx_offset 134 + u4_ctx_inc); 135 136 } 137 138 139 /* ! < Table 9-36 Binarization for macroblock types in I slices in ITU_T_H264-201402 140 * Bits 0-7 : binarised value 141 * Bits 8-15: length of binary sequence 142 */ 143 static const UWORD32 u4_mb_type_intra[26] = 144 { 0x0100, 0x0620, 0x0621, 0x0622, 0x0623, 0x0748, 0x0749, 0x074a, 0x074b, 145 0x074c, 0x074d, 0x074e, 0x074f, 0x0628, 0x0629, 0x062a, 0x062b, 0x0758, 146 0x0759, 0x075a, 0x075b, 0x075c, 0x075d, 0x075e, 0x075f, 0x0203 }; 147 148 149 /* CtxInc for mb types */ 150 static const UWORD32 u4_mb_ctxinc[2][26] = 151 { 152 /* Intra CtxInc's */ 153 { 0x00, 154 0x03467, 0x03467, 0x03467, 0x03467, 0x034567, 0x034567, 0x034567, 155 0x034567, 0x034567, 0x034567, 0x034567, 0x034567, 0x03467, 0x03467, 156 0x03467, 0x03467, 0x034567, 0x034567, 0x034567, 0x034567, 0x034567, 157 0x034567, 0x034567, 0x034567, 0x00}, 158 /* Inter CtxInc's */ 159 { 0x00, 160 0x001233, 0x001233, 0x001233, 0x001233, 0x0012233, 0x0012233, 0x0012233, 161 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x001233, 0x001233, 162 0x001233, 0x001233, 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x0012233, 163 0x0012233, 0x0012233, 0x0012233, 0x00} 164 }; 165 166 167 /** 168 ******************************************************************************* 169 * 170 * @brief 171 * Encodes mb_type for an intra MB. 172 * 173 * @param[in] u4_slice_type 174 * slice type 175 * 176 * @param[in] u4_intra_mb_type 177 * MB type (Table 7-11) 178 * 179 * @param[in] ps_cabac_ctxt 180 * Pointer to cabac context structure 181 * 182 ** @param[in] u4_ctxidx_offset 183 * ctxIdxOffset for mb_type context 184 * 185 * @returns 186 * 187 * @remarks 188 * None 189 * 190 ******************************************************************************* 191 */ 192 193 static void ih264e_cabac_enc_intra_mb_type(UWORD32 u4_slice_type, 194 UWORD32 u4_intra_mb_type, 195 cabac_ctxt_t *ps_cabac_ctxt, 196 UWORD32 u4_ctx_idx_offset) 197 { 198 199 encoding_envirnoment_t *ps_cab_enc_env = &(ps_cabac_ctxt->s_cab_enc_env); 200 bin_ctxt_model *pu1_mb_bin_ctxt, *pu1_bin_ctxt; 201 UWORD8 u1_bin; 202 mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info; 203 mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 204 UWORD32 u4_bins; 205 UWORD32 u4_ctx_inc; 206 WORD8 i1_bins_len; 207 UWORD32 u4_code_int_range; 208 UWORD32 u4_code_int_low; 209 UWORD16 u2_quant_code_int_range; 210 UWORD16 u4_code_int_range_lps; 211 WORD8 i; 212 UWORD8 u1_ctx_inc; 213 UWORD32 u4_table_val; 214 215 pu1_mb_bin_ctxt = ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_idx_offset; 216 217 u4_bins = u4_mb_type_intra[u4_intra_mb_type]; 218 i1_bins_len = (WORD8) ((u4_bins >> 8) & 0x0f); 219 u4_ctx_inc = u4_mb_ctxinc[(u4_slice_type != ISLICE)][u4_intra_mb_type]; 220 u1_ctx_inc = 0; 221 if (u4_slice_type == ISLICE) 222 { 223 if (ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 224 u1_ctx_inc += ((ps_left_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0); 225 if (ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 226 u1_ctx_inc += ((ps_top_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0); 227 228 u4_ctx_inc = (u4_ctx_inc | (u1_ctx_inc << ((i1_bins_len - 1) << 2))); 229 } 230 else 231 { 232 pu1_mb_bin_ctxt += 3; 233 if (u4_slice_type == BSLICE) 234 pu1_mb_bin_ctxt += 2; 235 236 } 237 238 u4_code_int_range = ps_cab_enc_env->u4_code_int_range; 239 u4_code_int_low = ps_cab_enc_env->u4_code_int_low; 240 241 for (i = (i1_bins_len - 1); i >= 0; i--) 242 { 243 WORD32 shift; 244 245 u1_ctx_inc = ((u4_ctx_inc >> (i << 2)) & 0x0f); 246 u1_bin = ((u4_bins >> i) & 0x01); 247 /* Encode the bin */ 248 pu1_bin_ctxt = pu1_mb_bin_ctxt + u1_ctx_inc; 249 if (i != (i1_bins_len - 2)) 250 { 251 WORD8 i1_mps = !!((*pu1_bin_ctxt) & (0x40)); 252 WORD8 i1_state = (*pu1_bin_ctxt) & 0x3F; 253 254 u2_quant_code_int_range = ((u4_code_int_range >> 6) & 0x03); 255 u4_table_val = 256 gau4_ih264_cabac_table[i1_state][u2_quant_code_int_range]; 257 u4_code_int_range_lps = u4_table_val & 0xFF; 258 259 u4_code_int_range -= u4_code_int_range_lps; 260 if (u1_bin != i1_mps) 261 { 262 u4_code_int_low += u4_code_int_range; 263 u4_code_int_range = u4_code_int_range_lps; 264 if (i1_state == 0) 265 { 266 /* MPS(CtxIdx) = 1 - MPS(CtxIdx) */ 267 i1_mps = 1 - i1_mps; 268 } 269 270 i1_state = (u4_table_val >> 15) & 0x3F; 271 } 272 else 273 { 274 i1_state = (u4_table_val >> 8) & 0x3F; 275 276 } 277 278 (*pu1_bin_ctxt) = (i1_mps << 6) | i1_state; 279 } 280 else 281 { 282 u4_code_int_range -= 2; 283 } 284 285 /* Renormalize */ 286 /*****************************************************************/ 287 /* Renormalization; calculate bits generated based on range(R) */ 288 /* Note : 6 <= R < 512; R is 2 only for terminating encode */ 289 /*****************************************************************/ 290 GETRANGE(shift, u4_code_int_range); 291 shift = 9 - shift; 292 u4_code_int_low <<= shift; 293 u4_code_int_range <<= shift; 294 295 /* bits to be inserted in the bitstream */ 296 ps_cab_enc_env->u4_bits_gen += shift; 297 ps_cab_enc_env->u4_code_int_range = u4_code_int_range; 298 ps_cab_enc_env->u4_code_int_low = u4_code_int_low; 299 300 /* generate stream when a byte is ready */ 301 if (ps_cab_enc_env->u4_bits_gen > CABAC_BITS) 302 { 303 ih264e_cabac_put_byte(ps_cabac_ctxt); 304 u4_code_int_range = ps_cab_enc_env->u4_code_int_range; 305 u4_code_int_low = ps_cab_enc_env->u4_code_int_low; 306 307 } 308 } 309 } 310 311 312 313 /** 314 ******************************************************************************* 315 * 316 * @brief 317 * Encodes prev_intra4x4_pred_mode_flag and 318 * rem_intra4x4_pred_mode using CABAC entropy coding mode 319 * 320 * @param[in] ps_cabac_ctxt 321 * Pointer to cabac context structure 322 * 323 * @param[in] pu1_intra_4x4_modes 324 * Pointer to array containing prev_intra4x4_pred_mode_flag and 325 * rem_intra4x4_pred_mode 326 * 327 * @returns 328 * 329 * @remarks 330 * None 331 * 332 ******************************************************************************* 333 */ 334 static void ih264e_cabac_enc_4x4mb_modes(cabac_ctxt_t *ps_cabac_ctxt, 335 UWORD8 *pu1_intra_4x4_modes) 336 { 337 WORD32 i; 338 WORD8 byte; 339 for (i = 0; i < 16; i += 2) 340 { 341 /* sub blk idx 1 */ 342 byte = pu1_intra_4x4_modes[i >> 1]; 343 if (byte & 0x1) 344 { 345 ih264e_cabac_encode_bin(ps_cabac_ctxt, 346 1, 347 ps_cabac_ctxt->au1_cabac_ctxt_table 348 + PREV_INTRA4X4_PRED_MODE_FLAG); 349 } 350 else 351 { 352 /* Binarization is FL and Cmax=7 */ 353 ih264e_encode_decision_bins(byte & 0xF, 354 4, 355 0x05554, 356 4, 357 ps_cabac_ctxt->au1_cabac_ctxt_table 358 + REM_INTRA4X4_PRED_MODE - 5, 359 ps_cabac_ctxt); 360 } 361 /* sub blk idx 2 */ 362 byte >>= 4; 363 if (byte & 0x1) 364 { 365 ih264e_cabac_encode_bin(ps_cabac_ctxt, 366 1, 367 ps_cabac_ctxt->au1_cabac_ctxt_table 368 + PREV_INTRA4X4_PRED_MODE_FLAG); 369 } 370 else 371 { 372 ih264e_encode_decision_bins(byte & 0xF, 373 4, 374 0x05554, 375 4, 376 ps_cabac_ctxt->au1_cabac_ctxt_table 377 + REM_INTRA4X4_PRED_MODE - 5, 378 ps_cabac_ctxt); 379 } 380 } 381 } 382 383 384 385 /** 386 ******************************************************************************* 387 * 388 * @brief 389 * Encodes chroma intrapred mode for the MB. 390 * 391 * @param[in] u1_chroma_pred_mode 392 * Chroma intr prediction mode 393 * 394 * @param[in] ps_cabac_ctxt 395 * Pointer to cabac context structure 396 * 397 * @returns 398 * 399 * @remarks 400 * None 401 * 402 ******************************************************************************* 403 */ 404 static void ih264e_cabac_enc_chroma_predmode(UWORD8 u1_chroma_pred_mode, 405 cabac_ctxt_t *ps_cabac_ctxt) 406 { 407 408 WORD8 i1_temp; 409 mb_info_ctxt_t *ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 410 mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info; 411 mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 412 UWORD32 u4_bins = 0; 413 WORD8 i1_bins_len = 1; 414 UWORD32 u4_ctx_inc = 0; 415 UWORD8 a, b; 416 a = ((ps_left_ctxt->u1_intrapred_chroma_mode != 0) ? 1 : 0); 417 b = ((ps_top_ctxt->u1_intrapred_chroma_mode != 0) ? 1 : 0); 418 419 /* Binarization is TU and Cmax=3 */ 420 ps_curr_ctxt->u1_intrapred_chroma_mode = u1_chroma_pred_mode; 421 422 u4_ctx_inc = a + b; 423 u4_ctx_inc = (u4_ctx_inc | 0x330); 424 if (u1_chroma_pred_mode) 425 { 426 u4_bins = 1; 427 i1_temp = u1_chroma_pred_mode; 428 i1_temp--; 429 /* Put a stream of 1's of length Chromaps_pred_mode_ctxt value */ 430 while (i1_temp) 431 { 432 u4_bins = (u4_bins | (1 << i1_bins_len)); 433 i1_bins_len++; 434 i1_temp--; 435 } 436 /* If Chromaps_pred_mode_ctxt < Cmax i.e 3. Terminate put a zero */ 437 if (u1_chroma_pred_mode < 3) 438 { 439 i1_bins_len++; 440 } 441 } 442 443 ih264e_encode_decision_bins(u4_bins, 444 i1_bins_len, 445 u4_ctx_inc, 446 3, 447 ps_cabac_ctxt->au1_cabac_ctxt_table 448 + INTRA_CHROMA_PRED_MODE, 449 ps_cabac_ctxt); 450 451 } 452 453 454 /** 455 ******************************************************************************* 456 * 457 * @brief 458 * Encodes CBP for the MB. 459 * 460 * @param[in] u1_cbp 461 * CBP for the MB 462 * 463 * @param[in] ps_cabac_ctxt 464 * Pointer to cabac context structure 465 * 466 * @returns 467 * 468 * @remarks 469 * None 470 * 471 ******************************************************************************* 472 */ 473 static void ih264e_cabac_enc_cbp(UWORD32 u4_cbp, cabac_ctxt_t *ps_cabac_ctxt) 474 { 475 mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info; 476 mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 477 WORD8 i2_cbp_chroma, i, j; 478 UWORD8 u1_ctxt_inc, u1_bin; 479 UWORD8 a, b; 480 UWORD32 u4_ctx_inc; 481 UWORD32 u4_bins; 482 WORD8 i1_bins_len; 483 484 /* CBP Luma, FL, Cmax = 15, L = 4 */ 485 u4_ctx_inc = 0; 486 u4_bins = 0; 487 i1_bins_len = 5; 488 for (i = 0; i < 4; i++) 489 { 490 /* calulate ctxtInc, depending on neighbour availability */ 491 /* u1_ctxt_inc = CondTerm(A) + 2 * CondTerm(B); 492 A: Left block and B: Top block */ 493 494 /* Check for Top availability */ 495 if (i >> 1) 496 { 497 j = i - 2; 498 /* Top is available always and it's current MB */ 499 b = (((u4_cbp >> j) & 0x01) != 0 ? 0 : 1); 500 } 501 else 502 { 503 /* for blocks whose top reference is in another MB */ 504 { 505 j = i + 2; 506 b = ((ps_top_ctxt->u1_cbp >> j) & 0x01) ? 0 : 1; 507 } 508 } 509 510 /* Check for Left availability */ 511 if (i & 0x01) 512 { 513 /* Left is available always and it's current MB */ 514 j = i - 1; 515 a = (((u4_cbp >> j) & 0x01) != 0 ? 0 : 1); 516 } 517 else 518 { 519 { 520 j = i + 1; 521 a = ((ps_left_ctxt->u1_cbp >> j) & 0x01) ? 0 : 1; 522 } 523 } 524 u1_ctxt_inc = a + 2 * b; 525 u1_bin = ((u4_cbp >> i) & 0x01); 526 u4_ctx_inc = (u4_ctx_inc | (u1_ctxt_inc << (i << 2))); 527 u4_bins = (u4_bins | (u1_bin << i)); 528 } 529 530 /* CBP Chroma, TU, Cmax = 2 */ 531 i2_cbp_chroma = u4_cbp >> 4; 532 /* calulate ctxtInc, depending on neighbour availability */ 533 a = (ps_left_ctxt->u1_cbp > 15) ? 1 : 0; 534 b = (ps_top_ctxt->u1_cbp > 15) ? 1 : 0; 535 536 u1_ctxt_inc = a + 2 * b; 537 if (i2_cbp_chroma) 538 { 539 u4_ctx_inc = u4_ctx_inc | ((4 + u1_ctxt_inc) << 16); 540 u4_bins = (u4_bins | 0x10); 541 /* calulate ctxtInc, depending on neighbour availability */ 542 a = (ps_left_ctxt->u1_cbp > 31) ? 1 : 0; 543 b = (ps_top_ctxt->u1_cbp > 31) ? 1 : 0; 544 u1_ctxt_inc = a + 2 * b; 545 u4_ctx_inc = u4_ctx_inc | ((8 + u1_ctxt_inc) << 20); 546 u4_bins = (u4_bins | (((i2_cbp_chroma >> 1) & 0x01) << i1_bins_len)); 547 i1_bins_len++; 548 } 549 else 550 { 551 u4_ctx_inc = (u4_ctx_inc | ((4 + u1_ctxt_inc) << 16)); 552 } 553 ih264e_encode_decision_bins(u4_bins, i1_bins_len, u4_ctx_inc, 8, 554 ps_cabac_ctxt->au1_cabac_ctxt_table + CBP_LUMA, 555 ps_cabac_ctxt); 556 } 557 558 559 /** 560 ******************************************************************************* 561 * 562 * @brief 563 * Encodes mb_qp_delta for the MB. 564 * 565 * @param[in] i1_mb_qp_delta 566 * mb_qp_delta 567 * 568 * @param[in] ps_cabac_ctxt 569 * Pointer to cabac context structure 570 * 571 * @returns 572 * 573 * @remarks 574 * None 575 * 576 ******************************************************************************* 577 */ 578 static void ih264e_cabac_enc_mb_qp_delta(WORD8 i1_mb_qp_delta, 579 cabac_ctxt_t *ps_cabac_ctxt) 580 { 581 UWORD8 u1_code_num; 582 UWORD8 u1_ctxt_inc; 583 584 UWORD32 u4_ctx_inc; 585 UWORD32 u4_bins; 586 WORD8 i1_bins_len; 587 UWORD8 u1_ctx_inc, u1_bin; 588 /* Range of ps_mb_qp_delta_ctxt= -26 to +25 inclusive */ 589 ASSERT((i1_mb_qp_delta < 26) && (i1_mb_qp_delta > -27)); 590 /* if ps_mb_qp_delta_ctxt=0, then codeNum=0 */ 591 u1_code_num = 0; 592 if (i1_mb_qp_delta > 0) 593 u1_code_num = (i1_mb_qp_delta << 1) - 1; 594 else if (i1_mb_qp_delta < 0) 595 u1_code_num = (ABS(i1_mb_qp_delta)) << 1; 596 597 u4_ctx_inc = 0; 598 u4_bins = 0; 599 i1_bins_len = 1; 600 /* calculate ctxtInc, depending on neighbour availability */ 601 u1_ctxt_inc = (!(!(ps_cabac_ctxt->i1_prevps_mb_qp_delta_ctxt))); 602 ps_cabac_ctxt->i1_prevps_mb_qp_delta_ctxt = i1_mb_qp_delta; 603 604 if (u1_code_num == 0) 605 { 606 /* b0 */ 607 u1_bin = (UWORD8) (u4_bins); 608 u1_ctx_inc = u1_ctxt_inc & 0x0f; 609 /* Encode the bin */ 610 ih264e_cabac_encode_bin(ps_cabac_ctxt, 611 u1_bin, 612 ps_cabac_ctxt->au1_cabac_ctxt_table + MB_QP_DELTA 613 + u1_ctx_inc); 614 615 } 616 else 617 { 618 /* b0 */ 619 u4_ctx_inc = u1_ctxt_inc; 620 u4_bins = 1; 621 u1_code_num--; 622 if (u1_code_num == 0) 623 { 624 /* b1 */ 625 u4_ctx_inc = (u4_ctx_inc | 0x20); 626 i1_bins_len++; 627 ih264e_encode_decision_bins(u4_bins, i1_bins_len, u4_ctx_inc, 3, 628 ps_cabac_ctxt->au1_cabac_ctxt_table + MB_QP_DELTA, 629 ps_cabac_ctxt); 630 } 631 else 632 { 633 /* b1 */ 634 u4_ctx_inc = (u4_ctx_inc | 0x20); 635 u4_bins = (u4_bins | (1 << i1_bins_len)); 636 i1_bins_len++; 637 u1_code_num--; 638 /* BinIdx from b2 onwards */ 639 if (u1_code_num < 30) 640 { /* maximum i1_bins_len = 31 */ 641 while (u1_code_num) 642 { 643 u4_bins = (u4_bins | (1 << i1_bins_len)); 644 i1_bins_len++; 645 u1_code_num--; 646 }; 647 u4_ctx_inc = (u4_ctx_inc | 0x300); 648 i1_bins_len++; 649 ih264e_encode_decision_bins(u4_bins, 650 i1_bins_len, 651 u4_ctx_inc, 652 2, 653 ps_cabac_ctxt->au1_cabac_ctxt_table 654 + MB_QP_DELTA, 655 ps_cabac_ctxt); 656 } 657 else 658 { 659 /* maximum i1_bins_len = 53 */ 660 u4_bins = 0xffffffff; 661 i1_bins_len = 32; 662 u4_ctx_inc = (u4_ctx_inc | 0x300); 663 u1_code_num -= 30; 664 ih264e_encode_decision_bins(u4_bins, 665 i1_bins_len, 666 u4_ctx_inc, 667 2, 668 ps_cabac_ctxt->au1_cabac_ctxt_table 669 + MB_QP_DELTA, 670 ps_cabac_ctxt); 671 u4_bins = 0; 672 i1_bins_len = 0; 673 u4_ctx_inc = 0x033; 674 while (u1_code_num) 675 { 676 u4_bins = (u4_bins | (1 << i1_bins_len)); 677 i1_bins_len++; 678 u1_code_num--; 679 }; 680 681 u4_ctx_inc = (u4_ctx_inc | 0x300); 682 i1_bins_len++; 683 ih264e_encode_decision_bins(u4_bins, 684 i1_bins_len, 685 u4_ctx_inc, 686 1, 687 ps_cabac_ctxt->au1_cabac_ctxt_table 688 + MB_QP_DELTA, 689 ps_cabac_ctxt); 690 } 691 } 692 } 693 } 694 695 696 697 698 /** 699 ******************************************************************************* 700 * @brief 701 * Encodes 4residual_block_cabac as defined in 7.3.5.3.3. 702 * 703 * @param[in] pi2_res_block 704 * pointer to the array of residues 705 * 706 * @param[in] u1_nnz 707 * Number of non zero coeffs in the block 708 * 709 * @param[in] u1_max_num_coeffs 710 * Max number of coeffs that can be there in the block 711 * 712 * @param[in] u2_sig_coeff_map 713 * Significant coeff map 714 * 715 * @param[in] u4_ctx_cat_offset 716 * ctxIdxOffset for absolute value contexts 717 * 718 * @param[in] pu1_ctxt_sig_coeff 719 * Pointer to residual state variables 720 * 721 * @param[in] ps_cabac_ctxt 722 * Pointer to cabac context structure 723 * 724 * @returns 725 * 726 * @remarks 727 * None 728 * 729 ******************************************************************************* 730 */ 731 static void ih264e_cabac_write_coeff4x4(WORD16 *pi2_res_block, UWORD8 u1_nnz, 732 UWORD8 u1_max_num_coeffs, 733 UWORD16 u2_sig_coeff_map, 734 UWORD32 u4_ctx_cat_offset, 735 bin_ctxt_model *pu1_ctxt_sig_coeff, 736 cabac_ctxt_t *ps_cabac_ctxt) 737 { 738 739 WORD8 i; 740 WORD16 *pi16_coeffs; 741 UWORD32 u4_sig_coeff, u4_bins; 742 UWORD32 u4_ctx_inc; 743 UWORD8 u1_last_sig_coef_index = (31 - CLZ(u2_sig_coeff_map)); 744 745 /* Always put Coded Block Flag as 1 */ 746 747 pi16_coeffs = pi2_res_block; 748 { 749 bin_ctxt_model *pu1_bin_ctxt; 750 UWORD8 u1_bin, uc_last; 751 752 i = 0; 753 pu1_bin_ctxt = pu1_ctxt_sig_coeff; 754 u4_sig_coeff = 0; 755 u1_bin = 1; 756 if ((u1_last_sig_coef_index)) 757 { 758 u1_bin = !!(u2_sig_coeff_map & 01); 759 } 760 uc_last = 1; 761 762 do 763 { 764 /* Encode Decision */ 765 ih264e_cabac_encode_bin(ps_cabac_ctxt, u1_bin, pu1_bin_ctxt); 766 767 if (u1_bin & uc_last) 768 { 769 u4_sig_coeff = (u4_sig_coeff | (1 << i)); 770 pu1_bin_ctxt = pu1_ctxt_sig_coeff + i 771 + LAST_SIGNIFICANT_COEFF_FLAG_FRAME 772 - SIGNIFICANT_COEFF_FLAG_FRAME; 773 u1_bin = (i == u1_last_sig_coef_index); 774 uc_last = 0; 775 } 776 else 777 { 778 i = i + 1; 779 pu1_bin_ctxt = pu1_ctxt_sig_coeff + i; 780 u1_bin = (i == u1_last_sig_coef_index); 781 uc_last = 1; 782 if ((i != u1_last_sig_coef_index)) 783 { 784 u1_bin = !!((u2_sig_coeff_map >> i) & 01); 785 } 786 } 787 }while (!((i > u1_last_sig_coef_index) 788 || (i > (u1_max_num_coeffs - 1)))); 789 } 790 791 /* Encode coeff_abs_level_minus1 and coeff_sign_flag */ 792 { 793 UWORD8 u1_sign; 794 UWORD16 u2_abs_level; 795 UWORD8 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0; 796 UWORD8 u1_ctx_inc; 797 UWORD8 u1_coff; 798 WORD16 i2_sufs; 799 WORD8 i1_bins_len; 800 i = u1_last_sig_coef_index; 801 pi16_coeffs = pi2_res_block + u1_nnz - 1; 802 do 803 { 804 { 805 u4_sig_coeff = u4_sig_coeff & ((1 << i) - 1); 806 u4_bins = 0; 807 u4_ctx_inc = 0; 808 i1_bins_len = 1; 809 /* Encode the AbsLevelMinus1 */ 810 u2_abs_level = ABS(*(pi16_coeffs)) - 1; 811 /* CtxInc for bin0 */ 812 u4_ctx_inc = MIN(u1_abs_level_equal1, 4); 813 /* CtxInc for remaining */ 814 u1_ctx_inc = 5 + MIN(u1_abs_level_gt1, 4); 815 u4_ctx_inc = u4_ctx_inc + (u1_ctx_inc << 4); 816 if (u2_abs_level) 817 { 818 u1_abs_level_gt1++; 819 u1_abs_level_equal1 = 0; 820 } 821 if (!u1_abs_level_gt1) 822 u1_abs_level_equal1++; 823 824 u1_coff = 14; 825 if (u2_abs_level >= u1_coff) 826 { 827 /* Prefix TU i.e string of 14 1's */ 828 u4_bins = 0x3fff; 829 i1_bins_len = 14; 830 ih264e_encode_decision_bins(u4_bins, i1_bins_len, 831 u4_ctx_inc, 1, ps_cabac_ctxt->au1_cabac_ctxt_table 832 + u4_ctx_cat_offset, 833 ps_cabac_ctxt); 834 835 /* Suffix, uses EncodeBypass */ 836 i2_sufs = u2_abs_level - u1_coff; 837 838 u4_bins = ih264e_cabac_UEGk0_binarization(i2_sufs, 839 &i1_bins_len); 840 841 ih264e_cabac_encode_bypass_bins(ps_cabac_ctxt, u4_bins, 842 i1_bins_len); 843 844 } 845 else 846 { 847 /* Prefix only */ 848 u4_bins = (1 << u2_abs_level) - 1; 849 i1_bins_len = u2_abs_level + 1; 850 /* Encode Terminating bit */ 851 ih264e_encode_decision_bins(u4_bins, i1_bins_len, 852 u4_ctx_inc, 1, ps_cabac_ctxt->au1_cabac_ctxt_table 853 + u4_ctx_cat_offset, 854 ps_cabac_ctxt); 855 } 856 } 857 /* encode coeff_sign_flag[i] */ 858 u1_sign = ((*pi16_coeffs) < 0) ? 1 : 0; 859 ih264e_cabac_encode_bypass_bin(ps_cabac_ctxt, u1_sign); 860 i = CLZ(u4_sig_coeff); 861 i = 31 - i; 862 pi16_coeffs--; 863 }while (u4_sig_coeff); 864 } 865 866 } 867 868 869 /** 870 ******************************************************************************* 871 * @brief 872 * Write DC coeffs for intra predicted luma block 873 * 874 * @param[in] ps_ent_ctxt 875 * Pointer to entropy context structure 876 * 877 * @returns 878 * 879 * @remarks 880 * None 881 * 882 ******************************************************************************* 883 */ 884 static void ih264e_cabac_encode_residue_luma_dc(entropy_ctxt_t *ps_ent_ctxt) 885 { 886 887 /* CABAC context */ 888 cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 889 tu_sblk_coeff_data_t *ps_mb_coeff_data; 890 891 /* packed residue */ 892 void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data; 893 UWORD16 u2_sig_coeff_map; 894 WORD16 *pi2_res_block; 895 UWORD8 u1_nnz; 896 UWORD8 u1_cbf; 897 mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 898 mb_info_ctxt_t *p_CurCtxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 899 900 PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, u1_nnz, 901 u2_sig_coeff_map, pi2_res_block); 902 903 u1_cbf = !!(u1_nnz); 904 905 { 906 UWORD32 u4_ctx_inc; 907 UWORD8 u1_a, u1_b; 908 909 u1_a = ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] & 0x1; 910 u1_b = ps_top_ctxt->u1_yuv_dc_csbp & 0x1; 911 u4_ctx_inc = u1_a + (u1_b << 1); 912 913 ih264e_cabac_encode_bin(ps_cabac_ctxt, 914 u1_cbf, 915 ps_cabac_ctxt->au1_cabac_ctxt_table + CBF 916 + (LUMA_DC_CTXCAT << 2) + u4_ctx_inc); 917 } 918 919 /* Write coded_block_flag */ 920 if (u1_cbf) 921 { 922 ih264e_cabac_write_coeff4x4(pi2_res_block, 923 u1_nnz, 924 15, 925 u2_sig_coeff_map, 926 COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_0_OFFSET, 927 ps_cabac_ctxt->au1_cabac_ctxt_table 928 + SIGNIFICANT_COEFF_FLAG_FRAME 929 + SIG_COEFF_CTXT_CAT_0_OFFSET, 930 ps_cabac_ctxt); 931 932 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] |= 0x1; 933 p_CurCtxt->u1_yuv_dc_csbp |= 0x1; 934 } 935 else 936 { 937 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 938 p_CurCtxt->u1_yuv_dc_csbp &= 0x6; 939 } 940 941 ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data; 942 } 943 944 945 946 947 /** 948 ******************************************************************************* 949 * @brief 950 * Write chroma residues to the bitstream 951 * 952 * @param[in] ps_ent_ctxt 953 * Pointer to entropy context structure 954 * 955 * @param[in] u1_chroma_cbp 956 * coded block pattern, chroma 957 * 958 * @returns 959 * 960 * @remarks 961 * None 962 * 963 ******************************************************************************* 964 */ 965 static void ih264e_cabac_write_chroma_residue(entropy_ctxt_t *ps_ent_ctxt, 966 UWORD8 u1_chroma_cbp) 967 { 968 /* CABAC context */ 969 cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 970 tu_sblk_coeff_data_t *ps_mb_coeff_data; 971 /* packed residue */ 972 void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data; 973 UWORD16 u2_sig_coeff_map; 974 UWORD8 u1_nnz; 975 mb_info_ctxt_t *ps_top_ctxt_mb_info, *ps_curr_ctxt; 976 977 ps_top_ctxt_mb_info = ps_cabac_ctxt->ps_top_ctxt_mb_info; 978 ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 979 980 /********************/ 981 /* Write Chroma DC */ 982 /********************/ 983 { 984 WORD16 *pi2_res_block; 985 UWORD8 u1_left_dc_csbp, u1_top_dc_csbp, u1_uv, u1_cbf; 986 987 u1_left_dc_csbp = (ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0]) >> 1; 988 u1_top_dc_csbp = (ps_top_ctxt_mb_info->u1_yuv_dc_csbp) >> 1; 989 990 for (u1_uv = 0; u1_uv < 2; u1_uv++) 991 { 992 PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, 993 u1_nnz, u2_sig_coeff_map, pi2_res_block); 994 u1_cbf = !!(u1_nnz); 995 { 996 UWORD8 u1_a, u1_b; 997 UWORD32 u4_ctx_inc; 998 u1_a = (u1_left_dc_csbp >> u1_uv) & 0x01; 999 u1_b = (u1_top_dc_csbp >> u1_uv) & 0x01; 1000 u4_ctx_inc = (u1_a + (u1_b << 1)); 1001 1002 ih264e_cabac_encode_bin(ps_cabac_ctxt, 1003 u1_cbf, 1004 ps_cabac_ctxt->au1_cabac_ctxt_table + CBF 1005 + (CHROMA_DC_CTXCAT << 2) 1006 + u4_ctx_inc); 1007 } 1008 1009 if (u1_cbf) 1010 { 1011 ih264e_cabac_write_coeff4x4(pi2_res_block, 1012 u1_nnz, 1013 3, 1014 u2_sig_coeff_map, 1015 COEFF_ABS_LEVEL_MINUS1 1016 + COEFF_ABS_LEVEL_CAT_3_OFFSET, 1017 ps_cabac_ctxt->au1_cabac_ctxt_table 1018 + SIGNIFICANT_COEFF_FLAG_FRAME 1019 + SIG_COEFF_CTXT_CAT_3_OFFSET, 1020 ps_cabac_ctxt); 1021 1022 SETBIT(u1_top_dc_csbp, u1_uv); 1023 SETBIT(u1_left_dc_csbp, u1_uv); 1024 } 1025 else 1026 { 1027 CLEARBIT(u1_top_dc_csbp, u1_uv); 1028 CLEARBIT(u1_left_dc_csbp, u1_uv); 1029 } 1030 } 1031 /*************************************************************/ 1032 /* Update the DC csbp */ 1033 /*************************************************************/ 1034 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x1; 1035 ps_curr_ctxt->u1_yuv_dc_csbp &= 0x1; 1036 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] |= (u1_left_dc_csbp << 1); 1037 ps_curr_ctxt->u1_yuv_dc_csbp |= (u1_top_dc_csbp << 1); 1038 } 1039 /*******************/ 1040 /* Write Chroma AC */ 1041 /*******************/ 1042 { 1043 if (u1_chroma_cbp == 2) 1044 { 1045 UWORD8 u1_uv_blkno, u1_left_ac_csbp, u1_top_ac_csbp; 1046 WORD16 *pi2_res_block; 1047 u1_left_ac_csbp = ps_cabac_ctxt->pu1_left_uv_ac_csbp[0]; 1048 u1_top_ac_csbp = ps_top_ctxt_mb_info->u1_yuv_ac_csbp >> 4; 1049 1050 for (u1_uv_blkno = 0; u1_uv_blkno < 8; u1_uv_blkno++) 1051 { 1052 UWORD8 u1_cbf; 1053 UWORD8 u1_b2b0, u1_b2b1; 1054 PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, 1055 u1_nnz, u2_sig_coeff_map, 1056 pi2_res_block); 1057 1058 u1_cbf = !!(u1_nnz); 1059 u1_b2b0 = ((u1_uv_blkno & 0x4) >> 1) | (u1_uv_blkno & 0x1); 1060 u1_b2b1 = ((u1_uv_blkno & 0x4) >> 1) 1061 | ((u1_uv_blkno & 0x2) >> 1); 1062 1063 { 1064 UWORD8 u1_a, u1_b; 1065 UWORD32 u4_ctx_inc; 1066 /* write coded_block_flag */ 1067 u1_a = (u1_left_ac_csbp >> u1_b2b1) & 0x1; 1068 u1_b = (u1_top_ac_csbp >> u1_b2b0) & 0x1; 1069 u4_ctx_inc = u1_a + (u1_b << 1); 1070 1071 ih264e_cabac_encode_bin(ps_cabac_ctxt, 1072 u1_cbf, 1073 ps_cabac_ctxt->au1_cabac_ctxt_table + CBF 1074 + (CHROMA_AC_CTXCAT << 2) 1075 + u4_ctx_inc); 1076 1077 } 1078 if (u1_cbf) 1079 { 1080 ih264e_cabac_write_coeff4x4(pi2_res_block, 1081 u1_nnz, 1082 14, 1083 u2_sig_coeff_map, 1084 COEFF_ABS_LEVEL_MINUS1 1085 + COEFF_ABS_LEVEL_CAT_4_OFFSET, 1086 ps_cabac_ctxt->au1_cabac_ctxt_table 1087 + +SIGNIFICANT_COEFF_FLAG_FRAME 1088 + SIG_COEFF_CTXT_CAT_4_OFFSET, 1089 ps_cabac_ctxt); 1090 1091 SETBIT(u1_left_ac_csbp, u1_b2b1); 1092 SETBIT(u1_top_ac_csbp, u1_b2b0); 1093 } 1094 else 1095 { 1096 CLEARBIT(u1_left_ac_csbp, u1_b2b1); 1097 CLEARBIT(u1_top_ac_csbp, u1_b2b0); 1098 1099 } 1100 } 1101 /*************************************************************/ 1102 /* Update the AC csbp */ 1103 /*************************************************************/ 1104 ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = u1_left_ac_csbp; 1105 ps_curr_ctxt->u1_yuv_ac_csbp &= 0x0f; 1106 ps_curr_ctxt->u1_yuv_ac_csbp |= (u1_top_ac_csbp << 4); 1107 } 1108 else 1109 { 1110 ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = 0; 1111 ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf; 1112 } 1113 } 1114 ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data; 1115 } 1116 1117 1118 1119 1120 /** 1121 ******************************************************************************* 1122 * @brief 1123 * Encodes Residues for the MB as defined in 7.3.5.3 1124 * 1125 * @param[in] ps_ent_ctxt 1126 * Pointer to entropy context structure 1127 * 1128 * @param[in] u1_cbp 1129 * coded block pattern 1130 * 1131 * @param[in] u1_ctx_cat 1132 * Context category, LUMA_AC_CTXCAT or LUMA_4x4_CTXCAT 1133 * 1134 * @returns 1135 * 1136 * @remarks 1137 * None 1138 * 1139 ******************************************************************************* 1140 */ 1141 static void ih264e_cabac_encode_residue(entropy_ctxt_t *ps_ent_ctxt, 1142 UWORD32 u4_cbp, UWORD8 u1_ctx_cat) 1143 { 1144 /* CABAC context */ 1145 cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 1146 1147 tu_sblk_coeff_data_t *ps_mb_coeff_data; 1148 /* packed residue */ 1149 void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data; 1150 UWORD16 u2_sig_coeff_map; 1151 UWORD8 u1_nnz; 1152 mb_info_ctxt_t *ps_curr_ctxt; 1153 mb_info_ctxt_t *ps_top_ctxt; 1154 UWORD8 u1_left_ac_csbp; 1155 UWORD8 u1_top_ac_csbp; 1156 UWORD32 u4_ctx_idx_offset_sig_coef, u4_ctx_idx_offset_abs_lvl; 1157 ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 1158 ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 1159 u1_left_ac_csbp = ps_cabac_ctxt->pu1_left_y_ac_csbp[0]; 1160 u1_top_ac_csbp = ps_top_ctxt->u1_yuv_ac_csbp; 1161 1162 if (u4_cbp & 0xf) 1163 { 1164 /* Write luma residue */ 1165 UWORD8 u1_offset; 1166 WORD16 *pi2_res_block; 1167 UWORD8 u1_subblk_num; 1168 if (u1_ctx_cat == LUMA_AC_CTXCAT) 1169 { 1170 u1_offset = 1; 1171 u4_ctx_idx_offset_sig_coef = SIG_COEFF_CTXT_CAT_1_OFFSET; 1172 u4_ctx_idx_offset_abs_lvl = COEFF_ABS_LEVEL_MINUS1 1173 + COEFF_ABS_LEVEL_CAT_1_OFFSET; 1174 } 1175 else 1176 { 1177 u1_offset = 0; 1178 u4_ctx_idx_offset_sig_coef = SIG_COEFF_CTXT_CAT_2_OFFSET; 1179 u4_ctx_idx_offset_abs_lvl = COEFF_ABS_LEVEL_MINUS1 1180 + COEFF_ABS_LEVEL_CAT_2_OFFSET; 1181 } 1182 1183 for (u1_subblk_num = 0; u1_subblk_num < 16; u1_subblk_num++) 1184 { 1185 UWORD8 u1_b0, u1_b1, u1_b2, u1_b3, u1_b2b0, u1_b3b1, u1_b3b2; 1186 u1_b0 = (u1_subblk_num & 0x1); 1187 u1_b1 = (u1_subblk_num & 0x2) >> 1; 1188 u1_b2 = (u1_subblk_num & 0x4) >> 2; 1189 u1_b3 = (u1_subblk_num & 0x8) >> 3; 1190 u1_b2b0 = (u1_b2 << 1) | (u1_b0); 1191 u1_b3b1 = (u1_b3 << 1) | (u1_b1); 1192 u1_b3b2 = (u1_b3 << 1) | (u1_b2); 1193 1194 if (!((u4_cbp >> u1_b3b2) & 0x1)) 1195 { 1196 /* ---------------------------------------------------------- */ 1197 /* The current block is not coded so skip all the sub block */ 1198 /* and set the pointer of scan level, csbp accrodingly */ 1199 /* ---------------------------------------------------------- */ 1200 CLEARBIT(u1_top_ac_csbp, u1_b2b0); 1201 CLEARBIT(u1_top_ac_csbp, (u1_b2b0 + 1)); 1202 CLEARBIT(u1_left_ac_csbp, u1_b3b1); 1203 CLEARBIT(u1_left_ac_csbp, (u1_b3b1 + 1)); 1204 1205 u1_subblk_num += 3; 1206 } 1207 else 1208 { 1209 UWORD8 u1_csbf; 1210 1211 PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, 1212 u1_nnz, u2_sig_coeff_map, 1213 pi2_res_block); 1214 1215 u1_csbf = !!(u1_nnz); 1216 { 1217 UWORD8 u1_a, u1_b; 1218 UWORD32 u4_ctx_inc; 1219 u1_b = (u1_top_ac_csbp >> u1_b2b0) & 0x01; 1220 u1_a = (u1_left_ac_csbp >> u1_b3b1) & 0x01; 1221 u4_ctx_inc = u1_a + (u1_b << 1); 1222 1223 /* Encode the bin */ 1224 ih264e_cabac_encode_bin(ps_cabac_ctxt, 1225 u1_csbf, 1226 ps_cabac_ctxt->au1_cabac_ctxt_table + CBF 1227 + (u1_ctx_cat << 2) + u4_ctx_inc); 1228 1229 } 1230 /**************************/ 1231 /* Write coded_block_flag */ 1232 /**************************/ 1233 if (u1_csbf) 1234 { 1235 ih264e_cabac_write_coeff4x4(pi2_res_block, 1236 u1_nnz, 1237 (UWORD8) (15 - u1_offset), 1238 u2_sig_coeff_map, 1239 u4_ctx_idx_offset_abs_lvl, 1240 ps_cabac_ctxt->au1_cabac_ctxt_table 1241 + SIGNIFICANT_COEFF_FLAG_FRAME 1242 + u4_ctx_idx_offset_sig_coef, 1243 ps_cabac_ctxt); 1244 1245 SETBIT(u1_top_ac_csbp, u1_b2b0); 1246 SETBIT(u1_left_ac_csbp, u1_b3b1); 1247 } 1248 else 1249 { 1250 CLEARBIT(u1_top_ac_csbp, u1_b2b0); 1251 CLEARBIT(u1_left_ac_csbp, u1_b3b1); 1252 } 1253 } 1254 } 1255 /**************************************************************************/ 1256 /* Update the AC csbp */ 1257 /**************************************************************************/ 1258 ps_cabac_ctxt->pu1_left_y_ac_csbp[0] = u1_left_ac_csbp & 0xf; 1259 u1_top_ac_csbp &= 0x0f; 1260 ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf0; 1261 ps_curr_ctxt->u1_yuv_ac_csbp |= u1_top_ac_csbp; 1262 } 1263 else 1264 { 1265 ps_cabac_ctxt->pu1_left_y_ac_csbp[0] = 0; 1266 ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf0; 1267 } 1268 1269 /* Write chroma residue */ 1270 1271 ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data; 1272 { 1273 UWORD8 u1_cbp_chroma; 1274 u1_cbp_chroma = u4_cbp >> 4; 1275 if (u1_cbp_chroma) 1276 { 1277 ih264e_cabac_write_chroma_residue(ps_ent_ctxt, u1_cbp_chroma); 1278 } 1279 else 1280 { 1281 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x1; 1282 ps_curr_ctxt->u1_yuv_dc_csbp &= 0x1; 1283 ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = 0; 1284 ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf; 1285 } 1286 } 1287 } 1288 1289 /** 1290 ******************************************************************************* 1291 * @brief 1292 * Encodes a Motion vector (9.3.3.1.1.7 ) 1293 * 1294 * @param[in] u1_mvd 1295 * Motion vector to be encoded 1296 * 1297 * @param[in] u4_ctx_idx_offset 1298 * * ctxIdxOffset for MV_X or MV_Ycontext 1299 * 1300 * @param[in] ui2_abs_mvd 1301 * sum of absolute value of corresponding neighboring motion vectors 1302 * 1303 * @param[in] ps_cabac_ctxt 1304 * Pointer to cabac context structure 1305 * 1306 * @returns 1307 * 1308 * @remarks 1309 * None 1310 * 1311 ******************************************************************************* 1312 */ 1313 static void ih264e_cabac_enc_ctx_mvd(WORD16 u1_mvd, UWORD32 u4_ctx_idx_offset, 1314 UWORD16 ui2_abs_mvd, 1315 cabac_ctxt_t *ps_cabac_ctxt) 1316 { 1317 1318 UWORD8 u1_bin, u1_ctxt_inc; 1319 WORD8 k = 3, u1_coff = 9; 1320 WORD16 i2_abs_mvd, i2_sufs; 1321 UWORD32 u4_ctx_inc; 1322 UWORD32 u4_bins; 1323 WORD8 i1_bins_len; 1324 1325 /* if mvd < u1_coff 1326 only Prefix 1327 else 1328 Prefix + Suffix 1329 1330 encode sign bit 1331 1332 Prefix TU encoding Cmax =u1_coff and Suffix 3rd order Exp-Golomb 1333 */ 1334 1335 if (ui2_abs_mvd < 3) 1336 u4_ctx_inc = 0; 1337 else if (ui2_abs_mvd > 32) 1338 u4_ctx_inc = 2; 1339 else 1340 u4_ctx_inc = 1; 1341 1342 u4_bins = 0; 1343 i1_bins_len = 1; 1344 1345 if (u1_mvd == 0) 1346 { 1347 ih264e_cabac_encode_bin(ps_cabac_ctxt, 1348 0, 1349 ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_idx_offset 1350 + u4_ctx_inc); 1351 } 1352 else 1353 { 1354 i2_abs_mvd = ABS(u1_mvd); 1355 if (i2_abs_mvd >= u1_coff) 1356 { 1357 /* Prefix TU i.e string of 9 1's */ 1358 u4_bins = 0x1ff; 1359 i1_bins_len = 9; 1360 u4_ctx_inc = (u4_ctx_inc | 0x065430); 1361 1362 ih264e_encode_decision_bins(u4_bins, 1363 i1_bins_len, 1364 u4_ctx_inc, 1365 4, 1366 ps_cabac_ctxt->au1_cabac_ctxt_table 1367 + u4_ctx_idx_offset, 1368 ps_cabac_ctxt); 1369 1370 /* Suffix, uses EncodeBypass */ 1371 u4_bins = 0; 1372 i1_bins_len = 0; 1373 i2_sufs = i2_abs_mvd - u1_coff; 1374 while (1) 1375 { 1376 if (i2_sufs >= (1 << k)) 1377 { 1378 u4_bins = (u4_bins | (1 << (31 - i1_bins_len))); 1379 i1_bins_len++; 1380 i2_sufs = i2_sufs - (1 << k); 1381 k++; 1382 } 1383 else 1384 { 1385 i1_bins_len++; 1386 while (k--) 1387 { 1388 u1_bin = ((i2_sufs >> k) & 0x01); 1389 u4_bins = (u4_bins | (u1_bin << (31 - i1_bins_len))); 1390 i1_bins_len++; 1391 } 1392 break; 1393 } 1394 } 1395 u4_bins >>= (32 - i1_bins_len); 1396 ih264e_cabac_encode_bypass_bins(ps_cabac_ctxt, u4_bins, 1397 i1_bins_len); 1398 } 1399 else 1400 { 1401 /* Prefix only */ 1402 /* b0 */ 1403 u4_bins = 1; 1404 i2_abs_mvd--; 1405 u1_ctxt_inc = 3; 1406 while (i2_abs_mvd) 1407 { 1408 i2_abs_mvd--; 1409 u4_bins = (u4_bins | (1 << i1_bins_len)); 1410 if (u1_ctxt_inc <= 6) 1411 { 1412 u4_ctx_inc = (u4_ctx_inc 1413 | (u1_ctxt_inc << (i1_bins_len << 2))); 1414 u1_ctxt_inc++; 1415 } 1416 i1_bins_len++; 1417 } 1418 /* Encode Terminating bit */ 1419 if (i1_bins_len <= 4) 1420 u4_ctx_inc = (u4_ctx_inc | (u1_ctxt_inc << (i1_bins_len << 2))); 1421 i1_bins_len++; 1422 ih264e_encode_decision_bins(u4_bins, 1423 i1_bins_len, 1424 u4_ctx_inc, 1425 4, 1426 ps_cabac_ctxt->au1_cabac_ctxt_table 1427 + u4_ctx_idx_offset, 1428 ps_cabac_ctxt); 1429 } 1430 /* sign bit, uses EncodeBypass */ 1431 if (u1_mvd > 0) 1432 ih264e_cabac_encode_bypass_bin(ps_cabac_ctxt, 0); 1433 else 1434 ih264e_cabac_encode_bypass_bin(ps_cabac_ctxt, 1); 1435 } 1436 } 1437 1438 /** 1439 ******************************************************************************* 1440 * @brief 1441 * Encodes all motion vectors for a P16x16 MB 1442 * 1443 * @param[in] ps_cabac_ctxt 1444 * Pointer to cabac context structure 1445 * 1446 * @param[in] pi2_mv_ptr 1447 * Pointer to array of motion vectors 1448 * 1449 * @returns 1450 * 1451 * @remarks 1452 * None 1453 * 1454 ******************************************************************************* 1455 */ 1456 static void ih264e_cabac_enc_mvds_p16x16(cabac_ctxt_t *ps_cabac_ctxt, 1457 WORD16 *pi2_mv_ptr) 1458 { 1459 1460 1461 /* Encode the differential component of the motion vectors */ 1462 1463 { 1464 UWORD8 u1_abs_mvd_x, u1_abs_mvd_y; 1465 UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt; 1466 WORD16 u2_mv; 1467 u1_abs_mvd_x = 0; 1468 u1_abs_mvd_y = 0; 1469 pu1_top_mv_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_mv[0]; 1470 pu1_lft_mv_ctxt = ps_cabac_ctxt->pu1_left_mv_ctxt_inc[0]; 1471 { 1472 UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, 1473 u2_abs_mvd_y_b; 1474 u2_abs_mvd_x_b = (UWORD16) pu1_top_mv_ctxt[0]; 1475 u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[1]; 1476 u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[0]; 1477 u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[1]; 1478 u2_mv = *(pi2_mv_ptr++); 1479 1480 ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X, 1481 (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b), 1482 ps_cabac_ctxt); 1483 1484 u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv)); 1485 u2_mv = *(pi2_mv_ptr++); 1486 1487 ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y, 1488 (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b), 1489 ps_cabac_ctxt); 1490 1491 u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv)); 1492 } 1493 /***************************************************************/ 1494 /* Store abs_mvd_values cabac contexts */ 1495 /***************************************************************/ 1496 pu1_top_mv_ctxt[0] = pu1_lft_mv_ctxt[0] = u1_abs_mvd_x; 1497 pu1_top_mv_ctxt[1] = pu1_lft_mv_ctxt[1] = u1_abs_mvd_y; 1498 } 1499 } 1500 1501 1502 /** 1503 ******************************************************************************* 1504 * @brief 1505 * Encodes all motion vectors for a B MB (Assues that mbype is B_L0_16x16, B_L1_16x16 or B_Bi_16x16 1506 * 1507 * @param[in] ps_cabac_ctxt 1508 * Pointer to cabac context structure 1509 * 1510 * @param[in] pi2_mv_ptr 1511 * Pointer to array of motion vectors 1512 * 1513 * @returns 1514 * 1515 * @remarks 1516 * None 1517 * 1518 ******************************************************************************* 1519 */ 1520 static void ih264e_cabac_enc_mvds_b16x16(cabac_ctxt_t *ps_cabac_ctxt, 1521 WORD16 *pi2_mv_ptr, 1522 WORD32 i4_mb_part_pred_mode ) 1523 { 1524 1525 /* Encode the differential component of the motion vectors */ 1526 1527 { 1528 UWORD8 u1_abs_mvd_x, u1_abs_mvd_y; 1529 UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt; 1530 WORD16 u2_mv; 1531 u1_abs_mvd_x = 0; 1532 u1_abs_mvd_y = 0; 1533 pu1_top_mv_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_mv[0]; 1534 pu1_lft_mv_ctxt = ps_cabac_ctxt->pu1_left_mv_ctxt_inc[0]; 1535 if (i4_mb_part_pred_mode != PRED_L1)/* || PRED_BI */ 1536 { 1537 UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, 1538 u2_abs_mvd_y_b; 1539 u2_abs_mvd_x_b = (UWORD16) pu1_top_mv_ctxt[0]; 1540 u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[1]; 1541 u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[0]; 1542 u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[1]; 1543 u2_mv = pi2_mv_ptr[0]; 1544 1545 ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X, 1546 (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b), 1547 ps_cabac_ctxt); 1548 1549 u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv)); 1550 u2_mv = pi2_mv_ptr[1]; 1551 1552 ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y, 1553 (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b), 1554 ps_cabac_ctxt); 1555 1556 u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv)); 1557 } 1558 1559 /***************************************************************/ 1560 /* Store abs_mvd_values cabac contexts */ 1561 /***************************************************************/ 1562 pu1_top_mv_ctxt[0] = pu1_lft_mv_ctxt[0] = u1_abs_mvd_x; 1563 pu1_top_mv_ctxt[1] = pu1_lft_mv_ctxt[1] = u1_abs_mvd_y; 1564 1565 u1_abs_mvd_x = 0; 1566 u1_abs_mvd_y = 0; 1567 if (i4_mb_part_pred_mode != PRED_L0)/* || PRED_BI */ 1568 { 1569 UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, 1570 u2_abs_mvd_y_b; 1571 u2_abs_mvd_x_b = (UWORD16) pu1_top_mv_ctxt[2]; 1572 u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[3]; 1573 u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[2]; 1574 u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[3]; 1575 u2_mv = pi2_mv_ptr[2]; 1576 1577 ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X, 1578 (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b), 1579 ps_cabac_ctxt); 1580 1581 u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv)); 1582 u2_mv = pi2_mv_ptr[3]; 1583 1584 ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y, 1585 (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b), 1586 ps_cabac_ctxt); 1587 1588 u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv)); 1589 } 1590 /***************************************************************/ 1591 /* Store abs_mvd_values cabac contexts */ 1592 /***************************************************************/ 1593 pu1_top_mv_ctxt[2] = pu1_lft_mv_ctxt[2] = u1_abs_mvd_x; 1594 pu1_top_mv_ctxt[3] = pu1_lft_mv_ctxt[3] = u1_abs_mvd_y; 1595 } 1596 } 1597 1598 1599 1600 /** 1601 ******************************************************************************* 1602 * 1603 * @brief 1604 * This function generates CABAC coded bit stream for an Intra Slice. 1605 * 1606 * @description 1607 * The mb syntax layer for intra slices constitutes luma mb mode, mb qp delta, coded block pattern, chroma mb mode and 1608 * luma/chroma residue. These syntax elements are written as directed by table 1609 * 7.3.5 of h264 specification. 1610 * 1611 * @param[in] ps_ent_ctxt 1612 * pointer to entropy context 1613 * 1614 * @returns error code 1615 * 1616 * @remarks none 1617 * 1618 ******************************************************************************* 1619 */ 1620 IH264E_ERROR_T ih264e_write_islice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt) 1621 { 1622 /* bit stream ptr */ 1623 bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm; 1624 /* CABAC context */ 1625 cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 1626 /* packed header data */ 1627 UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; 1628 mb_hdr_common_t *ps_mb_hdr = (mb_hdr_common_t *)ps_ent_ctxt->pv_mb_header_data; 1629 mb_info_ctxt_t *ps_curr_ctxt; 1630 WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode; 1631 WORD8 mb_qp_delta; 1632 UWORD32 u4_cbp_l, u4_cbp_c; 1633 WORD32 bitstream_start_offset, bitstream_end_offset; 1634 1635 if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) 1636 >= ps_bitstream->u4_max_strm_size) 1637 { 1638 /* return without corrupting the buffer beyond its size */ 1639 return (IH264E_BITSTREAM_BUFFER_OVERFLOW); 1640 } 1641 /* mb header info */ 1642 mb_tpm = ps_mb_hdr->u1_mb_type_mode; 1643 cbp = ps_mb_hdr->u1_cbp; 1644 mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta; 1645 1646 /* mb type */ 1647 mb_type = mb_tpm & 0xF; 1648 1649 ih264e_get_cabac_context(ps_ent_ctxt, mb_type); 1650 ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 1651 1652 /* Starting bitstream offset for header in bits */ 1653 bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 1654 u4_cbp_c = (cbp >> 4); 1655 u4_cbp_l = (cbp & 0xF); 1656 if (mb_type == I16x16) 1657 { 1658 luma_intra_mode = ((mb_tpm >> 4) & 3) + 1 + (u4_cbp_c << 2) 1659 + (u4_cbp_l == 15) * 12; 1660 } 1661 else 1662 { 1663 luma_intra_mode = 0; 1664 } 1665 1666 chroma_intra_mode = (mb_tpm >> 6); 1667 1668 /* Encode Intra pred mode, Luma */ 1669 ih264e_cabac_enc_intra_mb_type(ISLICE, luma_intra_mode, ps_cabac_ctxt, 1670 MB_TYPE_I_SLICE); 1671 1672 if (mb_type == I4x4) 1673 { 1674 /* Encode 4x4 MB modes */ 1675 mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data; 1676 ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, ps_mb_hdr_i4x4->au1_sub_blk_modes); 1677 } 1678 /* Encode chroma mode */ 1679 ih264e_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt); 1680 1681 if (mb_type != I16x16) 1682 { /* Encode MB cbp */ 1683 ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 1684 } 1685 1686 if ((cbp > 0) || (mb_type == I16x16)) 1687 { 1688 /* Encode mb_qp_delta */ 1689 ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 1690 /* Ending bitstream offset for header in bits */ 1691 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 1692 ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 1693 - bitstream_start_offset; 1694 /* Starting bitstream offset for residue */ 1695 bitstream_start_offset = bitstream_end_offset; 1696 if (mb_type == I16x16) 1697 { 1698 ps_curr_ctxt->u1_mb_type = CAB_I16x16; 1699 ps_curr_ctxt->u1_cbp = cbp; 1700 ih264e_cabac_encode_residue_luma_dc(ps_ent_ctxt); 1701 ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_AC_CTXCAT); 1702 } 1703 else 1704 { 1705 ps_curr_ctxt->u1_cbp = cbp; 1706 ps_curr_ctxt->u1_mb_type = I4x4; 1707 ps_curr_ctxt->u1_mb_type = CAB_I4x4; 1708 ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 1709 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 1710 ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6; 1711 } 1712 /* Ending bitstream offset for reside in bits */ 1713 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 1714 ps_ent_ctxt->u4_residue_bits[0] += bitstream_end_offset 1715 - bitstream_start_offset; 1716 } 1717 else 1718 { 1719 ps_curr_ctxt->u1_yuv_ac_csbp = 0; 1720 ps_curr_ctxt->u1_yuv_dc_csbp = 0; 1721 *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 1722 *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 1723 *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 1724 /* Ending bitstream offset for header in bits */ 1725 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 1726 ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 1727 - bitstream_start_offset; 1728 1729 /* Computing the number of used used for encoding the MB syntax */ 1730 } 1731 memset(ps_curr_ctxt->u1_mv, 0, 16); 1732 memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 1733 ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_cbp = cbp; 1734 1735 if (mb_type == I16x16) 1736 { 1737 ps_curr_ctxt->u1_mb_type = CAB_I16x16; 1738 pu1_byte += sizeof(mb_hdr_i16x16_t); 1739 } 1740 else 1741 { 1742 ps_curr_ctxt->u1_mb_type = CAB_I4x4; 1743 pu1_byte += sizeof(mb_hdr_i4x4_t); 1744 } 1745 ps_ent_ctxt->pv_mb_header_data = pu1_byte; 1746 return IH264E_SUCCESS; 1747 } 1748 1749 /** 1750 ******************************************************************************* 1751 * 1752 * @brief 1753 * This function generates CABAC coded bit stream for Inter slices 1754 * 1755 * @description 1756 * The mb syntax layer for inter slices constitutes luma mb mode, mb qp delta, coded block pattern, chroma mb mode and 1757 * luma/chroma residue. These syntax elements are written as directed by table 1758 * 7.3.5 of h264 specification 1759 * 1760 * @param[in] ps_ent_ctxt 1761 * pointer to entropy context 1762 * 1763 * @returns error code 1764 * 1765 * @remarks none 1766 * 1767 ******************************************************************************* 1768 */ 1769 IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt) 1770 { 1771 /* bit stream ptr */ 1772 bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm; 1773 /* CABAC context */ 1774 cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 1775 1776 mb_info_ctxt_t *ps_curr_ctxt; 1777 1778 WORD32 bitstream_start_offset, bitstream_end_offset; 1779 WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode; 1780 WORD8 mb_qp_delta; 1781 UWORD32 u4_cbp_l, u4_cbp_c; 1782 UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; 1783 mb_hdr_common_t *ps_mb_hdr = (mb_hdr_common_t *)ps_ent_ctxt->pv_mb_header_data; 1784 1785 if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) 1786 >= ps_bitstream->u4_max_strm_size) 1787 { 1788 /* return without corrupting the buffer beyond its size */ 1789 return (IH264E_BITSTREAM_BUFFER_OVERFLOW); 1790 } 1791 /* mb header info */ 1792 mb_tpm = ps_mb_hdr->u1_mb_type_mode; 1793 1794 /* mb type */ 1795 mb_type = mb_tpm & 0xF; 1796 /* CABAC contexts for the MB */ 1797 ih264e_get_cabac_context(ps_ent_ctxt, mb_type); 1798 ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 1799 1800 /* if Intra MB */ 1801 if (mb_type == I16x16 || mb_type == I4x4) 1802 { 1803 cbp = ps_mb_hdr->u1_cbp; 1804 mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta; 1805 1806 /* Starting bitstream offset for header in bits */ 1807 bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 1808 1809 /* Encode mb_skip_flag */ 1810 ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE); 1811 u4_cbp_c = (cbp >> 4); 1812 u4_cbp_l = (cbp & 0xF); 1813 if (mb_type == I16x16) 1814 { 1815 luma_intra_mode = ((mb_tpm >> 4) & 3) + 1 + (u4_cbp_c << 2) 1816 + (u4_cbp_l == 15) * 12; 1817 } 1818 else 1819 { 1820 luma_intra_mode = 0; 1821 } 1822 /* Encode intra mb type */ 1823 { 1824 ih264e_cabac_encode_bin(ps_cabac_ctxt, 1825 1, 1826 ps_cabac_ctxt->au1_cabac_ctxt_table 1827 + MB_TYPE_P_SLICE); 1828 1829 ih264e_cabac_enc_intra_mb_type(PSLICE, (UWORD8) luma_intra_mode, 1830 ps_cabac_ctxt, MB_TYPE_P_SLICE); 1831 } 1832 1833 if (mb_type == I4x4) 1834 { 1835 /* Intra 4x4 modes */ 1836 mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data; 1837 ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, ps_mb_hdr_i4x4->au1_sub_blk_modes); 1838 } 1839 chroma_intra_mode = (mb_tpm >> 6); 1840 1841 ih264e_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt); 1842 1843 if (mb_type != I16x16) 1844 { 1845 /* encode CBP */ 1846 ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 1847 } 1848 1849 if ((cbp > 0) || (mb_type == I16x16)) 1850 { 1851 ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 1852 1853 /* Ending bitstream offset for header in bits */ 1854 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 1855 ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 1856 - bitstream_start_offset; 1857 /* Starting bitstream offset for residue */ 1858 bitstream_start_offset = bitstream_end_offset; 1859 1860 /* Encoding Residue */ 1861 if (mb_type == I16x16) 1862 { 1863 ps_curr_ctxt->u1_mb_type = CAB_I16x16; 1864 ps_curr_ctxt->u1_cbp = (UWORD8) cbp; 1865 ih264e_cabac_encode_residue_luma_dc(ps_ent_ctxt); 1866 ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_AC_CTXCAT); 1867 } 1868 else 1869 { 1870 ps_curr_ctxt->u1_cbp = (UWORD8) cbp; 1871 ps_curr_ctxt->u1_mb_type = I4x4; 1872 ps_curr_ctxt->u1_mb_type = CAB_I4x4; 1873 ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 1874 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 1875 ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6; 1876 } 1877 1878 /* Ending bitstream offset for reside in bits */ 1879 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 1880 ps_ent_ctxt->u4_residue_bits[0] += bitstream_end_offset 1881 - bitstream_start_offset; 1882 } 1883 else 1884 { 1885 ps_curr_ctxt->u1_yuv_ac_csbp = 0; 1886 ps_curr_ctxt->u1_yuv_dc_csbp = 0; 1887 *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 1888 *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 1889 *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 1890 /* Ending bitstream offset for header in bits */ 1891 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 1892 ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 1893 - bitstream_start_offset; 1894 } 1895 1896 memset(ps_curr_ctxt->u1_mv, 0, 16); 1897 memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 1898 ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_cbp = (UWORD8) cbp; 1899 1900 if (mb_type == I16x16) 1901 { 1902 ps_curr_ctxt->u1_mb_type = CAB_I16x16; 1903 pu1_byte += sizeof(mb_hdr_i16x16_t); 1904 } 1905 else 1906 { 1907 ps_curr_ctxt->u1_mb_type = CAB_I4x4; 1908 pu1_byte += sizeof(mb_hdr_i4x4_t); 1909 } 1910 1911 ps_ent_ctxt->pv_mb_header_data = pu1_byte; 1912 1913 return IH264E_SUCCESS; 1914 } 1915 else /* Inter MB */ 1916 { 1917 /* Starting bitstream offset for header in bits */ 1918 bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 1919 /* Encoding P16x16 */ 1920 if (mb_type != PSKIP) 1921 { 1922 mb_hdr_p16x16_t *ps_mb_hdr_p16x16 = (mb_hdr_p16x16_t *)ps_ent_ctxt->pv_mb_header_data; 1923 cbp = ps_mb_hdr->u1_cbp; 1924 mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta; 1925 1926 /* Encoding mb_skip */ 1927 ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE); 1928 1929 /* Encoding mb_type as P16x16 */ 1930 { 1931 UWORD32 u4_ctx_inc_p; 1932 u4_ctx_inc_p = (0x010 + ((2) << 8)); 1933 1934 ih264e_encode_decision_bins(0, 3, u4_ctx_inc_p, 3, 1935 &(ps_cabac_ctxt->au1_cabac_ctxt_table[MB_TYPE_P_SLICE]), 1936 ps_cabac_ctxt); 1937 } 1938 ps_curr_ctxt->u1_mb_type = CAB_P; 1939 { 1940 WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_p16x16->ai2_mv; 1941 1942 ps_curr_ctxt->u1_mb_type = (ps_curr_ctxt->u1_mb_type 1943 | CAB_NON_BD16x16); 1944 /* Encoding motion vector for P16x16 */ 1945 ih264e_cabac_enc_mvds_p16x16(ps_cabac_ctxt, pi2_mv_ptr); 1946 } 1947 /* Encode CBP */ 1948 ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 1949 1950 if (cbp) 1951 { 1952 /* encode mb_qp_delta */ 1953 ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 1954 } 1955 1956 /* Ending bitstream offset for header in bits */ 1957 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 1958 ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 1959 - bitstream_start_offset; 1960 /* Starting bitstream offset for residue */ 1961 bitstream_start_offset = bitstream_end_offset; 1962 1963 pu1_byte += sizeof(mb_hdr_p16x16_t); 1964 1965 } 1966 else/* MB = PSKIP */ 1967 { 1968 ih264e_cabac_enc_mb_skip(1, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE); 1969 1970 ps_curr_ctxt->u1_mb_type = CAB_P_SKIP; 1971 (*ps_ent_ctxt->pi4_mb_skip_run)++; 1972 1973 memset(ps_curr_ctxt->u1_mv, 0, 16); 1974 memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 1975 cbp = 0; 1976 1977 /* Ending bitstream offset for header in bits */ 1978 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 1979 ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 1980 - bitstream_start_offset; 1981 /* Starting bitstream offset for residue */ 1982 1983 pu1_byte += sizeof(mb_hdr_pskip_t); 1984 } 1985 1986 if (cbp > 0) 1987 { 1988 /* Encode residue */ 1989 ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 1990 /* Ending bitstream offset for reside in bits */ 1991 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 1992 ps_ent_ctxt->u4_residue_bits[1] += bitstream_end_offset 1993 - bitstream_start_offset; 1994 1995 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 1996 ps_curr_ctxt->u1_yuv_dc_csbp &= 0x6; 1997 } 1998 else 1999 { 2000 ps_curr_ctxt->u1_yuv_ac_csbp = 0; 2001 ps_curr_ctxt->u1_yuv_dc_csbp = 0; 2002 *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 2003 *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 2004 *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 2005 } 2006 ps_curr_ctxt->u1_intrapred_chroma_mode = 0; 2007 ps_curr_ctxt->u1_cbp = cbp; 2008 ps_ent_ctxt->pv_mb_header_data = pu1_byte; 2009 2010 return IH264E_SUCCESS; 2011 } 2012 } 2013 2014 2015 /* ! < Table 9-37 Binarization for macroblock types in B slices in ITU_T_H264-201402 2016 * Bits 0-7 : binarised value 2017 * Bits 8-15: length of binary sequence */ 2018 2019 2020 static const UWORD32 u4_b_mb_type[27] = { 0x0100, 0x0301, 0x0305, 0x0603, 2021 0x0623, 0x0613, 0x0633, 0x060b, 2022 0x062b, 0x061b, 0x063b, 0x061f, 2023 0x0707, 0x0747, 0x0727, 0x0767, 2024 0x0717, 0x0757, 0x0737, 0x0777, 2025 0x070f, 0x074f, 0x063f }; 2026 /* CtxInc for mb types in B slices */ 2027 static const UWORD32 ui_b_mb_type_ctx_inc[27] = { 0x00, 0x0530, 0x0530, 2028 0x0555430, 0x0555430, 2029 0x0555430, 0x0555430, 2030 0x0555430, 0x0555430, 2031 0x0555430, 0x0555430, 2032 0x0555430, 0x05555430, 2033 0x05555430, 0x05555430, 2034 0x05555430, 0x05555430, 2035 0x05555430, 0x05555430, 2036 0x05555430, 0x05555430, 2037 0x05555430, 0x0555430 }; 2038 2039 /** 2040 ******************************************************************************* 2041 * 2042 * @brief 2043 * This function generates CABAC coded bit stream for B slices 2044 * 2045 * @description 2046 * The mb syntax layer for inter slices constitutes luma mb mode, 2047 * mb qp delta, coded block pattern, chroma mb mode and 2048 * luma/chroma residue. These syntax elements are written as directed by table 2049 * 7.3.5 of h264 specification 2050 * 2051 * @param[in] ps_ent_ctxt 2052 * pointer to entropy context 2053 * 2054 * @returns error code 2055 * 2056 * @remarks none 2057 * 2058 ******************************************************************************* 2059 */ 2060 IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt) 2061 { 2062 /* bit stream ptr */ 2063 bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm; 2064 /* CABAC context */ 2065 cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 2066 2067 mb_info_ctxt_t *ps_curr_ctxt; 2068 2069 WORD32 bitstream_start_offset, bitstream_end_offset; 2070 WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode; 2071 WORD8 mb_qp_delta; 2072 UWORD32 u4_cbp_l, u4_cbp_c; 2073 UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; 2074 mb_hdr_common_t *ps_mb_hdr = (mb_hdr_common_t *)ps_ent_ctxt->pv_mb_header_data; 2075 2076 if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) 2077 >= ps_bitstream->u4_max_strm_size) 2078 { 2079 /* return without corrupting the buffer beyond its size */ 2080 return (IH264E_BITSTREAM_BUFFER_OVERFLOW); 2081 } 2082 /* mb header info */ 2083 mb_tpm = ps_mb_hdr->u1_mb_type_mode; 2084 2085 /* mb type */ 2086 mb_type = mb_tpm & 0xF; 2087 /* CABAC contexts for the MB */ 2088 ih264e_get_cabac_context(ps_ent_ctxt, mb_type); 2089 ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 2090 2091 /* if Intra MB */ 2092 if (mb_type == I16x16 || mb_type == I4x4) 2093 { 2094 cbp = ps_mb_hdr->u1_cbp; 2095 mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta; 2096 2097 /* Starting bitstream offset for header in bits */ 2098 bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 2099 2100 /* Encode mb_skip_flag */ 2101 ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); 2102 u4_cbp_c = (cbp >> 4); 2103 u4_cbp_l = (cbp & 0xF); 2104 if (mb_type == I16x16) 2105 { 2106 luma_intra_mode = ((mb_tpm >> 4) & 3) + 1 + (u4_cbp_c << 2) 2107 + (u4_cbp_l == 15) * 12; 2108 } 2109 else 2110 { 2111 luma_intra_mode = 0; 2112 } 2113 /* Encode intra mb type */ 2114 { 2115 mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info; 2116 mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 2117 UWORD32 u4_ctx_inc = 0; 2118 2119 if (ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 2120 u4_ctx_inc += ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) 2121 != CAB_BD16x16) ? 1 : 0; 2122 if (ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 2123 u4_ctx_inc += ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) 2124 != CAB_BD16x16) ? 1 : 0; 2125 2126 /* Intra Prefix Only "111101" */ 2127 u4_ctx_inc = (u4_ctx_inc | 0x05555430); 2128 ih264e_encode_decision_bins(0x2f, 2129 6, 2130 u4_ctx_inc, 2131 3, 2132 ps_cabac_ctxt->au1_cabac_ctxt_table 2133 + MB_TYPE_B_SLICE, 2134 ps_cabac_ctxt); 2135 2136 ih264e_cabac_enc_intra_mb_type(BSLICE, (UWORD8) luma_intra_mode, 2137 ps_cabac_ctxt, MB_TYPE_B_SLICE); 2138 2139 } 2140 2141 if (mb_type == I4x4) 2142 { 2143 /* Intra 4x4 modes */ 2144 mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data; 2145 ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, ps_mb_hdr_i4x4->au1_sub_blk_modes); 2146 } 2147 chroma_intra_mode = (mb_tpm >> 6); 2148 2149 ih264e_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt); 2150 2151 if (mb_type != I16x16) 2152 { 2153 /* encode CBP */ 2154 ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 2155 } 2156 2157 if ((cbp > 0) || (mb_type == I16x16)) 2158 { 2159 ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 2160 2161 /* Ending bitstream offset for header in bits */ 2162 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 2163 ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 2164 - bitstream_start_offset; 2165 /* Starting bitstream offset for residue */ 2166 bitstream_start_offset = bitstream_end_offset; 2167 2168 /* Encoding Residue */ 2169 if (mb_type == I16x16) 2170 { 2171 ps_curr_ctxt->u1_mb_type = CAB_I16x16; 2172 ps_curr_ctxt->u1_cbp = (UWORD8) cbp; 2173 ih264e_cabac_encode_residue_luma_dc(ps_ent_ctxt); 2174 ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_AC_CTXCAT); 2175 } 2176 else 2177 { 2178 ps_curr_ctxt->u1_cbp = (UWORD8) cbp; 2179 ps_curr_ctxt->u1_mb_type = I4x4; 2180 ps_curr_ctxt->u1_mb_type = CAB_I4x4; 2181 ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 2182 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 2183 ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6; 2184 } 2185 2186 /* Ending bitstream offset for reside in bits */ 2187 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 2188 ps_ent_ctxt->u4_residue_bits[0] += bitstream_end_offset 2189 - bitstream_start_offset; 2190 } 2191 else 2192 { 2193 ps_curr_ctxt->u1_yuv_ac_csbp = 0; 2194 ps_curr_ctxt->u1_yuv_dc_csbp = 0; 2195 *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 2196 *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 2197 *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 2198 /* Ending bitstream offset for header in bits */ 2199 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 2200 ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 2201 - bitstream_start_offset; 2202 } 2203 2204 memset(ps_curr_ctxt->u1_mv, 0, 16); 2205 memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 2206 ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_cbp = (UWORD8) cbp; 2207 2208 if (mb_type == I16x16) 2209 { 2210 ps_curr_ctxt->u1_mb_type = CAB_I16x16; 2211 pu1_byte += sizeof(mb_hdr_i16x16_t); 2212 } 2213 else 2214 { 2215 ps_curr_ctxt->u1_mb_type = CAB_I4x4; 2216 pu1_byte += sizeof(mb_hdr_i4x4_t); 2217 } 2218 2219 ps_ent_ctxt->pv_mb_header_data = pu1_byte; 2220 2221 return IH264E_SUCCESS; 2222 } 2223 2224 else /* Inter MB */ 2225 { 2226 /* Starting bitstream offset for header in bits */ 2227 bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 2228 /* Encoding B_Direct_16x16 */ 2229 if (mb_type == BDIRECT) 2230 { 2231 cbp = ps_mb_hdr->u1_cbp; 2232 mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta; 2233 2234 2235 /* Encoding mb_skip */ 2236 ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); 2237 2238 /* Encoding mb_type as B_Direct_16x16 */ 2239 { 2240 2241 mb_info_ctxt_t *ps_left_ctxt = 2242 ps_cabac_ctxt->ps_left_ctxt_mb_info; 2243 mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 2244 UWORD32 u4_ctx_inc = 0; 2245 2246 if (ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 2247 u4_ctx_inc += ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) 2248 != CAB_BD16x16) ? 1 : 0; 2249 if (ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 2250 u4_ctx_inc += ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) 2251 != CAB_BD16x16) ? 1 : 0; 2252 /* Encode the bin */ 2253 ih264e_cabac_encode_bin( 2254 ps_cabac_ctxt, 2255 0, 2256 ps_cabac_ctxt->au1_cabac_ctxt_table 2257 + MB_TYPE_B_SLICE + u4_ctx_inc); 2258 2259 } 2260 ps_curr_ctxt->u1_mb_type = CAB_BD16x16; 2261 memset(ps_curr_ctxt->u1_mv, 0, 16); 2262 memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 2263 2264 /* Encode CBP */ 2265 ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 2266 2267 if (cbp) 2268 { 2269 /* encode mb_qp_delta */ 2270 ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 2271 } 2272 2273 /* Ending bitstream offset for header in bits */ 2274 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 2275 ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 2276 - bitstream_start_offset; 2277 /* Starting bitstream offset for residue */ 2278 bitstream_start_offset = bitstream_end_offset; 2279 /* Starting bitstream offset for residue */ 2280 2281 pu1_byte += sizeof(mb_hdr_bdirect_t); 2282 } 2283 2284 else if (mb_type == BSKIP)/* MB = BSKIP */ 2285 { 2286 ih264e_cabac_enc_mb_skip(1, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); 2287 2288 ps_curr_ctxt->u1_mb_type = CAB_B_SKIP; 2289 2290 memset(ps_curr_ctxt->u1_mv, 0, 16); 2291 memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 2292 cbp = 0; 2293 2294 /* Ending bitstream offset for header in bits */ 2295 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 2296 ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 2297 - bitstream_start_offset; 2298 /* Starting bitstream offset for residue */ 2299 2300 pu1_byte += sizeof(mb_hdr_bskip_t); 2301 } 2302 2303 else /* mbype is B_L0_16x16, B_L1_16x16 or B_Bi_16x16 */ 2304 { 2305 mb_hdr_b16x16_t *ps_mb_hdr_b16x16 = (mb_hdr_b16x16_t *)ps_ent_ctxt->pv_mb_header_data; 2306 2307 WORD32 i4_mb_part_pred_mode = (mb_tpm >> 4); 2308 UWORD32 u4_mb_type = mb_type - B16x16 + B_L0_16x16 2309 + i4_mb_part_pred_mode; 2310 cbp = ps_mb_hdr->u1_cbp; 2311 mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta; 2312 2313 /* Encoding mb_skip */ 2314 ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); 2315 2316 /* Encoding mb_type as B16x16 */ 2317 { 2318 mb_info_ctxt_t *ps_left_ctxt = 2319 ps_cabac_ctxt->ps_left_ctxt_mb_info; 2320 mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 2321 UWORD32 u4_ctx_inc = 0; 2322 2323 UWORD32 u4_mb_type_bins = u4_b_mb_type[u4_mb_type]; 2324 UWORD32 u4_bin_len = (u4_mb_type_bins >> 8) & 0x0F; 2325 u4_mb_type_bins = u4_mb_type_bins & 0xFF; 2326 2327 if (ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 2328 u4_ctx_inc += ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) 2329 != CAB_BD16x16) ? 1 : 0; 2330 if (ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 2331 u4_ctx_inc += ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) 2332 != CAB_BD16x16) ? 1 : 0; 2333 2334 u4_ctx_inc = u4_ctx_inc | ui_b_mb_type_ctx_inc[u4_mb_type]; 2335 2336 ih264e_encode_decision_bins(u4_mb_type_bins, 2337 u4_bin_len, 2338 u4_ctx_inc, 2339 u4_bin_len, 2340 &(ps_cabac_ctxt->au1_cabac_ctxt_table[MB_TYPE_B_SLICE]), 2341 ps_cabac_ctxt); 2342 } 2343 2344 ps_curr_ctxt->u1_mb_type = CAB_NON_BD16x16; 2345 { 2346 WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_b16x16->ai2_mv; 2347 2348 /* Get the pred modes */ 2349 ps_curr_ctxt->u1_mb_type = (ps_curr_ctxt->u1_mb_type 2350 | CAB_NON_BD16x16); 2351 /* Encoding motion vector for B16x16 */ 2352 ih264e_cabac_enc_mvds_b16x16(ps_cabac_ctxt, pi2_mv_ptr, 2353 i4_mb_part_pred_mode); 2354 } 2355 /* Encode CBP */ 2356 ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 2357 2358 if (cbp) 2359 { 2360 /* encode mb_qp_delta */ 2361 ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 2362 } 2363 2364 /* Ending bitstream offset for header in bits */ 2365 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 2366 ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 2367 - bitstream_start_offset; 2368 /* Starting bitstream offset for residue */ 2369 bitstream_start_offset = bitstream_end_offset; 2370 2371 pu1_byte += sizeof(mb_hdr_b16x16_t); 2372 } 2373 2374 if (cbp > 0) 2375 { 2376 /* Encode residue */ 2377 ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 2378 /* Ending bitstream offset for reside in bits */ 2379 bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 2380 ps_ent_ctxt->u4_residue_bits[1] += bitstream_end_offset 2381 - bitstream_start_offset; 2382 2383 ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 2384 ps_curr_ctxt->u1_yuv_dc_csbp &= 0x6; 2385 } 2386 else 2387 { 2388 ps_curr_ctxt->u1_yuv_ac_csbp = 0; 2389 ps_curr_ctxt->u1_yuv_dc_csbp = 0; 2390 *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 2391 *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 2392 *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 2393 } 2394 ps_curr_ctxt->u1_intrapred_chroma_mode = 0; 2395 ps_curr_ctxt->u1_cbp = cbp; 2396 ps_ent_ctxt->pv_mb_header_data = pu1_byte; 2397 return IH264E_SUCCESS; 2398 } 2399 } 2400