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
839663ae211632948494bebd703d4d8f7cb576d7d6Naveen 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 */
879663ae211632948494bebd703d4d8f7cb576d7d6Naveen 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    /*************************************************************************/
5702b34e4dc67d8ed8199ed4b764bd288d85e010185Harish Mahendrakar    /* Only first 20 entries are used. Array is extended to avoid out of bound
5712b34e4dc67d8ed8199ed4b764bd288d85e010185Harish Mahendrakar       reads. Skip CUs (64x64) read this table, but don't really use the value */
5722b34e4dc67d8ed8199ed4b764bd288d85e010185Harish Mahendrakar    static const WORD32 scaling_mat_offset[] =
5730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar      { 0, 16, 32, 48, 64, 80, 96, 160, 224, 288, 352, 416, 480, 736, 992,
5742b34e4dc67d8ed8199ed4b764bd288d85e010185Harish 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                {
9463527694a9bfff5dbcb27d0acc09792ec19ab674aHarish Mahendrakar                    /* While (MAX_TU_SIZE * 2 * 2) + 1 is the actaul size needed,
9473527694a9bfff5dbcb27d0acc09792ec19ab674aHarish Mahendrakar                       au1_ref_sub_out size is kept as multiple of 8,
9483527694a9bfff5dbcb27d0acc09792ec19ab674aHarish Mahendrakar                       so that SIMD functions can load 64 bits */
9493527694a9bfff5dbcb27d0acc09792ec19ab674aHarish Mahendrakar                    UWORD8 au1_ref_sub_out[(MAX_TU_SIZE * 2 * 2) + 8];
9500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    UWORD8 *pu1_top_left, *pu1_top, *pu1_left;
9510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    WORD32 luma_pred_func_idx, chroma_pred_func_idx;
9520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* Get the neighbour availability flags */
9540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* Done for only Y */
9550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if(c_idx == 0)
9560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    {
9570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* Get neighbor availability for Y only */
9580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        luma_nbr_flags = ihevcd_get_intra_nbr_flag(ps_proc,
9590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                   ps_tu,
9600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                   au4_intra_nbr_avail,
9610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                   ps_sps->i2_pic_width_in_luma_samples,
9620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                   ps_pps->i1_constrained_intra_pred_flag,
9630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                   trans_size,
9640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                   ctb_size);
9650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if(trans_size == 4)
9670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            luma_nbr_flags_4x4[(ps_tu->b4_pos_x % 2) + (ps_tu->b4_pos_y % 2) * 2] = luma_nbr_flags;
9680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if((ps_tu->b4_pos_x % 2 == 0) && (ps_tu->b4_pos_y % 2 == 0))
9700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
9710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            chroma_nbr_flags = luma_nbr_flags;
9720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
9730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* Initializing nbr pointers */
9750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        pu1_top = pu1_pred - pic_strd;
9760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        pu1_left = pu1_pred - 1;
9770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        pu1_top_left = pu1_pred - pic_strd - 1;
9780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* call reference array substitution */
9800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if(luma_nbr_flags == 0x1ffff)
9810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            ps_codec->s_func_selector.ihevc_intra_pred_luma_ref_subst_all_avlble_fptr(
9820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            pu1_top_left,
9830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            pu1_top, pu1_left, pred_strd, trans_size, luma_nbr_flags, au1_ref_sub_out, 1);
9840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        else
9850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            ps_codec->s_func_selector.ihevc_intra_pred_luma_ref_substitution_fptr(
9860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            pu1_top_left,
9870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            pu1_top, pu1_left, pred_strd, trans_size, luma_nbr_flags, au1_ref_sub_out, 1);
9880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* call reference filtering */
9900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        ps_codec->s_func_selector.ihevc_intra_pred_ref_filtering_fptr(
9910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        au1_ref_sub_out, trans_size,
9920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        au1_ref_sub_out,
9930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        u1_luma_pred_mode, ps_sps->i1_strong_intra_smoothing_enable_flag);
9940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* use the look up to get the function idx */
9960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        luma_pred_func_idx = g_i4_ip_funcs[u1_luma_pred_mode];
9970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* call the intra prediction function */
9990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish 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);
10000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    }
10010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    else
10020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    {
10030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* In case of yuv420sp_vu, prediction happens as usual.         */
10040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* So point the pu1_pred pointer to original prediction pointer */
10050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        UWORD8 *pu1_pred_orig = pu1_pred - chroma_yuv420sp_vu_u_offset;
10060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /*    Top-Left | Top-Right | Top | Left | Bottom-Left
10080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                         *      1         4         4     4         4
10090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                         *
10100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                         * Generating chroma_nbr_flags depending upon the transform size */
10110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if(ps_tu->b3_size == 0)
10120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
10130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            /* Take TL,T,L flags of First luma 4x4 block */
10140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            chroma_nbr_flags = (luma_nbr_flags_4x4[0] & 0x10FF0);
10150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            /* Take TR flags of Second luma 4x4 block */
10160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            chroma_nbr_flags |= (luma_nbr_flags_4x4[1] & 0x0F000);
10170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            /* Take BL flags of Third luma 4x4 block */
10180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            chroma_nbr_flags |= (luma_nbr_flags_4x4[2] & 0x0000F);
10190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
10200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* Initializing nbr pointers */
10220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        pu1_top = pu1_pred_orig - pic_strd;
10230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        pu1_left = pu1_pred_orig - 2;
10240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        pu1_top_left = pu1_pred_orig - pic_strd - 2;
10250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* Chroma pred  mode derivation from luma pred mode */
10270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
10280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            tu_t *ps_tu_tmp = ps_tu;
10290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            while(!ps_tu_tmp->b1_first_tu_in_cu)
10300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            {
10310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                ps_tu_tmp--;
10320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            }
10330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            u1_luma_pred_mode_first_tu = ps_tu_tmp->b6_luma_intra_mode;
10340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
10350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if(4 == u1_chroma_pred_mode)
10360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            u1_chroma_pred_mode = u1_luma_pred_mode_first_tu;
10370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        else
10380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
10390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            u1_chroma_pred_mode = gau1_intra_pred_chroma_modes[u1_chroma_pred_mode];
10400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            if(u1_chroma_pred_mode ==
10420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                            u1_luma_pred_mode_first_tu)
10430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            {
10440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                u1_chroma_pred_mode = INTRA_ANGULAR(34);
10450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            }
10460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
10470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* call the chroma reference array substitution */
10490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        ps_codec->s_func_selector.ihevc_intra_pred_chroma_ref_substitution_fptr(
10500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        pu1_top_left,
10510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        pu1_top, pu1_left, pic_strd, trans_size, chroma_nbr_flags, au1_ref_sub_out, 1);
10520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* use the look up to get the function idx */
10540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        chroma_pred_func_idx =
10550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        g_i4_ip_funcs[u1_chroma_pred_mode];
10560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* call the intra prediction function */
10580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish 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);
10590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    }
10600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
10610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* Updating number of transform types */
10630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                STATS_UPDATE_ALL_TRANS(e_trans_type, c_idx);
10640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* IQ, IT and Recon for Y if c_idx == 0, and U if c_idx !=0 */
10660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(1 == u1_cbf)
10670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
10680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if(ps_tu->b1_transquant_bypass || transform_skip_flag)
10690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    {
10700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* Recon */
10710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        ps_codec->apf_recon[func_idx](pi2_src, pu1_pred, pu1_dst,
10720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                      src_strd, pred_strd, dst_strd,
10730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                      zero_cols);
10740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    }
10750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    else
10760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    {
10770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* Updating coded number of transform types(excluding trans skip and trans quant skip) */
10790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        STATS_UPDATE_CODED_TRANS(e_trans_type, c_idx, 0);
10800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* iQuant , iTrans and Recon */
10820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if((0 == coeff_type))
10830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
10840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            ps_codec->apf_itrans_recon[func_idx](pi2_src, pi2_tmp,
10850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                 pu1_pred, pu1_dst,
10860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                 src_strd, pred_strd,
10870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                 dst_strd, zero_cols,
10880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                 zero_rows);
10890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
10900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        else /* DC only */
10910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
10920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            STATS_UPDATE_CODED_TRANS(e_trans_type, c_idx, 1);
10930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            ps_codec->apf_itrans_recon_dc[c_idx](pu1_pred, pu1_dst,
10940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                 pred_strd, dst_strd,
10950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                 log2_trans_size,
10960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                 i2_coeff_value);
10970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
10980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    }
10990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
11000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* IQ, IT and Recon for V */
11010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(c_idx != 0)
11020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
11030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if(1 == u1_cbf_v)
11040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    {
11050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if(ps_tu->b1_transquant_bypass || transform_skip_flag_v)
11060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
11070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            /* Recon */
11080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            ps_codec->apf_recon[func_idx](pi2_src_v, pu1_pred_v,
11090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                          pu1_dst_v, src_strd,
11100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                          pred_strd, dst_strd,
11110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                          zero_cols_v);
11120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
11130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        else
11140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
11150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            /* Updating number of transform types */
11160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            STATS_UPDATE_CODED_TRANS(e_trans_type, c_idx, 0);
11170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            /* iQuant , iTrans and Recon */
11190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            if((0 == coeff_type_v))
11200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            {
11210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                ps_codec->apf_itrans_recon[func_idx](pi2_src_v,
11220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     pi2_tmp,
11230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     pu1_pred_v,
11240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     pu1_dst_v,
11250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     src_strd,
11260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     pred_strd,
11270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     dst_strd,
11280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     zero_cols_v,
11290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     zero_rows_v);
11300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            }
11310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            else  /* DC only */
11320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            {
11330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                STATS_UPDATE_CODED_TRANS(e_trans_type, c_idx, 1);
11340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                ps_codec->apf_itrans_recon_dc[c_idx](pu1_pred_v, pu1_dst_v,
11350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     pred_strd, dst_strd,
11360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     log2_trans_size,
11370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                     i2_coeff_value_v);
11380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            }
11390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
11400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    }
11410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
11420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
11430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Neighbor availability inside CTB */
11450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* 1bit per 4x4. Indicates whether that 4x4 block has been reconstructed(avialable) */
11460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Used for neighbor availability in intra pred */
11470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            if(c_idx == 0)
11480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
11490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 i;
11500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 trans_in_min_tu;
11510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                UWORD32 cur_tu_in_bits;
11520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                UWORD32 cur_tu_avail_flag;
11530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                trans_in_min_tu = trans_size / MIN_TU_SIZE;
11550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                cur_tu_in_bits = (1 << trans_in_min_tu) - 1;
11560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                cur_tu_in_bits = cur_tu_in_bits << (32 - trans_in_min_tu);
11570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                cur_tu_avail_flag = cur_tu_in_bits >> (ps_tu->b4_pos_x + 1);
11590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                for(i = 0; i < trans_in_min_tu; i++)
11610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    au4_intra_nbr_avail[1 + ps_tu->b4_pos_y + i] |=
11620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                    cur_tu_avail_flag;
11630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
11640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
11650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
11660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    ps_proc->pv_tu_coeff_data = pu1_tu_coeff_data;
11670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    return ps_proc->i4_ctb_tu_cnt;
11690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
11700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1171