13749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/****************************************************************************** 23749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 33749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Copyright (C) 2015 The Android Open Source Project 43749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 53749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Licensed under the Apache License, Version 2.0 (the "License"); 63749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * you may not use this file except in compliance with the License. 73749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * You may obtain a copy of the License at: 83749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 93749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * http://www.apache.org/licenses/LICENSE-2.0 103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Unless required by applicable law or agreed to in writing, software 123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * distributed under the License is distributed on an "AS IS" BASIS, 133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * See the License for the specific language governing permissions and 153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * limitations under the License. 163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ***************************************************************************** 183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*/ 203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************* 233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @file 243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* ih264e_cabac.c 253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* 263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @brief 273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* Contains all functions to encode in CABAC entropy mode 283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* 293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* 303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @author 313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* Doney Alex 323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* 333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @par List of Functions: 343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* 353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* 363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @remarks 373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* None 383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* 393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************* 403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*/ 413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/*****************************************************************************/ 433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/* File Includes */ 443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/*****************************************************************************/ 453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/* System include files */ 473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include <stdio.h> 483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include <assert.h> 493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include <limits.h> 503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include <string.h> 513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/* User include files */ 533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_config.h" 543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_typedefs.h" 553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "iv2.h" 563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ive2.h" 573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_debug.h" 583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_defs.h" 593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_defs.h" 603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_macros.h" 613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_error.h" 623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_bitstream.h" 633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ime_distortion_metrics.h" 643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ime_defs.h" 653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ime_structs.h" 663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_error.h" 673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_structs.h" 683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_trans_quant_itrans_iquant.h" 693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_inter_pred_filters.h" 703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_mem_fns.h" 713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_padding.h" 723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_platform_macros.h" 733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_intra_pred_filters.h" 743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_deblk_edge_filters.h" 753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_cabac_tables.h" 763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "irc_cntrl_param.h" 773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "irc_frame_info_collector.h" 783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_rate_control.h" 793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_cabac_structs.h" 803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_structs.h" 813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_cabac.h" 823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_encode_header.h" 833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_cavlc_tables.h" 843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_cavlc.h" 853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_statistics.h" 863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_trace.h" 873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/*****************************************************************************/ 893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/* Function Definitions */ 903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/*****************************************************************************/ 913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes mb_skip_flag using CABAC entropy coding mode. 1003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u1_mb_skip_flag 1023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * mb_skip_flag 1033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 1053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 1063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u4_ctxidx_offset 1083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * ctxIdxOffset for mb_skip_flag context 1093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 1113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 1133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 1143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 1163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 1173749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_enc_mb_skip(UWORD8 u1_mb_skip_flag, 1183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt, 1193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctxidx_offset) 1203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 1213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u4_ctx_inc; 1233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 a, b; 1243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K a = ((ps_cabac_ctxt->ps_left_ctxt_mb_info->u1_mb_type & CAB_SKIP_MASK) ? 1253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0 : 1); 1263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K b = ((ps_cabac_ctxt->ps_top_ctxt_mb_info->u1_mb_type & CAB_SKIP_MASK) ? 1273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0 : 1); 1283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = a + b; 1303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode the bin */ 1313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 1323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (UWORD32) u1_mb_skip_flag, 1333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctxidx_offset 1343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u4_ctx_inc); 1353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 1373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/* ! < Table 9-36 � Binarization for macroblock types in I slices in ITU_T_H264-201402 1403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Bits 0-7 : binarised value 1413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Bits 8-15: length of binary sequence 1423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 1433749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic const UWORD32 u4_mb_type_intra[26] = 1443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 0x0100, 0x0620, 0x0621, 0x0622, 0x0623, 0x0748, 0x0749, 0x074a, 0x074b, 1453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x074c, 0x074d, 0x074e, 0x074f, 0x0628, 0x0629, 0x062a, 0x062b, 0x0758, 1463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0759, 0x075a, 0x075b, 0x075c, 0x075d, 0x075e, 0x075f, 0x0203 }; 1473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/* CtxInc for mb types */ 1503749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic const UWORD32 u4_mb_ctxinc[2][26] = 1513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 1523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Intra CtxInc's */ 1533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 0x00, 1543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x03467, 0x03467, 0x03467, 0x03467, 0x034567, 0x034567, 0x034567, 1553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x034567, 0x034567, 0x034567, 0x034567, 0x034567, 0x03467, 0x03467, 1563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x03467, 0x03467, 0x034567, 0x034567, 0x034567, 0x034567, 0x034567, 1573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x034567, 0x034567, 0x034567, 0x00}, 1583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Inter CtxInc's */ 1593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 0x00, 1603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x001233, 0x001233, 0x001233, 0x001233, 0x0012233, 0x0012233, 0x0012233, 1613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x001233, 0x001233, 1623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x001233, 0x001233, 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x0012233, 1633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0012233, 0x0012233, 0x0012233, 0x00} 1643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K}; 1653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 1683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 1693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 1713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes mb_type for an intra MB. 1723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u4_slice_type 1743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * slice type 1753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u4_intra_mb_type 1773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * MB type (Table 7-11) 1783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 1803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 1813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ** @param[in] u4_ctxidx_offset 1833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * ctxIdxOffset for mb_type context 1843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 1863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 1883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 1893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 1903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 1913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 1923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1933749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_enc_intra_mb_type(UWORD32 u4_slice_type, 1943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_intra_mb_type, 1953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt, 1963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_idx_offset) 1973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 1983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K encoding_envirnoment_t *ps_cab_enc_env = &(ps_cabac_ctxt->s_cab_enc_env); 2003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bin_ctxt_model *pu1_mb_bin_ctxt, *pu1_bin_ctxt; 2013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_bin; 2023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info; 2033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 2043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_bins; 2053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc; 2063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i1_bins_len; 2073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_code_int_range; 2083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_code_int_low; 2093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u2_quant_code_int_range; 2103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u4_code_int_range_lps; 2113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i; 2123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_ctx_inc; 2133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_table_val; 2143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_mb_bin_ctxt = ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_idx_offset; 2163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = u4_mb_type_intra[u4_intra_mb_type]; 2183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = (WORD8) ((u4_bins >> 8) & 0x0f); 2193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = u4_mb_ctxinc[(u4_slice_type != ISLICE)][u4_intra_mb_type]; 2203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctx_inc = 0; 2213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u4_slice_type == ISLICE) 2223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 2233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 2243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctx_inc += ((ps_left_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0); 2253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 2263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctx_inc += ((ps_top_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0); 2273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | (u1_ctx_inc << ((i1_bins_len - 1) << 2))); 2293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 2303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 2313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 2323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_mb_bin_ctxt += 3; 2333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u4_slice_type == BSLICE) 2343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_mb_bin_ctxt += 2; 2353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 2373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_range = ps_cab_enc_env->u4_code_int_range; 2393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_low = ps_cab_enc_env->u4_code_int_low; 2403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K for (i = (i1_bins_len - 1); i >= 0; i--) 2423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 2433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 shift; 2443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctx_inc = ((u4_ctx_inc >> (i << 2)) & 0x0f); 2463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin = ((u4_bins >> i) & 0x01); 2473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode the bin */ 2483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_bin_ctxt = pu1_mb_bin_ctxt + u1_ctx_inc; 2493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i != (i1_bins_len - 2)) 2503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 2513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i1_mps = !!((*pu1_bin_ctxt) & (0x40)); 2523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i1_state = (*pu1_bin_ctxt) & 0x3F; 2533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_quant_code_int_range = ((u4_code_int_range >> 6) & 0x03); 2553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_table_val = 2563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K gau4_ih264_cabac_table[i1_state][u2_quant_code_int_range]; 2573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_range_lps = u4_table_val & 0xFF; 2583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_range -= u4_code_int_range_lps; 2603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_bin != i1_mps) 2613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 2623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_low += u4_code_int_range; 2633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_range = u4_code_int_range_lps; 2643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i1_state == 0) 2653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 2663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* MPS(CtxIdx) = 1 - MPS(CtxIdx) */ 2673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_mps = 1 - i1_mps; 2683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 2693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_state = (u4_table_val >> 15) & 0x3F; 2713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 2723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 2733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 2743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_state = (u4_table_val >> 8) & 0x3F; 2753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 2773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (*pu1_bin_ctxt) = (i1_mps << 6) | i1_state; 2793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 2803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 2813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 2823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_range -= 2; 2833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 2843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Renormalize */ 2863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /*****************************************************************/ 2873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Renormalization; calculate bits generated based on range(R) */ 2883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Note : 6 <= R < 512; R is 2 only for terminating encode */ 2893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /*****************************************************************/ 2903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K GETRANGE(shift, u4_code_int_range); 2913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K shift = 9 - shift; 2923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_low <<= shift; 2933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_range <<= shift; 2943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* bits to be inserted in the bitstream */ 2963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cab_enc_env->u4_bits_gen += shift; 2973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cab_enc_env->u4_code_int_range = u4_code_int_range; 2983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cab_enc_env->u4_code_int_low = u4_code_int_low; 2993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* generate stream when a byte is ready */ 3013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_cab_enc_env->u4_bits_gen > CABAC_BITS) 3023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 3033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_put_byte(ps_cabac_ctxt); 3043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_range = ps_cab_enc_env->u4_code_int_range; 3053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_code_int_low = ps_cab_enc_env->u4_code_int_low; 3063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 3083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 3093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 3103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 3143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 3153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 3173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes prev_intra4x4_pred_mode_flag and 3183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * rem_intra4x4_pred_mode using CABAC entropy coding mode 3193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 3213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 3223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] pu1_intra_4x4_modes 3243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to array containing prev_intra4x4_pred_mode_flag and 3253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * rem_intra4x4_pred_mode 3263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 3283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 3303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 3313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 3333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 3343749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_enc_4x4mb_modes(cabac_ctxt_t *ps_cabac_ctxt, 3353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 *pu1_intra_4x4_modes) 3363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 3373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 i; 3383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 byte; 3393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K for (i = 0; i < 16; i += 2) 3403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 3413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* sub blk idx 1 */ 3423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte = *pu1_intra_4x4_modes++; 3433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (byte & 0x1) 3443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 3453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 3463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1, 3473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 3483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + PREV_INTRA4X4_PRED_MODE_FLAG); 3493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 3503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 3513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 3523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Binarization is FL and Cmax=7 */ 3533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(byte & 0xF, 3543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4, 3553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x05554, 3563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4, 3573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 3583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + REM_INTRA4X4_PRED_MODE - 5, 3593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 3603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 3613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* sub blk idx 2 */ 3623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte >>= 4; 3633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (byte & 0x1) 3643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 3653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 3663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1, 3673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 3683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + PREV_INTRA4X4_PRED_MODE_FLAG); 3693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 3703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 3713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 3723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(byte & 0xF, 3733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4, 3743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x05554, 3753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4, 3763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 3773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + REM_INTRA4X4_PRED_MODE - 5, 3783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 3793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 3803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 3813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 3823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 3863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 3873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 3893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes chroma intrapred mode for the MB. 3903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u1_chroma_pred_mode 3923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Chroma intr prediction mode 3933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 3953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 3963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 3983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 3993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 4003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 4013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 4023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 4033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 4043749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_enc_chroma_predmode(UWORD8 u1_chroma_pred_mode, 4053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt) 4063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 4073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i1_temp; 4093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 4103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info; 4113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 4123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_bins = 0; 4133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i1_bins_len = 1; 4143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc = 0; 4153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 a, b; 4163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K a = ((ps_left_ctxt->u1_intrapred_chroma_mode != 0) ? 1 : 0); 4173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K b = ((ps_top_ctxt->u1_intrapred_chroma_mode != 0) ? 1 : 0); 4183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Binarization is TU and Cmax=3 */ 4203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_intrapred_chroma_mode = u1_chroma_pred_mode; 4213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = a + b; 4233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | 0x330); 4243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_chroma_pred_mode) 4253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 4263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 1; 4273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_temp = u1_chroma_pred_mode; 4283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_temp--; 4293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Put a stream of 1's of length Chromaps_pred_mode_ctxt value */ 4303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K while (i1_temp) 4313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 4323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = (u4_bins | (1 << i1_bins_len)); 4333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 4343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_temp--; 4353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 4363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* If Chromaps_pred_mode_ctxt < Cmax i.e 3. Terminate put a zero */ 4373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_chroma_pred_mode < 3) 4383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 4393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 4403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 4413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 4423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, 4443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len, 4453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 4463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3, 4473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 4483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + INTRA_CHROMA_PRED_MODE, 4493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 4503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 4523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 4553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 4563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 4573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 4583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes CBP for the MB. 4593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 4603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u1_cbp 4613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * CBP for the MB 4623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 4633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 4643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 4653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 4663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 4673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 4683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 4693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 4703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 4713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 4723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 4733749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_enc_cbp(UWORD32 u4_cbp, cabac_ctxt_t *ps_cabac_ctxt) 4743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 4753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info; 4763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 4773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i2_cbp_chroma, i, j; 4783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_ctxt_inc, u1_bin; 4793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 a, b; 4803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc; 4813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_bins; 4823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i1_bins_len; 4833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CBP Luma, FL, Cmax = 15, L = 4 */ 4853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = 0; 4863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 0; 4873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = 5; 4883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K for (i = 0; i < 4; i++) 4893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 4903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* calulate ctxtInc, depending on neighbour availability */ 4913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* u1_ctxt_inc = CondTerm(A) + 2 * CondTerm(B); 4923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K A: Left block and B: Top block */ 4933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Check for Top availability */ 4953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i >> 1) 4963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 4973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K j = i - 2; 4983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Top is available always and it's current MB */ 4993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K b = (((u4_cbp >> j) & 0x01) != 0 ? 0 : 1); 5003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 5013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 5023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 5033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* for blocks whose top reference is in another MB */ 5043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 5053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K j = i + 2; 5063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K b = ((ps_top_ctxt->u1_cbp >> j) & 0x01) ? 0 : 1; 5073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 5083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 5093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 5103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Check for Left availability */ 5113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i & 0x01) 5123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 5133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Left is available always and it's current MB */ 5143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K j = i - 1; 5153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K a = (((u4_cbp >> j) & 0x01) != 0 ? 0 : 1); 5163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 5173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 5183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 5193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 5203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K j = i + 1; 5213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K a = ((ps_left_ctxt->u1_cbp >> j) & 0x01) ? 0 : 1; 5223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 5233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 5243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctxt_inc = a + 2 * b; 5253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin = ((u4_cbp >> i) & 0x01); 5263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | (u1_ctxt_inc << (i << 2))); 5273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = (u4_bins | (u1_bin << i)); 5283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 5293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 5303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CBP Chroma, TU, Cmax = 2 */ 5313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i2_cbp_chroma = u4_cbp >> 4; 5323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* calulate ctxtInc, depending on neighbour availability */ 5333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K a = (ps_left_ctxt->u1_cbp > 15) ? 1 : 0; 5343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K b = (ps_top_ctxt->u1_cbp > 15) ? 1 : 0; 5353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 5363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctxt_inc = a + 2 * b; 5373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i2_cbp_chroma) 5383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 5393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = u4_ctx_inc | ((4 + u1_ctxt_inc) << 16); 5403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = (u4_bins | 0x10); 5413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* calulate ctxtInc, depending on neighbour availability */ 5423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K a = (ps_left_ctxt->u1_cbp > 31) ? 1 : 0; 5433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K b = (ps_top_ctxt->u1_cbp > 31) ? 1 : 0; 5443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctxt_inc = a + 2 * b; 5453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = u4_ctx_inc | ((8 + u1_ctxt_inc) << 20); 5463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = (u4_bins | (((i2_cbp_chroma >> 1) & 0x01) << i1_bins_len)); 5473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 5483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 5493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 5503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 5513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | ((4 + u1_ctxt_inc) << 16)); 5523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 5533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, i1_bins_len, u4_ctx_inc, 8, 5543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table + CBP_LUMA, 5553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 5563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 5573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 5583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 5593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 5603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 5613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 5623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 5633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes mb_qp_delta for the MB. 5643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 5653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] i1_mb_qp_delta 5663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * mb_qp_delta 5673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 5683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 5693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 5703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 5713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 5723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 5733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 5743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 5753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 5763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 5773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 5783749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_enc_mb_qp_delta(WORD8 i1_mb_qp_delta, 5793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt) 5803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 5813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_code_num; 5823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_ctxt_inc; 5833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 5843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc; 5853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_bins; 5863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i1_bins_len; 5873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_ctx_inc, u1_bin; 5883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Range of ps_mb_qp_delta_ctxt= -26 to +25 inclusive */ 5893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ASSERT((i1_mb_qp_delta < 26) && (i1_mb_qp_delta > -27)); 5903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* if ps_mb_qp_delta_ctxt=0, then codeNum=0 */ 5913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_code_num = 0; 5923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i1_mb_qp_delta > 0) 5933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_code_num = (i1_mb_qp_delta << 1) - 1; 5943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else if (i1_mb_qp_delta < 0) 5953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_code_num = (ABS(i1_mb_qp_delta)) << 1; 5963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 5973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = 0; 5983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 0; 5993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = 1; 6003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* calculate ctxtInc, depending on neighbour availability */ 6013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctxt_inc = (!(!(ps_cabac_ctxt->i1_prevps_mb_qp_delta_ctxt))); 6023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->i1_prevps_mb_qp_delta_ctxt = i1_mb_qp_delta; 6033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 6043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_code_num == 0) 6053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 6063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* b0 */ 6073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin = (UWORD8) (u4_bins); 6083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctx_inc = u1_ctxt_inc & 0x0f; 6093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode the bin */ 6103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 6113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin, 6123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table + MB_QP_DELTA 6133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u1_ctx_inc); 6143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 6153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 6163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 6173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 6183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* b0 */ 6193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = u1_ctxt_inc; 6203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 1; 6213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_code_num--; 6223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_code_num == 0) 6233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 6243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* b1 */ 6253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | 0x20); 6263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 6273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, i1_bins_len, u4_ctx_inc, 3, 6283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table + MB_QP_DELTA, 6293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 6303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 6313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 6323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 6333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* b1 */ 6343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | 0x20); 6353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = (u4_bins | (1 << i1_bins_len)); 6363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 6373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_code_num--; 6383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* BinIdx from b2 onwards */ 6393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_code_num < 30) 6403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { /* maximum i1_bins_len = 31 */ 6413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K while (u1_code_num) 6423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 6433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = (u4_bins | (1 << i1_bins_len)); 6443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 6453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_code_num--; 6463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K }; 6473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | 0x300); 6483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 6493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, 6503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len, 6513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 6523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2, 6533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 6543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + MB_QP_DELTA, 6553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 6563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 6573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 6583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 6593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* maximum i1_bins_len = 53 */ 6603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 0xffffffff; 6613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = 32; 6623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | 0x300); 6633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_code_num -= 30; 6643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, 6653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len, 6663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 6673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 2, 6683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 6693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + MB_QP_DELTA, 6703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 6713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 0; 6723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = 0; 6733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = 0x033; 6743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K while (u1_code_num) 6753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 6763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = (u4_bins | (1 << i1_bins_len)); 6773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 6783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_code_num--; 6793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K }; 6803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 6813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | 0x300); 6823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 6833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, 6843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len, 6853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 6863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1, 6873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 6883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + MB_QP_DELTA, 6893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 6903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 6913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 6923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 6933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 6943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 6953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 6963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 6973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 6983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 6993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 7003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 7013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes 4residual_block_cabac as defined in 7.3.5.3.3. 7023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] pi2_res_block 7043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * pointer to the array of residues 7053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u1_nnz 7073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Number of non zero coeffs in the block 7083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u1_max_num_coeffs 7103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Max number of coeffs that can be there in the block 7113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u2_sig_coeff_map 7133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Significant coeff map 7143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u4_ctx_cat_offset 7163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * ctxIdxOffset for absolute value contexts 7173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] pu1_ctxt_sig_coeff 7193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to residual state variables 7203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 7223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 7233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 7253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 7273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 7283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 7303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 7313749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_write_coeff4x4(WORD16 *pi2_res_block, UWORD8 u1_nnz, 7323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_max_num_coeffs, 7333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u2_sig_coeff_map, 7343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_cat_offset, 7353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bin_ctxt_model *pu1_ctxt_sig_coeff, 7363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt) 7373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 7383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 7393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i; 7403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 *pi16_coeffs; 7413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_sig_coeff, u4_bins; 7423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc; 7433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_last_sig_coef_index = (31 - CLZ(u2_sig_coeff_map)); 7443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 7453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Always put Coded Block Flag as 1 */ 7463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 7473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pi16_coeffs = pi2_res_block; 7483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 7493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bin_ctxt_model *pu1_bin_ctxt; 7503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_bin, uc_last; 7513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 7523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i = 0; 7533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_bin_ctxt = pu1_ctxt_sig_coeff; 7543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_sig_coeff = 0; 7553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin = 1; 7563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if ((u1_last_sig_coef_index)) 7573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 7583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin = !!(u2_sig_coeff_map & 01); 7593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 7603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K uc_last = 1; 7613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 7623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K do 7633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 7643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode Decision */ 7653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, u1_bin, pu1_bin_ctxt); 7663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 7673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_bin & uc_last) 7683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 7693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_sig_coeff = (u4_sig_coeff | (1 << i)); 7703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_bin_ctxt = pu1_ctxt_sig_coeff + i 7713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + LAST_SIGNIFICANT_COEFF_FLAG_FRAME 7723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - SIGNIFICANT_COEFF_FLAG_FRAME; 7733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin = (i == u1_last_sig_coef_index); 7743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K uc_last = 0; 7753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 7763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 7773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 7783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i = i + 1; 7793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_bin_ctxt = pu1_ctxt_sig_coeff + i; 7803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin = (i == u1_last_sig_coef_index); 7813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K uc_last = 1; 7823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if ((i != u1_last_sig_coef_index)) 7833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 7843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin = !!((u2_sig_coeff_map >> i) & 01); 7853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 7863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 7873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K }while (!((i > u1_last_sig_coef_index) 7883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K || (i > (u1_max_num_coeffs - 1)))); 7893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 7903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 7913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode coeff_abs_level_minus1 and coeff_sign_flag */ 7923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 7933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_sign; 7943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u2_abs_level; 7953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0; 7963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_ctx_inc; 7973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_coff; 7983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 i2_sufs; 7993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i1_bins_len; 8003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i = u1_last_sig_coef_index; 8013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pi16_coeffs = pi2_res_block + u1_nnz - 1; 8023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K do 8033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 8043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 8053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_sig_coeff = u4_sig_coeff & ((1 << i) - 1); 8063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 0; 8073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = 0; 8083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = 1; 8093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode the AbsLevelMinus1 */ 8103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_level = ABS(*(pi16_coeffs)) - 1; 8113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CtxInc for bin0 */ 8123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = MIN(u1_abs_level_equal1, 4); 8133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CtxInc for remaining */ 8143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctx_inc = 5 + MIN(u1_abs_level_gt1, 4); 8153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = u4_ctx_inc + (u1_ctx_inc << 4); 8163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u2_abs_level) 8173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 8183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_level_gt1++; 8193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_level_equal1 = 0; 8203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 8213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (!u1_abs_level_gt1) 8223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_level_equal1++; 8233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_coff = 14; 8253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u2_abs_level >= u1_coff) 8263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 8273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Prefix TU i.e string of 14 1's */ 8283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 0x3fff; 8293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = 14; 8303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, i1_bins_len, 8313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 1, ps_cabac_ctxt->au1_cabac_ctxt_table 8323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u4_ctx_cat_offset, 8333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 8343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Suffix, uses EncodeBypass */ 8363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i2_sufs = u2_abs_level - u1_coff; 8373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = ih264e_cabac_UEGk0_binarization(i2_sufs, 8393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K &i1_bins_len); 8403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bypass_bins(ps_cabac_ctxt, u4_bins, 8423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len); 8433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 8453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 8463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 8473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Prefix only */ 8483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = (1 << u2_abs_level) - 1; 8493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = u2_abs_level + 1; 8503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode Terminating bit */ 8513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, i1_bins_len, 8523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 1, ps_cabac_ctxt->au1_cabac_ctxt_table 8533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u4_ctx_cat_offset, 8543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 8553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 8563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 8573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* encode coeff_sign_flag[i] */ 8583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_sign = ((*pi16_coeffs) < 0) ? 1 : 0; 8590574be65f4b2376e32bdf979650d8e5f168b68b7Doney Alex ih264e_cabac_encode_bypass_bin(ps_cabac_ctxt, u1_sign); 8603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i = CLZ(u4_sig_coeff); 8613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i = 31 - i; 8623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pi16_coeffs--; 8633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K }while (u4_sig_coeff); 8643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 8653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 8673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 8703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 8713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 8723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Write DC coeffs for intra predicted luma block 8733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 8743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_ent_ctxt 8753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to entropy context structure 8763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 8773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 8783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 8793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 8803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 8813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 8823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 8833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 8843749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_encode_residue_luma_dc(entropy_ctxt_t *ps_ent_ctxt) 8853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 8863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CABAC context */ 8883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 8893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K tu_sblk_coeff_data_t *ps_mb_coeff_data; 8903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 8913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* packed residue */ 8923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data; 8933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u2_sig_coeff_map; 8943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 *pi2_res_block; 8953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_nnz; 8963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_cbf; 8973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 8983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *p_CurCtxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 8993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, u1_nnz, 9013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_sig_coeff_map, pi2_res_block); 9023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_cbf = !!(u1_nnz); 9043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 9063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc; 9073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_a, u1_b; 9083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_a = ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] & 0x1; 9103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b = ps_top_ctxt->u1_yuv_dc_csbp & 0x1; 9113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = u1_a + (u1_b << 1); 9123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 9143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_cbf, 9153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table + CBF 9163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + (LUMA_DC_CTXCAT << 2) + u4_ctx_inc); 9173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 9183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Write coded_block_flag */ 9203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_cbf) 9213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 9223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_write_coeff4x4(pi2_res_block, 9233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_nnz, 9243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15, 9253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_sig_coeff_map, 9263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_0_OFFSET, 9273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 9283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + SIGNIFICANT_COEFF_FLAG_FRAME 9293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + SIG_COEFF_CTXT_CAT_0_OFFSET, 9303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 9313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] |= 0x1; 9333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K p_CurCtxt->u1_yuv_dc_csbp |= 0x1; 9343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 9353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 9363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 9373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 9383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K p_CurCtxt->u1_yuv_dc_csbp &= 0x6; 9393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 9403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data; 9423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 9433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 9483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 9493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 9503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Write chroma residues to the bitstream 9513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 9523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_ent_ctxt 9533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to entropy context structure 9543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 9553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u1_chroma_cbp 9563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * coded block pattern, chroma 9573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 9583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 9593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 9603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 9613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 9623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 9633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 9643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 9653749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_write_chroma_residue(entropy_ctxt_t *ps_ent_ctxt, 9663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_chroma_cbp) 9673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 9683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CABAC context */ 9693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 9703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K tu_sblk_coeff_data_t *ps_mb_coeff_data; 9713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* packed residue */ 9723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data; 9733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u2_sig_coeff_map; 9743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_nnz; 9753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_top_ctxt_mb_info, *ps_curr_ctxt; 9763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_top_ctxt_mb_info = ps_cabac_ctxt->ps_top_ctxt_mb_info; 9783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 9793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /********************/ 9813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Write Chroma DC */ 9823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /********************/ 9833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 9843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 *pi2_res_block; 9853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_left_dc_csbp, u1_top_dc_csbp, u1_uv, u1_cbf; 9863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_left_dc_csbp = (ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0]) >> 1; 9883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_top_dc_csbp = (ps_top_ctxt_mb_info->u1_yuv_dc_csbp) >> 1; 9893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 9903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K for (u1_uv = 0; u1_uv < 2; u1_uv++) 9913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 9923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, 9933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_nnz, u2_sig_coeff_map, pi2_res_block); 9943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_cbf = !!(u1_nnz); 9953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 9963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_a, u1_b; 9973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc; 9983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_a = (u1_left_dc_csbp >> u1_uv) & 0x01; 9993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b = (u1_top_dc_csbp >> u1_uv) & 0x01; 10003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u1_a + (u1_b << 1)); 10013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 10033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_cbf, 10043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table + CBF 10053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + (CHROMA_DC_CTXCAT << 2) 10063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u4_ctx_inc); 10073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 10083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_cbf) 10103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 10113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_write_coeff4x4(pi2_res_block, 10123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_nnz, 10133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3, 10143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_sig_coeff_map, 10153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K COEFF_ABS_LEVEL_MINUS1 10163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + COEFF_ABS_LEVEL_CAT_3_OFFSET, 10173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 10183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + SIGNIFICANT_COEFF_FLAG_FRAME 10193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + SIG_COEFF_CTXT_CAT_3_OFFSET, 10203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 10213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K SETBIT(u1_top_dc_csbp, u1_uv); 10233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K SETBIT(u1_left_dc_csbp, u1_uv); 10243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 10253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 10263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 10273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_top_dc_csbp, u1_uv); 10283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_left_dc_csbp, u1_uv); 10293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 10303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 10313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /*************************************************************/ 10323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Update the DC csbp */ 10333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /*************************************************************/ 10343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x1; 10353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp &= 0x1; 10363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] |= (u1_left_dc_csbp << 1); 10373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp |= (u1_top_dc_csbp << 1); 10383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 10393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /*******************/ 10403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Write Chroma AC */ 10413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /*******************/ 10423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 10433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_chroma_cbp == 2) 10443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 10453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_uv_blkno, u1_left_ac_csbp, u1_top_ac_csbp; 10463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 *pi2_res_block; 10473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_left_ac_csbp = ps_cabac_ctxt->pu1_left_uv_ac_csbp[0]; 10483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_top_ac_csbp = ps_top_ctxt_mb_info->u1_yuv_ac_csbp >> 4; 10493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K for (u1_uv_blkno = 0; u1_uv_blkno < 8; u1_uv_blkno++) 10513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 10523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_cbf; 10533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_b2b0, u1_b2b1; 10543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, 10553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_nnz, u2_sig_coeff_map, 10563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pi2_res_block); 10573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_cbf = !!(u1_nnz); 10593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b2b0 = ((u1_uv_blkno & 0x4) >> 1) | (u1_uv_blkno & 0x1); 10603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b2b1 = ((u1_uv_blkno & 0x4) >> 1) 10613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K | ((u1_uv_blkno & 0x2) >> 1); 10623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 10643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_a, u1_b; 10653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc; 10663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* write coded_block_flag */ 10673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_a = (u1_left_ac_csbp >> u1_b2b1) & 0x1; 10683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b = (u1_top_ac_csbp >> u1_b2b0) & 0x1; 10693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = u1_a + (u1_b << 1); 10703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 10723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_cbf, 10733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table + CBF 10743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + (CHROMA_AC_CTXCAT << 2) 10753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u4_ctx_inc); 10763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 10783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_cbf) 10793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 10803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_write_coeff4x4(pi2_res_block, 10813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_nnz, 10823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 14, 10833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_sig_coeff_map, 10843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K COEFF_ABS_LEVEL_MINUS1 10853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + COEFF_ABS_LEVEL_CAT_4_OFFSET, 10863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 10873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + +SIGNIFICANT_COEFF_FLAG_FRAME 10883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + SIG_COEFF_CTXT_CAT_4_OFFSET, 10893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 10903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K SETBIT(u1_left_ac_csbp, u1_b2b1); 10923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K SETBIT(u1_top_ac_csbp, u1_b2b0); 10933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 10943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 10953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 10963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_left_ac_csbp, u1_b2b1); 10973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_top_ac_csbp, u1_b2b0); 10983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 10993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 11003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 11013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /*************************************************************/ 11023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Update the AC csbp */ 11033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /*************************************************************/ 11043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = u1_left_ac_csbp; 11053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp &= 0x0f; 11063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp |= (u1_top_ac_csbp << 4); 11073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 11083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 11093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 11103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = 0; 11113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf; 11123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 11133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 11143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data; 11153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 11163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 11173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 11183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 11193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 11203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 11213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 11223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 11233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes Residues for the MB as defined in 7.3.5.3 11243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 11253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_ent_ctxt 11263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to entropy context structure 11273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 11283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u1_cbp 11293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * coded block pattern 11303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 11313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u1_ctx_cat 11323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Context category, LUMA_AC_CTXCAT or LUMA_4x4_CTXCAT 11333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 11343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 11353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 11363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 11373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 11383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 11393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 11403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 11413749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_encode_residue(entropy_ctxt_t *ps_ent_ctxt, 11423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_cbp, UWORD8 u1_ctx_cat) 11433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 11443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CABAC context */ 11453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 11463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 11473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K tu_sblk_coeff_data_t *ps_mb_coeff_data; 11483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* packed residue */ 11493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data; 11503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u2_sig_coeff_map; 11513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_nnz; 11523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_curr_ctxt; 11533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_top_ctxt; 11543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_left_ac_csbp; 11553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_top_ac_csbp; 11563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_idx_offset_sig_coef, u4_ctx_idx_offset_abs_lvl; 11573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 11583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 11593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_left_ac_csbp = ps_cabac_ctxt->pu1_left_y_ac_csbp[0]; 11603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_top_ac_csbp = ps_top_ctxt->u1_yuv_ac_csbp; 11613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 11623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u4_cbp & 0xf) 11633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 11643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Write luma residue */ 11653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_offset; 11663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 *pi2_res_block; 11673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_subblk_num; 11683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_ctx_cat == LUMA_AC_CTXCAT) 11693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 11703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_offset = 1; 11713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_idx_offset_sig_coef = SIG_COEFF_CTXT_CAT_1_OFFSET; 11723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_idx_offset_abs_lvl = COEFF_ABS_LEVEL_MINUS1 11733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + COEFF_ABS_LEVEL_CAT_1_OFFSET; 11743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 11753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 11763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 11773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_offset = 0; 11783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_idx_offset_sig_coef = SIG_COEFF_CTXT_CAT_2_OFFSET; 11793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_idx_offset_abs_lvl = COEFF_ABS_LEVEL_MINUS1 11803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + COEFF_ABS_LEVEL_CAT_2_OFFSET; 11813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 11823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 11833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K for (u1_subblk_num = 0; u1_subblk_num < 16; u1_subblk_num++) 11843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 11853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_b0, u1_b1, u1_b2, u1_b3, u1_b2b0, u1_b3b1, u1_b3b2; 11863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b0 = (u1_subblk_num & 0x1); 11873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b1 = (u1_subblk_num & 0x2) >> 1; 11883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b2 = (u1_subblk_num & 0x4) >> 2; 11893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b3 = (u1_subblk_num & 0x8) >> 3; 11903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b2b0 = (u1_b2 << 1) | (u1_b0); 11913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b3b1 = (u1_b3 << 1) | (u1_b1); 11923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b3b2 = (u1_b3 << 1) | (u1_b2); 11933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 11943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (!((u4_cbp >> u1_b3b2) & 0x1)) 11953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 11963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* ---------------------------------------------------------- */ 11973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* The current block is not coded so skip all the sub block */ 11983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* and set the pointer of scan level, csbp accrodingly */ 11993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* ---------------------------------------------------------- */ 12003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_top_ac_csbp, u1_b2b0); 12013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_top_ac_csbp, (u1_b2b0 + 1)); 12023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_left_ac_csbp, u1_b3b1); 12033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_left_ac_csbp, (u1_b3b1 + 1)); 12043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 12053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_subblk_num += 3; 12063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 12083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 12094b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo UWORD8 u1_csbf; 12104b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo 12113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, 12123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_nnz, u2_sig_coeff_map, 12133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pi2_res_block); 12143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 12154b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo u1_csbf = !!(u1_nnz); 12163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 12173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_a, u1_b; 12183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc; 12193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_b = (u1_top_ac_csbp >> u1_b2b0) & 0x01; 12203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_a = (u1_left_ac_csbp >> u1_b3b1) & 0x01; 12213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = u1_a + (u1_b << 1); 12223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 12233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode the bin */ 12243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 12253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_csbf, 12263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table + CBF 12273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + (u1_ctx_cat << 2) + u4_ctx_inc); 12283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 12293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /**************************/ 12313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Write coded_block_flag */ 12323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /**************************/ 12333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_csbf) 12343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 12353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_write_coeff4x4(pi2_res_block, 12363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_nnz, 12373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (UWORD8) (15 - u1_offset), 12383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_sig_coeff_map, 12393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_idx_offset_abs_lvl, 12403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 12413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + SIGNIFICANT_COEFF_FLAG_FRAME 12423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u4_ctx_idx_offset_sig_coef, 12433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 12443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 12453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K SETBIT(u1_top_ac_csbp, u1_b2b0); 12463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K SETBIT(u1_left_ac_csbp, u1_b3b1); 12473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 12493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 12503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_top_ac_csbp, u1_b2b0); 12513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K CLEARBIT(u1_left_ac_csbp, u1_b3b1); 12523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /**************************************************************************/ 12563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Update the AC csbp */ 12573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /**************************************************************************/ 12583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_y_ac_csbp[0] = u1_left_ac_csbp & 0xf; 12593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_top_ac_csbp &= 0x0f; 12603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf0; 12613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp |= u1_top_ac_csbp; 12623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 12643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 12653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_y_ac_csbp[0] = 0; 12663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf0; 12673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 12693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Write chroma residue */ 12703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 12713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data; 12723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 12733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_cbp_chroma; 12743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_cbp_chroma = u4_cbp >> 4; 12753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_cbp_chroma) 12763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 12773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_write_chroma_residue(ps_ent_ctxt, u1_cbp_chroma); 12783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 12803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 12813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x1; 12823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp &= 0x1; 12833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = 0; 12843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf; 12853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 12873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 12883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 12893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 12903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 12913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 12923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes a Motion vector (9.3.3.1.1.7 ) 12933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 12943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u1_mvd 12953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Motion vector to be encoded 12963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 12973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] u4_ctx_idx_offset 12983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * * ctxIdxOffset for MV_X or MV_Ycontext 12993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 13003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ui2_abs_mvd 13013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * sum of absolute value of corresponding neighboring motion vectors 13023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 13033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 13043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 13053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 13063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 13073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 13083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 13093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 13103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 13113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 13123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 13133749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_enc_ctx_mvd(WORD16 u1_mvd, UWORD32 u4_ctx_idx_offset, 13143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 ui2_abs_mvd, 13153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt) 13163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 13173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 13183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_bin, u1_ctxt_inc; 13193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 k = 3, u1_coff = 9; 13203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 i2_abs_mvd, i2_sufs; 13213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc; 13223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_bins; 13233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 i1_bins_len; 13243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 13253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* if mvd < u1_coff 13263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K only Prefix 13273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 13283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K Prefix + Suffix 13293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 13303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K encode sign bit 13313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 13323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K Prefix TU encoding Cmax =u1_coff and Suffix 3rd order Exp-Golomb 13333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 13343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 13353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ui2_abs_mvd < 3) 13363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = 0; 13373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else if (ui2_abs_mvd > 32) 13383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = 2; 13393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 13403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = 1; 13413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 13423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 0; 13433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = 1; 13443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 13453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_mvd == 0) 13463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 13473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 13483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0, 13493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_idx_offset 13503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u4_ctx_inc); 13513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 13523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 13533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 13543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i2_abs_mvd = ABS(u1_mvd); 13553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i2_abs_mvd >= u1_coff) 13563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 13573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Prefix TU i.e string of 9 1's */ 13583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 0x1ff; 13593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = 9; 13603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | 0x065430); 13613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 13623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, 13633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len, 13643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 13653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4, 13663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 13673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u4_ctx_idx_offset, 13683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 13693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 13703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Suffix, uses EncodeBypass */ 13713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 0; 13723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len = 0; 13733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i2_sufs = i2_abs_mvd - u1_coff; 13743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K while (1) 13753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 13763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i2_sufs >= (1 << k)) 13773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 13780574be65f4b2376e32bdf979650d8e5f168b68b7Doney Alex u4_bins = (u4_bins | (1 << (31 - i1_bins_len))); 13793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 13803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i2_sufs = i2_sufs - (1 << k); 13813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K k++; 13823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 13833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 13843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 13853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 13863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K while (k--) 13873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 13883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_bin = ((i2_sufs >> k) & 0x01); 13890574be65f4b2376e32bdf979650d8e5f168b68b7Doney Alex u4_bins = (u4_bins | (u1_bin << (31 - i1_bins_len))); 13903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 13913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 13923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K break; 13933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 13943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 13950574be65f4b2376e32bdf979650d8e5f168b68b7Doney Alex u4_bins >>= (32 - i1_bins_len); 13963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bypass_bins(ps_cabac_ctxt, u4_bins, 13973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len); 13983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 13993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 14003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 14013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Prefix only */ 14023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* b0 */ 14033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = 1; 14043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i2_abs_mvd--; 14053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctxt_inc = 3; 14063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K while (i2_abs_mvd) 14073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 14083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i2_abs_mvd--; 14093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bins = (u4_bins | (1 << i1_bins_len)); 14103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_ctxt_inc <= 6) 14113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 14123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc 14133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K | (u1_ctxt_inc << (i1_bins_len << 2))); 14143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_ctxt_inc++; 14153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 14163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 14173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 14183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode Terminating bit */ 14193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i1_bins_len <= 4) 14203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | (u1_ctxt_inc << (i1_bins_len << 2))); 14213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len++; 14223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_bins, 14233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i1_bins_len, 14243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 14253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 4, 14263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 14273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + u4_ctx_idx_offset, 14283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 14293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 14303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* sign bit, uses EncodeBypass */ 14313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (u1_mvd > 0) 14320574be65f4b2376e32bdf979650d8e5f168b68b7Doney Alex ih264e_cabac_encode_bypass_bin(ps_cabac_ctxt, 0); 14333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 14340574be65f4b2376e32bdf979650d8e5f168b68b7Doney Alex ih264e_cabac_encode_bypass_bin(ps_cabac_ctxt, 1); 14353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 14363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 14373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 14383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 14393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 14403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 14413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes all motion vectors for a P16x16 MB 14423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 14433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 14443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 14453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 14463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] pi2_mv_ptr 14473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to array of motion vectors 14483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 14493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 14503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 14513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 14523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 14533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 14543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 14553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 14563749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_enc_mvds_p16x16(cabac_ctxt_t *ps_cabac_ctxt, 14573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 *pi2_mv_ptr) 14583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 14593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 14603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 14613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode the differential component of the motion vectors */ 14623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 14633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 14643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_abs_mvd_x, u1_abs_mvd_y; 14653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt; 14663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 u2_mv; 14673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_x = 0; 14683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_y = 0; 14693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_top_mv_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_mv[0]; 14703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_lft_mv_ctxt = ps_cabac_ctxt->pu1_left_mv_ctxt_inc[0]; 14713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 14723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, 14733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_y_b; 14743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_x_b = (UWORD16) pu1_top_mv_ctxt[0]; 14753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[1]; 14763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[0]; 14773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[1]; 14783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_mv = *(pi2_mv_ptr++); 14793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 14803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X, 14813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b), 14823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 14833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 14843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv)); 14853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_mv = *(pi2_mv_ptr++); 14863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 14873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y, 14883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b), 14893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 14903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 14913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv)); 14923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 14933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /***************************************************************/ 14943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Store abs_mvd_values cabac contexts */ 14953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /***************************************************************/ 14963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_top_mv_ctxt[0] = pu1_lft_mv_ctxt[0] = u1_abs_mvd_x; 14973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_top_mv_ctxt[1] = pu1_lft_mv_ctxt[1] = u1_abs_mvd_y; 14983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 14993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 15003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 15033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 15043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 15053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Encodes all motion vectors for a B MB (Assues that mbype is B_L0_16x16, B_L1_16x16 or B_Bi_16x16 15063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 15073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_cabac_ctxt 15083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to cabac context structure 15093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 15103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] pi2_mv_ptr 15113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Pointer to array of motion vectors 15123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 15133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns 15143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 15153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks 15163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * None 15173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 15183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 15193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 15203749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic void ih264e_cabac_enc_mvds_b16x16(cabac_ctxt_t *ps_cabac_ctxt, 15213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 *pi2_mv_ptr, 15223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 i4_mb_part_pred_mode ) 15233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 15243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode the differential component of the motion vectors */ 15263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 15283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 u1_abs_mvd_x, u1_abs_mvd_y; 15293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt; 15303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 u2_mv; 15313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_x = 0; 15323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_y = 0; 15333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_top_mv_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_mv[0]; 15343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_lft_mv_ctxt = ps_cabac_ctxt->pu1_left_mv_ctxt_inc[0]; 15353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i4_mb_part_pred_mode != PRED_L1)/* || PRED_BI */ 15363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 15373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, 15383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_y_b; 15393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_x_b = (UWORD16) pu1_top_mv_ctxt[0]; 15403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[1]; 15413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[0]; 15423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[1]; 15433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_mv = *(pi2_mv_ptr++); 15443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X, 15463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b), 15473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 15483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv)); 15503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_mv = *(pi2_mv_ptr++); 15513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y, 15533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b), 15543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 15553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv)); 15573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 15583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /***************************************************************/ 15593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Store abs_mvd_values cabac contexts */ 15603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /***************************************************************/ 15613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_top_mv_ctxt[0] = pu1_lft_mv_ctxt[0] = u1_abs_mvd_x; 15623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_top_mv_ctxt[1] = pu1_lft_mv_ctxt[1] = u1_abs_mvd_y; 15633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_x = 0; 15653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_y = 0; 15663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (i4_mb_part_pred_mode != PRED_L0)/* || PRED_BI */ 15673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 15683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, 15693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_y_b; 15703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_x_b = (UWORD16) pu1_top_mv_ctxt[2]; 15713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[3]; 15723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[2]; 15733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[3]; 15743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_mv = *(pi2_mv_ptr++); 15753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X, 15773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b), 15783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 15793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv)); 15813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u2_mv = *(pi2_mv_ptr++); 15823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y, 15843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b), 15853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 15863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv)); 15883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 15893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /***************************************************************/ 15903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Store abs_mvd_values cabac contexts */ 15913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /***************************************************************/ 15923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_top_mv_ctxt[2] = pu1_lft_mv_ctxt[2] = u1_abs_mvd_x; 15933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K pu1_top_mv_ctxt[3] = pu1_lft_mv_ctxt[3] = u1_abs_mvd_y; 15943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 15953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 15963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 15993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 16003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 16013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 16023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 16033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * This function generates CABAC coded bit stream for an Intra Slice. 16043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 16053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @description 16063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * The mb syntax layer for intra slices constitutes luma mb mode, mb qp delta, coded block pattern, chroma mb mode and 16073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * luma/chroma residue. These syntax elements are written as directed by table 16083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7.3.5 of h264 specification. 16093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 16103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_ent_ctxt 16113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * pointer to entropy context 16123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 16133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns error code 16143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 16153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks none 16163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 16173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 16183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 16193749f6f435e79624f72841e866245d84195551cdHarinarayanan K KIH264E_ERROR_T ih264e_write_islice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt) 16203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 16213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* bit stream ptr */ 16223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm; 16233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CABAC context */ 16243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 16253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* packed header data */ 16263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; 16273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_curr_ctxt; 16283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode; 16293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 mb_qp_delta; 16303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_cbp_l, u4_cbp_c; 16313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 byte_count = 0; 16323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 bitstream_start_offset, bitstream_end_offset; 16333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 16343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) 16353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K >= ps_bitstream->u4_max_strm_size) 16363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 16373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* return without corrupting the buffer beyond its size */ 16383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K return (IH264E_BITSTREAM_BUFFER_OVERFLOW); 16393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 16403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* mb header info */ 16413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_tpm = *pu1_byte++; 16423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 16433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cbp = *pu1_byte++; 16443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 16453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_qp_delta = *pu1_byte++; 16463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 16473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* mb type */ 16483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_type = mb_tpm & 0xF; 16493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 16503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_get_cabac_context(ps_ent_ctxt, mb_type); 16513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 16523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 16533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for header in bits */ 16543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 16553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_cbp_c = (cbp >> 4); 16563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_cbp_l = (cbp & 0xF); 16573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16) 16583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 16593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K luma_intra_mode = ((mb_tpm >> 4) & 3) + 1 + (u4_cbp_c << 2) 16603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + (u4_cbp_l == 15) * 12; 16613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 16623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 16633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 16643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K luma_intra_mode = 0; 16653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 16663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 16673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K chroma_intra_mode = (mb_tpm >> 6); 16683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 16693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode Intra pred mode, Luma */ 16703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_intra_mb_type(ISLICE, luma_intra_mode, ps_cabac_ctxt, 16713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K MB_TYPE_I_SLICE); 16723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 16733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I4x4) 16743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { /* Encode 4x4 MB modes */ 16753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, pu1_byte); 16763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count += 8; 16773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 16783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode chroma mode */ 16793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt); 16803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 16813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type != I16x16) 16823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { /* Encode MB cbp */ 16833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 16843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 16853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 16863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if ((cbp > 0) || (mb_type == I16x16)) 16873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 16883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode mb_qp_delta */ 16893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 16903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 16913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 16923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 16933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 16943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for residue */ 16953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = bitstream_end_offset; 16963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16) 16973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 16983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I16x16; 16993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_cbp = cbp; 17003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue_luma_dc(ps_ent_ctxt); 17013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_AC_CTXCAT); 17023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 17033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 17043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 17053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_cbp = cbp; 17063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = I4x4; 17073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I4x4; 17083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 17093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 17103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6; 17113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 17123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for reside in bits */ 17133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 17143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_residue_bits[0] += bitstream_end_offset 17153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 17163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 17173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 17183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 17193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp = 0; 17203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp = 0; 17213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 17223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 17233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 17243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 17253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 17263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 17273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 17283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 17293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Computing the number of used used for encoding the MB syntax */ 17303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 17313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_curr_ctxt->u1_mv, 0, 16); 17323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 17333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_cbp = cbp; 17343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count; 17353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16) 17363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 17373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I16x16; 17383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 17393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 17403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 17413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 17423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I4x4; 17433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 17443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 17453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K return IH264E_SUCCESS; 17463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 17473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 17483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 17493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 17503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 17513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 17523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * This function generates CABAC coded bit stream for Inter slices 17533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 17543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @description 17553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * The mb syntax layer for inter slices constitutes luma mb mode, mb qp delta, coded block pattern, chroma mb mode and 17563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * luma/chroma residue. These syntax elements are written as directed by table 17573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7.3.5 of h264 specification 17583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 17593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_ent_ctxt 17603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * pointer to entropy context 17613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 17623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns error code 17633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 17643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks none 17653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 17663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 17673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 17683749f6f435e79624f72841e866245d84195551cdHarinarayanan K KIH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt) 17693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 17703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* bit stream ptr */ 17713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm; 17723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CABAC context */ 17733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 17743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 17753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_curr_ctxt; 17763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 17773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 bitstream_start_offset, bitstream_end_offset; 17783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode; 17793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 mb_qp_delta; 17803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_cbp_l, u4_cbp_c; 17813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 byte_count = 0; 17823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; 17833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 17843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) 17853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K >= ps_bitstream->u4_max_strm_size) 17863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 17873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* return without corrupting the buffer beyond its size */ 17883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K return (IH264E_BITSTREAM_BUFFER_OVERFLOW); 17893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 17903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* mb header info */ 17913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_tpm = *pu1_byte++; 17923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 17933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 17943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* mb type */ 17953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_type = mb_tpm & 0xF; 17963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CABAC contexts for the MB */ 17973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_get_cabac_context(ps_ent_ctxt, mb_type); 17983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 17993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* if Intra MB */ 18013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16 || mb_type == I4x4) 18023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 18033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cbp = *pu1_byte++; 18043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 18053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_qp_delta = *pu1_byte++; 18063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 18073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for header in bits */ 18093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 18103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode mb_skip_flag */ 18123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE); 18133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_cbp_c = (cbp >> 4); 18143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_cbp_l = (cbp & 0xF); 18153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16) 18163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 18173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K luma_intra_mode = ((mb_tpm >> 4) & 3) + 1 + (u4_cbp_c << 2) 18183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + (u4_cbp_l == 15) * 12; 18193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 18203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 18213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 18223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K luma_intra_mode = 0; 18233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 18243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode intra mb type */ 18253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 18263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin(ps_cabac_ctxt, 18273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 1, 18283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 18293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + MB_TYPE_P_SLICE); 18303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_intra_mb_type(PSLICE, (UWORD8) luma_intra_mode, 18323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt, MB_TYPE_P_SLICE); 18333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 18343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I4x4) 18363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { /* Intra 4x4 modes */ 18373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, pu1_byte); 18383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count += 8; 18393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 18403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K chroma_intra_mode = (mb_tpm >> 6); 18413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt); 18433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type != I16x16) 18453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 18463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* encode CBP */ 18473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 18483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 18493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if ((cbp > 0) || (mb_type == I16x16)) 18513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 18523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 18533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 18553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 18563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 18573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 18583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for residue */ 18593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = bitstream_end_offset; 18603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding Residue */ 18623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16) 18633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 18643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I16x16; 18653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_cbp = (UWORD8) cbp; 18663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue_luma_dc(ps_ent_ctxt); 18673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_AC_CTXCAT); 18683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 18693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 18703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 18713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_cbp = (UWORD8) cbp; 18723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = I4x4; 18733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I4x4; 18743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 18753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 18763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6; 18773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 18783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for reside in bits */ 18803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 18813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_residue_bits[0] += bitstream_end_offset 18823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 18833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 18843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 18853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 18863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp = 0; 18873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp = 0; 18883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 18893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 18903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 18913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 18923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 18933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 18943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 18953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 18963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 18973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_curr_ctxt->u1_mv, 0, 16); 18983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 18993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_cbp = (UWORD8) cbp; 19003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16) 19023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I16x16; 19043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 19053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 19063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I4x4; 19083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 19093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count; 19113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K return IH264E_SUCCESS; 19133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 19143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else /* Inter MB */ 19153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for header in bits */ 19173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 19183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding P16x16 */ 19193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type != PSKIP) 19203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cbp = *pu1_byte++; 19223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 19233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_qp_delta = *pu1_byte++; 19243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 19253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding mb_skip */ 19273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE); 19283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding mb_type as P16x16 */ 19303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc_p; 19323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc_p = (0x010 + ((2) << 8)); 19333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(0, 3, u4_ctx_inc_p, 3, 19353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K &(ps_cabac_ctxt->au1_cabac_ctxt_table[MB_TYPE_P_SLICE]), 19363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 19373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 19383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_P; 19393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 *pi2_mv_ptr = (WORD16 *) pu1_byte; 19413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count += 4; 19423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = (ps_curr_ctxt->u1_mb_type 19433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K | CAB_NON_BD16x16); 19443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding motion vector for P16x16 */ 19453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mvds_p16x16(ps_cabac_ctxt, pi2_mv_ptr); 19463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 19473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode CBP */ 19483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 19493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (cbp) 19513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* encode mb_qp_delta */ 19533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 19543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 19553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 19573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 19583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 19593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 19603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for residue */ 19613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = bitstream_end_offset; 19623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 19643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else/* MB = PSKIP */ 19653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_skip(1, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE); 19673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_P_SKIP; 19693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K (*ps_ent_ctxt->pi4_mb_skip_run)++; 19703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_curr_ctxt->u1_mv, 0, 16); 19723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 19733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cbp = 0; 19743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 19763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 19773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 19783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 19793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for residue */ 19803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 19823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (cbp > 0) 19843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode residue */ 19863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 19873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for reside in bits */ 19883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 19893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_residue_bits[1] += bitstream_end_offset 19903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 19913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 19923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 19933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp &= 0x6; 19943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 19953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 19963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 19973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp = 0; 19983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp = 0; 19993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 20003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 20013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 20023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 20033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_intrapred_chroma_mode = 0; 20043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_cbp = cbp; 20053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count; 20063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K return IH264E_SUCCESS; 20073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 20083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 20093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/* ! < Table 9-37 � Binarization for macroblock types in B slices in ITU_T_H264-201402 20123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Bits 0-7 : binarised value 20133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * Bits 8-15: length of binary sequence */ 20143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20163749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic const UWORD32 u4_b_mb_type[27] = { 0x0100, 0x0301, 0x0305, 0x0603, 20173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0623, 0x0613, 0x0633, 0x060b, 20183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x062b, 0x061b, 0x063b, 0x061f, 20193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0707, 0x0747, 0x0727, 0x0767, 20203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0717, 0x0757, 0x0737, 0x0777, 20213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x070f, 0x074f, 0x063f }; 20223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/* CtxInc for mb types in B slices */ 20233749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kstatic const UWORD32 ui_b_mb_type_ctx_inc[27] = { 0x00, 0x0530, 0x0530, 20243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0555430, 0x0555430, 20253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0555430, 0x0555430, 20263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0555430, 0x0555430, 20273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0555430, 0x0555430, 20283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x0555430, 0x05555430, 20293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x05555430, 0x05555430, 20303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x05555430, 0x05555430, 20313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x05555430, 0x05555430, 20323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x05555430, 0x05555430, 20333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0x05555430, 0x0555430 }; 20343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/** 20363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 20373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 20383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @brief 20393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * This function generates CABAC coded bit stream for B slices 20403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 20413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @description 20423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * The mb syntax layer for inter slices constitutes luma mb mode, 20433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * mb qp delta, coded block pattern, chroma mb mode and 20443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * luma/chroma residue. These syntax elements are written as directed by table 20453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 7.3.5 of h264 specification 20463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 20473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @param[in] ps_ent_ctxt 20483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * pointer to entropy context 20493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 20503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @returns error code 20513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 20523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * @remarks none 20533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K * 20543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ******************************************************************************* 20553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */ 20563749f6f435e79624f72841e866245d84195551cdHarinarayanan K KIH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt) 20573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{ 20583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* bit stream ptr */ 20593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm; 20603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CABAC context */ 20613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; 20623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_curr_ctxt; 20643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 bitstream_start_offset, bitstream_end_offset; 20663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode; 20673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD8 mb_qp_delta; 20683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_cbp_l, u4_cbp_c; 20693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 byte_count = 0; 20703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; 20713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) 20733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K >= ps_bitstream->u4_max_strm_size) 20743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 20753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* return without corrupting the buffer beyond its size */ 20763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K return (IH264E_BITSTREAM_BUFFER_OVERFLOW); 20773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 20783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* mb header info */ 20793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_tpm = *pu1_byte++; 20803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 20813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* mb type */ 20833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_type = mb_tpm & 0xF; 20843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* CABAC contexts for the MB */ 20853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_get_cabac_context(ps_ent_ctxt, mb_type); 20863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info; 20873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* if Intra MB */ 20893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16 || mb_type == I4x4) 20903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 20913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cbp = *pu1_byte++; 20923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 20933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_qp_delta = *pu1_byte++; 20943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 20953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for header in bits */ 20973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 20983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 20993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode mb_skip_flag */ 21003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); 21013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_cbp_c = (cbp >> 4); 21023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_cbp_l = (cbp & 0xF); 21033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16) 21043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 21053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K luma_intra_mode = ((mb_tpm >> 4) & 3) + 1 + (u4_cbp_c << 2) 21063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + (u4_cbp_l == 15) * 12; 21073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 21083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 21093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 21103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K luma_intra_mode = 0; 21113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 21123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode intra mb type */ 21133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 21143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info; 21153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 21163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc = 0; 21173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 21193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc += ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) 21203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K != CAB_BD16x16) ? 1 : 0; 21213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 21223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc += ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) 21233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K != CAB_BD16x16) ? 1 : 0; 21243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Intra Prefix Only "111101" */ 21263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = (u4_ctx_inc | 0x05555430); 21273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(0x2f, 21283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 6, 21293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 21303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 3, 21313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 21323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + MB_TYPE_B_SLICE, 21333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 21343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_intra_mb_type(BSLICE, (UWORD8) luma_intra_mode, 21363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt, MB_TYPE_B_SLICE); 21373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 21393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I4x4) 21413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { /* Intra 4x4 modes */ 21423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, pu1_byte); 21433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count += 8; 21443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 21453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K chroma_intra_mode = (mb_tpm >> 6); 21463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt); 21483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type != I16x16) 21503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 21513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* encode CBP */ 21523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 21533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 21543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if ((cbp > 0) || (mb_type == I16x16)) 21563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 21573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 21583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 21603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 21613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 21623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 21633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for residue */ 21643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = bitstream_end_offset; 21653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding Residue */ 21673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16) 21683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 21693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I16x16; 21703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_cbp = (UWORD8) cbp; 21713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue_luma_dc(ps_ent_ctxt); 21723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_AC_CTXCAT); 21733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 21743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 21753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 21763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_cbp = (UWORD8) cbp; 21773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = I4x4; 21783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I4x4; 21793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 21803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 21813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6; 21823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 21833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 21843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for reside in bits */ 21853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 21863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_residue_bits[0] += bitstream_end_offset 21873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 21883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 21893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 21903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 21913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp = 0; 21923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp = 0; 21933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 21943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 21953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 21963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 21973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 21983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset 21993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 22003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 22013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_curr_ctxt->u1_mv, 0, 16); 22033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 22043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_cbp = (UWORD8) cbp; 22053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == I16x16) 22073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 22083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I16x16; 22093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 22103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 22113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 22123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_I4x4; 22133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 22143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count; 22163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K return IH264E_SUCCESS; 22183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 22193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else /* Inter MB */ 22213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 22223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for header in bits */ 22233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = GET_NUM_BITS(ps_bitstream); 22243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding B_Direct_16x16 */ 22253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (mb_type == BDIRECT) 22263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 22273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cbp = *pu1_byte++; 22283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 22293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_qp_delta = *pu1_byte++; 22303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 22313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding mb_skip */ 22333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); 22343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding mb_type as B_Direct_16x16 */ 22363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 22373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_left_ctxt = 22393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->ps_left_ctxt_mb_info; 22403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 22413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc = 0; 22423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 22443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc += ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) 22453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K != CAB_BD16x16) ? 1 : 0; 22463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 22473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc += ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) 22483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K != CAB_BD16x16) ? 1 : 0; 22493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode the bin */ 22503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_bin( 22513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt, 22523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 0, 22533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->au1_cabac_ctxt_table 22543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + MB_TYPE_B_SLICE + u4_ctx_inc); 22553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 22573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_BD16x16; 22583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_curr_ctxt->u1_mv, 0, 16); 22593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 22603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode CBP */ 22623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 22633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (cbp) 22653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 22663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* encode mb_qp_delta */ 22673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 22683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 22693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 22713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 22723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 22733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 22743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for residue */ 22753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = bitstream_end_offset; 22763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for residue */ 22773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 22793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else if (mb_type == BSKIP)/* MB = BSKIP */ 22813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 22823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_skip(1, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); 22833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_B_SKIP; 22853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_curr_ctxt->u1_mv, 0, 16); 22873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); 22883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cbp = 0; 22893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 22913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 22923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 22933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 22943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for residue */ 22953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 22973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 22983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else /* mbype is B_L0_16x16, B_L1_16x16 or B_Bi_16x16 */ 22993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 23003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD32 i4_mb_part_pred_mode = (mb_tpm >> 4); 23013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_mb_type = mb_type - B16x16 + B_L0_16x16 23023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K + i4_mb_part_pred_mode; 23033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K cbp = *pu1_byte++; 23043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 23053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_qp_delta = *pu1_byte++; 23063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count++; 23073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding mb_skip */ 23093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); 23103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding mb_type as B16x16 */ 23123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 23133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_left_ctxt = 23143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->ps_left_ctxt_mb_info; 23153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info; 23163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_ctx_inc = 0; 23173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_mb_type_bins = u4_b_mb_type[u4_mb_type]; 23193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K UWORD32 u4_bin_len = (u4_mb_type_bins >> 8) & 0x0F; 23203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_mb_type_bins = u4_mb_type_bins & 0xFF; 23213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 23233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc += ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) 23243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K != CAB_BD16x16) ? 1 : 0; 23253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info) 23263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc += ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) 23273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K != CAB_BD16x16) ? 1 : 0; 23283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc = u4_ctx_inc | ui_b_mb_type_ctx_inc[u4_mb_type]; 23303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_encode_decision_bins(u4_mb_type_bins, 23323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bin_len, 23333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_ctx_inc, 23343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K u4_bin_len, 23353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K &(ps_cabac_ctxt->au1_cabac_ctxt_table[MB_TYPE_B_SLICE]), 23363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt); 23373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 23383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = CAB_NON_BD16x16; 23403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 23413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K WORD16 *pi2_mv_ptr = (WORD16 *) pu1_byte; 23423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Get the pred modes */ 23433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K byte_count += 4 * (1 + (i4_mb_part_pred_mode == PRED_BI)); 23453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_mb_type = (ps_curr_ctxt->u1_mb_type 23473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K | CAB_NON_BD16x16); 23483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encoding motion vector for B16x16 */ 23493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mvds_b16x16(ps_cabac_ctxt, pi2_mv_ptr, 23503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K i4_mb_part_pred_mode); 23513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 23523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode CBP */ 23533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_cbp(cbp, ps_cabac_ctxt); 23543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (cbp) 23563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 23573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* encode mb_qp_delta */ 23583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt); 23593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 23603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for header in bits */ 23623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 23633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_header_bits[1] += bitstream_end_offset 23643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 23653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Starting bitstream offset for residue */ 23663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_start_offset = bitstream_end_offset; 23673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 23683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (cbp > 0) 23703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 23713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Encode residue */ 23723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ih264e_cabac_encode_residue(ps_ent_ctxt, cbp, LUMA_4X4_CTXCAT); 23733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Ending bitstream offset for reside in bits */ 23743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K bitstream_end_offset = GET_NUM_BITS(ps_bitstream); 23753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->u4_residue_bits[1] += bitstream_end_offset 23763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K - bitstream_start_offset; 23773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K 23783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6; 23793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp &= 0x6; 23803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 23813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K else 23823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K { 23833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_ac_csbp = 0; 23843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_yuv_dc_csbp = 0; 23853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_uv_ac_csbp) = 0; 23863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_y_ac_csbp) = 0; 23873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *(ps_cabac_ctxt->pu1_left_yuv_dc_csbp) = 0; 23883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 23893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_intrapred_chroma_mode = 0; 23903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_curr_ctxt->u1_cbp = cbp; 23913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count; 23923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K return IH264E_SUCCESS; 23933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K } 23943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K} 2395