10d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/****************************************************************************** 20d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* 30d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore 40d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* 50d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* Licensed under the Apache License, Version 2.0 (the "License"); 60d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* you may not use this file except in compliance with the License. 70d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* You may obtain a copy of the License at: 80d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* 90d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* http://www.apache.org/licenses/LICENSE-2.0 100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* 110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* Unless required by applicable law or agreed to in writing, software 120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* distributed under the License is distributed on an "AS IS" BASIS, 130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* See the License for the specific language governing permissions and 150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* limitations under the License. 160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* 170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar******************************************************************************/ 180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/** 190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ******************************************************************************* 200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @file 210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * ihevcd_iquant_itrans_recon_ctb.c 220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @brief 240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * Contains functions for inverse quantization, inverse transform and recon 250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @author 270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * Ittiam 280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @par List of Functions: 300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * - ihevcd_iquant_itrans_recon_ctb() 310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @remarks 330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * None 340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ******************************************************************************* 360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */ 370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/*****************************************************************************/ 380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* File Includes */ 390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/*****************************************************************************/ 400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <stdio.h> 410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <stddef.h> 420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <stdlib.h> 430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <string.h> 440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_typedefs.h" 460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "iv.h" 470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ivd.h" 480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_cxa.h" 490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_defs.h" 510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_debug.h" 520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_structs.h" 530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_cabac_tables.h" 540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_macros.h" 550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_platform_macros.h" 560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_defs.h" 580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_function_selector.h" 590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_structs.h" 600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_error.h" 610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_bitstream.h" 620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_common_tables.h" 630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* Intra pred includes */ 650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_intra_pred.h" 660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* Inverse transform common module includes */ 680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_trans_tables.h" 690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_trans_macros.h" 700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_itrans_recon.h" 710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_recon.h" 720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_chroma_itrans_recon.h" 730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_chroma_recon.h" 740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* Decoder includes */ 760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_common_tables.h" 770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_iquant_itrans_recon_ctb.h" 780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_debug.h" 790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_profile.h" 800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_statistics.h" 810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_itrans_recon_dc.h" 820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 83221aaccb7a9b501ce16ccc1fd7f7d44a8f73cd6eNaveen Kumar Ponnusamystatic const UWORD32 gau4_ihevcd_4_bit_reverse[] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 }; 840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* Globals */ 87221aaccb7a9b501ce16ccc1fd7f7d44a8f73cd6eNaveen Kumar Ponnusamystatic const WORD32 g_i4_ip_funcs[MAX_NUM_IP_MODES] = 880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { IP_FUNC_MODE_0, /* Mode 0 */ 890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_1, /* Mode 1 */ 900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_2, /* Mode 2 */ 910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_3TO9, /* Mode 3 */ 920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_3TO9, /* Mode 4 */ 930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_3TO9, /* Mode 5 */ 940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_3TO9, /* Mode 6 */ 950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_3TO9, /* Mode 7 */ 960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_3TO9, /* Mode 8 */ 970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_3TO9, /* Mode 9 */ 980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_10, /* Mode 10 */ 990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_11TO17, /* Mode 11 */ 1000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_11TO17, /* Mode 12 */ 1010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_11TO17, /* Mode 13 */ 1020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_11TO17, /* Mode 14 */ 1030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_11TO17, /* Mode 15 */ 1040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_11TO17, /* Mode 16 */ 1050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_11TO17, /* Mode 17 */ 1060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_18_34, /* Mode 18 */ 1070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_19TO25, /* Mode 19 */ 1080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_19TO25, /* Mode 20 */ 1090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_19TO25, /* Mode 21 */ 1100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_19TO25, /* Mode 22 */ 1110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_19TO25, /* Mode 23 */ 1120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_19TO25, /* Mode 24 */ 1130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_19TO25, /* Mode 25 */ 1140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_26, /* Mode 26 */ 1150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_27TO33, /* Mode 27 */ 1160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_27TO33, /* Mode 26 */ 1170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_27TO33, /* Mode 29 */ 1180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_27TO33, /* Mode 30 */ 1190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_27TO33, /* Mode 31 */ 1200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_27TO33, /* Mode 32 */ 1210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_27TO33, /* Mode 33 */ 1220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IP_FUNC_MODE_18_34, /* Mode 34 */ 1230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}; 1240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarconst WORD16 *g_ai2_ihevc_trans_tables[] = 1270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { &g_ai2_ihevc_trans_dst_4[0][0], 1280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar &g_ai2_ihevc_trans_4[0][0], 1290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar &g_ai2_ihevc_trans_8[0][0], 1300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar &g_ai2_ihevc_trans_16[0][0], 1310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar &g_ai2_ihevc_trans_32[0][0] 1320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}; 1330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/*****************************************************************************/ 1360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* Function Prototypes */ 1370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/*****************************************************************************/ 1380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* Returns number of ai2_level read from ps_sblk_coeff */ 1390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish MahendrakarUWORD8* ihevcd_unpack_coeffs(WORD16 *pi2_tu_coeff, 1400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 log2_trans_size, 1410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_tu_coeff_data, 1420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 *pi2_dequant_matrix, 1430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 qp_rem, 1440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 qp_div, 1450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar TRANSFORM_TYPE e_trans_type, 1460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 trans_quant_bypass, 1470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 *pu4_zero_cols, 1480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 *pu4_zero_rows, 1490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 *pu4_coeff_type, 1500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 *pi2_coeff_value) 1510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{ 1520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Generating coeffs from coeff-map */ 1530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 i; 1540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 *pi2_sblk_ptr; 1550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 subblk_pos_x, subblk_pos_y; 1560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 sblk_scan_idx, coeff_raster_idx; 1570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 sblk_non_zero_coeff_idx; 1580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_sblk_coeff_data_t *ps_tu_sblk_coeff_data; 1590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 u1_num_coded_sblks, u1_scan_type; 1600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_new_tu_coeff_data; 1610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 trans_size; 1620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 xs, ys; 1630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 trans_skip; 1640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 iquant_out; 1650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 shift_iq; 1660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 1670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 bit_depth; 1680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar bit_depth = 8 + 0; 1700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar shift_iq = bit_depth + log2_trans_size - 5; 1710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 1720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar trans_size = (1 << log2_trans_size); 1730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* First byte points to number of coded blocks */ 1750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_num_coded_sblks = *pu1_tu_coeff_data++; 1760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Next byte points to scan type */ 1780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_scan_type = *pu1_tu_coeff_data++; 1790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* 0th bit has trans_skip */ 1800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar trans_skip = u1_scan_type & 1; 1810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_scan_type >>= 1; 1820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_sblk_ptr = pi2_tu_coeff; 1840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Initially all columns are assumed to be zero */ 1860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pu4_zero_cols = 0xFFFFFFFF; 1870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Initially all rows are assumed to be zero */ 1880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pu4_zero_rows = 0xFFFFFFFF; 1890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu_sblk_coeff_data = (tu_sblk_coeff_data_t *)(pu1_tu_coeff_data); 1910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(trans_skip) 1930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar memset(pi2_tu_coeff, 0, trans_size * trans_size * sizeof(WORD16)); 1940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_INIT_SBLK_AND_COEFF_POS(); 1960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* DC only case */ 1980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if((e_trans_type != DST_4x4) && (1 == u1_num_coded_sblks) 1990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar && (0 == ps_tu_sblk_coeff_data->u2_subblk_pos) 2000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar && (1 == ps_tu_sblk_coeff_data->u2_sig_coeff_map)) 2010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pu4_coeff_type = 1; 2030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(!trans_quant_bypass) 2050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(4 == trans_size) 2070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IQUANT_4x4(iquant_out, 2090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu_sblk_coeff_data->ai2_level[0], 2100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_dequant_matrix[0] 2110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * g_ihevc_iquant_scales[qp_rem], 2120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar shift_iq, qp_div); 2130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 2140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 2150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IQUANT(iquant_out, ps_tu_sblk_coeff_data->ai2_level[0], 2170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_dequant_matrix[0] * g_ihevc_iquant_scales[qp_rem], 2180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar shift_iq, qp_div); 2190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 2200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(trans_skip) 2210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar iquant_out = (iquant_out + 16) >> 5; 2220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 2230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 2240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* setting the column to zero */ 2260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i = 0; i < trans_size; i++) 2270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *(pi2_tu_coeff + i * trans_size) = 0; 2280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar iquant_out = ps_tu_sblk_coeff_data->ai2_level[0]; 2300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 2310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pi2_coeff_value = iquant_out; 2320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pi2_tu_coeff = iquant_out; 2330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pu4_zero_cols &= ~0x1; 2340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pu4_zero_rows &= ~0x1; 2350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu_sblk_coeff_data = 2360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar (void *)&ps_tu_sblk_coeff_data->ai2_level[1]; 2370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_UPDATE_COEFF_COUNT(); 2390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_LAST_SBLK_POS_UPDATE(e_trans_type, (trans_skip || trans_quant_bypass), 0, 0); 2400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_UPDATE_SBLK_AND_COEFF_HISTOGRAM(e_trans_type, (trans_quant_bypass || trans_skip)); 2410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar return ((UWORD8 *)ps_tu_sblk_coeff_data); 2420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 2430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 2440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pu4_coeff_type = 0; 2460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* In case of trans skip, memset has already happened */ 2470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(!trans_skip) 2480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar memset(pi2_tu_coeff, 0, trans_size * trans_size * sizeof(WORD16)); 2490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 2500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i = 0; i < u1_num_coded_sblks; i++) 2520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 u4_sig_coeff_map; 2540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar subblk_pos_x = ps_tu_sblk_coeff_data->u2_subblk_pos & 0x00FF; 2550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar subblk_pos_y = (ps_tu_sblk_coeff_data->u2_subblk_pos & 0xFF00) >> 8; 2560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_LAST_SBLK_POS_UPDATE(e_trans_type, (trans_skip || trans_quant_bypass), subblk_pos_x, subblk_pos_y); 2580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar subblk_pos_x = subblk_pos_x * MIN_TU_SIZE; 2600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar subblk_pos_y = subblk_pos_y * MIN_TU_SIZE; 2610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_sblk_ptr = pi2_tu_coeff + subblk_pos_y * trans_size 2630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + subblk_pos_x; 2640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar //*pu4_zero_cols &= ~(0xF << subblk_pos_x); 2660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar sblk_non_zero_coeff_idx = 0; 2680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u4_sig_coeff_map = ps_tu_sblk_coeff_data->u2_sig_coeff_map; 2690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar //for(sblk_scan_idx = (31 - CLZ(u4_sig_coeff_map)); sblk_scan_idx >= 0; sblk_scan_idx--) 2700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar sblk_scan_idx = 31; 2710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar do 2720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 clz = CLZ(u4_sig_coeff_map); 2740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar sblk_scan_idx -= clz; 2760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* when clz is 31, u4_sig_coeff_map << (clz+1) might result in unknown behaviour in some cases */ 2770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Hence either use SHL which takes care of handling these issues based on platform or shift in two stages */ 2780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u4_sig_coeff_map = u4_sig_coeff_map << clz; 2790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Copying coeffs and storing in reverse order */ 2800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_UPDATE_COEFF_COUNT(); 2820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar coeff_raster_idx = 2830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar gau1_ihevc_invscan4x4[u1_scan_type][sblk_scan_idx]; 2840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar xs = coeff_raster_idx & 0x3; 2860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ys = coeff_raster_idx >> 2; 2870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 2880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(!trans_quant_bypass) 2890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(4 == trans_size) 2910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 2920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IQUANT_4x4(iquant_out, 2930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu_sblk_coeff_data->ai2_level[sblk_non_zero_coeff_idx], 2940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_dequant_matrix[(subblk_pos_x + xs) 2950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + (subblk_pos_y + ys) 2960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * trans_size] 2970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * g_ihevc_iquant_scales[qp_rem], 2980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar shift_iq, qp_div); 2990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar sblk_non_zero_coeff_idx++; 3000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 3010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 3020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 3030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar IQUANT(iquant_out, 3040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu_sblk_coeff_data->ai2_level[sblk_non_zero_coeff_idx], 3050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_dequant_matrix[(subblk_pos_x + xs) 3060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + (subblk_pos_y + ys) 3070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * trans_size] 3080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * g_ihevc_iquant_scales[qp_rem], 3090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar shift_iq, qp_div); 3100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar sblk_non_zero_coeff_idx++; 3110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 3120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(trans_skip) 3140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar iquant_out = (iquant_out + 16) >> 5; 3150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 3160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 3170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 3180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar iquant_out = ps_tu_sblk_coeff_data->ai2_level[sblk_non_zero_coeff_idx++]; 3190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 3200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pu4_zero_cols &= ~(0x1 << (subblk_pos_x + xs)); 3210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *pu4_zero_rows &= ~(0x1 << (subblk_pos_y + ys)); 3220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *(pi2_sblk_ptr + xs + ys * trans_size) = iquant_out; 3230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 3240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar sblk_scan_idx--; 3250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u4_sig_coeff_map <<= 1; 3260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar }while(u4_sig_coeff_map); 3280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Updating the sblk pointer */ 3290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu_sblk_coeff_data = 3300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar (void *)&ps_tu_sblk_coeff_data->ai2_level[sblk_non_zero_coeff_idx]; 3310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 3320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_UPDATE_SBLK_AND_COEFF_HISTOGRAM(e_trans_type, (trans_quant_bypass || trans_skip)); 3340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_new_tu_coeff_data = (UWORD8 *)ps_tu_sblk_coeff_data; 3360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar return pu1_new_tu_coeff_data; 3380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar} 3390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish MahendrakarWORD32 ihevcd_get_intra_nbr_flag(process_ctxt_t *ps_proc, 3410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_t *ps_tu, 3420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 *pu4_intra_nbr_avail, 3430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 i2_pic_width_in_luma_samples, 3440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 i1_constrained_intra_pred_flag, 3450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 trans_size, 3460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 ctb_size) 3470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{ 3480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar sps_t *ps_sps; 3490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 u1_bot_lt_avail, u1_left_avail, u1_top_avail, u1_top_rt_avail, 3500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_top_lt_avail; 3510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 x_cur, y_cur, x_nbr, y_nbr; 3520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_nbr_intra_flag; 3530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_pic_intra_flag; 3540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 top_right, top, top_left, left, bot_left; 3550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 intra_pos; 3560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 num_8_blks, num_8_blks_in_bits; 3570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 numbytes_row = (i2_pic_width_in_luma_samples + 63) / 64; 3580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 cur_x, cur_y; 3590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 i; 3600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 nbr_flags; 3610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_sps = ps_proc->ps_sps; 3630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar cur_x = ps_tu->b4_pos_x; 3640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar cur_y = ps_tu->b4_pos_y; 3650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_bot_lt_avail = (pu4_intra_nbr_avail[1 + cur_y + trans_size / MIN_TU_SIZE] 3670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar >> (31 - (1 + cur_x - 1))) & 1; 3680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_left_avail = (pu4_intra_nbr_avail[1 + cur_y] >> (31 - (1 + cur_x - 1))) 3690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar & 1; 3700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_top_avail = (pu4_intra_nbr_avail[1 + cur_y - 1] >> (31 - (1 + cur_x))) 3710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar & 1; 3720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_top_rt_avail = (pu4_intra_nbr_avail[1 + cur_y - 1] 3730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar >> (31 - (1 + cur_x + trans_size / MIN_TU_SIZE))) & 1; 3740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_top_lt_avail = (pu4_intra_nbr_avail[1 + cur_y - 1] 3750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar >> (31 - (1 + cur_x - 1))) & 1; 3760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar x_cur = ps_proc->i4_ctb_x * ctb_size + cur_x * MIN_TU_SIZE; 3780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar y_cur = ps_proc->i4_ctb_y * ctb_size + cur_y * MIN_TU_SIZE; 3790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_pic_intra_flag = ps_proc->pu1_pic_intra_flag; 3810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* WORD32 nbr_flags as below MSB --> LSB */ 3830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Top-Left | Top-Right | Top | Left | Bottom-Left 3840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 1 4 4 4 4 3850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */ 3860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar bot_left = 0; 3870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar left = 0; 3880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_right = 0; 3890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top = 0; 3900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_left = 0; 3910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar num_8_blks = trans_size > 4 ? trans_size / 8 : 1; 3930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar num_8_blks_in_bits = ((1 << num_8_blks) - 1); 3940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 3950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(i1_constrained_intra_pred_flag) 3960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 3970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* TODO: constrained intra pred not tested */ 3980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_bot_lt_avail) 3990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar x_nbr = x_cur - 1; 4010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar y_nbr = y_cur + trans_size; 4020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_nbr_intra_flag = pu1_pic_intra_flag + y_nbr / 8 * numbytes_row 4040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + x_nbr / 64; 4050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar intra_pos = ((x_nbr / 8) % 8); 4060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i = 0; i < num_8_blks; i++) 4070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar bot_left |= ((*(pu1_nbr_intra_flag + i * numbytes_row) 4090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar >> intra_pos) & 1) << i; 4100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar bot_left &= num_8_blks_in_bits; 4120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_left_avail) 4140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar x_nbr = x_cur - 1; 4160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar y_nbr = y_cur; 4170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_nbr_intra_flag = pu1_pic_intra_flag + y_nbr / 8 * numbytes_row 4190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + x_nbr / 64; 4200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar intra_pos = ((x_nbr / 8) % 8); 4210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i = 0; i < num_8_blks; i++) 4230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar left |= ((*(pu1_nbr_intra_flag + i * numbytes_row) >> intra_pos) 4250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar & 1) << i; 4260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar left &= num_8_blks_in_bits; 4280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_top_avail) 4300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar x_nbr = x_cur; 4320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar y_nbr = y_cur - 1; 4330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_nbr_intra_flag = pu1_pic_intra_flag + y_nbr / 8 * numbytes_row 4350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + x_nbr / 64; 4360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar intra_pos = ((x_nbr / 8) % 8); 4370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top = (*pu1_nbr_intra_flag >> intra_pos); 4390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top &= num_8_blks_in_bits; 4400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* 4410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i=0;i<num_8_blks;i++) 4420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top |= ( (*pu1_nbr_intra_flag >> (intra_pos+i)) & 1) << i; 4440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */ 4460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_top_rt_avail) 4480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar x_nbr = x_cur + trans_size; 4500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar y_nbr = y_cur - 1; 4510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_nbr_intra_flag = pu1_pic_intra_flag + y_nbr / 8 * numbytes_row 4530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + x_nbr / 64; 4540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar intra_pos = ((x_nbr / 8) % 8); 4550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_right = (*pu1_nbr_intra_flag >> intra_pos); 4570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_right &= num_8_blks_in_bits; 4580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* 4590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i=0;i<num_8_blks;i++) 4600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_right |= ( (*pu1_nbr_intra_flag >> (intra_pos+i)) & 1) << i; 4620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */ 4640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_top_lt_avail) 4660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar x_nbr = x_cur - 1; 4680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar y_nbr = y_cur - 1; 4690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_nbr_intra_flag = pu1_pic_intra_flag + y_nbr / 8 * numbytes_row 4710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + x_nbr / 64; 4720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar intra_pos = ((x_nbr / 8) % 8); 4730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_left = (*pu1_nbr_intra_flag >> intra_pos) & 1; 4750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 4780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_top_avail) 4800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top = 0xF; 4810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_top_rt_avail) 4820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_right = 0xF; 4830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_bot_lt_avail) 4840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar bot_left = 0xF; 4850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_left_avail) 4860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar left = 0xF; 4870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_top_lt_avail) 4880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_left = 0x1; 4890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 4900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 4910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Handling incomplete CTBs */ 4920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 4930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 pu_size_limit = MIN(trans_size, 8); 4940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 cols_remaining = ps_sps->i2_pic_width_in_luma_samples 4950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar - (ps_proc->i4_ctb_x << ps_sps->i1_log2_ctb_size) 4960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar - (ps_tu->b4_pos_x * MIN_TU_SIZE) 4970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar - (1 << (ps_tu->b3_size + 2)); 4980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* ctb_size_top gives number of valid pixels remaining in the current row */ 4990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 ctb_size_top = MIN(ctb_size, cols_remaining); 5000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 ctb_size_top_bits = (1 << (ctb_size_top / pu_size_limit)) - 1; 5010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 rows_remaining = ps_sps->i2_pic_height_in_luma_samples 5030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar - (ps_proc->i4_ctb_y << ps_sps->i1_log2_ctb_size) 5040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar - (ps_tu->b4_pos_y * MIN_TU_SIZE) 5050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar - (1 << (ps_tu->b3_size + 2)); 5060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* ctb_size_bot gives number of valid pixels remaining in the current column */ 5070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 ctb_size_bot = MIN(ctb_size, rows_remaining); 5080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 ctb_size_bot_bits = (1 << (ctb_size_bot / pu_size_limit)) - 1; 5090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_right &= ctb_size_top_bits; 5110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar bot_left &= ctb_size_bot_bits; 5120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 5130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Top-Left | Top-Right | Top | Left | Bottom-Left 5150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 1 4 4 4 4 5160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */ 5170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* 5190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar nbr_flags = (top_left << 16) | (gau4_ihevcd_4_bit_reverse[top_right] << 12) | (gau4_ihevcd_4_bit_reverse[top] << 8) | (gau4_ihevcd_4_bit_reverse[left] << 4) 5200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar | gau4_ihevcd_4_bit_reverse[bot_left]; 5210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */ 5220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar nbr_flags = (top_left << 16) | (top_right << 12) | (top << 8) | (gau4_ihevcd_4_bit_reverse[left] << 4) 5230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar | gau4_ihevcd_4_bit_reverse[bot_left]; 5240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar return nbr_flags; 5270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar} 5290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish MahendrakarWORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc) 5310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{ 5320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 *pi2_scaling_mat; 5330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_y_dst_ctb; 5340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_uv_dst_ctb; 5350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 ctb_size; 5360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar codec_t *ps_codec; 5370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar slice_header_t *ps_slice_hdr; 5380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_t *ps_tu; 5390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 *pi2_ctb_coeff; 5400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 tu_cnt; 5410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 *pi2_tu_coeff; 5420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 *pi2_tmp; 5430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 pic_strd; 5440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 luma_nbr_flags; 5450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 chroma_nbr_flags = 0; 5460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 u1_luma_pred_mode_first_tu = 0; 5470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Pointers for generating 2d coeffs from coeff-map */ 5480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_tu_coeff_data; 5490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* nbr avail map for CTB */ 5500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* 1st bit points to neighbor (left/top_left/bot_left) */ 5510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* 1Tb starts at 2nd bit from msb of 2nd value in array, followed by number of min_tu's in that ctb */ 5520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 au4_intra_nbr_avail[MAX_CTB_SIZE / MIN_TU_SIZE 5530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + 2 /* Top nbr + bot nbr */]; UWORD32 5540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_avail_bits; 5550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar sps_t *ps_sps; 5560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pps_t *ps_pps; 5570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 intra_flag; 5580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_pic_intra_flag; 5590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /*************************************************************************/ 5600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Contanis scaling matrix offset in the following order in a 1D buffer */ 5610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Intra 4 x 4 Y, 4 x 4 U, 4 x 4 V */ 5620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Inter 4 x 4 Y, 4 x 4 U, 4 x 4 V */ 5630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Intra 8 x 8 Y, 8 x 8 U, 8 x 8 V */ 5640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Inter 8 x 8 Y, 8 x 8 U, 8 x 8 V */ 5650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Intra 16x16 Y, 16x16 U, 16x16 V */ 5660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Inter 16x16 Y, 16x16 U, 16x16 V */ 5670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Intra 32x32 Y */ 5680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Inter 32x32 Y */ 5690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /*************************************************************************/ 5704def2dfabf8afcb185942131c1e67bb3ff211f05Harish Mahendrakar /* Only first 20 entries are used. Array is extended to avoid out of bound 5714def2dfabf8afcb185942131c1e67bb3ff211f05Harish Mahendrakar reads. Skip CUs (64x64) read this table, but don't really use the value */ 5724def2dfabf8afcb185942131c1e67bb3ff211f05Harish Mahendrakar static const WORD32 scaling_mat_offset[] = 5730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 0, 16, 32, 48, 64, 80, 96, 160, 224, 288, 352, 416, 480, 736, 992, 5744def2dfabf8afcb185942131c1e67bb3ff211f05Harish Mahendrakar 1248, 1504, 1760, 2016, 3040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 5750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar PROFILE_DISABLE_IQ_IT_RECON_INTRA_PRED(); 5770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_sps = ps_proc->ps_sps; 5790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_pps = ps_proc->ps_pps; 5800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_slice_hdr = ps_proc->ps_slice_hdr; 5810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec = ps_proc->ps_codec; 5820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_y_dst_ctb = ps_proc->pu1_cur_ctb_luma; 5840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_uv_dst_ctb = ps_proc->pu1_cur_ctb_chroma; 5850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_ctb_coeff = ps_proc->pi2_invscan_out; 5870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ctb_size = (1 << ps_sps->i1_log2_ctb_size); 5890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data = (UWORD8 *)ps_proc->pv_tu_coeff_data; 5900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pic_strd = ps_codec->i4_strd; 5920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_tmp = ps_proc->pi2_itrans_intrmd_buf; 5940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_tu_coeff = pi2_ctb_coeff; 5960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu = ps_proc->ps_tu; 5980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 5990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if((1 == ps_sps->i1_scaling_list_enable_flag) && (1 == ps_pps->i1_pps_scaling_list_data_present_flag)) 6000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 6010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_scaling_mat = ps_pps->pi2_scaling_mat; 6020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 6030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 6040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 6050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_scaling_mat = ps_sps->pi2_scaling_mat; 6060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 6070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 6090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Updating the initial availability map */ 6100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 i; 6110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 u1_left_ctb_avail, u1_top_lt_ctb_avail, u1_top_rt_ctb_avail, 6120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_top_ctb_avail; 6130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_left_ctb_avail = ps_proc->u1_left_ctb_avail; 6150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_top_lt_ctb_avail = ps_proc->u1_top_lt_ctb_avail; 6160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_top_ctb_avail = ps_proc->u1_top_ctb_avail; 6170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_top_rt_ctb_avail = ps_proc->u1_top_rt_ctb_avail; 6180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Initializing the availability array */ 6200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar memset(au4_intra_nbr_avail, 0, 6210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar (MAX_CTB_SIZE / MIN_TU_SIZE + 2) * sizeof(UWORD32)); 6220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Initializing the availability array with CTB level availability flags */ 6230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 6240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 rows_remaining = ps_sps->i2_pic_height_in_luma_samples - (ps_proc->i4_ctb_y << ps_sps->i1_log2_ctb_size); 6250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 ctb_size_left = MIN(ctb_size, rows_remaining); 6260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i = 0; i < ctb_size_left / MIN_TU_SIZE; i++) 6270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 6280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar au4_intra_nbr_avail[i + 1] = ((UWORD32)u1_left_ctb_avail << 31); 6290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 6300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 6310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar au4_intra_nbr_avail[0] |= (((UWORD32)u1_top_rt_ctb_avail << 31) 6320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar >> (1 + ctb_size / MIN_TU_SIZE)); /* 1+ctb_size/4 position bit pos from msb */ 6330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar au4_intra_nbr_avail[0] |= ((UWORD32)u1_top_lt_ctb_avail << 31); 6350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 6370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 cols_remaining = ps_sps->i2_pic_width_in_luma_samples - (ps_proc->i4_ctb_x << ps_sps->i1_log2_ctb_size); 6380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 ctb_size_top = MIN(ctb_size, cols_remaining); 6390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 shift = (31 - (ctb_size / MIN_TU_SIZE)); 6400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* ctb_size_top gives number of valid pixels remaining in the current row */ 6420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Since we need pattern of 1's starting from the MSB, an additional shift */ 6430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* is needed */ 6440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar shift += ((ctb_size - ctb_size_top) / MIN_TU_SIZE); 6450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar top_avail_bits = ((1 << (ctb_size_top / MIN_TU_SIZE)) - 1) 6470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar << shift; 6480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 6490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar au4_intra_nbr_avail[0] |= ( 6500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar (u1_top_ctb_avail == 1) ? top_avail_bits : 0x0); 6510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Starting from msb 2nd bit to (1+ctb_size/4) bit, set 1 if top avail,or 0 */ 6520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 6540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Applying Inverse transform on all the TU's in CTB */ 6560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(tu_cnt = 0; tu_cnt < ps_proc->i4_ctb_tu_cnt; tu_cnt++, ps_tu++) 6570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 6580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 transform_skip_flag = 0; 6590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 transform_skip_flag_v = 0; 6600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 num_comp, c_idx, func_idx; 6610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 src_strd, pred_strd, dst_strd; 6620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 qp_div = 0, qp_rem = 0; 6630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 qp_div_v = 0, qp_rem_v = 0; 6640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 zero_cols = 0, zero_cols_v = 0; 6650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 zero_rows = 0, zero_rows_v = 0; 6660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 coeff_type = 0, coeff_type_v = 0; 6670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 i2_coeff_value, i2_coeff_value_v; 6680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 trans_size = 0; 6690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar TRANSFORM_TYPE e_trans_type; 6700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 log2_y_trans_size_minus_2, log2_uv_trans_size_minus_2; 6710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 log2_trans_size; 6720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 chroma_qp_idx; 6730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 *pi2_src = NULL, *pi2_src_v = NULL; 6740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_pred = NULL, *pu1_pred_v = NULL; 6750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_dst = NULL, *pu1_dst_v = NULL; 6760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD16 *pi2_dequant_matrix = NULL, *pi2_dequant_matrix_v = NULL; 6770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 tu_x, tu_y; 6780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 tu_y_offset, tu_uv_offset; 6790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD8 i1_chroma_pic_qp_offset, i1_chroma_slice_qp_offset; 6800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 u1_cbf = 0, u1_cbf_v = 0, u1_luma_pred_mode, u1_chroma_pred_mode; 6810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 luma_nbr_flags_4x4[4]; 6820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 offset; 6830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 pcm_flag; 6840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 chroma_yuv420sp_vu = (ps_codec->e_ref_chroma_fmt == IV_YUV_420SP_VU); 6850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* If 420SP_VU is chroma format, pred and dst pointer */ 6860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* will be added +1 to point to U */ 6870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 chroma_yuv420sp_vu_u_offset = 1 * chroma_yuv420sp_vu; 6880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* If 420SP_VU is chroma format, pred and dst pointer */ 6890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* will be added U offset of +1 and subtracted 2 */ 6900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* to point to V */ 6910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 chroma_yuv420sp_vu_v_offset = -2 * chroma_yuv420sp_vu; 6920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_x = ps_tu->b4_pos_x * 4; /* Converting minTU unit to pixel unit */ 6940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_y = ps_tu->b4_pos_y * 4; /* Converting minTU unit to pixel unit */ 6950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 6960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 tu_abs_x = (ps_proc->i4_ctb_x << ps_sps->i1_log2_ctb_size) + (tu_x); 6970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 tu_abs_y = (ps_proc->i4_ctb_y << ps_sps->i1_log2_ctb_size) + (tu_y); 6980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 6990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 numbytes_row = (ps_sps->i2_pic_width_in_luma_samples + 63) / 64; 7000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_pic_intra_flag = ps_proc->pu1_pic_intra_flag; 7020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_pic_intra_flag += (tu_abs_y >> 3) * numbytes_row; 7030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_pic_intra_flag += (tu_abs_x >> 6); 7040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar intra_flag = *pu1_pic_intra_flag; 7060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar intra_flag &= (1 << ((tu_abs_x >> 3) % 8)); 7070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 7080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_luma_pred_mode = ps_tu->b6_luma_intra_mode; 7100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_chroma_pred_mode = ps_tu->b3_chroma_intra_mode_idx; 7110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_chroma_pred_mode != 7) 7130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar num_comp = 2; /* Y and UV */ 7140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 7150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar num_comp = 1; /* Y */ 7160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pcm_flag = 0; 7190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if((intra_flag) && (u1_luma_pred_mode == INTRA_PRED_NONE)) 7210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_buf; 7230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_y_dst = pu1_y_dst_ctb; 7240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_uv_dst = pu1_uv_dst_ctb; 7250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 i, j; 7260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_sblk_coeff_data_t *ps_tu_sblk_coeff_data; 7270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 cb_size = 1 << (ps_tu->b3_size + 2); 7280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* trans_size is used to update availability after reconstruction */ 7300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar trans_size = cb_size; 7310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pcm_flag = 1; 7330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_y_offset = tu_x + tu_y * pic_strd; 7350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_y_dst += tu_x + tu_y * pic_strd; 7360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_uv_dst += tu_x + (tu_y >> 1) * pic_strd; 7370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* First byte points to number of coded blocks */ 7390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data++; 7400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Next byte points to scan type */ 7420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data++; 7430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu_sblk_coeff_data = (tu_sblk_coeff_data_t *)pu1_tu_coeff_data; 7450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_buf = (UWORD8 *)&ps_tu_sblk_coeff_data->ai2_level[0]; 7470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i = 0; i < cb_size; i++) 7500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar //pu1_y_dst[i * pic_strd + j] = *pu1_buf++; 7520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar memcpy(&pu1_y_dst[i * pic_strd], pu1_buf, cb_size); 7530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_buf += cb_size; 7540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 7550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_uv_dst = pu1_uv_dst + chroma_yuv420sp_vu_u_offset; 7570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* U */ 7590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i = 0; i < cb_size / 2; i++) 7600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(j = 0; j < cb_size / 2; j++) 7620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_uv_dst[i * pic_strd + 2 * j] = *pu1_buf++; 7640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 7650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 7660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_uv_dst = pu1_uv_dst + 1 + chroma_yuv420sp_vu_v_offset; 7680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* V */ 7700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i = 0; i < cb_size / 2; i++) 7710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(j = 0; j < cb_size / 2; j++) 7730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_uv_dst[i * pic_strd + 2 * j] = *pu1_buf++; 7750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 7760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 7770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 7780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data = pu1_buf; 7800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 7820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(c_idx = 0; c_idx < num_comp; c_idx++) 7880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(0 == pcm_flag) 7900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Initializing variables */ 7920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pred_strd = pic_strd; 7930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar dst_strd = pic_strd; 7940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 7950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(c_idx == 0) /* Y */ 7960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 7970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar log2_y_trans_size_minus_2 = ps_tu->b3_size; 7980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar trans_size = 1 << (log2_y_trans_size_minus_2 + 2); 7990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar log2_trans_size = log2_y_trans_size_minus_2 + 2; 8000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_y_offset = tu_x + tu_y * pic_strd; 8020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_src = pi2_tu_coeff; 8040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_pred = pu1_y_dst_ctb + tu_y_offset; 8050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_dst = pu1_y_dst_ctb + tu_y_offset; 8060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Calculating scaling matrix offset */ 8080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar offset = log2_y_trans_size_minus_2 * 6 8090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + (!intra_flag) 8100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * ((log2_y_trans_size_minus_2 8110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar == 3) ? 1 : 3) 8120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + c_idx; 8130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_dequant_matrix = pi2_scaling_mat 8140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + scaling_mat_offset[offset]; 8150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar src_strd = trans_size; 8170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* 4x4 transform Luma in INTRA mode is DST */ 8190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(log2_y_trans_size_minus_2 == 0 && intra_flag) 8200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 8210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar func_idx = log2_y_trans_size_minus_2; 8220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar e_trans_type = DST_4x4; 8230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 8240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 8250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 8260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar func_idx = log2_y_trans_size_minus_2 + 1; 8270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar e_trans_type = (TRANSFORM_TYPE)(log2_y_trans_size_minus_2 + 1); 8280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 8290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar qp_div = ps_tu->b7_qp / 6; 8310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar qp_rem = ps_tu->b7_qp % 6; 8320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_cbf = ps_tu->b1_y_cbf; 8340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar transform_skip_flag = pu1_tu_coeff_data[1] & 1; 8360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Unpacking coeffs */ 8370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(1 == u1_cbf) 8380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 8390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data = ihevcd_unpack_coeffs( 8400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_src, log2_y_trans_size_minus_2 + 2, 8410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data, pi2_dequant_matrix, 8420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar qp_rem, qp_div, e_trans_type, 8430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu->b1_transquant_bypass, &zero_cols, 8440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar &zero_rows, &coeff_type, 8450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar &i2_coeff_value); 8460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 8470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 8480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else /* UV interleaved */ 8490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 8500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Chroma :If Transform size is 4x4, keep 4x4 else do transform on (trans_size/2 x trans_size/2) */ 8510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(ps_tu->b3_size == 0) 8520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 8530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Chroma 4x4 is present with 4th luma 4x4 block. For this case chroma postion has to be (luma pos x- 4,luma pos y- 4) */ 8540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar log2_uv_trans_size_minus_2 = ps_tu->b3_size; 8550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_uv_offset = (tu_x - 4) + ((tu_y - 4) / 2) * pic_strd; 8560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 8570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 8580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 8590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar log2_uv_trans_size_minus_2 = ps_tu->b3_size - 1; 8600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_uv_offset = tu_x + (tu_y >> 1) * pic_strd; 8610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 8620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar trans_size = 1 << (log2_uv_trans_size_minus_2 + 2); 8630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar log2_trans_size = log2_uv_trans_size_minus_2 + 2; 8640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_src = pi2_tu_coeff; 8660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_src_v = pi2_tu_coeff + trans_size * trans_size; 8670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_pred = pu1_uv_dst_ctb + tu_uv_offset + chroma_yuv420sp_vu_u_offset; /* Pointing to start byte of U*/ 8680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_pred_v = pu1_pred + 1 + chroma_yuv420sp_vu_v_offset; /* Pointing to start byte of V*/ 8690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_dst = pu1_uv_dst_ctb + tu_uv_offset + chroma_yuv420sp_vu_u_offset; /* Pointing to start byte of U*/ 8700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_dst_v = pu1_dst + 1 + chroma_yuv420sp_vu_v_offset; /* Pointing to start byte of V*/ 8710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /*TODO: Add support for choosing different tables for U and V, 8730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * change this to a single array to handle flat/default/custom, intra/inter, luma/chroma and various sizes 8740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */ 8750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Calculating scaling matrix offset */ 8760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* ((log2_uv_trans_size_minus_2 == 3) ? 1:3) condition check is not needed, since 8770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * max uv trans size is 16x16 8780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */ 8790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar offset = log2_uv_trans_size_minus_2 * 6 8800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + (!intra_flag) * 3 + c_idx; 8810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_dequant_matrix = pi2_scaling_mat 8820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + scaling_mat_offset[offset]; 8830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_dequant_matrix_v = pi2_scaling_mat 8840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + scaling_mat_offset[offset + 1]; 8850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar src_strd = trans_size; 8870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 8880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar func_idx = 1 + 4 + log2_uv_trans_size_minus_2; /* DST func + Y funcs + cur func index*/ 889a76773ab749bd57f3467c79aa60c16c1f2c87380Harish Mahendrakar 890a76773ab749bd57f3467c79aa60c16c1f2c87380Harish Mahendrakar /* Handle error cases where 64x64 TU is signalled which results in 32x32 chroma. 891a76773ab749bd57f3467c79aa60c16c1f2c87380Harish Mahendrakar * By limiting func_idx to 7, max of 16x16 chroma is called */ 892a76773ab749bd57f3467c79aa60c16c1f2c87380Harish Mahendrakar func_idx = MIN(func_idx, 7); 893a76773ab749bd57f3467c79aa60c16c1f2c87380Harish Mahendrakar 8940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar e_trans_type = (TRANSFORM_TYPE)(log2_uv_trans_size_minus_2 + 1); 8950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* QP for U */ 8960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar i1_chroma_pic_qp_offset = ps_pps->i1_pic_cb_qp_offset; 8970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar i1_chroma_slice_qp_offset = ps_slice_hdr->i1_slice_cb_qp_offset; 8980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_cbf = ps_tu->b1_cb_cbf; 8990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar chroma_qp_idx = ps_tu->b7_qp + i1_chroma_pic_qp_offset 9010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + i1_chroma_slice_qp_offset; 9020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar chroma_qp_idx = CLIP3(chroma_qp_idx, 0, 57); 9030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar qp_div = gai2_ihevcd_chroma_qp[chroma_qp_idx] / 6; 9040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar qp_rem = gai2_ihevcd_chroma_qp[chroma_qp_idx] % 6; 9050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* QP for V */ 9070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar i1_chroma_pic_qp_offset = ps_pps->i1_pic_cr_qp_offset; 9080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar i1_chroma_slice_qp_offset = ps_slice_hdr->i1_slice_cr_qp_offset; 9090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_cbf_v = ps_tu->b1_cr_cbf; 9100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar chroma_qp_idx = ps_tu->b7_qp + i1_chroma_pic_qp_offset 9120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar + i1_chroma_slice_qp_offset; 9130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar chroma_qp_idx = CLIP3(chroma_qp_idx, 0, 57); 9140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar qp_div_v = gai2_ihevcd_chroma_qp[chroma_qp_idx] / 6; 9150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar qp_rem_v = gai2_ihevcd_chroma_qp[chroma_qp_idx] % 6; 9160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Unpacking coeffs */ 9180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar transform_skip_flag = pu1_tu_coeff_data[1] & 1; 9190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(1 == u1_cbf) 9200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 9210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data = ihevcd_unpack_coeffs( 9220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_src, log2_uv_trans_size_minus_2 + 2, 9230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data, pi2_dequant_matrix, 9240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar qp_rem, qp_div, e_trans_type, 9250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu->b1_transquant_bypass, &zero_cols, 9260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar &zero_rows, &coeff_type, 9270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar &i2_coeff_value); 9280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 9290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar transform_skip_flag_v = pu1_tu_coeff_data[1] & 1; 9310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(1 == u1_cbf_v) 9320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 9330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data = ihevcd_unpack_coeffs( 9340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_src_v, log2_uv_trans_size_minus_2 + 2, 9350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_tu_coeff_data, pi2_dequant_matrix_v, 9360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar qp_rem_v, qp_div_v, e_trans_type, 9370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu->b1_transquant_bypass, &zero_cols_v, 9380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar &zero_rows_v, &coeff_type_v, &i2_coeff_value_v); 9390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 9400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 9410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /***************************************************************/ 9420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /****************** Intra Prediction **************************/ 9430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /***************************************************************/ 9440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(intra_flag) /* Intra */ 9450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 9460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 au1_ref_sub_out[(MAX_TU_SIZE * 2 * 2) + 4]; 9470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_top_left, *pu1_top, *pu1_left; 9480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 luma_pred_func_idx, chroma_pred_func_idx; 9490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Get the neighbour availability flags */ 9510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Done for only Y */ 9520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(c_idx == 0) 9530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 9540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Get neighbor availability for Y only */ 9550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar luma_nbr_flags = ihevcd_get_intra_nbr_flag(ps_proc, 9560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu, 9570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar au4_intra_nbr_avail, 9580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_sps->i2_pic_width_in_luma_samples, 9590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_pps->i1_constrained_intra_pred_flag, 9600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar trans_size, 9610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ctb_size); 9620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(trans_size == 4) 9640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar luma_nbr_flags_4x4[(ps_tu->b4_pos_x % 2) + (ps_tu->b4_pos_y % 2) * 2] = luma_nbr_flags; 9650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if((ps_tu->b4_pos_x % 2 == 0) && (ps_tu->b4_pos_y % 2 == 0)) 9670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 9680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar chroma_nbr_flags = luma_nbr_flags; 9690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 9700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Initializing nbr pointers */ 9720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top = pu1_pred - pic_strd; 9730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_left = pu1_pred - 1; 9740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top_left = pu1_pred - pic_strd - 1; 9750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* call reference array substitution */ 9770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(luma_nbr_flags == 0x1ffff) 9780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->s_func_selector.ihevc_intra_pred_luma_ref_subst_all_avlble_fptr( 9790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top_left, 9800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top, pu1_left, pred_strd, trans_size, luma_nbr_flags, au1_ref_sub_out, 1); 9810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 9820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->s_func_selector.ihevc_intra_pred_luma_ref_substitution_fptr( 9830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top_left, 9840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top, pu1_left, pred_strd, trans_size, luma_nbr_flags, au1_ref_sub_out, 1); 9850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* call reference filtering */ 9870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->s_func_selector.ihevc_intra_pred_ref_filtering_fptr( 9880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar au1_ref_sub_out, trans_size, 9890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar au1_ref_sub_out, 9900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_luma_pred_mode, ps_sps->i1_strong_intra_smoothing_enable_flag); 9910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* use the look up to get the function idx */ 9930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar luma_pred_func_idx = g_i4_ip_funcs[u1_luma_pred_mode]; 9940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 9950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* call the intra prediction function */ 9960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->apf_intra_pred_luma[luma_pred_func_idx](au1_ref_sub_out, 1, pu1_pred, pred_strd, trans_size, u1_luma_pred_mode); 9970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 9980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 9990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* In case of yuv420sp_vu, prediction happens as usual. */ 10010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* So point the pu1_pred pointer to original prediction pointer */ 10020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD8 *pu1_pred_orig = pu1_pred - chroma_yuv420sp_vu_u_offset; 10030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Top-Left | Top-Right | Top | Left | Bottom-Left 10050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 1 4 4 4 4 10060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 10070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * Generating chroma_nbr_flags depending upon the transform size */ 10080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(ps_tu->b3_size == 0) 10090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Take TL,T,L flags of First luma 4x4 block */ 10110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar chroma_nbr_flags = (luma_nbr_flags_4x4[0] & 0x10FF0); 10120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Take TR flags of Second luma 4x4 block */ 10130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar chroma_nbr_flags |= (luma_nbr_flags_4x4[1] & 0x0F000); 10140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Take BL flags of Third luma 4x4 block */ 10150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar chroma_nbr_flags |= (luma_nbr_flags_4x4[2] & 0x0000F); 10160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Initializing nbr pointers */ 10190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top = pu1_pred_orig - pic_strd; 10200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_left = pu1_pred_orig - 2; 10210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top_left = pu1_pred_orig - pic_strd - 2; 10220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Chroma pred mode derivation from luma pred mode */ 10240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar tu_t *ps_tu_tmp = ps_tu; 10260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar while(!ps_tu_tmp->b1_first_tu_in_cu) 10270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_tu_tmp--; 10290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_luma_pred_mode_first_tu = ps_tu_tmp->b6_luma_intra_mode; 10310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(4 == u1_chroma_pred_mode) 10330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_chroma_pred_mode = u1_luma_pred_mode_first_tu; 10340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 10350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_chroma_pred_mode = gau1_intra_pred_chroma_modes[u1_chroma_pred_mode]; 10370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(u1_chroma_pred_mode == 10390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_luma_pred_mode_first_tu) 10400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar u1_chroma_pred_mode = INTRA_ANGULAR(34); 10420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* call the chroma reference array substitution */ 10460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->s_func_selector.ihevc_intra_pred_chroma_ref_substitution_fptr( 10470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top_left, 10480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_top, pu1_left, pic_strd, trans_size, chroma_nbr_flags, au1_ref_sub_out, 1); 10490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* use the look up to get the function idx */ 10510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar chroma_pred_func_idx = 10520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar g_i4_ip_funcs[u1_chroma_pred_mode]; 10530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* call the intra prediction function */ 10550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->apf_intra_pred_chroma[chroma_pred_func_idx](au1_ref_sub_out, 1, pu1_pred_orig, pred_strd, trans_size, u1_chroma_pred_mode); 10560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Updating number of transform types */ 10600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_UPDATE_ALL_TRANS(e_trans_type, c_idx); 10610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* IQ, IT and Recon for Y if c_idx == 0, and U if c_idx !=0 */ 10630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(1 == u1_cbf) 10640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(ps_tu->b1_transquant_bypass || transform_skip_flag) 10660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Recon */ 10680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->apf_recon[func_idx](pi2_src, pu1_pred, pu1_dst, 10690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar src_strd, pred_strd, dst_strd, 10700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar zero_cols); 10710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 10730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Updating coded number of transform types(excluding trans skip and trans quant skip) */ 10760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_UPDATE_CODED_TRANS(e_trans_type, c_idx, 0); 10770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 10780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* iQuant , iTrans and Recon */ 10790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if((0 == coeff_type)) 10800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->apf_itrans_recon[func_idx](pi2_src, pi2_tmp, 10820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_pred, pu1_dst, 10830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar src_strd, pred_strd, 10840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar dst_strd, zero_cols, 10850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar zero_rows); 10860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else /* DC only */ 10880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 10890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_UPDATE_CODED_TRANS(e_trans_type, c_idx, 1); 10900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->apf_itrans_recon_dc[c_idx](pu1_pred, pu1_dst, 10910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pred_strd, dst_strd, 10920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar log2_trans_size, 10930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar i2_coeff_value); 10940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 10970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* IQ, IT and Recon for V */ 10980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(c_idx != 0) 10990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 11000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(1 == u1_cbf_v) 11010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 11020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(ps_tu->b1_transquant_bypass || transform_skip_flag_v) 11030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 11040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Recon */ 11050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->apf_recon[func_idx](pi2_src_v, pu1_pred_v, 11060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_dst_v, src_strd, 11070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pred_strd, dst_strd, 11080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar zero_cols_v); 11090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else 11110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 11120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Updating number of transform types */ 11130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_UPDATE_CODED_TRANS(e_trans_type, c_idx, 0); 11140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 11150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* iQuant , iTrans and Recon */ 11160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if((0 == coeff_type_v)) 11170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 11180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->apf_itrans_recon[func_idx](pi2_src_v, 11190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pi2_tmp, 11200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_pred_v, 11210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pu1_dst_v, 11220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar src_strd, 11230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pred_strd, 11240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar dst_strd, 11250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar zero_cols_v, 11260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar zero_rows_v); 11270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar else /* DC only */ 11290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 11300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar STATS_UPDATE_CODED_TRANS(e_trans_type, c_idx, 1); 11310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_codec->apf_itrans_recon_dc[c_idx](pu1_pred_v, pu1_dst_v, 11320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar pred_strd, dst_strd, 11330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar log2_trans_size, 11340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar i2_coeff_value_v); 11350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 11410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Neighbor availability inside CTB */ 11420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* 1bit per 4x4. Indicates whether that 4x4 block has been reconstructed(avialable) */ 11430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar /* Used for neighbor availability in intra pred */ 11440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if(c_idx == 0) 11450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 11460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 i; 11470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar WORD32 trans_in_min_tu; 11480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 cur_tu_in_bits; 11490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar UWORD32 cur_tu_avail_flag; 11500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 11510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar trans_in_min_tu = trans_size / MIN_TU_SIZE; 11520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar cur_tu_in_bits = (1 << trans_in_min_tu) - 1; 11530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar cur_tu_in_bits = cur_tu_in_bits << (32 - trans_in_min_tu); 11540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 11550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar cur_tu_avail_flag = cur_tu_in_bits >> (ps_tu->b4_pos_x + 1); 11560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 11570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for(i = 0; i < trans_in_min_tu; i++) 11580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar au4_intra_nbr_avail[1 + ps_tu->b4_pos_y + i] |= 11590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar cur_tu_avail_flag; 11600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 11630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ps_proc->pv_tu_coeff_data = pu1_tu_coeff_data; 11640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 11650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar return ps_proc->i4_ctb_tu_cnt; 11660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar} 11670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1168