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_parse_residual.c
220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @brief
240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  Contains functions for parsing residual data at TU level
250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @author
270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  Harish
280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @par List of Functions:
300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @remarks
320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  None
330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*******************************************************************************
350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*/
360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/*****************************************************************************/
370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* File Includes                                                             */
380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/*****************************************************************************/
390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <stdio.h>
400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <stddef.h>
410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <stdlib.h>
420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <string.h>
430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <assert.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_macros.h"
540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_platform_macros.h"
550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_common_tables.h"
570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_error.h"
580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_cabac_tables.h"
590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_trace.h"
610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_defs.h"
620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_function_selector.h"
630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_structs.h"
640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_error.h"
650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_nal.h"
660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_bitstream.h"
670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_utils.h"
680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_parse_residual.h"
690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevcd_cabac.h"
700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/**
720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *****************************************************************************
730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  * @brief  returns context increment for sig coeff based on csbf neigbour
740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *         flags (bottom and right) and current coeff postion in 4x4 block
750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *         See section 9.3.3.1.4 for details on this context increment
760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *
770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  * input   : neigbour csbf flags(bit0:rightcsbf, bit1:bottom csbf)
780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *           coeff idx in raster order (0-15)
790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *
800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  * output  : context increment for sig coeff flag
810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *
820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *****************************************************************************
830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  */
840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarconst UWORD8 gau1_ihevcd_sigcoeff_ctxtinc[3][4][16] =
850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 0:  sigCtx = (xP+yP == 0) ? 2 : (xP+yP < 3) ? 1: 0 */
890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    1,    1,    1,    1,    1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0 },
900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 1:  sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1: 0      */
910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    1,    2,    0,    1,    2,    0,    0,    1,    2,    0,    0,    1,    0,    0,    0 },
920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 2:  sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1: 0      */
930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    2,    1,    2,    1,    0,    2,    1,    0,    0,    1,    0,    0,    0,    0,    0 },
940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 3:  sigCtx = 2                                     */
950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2 },
960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    },
970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 0:  sigCtx = (xP+yP == 0) ? 2 : (xP+yP < 3) ? 1: 0 */
990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    1,    1,    0,    1,    1,    0,    0,    1,    0,    0,    0,    0,    0,    0,    0 },
1000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 1:  sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1: 0      */
1010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    2,    2,    2,    1,    1,    1,    1,    0,    0,    0,    0,    0,    0,    0,    0 },
1020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 2:  sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1: 0      */
1030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    1,    0,    0,    2,    1,    0,    0,    2,    1,    0,    0,    2,    1,    0,    0 },
1040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 3:  sigCtx = 2                                     */
1050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2 },
1060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    },
1070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 0:  sigCtx = (xP+yP == 0) ? 2 : (xP+yP < 3) ? 1: 0 */
1090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    1,    1,    0,    1,    1,    0,    0,    1,    0,    0,    0,    0,    0,    0,    0 },
1100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 1:  sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1: 0      */
1110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    1,    0,    0,    2,    1,    0,    0,    2,    1,    0,    0,    2,    1,    0,    0 },
1120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 2:  sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1: 0      */
1130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    2,    2,    2,    1,    1,    1,    1,    0,    0,    0,    0,    0,    0,    0,    0 },
1140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* nbr csbf = 3:  sigCtx = 2                                     */
1150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        { 2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2 },
1160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    },
1170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar};
1200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/**
1240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *****************************************************************************
1250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  * @brief  returns context increment for sig coeff for 4x4 tranform size as
1260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *         per Table 9-39 in section 9.3.3.1.4
1270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *
1280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  * input   : coeff idx in raster order (0-15)
1290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *
1300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  * output  : context increment for sig coeff flag
1310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *
1320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  *****************************************************************************
1330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar  */
1340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarconst UWORD8 gau1_ihevcd_sigcoeff_ctxtinc_tr4[3][16] =
1350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
1360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Upright diagonal scan */
1370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        0,    2,    1,    6,
1390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        3,    4,    7,    6,
1400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        4,    5,    7,    8,
1410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        5,    8,    8,    8,
1420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    },
1430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Horizontal scan */
1440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        0,    1,    4,    5,
1460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        2,    3,    4,    5,
1470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        6,    6,    8,    8,
1480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        7,    7,    8,    8,
1490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    },
1500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Vertical scan */
1510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        0,    2,    6,    7,
1530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        1,    3,    6,    7,
1540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        4,    4,    8,    8,
1550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        5,    5,    8,    8,
1560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    },
1570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar};
1580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/**
1610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*******************************************************************************
1620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
1630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @brief
1640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  Parses Residual coding
1650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
1660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @par Description:
1670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  Parses Residual coding as per  Section:7.3.13
1680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
1690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @param[in] ps_codec
1700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  Pointer to codec context
1710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
1720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @returns  error code from IHEVCD_ERROR_T
1730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
1740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @remarks
1750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
1760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
1770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*******************************************************************************
1780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*/
1790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish MahendrakarWORD32 ihevcd_parse_residual_coding(codec_t *ps_codec,
1810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                    WORD32 x0, WORD32 y0,
1820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                    WORD32 log2_trafo_size,
1830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                    WORD32 c_idx,
1840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                    WORD32 intra_pred_mode)
1850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
1860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
1870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 transform_skip_flag;
1880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 value;
1890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pps_t *ps_pps;
1900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 last_scan_pos, last_sub_blk;
1910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
1920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 last_significant_coeff_x_prefix, last_significant_coeff_y_prefix;
1930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 last_significant_coeff_x, last_significant_coeff_y;
1943d2ea5037ccc3cd4b08f957dff4d342e84a77284Harish Mahendrakar    const UWORD8 *pu1_scan_blk = NULL, *pu1_scan_coeff;
1950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 scan_idx;
1960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 i;
1970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 sign_data_hiding_flag;
1980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
1990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 gt1_ctxt = 1;
2000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 c_max;
2010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD16 au2_csbf[9];
2020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    tu_sblk_coeff_data_t *ps_tu_sblk_coeff_data;
2030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 *pi1_num_coded_subblks;
2040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 num_subblks;
2050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 sig_coeff_base_ctxt, abs_gt1_base_ctxt;
2060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(x0);
2070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(y0);
2080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    ps_pps = ps_codec->s_parse.ps_pps;
2090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    sign_data_hiding_flag = ps_pps->i1_sign_data_hiding_flag;
2110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    transform_skip_flag = 0;
2120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(ps_pps->i1_transform_skip_enabled_flag &&
2130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar       !ps_codec->s_parse.s_cu.i4_cu_transquant_bypass &&
2140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar       (log2_trafo_size == 2))
2150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
2160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 ctxt_idx;
2170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(!c_idx)
2190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
2200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx = IHEVC_CAB_TFM_SKIP0;
2210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
2230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
2240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx = IHEVC_CAB_TFM_SKIP12;
2250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        TRACE_CABAC_CTXT("transform_skip_flag", ps_cabac->u4_range, ctxt_idx);
2270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        value = ihevcd_cabac_decode_bin(ps_cabac,
2280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        ps_bitstrm,
2290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        ctxt_idx);
2300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        AEV_TRACE("transform_skip_flag", value, ps_cabac->u4_range);
2310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        transform_skip_flag = value;
2320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
2330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* code the last_coeff_x_prefix as tunary binarized code */
2350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
2360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 ctxt_idx_x, ctxt_idx_y, ctx_shift;
2370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 ctx_offset;
2380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        c_max = (log2_trafo_size << 1) - 1;
2390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(!c_idx)
2410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
2420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctx_offset = (3 * (log2_trafo_size - 2)) + ((log2_trafo_size - 1) >> 2);
2430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx_x = IHEVC_CAB_COEFFX_PREFIX + ctx_offset;
2440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx_y = IHEVC_CAB_COEFFY_PREFIX + ctx_offset;
2450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctx_shift  = (log2_trafo_size + 1) >> 2;
2460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
2480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
2490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx_x = IHEVC_CAB_COEFFX_PREFIX + 15;
2500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx_y = IHEVC_CAB_COEFFY_PREFIX + 15;
2510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctx_shift  = log2_trafo_size  - 2;
2520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        TRACE_CABAC_CTXT("last_coeff_x_prefix", ps_cabac->u4_range, ctxt_idx_x);
2550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        last_significant_coeff_x_prefix = ihevcd_cabac_decode_bins_tunary(ps_cabac,
2560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          ps_bitstrm,
2570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          c_max,
2580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          ctxt_idx_x,
2590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          ctx_shift,
2600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          c_max);
2610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        AEV_TRACE("last_coeff_x_prefix", last_significant_coeff_x_prefix, ps_cabac->u4_range);
2630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        TRACE_CABAC_CTXT("last_coeff_y_prefix", ps_cabac->u4_range, ctxt_idx_y);
2650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        last_significant_coeff_y_prefix = ihevcd_cabac_decode_bins_tunary(ps_cabac,
2660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          ps_bitstrm,
2670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          c_max,
2680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          ctxt_idx_y,
2690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          ctx_shift,
2700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                          c_max);
2710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        AEV_TRACE("last_coeff_y_prefix", last_significant_coeff_y_prefix, ps_cabac->u4_range);
2730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        last_significant_coeff_x = last_significant_coeff_x_prefix;
2760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(last_significant_coeff_x_prefix > 3)
2770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
2780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 suf_length = ((last_significant_coeff_x_prefix - 2) >> 1);
2790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            value = ihevcd_cabac_decode_bypass_bins(ps_cabac,
2810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                    ps_bitstrm,
2820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                    suf_length);
2830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            AEV_TRACE("last_coeff_x_suffix", value, ps_cabac->u4_range);
2850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            last_significant_coeff_x =
2880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            (1 << ((last_significant_coeff_x_prefix >> 1) - 1)) *
2890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            (2 + (last_significant_coeff_x_prefix & 1)) + value;
2900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        last_significant_coeff_y = last_significant_coeff_y_prefix;
2940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(last_significant_coeff_y_prefix > 3)
2950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
2960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 suf_length = ((last_significant_coeff_y_prefix - 2) >> 1);
2970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            value = ihevcd_cabac_decode_bypass_bins(ps_cabac,
2980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                    ps_bitstrm,
2990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                    suf_length);
3000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            AEV_TRACE("last_coeff_y_suffix", value, ps_cabac->u4_range);
3020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            last_significant_coeff_y =
3030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            (1 << ((last_significant_coeff_y_prefix >> 1) - 1)) *
3040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            (2 + (last_significant_coeff_y_prefix & 1)) + value;
3050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
3060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Choose a scan matrix based on intra flag, intra pred mode, transform size
3100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar     and luma/chroma */
3110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    scan_idx = SCAN_DIAG_UPRIGHT;
3120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(PRED_MODE_INTRA == ps_codec->s_parse.s_cu.i4_pred_mode)
3130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if((2 == log2_trafo_size) || ((3 == log2_trafo_size) && (0 == c_idx)))
3150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
3160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            if((6 <= intra_pred_mode) &&
3170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar               (14 >= intra_pred_mode))
3180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
3190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                scan_idx = SCAN_VERT;
3200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
3210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            else if((22 <= intra_pred_mode) &&
3220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    (30 >= intra_pred_mode))
3230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
3240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                scan_idx = SCAN_HORZ;
3250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
3260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
3270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* In case the scan is vertical, then swap  X and Y positions */
3300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(SCAN_VERT == scan_idx)
3310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        SWAP(last_significant_coeff_x, last_significant_coeff_y);
3330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD8 *pi1_scan_idx;
3370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD8 *pi1_buf = (WORD8 *)ps_codec->s_parse.pv_tu_coeff_data;
3380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* First WORD8 gives number of coded subblocks */
3400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pi1_num_coded_subblks = pi1_buf++;
3410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Set number of coded subblocks in the current TU to zero */
3430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* This will be updated later */
3440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        *pi1_num_coded_subblks = 0;
3450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Second WORD8 gives (scan idx << 1) | trans_skip */
3470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pi1_scan_idx = pi1_buf++;
3480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        *pi1_scan_idx = (scan_idx << 1) | transform_skip_flag;
3490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Store the incremented pointer in pv_tu_coeff_data */
3510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ps_codec->s_parse.pv_tu_coeff_data = pi1_buf;
3520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /**
3550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar     * Given last_significant_coeff_y and last_significant_coeff_x find last sub block
3560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar     * This is done by ignoring lower two bits of last_significant_coeff_y and last_significant_coeff_x
3570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar     * and using scan matrix for lookup
3580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar     */
3590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If transform is 4x4, last_sub_blk is zero */
3610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    last_sub_blk = 0;
3620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If transform is larger than 4x4, then based on scan_idx and transform size, choose a scan table */
3640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(log2_trafo_size > 2)
3660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 scan_pos;
3680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 scan_mat_size;
3690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_scan_blk = (UWORD8 *)gapv_ihevc_scan[scan_idx * 3 + (log2_trafo_size - 2 - 1)];
3700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Divide the current transform to 4x4 subblocks and count number of 4x4 in the first row */
3730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* This will be size of scan matrix to be used for subblock scanning */
3740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        scan_mat_size = 1 << (log2_trafo_size - 2);
3750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        scan_pos = ((last_significant_coeff_y >> 2) * scan_mat_size) +
3760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        (last_significant_coeff_x >> 2);
3770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        last_sub_blk = pu1_scan_blk[scan_pos];
3790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_scan_coeff  = &gau1_ihevc_scan4x4[scan_idx][0];
3810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 scan_pos;
3840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        scan_pos = ((last_significant_coeff_y & 3) << 2) +
3860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        (last_significant_coeff_x & 3);
3870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        last_scan_pos = pu1_scan_coeff[scan_pos];
3890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3903d2ea5037ccc3cd4b08f957dff4d342e84a77284Harish Mahendrakar    if(log2_trafo_size > 2)
3913d2ea5037ccc3cd4b08f957dff4d342e84a77284Harish Mahendrakar        pu1_scan_blk = (UWORD8 *)gapv_ihevc_invscan[scan_idx * 3 + (log2_trafo_size - 2 - 1)];
3920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_scan_coeff  = &gau1_ihevc_invscan4x4[scan_idx][0];
3930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Set CSBF array to zero */
3950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        UWORD32 *pu4_csbf;
3970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu4_csbf = (void *)au2_csbf;
3980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        *pu4_csbf++ = 0;
3990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        *pu4_csbf++ = 0;
4000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        *pu4_csbf++ = 0;
4010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        *pu4_csbf = 0;
4020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* To avoid a check for y pos, 9th WORD16 in the array is set to zero */
4030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au2_csbf[8] = 0;
4040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /*************************************************************************/
4070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* derive base context index for sig coeff as per section 9.3.3.1.4      */
4080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* TODO; convert to look up based on luma/chroma, scan type and tfr size */
4090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /*************************************************************************/
4100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(!c_idx)
4110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG;
4130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG;
4140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(3 == log2_trafo_size)
4160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
4170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* 8x8 transform size */
4180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            sig_coeff_base_ctxt += (scan_idx == SCAN_DIAG_UPRIGHT) ? 9 : 15;
4190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
4200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else  if(3 < log2_trafo_size)
4210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
4220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* larger transform sizes */
4230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            sig_coeff_base_ctxt += 21;
4240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
4250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
4270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* chroma context initializations */
4290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG + 27;
4300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG + 16;
4310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(3 == log2_trafo_size)
4330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
4340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* 8x8 transform size */
4350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            sig_coeff_base_ctxt += 9;
4360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
4370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else  if(3 < log2_trafo_size)
4380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
4390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* larger transform sizes */
4400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            sig_coeff_base_ctxt += 12;
4410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
4420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    num_subblks = 0;
4440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Parse each 4x4 subblocks */
4450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(i = last_sub_blk; i >= 0; i--)
4460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 sub_blk_pos;
4480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 infer_sig_coeff_flag;
4490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 cur_csbf;
4500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 n;
4520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 num_coeff;
4530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Sig coeff map for 16 entries in raster scan order. Upper 16 bits are used.
4540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar         * MSB gives sig coeff flag for 0th coeff and so on
4550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar         * UWORD16 would have been enough but kept as UWORD32 for code optimizations
4560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar         * In arm unnecessary masking operations are saved
4570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar         */
4580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        UWORD32 u4_sig_coeff_map_raster;
4590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 sign_hidden;
4600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Sig coeff map in scan order */
4620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        UWORD32 u4_sig_coeff_map;
4630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 coeff_abs_level_greater2_flag;
4640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        UWORD32 u4_coeff_abs_level_greater1_map;
4650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        UWORD32 u4_coeff_abs_level_greater2_map;
4660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        UWORD32 u4_coeff_sign_map;
4670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 first_sig_scan_pos, last_sig_scan_pos, num_greater1_flag, first_greater1_scan_pos;
4680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32  num_sig_coeff, sum_abs_level;
4690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 nbr_csbf;
4700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 ctxt_set;
4730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 rice_param;
4740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 xs, ys;
4750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        sub_blk_pos  = 0;
4780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(i && (log2_trafo_size > 2))
4790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            sub_blk_pos = pu1_scan_blk[i];
4800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Get xs and ys from scan position */
4820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* This is needed for context modelling of significant coeff flag */
4830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        xs = sub_blk_pos & ((1 << (log2_trafo_size - 2)) - 1);
4840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ys = sub_blk_pos >> (log2_trafo_size - 2);
4850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Check if neighbor subblocks are coded */
4880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
4890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            nbr_csbf = 0;
4910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Get Bottom sub blocks CSBF */
4930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            nbr_csbf |= (au2_csbf[ys + 1] >> xs) & 1;
4940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            nbr_csbf <<= 1;
4950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Get Right sub blocks CSBF */
4970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Even if xs is equal to (1 << (log2_trafo_size - 2 )) - 1,
4980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar               since au2_csbf is set to zero at the beginning, csbf for
4990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar               neighbor will be read as 0 */
5000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            nbr_csbf |= (au2_csbf[ys] >> (xs + 1)) & 1;
5020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
5050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        cur_csbf = 0;
5060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* DC coeff is inferred, only if coded_sub_block is explicitly parsed as 1 */
5080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* i.e. it is not inferred for first and last subblock */
5090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        infer_sig_coeff_flag = 0;
5100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if((i < last_sub_blk) && (i > 0))
5110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
5120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 ctxt_idx  = IHEVC_CAB_CODED_SUBLK_IDX;
5130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* ctxt based on right / bottom avail csbf, section 9.3.3.1.3 */
5150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx += (nbr_csbf) ? 1 : 0;
5160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Ctxt based on luma or chroma */
5180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx += c_idx  ? 2 : 0;
5190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            TRACE_CABAC_CTXT("coded_sub_block_flag", ps_cabac->u4_range, ctxt_idx);
5200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            IHEVCD_CABAC_DECODE_BIN(cur_csbf, ps_cabac, ps_bitstrm, ctxt_idx);
5210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            AEV_TRACE("coded_sub_block_flag", cur_csbf, ps_cabac->u4_range);
5220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            infer_sig_coeff_flag = 1;
5240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
5250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else /* if((i == last_sub_blk) || (sub_blk_pos == 0)) */
5260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
5270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* CSBF is set to 1 for first and last subblock */
5280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Note for these subblocks sig_coeff_map is not inferred but instead parsed */
5290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            cur_csbf = 1;
5300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
5310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Set current sub blocks CSBF */
5330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
5340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            UWORD32 u4_mask = 1 << xs;
5350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            if(cur_csbf)
5360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                au2_csbf[ys] |= u4_mask;
5370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            else
5380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                au2_csbf[ys] &= ~u4_mask;
5390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
5410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* If current subblock is not coded, proceed to the next subblock */
5430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 == cur_csbf)
5440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            continue;
5450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        n = 15;
5470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u4_sig_coeff_map_raster = 0;
5480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u4_sig_coeff_map = 0;
5490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        num_coeff = 0;
5500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(i == last_sub_blk)
5510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
5520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 pos = ((last_significant_coeff_y & 3) << 2) +
5530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            (last_significant_coeff_x & 3);
5540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            n = (last_scan_pos - 1);
5550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Set Significant coeff map for last significant coeff flag as 1 */
5560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u4_sig_coeff_map_raster = 1 << pos;
5570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u4_sig_coeff_map = 1 << last_scan_pos;
5580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            num_coeff = 1;
5590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
5600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(; n >= 0; n--)
5620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
5630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 significant_coeff_flag;
5640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            if((n > 0 || !infer_sig_coeff_flag))
5660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
5670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                //WORD32 coeff_pos;
5680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 sig_ctxinc;
5690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 ctxt_idx;
5700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* Coefficient position is needed for deriving context index for significant_coeff_flag */
5720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                //coeff_pos = pu1_scan_coeff[n];
5730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* derive the context inc as per section 9.3.3.1.4 */
5740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                sig_ctxinc = 0;
5750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(2 == log2_trafo_size)
5760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
5770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* 4x4 transform size increment uses lookup */
5790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    sig_ctxinc = gau1_ihevcd_sigcoeff_ctxtinc_tr4[scan_idx][n];
5800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
5810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                else if(n || i)
5820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
5830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* ctxt for AC coeff depends on curpos and neigbour csbf */
5840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    sig_ctxinc = gau1_ihevcd_sigcoeff_ctxtinc[scan_idx][nbr_csbf][n];
5850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* based on luma subblock pos */
5870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    sig_ctxinc += (i && (!c_idx)) ? 3 : 0;
5880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
5900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                else
5910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
5920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* DC coeff has fixed context for luma and chroma */
5930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    sig_coeff_base_ctxt = (0 == c_idx) ? IHEVC_CAB_COEFF_FLAG :
5940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                         (IHEVC_CAB_COEFF_FLAG + 27);
5950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
5960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                ctxt_idx = sig_ctxinc + sig_coeff_base_ctxt;
5980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                TRACE_CABAC_CTXT("significant_coeff_flag", ps_cabac->u4_range, ctxt_idx);
5990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                IHEVCD_CABAC_DECODE_BIN(significant_coeff_flag, ps_cabac,
6000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        ps_bitstrm,
6010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                        ctxt_idx);
6020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                AEV_TRACE("significant_coeff_flag", significant_coeff_flag, ps_cabac->u4_range);
6030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* If at least one non-zero coeff is signalled then do not infer sig coeff map */
6060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* for (0,0) coeff in the current sub block */
6070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(significant_coeff_flag)
6080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    infer_sig_coeff_flag = 0;
6090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar//                u4_sig_coeff_map_raster |= significant_coeff_flag
6110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar//                              << coeff_pos;
6120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u4_sig_coeff_map |= significant_coeff_flag << n;
6130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                num_coeff += significant_coeff_flag;
6140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
6150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
6180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /*********************************************************************/
6190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* If infer_sig_coeff_flag is 1 then treat the 0th coeff as non zero */
6200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* If infer_sig_coeff_flag is zero, then last significant_coeff_flag */
6210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* is parsed in the above loop                                       */
6220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /*********************************************************************/
6230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(infer_sig_coeff_flag)
6240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
6250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u4_sig_coeff_map_raster |= 1;
6260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u4_sig_coeff_map |= 1;
6270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            num_coeff++;
6280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
6290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /*********************************************************************/
6310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* First subblock does not get an explicit csbf. It is assumed to    */
6320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* be 1. For this subblock there is chance of getting all            */
6330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* sig_coeff_flags to be zero. In such a case proceed to the next    */
6340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* subblock(which is end of parsing for the current transform block) */
6350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /*********************************************************************/
6360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 == num_coeff)
6380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            continue;
6390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Increment number of coded subblocks for the current TU */
6410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        num_subblks++;
6420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Set sig coeff map and subblock position */
6440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ps_tu_sblk_coeff_data = (tu_sblk_coeff_data_t *)ps_codec->s_parse.pv_tu_coeff_data;
6450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ps_tu_sblk_coeff_data->u2_sig_coeff_map = u4_sig_coeff_map;
6460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ps_tu_sblk_coeff_data->u2_subblk_pos = (ys << 8) | xs;
6470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        first_sig_scan_pos = 16;
6490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        last_sig_scan_pos = -1;
6500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        num_greater1_flag = 0;
6510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        first_greater1_scan_pos = -1;
6520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u4_coeff_abs_level_greater1_map = 0;
6530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* context set based on luma subblock pos */
6560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ctxt_set = (i && (!c_idx)) ? 2 : 0;
6570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* See section 9.3.3.1.5           */
6590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ctxt_set += (0 == gt1_ctxt) ? 1 : 0;
6600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        gt1_ctxt = 1;
6620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Instead of initializing n to 15, set it to 31-CLZ(sig coeff map) */
6630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
6640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            UWORD32 u4_sig_coeff_map_shift;
6650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            UWORD32 clz;
6660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            clz = CLZ(u4_sig_coeff_map);
6670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            n = 31 - clz;
6680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u4_sig_coeff_map_shift = u4_sig_coeff_map << clz;
6690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* For loop for n changed to do while to break early if sig_coeff_map_shift becomes zero */
6700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            do
6710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
6720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                //WORD32 coeff_pos;
6730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 ctxt_idx;
6740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                //TODO: Scan lookup will be removed later and instead u4_sig_coeff_map will be used
6760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                //coeff_pos = pu1_scan_coeff[n];
6770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if((u4_sig_coeff_map_shift >> 31) & 1)
6790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
6800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* abs_level_greater1_flag is sent for only first 8 non-zero levels in a subblock */
6820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if(num_greater1_flag < 8)
6830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    {
6840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        WORD32 coeff_abs_level_greater1_flag;
6850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        ctxt_idx = (ctxt_set * 4) + abs_gt1_base_ctxt + gt1_ctxt;
6870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        TRACE_CABAC_CTXT("coeff_abs_level_greater1_flag", ps_cabac->u4_range, ctxt_idx);
6890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        IHEVCD_CABAC_DECODE_BIN(coeff_abs_level_greater1_flag, ps_cabac, ps_bitstrm, ctxt_idx);
6900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        AEV_TRACE("coeff_abs_level_greater1_flag", coeff_abs_level_greater1_flag, ps_cabac->u4_range);
6910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        u4_coeff_abs_level_greater1_map |= coeff_abs_level_greater1_flag << n;
6930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        num_greater1_flag++;
6940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* first_greater1_scan_pos is obtained using CLZ on u4_coeff_abs_level_greater1_map*/
6960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /*  outside the loop instead of the following check inside the loop                */
6970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /* if( coeff_abs_level_greater1_flag && first_greater1_scan_pos == -1) */
6980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        /*    first_greater1_scan_pos = n;                                     */
6990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if(coeff_abs_level_greater1_flag)
7010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
7020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            gt1_ctxt = 0;
7030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
7040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        else if(gt1_ctxt && (gt1_ctxt < 3))
7050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
7060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            gt1_ctxt++;
7070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
7080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    }
7100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    else
7110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        break;
7120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* instead of computing last and first significan scan position using checks below */
7140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* They are computed outside the loop using CLZ and CTZ on sig_coeff_map */
7150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* if(last_sig_scan_pos == -1)                          */
7160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /*    last_sig_scan_pos = n;                            */
7170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /*  first_sig_scan_pos = n;                             */
7180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
7190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u4_sig_coeff_map_shift <<= 1;
7200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                n--;
7210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* If there are zero coeffs, then shift by as many zero coeffs and decrement n */
7220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                clz = CLZ(u4_sig_coeff_map_shift);
7230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u4_sig_coeff_map_shift <<= clz;
7240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                n -= clz;
7250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }while(u4_sig_coeff_map_shift);
7260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
7270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* At this level u4_sig_coeff_map is non-zero i.e. has atleast one non-zero coeff */
7280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        last_sig_scan_pos = (31 - CLZ(u4_sig_coeff_map));
7290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        first_sig_scan_pos = CTZ(u4_sig_coeff_map);
7300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        sign_hidden = (((last_sig_scan_pos - first_sig_scan_pos) > 3) && !ps_codec->s_parse.s_cu.i4_cu_transquant_bypass);
7310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u4_coeff_abs_level_greater2_map = 0;
7330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(u4_coeff_abs_level_greater1_map)
7350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
7360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Check if the first level > 1 is greater than 2 */
7370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 ctxt_idx;
7380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            first_greater1_scan_pos = (31 - CLZ(u4_coeff_abs_level_greater1_map));
7390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx = IHEVC_CAB_COEFABS_GRTR2_FLAG;
7420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ctxt_idx += (!c_idx) ? ctxt_set : (ctxt_set + 4);
7440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            TRACE_CABAC_CTXT("coeff_abs_level_greater2_flag", ps_cabac->u4_range, ctxt_idx);
7450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            IHEVCD_CABAC_DECODE_BIN(coeff_abs_level_greater2_flag, ps_cabac, ps_bitstrm, ctxt_idx);
7460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            AEV_TRACE("coeff_abs_level_greater2_flag", coeff_abs_level_greater2_flag, ps_cabac->u4_range);
7470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u4_coeff_abs_level_greater2_map = coeff_abs_level_greater2_flag << first_greater1_scan_pos;
7480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
7490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u4_coeff_sign_map = 0;
7520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Parse sign flags */
7540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(!sign_data_hiding_flag || !sign_hidden)
7550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
7560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            IHEVCD_CABAC_DECODE_BYPASS_BINS(value, ps_cabac, ps_bitstrm, num_coeff);
7570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            AEV_TRACE("sign_flags", value, ps_cabac->u4_range);
7580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u4_coeff_sign_map = value << (32 - num_coeff);
7590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
7600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
7610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
7620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            IHEVCD_CABAC_DECODE_BYPASS_BINS(value, ps_cabac, ps_bitstrm, (num_coeff - 1));
7630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            AEV_TRACE("sign_flags", value, ps_cabac->u4_range);
7640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u4_coeff_sign_map = value << (32 - (num_coeff - 1));
7650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
7660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        num_sig_coeff = 0;
7680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        sum_abs_level = 0;
7690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        rice_param = 0;
7700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
7710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            UWORD32 clz;
7720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            UWORD32 u4_sig_coeff_map_shift;
7730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            clz = CLZ(u4_sig_coeff_map);
7740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            n = 31 - clz;
7750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u4_sig_coeff_map_shift = u4_sig_coeff_map << clz;
7760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* For loop for n changed to do while to break early if sig_coeff_map_shift becomes zero */
7770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            do
7780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
7790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if((u4_sig_coeff_map_shift >> 31) & 1)
7810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
7820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    WORD32 base_lvl;
7830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    WORD32 coeff_abs_level_remaining;
7840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    WORD32 level;
7850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    base_lvl = 1;
7860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* Update base_lvl if it is greater than 1 */
7880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if((u4_coeff_abs_level_greater1_map >> n) & 1)
7890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        base_lvl++;
7900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* Update base_lvl if it is greater than 2 */
7920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if((u4_coeff_abs_level_greater2_map >> n) & 1)
7930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        base_lvl++;
7940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* If level is greater than 3/2/1 based on the greater1 and greater2 maps,
7960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                     * decode remaining level (level - base_lvl) will be signalled as bypass bins
7970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                     */
7980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    coeff_abs_level_remaining = 0;
7990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if(base_lvl == ((num_sig_coeff < 8) ? ((n == first_greater1_scan_pos) ? 3 : 2) : 1))
8000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    {
8010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        UWORD32 u4_prefix;
8020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        WORD32 bin;
8030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        u4_prefix = 0;
8050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        do
8070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
8080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            IHEVCD_CABAC_DECODE_BYPASS_BIN(bin, ps_cabac, ps_bitstrm);
8090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            u4_prefix++;
8100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            if((WORD32)u4_prefix == 19 - rice_param)
8120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            {
8130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                bin = 1;
8140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                break;
8150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            }
8160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }while(bin);
8180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        u4_prefix = u4_prefix - 1;
8200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if(u4_prefix < 3)
8210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
8220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            UWORD32 u4_suffix;
8230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            coeff_abs_level_remaining = (u4_prefix << rice_param);
8250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            if(rice_param)
8260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            {
8270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_suffix, ps_cabac, ps_bitstrm, rice_param);
8280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                coeff_abs_level_remaining |= u4_suffix;
8300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            }
8310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
8320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        else
8330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        {
8340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            UWORD32 u4_suffix;
8350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            UWORD32 u4_numbins;
8360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            //u4_prefix = CLIP3(u4_prefix, 0, 19 - rice_param);
8380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            u4_numbins = (u4_prefix - 3 + rice_param);
8400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            coeff_abs_level_remaining = (((1 << (u4_prefix - 3)) + 3 - 1) << rice_param);
8410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            if(u4_numbins)
8420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            {
8430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_suffix, ps_cabac, ps_bitstrm, u4_numbins);
8440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                coeff_abs_level_remaining += u4_suffix;
8450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            }
8460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        }
8470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        AEV_TRACE("coeff_abs_level_remaining", coeff_abs_level_remaining, ps_cabac->u4_range);
8500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        base_lvl += coeff_abs_level_remaining;
8510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    }
8530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* update the rice param based on coeff level */
8550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if((base_lvl > (3 << rice_param)) && (rice_param < 4))
8560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    {
8570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        rice_param++;
8580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    }
8590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* Compute absolute level */
8610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    level = base_lvl;
8620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* Update level with the sign */
8640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if((u4_coeff_sign_map >> 31) & 1)
8650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        level = -level;
8660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    u4_coeff_sign_map <<= 1;
8680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* Update sign in case sign is hidden */
8690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    if(sign_data_hiding_flag && sign_hidden)
8700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    {
8710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        sum_abs_level += base_lvl;
8720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        if(n == first_sig_scan_pos && ((sum_abs_level % 2) == 1))
8740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                            level = -level;
8750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    }
8760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    /* Store the resulting level in non-zero level array */
8780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    ps_tu_sblk_coeff_data->ai2_level[num_sig_coeff++] = level;
8790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    //AEV_TRACE("level", level, 0);
8800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
8810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u4_sig_coeff_map_shift <<= 1;
8820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                n--;
8830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                /* If there are zero coeffs, then shift by as many zero coeffs and decrement n */
8840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                clz = CLZ(u4_sig_coeff_map_shift);
8850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u4_sig_coeff_map_shift <<= clz;
8860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                n -= clz;
8870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }while(u4_sig_coeff_map_shift);
8900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* Increment the pv_tu_sblk_coeff_data */
8930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            UWORD8 *pu1_buf = (UWORD8 *)ps_codec->s_parse.pv_tu_coeff_data;
8950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_buf += sizeof(tu_sblk_coeff_data_t) - SUBBLK_COEFF_CNT * sizeof(WORD16);
8960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_buf += num_coeff * sizeof(WORD16);
8970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            ps_codec->s_parse.pv_tu_coeff_data = pu1_buf;
8980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
9000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
9020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Set number of coded sub blocks in the current TU */
9030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    *pi1_num_coded_subblks = num_subblks;
9040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    return ret;
9060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
907