1*54e60f84SAndroid Build Coastguard Worker /* 2*54e60f84SAndroid Build Coastguard Worker * Copyright (c) 2007-2017 Intel Corporation. All Rights Reserved. 3*54e60f84SAndroid Build Coastguard Worker * 4*54e60f84SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*54e60f84SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the 6*54e60f84SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including 7*54e60f84SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish, 8*54e60f84SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to 9*54e60f84SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to 10*54e60f84SAndroid Build Coastguard Worker * the following conditions: 11*54e60f84SAndroid Build Coastguard Worker * 12*54e60f84SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the 13*54e60f84SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions 14*54e60f84SAndroid Build Coastguard Worker * of the Software. 15*54e60f84SAndroid Build Coastguard Worker * 16*54e60f84SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17*54e60f84SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18*54e60f84SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19*54e60f84SAndroid Build Coastguard Worker * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR 20*54e60f84SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21*54e60f84SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22*54e60f84SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23*54e60f84SAndroid Build Coastguard Worker */ 24*54e60f84SAndroid Build Coastguard Worker 25*54e60f84SAndroid Build Coastguard Worker /** 26*54e60f84SAndroid Build Coastguard Worker * \file va_fei_hevc.h 27*54e60f84SAndroid Build Coastguard Worker * \brief The FEI encoding HEVC special API 28*54e60f84SAndroid Build Coastguard Worker */ 29*54e60f84SAndroid Build Coastguard Worker 30*54e60f84SAndroid Build Coastguard Worker 31*54e60f84SAndroid Build Coastguard Worker #ifndef __VA_FEI_HEVC_H__ 32*54e60f84SAndroid Build Coastguard Worker #define __VA_FEI_HEVC_H__ 33*54e60f84SAndroid Build Coastguard Worker 34*54e60f84SAndroid Build Coastguard Worker #ifdef __cplusplus 35*54e60f84SAndroid Build Coastguard Worker extern "C" { 36*54e60f84SAndroid Build Coastguard Worker #endif 37*54e60f84SAndroid Build Coastguard Worker 38*54e60f84SAndroid Build Coastguard Worker #include <stdint.h> 39*54e60f84SAndroid Build Coastguard Worker #include "va_fei.h" 40*54e60f84SAndroid Build Coastguard Worker 41*54e60f84SAndroid Build Coastguard Worker /** 42*54e60f84SAndroid Build Coastguard Worker * \defgroup api_fei_hevc HEVC FEI encoding API 43*54e60f84SAndroid Build Coastguard Worker * 44*54e60f84SAndroid Build Coastguard Worker * @{ 45*54e60f84SAndroid Build Coastguard Worker */ 46*54e60f84SAndroid Build Coastguard Worker 47*54e60f84SAndroid Build Coastguard Worker /** \brief FEI frame level control buffer for HEVC */ 48*54e60f84SAndroid Build Coastguard Worker typedef struct _VAEncMiscParameterFEIFrameControlHEVC { 49*54e60f84SAndroid Build Coastguard Worker /* one of the VAConfigAttribFEIFunctionType values */ 50*54e60f84SAndroid Build Coastguard Worker uint32_t function; 51*54e60f84SAndroid Build Coastguard Worker /** \brief CTB control input buffer. It is valid only when per_ctb_input 52*54e60f84SAndroid Build Coastguard Worker * is set to 1. The data in this buffer correspond to the input source. CTB is in raster scan order, 53*54e60f84SAndroid Build Coastguard Worker * each CTB control data structure is defined by VAEncFEICTBControlHEVC. 54*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of CTBs multiplied by 55*54e60f84SAndroid Build Coastguard Worker * sizeof(VAEncFEICTBControlHEVC). 56*54e60f84SAndroid Build Coastguard Worker */ 57*54e60f84SAndroid Build Coastguard Worker VABufferID ctb_ctrl; 58*54e60f84SAndroid Build Coastguard Worker /** \brief CTB cmd per CTB data output of ENC 59*54e60f84SAndroid Build Coastguard Worker * it is reserved for CTB level information 60*54e60f84SAndroid Build Coastguard Worker * it should include CU split information and other CTB datas . 61*54e60f84SAndroid Build Coastguard Worker * Each CTB block has one CTB cmd data. 62*54e60f84SAndroid Build Coastguard Worker */ 63*54e60f84SAndroid Build Coastguard Worker VABufferID ctb_cmd; 64*54e60f84SAndroid Build Coastguard Worker /** \brief CU record data output of ENC 65*54e60f84SAndroid Build Coastguard Worker * it is reserved for CU level information 66*54e60f84SAndroid Build Coastguard Worker * it should include CU detail data. include mode,MV, reference etc. 67*54e60f84SAndroid Build Coastguard Worker * Each CTB block has one CU record data. 68*54e60f84SAndroid Build Coastguard Worker */ 69*54e60f84SAndroid Build Coastguard Worker VABufferID cu_record; 70*54e60f84SAndroid Build Coastguard Worker /** \brief distortion output of ENC or ENC_PAK. 71*54e60f84SAndroid Build Coastguard Worker * Each CTB has one distortion data with VAEncFEIDistortionHevc 72*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of CTBs multiplied by 73*54e60f84SAndroid Build Coastguard Worker * sizeof(VAEncFEIDistortionHevc). 74*54e60f84SAndroid Build Coastguard Worker */ 75*54e60f84SAndroid Build Coastguard Worker VABufferID distortion; 76*54e60f84SAndroid Build Coastguard Worker /** \brief Qp input buffer. It is valid only when per_block_qp is set to 1. 77*54e60f84SAndroid Build Coastguard Worker * The data in this buffer correspond to the input source. 78*54e60f84SAndroid Build Coastguard Worker * One Qp per block block is in raster scan order, each Qp is a signed char (8-bit) value. 79*54e60f84SAndroid Build Coastguard Worker **/ 80*54e60f84SAndroid Build Coastguard Worker VABufferID qp; 81*54e60f84SAndroid Build Coastguard Worker /** \brief MV predictor. It is valid only when mv_predictor_input is set to non-zero. 82*54e60f84SAndroid Build Coastguard Worker * Each CTB block has one or more pair of motion vectors and the corresponding 83*54e60f84SAndroid Build Coastguard Worker * reference indexes as defined by VAEncFEIMVPredictorHEVC. 32x32 block is in raster scan order. 84*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of 16x16 blocks multiplied by 85*54e60f84SAndroid Build Coastguard Worker * sizeof(VAEncFEIMVPredictorHEVC). */ 86*54e60f84SAndroid Build Coastguard Worker VABufferID mv_predictor; 87*54e60f84SAndroid Build Coastguard Worker 88*54e60f84SAndroid Build Coastguard Worker /** \brief number of MV predictors L0 and L1. the maximum number of motion vector predictor for a 16x16, 32x32 or 89*54e60f84SAndroid Build Coastguard Worker * 64x64 block is four, it must not be greater than maximum supported MV predictor, 90*54e60f84SAndroid Build Coastguard Worker **/ 91*54e60f84SAndroid Build Coastguard Worker uint32_t num_mv_predictors_l0 : 16; 92*54e60f84SAndroid Build Coastguard Worker uint32_t num_mv_predictors_l1 : 16; 93*54e60f84SAndroid Build Coastguard Worker 94*54e60f84SAndroid Build Coastguard Worker /** \brief control parameters */ 95*54e60f84SAndroid Build Coastguard Worker uint32_t search_path : 8; 96*54e60f84SAndroid Build Coastguard Worker uint32_t len_sp : 8; 97*54e60f84SAndroid Build Coastguard Worker uint32_t reserved0 : 16; 98*54e60f84SAndroid Build Coastguard Worker 99*54e60f84SAndroid Build Coastguard Worker /** \brief multi pred l0/1 100*54e60f84SAndroid Build Coastguard Worker * 0000: no internal MV predictor will be used 101*54e60f84SAndroid Build Coastguard Worker * 0001: spatial MV predictors 102*54e60f84SAndroid Build Coastguard Worker * 0100/1000: Reserved 103*54e60f84SAndroid Build Coastguard Worker **/ 104*54e60f84SAndroid Build Coastguard Worker uint32_t multi_pred_l0 : 4; 105*54e60f84SAndroid Build Coastguard Worker uint32_t multi_pred_l1 : 4; 106*54e60f84SAndroid Build Coastguard Worker /** \brief defines the motion vector precision, like integer/half/quarter pel. 107*54e60f84SAndroid Build Coastguard Worker * 00b: integer pel 108*54e60f84SAndroid Build Coastguard Worker * 01b: half-pel 109*54e60f84SAndroid Build Coastguard Worker * 10b: reserved 110*54e60f84SAndroid Build Coastguard Worker * 11b: quarter-pel 111*54e60f84SAndroid Build Coastguard Worker */ 112*54e60f84SAndroid Build Coastguard Worker uint32_t sub_pel_mode : 2; 113*54e60f84SAndroid Build Coastguard Worker uint32_t adaptive_search : 1; 114*54e60f84SAndroid Build Coastguard Worker /** \brief mv_predictor_input 115*54e60f84SAndroid Build Coastguard Worker * 000: MV predictor disabled 116*54e60f84SAndroid Build Coastguard Worker * 001: MV predictor enabled per 16x16 block 117*54e60f84SAndroid Build Coastguard Worker * 010: MV predictor enabled per 32x32 block 118*54e60f84SAndroid Build Coastguard Worker * 011: MV predictor enabled per 64x64 block 119*54e60f84SAndroid Build Coastguard Worker * 111: MV predictor enabled, block size can vary and is determined by BlockSize in motion vector predictor buffer 120*54e60f84SAndroid Build Coastguard Worker * 100/101/110: Reserved 121*54e60f84SAndroid Build Coastguard Worker **/ 122*54e60f84SAndroid Build Coastguard Worker uint32_t mv_predictor_input : 3; 123*54e60f84SAndroid Build Coastguard Worker /** \brief enables per CTB or CU qp */ 124*54e60f84SAndroid Build Coastguard Worker uint32_t per_block_qp : 1; 125*54e60f84SAndroid Build Coastguard Worker /** \brief enables the per CTB input , if 1, need ctb_ctrl to be a real surface ID*/ 126*54e60f84SAndroid Build Coastguard Worker uint32_t per_ctb_input : 1; 127*54e60f84SAndroid Build Coastguard Worker /** when this flag is set, extra distortion between current CTB and co-located CTB is provided. 128*54e60f84SAndroid Build Coastguard Worker * Extra distortion output has performance impact, set it only when it is needed */ 129*54e60f84SAndroid Build Coastguard Worker uint32_t colocated_ctb_distortion : 1; 130*54e60f84SAndroid Build Coastguard Worker /** brief specifies whether this CTB should be forced to split to remove Inter big LCU: do not check Inter 32x32 131*54e60f84SAndroid Build Coastguard Worker * PUs. Every 32x32 LCU is split at least once. It can be used to improved performance. 132*54e60f84SAndroid Build Coastguard Worker * 0: ENC determined block type 133*54e60f84SAndroid Build Coastguard Worker * 1: Force to split 134*54e60f84SAndroid Build Coastguard Worker **/ 135*54e60f84SAndroid Build Coastguard Worker uint32_t force_lcu_split : 1; 136*54e60f84SAndroid Build Coastguard Worker /** \brief enables CU64x64 check */ 137*54e60f84SAndroid Build Coastguard Worker uint32_t enable_cu64_check : 1; 138*54e60f84SAndroid Build Coastguard Worker /** \brief enables CU64x64 asymmetric motion partition check */ 139*54e60f84SAndroid Build Coastguard Worker uint32_t enable_cu64_amp_check : 1; 140*54e60f84SAndroid Build Coastguard Worker /** \brief specifies if check the 64x64 merge candidate 141*54e60f84SAndroid Build Coastguard Worker * 0: after skip check, 142*54e60f84SAndroid Build Coastguard Worker * 1: only skip check for 64x64 143*54e60f84SAndroid Build Coastguard Worker Default: 0. This field is used by LCU64 bi-directional. 144*54e60f84SAndroid Build Coastguard Worker **/ 145*54e60f84SAndroid Build Coastguard Worker uint32_t cu64_skip_check_only : 1; 146*54e60f84SAndroid Build Coastguard Worker uint32_t reserved1 : 11; 147*54e60f84SAndroid Build Coastguard Worker /** specifies the search region width in pixels. 148*54e60f84SAndroid Build Coastguard Worker * When bidirectional search is enabled, this applies to both search regions */ 149*54e60f84SAndroid Build Coastguard Worker uint32_t ref_width : 8; 150*54e60f84SAndroid Build Coastguard Worker /** specifies the reference region height in pixels. When bidirectional search is enabled, 151*54e60f84SAndroid Build Coastguard Worker * this applies to both search regions. */ 152*54e60f84SAndroid Build Coastguard Worker uint32_t ref_height : 8; 153*54e60f84SAndroid Build Coastguard Worker /** \brief search window similar for AVC 154*54e60f84SAndroid Build Coastguard Worker * defines predefined search windows. If it is selected, RefWidth, RefHeight, LenSP and SearchPath are ignored. 155*54e60f84SAndroid Build Coastguard Worker * 0 : not use predefined search window 156*54e60f84SAndroid Build Coastguard Worker * 1 : Tiny – (4 SUs) 24x24 window diamond search 157*54e60f84SAndroid Build Coastguard Worker * 2 : Small – (9 SUs) 28x28 window diamond search 158*54e60f84SAndroid Build Coastguard Worker * 3 : Diamond – (16 SUs) 48x40 window diamond search 159*54e60f84SAndroid Build Coastguard Worker * 4 : Large Diamond – (32 SUs) 48x40 window diamond search 160*54e60f84SAndroid Build Coastguard Worker * 5 : Exhaustive – 48x40 window full search 161*54e60f84SAndroid Build Coastguard Worker * 6 : (64 SUs) 64x64 window full search 162*54e60f84SAndroid Build Coastguard Worker * Note: option 1, 2, 3 and 4 are valid only when CAP parameter SearchWindow64Support is 0. 163*54e60f84SAndroid Build Coastguard Worker * And option 6 is valid only when SearchWindow64Support is 1.*/ 164*54e60f84SAndroid Build Coastguard Worker uint32_t search_window : 8; 165*54e60f84SAndroid Build Coastguard Worker /** \brief number of internal MV predictors for IME searches */ 166*54e60f84SAndroid Build Coastguard Worker uint32_t max_num_ime_search_center : 3; 167*54e60f84SAndroid Build Coastguard Worker /** \brief fast intra prediction enabling bit. It is used as a trade-off between speed and quality. 168*54e60f84SAndroid Build Coastguard Worker * The flag will be ignored if it's unsupported in the driver*/ 169*54e60f84SAndroid Build Coastguard Worker uint32_t fast_intra_mode : 1; 170*54e60f84SAndroid Build Coastguard Worker uint32_t reserved2 : 4; 171*54e60f84SAndroid Build Coastguard Worker 172*54e60f84SAndroid Build Coastguard Worker /** \brief specifies number of splits that encoder could be run concurrently 173*54e60f84SAndroid Build Coastguard Worker * 1: level 1, default value 174*54e60f84SAndroid Build Coastguard Worker * 2: level 2 175*54e60f84SAndroid Build Coastguard Worker * 4: level 3 176*54e60f84SAndroid Build Coastguard Worker **/ 177*54e60f84SAndroid Build Coastguard Worker uint32_t num_concurrent_enc_frame_partition : 8; 178*54e60f84SAndroid Build Coastguard Worker uint32_t reserved3 : 24; 179*54e60f84SAndroid Build Coastguard Worker 180*54e60f84SAndroid Build Coastguard Worker /** \brief max frame size control with multi passes QP setting */ 181*54e60f84SAndroid Build Coastguard Worker uint32_t max_frame_size; 182*54e60f84SAndroid Build Coastguard Worker /** \brief number of passes, every pass has different QP */ 183*54e60f84SAndroid Build Coastguard Worker uint32_t num_passes; 184*54e60f84SAndroid Build Coastguard Worker /** \brief delta QP list for every pass */ 185*54e60f84SAndroid Build Coastguard Worker uint8_t *delta_qp; 186*54e60f84SAndroid Build Coastguard Worker 187*54e60f84SAndroid Build Coastguard Worker uint32_t reserved4[2]; 188*54e60f84SAndroid Build Coastguard Worker } VAEncMiscParameterFEIFrameControlHEVC; 189*54e60f84SAndroid Build Coastguard Worker 190*54e60f84SAndroid Build Coastguard Worker /** \brief Application can use this definition as reference to allocate the buffer 191*54e60f84SAndroid Build Coastguard Worker * based on MaxNumPredictor returned from attribute VAConfigAttribFEIMVPredictors query. 192*54e60f84SAndroid Build Coastguard Worker * this buffer allocation is always based on 16x16 block even block size is indicated as 32x32 or 64x64, and buffer 193*54e60f84SAndroid Build Coastguard Worker * layout is always in 32x32 block raster scan order even block size is 16x16 or 64x64. If 32x32 block size is set, 194*54e60f84SAndroid Build Coastguard Worker * only the data in the first 16x16 block (block 0) is used for 32x32 block. If 64x64 block size is set 195*54e60f84SAndroid Build Coastguard Worker * MV layout is still in 32x32 raster scan order, the same as 32x32 and the first 16x16 196*54e60f84SAndroid Build Coastguard Worker * block within each 32x32 block needs to have intended MV data (four 32x32 blocks will have the same MV data in the 197*54e60f84SAndroid Build Coastguard Worker * correspondent first 16x16 block). Data structure for each 16x16 block is defined as below (same as AVC except 198*54e60f84SAndroid Build Coastguard Worker * BlockSize/Reserved bits). 199*54e60f84SAndroid Build Coastguard Worker **/ 200*54e60f84SAndroid Build Coastguard Worker typedef struct _VAEncFEIMVPredictorHEVC { 201*54e60f84SAndroid Build Coastguard Worker /** \brief Feference index corresponding to the entry of RefPicList0 & RefPicList1 in slice header (final reference 202*54e60f84SAndroid Build Coastguard Worker * list). Note that RefPicList0 & RefPicList1 needs to be the same for all slices. 203*54e60f84SAndroid Build Coastguard Worker * Ref0xIndex – RefPicList0; Ref1xIndex – RefPicList1; x – 0 ~ MaxNumPredictor */ 204*54e60f84SAndroid Build Coastguard Worker struct { 205*54e60f84SAndroid Build Coastguard Worker uint8_t ref_idx_l0 : 4; 206*54e60f84SAndroid Build Coastguard Worker uint8_t ref_idx_l1 : 4; 207*54e60f84SAndroid Build Coastguard Worker } ref_idx[4]; /* index is predictor number */ 208*54e60f84SAndroid Build Coastguard Worker /** \brief Valid only when MVPredictor is set to 011 for HEVC. Only valid in the first 16x16 block. 209*54e60f84SAndroid Build Coastguard Worker * 00: MV predictor disabled for this 32x32 block 210*54e60f84SAndroid Build Coastguard Worker * 01: MV predictor enabled per 16x16 block for this 32x32 block 211*54e60f84SAndroid Build Coastguard Worker * 10: MV predictor enabled per 32x32 block, the rest of 16x16 block data within this 32x32 block are ignored 212*54e60f84SAndroid Build Coastguard Worker * 11: Reserved */ 213*54e60f84SAndroid Build Coastguard Worker uint32_t block_size : 2; 214*54e60f84SAndroid Build Coastguard Worker uint32_t reserved : 30; 215*54e60f84SAndroid Build Coastguard Worker 216*54e60f84SAndroid Build Coastguard Worker VAMotionVector mv[4]; /* MaxNumPredictor is 4 */ 217*54e60f84SAndroid Build Coastguard Worker } VAEncFEIMVPredictorHEVC; //40 bytes 218*54e60f84SAndroid Build Coastguard Worker 219*54e60f84SAndroid Build Coastguard Worker /** \brief FEI CTB level control data structure */ 220*54e60f84SAndroid Build Coastguard Worker typedef struct _VAEncFEICTBControlHEVC { 221*54e60f84SAndroid Build Coastguard Worker // DWORD 0 222*54e60f84SAndroid Build Coastguard Worker uint32_t force_to_intra : 1; 223*54e60f84SAndroid Build Coastguard Worker uint32_t force_to_inter : 1; 224*54e60f84SAndroid Build Coastguard Worker uint32_t force_to_skip : 1; 225*54e60f84SAndroid Build Coastguard Worker /** \brief force all coeff to zero */ 226*54e60f84SAndroid Build Coastguard Worker uint32_t force_to_zero_coeff : 1; 227*54e60f84SAndroid Build Coastguard Worker uint32_t reserved0 : 28; 228*54e60f84SAndroid Build Coastguard Worker // DWORD 1 229*54e60f84SAndroid Build Coastguard Worker uint32_t reserved1; 230*54e60f84SAndroid Build Coastguard Worker // DWORD 2 231*54e60f84SAndroid Build Coastguard Worker uint32_t reserved2; 232*54e60f84SAndroid Build Coastguard Worker // DWORD 3 233*54e60f84SAndroid Build Coastguard Worker uint32_t reserved3; 234*54e60f84SAndroid Build Coastguard Worker } VAEncFEICTBControlHEVC; 235*54e60f84SAndroid Build Coastguard Worker 236*54e60f84SAndroid Build Coastguard Worker /** \brief VAEncFEIDistortionHevc defines the data structure for VAEncFEIDistortionBufferType per CTB block. 237*54e60f84SAndroid Build Coastguard Worker * It is output buffer of ENC and ENC_PAK modes, The CTB block is in raster scan order. 238*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of CTB blocks multiple by sizeof(VAEncFEIDistortionHevc). 239*54e60f84SAndroid Build Coastguard Worker **/ 240*54e60f84SAndroid Build Coastguard Worker typedef struct _VAEncFEIDistortionHevc { 241*54e60f84SAndroid Build Coastguard Worker /** best CTB distortion */ 242*54e60f84SAndroid Build Coastguard Worker uint32_t best_distortion; 243*54e60f84SAndroid Build Coastguard Worker /** only when colocated_ctb_distortion in VAEncMiscParameterFEIFrameControlHEVC is set */ 244*54e60f84SAndroid Build Coastguard Worker uint32_t colocated_ctb_distortion; 245*54e60f84SAndroid Build Coastguard Worker } VAEncFEIDistortionHevc; 246*54e60f84SAndroid Build Coastguard Worker 247*54e60f84SAndroid Build Coastguard Worker /**@}*/ 248*54e60f84SAndroid Build Coastguard Worker 249*54e60f84SAndroid Build Coastguard Worker #ifdef __cplusplus 250*54e60f84SAndroid Build Coastguard Worker } 251*54e60f84SAndroid Build Coastguard Worker #endif 252*54e60f84SAndroid Build Coastguard Worker 253*54e60f84SAndroid Build Coastguard Worker #endif 254*54e60f84SAndroid Build Coastguard Worker 255