| 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 |  |