You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
230 lines
7.5 KiB
230 lines
7.5 KiB
/******************************************************************************
|
|
*
|
|
* 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_ */
|