| 1 | /* |
| 2 | * Copyright (c) 2019 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_dec_av1.h |
| 27 | * \brief The AV1 decoding API |
| 28 | * |
| 29 | * This file contains the \ref api_dec_av1 "AV1 decoding API". |
| 30 | */ |
| 31 | |
| 32 | #ifndef VA_DEC_AV1_H |
| 33 | #define VA_DEC_AV1_H |
| 34 | |
| 35 | #include <stdint.h> |
| 36 | |
| 37 | #ifdef __cplusplus |
| 38 | extern "C" { |
| 39 | #endif |
| 40 | |
| 41 | /** |
| 42 | * \defgroup api_dec_av1 AV1 decoding API |
| 43 | * |
| 44 | * This AV1 decoding API supports 8-bit/10bit 420 format only. |
| 45 | * |
| 46 | * @{ |
| 47 | */ |
| 48 | |
| 49 | /** Attribute value for VAConfigAttribDecAV1Features. |
| 50 | * |
| 51 | * This attribute decribes the supported features of a AV1 |
| 52 | * decoder configuration. |
| 53 | * |
| 54 | */ |
| 55 | typedef union VAConfigAttribValDecAV1Features { |
| 56 | struct { |
| 57 | /** large scale tile |
| 58 | * |
| 59 | * This conveys whether AV1 large scale tile is supported by HW. |
| 60 | * 0 - unsupported, 1 - supported. |
| 61 | */ |
| 62 | uint32_t lst_support : 2; |
| 63 | /* Reserved for future use. */ |
| 64 | uint32_t reserved : 30; |
| 65 | } bits; |
| 66 | uint32_t value; |
| 67 | } VAConfigAttribValDecAV1Features; |
| 68 | |
| 69 | /** |
| 70 | * \brief AV1 Decoding Picture Parameter Buffer Structure |
| 71 | * |
| 72 | * This structure conveys picture level parameters. |
| 73 | * App should send a surface with this data structure down to VAAPI once |
| 74 | * per frame. |
| 75 | * |
| 76 | */ |
| 77 | |
| 78 | /** \brief Segmentation Information |
| 79 | */ |
| 80 | typedef struct _VASegmentationStructAV1 { |
| 81 | union { |
| 82 | struct { |
| 83 | /** Indicates whether segmentation map related syntax elements |
| 84 | * are present or not for current frame. If equal to 0, |
| 85 | * the segmentation map related syntax elements are |
| 86 | * not present for the current frame and the control flags of |
| 87 | * segmentation map related tables feature_data[][], and |
| 88 | * feature_mask[] are not valid and shall be ignored by accelerator. |
| 89 | */ |
| 90 | uint32_t enabled : 1; |
| 91 | /** Value 1 indicates that the segmentation map are updated |
| 92 | * during the decoding of this frame. |
| 93 | * Value 0 means that the segmentation map from the previous |
| 94 | * frame is used. |
| 95 | */ |
| 96 | uint32_t update_map : 1; |
| 97 | /** Value 1 indicates that the updates to the segmentation map |
| 98 | * are coded relative to the existing segmentation map. |
| 99 | * Value 0 indicates that the new segmentation map is coded |
| 100 | * without reference to the existing segmentation map. |
| 101 | */ |
| 102 | uint32_t temporal_update : 1; |
| 103 | /** Value 1 indicates that new parameters are about to be |
| 104 | * specified for each segment. |
| 105 | * Value 0 indicates that the segmentation parameters |
| 106 | * should keep their existing values. |
| 107 | */ |
| 108 | uint32_t update_data : 1; |
| 109 | |
| 110 | /** \brief Reserved bytes for future use, must be zero */ |
| 111 | uint32_t reserved : 28; |
| 112 | } bits; |
| 113 | uint32_t value; |
| 114 | } segment_info_fields; |
| 115 | |
| 116 | /** \brief Segmentation parameters for current frame. |
| 117 | * feature_data[segment_id][feature_id] |
| 118 | * where segment_id has value range [0..7] indicating the segment id. |
| 119 | * and feature_id is defined as |
| 120 | typedef enum { |
| 121 | SEG_LVL_ALT_Q, // Use alternate Quantizer .... |
| 122 | SEG_LVL_ALT_LF_Y_V, // Use alternate loop filter value on y plane vertical |
| 123 | SEG_LVL_ALT_LF_Y_H, // Use alternate loop filter value on y plane horizontal |
| 124 | SEG_LVL_ALT_LF_U, // Use alternate loop filter value on u plane |
| 125 | SEG_LVL_ALT_LF_V, // Use alternate loop filter value on v plane |
| 126 | SEG_LVL_REF_FRAME, // Optional Segment reference frame |
| 127 | SEG_LVL_SKIP, // Optional Segment (0,0) + skip mode |
| 128 | SEG_LVL_GLOBALMV, |
| 129 | SEG_LVL_MAX |
| 130 | } SEG_LVL_FEATURES; |
| 131 | * feature_data[][] is equivalent to variable FeatureData[][] in spec, |
| 132 | * which is after clip3() operation. |
| 133 | * Clip3(x, y, z) = (z < x)? x : ((z > y)? y : z); |
| 134 | * The limit is defined in Segmentation_Feature_Max[ SEG_LVL_MAX ] = { |
| 135 | * 255, MAX_LOOP_FILTER, MAX_LOOP_FILTER, MAX_LOOP_FILTER, MAX_LOOP_FILTER, 7, 0, 0 } |
| 136 | */ |
| 137 | int16_t feature_data[8][8]; |
| 138 | |
| 139 | /** \brief indicates if a feature is enabled or not. |
| 140 | * Each bit field itself is the feature_id. Index is segment_id. |
| 141 | * feature_mask[segment_id] & (1 << feature_id) equal to 1 specify that the feature of |
| 142 | * feature_id for segment of segment_id is enabled, otherwise disabled. |
| 143 | */ |
| 144 | uint8_t feature_mask[8]; |
| 145 | |
| 146 | /** \brief Reserved bytes for future use, must be zero */ |
| 147 | uint32_t va_reserved[VA_PADDING_LOW]; |
| 148 | |
| 149 | } VASegmentationStructAV1; |
| 150 | |
| 151 | /** \brief Film Grain Information |
| 152 | */ |
| 153 | typedef struct _VAFilmGrainStructAV1 { |
| 154 | union { |
| 155 | struct { |
| 156 | /** \brief Specify whether or not film grain is applied on current frame. |
| 157 | * If set to 0, all the rest parameters should be set to zero |
| 158 | * and ignored. |
| 159 | */ |
| 160 | uint32_t apply_grain : 1; |
| 161 | uint32_t chroma_scaling_from_luma : 1; |
| 162 | uint32_t grain_scaling_minus_8 : 2; |
| 163 | uint32_t ar_coeff_lag : 2; |
| 164 | uint32_t ar_coeff_shift_minus_6 : 2; |
| 165 | uint32_t grain_scale_shift : 2; |
| 166 | uint32_t overlap_flag : 1; |
| 167 | uint32_t clip_to_restricted_range : 1; |
| 168 | /** \brief Reserved bytes for future use, must be zero */ |
| 169 | uint32_t reserved : 20; |
| 170 | } bits; |
| 171 | uint32_t value; |
| 172 | } film_grain_info_fields; |
| 173 | |
| 174 | uint16_t grain_seed; |
| 175 | /* value range [0..14] */ |
| 176 | uint8_t num_y_points; |
| 177 | uint8_t point_y_value[14]; |
| 178 | uint8_t point_y_scaling[14]; |
| 179 | /* value range [0..10] */ |
| 180 | uint8_t num_cb_points; |
| 181 | uint8_t point_cb_value[10]; |
| 182 | uint8_t point_cb_scaling[10]; |
| 183 | /* value range [0..10] */ |
| 184 | uint8_t num_cr_points; |
| 185 | uint8_t point_cr_value[10]; |
| 186 | uint8_t point_cr_scaling[10]; |
| 187 | /* value range [-128..127] */ |
| 188 | int8_t ar_coeffs_y[24]; |
| 189 | int8_t ar_coeffs_cb[25]; |
| 190 | int8_t ar_coeffs_cr[25]; |
| 191 | uint8_t cb_mult; |
| 192 | uint8_t cb_luma_mult; |
| 193 | uint16_t cb_offset; |
| 194 | uint8_t cr_mult; |
| 195 | uint8_t cr_luma_mult; |
| 196 | uint16_t cr_offset; |
| 197 | |
| 198 | /** \brief Reserved bytes for future use, must be zero */ |
| 199 | uint32_t va_reserved[VA_PADDING_LOW]; |
| 200 | |
| 201 | } VAFilmGrainStructAV1; |
| 202 | |
| 203 | typedef enum { |
| 204 | /** identity transformation, 0-parameter */ |
| 205 | VAAV1TransformationIdentity = 0, |
| 206 | /** translational motion, 2-parameter */ |
| 207 | VAAV1TransformationTranslation = 1, |
| 208 | /** simplified affine with rotation + zoom only, 4-parameter */ |
| 209 | VAAV1TransformationRotzoom = 2, |
| 210 | /** affine, 6-parameter */ |
| 211 | VAAV1TransformationAffine = 3, |
| 212 | /** transformation count */ |
| 213 | VAAV1TransformationCount |
| 214 | } VAAV1TransformationType; |
| 215 | |
| 216 | typedef struct _VAWarpedMotionParamsAV1 { |
| 217 | |
| 218 | /** \brief Specify the type of warped motion */ |
| 219 | VAAV1TransformationType wmtype; |
| 220 | |
| 221 | /** \brief Specify warp motion parameters |
| 222 | * wm.wmmat[] corresponds to gm_params[][] in spec. |
| 223 | * Details in AV1 spec section 5.9.24 or refer to libaom code |
| 224 | * https://aomedia.googlesource.com/aom/+/refs/heads/master/av1/decoder/decodeframe.c |
| 225 | */ |
| 226 | int32_t wmmat[8]; |
| 227 | |
| 228 | /* valid or invalid on affine set */ |
| 229 | uint8_t invalid; |
| 230 | |
| 231 | /** \brief Reserved bytes for future use, must be zero */ |
| 232 | uint32_t va_reserved[VA_PADDING_LOW]; |
| 233 | |
| 234 | } VAWarpedMotionParamsAV1; |
| 235 | |
| 236 | /** |
| 237 | * \brief AV1 Decoding Picture Parameter Buffer Structure |
| 238 | * |
| 239 | * This structure conveys picture level parameters and should be sent once |
| 240 | * per frame. |
| 241 | * |
| 242 | */ |
| 243 | typedef struct _VADecPictureParameterBufferAV1 { |
| 244 | /**@{*/ |
| 245 | |
| 246 | /** \brief sequence level information |
| 247 | */ |
| 248 | |
| 249 | /** \brief AV1 bit stream profile |
| 250 | */ |
| 251 | uint8_t profile; |
| 252 | |
| 253 | uint8_t order_hint_bits_minus_1; |
| 254 | |
| 255 | /** \brief bit depth index |
| 256 | * value range [0..2] |
| 257 | * 0 - bit depth 8; |
| 258 | * 1 - bit depth 10; |
| 259 | * 2 - bit depth 12; |
| 260 | */ |
| 261 | uint8_t bit_depth_idx; |
| 262 | |
| 263 | /** \brief corresponds to AV1 spec variable of the same name. */ |
| 264 | uint8_t matrix_coefficients; |
| 265 | |
| 266 | union { |
| 267 | struct { |
| 268 | uint32_t still_picture : 1; |
| 269 | uint32_t use_128x128_superblock : 1; |
| 270 | uint32_t enable_filter_intra : 1; |
| 271 | uint32_t enable_intra_edge_filter : 1; |
| 272 | |
| 273 | /** read_compound_tools */ |
| 274 | uint32_t enable_interintra_compound : 1; |
| 275 | uint32_t enable_masked_compound : 1; |
| 276 | |
| 277 | uint32_t enable_dual_filter : 1; |
| 278 | uint32_t enable_order_hint : 1; |
| 279 | uint32_t enable_jnt_comp : 1; |
| 280 | uint32_t enable_cdef : 1; |
| 281 | uint32_t mono_chrome : 1; |
| 282 | uint32_t color_range : 1; |
| 283 | uint32_t subsampling_x : 1; |
| 284 | uint32_t subsampling_y : 1; |
| 285 | va_deprecated uint32_t chroma_sample_position : 1; |
| 286 | uint32_t film_grain_params_present : 1; |
| 287 | /** \brief Reserved bytes for future use, must be zero */ |
| 288 | uint32_t reserved : 16; |
| 289 | } fields; |
| 290 | uint32_t value; |
| 291 | } seq_info_fields; |
| 292 | |
| 293 | /** \brief Picture level information |
| 294 | */ |
| 295 | |
| 296 | /** \brief buffer description of decoded current picture |
| 297 | */ |
| 298 | VASurfaceID current_frame; |
| 299 | |
| 300 | /** \brief display buffer of current picture |
| 301 | * Used for film grain applied decoded picture. |
| 302 | * Valid only when apply_grain equals 1. |
| 303 | */ |
| 304 | VASurfaceID current_display_picture; |
| 305 | |
| 306 | /** \brief number of anchor frames for large scale tile |
| 307 | * This parameter gives the number of entries of anchor_frames_list[]. |
| 308 | * Value range [0..128]. |
| 309 | */ |
| 310 | uint8_t anchor_frames_num; |
| 311 | |
| 312 | /** \brief anchor frame list for large scale tile |
| 313 | * For large scale tile applications, the anchor frames could come from |
| 314 | * previously decoded frames in current sequence (aka. internal), or |
| 315 | * from external sources. |
| 316 | * For external anchor frames, application should call API |
| 317 | * vaCreateBuffer() to generate frame buffers and populate them with |
| 318 | * pixel frames. And this process may happen multiple times. |
| 319 | * The array anchor_frames_list[] is used to register all the available |
| 320 | * anchor frames from both external and internal, up to the current |
| 321 | * frame instance. If a previously registerred anchor frame is no longer |
| 322 | * needed, it should be removed from the list. But it does not prevent |
| 323 | * applications from relacing the frame buffer with new anchor frames. |
| 324 | * Please note that the internal anchor frames may not still be present |
| 325 | * in the current DPB buffer. But if it is in the anchor_frames_list[], |
| 326 | * it should not be replaced with other frames or removed from memory |
| 327 | * until it is not shown in the list. |
| 328 | * This number of entries of the list is given by parameter anchor_frames_num. |
| 329 | */ |
| 330 | VASurfaceID *anchor_frames_list; |
| 331 | |
| 332 | /** \brief Picture resolution minus 1 |
| 333 | * Picture original resolution. If SuperRes is enabled, |
| 334 | * this is the upscaled resolution. |
| 335 | * value range [0..65535] |
| 336 | */ |
| 337 | uint16_t frame_width_minus1; |
| 338 | uint16_t frame_height_minus1; |
| 339 | |
| 340 | /** \brief Output frame buffer size in unit of tiles |
| 341 | * Valid only when large_scale_tile equals 1. |
| 342 | * value range [0..65535] |
| 343 | */ |
| 344 | uint16_t output_frame_width_in_tiles_minus_1; |
| 345 | uint16_t output_frame_height_in_tiles_minus_1; |
| 346 | |
| 347 | /** \brief Surface indices of reference frames in DPB. |
| 348 | * |
| 349 | * Contains a list of uncompressed frame buffer surface indices as references. |
| 350 | * Application needs to make sure all the entries point to valid frames |
| 351 | * except for intra frames by checking ref_frame_id[]. If missing frame |
| 352 | * is identified, application may choose to perform error recovery by |
| 353 | * pointing problematic index to an alternative frame buffer. |
| 354 | * Driver is not responsible to validate reference frames' id. |
| 355 | */ |
| 356 | VASurfaceID ref_frame_map[8]; |
| 357 | |
| 358 | /** \brief Reference frame indices. |
| 359 | * |
| 360 | * Contains a list of indices into ref_frame_map[8]. |
| 361 | * It specifies the reference frame correspondence. |
| 362 | * The indices of the array are defined as [LAST_FRAME – LAST_FRAME, |
| 363 | * LAST2_FRAME – LAST_FRAME, …, ALTREF_FRAME – LAST_FRAME], where each |
| 364 | * symbol is defined as: |
| 365 | * enum{INTRA_FRAME = 0, LAST_FRAME, LAST2_FRAME, LAST3_FRAME, GOLDEN_FRAME, |
| 366 | * BWDREF_FRAME, ALTREF2_FRAME, ALTREF_FRAME}; |
| 367 | */ |
| 368 | uint8_t ref_frame_idx[7]; |
| 369 | |
| 370 | /** \brief primary reference frame index |
| 371 | * Index into ref_frame_idx[], specifying which reference frame contains |
| 372 | * propagated info that should be loaded at the start of the frame. |
| 373 | * When value equals PRIMARY_REF_NONE (7), it indicates there is |
| 374 | * no primary reference frame. |
| 375 | * value range [0..7] |
| 376 | */ |
| 377 | uint8_t primary_ref_frame; |
| 378 | |
| 379 | uint8_t order_hint; |
| 380 | |
| 381 | VASegmentationStructAV1 seg_info; |
| 382 | VAFilmGrainStructAV1 film_grain_info; |
| 383 | |
| 384 | /** \brief tile structure |
| 385 | * When uniform_tile_spacing_flag == 1, width_in_sbs_minus_1[] and |
| 386 | * height_in_sbs_minus_1[] should be ignored, which will be generated |
| 387 | * by driver based on tile_cols and tile_rows. |
| 388 | */ |
| 389 | uint8_t tile_cols; |
| 390 | uint8_t tile_rows; |
| 391 | |
| 392 | /* The width/height of a tile minus 1 in units of superblocks. Though the |
| 393 | * maximum number of tiles is 64, since ones of the last tile are computed |
| 394 | * from ones of the other tiles and frame_width/height, they are not |
| 395 | * necessarily specified. |
| 396 | */ |
| 397 | uint16_t width_in_sbs_minus_1[63]; |
| 398 | uint16_t height_in_sbs_minus_1[63]; |
| 399 | |
| 400 | /** \brief number of tiles minus 1 in large scale tile list |
| 401 | * Same as AV1 semantic element. |
| 402 | * Valid only when large_scale_tiles == 1. |
| 403 | */ |
| 404 | uint16_t tile_count_minus_1; |
| 405 | |
| 406 | /* specify the tile index for context updating */ |
| 407 | uint16_t context_update_tile_id; |
| 408 | |
| 409 | union { |
| 410 | struct { |
| 411 | /** \brief flags for current picture |
| 412 | * same syntax and semantic as those in AV1 code |
| 413 | */ |
| 414 | |
| 415 | /** \brief Frame Type |
| 416 | * 0: KEY_FRAME; |
| 417 | * 1: INTER_FRAME; |
| 418 | * 2: INTRA_ONLY_FRAME; |
| 419 | * 3: SWITCH_FRAME |
| 420 | * For SWITCH_FRAME, application shall set error_resilient_mode = 1, |
| 421 | * refresh_frame_flags, etc. appropriately. And driver will convert it |
| 422 | * to INTER_FRAME. |
| 423 | */ |
| 424 | uint32_t frame_type : 2; |
| 425 | uint32_t show_frame : 1; |
| 426 | uint32_t showable_frame : 1; |
| 427 | uint32_t error_resilient_mode : 1; |
| 428 | uint32_t disable_cdf_update : 1; |
| 429 | uint32_t allow_screen_content_tools : 1; |
| 430 | uint32_t force_integer_mv : 1; |
| 431 | uint32_t allow_intrabc : 1; |
| 432 | uint32_t use_superres : 1; |
| 433 | uint32_t allow_high_precision_mv : 1; |
| 434 | uint32_t is_motion_mode_switchable : 1; |
| 435 | uint32_t use_ref_frame_mvs : 1; |
| 436 | /* disable_frame_end_update_cdf is coded as refresh_frame_context. */ |
| 437 | uint32_t disable_frame_end_update_cdf : 1; |
| 438 | uint32_t uniform_tile_spacing_flag : 1; |
| 439 | uint32_t allow_warped_motion : 1; |
| 440 | /** \brief indicate if current frame in large scale tile mode */ |
| 441 | uint32_t large_scale_tile : 1; |
| 442 | |
| 443 | /** \brief Reserved bytes for future use, must be zero */ |
| 444 | uint32_t reserved : 15; |
| 445 | } bits; |
| 446 | uint32_t value; |
| 447 | } pic_info_fields; |
| 448 | |
| 449 | /** \brief Supper resolution scale denominator. |
| 450 | * When use_superres=1, superres_scale_denominator must be in the range [9..16]. |
| 451 | * When use_superres=0, superres_scale_denominator must be 8. |
| 452 | */ |
| 453 | uint8_t superres_scale_denominator; |
| 454 | |
| 455 | /** \brief Interpolation filter. |
| 456 | * value range [0..4] |
| 457 | */ |
| 458 | uint8_t interp_filter; |
| 459 | |
| 460 | /** \brief luma loop filter levels. |
| 461 | * value range [0..63]. |
| 462 | */ |
| 463 | uint8_t filter_level[2]; |
| 464 | |
| 465 | /** \brief chroma loop filter levels. |
| 466 | * value range [0..63]. |
| 467 | */ |
| 468 | uint8_t filter_level_u; |
| 469 | uint8_t filter_level_v; |
| 470 | |
| 471 | union { |
| 472 | struct { |
| 473 | /** \brief flags for reference pictures |
| 474 | * same syntax and semantic as those in AV1 code |
| 475 | */ |
| 476 | uint8_t sharpness_level : 3; |
| 477 | uint8_t mode_ref_delta_enabled : 1; |
| 478 | uint8_t mode_ref_delta_update : 1; |
| 479 | |
| 480 | /** \brief Reserved bytes for future use, must be zero */ |
| 481 | uint8_t reserved : 3; |
| 482 | } bits; |
| 483 | uint8_t value; |
| 484 | } loop_filter_info_fields; |
| 485 | |
| 486 | /** \brief The adjustment needed for the filter level based on |
| 487 | * the chosen reference frame. |
| 488 | * value range [-64..63]. |
| 489 | */ |
| 490 | int8_t ref_deltas[8]; |
| 491 | |
| 492 | /** \brief The adjustment needed for the filter level based on |
| 493 | * the chosen mode. |
| 494 | * value range [-64..63]. |
| 495 | */ |
| 496 | int8_t mode_deltas[2]; |
| 497 | |
| 498 | /** \brief quantization |
| 499 | */ |
| 500 | /** \brief Y AC index |
| 501 | * value range [0..255] |
| 502 | */ |
| 503 | uint8_t base_qindex; |
| 504 | /** \brief Y DC delta from Y AC |
| 505 | * value range [-64..63] |
| 506 | */ |
| 507 | int8_t y_dc_delta_q; |
| 508 | /** \brief U DC delta from Y AC |
| 509 | * value range [-64..63] |
| 510 | */ |
| 511 | int8_t u_dc_delta_q; |
| 512 | /** \brief U AC delta from Y AC |
| 513 | * value range [-64..63] |
| 514 | */ |
| 515 | int8_t u_ac_delta_q; |
| 516 | /** \brief V DC delta from Y AC |
| 517 | * value range [-64..63] |
| 518 | */ |
| 519 | int8_t v_dc_delta_q; |
| 520 | /** \brief V AC delta from Y AC |
| 521 | * value range [-64..63] |
| 522 | */ |
| 523 | int8_t v_ac_delta_q; |
| 524 | |
| 525 | /** \brief quantization_matrix |
| 526 | */ |
| 527 | union { |
| 528 | struct { |
| 529 | uint16_t using_qmatrix : 1; |
| 530 | /** \brief qm level |
| 531 | * value range [0..15] |
| 532 | * Invalid if using_qmatrix equals 0. |
| 533 | */ |
| 534 | uint16_t qm_y : 4; |
| 535 | uint16_t qm_u : 4; |
| 536 | uint16_t qm_v : 4; |
| 537 | |
| 538 | /** \brief Reserved bytes for future use, must be zero */ |
| 539 | uint16_t reserved : 3; |
| 540 | } bits; |
| 541 | uint16_t value; |
| 542 | } qmatrix_fields; |
| 543 | |
| 544 | union { |
| 545 | struct { |
| 546 | /** \brief delta_q parameters |
| 547 | */ |
| 548 | uint32_t delta_q_present_flag : 1; |
| 549 | uint32_t log2_delta_q_res : 2; |
| 550 | |
| 551 | /** \brief delta_lf parameters |
| 552 | */ |
| 553 | uint32_t delta_lf_present_flag : 1; |
| 554 | uint32_t log2_delta_lf_res : 2; |
| 555 | |
| 556 | /** \brief CONFIG_LOOPFILTER_LEVEL |
| 557 | */ |
| 558 | uint32_t delta_lf_multi : 1; |
| 559 | |
| 560 | /** \brief read_tx_mode |
| 561 | * value range [0..2] |
| 562 | */ |
| 563 | uint32_t tx_mode : 2; |
| 564 | |
| 565 | /* AV1 frame reference mode semantic */ |
| 566 | uint32_t reference_select : 1; |
| 567 | |
| 568 | uint32_t reduced_tx_set_used : 1; |
| 569 | |
| 570 | uint32_t skip_mode_present : 1; |
| 571 | |
| 572 | /** \brief Reserved bytes for future use, must be zero */ |
| 573 | uint32_t reserved : 20; |
| 574 | } bits; |
| 575 | uint32_t value; |
| 576 | } mode_control_fields; |
| 577 | |
| 578 | /** \brief CDEF parameters |
| 579 | */ |
| 580 | /* value range [0..3] */ |
| 581 | uint8_t cdef_damping_minus_3; |
| 582 | /* value range [0..3] */ |
| 583 | uint8_t cdef_bits; |
| 584 | |
| 585 | /** Encode cdef strength: |
| 586 | * |
| 587 | * The cdef_y_strengths[] and cdef_uv_strengths[] are expected to be packed |
| 588 | * with both primary and secondary strength. The secondary strength is |
| 589 | * given in the lower two bits and the primary strength is given in the next |
| 590 | * four bits. |
| 591 | * |
| 592 | * cdef_y_strengths[] & cdef_uv_strengths[] should be derived as: |
| 593 | * (cdef_y_strengths[]) = (cdef_y_pri_strength[] << 2) | (cdef_y_sec_strength[] & 0x03) |
| 594 | * (cdef_uv_strengths[]) = (cdef_uv_pri_strength[] << 2) | (cdef_uv_sec_strength[] & 0x03) |
| 595 | * In which, cdef_y_pri_strength[]/cdef_y_sec_strength[]/cdef_uv_pri_strength[]/cdef_uv_sec_strength[] |
| 596 | * are variables defined in AV1 Spec 5.9.19. The cdef_y_strengths[] & cdef_uv_strengths[] |
| 597 | * are corresponding to LIBAOM variables cm->cdef_strengths[] & cm->cdef_uv_strengths[] respectively. |
| 598 | */ |
| 599 | /* value range [0..63] */ |
| 600 | uint8_t cdef_y_strengths[8]; |
| 601 | /* value range [0..63] */ |
| 602 | uint8_t cdef_uv_strengths[8]; |
| 603 | |
| 604 | /** \brief loop restoration parameters |
| 605 | */ |
| 606 | union { |
| 607 | struct { |
| 608 | uint16_t yframe_restoration_type : 2; |
| 609 | uint16_t cbframe_restoration_type : 2; |
| 610 | uint16_t crframe_restoration_type : 2; |
| 611 | uint16_t lr_unit_shift : 2; |
| 612 | uint16_t lr_uv_shift : 1; |
| 613 | |
| 614 | /** \brief Reserved bytes for future use, must be zero */ |
| 615 | uint16_t reserved : 7; |
| 616 | } bits; |
| 617 | uint16_t value; |
| 618 | } loop_restoration_fields; |
| 619 | |
| 620 | /** \brief global motion |
| 621 | */ |
| 622 | VAWarpedMotionParamsAV1 wm[7]; |
| 623 | |
| 624 | /**@}*/ |
| 625 | |
| 626 | /** \brief Reserved bytes for future use, must be zero */ |
| 627 | uint32_t va_reserved[VA_PADDING_MEDIUM]; |
| 628 | } VADecPictureParameterBufferAV1; |
| 629 | |
| 630 | |
| 631 | /** |
| 632 | * \brief AV1 Slice Parameter Buffer Structure |
| 633 | * |
| 634 | * This structure conveys parameters related to bit stream data and should be |
| 635 | * sent once per tile. |
| 636 | * |
| 637 | * It uses the name VASliceParameterBufferAV1 to be consistent with other codec, |
| 638 | * but actually means VATileParameterBufferAV1. |
| 639 | * |
| 640 | * Slice data buffer of VASliceDataBufferType is used |
| 641 | * to send the bitstream. |
| 642 | * |
| 643 | * Please note that host decoder is responsible to parse out the |
| 644 | * per tile information. And the bit stream in sent to driver in per |
| 645 | * tile granularity. |
| 646 | */ |
| 647 | typedef struct _VASliceParameterBufferAV1 { |
| 648 | /**@{*/ |
| 649 | /** \brief The byte count of current tile in the bitstream buffer, |
| 650 | * starting from first byte of the buffer. |
| 651 | * It uses the name slice_data_size to be consistent with other codec, |
| 652 | * but actually means tile_data_size. |
| 653 | */ |
| 654 | uint32_t slice_data_size; |
| 655 | /** |
| 656 | * offset to the first byte of the data buffer. |
| 657 | */ |
| 658 | uint32_t slice_data_offset; |
| 659 | /** |
| 660 | * see VA_SLICE_DATA_FLAG_XXX definitions |
| 661 | */ |
| 662 | uint32_t slice_data_flag; |
| 663 | |
| 664 | uint16_t tile_row; |
| 665 | uint16_t tile_column; |
| 666 | |
| 667 | va_deprecated uint16_t tg_start; |
| 668 | va_deprecated uint16_t tg_end; |
| 669 | /** \brief anchor frame index for large scale tile. |
| 670 | * index into an array AnchorFrames of the frames that the tile uses |
| 671 | * for prediction. |
| 672 | * valid only when large_scale_tile equals 1. |
| 673 | */ |
| 674 | uint8_t anchor_frame_idx; |
| 675 | |
| 676 | /** \brief tile index in the tile list. |
| 677 | * Valid only when large_scale_tile is enabled. |
| 678 | * Driver uses this field to decide the tile output location. |
| 679 | */ |
| 680 | uint16_t tile_idx_in_tile_list; |
| 681 | |
| 682 | /**@}*/ |
| 683 | |
| 684 | /** \brief Reserved bytes for future use, must be zero */ |
| 685 | uint32_t va_reserved[VA_PADDING_LOW]; |
| 686 | } VASliceParameterBufferAV1; |
| 687 | |
| 688 | |
| 689 | /**@}*/ |
| 690 | |
| 691 | #ifdef __cplusplus |
| 692 | } |
| 693 | #endif |
| 694 | |
| 695 | #endif /* VA_DEC_AV1_H */ |
| 696 | |