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_h264.h 27*54e60f84SAndroid Build Coastguard Worker * \brief The FEI encoding H264 special API 28*54e60f84SAndroid Build Coastguard Worker */ 29*54e60f84SAndroid Build Coastguard Worker 30*54e60f84SAndroid Build Coastguard Worker #ifndef VA_FEI_H264_H 31*54e60f84SAndroid Build Coastguard Worker #define VA_FEI_H264_H 32*54e60f84SAndroid Build Coastguard Worker 33*54e60f84SAndroid Build Coastguard Worker #ifdef __cplusplus 34*54e60f84SAndroid Build Coastguard Worker extern "C" { 35*54e60f84SAndroid Build Coastguard Worker #endif 36*54e60f84SAndroid Build Coastguard Worker 37*54e60f84SAndroid Build Coastguard Worker #include <stdint.h> 38*54e60f84SAndroid Build Coastguard Worker #include "va_fei.h" 39*54e60f84SAndroid Build Coastguard Worker 40*54e60f84SAndroid Build Coastguard Worker /** 41*54e60f84SAndroid Build Coastguard Worker * \defgroup api_fei_h264 H.264 FEI encoding API 42*54e60f84SAndroid Build Coastguard Worker * 43*54e60f84SAndroid Build Coastguard Worker * @{ 44*54e60f84SAndroid Build Coastguard Worker */ 45*54e60f84SAndroid Build Coastguard Worker 46*54e60f84SAndroid Build Coastguard Worker /** \brief FEI frame level control buffer for H.264 */ 47*54e60f84SAndroid Build Coastguard Worker typedef struct _VAEncMiscParameterFEIFrameControlH264 { 48*54e60f84SAndroid Build Coastguard Worker uint32_t function; /* one of the VAConfigAttribFEIFunctionType values */ 49*54e60f84SAndroid Build Coastguard Worker /** \brief MB (16x16) control input buffer. It is valid only when (mb_input | mb_size_ctrl) 50*54e60f84SAndroid Build Coastguard Worker * is set to 1. The data in this buffer correspond to the input source. 16x16 MB is in raster scan order, 51*54e60f84SAndroid Build Coastguard Worker * each MB control data structure is defined by VAEncFEIMBControlH264. 52*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of 16x16 blocks multiplied by 53*54e60f84SAndroid Build Coastguard Worker * sizeof(VAEncFEIMBControlH264). 54*54e60f84SAndroid Build Coastguard Worker * Note: if mb_qp is set, VAEncQPBufferH264 is expected. 55*54e60f84SAndroid Build Coastguard Worker */ 56*54e60f84SAndroid Build Coastguard Worker VABufferID mb_ctrl; 57*54e60f84SAndroid Build Coastguard Worker /** \brief distortion output of MB ENC or ENC_PAK. 58*54e60f84SAndroid Build Coastguard Worker * Each 16x16 block has one distortion data with VAEncFEIDistortionH264 layout 59*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of 16x16 blocks multiplied by 60*54e60f84SAndroid Build Coastguard Worker * sizeof(VAEncFEIDistortionH264). 61*54e60f84SAndroid Build Coastguard Worker */ 62*54e60f84SAndroid Build Coastguard Worker VABufferID distortion; 63*54e60f84SAndroid Build Coastguard Worker /** \brief MVs data output of MB ENC. 64*54e60f84SAndroid Build Coastguard Worker * Each 16x16 block has one MVs data with layout VAMotionVector 65*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of 16x16 blocks multiplied by 66*54e60f84SAndroid Build Coastguard Worker * sizeof(VAMotionVector) * 16. 67*54e60f84SAndroid Build Coastguard Worker */ 68*54e60f84SAndroid Build Coastguard Worker VABufferID mv_data; 69*54e60f84SAndroid Build Coastguard Worker /** \brief MBCode data output of MB ENC. 70*54e60f84SAndroid Build Coastguard Worker * Each 16x16 block has one MB Code data with layout VAEncFEIMBCodeH264 71*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of 16x16 blocks multiplied by 72*54e60f84SAndroid Build Coastguard Worker * sizeof(VAEncFEIMBCodeH264). 73*54e60f84SAndroid Build Coastguard Worker */ 74*54e60f84SAndroid Build Coastguard Worker VABufferID mb_code_data; 75*54e60f84SAndroid Build Coastguard Worker /** \brief QP input buffer with layout VAEncQPBufferH264. It is valid only when mb_qp is set to 1. 76*54e60f84SAndroid Build Coastguard Worker * The data in this buffer correspond to the input source. 77*54e60f84SAndroid Build Coastguard Worker * One QP per 16x16 block in raster scan order, each QP is a signed char (8-bit) value. 78*54e60f84SAndroid Build Coastguard Worker **/ 79*54e60f84SAndroid Build Coastguard Worker VABufferID qp; 80*54e60f84SAndroid Build Coastguard Worker /** \brief MV predictor. It is valid only when mv_predictor_enable is set to 1. 81*54e60f84SAndroid Build Coastguard Worker * Each 16x16 block has one or more pair of motion vectors and the corresponding 82*54e60f84SAndroid Build Coastguard Worker * reference indexes as defined by VAEncFEIMVPredictorH264. 16x16 block is in raster scan order. 83*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of 16x16 blocks multiplied by 84*54e60f84SAndroid Build Coastguard Worker * sizeof(VAEncFEIMVPredictorH264). */ 85*54e60f84SAndroid Build Coastguard Worker VABufferID mv_predictor; 86*54e60f84SAndroid Build Coastguard Worker 87*54e60f84SAndroid Build Coastguard Worker /** \brief number of MV predictors. It must not be greater than maximum supported MV predictor. */ 88*54e60f84SAndroid Build Coastguard Worker uint32_t num_mv_predictors_l0 : 16; 89*54e60f84SAndroid Build Coastguard Worker uint32_t num_mv_predictors_l1 : 16; 90*54e60f84SAndroid Build Coastguard Worker 91*54e60f84SAndroid Build Coastguard Worker /** \brief motion search method definition 92*54e60f84SAndroid Build Coastguard Worker * 0: default value, diamond search 93*54e60f84SAndroid Build Coastguard Worker * 1: full search 94*54e60f84SAndroid Build Coastguard Worker * 2: diamond search 95*54e60f84SAndroid Build Coastguard Worker **/ 96*54e60f84SAndroid Build Coastguard Worker uint32_t search_path : 8; 97*54e60f84SAndroid Build Coastguard Worker /** \brief maximum number of Search Units, valid range is [1, 63] 98*54e60f84SAndroid Build Coastguard Worker * 0 is treated as 1. reference search locations are grouped in a predefined pattern, 99*54e60f84SAndroid Build Coastguard Worker * and all locations within the same group must be either all are chosen or all are skipped. 100*54e60f84SAndroid Build Coastguard Worker * These predefined groups are called search unit (SU).*/ 101*54e60f84SAndroid Build Coastguard Worker uint32_t len_sp : 8; 102*54e60f84SAndroid Build Coastguard Worker uint32_t reserved0 : 16; 103*54e60f84SAndroid Build Coastguard Worker /** \brief defines the bit-mask for disabling sub-partition 104*54e60f84SAndroid Build Coastguard Worker * The lower 4 bits are for the major partitions (sub-macroblock) and the higher 3 bits for minor partitions (with sub-partition for 4x(8x8) sub-macroblocks. 105*54e60f84SAndroid Build Coastguard Worker * xxxxxx1 : 16x16 sub-macroblock disabled 106*54e60f84SAndroid Build Coastguard Worker * xxxxx1x : 2x(16x8) sub-macroblock within 16x16 disabled 107*54e60f84SAndroid Build Coastguard Worker * xxxx1xx : 2x(8x16) sub-macroblock within 16x16 disabled 108*54e60f84SAndroid Build Coastguard Worker * xxx1xxx : 1x(8x8) sub-partition for 4x(8x8) within 16x16 disabled 109*54e60f84SAndroid Build Coastguard Worker * xx1xxxx : 2x(8x4) sub-partition for 4x(8x8) within 16x16 disabled 110*54e60f84SAndroid Build Coastguard Worker * x1xxxxx : 2x(4x8) sub-partition for 4x(8x8) within 16x16 disabled 111*54e60f84SAndroid Build Coastguard Worker * 1xxxxxx : 4x(4x4) sub-partition for 4x(8x8) within 16x16 disabled 112*54e60f84SAndroid Build Coastguard Worker * 1111111 : Invalid 113*54e60f84SAndroid Build Coastguard Worker * 0000000 : default value */ 114*54e60f84SAndroid Build Coastguard Worker uint32_t sub_mb_part_mask : 7; 115*54e60f84SAndroid Build Coastguard Worker /** specifies which Luma Intra partition is enabled/disabled for intra mode decision. 116*54e60f84SAndroid Build Coastguard Worker * xxxx1: luma_intra_16x16 disabled 117*54e60f84SAndroid Build Coastguard Worker * xxx1x: luma_intra_8x8 disabled 118*54e60f84SAndroid Build Coastguard Worker * xx1xx: luma_intra_4x4 disabled 119*54e60f84SAndroid Build Coastguard Worker * xx111: intra prediction is disabled */ 120*54e60f84SAndroid Build Coastguard Worker uint32_t intra_part_mask : 5; 121*54e60f84SAndroid Build Coastguard Worker /** when set to 1, neighbor MV will be used as predictor; when set to 0, no neighbor MV will be used as predictor.*/ 122*54e60f84SAndroid Build Coastguard Worker uint32_t multi_pred_l0 : 1; 123*54e60f84SAndroid Build Coastguard Worker /** when set to 1, neighbor MV will be used as predictor; when set to 0, no neighbor MV will be used as predictor.*/ 124*54e60f84SAndroid Build Coastguard Worker uint32_t multi_pred_l1 : 1; 125*54e60f84SAndroid Build Coastguard Worker /**defines the half/quarter pel modes. The mode is inclusive, ie., higher precision mode samples lower precision locations. 126*54e60f84SAndroid Build Coastguard Worker * 00b: integer mode searching 127*54e60f84SAndroid Build Coastguard Worker * 01b: half-pel mode searching 128*54e60f84SAndroid Build Coastguard Worker * 10b: reserved 129*54e60f84SAndroid Build Coastguard Worker * 11b: quarter-pel mode searching */ 130*54e60f84SAndroid Build Coastguard Worker uint32_t sub_pel_mode : 2; 131*54e60f84SAndroid Build Coastguard Worker /** specifies distortion measure adjustments used for the inter motion search SAD comparison. 132*54e60f84SAndroid Build Coastguard Worker * 00b: none 133*54e60f84SAndroid Build Coastguard Worker * 10b: Haar transform adjusted*/ 134*54e60f84SAndroid Build Coastguard Worker uint32_t inter_sad : 2; 135*54e60f84SAndroid Build Coastguard Worker /** specifies distortion measure adjustments used for the intra motion search SAD comparison. 136*54e60f84SAndroid Build Coastguard Worker * 00b: none 137*54e60f84SAndroid Build Coastguard Worker * 10b: Haar transform adjusted*/ 138*54e60f84SAndroid Build Coastguard Worker uint32_t intra_sad : 2; 139*54e60f84SAndroid Build Coastguard Worker /** specifies if the output distortion is the raw distortion or cost adjusted distortion. 140*54e60f84SAndroid Build Coastguard Worker * 0: Raw Distortion without Cost 141*54e60f84SAndroid Build Coastguard Worker * 1: Distortion with added Cost */ 142*54e60f84SAndroid Build Coastguard Worker uint32_t distortion_type : 1; 143*54e60f84SAndroid Build Coastguard Worker /** when set to 1, enables the additional calls on Fraction & Bidirectional Refinement*/ 144*54e60f84SAndroid Build Coastguard Worker uint32_t repartition_check_enable : 1; 145*54e60f84SAndroid Build Coastguard Worker /** defines whether adaptive searching is enabled for IME(Integer Motion Estimation). 146*54e60f84SAndroid Build Coastguard Worker * 0: disable 147*54e60f84SAndroid Build Coastguard Worker * 1: enable */ 148*54e60f84SAndroid Build Coastguard Worker uint32_t adaptive_search : 1; 149*54e60f84SAndroid Build Coastguard Worker /** enables using the motion vector as an extra predictor provided by the host. If it is set, 150*54e60f84SAndroid Build Coastguard Worker * host needs to provide a buffer with motion vectors and the associated reference index for 151*54e60f84SAndroid Build Coastguard Worker * each 16x16 block as defined . The host can call processing function to get motion vectors and use as predictor. 152*54e60f84SAndroid Build Coastguard Worker * 0: MV predictor disabled 153*54e60f84SAndroid Build Coastguard Worker * 1: MV predictor enabled */ 154*54e60f84SAndroid Build Coastguard Worker uint32_t mv_predictor_enable : 1; 155*54e60f84SAndroid Build Coastguard Worker /** enables using the QP buffer to set the QP for each block*/ 156*54e60f84SAndroid Build Coastguard Worker uint32_t mb_qp : 1; 157*54e60f84SAndroid Build Coastguard Worker /** enable mb_ctrl buffer to handle MB*/ 158*54e60f84SAndroid Build Coastguard Worker uint32_t mb_input : 1; 159*54e60f84SAndroid Build Coastguard Worker /** when this flag is set, mb_ctrl must be set too and a buffer with per MB input 160*54e60f84SAndroid Build Coastguard Worker * needs to be provided and MaxSizeInWord and */ 161*54e60f84SAndroid Build Coastguard Worker uint32_t mb_size_ctrl : 1; 162*54e60f84SAndroid Build Coastguard Worker /** when this flag is set, extra distortion between the current MB and co-located MB is provided. 163*54e60f84SAndroid Build Coastguard Worker * Extra distortion output has performance impact, set it only when it is needed.*/ 164*54e60f84SAndroid Build Coastguard Worker uint32_t colocated_mb_distortion : 1; 165*54e60f84SAndroid Build Coastguard Worker uint32_t reserved1 : 4; 166*54e60f84SAndroid Build Coastguard Worker 167*54e60f84SAndroid Build Coastguard Worker /** \brief motion search window(ref_width * ref_height) */ 168*54e60f84SAndroid Build Coastguard Worker uint32_t ref_width : 8; 169*54e60f84SAndroid Build Coastguard Worker uint32_t ref_height : 8; 170*54e60f84SAndroid Build Coastguard Worker /** \brief predefined motion search windows. If selected, len_sp, window(ref_width * ref_eight) 171*54e60f84SAndroid Build Coastguard Worker * and search_path setting are ignored. 172*54e60f84SAndroid Build Coastguard Worker * 0: not use predefined search window 173*54e60f84SAndroid Build Coastguard Worker * 1: Tiny, len_sp=4, 24x24 window and diamond search 174*54e60f84SAndroid Build Coastguard Worker * 2: Small, len_sp=9, 28x28 window and diamond search 175*54e60f84SAndroid Build Coastguard Worker * 3: Diamond, len_sp=16, 48x40 window and diamond search 176*54e60f84SAndroid Build Coastguard Worker * 4: Large Diamond, len_sp=32, 48x40 window and diamond search 177*54e60f84SAndroid Build Coastguard Worker * 5: Exhaustive, len_sp=48, 48x40 window and full search 178*54e60f84SAndroid Build Coastguard Worker * 6: Extend Diamond, len_sp=16, 64x40 window and diamond search 179*54e60f84SAndroid Build Coastguard Worker * 7: Extend Large Diamond, len_sp=32, 64x40 window and diamond search 180*54e60f84SAndroid Build Coastguard Worker * 8: Extend Exhaustive, len_sp=48, 64x40 window and full search 181*54e60f84SAndroid Build Coastguard Worker **/ 182*54e60f84SAndroid Build Coastguard Worker uint32_t search_window : 4; 183*54e60f84SAndroid Build Coastguard Worker uint32_t reserved2 : 12; 184*54e60f84SAndroid Build Coastguard Worker 185*54e60f84SAndroid Build Coastguard Worker /** \brief max frame size control with multi passes QP setting */ 186*54e60f84SAndroid Build Coastguard Worker uint32_t max_frame_size; 187*54e60f84SAndroid Build Coastguard Worker /** \brief number of passes, every pass has different QP */ 188*54e60f84SAndroid Build Coastguard Worker uint32_t num_passes; 189*54e60f84SAndroid Build Coastguard Worker /** \brief delta QP list for every pass */ 190*54e60f84SAndroid Build Coastguard Worker uint8_t *delta_qp; 191*54e60f84SAndroid Build Coastguard Worker uint32_t reserved3[VA_PADDING_LOW]; 192*54e60f84SAndroid Build Coastguard Worker } VAEncMiscParameterFEIFrameControlH264; 193*54e60f84SAndroid Build Coastguard Worker 194*54e60f84SAndroid Build Coastguard Worker /** \brief FEI MB level control data structure */ 195*54e60f84SAndroid Build Coastguard Worker typedef struct _VAEncFEIMBControlH264 { 196*54e60f84SAndroid Build Coastguard Worker /** \brief when set, correposndent MB is coded as intra */ 197*54e60f84SAndroid Build Coastguard Worker uint32_t force_to_intra : 1; 198*54e60f84SAndroid Build Coastguard Worker /** \brief when set, correposndent MB is coded as skip */ 199*54e60f84SAndroid Build Coastguard Worker uint32_t force_to_skip : 1; 200*54e60f84SAndroid Build Coastguard Worker /** \brief specifies whether this macroblock should be coded as a non-skipped macroblock. */ 201*54e60f84SAndroid Build Coastguard Worker uint32_t force_to_nonskip : 1; 202*54e60f84SAndroid Build Coastguard Worker uint32_t enable_direct_bias_adjustment : 1; 203*54e60f84SAndroid Build Coastguard Worker uint32_t enable_motion_bias_adjustment : 1; 204*54e60f84SAndroid Build Coastguard Worker uint32_t ext_mv_cost_scaling_factor : 3; 205*54e60f84SAndroid Build Coastguard Worker uint32_t reserved0 : 24; 206*54e60f84SAndroid Build Coastguard Worker 207*54e60f84SAndroid Build Coastguard Worker uint32_t reserved1; 208*54e60f84SAndroid Build Coastguard Worker 209*54e60f84SAndroid Build Coastguard Worker uint32_t reserved2; 210*54e60f84SAndroid Build Coastguard Worker 211*54e60f84SAndroid Build Coastguard Worker uint32_t reserved3 : 16; 212*54e60f84SAndroid Build Coastguard Worker /** \brief when mb_size_ctrl is set, size here is used to budget accumulatively. Set to 0xFF if don't care. */ 213*54e60f84SAndroid Build Coastguard Worker uint32_t target_size_in_word : 8; 214*54e60f84SAndroid Build Coastguard Worker /** \brief specifies the max size of each MB */ 215*54e60f84SAndroid Build Coastguard Worker uint32_t max_size_in_word : 8; 216*54e60f84SAndroid Build Coastguard Worker } VAEncFEIMBControlH264; 217*54e60f84SAndroid Build Coastguard Worker 218*54e60f84SAndroid Build Coastguard Worker 219*54e60f84SAndroid Build Coastguard Worker /** \brief Application can use this definition as reference to allocate the buffer 220*54e60f84SAndroid Build Coastguard Worker * based on MaxNumPredictor returned from attribute VAConfigAttribFEIMVPredictors query. 221*54e60f84SAndroid Build Coastguard Worker **/ 222*54e60f84SAndroid Build Coastguard Worker typedef struct _VAEncFEIMVPredictorH264 { 223*54e60f84SAndroid Build Coastguard Worker /** \brief Reference index corresponding to the entry of RefPicList0 & RefPicList1 in VAEncSliceParameterBufferH264. 224*54e60f84SAndroid Build Coastguard Worker * Note that RefPicList0 & RefPicList1 needs to be the same for all slices. 225*54e60f84SAndroid Build Coastguard Worker * ref_idx_l0_x : index to RefPicList0; ref_idx_l1_x : index to RefPicList1; x : 0 - MaxNumPredictor. 226*54e60f84SAndroid Build Coastguard Worker **/ 227*54e60f84SAndroid Build Coastguard Worker struct { 228*54e60f84SAndroid Build Coastguard Worker uint8_t ref_idx_l0 : 4; 229*54e60f84SAndroid Build Coastguard Worker uint8_t ref_idx_l1 : 4; 230*54e60f84SAndroid Build Coastguard Worker } ref_idx[4]; /* index is predictor number */ 231*54e60f84SAndroid Build Coastguard Worker uint32_t reserved; 232*54e60f84SAndroid Build Coastguard Worker /** \brief MV. MaxNumPredictor must be the returned value from attribute VAConfigAttribFEIMVPredictors query. 233*54e60f84SAndroid Build Coastguard Worker * Even application doesn't use the maximum predictors, the VAFEIMVPredictorH264 structure size 234*54e60f84SAndroid Build Coastguard Worker * has to be defined as maximum so each MB can be at a fixed location. 235*54e60f84SAndroid Build Coastguard Worker * Note that 0x8000 must be used for correspondent intra block. 236*54e60f84SAndroid Build Coastguard Worker **/ 237*54e60f84SAndroid Build Coastguard Worker VAMotionVector mv[4]; /* MaxNumPredictor is 4 */ 238*54e60f84SAndroid Build Coastguard Worker } VAEncFEIMVPredictorH264; 239*54e60f84SAndroid Build Coastguard Worker 240*54e60f84SAndroid Build Coastguard Worker /** \brief FEI output */ 241*54e60f84SAndroid Build Coastguard Worker /** 242*54e60f84SAndroid Build Coastguard Worker * Motion vector output is per 4x4 block. For each 4x4 block there is a pair of MVs 243*54e60f84SAndroid Build Coastguard Worker * for RefPicList0 and RefPicList1 and each MV is 4 bytes including horizontal and vertical directions. 244*54e60f84SAndroid Build Coastguard Worker * Depending on Subblock partition, for the shape that is not 4x4, the MV is replicated 245*54e60f84SAndroid Build Coastguard Worker * so each 4x4 block has a pair of MVs. The 16x16 block has 32 MVs (128 bytes). 246*54e60f84SAndroid Build Coastguard Worker * 0x8000 is used for correspondent intra block. The 16x16 block is in raster scan order, 247*54e60f84SAndroid Build Coastguard Worker * within the 16x16 block, each 4x4 block MV is ordered as below in memory. 248*54e60f84SAndroid Build Coastguard Worker * The buffer size shall be greater than or equal to the number of 16x16 blocks multiplied by 128 bytes. 249*54e60f84SAndroid Build Coastguard Worker * Note that, when separate ENC and PAK is enabled, the exact layout of this buffer is needed for PAK input. 250*54e60f84SAndroid Build Coastguard Worker * App can reuse this buffer, or copy to a different buffer as PAK input. 251*54e60f84SAndroid Build Coastguard Worker * Layout is defined as Generic motion vector data structure VAMotionVector 252*54e60f84SAndroid Build Coastguard Worker * 16x16 Block 253*54e60f84SAndroid Build Coastguard Worker * ----------------------------------------- 254*54e60f84SAndroid Build Coastguard Worker * | 1 | 2 | 5 | 6 | 255*54e60f84SAndroid Build Coastguard Worker * ----------------------------------------- 256*54e60f84SAndroid Build Coastguard Worker * | 3 | 4 | 7 | 8 | 257*54e60f84SAndroid Build Coastguard Worker * ----------------------------------------- 258*54e60f84SAndroid Build Coastguard Worker * | 9 | 10 | 13 | 14 | 259*54e60f84SAndroid Build Coastguard Worker * ----------------------------------------- 260*54e60f84SAndroid Build Coastguard Worker * | 11 | 12 | 15 | 16 | 261*54e60f84SAndroid Build Coastguard Worker * ----------------------------------------- 262*54e60f84SAndroid Build Coastguard Worker **/ 263*54e60f84SAndroid Build Coastguard Worker 264*54e60f84SAndroid Build Coastguard Worker /** \brief VAEncFEIMBCodeH264 defines the data structure for VAEncFEIMBCodeBufferType per 16x16 MB block. 265*54e60f84SAndroid Build Coastguard Worker * it is output buffer of ENC and ENC_PAK modes, it's also input buffer of PAK mode. 266*54e60f84SAndroid Build Coastguard Worker * The 16x16 block is in raster scan order. Buffer size shall not be less than the number of 16x16 blocks 267*54e60f84SAndroid Build Coastguard Worker * multiplied by sizeof(VAEncFEIMBCodeH264). Note that, when separate ENC and PAK is enabled, 268*54e60f84SAndroid Build Coastguard Worker * the exact layout of this buffer is needed for PAK input. App can reuse this buffer, 269*54e60f84SAndroid Build Coastguard Worker * or copy to a different buffer as PAK input, reserved elements must not be modified when used as PAK input. 270*54e60f84SAndroid Build Coastguard Worker **/ 271*54e60f84SAndroid Build Coastguard Worker typedef struct _VAEncFEIMBCodeH264 { 272*54e60f84SAndroid Build Coastguard Worker //DWORD 0~2 273*54e60f84SAndroid Build Coastguard Worker uint32_t reserved0[3]; 274*54e60f84SAndroid Build Coastguard Worker 275*54e60f84SAndroid Build Coastguard Worker //DWORD 3 276*54e60f84SAndroid Build Coastguard Worker uint32_t inter_mb_mode : 2; 277*54e60f84SAndroid Build Coastguard Worker uint32_t mb_skip_flag : 1; 278*54e60f84SAndroid Build Coastguard Worker uint32_t reserved1 : 1; 279*54e60f84SAndroid Build Coastguard Worker uint32_t intra_mb_mode : 2; 280*54e60f84SAndroid Build Coastguard Worker uint32_t reserved2 : 1; 281*54e60f84SAndroid Build Coastguard Worker uint32_t field_mb_polarity_flag : 1; 282*54e60f84SAndroid Build Coastguard Worker uint32_t mb_type : 5; 283*54e60f84SAndroid Build Coastguard Worker uint32_t intra_mb_flag : 1; 284*54e60f84SAndroid Build Coastguard Worker uint32_t field_mb_flag : 1; 285*54e60f84SAndroid Build Coastguard Worker uint32_t transform8x8_flag : 1; 286*54e60f84SAndroid Build Coastguard Worker uint32_t reserved3 : 1; 287*54e60f84SAndroid Build Coastguard Worker uint32_t dc_block_coded_cr_flag : 1; 288*54e60f84SAndroid Build Coastguard Worker uint32_t dc_block_coded_cb_flag : 1; 289*54e60f84SAndroid Build Coastguard Worker uint32_t dc_block_coded_y_flag : 1; 290*54e60f84SAndroid Build Coastguard Worker uint32_t reserved4 : 12; 291*54e60f84SAndroid Build Coastguard Worker 292*54e60f84SAndroid Build Coastguard Worker //DWORD 4 293*54e60f84SAndroid Build Coastguard Worker uint32_t horz_origin : 8; 294*54e60f84SAndroid Build Coastguard Worker uint32_t vert_origin : 8; 295*54e60f84SAndroid Build Coastguard Worker uint32_t cbp_y : 16; 296*54e60f84SAndroid Build Coastguard Worker 297*54e60f84SAndroid Build Coastguard Worker //DWORD 5 298*54e60f84SAndroid Build Coastguard Worker uint32_t cbp_cb : 16; 299*54e60f84SAndroid Build Coastguard Worker uint32_t cbp_cr : 16; 300*54e60f84SAndroid Build Coastguard Worker 301*54e60f84SAndroid Build Coastguard Worker //DWORD 6 302*54e60f84SAndroid Build Coastguard Worker uint32_t qp_prime_y : 8; 303*54e60f84SAndroid Build Coastguard Worker uint32_t reserved5 : 17; 304*54e60f84SAndroid Build Coastguard Worker uint32_t mb_skip_conv_disable : 1; 305*54e60f84SAndroid Build Coastguard Worker uint32_t is_last_mb : 1; 306*54e60f84SAndroid Build Coastguard Worker uint32_t enable_coefficient_clamp : 1; 307*54e60f84SAndroid Build Coastguard Worker uint32_t direct8x8_pattern : 4; 308*54e60f84SAndroid Build Coastguard Worker 309*54e60f84SAndroid Build Coastguard Worker //DWORD 7 8 and 9 310*54e60f84SAndroid Build Coastguard Worker union { 311*54e60f84SAndroid Build Coastguard Worker /* Intra MBs */ 312*54e60f84SAndroid Build Coastguard Worker struct { 313*54e60f84SAndroid Build Coastguard Worker uint32_t luma_intra_pred_modes0 : 16; 314*54e60f84SAndroid Build Coastguard Worker uint32_t luma_intra_pred_modes1 : 16; 315*54e60f84SAndroid Build Coastguard Worker 316*54e60f84SAndroid Build Coastguard Worker uint32_t luma_intra_pred_modes2 : 16; 317*54e60f84SAndroid Build Coastguard Worker uint32_t luma_intra_pred_modes3 : 16; 318*54e60f84SAndroid Build Coastguard Worker 319*54e60f84SAndroid Build Coastguard Worker uint32_t chroma_intra_pred_mode : 2; 320*54e60f84SAndroid Build Coastguard Worker uint32_t intra_pred_avail_flag : 5; 321*54e60f84SAndroid Build Coastguard Worker uint32_t intra_pred_avail_flagF : 1; 322*54e60f84SAndroid Build Coastguard Worker uint32_t reserved6 : 24; 323*54e60f84SAndroid Build Coastguard Worker } intra_mb; 324*54e60f84SAndroid Build Coastguard Worker 325*54e60f84SAndroid Build Coastguard Worker /* Inter MBs */ 326*54e60f84SAndroid Build Coastguard Worker struct { 327*54e60f84SAndroid Build Coastguard Worker uint32_t sub_mb_shapes : 8; 328*54e60f84SAndroid Build Coastguard Worker uint32_t sub_mb_pred_modes : 8; 329*54e60f84SAndroid Build Coastguard Worker uint32_t reserved7 : 16; 330*54e60f84SAndroid Build Coastguard Worker 331*54e60f84SAndroid Build Coastguard Worker uint32_t ref_idx_l0_0 : 8; 332*54e60f84SAndroid Build Coastguard Worker uint32_t ref_idx_l0_1 : 8; 333*54e60f84SAndroid Build Coastguard Worker uint32_t ref_idx_l0_2 : 8; 334*54e60f84SAndroid Build Coastguard Worker uint32_t ref_idx_l0_3 : 8; 335*54e60f84SAndroid Build Coastguard Worker 336*54e60f84SAndroid Build Coastguard Worker uint32_t ref_idx_l1_0 : 8; 337*54e60f84SAndroid Build Coastguard Worker uint32_t ref_idx_l1_1 : 8; 338*54e60f84SAndroid Build Coastguard Worker uint32_t ref_idx_l1_2 : 8; 339*54e60f84SAndroid Build Coastguard Worker uint32_t ref_idx_l1_3 : 8; 340*54e60f84SAndroid Build Coastguard Worker } inter_mb; 341*54e60f84SAndroid Build Coastguard Worker } mb_mode; 342*54e60f84SAndroid Build Coastguard Worker 343*54e60f84SAndroid Build Coastguard Worker //DWORD 10 344*54e60f84SAndroid Build Coastguard Worker uint32_t reserved8 : 16; 345*54e60f84SAndroid Build Coastguard Worker uint32_t target_size_in_word : 8; 346*54e60f84SAndroid Build Coastguard Worker uint32_t max_size_in_word : 8; 347*54e60f84SAndroid Build Coastguard Worker 348*54e60f84SAndroid Build Coastguard Worker //DWORD 11~14 349*54e60f84SAndroid Build Coastguard Worker uint32_t reserved9[4]; 350*54e60f84SAndroid Build Coastguard Worker 351*54e60f84SAndroid Build Coastguard Worker //DWORD 15 352*54e60f84SAndroid Build Coastguard Worker uint32_t reserved10; 353*54e60f84SAndroid Build Coastguard Worker } VAEncFEIMBCodeH264; // 64 bytes 354*54e60f84SAndroid Build Coastguard Worker 355*54e60f84SAndroid Build Coastguard Worker /** \brief VAEncFEIDistortionH264 defines the data structure for VAEncFEIDistortionBufferType per 16x16 MB block. 356*54e60f84SAndroid Build Coastguard Worker * It is output buffer of ENC and ENC_PAK modes, The 16x16 block is in raster scan order. 357*54e60f84SAndroid Build Coastguard Worker * Buffer size shall not be less than the number of 16x16 blocks multiple by sizeof(VAEncFEIDistortionH264). 358*54e60f84SAndroid Build Coastguard Worker **/ 359*54e60f84SAndroid Build Coastguard Worker typedef struct _VAEncFEIDistortionH264 { 360*54e60f84SAndroid Build Coastguard Worker /** \brief Inter-prediction-distortion associated with motion vector i (co-located with subblock_4x4_i). 361*54e60f84SAndroid Build Coastguard Worker * Its meaning is determined by sub-shape. It must be zero if the corresponding sub-shape is not chosen. 362*54e60f84SAndroid Build Coastguard Worker **/ 363*54e60f84SAndroid Build Coastguard Worker uint16_t inter_distortion[16]; 364*54e60f84SAndroid Build Coastguard Worker uint32_t best_inter_distortion : 16; 365*54e60f84SAndroid Build Coastguard Worker uint32_t best_intra_distortion : 16; 366*54e60f84SAndroid Build Coastguard Worker uint32_t colocated_mb_distortion : 16; 367*54e60f84SAndroid Build Coastguard Worker uint32_t reserved0 : 16; 368*54e60f84SAndroid Build Coastguard Worker uint32_t reserved1[2]; 369*54e60f84SAndroid Build Coastguard Worker } VAEncFEIDistortionH264; // 48 bytes 370*54e60f84SAndroid Build Coastguard Worker 371*54e60f84SAndroid Build Coastguard Worker /** \brief Motion Vector and Statistics frame level controls. 372*54e60f84SAndroid Build Coastguard Worker * VAStatsStatisticsParameterBufferType for H264 16x16 block 373*54e60f84SAndroid Build Coastguard Worker **/ 374*54e60f84SAndroid Build Coastguard Worker typedef struct _VAStatsStatisticsParameterH264 { 375*54e60f84SAndroid Build Coastguard Worker VAStatsStatisticsParameter stats_params; 376*54e60f84SAndroid Build Coastguard Worker 377*54e60f84SAndroid Build Coastguard Worker uint32_t frame_qp : 8; 378*54e60f84SAndroid Build Coastguard Worker /** \brief length of search path */ 379*54e60f84SAndroid Build Coastguard Worker uint32_t len_sp : 8; 380*54e60f84SAndroid Build Coastguard Worker /** \brief motion search method definition 381*54e60f84SAndroid Build Coastguard Worker * 0: default value, diamond search 382*54e60f84SAndroid Build Coastguard Worker * 1: full search 383*54e60f84SAndroid Build Coastguard Worker * 2: diamond search 384*54e60f84SAndroid Build Coastguard Worker **/ 385*54e60f84SAndroid Build Coastguard Worker uint32_t search_path : 8; 386*54e60f84SAndroid Build Coastguard Worker uint32_t reserved0 : 8; 387*54e60f84SAndroid Build Coastguard Worker 388*54e60f84SAndroid Build Coastguard Worker uint32_t sub_mb_part_mask : 7; 389*54e60f84SAndroid Build Coastguard Worker /** \brief sub pixel mode definition 390*54e60f84SAndroid Build Coastguard Worker * 00b: integer mode searching 391*54e60f84SAndroid Build Coastguard Worker * 01b: half-pel mode searching 392*54e60f84SAndroid Build Coastguard Worker * 10b: reserved 393*54e60f84SAndroid Build Coastguard Worker * 11b: quarter-pel mode searching 394*54e60f84SAndroid Build Coastguard Worker **/ 395*54e60f84SAndroid Build Coastguard Worker uint32_t sub_pel_mode : 2; 396*54e60f84SAndroid Build Coastguard Worker /** \brief distortion measure adjustment for inter search SAD comparison 397*54e60f84SAndroid Build Coastguard Worker * 00b: none 398*54e60f84SAndroid Build Coastguard Worker * 01b: reserved 399*54e60f84SAndroid Build Coastguard Worker * 10b: Haar transform adjusted 400*54e60f84SAndroid Build Coastguard Worker * 11b: reserved 401*54e60f84SAndroid Build Coastguard Worker **/ 402*54e60f84SAndroid Build Coastguard Worker uint32_t inter_sad : 2; 403*54e60f84SAndroid Build Coastguard Worker /** \brief distortion measure adjustment for intra search SAD comparison 404*54e60f84SAndroid Build Coastguard Worker * 00b: none 405*54e60f84SAndroid Build Coastguard Worker * 01b: reserved 406*54e60f84SAndroid Build Coastguard Worker * 10b: Haar transform adjusted 407*54e60f84SAndroid Build Coastguard Worker * 11b: reserved 408*54e60f84SAndroid Build Coastguard Worker **/ 409*54e60f84SAndroid Build Coastguard Worker uint32_t intra_sad : 2; 410*54e60f84SAndroid Build Coastguard Worker uint32_t adaptive_search : 1; 411*54e60f84SAndroid Build Coastguard Worker /** \brief indicate if future or/and past MV in mv_predictor buffer is valid. 412*54e60f84SAndroid Build Coastguard Worker * 0: MV predictor disabled 413*54e60f84SAndroid Build Coastguard Worker * 1: MV predictor enabled for past reference 414*54e60f84SAndroid Build Coastguard Worker * 2: MV predictor enabled for future reference 415*54e60f84SAndroid Build Coastguard Worker * 3: MV predictor enabled for both past and future references 416*54e60f84SAndroid Build Coastguard Worker **/ 417*54e60f84SAndroid Build Coastguard Worker uint32_t mv_predictor_ctrl : 3; 418*54e60f84SAndroid Build Coastguard Worker uint32_t mb_qp : 1; 419*54e60f84SAndroid Build Coastguard Worker /** \brief forward transform enable 420*54e60f84SAndroid Build Coastguard Worker * 0: disable 421*54e60f84SAndroid Build Coastguard Worker * 1: enable, needs frame_qp or mb_qp input for transform 422*54e60f84SAndroid Build Coastguard Worker **/ 423*54e60f84SAndroid Build Coastguard Worker uint32_t ft_enable : 1; 424*54e60f84SAndroid Build Coastguard Worker /** \brief luma intra mode partition mask 425*54e60f84SAndroid Build Coastguard Worker * xxxx1: luma_intra_16x16 disabled 426*54e60f84SAndroid Build Coastguard Worker * xxx1x: luma_intra_8x8 disabled 427*54e60f84SAndroid Build Coastguard Worker * xx1xx: luma_intra_4x4 disabled 428*54e60f84SAndroid Build Coastguard Worker * xx111: intra prediction is disabled 429*54e60f84SAndroid Build Coastguard Worker **/ 430*54e60f84SAndroid Build Coastguard Worker uint32_t intra_part_mask : 5; 431*54e60f84SAndroid Build Coastguard Worker uint32_t reserved1 : 8; 432*54e60f84SAndroid Build Coastguard Worker 433*54e60f84SAndroid Build Coastguard Worker /** \brief motion search window(ref_width * ref_height) */ 434*54e60f84SAndroid Build Coastguard Worker uint32_t ref_width : 8; 435*54e60f84SAndroid Build Coastguard Worker uint32_t ref_height : 8; 436*54e60f84SAndroid Build Coastguard Worker /** \brief predefined motion search windows. If selected, len_sp, window(ref_width * ref_eight) 437*54e60f84SAndroid Build Coastguard Worker * and search_path setting are ignored. 438*54e60f84SAndroid Build Coastguard Worker * 0: not use predefined search window 439*54e60f84SAndroid Build Coastguard Worker * 1: Tiny, len_sp=4, 24x24 window and diamond search 440*54e60f84SAndroid Build Coastguard Worker * 2: Small, len_sp=9, 28x28 window and diamond search 441*54e60f84SAndroid Build Coastguard Worker * 3: Diamond, len_sp=16, 48x40 window and diamond search 442*54e60f84SAndroid Build Coastguard Worker * 4: Large Diamond, len_sp=32, 48x40 window and diamond search 443*54e60f84SAndroid Build Coastguard Worker * 5: Exhaustive, len_sp=48, 48x40 window and full search 444*54e60f84SAndroid Build Coastguard Worker * 6: Extend Diamond, len_sp=16, 64x40 window and diamond search 445*54e60f84SAndroid Build Coastguard Worker * 7: Extend Large Diamond, len_sp=32, 64x40 window and diamond search 446*54e60f84SAndroid Build Coastguard Worker * 8: Extend Exhaustive, len_sp=48, 64x40 window and full search 447*54e60f84SAndroid Build Coastguard Worker **/ 448*54e60f84SAndroid Build Coastguard Worker uint32_t search_window : 4; 449*54e60f84SAndroid Build Coastguard Worker uint32_t reserved2 : 12; 450*54e60f84SAndroid Build Coastguard Worker 451*54e60f84SAndroid Build Coastguard Worker /** \brief MVOutput. When set to 1, MV output is NOT provided */ 452*54e60f84SAndroid Build Coastguard Worker uint32_t disable_mv_output : 1; 453*54e60f84SAndroid Build Coastguard Worker /** \brief StatisticsOutput. When set to 1, Statistics output is NOT provided. */ 454*54e60f84SAndroid Build Coastguard Worker uint32_t disable_statistics_output : 1; 455*54e60f84SAndroid Build Coastguard Worker /** \brief block 8x8 data enabling in statistics output */ 456*54e60f84SAndroid Build Coastguard Worker uint32_t enable_8x8_statistics : 1; 457*54e60f84SAndroid Build Coastguard Worker uint32_t reserved3 : 29; 458*54e60f84SAndroid Build Coastguard Worker uint32_t reserved4[2]; 459*54e60f84SAndroid Build Coastguard Worker } VAStatsStatisticsParameterH264; 460*54e60f84SAndroid Build Coastguard Worker 461*54e60f84SAndroid Build Coastguard Worker /** \brief VAStatsStatisticsH264. H264 Statistics buffer layout for VAStatsStatisticsBufferType 462*54e60f84SAndroid Build Coastguard Worker * and VAStatsStatisticsBottomFieldBufferType(for interlaced only). 463*54e60f84SAndroid Build Coastguard Worker * Statistics output is per 16x16 block. Data structure per 16x16 block is defined below. 464*54e60f84SAndroid Build Coastguard Worker * The 16x16 block is in raster scan order. The buffer size shall be greater than or equal to 465*54e60f84SAndroid Build Coastguard Worker * the number of 16x16 blocks multiplied by sizeof(VAStatsStatisticsH264). 466*54e60f84SAndroid Build Coastguard Worker **/ 467*54e60f84SAndroid Build Coastguard Worker typedef struct _VAStatsStatisticsH264 { 468*54e60f84SAndroid Build Coastguard Worker /** \brief past reference */ 469*54e60f84SAndroid Build Coastguard Worker uint32_t best_inter_distortion0 : 16; 470*54e60f84SAndroid Build Coastguard Worker uint32_t inter_mode0 : 16; 471*54e60f84SAndroid Build Coastguard Worker 472*54e60f84SAndroid Build Coastguard Worker /** \brief future reference */ 473*54e60f84SAndroid Build Coastguard Worker uint32_t best_inter_distortion1 : 16; 474*54e60f84SAndroid Build Coastguard Worker uint32_t inter_mode1 : 16; 475*54e60f84SAndroid Build Coastguard Worker 476*54e60f84SAndroid Build Coastguard Worker uint32_t best_intra_distortion : 16; 477*54e60f84SAndroid Build Coastguard Worker uint32_t intra_mode : 16; 478*54e60f84SAndroid Build Coastguard Worker 479*54e60f84SAndroid Build Coastguard Worker uint32_t num_non_zero_coef : 16; 480*54e60f84SAndroid Build Coastguard Worker uint32_t reserved0 : 16; 481*54e60f84SAndroid Build Coastguard Worker 482*54e60f84SAndroid Build Coastguard Worker uint32_t sum_coef; 483*54e60f84SAndroid Build Coastguard Worker 484*54e60f84SAndroid Build Coastguard Worker /** \brief DWORD 5 flat info **/ 485*54e60f84SAndroid Build Coastguard Worker uint32_t mb_is_flat : 1; 486*54e60f84SAndroid Build Coastguard Worker uint32_t reserved1 : 31; 487*54e60f84SAndroid Build Coastguard Worker 488*54e60f84SAndroid Build Coastguard Worker /** \brief DWORD 6 variance for block16x16**/ 489*54e60f84SAndroid Build Coastguard Worker uint32_t variance_16x16; 490*54e60f84SAndroid Build Coastguard Worker /** \brief DWORD 7 ~ 10, variance for block8x8 **/ 491*54e60f84SAndroid Build Coastguard Worker uint32_t variance_8x8[4]; 492*54e60f84SAndroid Build Coastguard Worker 493*54e60f84SAndroid Build Coastguard Worker /** \brief DWORD 11 pixel_average for block16x16 **/ 494*54e60f84SAndroid Build Coastguard Worker uint32_t pixel_average_16x16; 495*54e60f84SAndroid Build Coastguard Worker /** \brief DWORD 12 ~ 15, pixel_average for block8x8 **/ 496*54e60f84SAndroid Build Coastguard Worker uint32_t pixel_average_8x8[4]; 497*54e60f84SAndroid Build Coastguard Worker } VAStatsStatisticsH264; // 64 bytes 498*54e60f84SAndroid Build Coastguard Worker 499*54e60f84SAndroid Build Coastguard Worker /**@}*/ 500*54e60f84SAndroid Build Coastguard Worker 501*54e60f84SAndroid Build Coastguard Worker #ifdef __cplusplus 502*54e60f84SAndroid Build Coastguard Worker } 503*54e60f84SAndroid Build Coastguard Worker #endif 504*54e60f84SAndroid Build Coastguard Worker 505*54e60f84SAndroid Build Coastguard Worker #endif /* VA_FEI_H264_H */ 506