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