/******************************************************************************
*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*****************************************************************************
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/**
*******************************************************************************
* @file
* ihevc_rdoq_macros.h
*
* @brief
* Macros used for RDOQ algorthm
*
* @author
* Ittiam
*
* @remarks
* None
*
*******************************************************************************
*/
#ifndef IHEVC_RDOQ_MACROS_H_
#define IHEVC_RDOQ_MACROS_H_
/*****************************************************************************/
/* Constant Macros */
/*****************************************************************************/
/*Used for calculating the distortion in the transform domain*/
#define CALC_SSD_IN_TRANS_DOMAIN(a, b, i4_round_val, i4_shift_val) \
(SHR_NEG(((((a) - (b)) * ((a) - (b))) + i4_round_val), i4_shift_val))
#define CALC_CUMMUL_SSD_IN_TRANS_DOMAIN(a, b, i4_round_val, i4_shift_val) \
(SHR_NEG((((a) - (b)) + i4_round_val), i4_shift_val))
#define MAX_INT 0x7FFFFFFF
#define COMPUTE_RATE_COST_CLIP30_RDOQ(r, l, qshift) \
((WORD32)CLIP30((((ULWORD64)r) * ((ULWORD64)l)) >> (qshift)))
/*This macro is required to test the RDOQ changes*/
/*1 implies cabac context validation using the test-bench*/
/*Also prints some debug information*/
#define TEST_BENCH_RDOQ 0
/*Macro to enable and disable coefficient RDOQ. When 1, coefficient RDOQ is enabled*/
#define COEFF_RDOQ 0
/*Macro to optimize the copying of cabac states across various temp/scratch cabac contexts
Should always be 0 when COEFF_RDOQ is 1*/
#define OPT_MEMCPY 1
/** Macro which accounts subtracts 4096 bits from the total bits generated per TU in the RDOPT stage
if SBH is on*/
#define ACCOUNT_SIGN_BITS 0
/*Macro defining the maximum number of context elements in the cabac state*/
//#define MAX_NUM_CONTEXT_ELEMENTS 5
/*****************************************************************************/
/* Enum */
/*****************************************************************************/
/*Enum to indicate which context element in the cabac state is currently being altered*/
typedef enum
{
LASTXY,
SUB_BLK_CODED_FLAG,
SIG_COEFF,
GRTR_THAN_1,
GRTR_THAN_2,
MAX_NUM_CONTEXT_ELEMENTS
} BACKUP_CTXT_ELEMENTS;
/*****************************************************************************/
/* Structures */
/*****************************************************************************/
/*Structure defined to optimize copying of cabac states across various temporary/scratch cabac states*/
typedef struct
{
// clang-format off
/**
ai4_ctxt_to_backup[x] tells us if xth element has been altered. where
x context element Meaning
0 IHEVC_CAB_COEFFX_PREFIX lastx last y has been coded
1 IHEVC_CAB_CODED_SUBLK_IDX sub-blk coded or not flag has been coded
2 IHEVC_CAB_COEFF_FLAG sigcoeff has been coded
3 IHEVC_CAB_COEFABS_GRTR1_FLAG greater than 1 bin has been coded
4 IHEVC_CAB_COEFABS_GRTR2_FLAG greater than 2 bin has been coded
*/
// clang-format on
UWORD8 au1_ctxt_to_backup[MAX_NUM_CONTEXT_ELEMENTS];
/** Number of bits generated */
WORD32 i4_num_bits;
} backup_ctxt_t;
/**
******************************************************************************
* @brief Structure to store the position of the coefficient to be changed
through SBH
******************************************************************************
*/
typedef struct
{
UWORD8 x;
UWORD8 y;
UWORD8 is_valid_pos;
WORD16 i2_old_coeff;
} s_sbh_coeff_pos_t;
/**
******************************************************************************
* @brief RDOQ SBH context for cabac bit estimation etc
******************************************************************************
*/
typedef struct
{
/** TU size */
WORD32 i4_trans_size;
/** Log 2 TU size */
WORD32 i4_log2_trans_size;
/**
* Boolean value representing if the current TU is luma or not.
* 1 => Luma
*/
WORD32 i4_is_luma;
/**
* Calculate rounding and shifting values required for normalizing original
* and inverse quantized transform coefficients (for calculation of SSD in
* transform domain)
*/
WORD32 i4_round_val_ssd_in_td;
WORD32 i4_shift_val_ssd_in_td;
/** Matrix used in inverse quantization */
WORD32 quant_scale_mat_offset;
/** Index of the csb within the TU*/
WORD32 i4_trans_idx;
/** value of lambda used in the D+Rlambda metric*/
LWORD64 i8_cl_ssd_lambda_qf;
/** Used while inverse quantizing*/
WORD16 i2_qp_rem;
WORD32 i4_qp_div;
/** Scan index of the csbs within the TU */
WORD32 i4_scan_idx;
/** Pointer to the csbf buf. This buffer will contain 1 if the csb is coded
* and 0 if it is not*/
UWORD8 *pu1_csbf_buf;
/** Boolean value which is 1 if any of the csbs in the current TU are
* coded*/
UWORD8 i1_tu_is_coded;
/**
* Pointer to an array of pointer to store the scaling matrices for
* all transform sizes and qp % 6 (pre computed)
*/
WORD16 *pi2_dequant_coeff;
/** Pointer to the quantized coeffs*/
WORD16 *pi2_quant_coeffs;
/** Pointer to the inverse quantized values*/
WORD16 *pi2_iquant_coeffs;
/** Pointer ot the transformed values(before quantization) */
WORD16 *pi2_trans_values;
/** Stride of the inverse quant data*/
WORD32 i4_iq_data_strd;
/** Stride of the quant data*/
WORD32 i4_q_data_strd;
/** Intermediate array to store transform output for RDOQ*/
WORD16 ai2_trans_values[MAX_TRANS_SIZE];
/** Pointer to zero rows and zero cols*/
WORD32 *pi4_zero_row;
WORD32 *pi4_zero_col;
/** Array containing information about the position of the coefficient
* to be altered during SBH
*/
s_sbh_coeff_pos_t s_best_pos[(MAX_TU_SIZE * MAX_TU_SIZE / 4 / 4) + 1];
/** SSD cost for this particular TU*/
LWORD64 i8_ssd_cost;
WORD32 i4_perform_all_cand_rdoq;
WORD32 i4_perform_best_cand_rdoq;
WORD32 i4_perform_all_cand_sbh;
WORD32 i4_perform_best_cand_sbh;
WORD32 i4_bit_depth;
WORD32 *pi4_subBlock2csbfId_map;
} rdoq_sbh_ctxt_t;
/*****************************************************************************/
/* Extern Function Declarations */
/*****************************************************************************/
void ihevce_sign_data_hiding(rdoq_sbh_ctxt_t *ps_rdoq_sbh_params);
#endif /* IHEVC_RDOQ_MACROS_H_ */