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 *  ihevc_iquant_itrans_recon.c
220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @brief
240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Contains function definitions for inverse  quantization, inverse
250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * transform and reconstruction
260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @author
280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  100470
290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @par List of Functions:
310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  - ihevc_iquant_itrans_recon_4x4_ttype1()
320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  - ihevc_iquant_itrans_recon_4x4()
330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @remarks
350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  None
360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *******************************************************************************
380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */
390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <stdio.h>
400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <string.h>
410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_typedefs.h"
420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_macros.h"
430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_platform_macros.h"
440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_defs.h"
450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_trans_tables.h"
460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_iquant_itrans_recon.h"
470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_func_selector.h"
480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_trans_macros.h"
490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* All the functions here are replicated from ihevc_itrans.c and modified to */
510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* include reconstruction */
520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/**
540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *******************************************************************************
550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @brief
570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  This function performs inverse quantization, inverse  transform
580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * type1(DST) and reconstruction for 4x4  input block
590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @par Description:
610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Performs inverse quantization , inverse transform type 1  and adds
620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * prediction data and clips output to 8 bit
630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pi2_src
650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Input 4x4 coefficients
660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pi2_tmp
680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Temporary 4x4 buffer for storing inverse
690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  transform 1st stage output
700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pu1_pred
720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Prediction 4x4 block
730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pi2_dequant_coeff
750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Dequant Coeffs
760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[out] pu1_dst
780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Output 4x4 block
790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] qp_div
810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Quantization parameter / 6
820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] qp_rem
840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Quantization parameter % 6
850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] src_strd
870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Input stride
880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pred_strd
900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Prediction stride
910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] dst_strd
930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Output Stride
940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] zero_cols
960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Zero columns in pi2_src
970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] zero_rows
990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Zero Rows in pi2_src
1000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
1010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @returns  Void
1020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
1030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @remarks
1040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  None
1050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
1060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *******************************************************************************
1070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */
1080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_iquant_itrans_recon_4x4_ttype1(WORD16 *pi2_src,
1100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD16 *pi2_tmp,
1110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          UWORD8 *pu1_pred,
1120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD16 *pi2_dequant_coeff,
1130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          UWORD8 *pu1_dst,
1140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 qp_div, /* qpscaled / 6 */
1150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 qp_rem, /* qpscaled % 6 */
1160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 src_strd,
1170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 pred_strd,
1180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 dst_strd,
1190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 zero_cols,
1200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 zero_rows)
1210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
1220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(zero_rows);
1230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Inverse Quant and Inverse Transform and Reconstruction */
1240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 i, c[4];
1260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 add;
1270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 shift;
1280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD16 *pi2_tmp_orig;
1290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 shift_iq;
1300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 trans_size;
1310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Inverse Quantization constants */
1320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
1330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 log2_trans_size, bit_depth;
1340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            log2_trans_size = 2;
1360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            bit_depth = 8 + 0;
1370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            shift_iq = bit_depth + log2_trans_size - 5;
1380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
1390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        trans_size = TRANS_SIZE_4;
1410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pi2_tmp_orig = pi2_tmp;
1420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Inverse Transform 1st stage */
1440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        shift = IT_SHIFT_STAGE_1;
1450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        add = 1 << (shift - 1);
1460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(i = 0; i < trans_size; i++)
1480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
1490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Checking for Zero Cols */
1500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            if((zero_cols & 1) == 1)
1510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
1520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
1530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
1540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            else
1550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
1560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 iq_tmp_1, iq_tmp_2, iq_tmp_3;
1570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                // Intermediate Variables
1580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_1,
1590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[0 * src_strd],
1600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[0 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_2,
1630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[2 * src_strd],
1640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[2 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                c[0] = iq_tmp_1 + iq_tmp_2;
1670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_1,
1690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[2 * src_strd],
1700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[2 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_2,
1730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[3 * src_strd],
1740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[3 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                c[1] = iq_tmp_1 + iq_tmp_2;
1770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_1,
1790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[0 * src_strd],
1800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[0 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_2,
1830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[3 * src_strd],
1840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[3 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                c[2] = iq_tmp_1 - iq_tmp_2;
1870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_1,
1890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[1 * src_strd],
1900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[1 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                c[3] = 74 * iq_tmp_1;
1930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[0] =
1950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16((29 * c[0] + 55 * c[1] + c[3] + add) >> shift);
1960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[1] =
1970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16((55 * c[2] - 29 * c[1] + c[3] + add) >> shift);
1980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_1,
2000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[0 * src_strd],
2010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[0 * trans_size] * g_ihevc_iquant_scales[qp_rem],
2020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
2030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_2,
2040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[2 * src_strd],
2050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[2 * trans_size] * g_ihevc_iquant_scales[qp_rem],
2060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
2070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_3,
2080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[3 * src_strd],
2090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[3 * trans_size] * g_ihevc_iquant_scales[qp_rem],
2100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
2110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[2] =
2130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16((74 * (iq_tmp_1 - iq_tmp_2 + iq_tmp_3) + add) >> shift);
2140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[3] =
2150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16((55 * c[0] + 29 * c[2] - c[3] + add) >> shift);
2160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
2170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_src++;
2180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_dequant_coeff++;
2190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_tmp += trans_size;
2200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            zero_cols = zero_cols >> 1;
2210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pi2_tmp = pi2_tmp_orig;
2240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Inverse Transform 2nd stage */
2260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        shift = IT_SHIFT_STAGE_2;
2270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        add = 1 << (shift - 1);
2280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(i = 0; i < trans_size; i++)
2300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
2310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 itrans_out;
2320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            // Intermediate Variables
2340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            c[0] = pi2_tmp[0] + pi2_tmp[2 * trans_size];
2350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            c[1] = pi2_tmp[2 * trans_size] + pi2_tmp[3 * trans_size];
2360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            c[2] = pi2_tmp[0] - pi2_tmp[3 * trans_size];
2370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            c[3] = 74 * pi2_tmp[trans_size];
2380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
2400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16((29 * c[0] + 55 * c[1] + c[3] + add) >> shift);
2410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[0] = CLIP_U8((itrans_out + pu1_pred[0]));
2420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
2440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16((55 * c[2] - 29 * c[1] + c[3] + add) >> shift);
2450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[1] = CLIP_U8((itrans_out + pu1_pred[1]));
2460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
2480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16((74 * (pi2_tmp[0] - pi2_tmp[2 * trans_size] + pi2_tmp[3 * trans_size]) + add) >> shift);
2490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[2] = CLIP_U8((itrans_out + pu1_pred[2]));
2500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
2520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16((55 * c[0] + 29 * c[2] - c[3] + add) >> shift);
2530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[3] = CLIP_U8((itrans_out + pu1_pred[3]));
2540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_tmp++;
2550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_pred += pred_strd;
2560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst += dst_strd;
2570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
2590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
2600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/**
2620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *******************************************************************************
2630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @brief
2650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  This function performs inverse quantization, inverse  transform and
2660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * reconstruction for 4x4 input block
2670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @par Description:
2690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Performs inverse quantization , inverse transform  and adds the
2700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * prediction data and clips output to 8 bit
2710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pi2_src
2730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Input 4x4 coefficients
2740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pi2_tmp
2760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Temporary 4x4 buffer for storing inverse
2770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  transform 1st stage output
2780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pu1_pred
2800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Prediction 4x4 block
2810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pi2_dequant_coeff
2830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Dequant Coeffs
2840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[out] pu1_dst
2860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Output 4x4 block
2870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] qp_div
2890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Quantization parameter / 6
2900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] qp_rem
2920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Quantization parameter % 6
2930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] src_strd
2950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Input stride
2960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
2970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pred_strd
2980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Prediction stride
2990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
3000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] dst_strd
3010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Output Stride
3020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
3030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] zero_cols
3040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Zero columns in pi2_src
3050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
3060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] zero_rows
3070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Zero Rows in pi2_src
3080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
3090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @returns  Void
3100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
3110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @remarks
3120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  None
3130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
3140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *******************************************************************************
3150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */
3160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_iquant_itrans_recon_4x4(WORD16 *pi2_src,
3180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   WORD16 *pi2_tmp,
3190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   UWORD8 *pu1_pred,
3200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   WORD16 *pi2_dequant_coeff,
3210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   UWORD8 *pu1_dst,
3220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   WORD32 qp_div, /* qpscaled / 6 */
3230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   WORD32 qp_rem, /* qpscaled % 6 */
3240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   WORD32 src_strd,
3250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   WORD32 pred_strd,
3260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   WORD32 dst_strd,
3270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   WORD32 zero_cols,
3280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                   WORD32 zero_rows)
3290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
3300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(zero_rows);
3310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Inverse Transform */
3320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 j;
3340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 e[2], o[2];
3350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 add;
3360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 shift;
3370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD16 *pi2_tmp_orig;
3380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 shift_iq;
3390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 trans_size;
3400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Inverse Quantization constants */
3410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
3420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 log2_trans_size, bit_depth;
3430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            log2_trans_size = 2;
3450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            bit_depth = 8 + 0;
3460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            shift_iq = bit_depth + log2_trans_size - 5;
3470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
3480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        trans_size = TRANS_SIZE_4;
3500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pi2_tmp_orig = pi2_tmp;
3510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Inverse Transform 1st stage */
3530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        shift = IT_SHIFT_STAGE_1;
3540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        add = 1 << (shift - 1);
3550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(j = 0; j < trans_size; j++)
3570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
3580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Checking for Zero Cols */
3590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            if((zero_cols & 1) == 1)
3600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
3610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
3620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
3630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            else
3640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
3650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 iq_tmp_1, iq_tmp_2;
3660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
3670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_1,
3680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[1 * src_strd],
3690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[1 * trans_size] * g_ihevc_iquant_scales[qp_rem],
3700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
3710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_2,
3720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[3 * src_strd],
3730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[3 * trans_size] * g_ihevc_iquant_scales[qp_rem],
3740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
3750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                o[0] = g_ai2_ihevc_trans_4[1][0] * iq_tmp_1
3770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                + g_ai2_ihevc_trans_4[3][0] * iq_tmp_2;
3780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                o[1] = g_ai2_ihevc_trans_4[1][1] * iq_tmp_1
3790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                + g_ai2_ihevc_trans_4[3][1] * iq_tmp_2;
3800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_1,
3820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[0 * src_strd],
3830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[0 * trans_size] * g_ihevc_iquant_scales[qp_rem],
3840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
3850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_2,
3860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[2 * src_strd],
3870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[2 * trans_size] * g_ihevc_iquant_scales[qp_rem],
3880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
3890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                e[0] = g_ai2_ihevc_trans_4[0][0] * iq_tmp_1
3910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                + g_ai2_ihevc_trans_4[2][0] * iq_tmp_2;
3920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                e[1] = g_ai2_ihevc_trans_4[0][1] * iq_tmp_1
3930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                + g_ai2_ihevc_trans_4[2][1] * iq_tmp_2;
3940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[0] =
3960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16(((e[0] + o[0] + add) >> shift));
3970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[1] =
3980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16(((e[1] + o[1] + add) >> shift));
3990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[2] =
4000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16(((e[1] - o[1] + add) >> shift));
4010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[3] =
4020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16(((e[0] - o[0] + add) >> shift));
4030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
4040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_src++;
4050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_dequant_coeff++;
4060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_tmp += trans_size;
4070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            zero_cols = zero_cols >> 1;
4080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
4090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pi2_tmp = pi2_tmp_orig;
4110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Inverse Transform 2nd stage */
4130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        shift = IT_SHIFT_STAGE_2;
4140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        add = 1 << (shift - 1);
4150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(j = 0; j < trans_size; j++)
4170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
4180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 itrans_out;
4190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
4210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            o[0] = g_ai2_ihevc_trans_4[1][0] * pi2_tmp[trans_size]
4220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            + g_ai2_ihevc_trans_4[3][0]
4230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            * pi2_tmp[3 * trans_size];
4240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            o[1] = g_ai2_ihevc_trans_4[1][1] * pi2_tmp[trans_size]
4250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            + g_ai2_ihevc_trans_4[3][1]
4260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            * pi2_tmp[3 * trans_size];
4270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            e[0] = g_ai2_ihevc_trans_4[0][0] * pi2_tmp[0]
4280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            + g_ai2_ihevc_trans_4[2][0]
4290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            * pi2_tmp[2 * trans_size];
4300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            e[1] = g_ai2_ihevc_trans_4[0][1] * pi2_tmp[0]
4310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            + g_ai2_ihevc_trans_4[2][1]
4320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            * pi2_tmp[2 * trans_size];
4330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
4350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16(((e[0] + o[0] + add) >> shift));
4360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[0] = CLIP_U8((itrans_out + pu1_pred[0]));
4370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
4390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16(((e[1] + o[1] + add) >> shift));
4400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[1] = CLIP_U8((itrans_out + pu1_pred[1]));
4410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
4430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16(((e[1] - o[1] + add) >> shift));
4440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[2] = CLIP_U8((itrans_out + pu1_pred[2]));
4450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
4470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16(((e[0] - o[0] + add) >> shift));
4480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[3] = CLIP_U8((itrans_out + pu1_pred[3]));
4490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_tmp++;
4510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_pred += pred_strd;
4520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst += dst_strd;
4530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
4550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
457