C++程序  |  230行  |  7.49 KB

/******************************************************************************
 *
 * 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_ */