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_chroma_iquant_itrans_recon.c
220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @brief
240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Contains function definitions for inverse  quantization, inverse
250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * transform and reconstruction  of chroma interleaved data.
260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @author
280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  100470
290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @par List of Functions:
310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *   - ihevc_chroma_iquant_itrans_recon_4x4()
320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @remarks
340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  None
350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *******************************************************************************
370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */
380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <stdio.h>
390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <string.h>
400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_typedefs.h"
410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_macros.h"
420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_platform_macros.h"
430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_defs.h"
440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_trans_tables.h"
450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_chroma_iquant_itrans_recon.h"
460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_func_selector.h"
470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_trans_macros.h"
480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* All the functions work one component(U or V) of interleaved data depending upon pointers passed to it */
500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* Data visualization */
510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* U V U V U V U V */
520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* U V U V U V U V */
530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* U V U V U V U V */
540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* U V U V U V U V */
550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* If the pointer points to first byte of above stream (U) , functions will operate on U component */
560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* If the pointer points to second byte of above stream (V) , functions will operate on V component */
570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/**
600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *******************************************************************************
610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @brief
630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  This function performs inverse quantization, inverse  transform and
640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * reconstruction for 4x4 input block
650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @par Description:
670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Performs inverse quantization , inverse transform  and adds the
680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * prediction data and clips output to 8 bit
690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pi2_src
710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Input 4x4 coefficients
720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pi2_tmp
740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Temporary 4x4 buffer for storing inverse transform
750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  1st stage output
760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pu1_pred
780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Prediction 4x4 block
790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pi2_dequant_coeff
810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Dequant Coeffs
820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[out] pu1_dst
840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Output 4x4 block
850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] qp_div
870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Quantization parameter / 6
880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] qp_rem
900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Quantization parameter % 6
910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] src_strd
930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Input stride
940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] pred_strd
960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Prediction stride
970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] dst_strd
990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Output Stride
1000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
1010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] zero_cols
1020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Zero columns in pi2_src
1030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
1040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @param[in] zero_rows
1050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  Zero Rows in pi2_src
1060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
1070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @returns  Void
1080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
1090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * @remarks
1100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *  None
1110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *
1120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar *******************************************************************************
1130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */
1140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_chroma_iquant_itrans_recon_4x4(WORD16 *pi2_src,
1170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD16 *pi2_tmp,
1180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          UWORD8 *pu1_pred,
1190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD16 *pi2_dequant_coeff,
1200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          UWORD8 *pu1_dst,
1210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 qp_div, /* qpscaled / 6 */
1220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 qp_rem, /* qpscaled % 6 */
1230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 src_strd,
1240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 pred_strd,
1250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 dst_strd,
1260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 zero_cols,
1270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                          WORD32 zero_rows)
1280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
1290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(zero_rows);
1300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Inverse Transform */
1320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 j;
1340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 e[2], o[2];
1350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 add;
1360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 shift;
1370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD16 *pi2_tmp_orig;
1380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 shift_iq;
1390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 trans_size;
1400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Inverse Quantization constants */
1410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
1420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 log2_trans_size, bit_depth;
1430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            log2_trans_size = 2;
1450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            bit_depth = 8 + 0;
1460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            shift_iq = bit_depth + log2_trans_size - 5;
1470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
1480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        trans_size = TRANS_SIZE_4;
1500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pi2_tmp_orig = pi2_tmp;
1510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Inverse Transform 1st stage */
1530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        shift = IT_SHIFT_STAGE_1;
1540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        add = 1 << (shift - 1);
1550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(j = 0; j < trans_size; j++)
1570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
1580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Checking for Zero Cols */
1590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            if((zero_cols & 1) == 1)
1600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
1610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
1620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
1630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            else
1640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
1650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 iq_tmp_1, iq_tmp_2;
1660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_1,
1680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[1 * src_strd],
1690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[1 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_2,
1720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[3 * src_strd],
1730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[3 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                o[0] = g_ai2_ihevc_trans_4[1][0] * iq_tmp_1
1770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                + g_ai2_ihevc_trans_4[3][0] * iq_tmp_2;
1780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                o[1] = g_ai2_ihevc_trans_4[1][1] * iq_tmp_1
1790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                + g_ai2_ihevc_trans_4[3][1] * iq_tmp_2;
1800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_1,
1820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[0 * src_strd],
1830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[0 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IQUANT_4x4(iq_tmp_2,
1860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_src[2 * src_strd],
1870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           pi2_dequant_coeff[2 * trans_size] * g_ihevc_iquant_scales[qp_rem],
1880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                           shift_iq, qp_div);
1890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                e[0] = g_ai2_ihevc_trans_4[0][0] * iq_tmp_1
1910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                + g_ai2_ihevc_trans_4[2][0] * iq_tmp_2;
1920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                e[1] = g_ai2_ihevc_trans_4[0][1] * iq_tmp_1
1930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                + g_ai2_ihevc_trans_4[2][1] * iq_tmp_2;
1940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[0] =
1960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16(((e[0] + o[0] + add) >> shift));
1970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[1] =
1980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16(((e[1] + o[1] + add) >> shift));
1990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[2] =
2000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16(((e[1] - o[1] + add) >> shift));
2010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi2_tmp[3] =
2020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                CLIP_S16(((e[0] - o[0] + add) >> shift));
2030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
2040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_src++;
2050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_dequant_coeff++;
2060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_tmp += trans_size;
2070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            zero_cols = zero_cols >> 1;
2080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pi2_tmp = pi2_tmp_orig;
2110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Inverse Transform 2nd stage */
2130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        shift = IT_SHIFT_STAGE_2;
2140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        add = 1 << (shift - 1);
2150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(j = 0; j < trans_size; j++)
2170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
2180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 itrans_out;
2190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
2210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            o[0] = g_ai2_ihevc_trans_4[1][0] * pi2_tmp[trans_size]
2220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            + g_ai2_ihevc_trans_4[3][0]
2230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            * pi2_tmp[3 * trans_size];
2240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            o[1] = g_ai2_ihevc_trans_4[1][1] * pi2_tmp[trans_size]
2250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            + g_ai2_ihevc_trans_4[3][1]
2260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            * pi2_tmp[3 * trans_size];
2270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            e[0] = g_ai2_ihevc_trans_4[0][0] * pi2_tmp[0]
2280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            + g_ai2_ihevc_trans_4[2][0]
2290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            * pi2_tmp[2 * trans_size];
2300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            e[1] = g_ai2_ihevc_trans_4[0][1] * pi2_tmp[0]
2310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            + g_ai2_ihevc_trans_4[2][1]
2320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                            * pi2_tmp[2 * trans_size];
2330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
2350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16(((e[0] + o[0] + add) >> shift));
2360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[0 * 2] = CLIP_U8((itrans_out + pu1_pred[0 * 2]));
2370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
2390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16(((e[1] + o[1] + add) >> shift));
2400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[1 * 2] = CLIP_U8((itrans_out + pu1_pred[1 * 2]));
2410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
2430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16(((e[1] - o[1] + add) >> shift));
2440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[2 * 2] = CLIP_U8((itrans_out + pu1_pred[2 * 2]));
2450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            itrans_out =
2470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            CLIP_S16(((e[0] - o[0] + add) >> shift));
2480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst[3 * 2] = CLIP_U8((itrans_out + pu1_pred[3 * 2]));
2490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi2_tmp++;
2510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_pred += pred_strd;
2520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_dst += dst_strd;
2530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
2560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
257