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