xref: /aosp_15_r20/external/mesa3d/src/virtio/virtio-gpu/virgl_video_hw.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /**************************************************************************
2  *
3  * Copyright (C) 2022 Kylin Software Co., Ltd.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included
13  * in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  **************************************************************************/
24 
25 /**
26  * @file
27  * Data structure definition of video hardware layer.
28  *
29  * These structures are used for communication between host and guest, and
30  * they are 4-byte aligned.
31  *
32  * 'virgl_picture_desc' and other related structures mainly describe sequence
33  * parameters, picture parameters, slice parameters, etc., as well as some
34  * context information for encoding and decoding. The video backend needs them
35  * to reconstruct VA-API calls.
36  *
37  * @author Feng Jiang <[email protected]>
38  */
39 
40 #ifndef VIRGL_VIDEO_HW_H
41 #define VIRGL_VIDEO_HW_H
42 
43 #include <stdint.h>
44 
45 struct virgl_base_picture_desc {
46     uint16_t profile;       /* enum pipe_video_profile */
47     uint8_t entry_point;    /* enum pipe_video_entrypoint */
48     uint8_t protected_playback;
49     uint8_t decrypt_key[256];
50     uint32_t key_size;
51 
52 };
53 
54 struct virgl_enc_quality_modes {
55     uint32_t level;
56     uint32_t preset_mode;
57     uint32_t pre_encode_mode;
58     uint32_t vbaq_mode;
59 };
60 
61 /* H.264 sequence parameter set */
62 struct virgl_h264_sps {
63     uint8_t  level_idc;
64     uint8_t  chroma_format_idc;
65     uint8_t  separate_colour_plane_flag;
66     uint8_t  bit_depth_luma_minus8;
67 
68     uint8_t  bit_depth_chroma_minus8;
69     uint8_t  seq_scaling_matrix_present_flag;
70     uint8_t  ScalingList4x4[6][16];
71     uint8_t  ScalingList8x8[6][64];
72 
73     uint8_t  log2_max_frame_num_minus4;
74     uint8_t  pic_order_cnt_type;
75     uint8_t  log2_max_pic_order_cnt_lsb_minus4;
76     uint8_t  delta_pic_order_always_zero_flag;
77 
78     int32_t  offset_for_non_ref_pic;
79     int32_t  offset_for_top_to_bottom_field;
80     int32_t  offset_for_ref_frame[256];
81 
82     uint8_t  num_ref_frames_in_pic_order_cnt_cycle;
83     uint8_t  max_num_ref_frames;
84     uint8_t  frame_mbs_only_flag;
85     uint8_t  mb_adaptive_frame_field_flag;
86 
87     uint8_t  direct_8x8_inference_flag;
88     uint8_t  MinLumaBiPredSize8x8;
89     uint8_t  reserved[2];
90 };
91 
92 /* H.264 picture parameter set */
93 struct virgl_h264_pps {
94     struct virgl_h264_sps sps; /* Seq Param Set */
95 
96     uint8_t  entropy_coding_mode_flag;
97     uint8_t  bottom_field_pic_order_in_frame_present_flag;
98     uint8_t  num_slice_groups_minus1;
99     uint8_t  slice_group_map_type;
100 
101     uint8_t  slice_group_change_rate_minus1;
102     uint8_t  num_ref_idx_l0_default_active_minus1;
103     uint8_t  num_ref_idx_l1_default_active_minus1;
104     uint8_t  weighted_pred_flag;
105 
106     uint8_t  weighted_bipred_idc;
107     int8_t   pic_init_qp_minus26;
108     int8_t   pic_init_qs_minus26;
109     int8_t   chroma_qp_index_offset;
110 
111     uint8_t  deblocking_filter_control_present_flag;
112     uint8_t  constrained_intra_pred_flag;
113     uint8_t  redundant_pic_cnt_present_flag;
114     uint8_t  transform_8x8_mode_flag;
115 
116     uint8_t  ScalingList4x4[6][16];
117     uint8_t  ScalingList8x8[6][64];
118 
119     int8_t   second_chroma_qp_index_offset;
120     uint8_t  reserved[3];
121 };
122 
123 struct virgl_h264_picture_desc {
124     struct virgl_base_picture_desc base;
125 
126     struct virgl_h264_pps pps;  /* Picture Param Set */
127 
128     uint32_t frame_num;
129 
130     uint8_t  field_pic_flag;
131     uint8_t  bottom_field_flag;
132     uint8_t  num_ref_idx_l0_active_minus1;
133     uint8_t  num_ref_idx_l1_active_minus1;
134 
135     uint32_t slice_count;
136     int32_t  field_order_cnt[2];
137 
138     uint8_t  is_long_term[16];
139     uint8_t  top_is_reference[16];
140     uint8_t  bottom_is_reference[16];
141     uint32_t field_order_cnt_list[16][2];
142     uint32_t frame_num_list[16];
143     uint32_t buffer_id[16];
144 
145     uint8_t  is_reference;
146     uint8_t  num_ref_frames;
147     uint8_t  reserved[2];
148 };
149 
150 struct virgl_h264_enc_seq_param
151 {
152    uint32_t enc_constraint_set_flags;
153    uint32_t enc_frame_cropping_flag;
154    uint32_t enc_frame_crop_left_offset;
155    uint32_t enc_frame_crop_right_offset;
156    uint32_t enc_frame_crop_top_offset;
157    uint32_t enc_frame_crop_bottom_offset;
158    uint32_t pic_order_cnt_type;
159    uint32_t num_temporal_layers;
160    uint32_t vui_parameters_present_flag;
161    struct {
162       uint32_t aspect_ratio_info_present_flag: 1;
163       uint32_t timing_info_present_flag: 1;
164       uint32_t reserved:30;
165    } vui_flags;
166    uint32_t aspect_ratio_idc;
167    uint32_t sar_width;
168    uint32_t sar_height;
169    uint32_t num_units_in_tick;
170    uint32_t time_scale;
171 };
172 
173 struct virgl_h264_enc_rate_control
174 {
175     uint32_t target_bitrate;
176     uint32_t peak_bitrate;
177     uint32_t frame_rate_num;
178     uint32_t frame_rate_den;
179     uint32_t vbv_buffer_size;
180     uint32_t vbv_buf_lv;
181     uint32_t target_bits_picture;
182     uint32_t peak_bits_picture_integer;
183     uint32_t peak_bits_picture_fraction;
184     uint32_t fill_data_enable;
185     uint32_t skip_frame_enable;
186     uint32_t enforce_hrd;
187     uint32_t max_au_size;
188     uint32_t max_qp;
189     uint32_t min_qp;
190 
191     uint8_t  rate_ctrl_method; /* see enum pipe_h2645_enc_rate_control_method */
192     uint8_t  reserved[3];
193 };
194 
195 struct virgl_h264_enc_motion_estimation
196 {
197     uint32_t motion_est_quarter_pixel;
198     uint32_t enc_disable_sub_mode;
199     uint32_t lsmvert;
200     uint32_t enc_en_ime_overw_dis_subm;
201     uint32_t enc_ime_overw_dis_subm_no;
202     uint32_t enc_ime2_search_range_x;
203     uint32_t enc_ime2_search_range_y;
204 };
205 
206 struct virgl_h264_enc_pic_control
207 {
208     uint32_t enc_cabac_enable;
209     uint32_t enc_cabac_init_idc;
210 };
211 
212 struct virgl_h264_slice_descriptor
213 {
214    uint32_t macroblock_address;
215    uint32_t num_macroblocks;
216 
217    uint8_t  slice_type; /* see enum pipe_h264_slice_type  */
218    uint8_t  reserved[3];
219 };
220 
221 struct virgl_h264_enc_picture_desc
222 {
223    struct virgl_base_picture_desc base;
224 
225    struct virgl_h264_enc_seq_param seq;
226    struct virgl_h264_enc_rate_control rate_ctrl[4];
227    struct virgl_h264_enc_motion_estimation motion_est;
228    struct virgl_h264_enc_pic_control pic_ctrl;
229 
230    uint32_t intra_idr_period;
231 
232    uint32_t quant_i_frames;
233    uint32_t quant_p_frames;
234    uint32_t quant_b_frames;
235 
236    uint32_t frame_num;
237    uint32_t frame_num_cnt;
238    uint32_t p_remain;
239    uint32_t i_remain;
240    uint32_t idr_pic_id;
241    uint32_t gop_cnt;
242    uint32_t pic_order_cnt;
243    uint32_t num_ref_idx_l0_active_minus1;
244    uint32_t num_ref_idx_l1_active_minus1;
245    uint32_t ref_idx_l0_list[32];
246    uint8_t  l0_is_long_term[32];
247    uint32_t ref_idx_l1_list[32];
248    uint8_t  l1_is_long_term[32];
249    uint32_t gop_size;
250    struct virgl_enc_quality_modes quality_modes;
251 
252    uint32_t num_slice_descriptors;
253    struct virgl_h264_slice_descriptor slices_descriptors[128];
254 
255    uint8_t  picture_type; /* see enum pipe_h2645_enc_picture_type */
256    uint8_t  not_referenced;
257    uint8_t  is_ltr;
258    uint8_t  enable_vui;
259 
260    uint32_t ltr_index;
261 };
262 
263 
264 struct virgl_h265_sps
265 {
266    uint32_t pic_width_in_luma_samples;
267    uint32_t pic_height_in_luma_samples;
268 
269    uint8_t chroma_format_idc;
270    uint8_t separate_colour_plane_flag;
271    uint8_t bit_depth_luma_minus8;
272    uint8_t bit_depth_chroma_minus8;
273 
274    uint8_t log2_max_pic_order_cnt_lsb_minus4;
275    uint8_t sps_max_dec_pic_buffering_minus1;
276    uint8_t log2_min_luma_coding_block_size_minus3;
277    uint8_t log2_diff_max_min_luma_coding_block_size;
278 
279    uint8_t log2_min_transform_block_size_minus2;
280    uint8_t log2_diff_max_min_transform_block_size;
281    uint8_t max_transform_hierarchy_depth_inter;
282    uint8_t max_transform_hierarchy_depth_intra;
283 
284    uint8_t ScalingList4x4[6][16];
285    uint8_t ScalingList8x8[6][64];
286    uint8_t ScalingList16x16[6][64];
287    uint8_t ScalingList32x32[2][64];
288 
289    uint8_t ScalingListDCCoeff16x16[6];
290    uint8_t ScalingListDCCoeff32x32[2];
291 
292    uint8_t scaling_list_enabled_flag;
293    uint8_t amp_enabled_flag;
294    uint8_t sample_adaptive_offset_enabled_flag;
295    uint8_t pcm_enabled_flag;
296 
297    uint8_t pcm_sample_bit_depth_luma_minus1;
298    uint8_t pcm_sample_bit_depth_chroma_minus1;
299    uint8_t log2_min_pcm_luma_coding_block_size_minus3;
300    uint8_t log2_diff_max_min_pcm_luma_coding_block_size;
301 
302    uint8_t pcm_loop_filter_disabled_flag;
303    uint8_t num_short_term_ref_pic_sets;
304    uint8_t long_term_ref_pics_present_flag;
305    uint8_t num_long_term_ref_pics_sps;
306 
307    uint8_t sps_temporal_mvp_enabled_flag;
308    uint8_t strong_intra_smoothing_enabled_flag;
309    uint8_t reserved[2];
310 };
311 
312 struct virgl_h265_pps
313 {
314    struct virgl_h265_sps sps;
315 
316    uint8_t dependent_slice_segments_enabled_flag;
317    uint8_t output_flag_present_flag;
318    uint8_t num_extra_slice_header_bits;
319    uint8_t sign_data_hiding_enabled_flag;
320 
321    uint8_t cabac_init_present_flag;
322    uint8_t num_ref_idx_l0_default_active_minus1;
323    uint8_t num_ref_idx_l1_default_active_minus1;
324    int8_t init_qp_minus26;
325 
326    uint8_t constrained_intra_pred_flag;
327    uint8_t transform_skip_enabled_flag;
328    uint8_t cu_qp_delta_enabled_flag;
329    uint8_t diff_cu_qp_delta_depth;
330 
331    int8_t pps_cb_qp_offset;
332    int8_t pps_cr_qp_offset;
333    uint8_t pps_slice_chroma_qp_offsets_present_flag;
334    uint8_t weighted_pred_flag;
335 
336    uint8_t weighted_bipred_flag;
337    uint8_t transquant_bypass_enabled_flag;
338    uint8_t tiles_enabled_flag;
339    uint8_t entropy_coding_sync_enabled_flag;
340 
341    uint16_t column_width_minus1[20];
342    uint16_t row_height_minus1[22];
343 
344    uint8_t num_tile_columns_minus1;
345    uint8_t num_tile_rows_minus1;
346    uint8_t uniform_spacing_flag;
347    uint8_t loop_filter_across_tiles_enabled_flag;
348 
349    uint8_t pps_loop_filter_across_slices_enabled_flag;
350    uint8_t deblocking_filter_control_present_flag;
351    uint8_t deblocking_filter_override_enabled_flag;
352    uint8_t pps_deblocking_filter_disabled_flag;
353 
354    int8_t pps_beta_offset_div2;
355    int8_t pps_tc_offset_div2;
356    uint8_t lists_modification_present_flag;
357    uint8_t log2_parallel_merge_level_minus2;
358 
359    uint16_t st_rps_bits;
360    uint8_t slice_segment_header_extension_present_flag;
361    uint8_t reserved;
362 };
363 
364 struct virgl_h265_picture_desc
365 {
366    struct virgl_base_picture_desc base;
367 
368    struct virgl_h265_pps pps;
369 
370    int32_t CurrPicOrderCntVal;
371    uint32_t ref[16];
372    int32_t PicOrderCntVal[16];
373 
374    uint32_t NumPocTotalCurr;
375    uint32_t NumDeltaPocsOfRefRpsIdx;
376    uint32_t NumShortTermPictureSliceHeaderBits;
377    uint32_t NumLongTermPictureSliceHeaderBits;
378 
379    uint8_t IsLongTerm[16];
380 
381    uint8_t IDRPicFlag;
382    uint8_t RAPPicFlag;
383    uint8_t CurrRpsIdx;
384    uint8_t NumPocStCurrBefore;
385 
386    uint8_t NumPocStCurrAfter;
387    uint8_t NumPocLtCurr;
388    uint8_t UseRefPicList;
389    uint8_t UseStRpsBits;
390 
391    uint8_t RefPicSetStCurrBefore[8];
392    uint8_t RefPicSetStCurrAfter[8];
393    uint8_t RefPicSetLtCurr[8];
394 
395    uint8_t RefPicList[2][15];
396    uint8_t reserved[2];
397 };
398 
399 struct virgl_h265_enc_seq_param
400 {
401    uint8_t  general_profile_idc;
402    uint8_t  general_level_idc;
403    uint8_t  general_tier_flag;
404    uint8_t  strong_intra_smoothing_enabled_flag;
405 
406    uint32_t intra_period;
407    uint32_t ip_period;
408 
409    uint16_t pic_width_in_luma_samples;
410    uint16_t pic_height_in_luma_samples;
411 
412    uint32_t chroma_format_idc;
413    uint32_t bit_depth_luma_minus8;
414    uint32_t bit_depth_chroma_minus8;
415 
416    uint8_t  amp_enabled_flag;
417    uint8_t  sample_adaptive_offset_enabled_flag;
418    uint8_t  pcm_enabled_flag;
419    uint8_t  sps_temporal_mvp_enabled_flag;
420 
421    uint8_t  log2_min_luma_coding_block_size_minus3;
422    uint8_t  log2_diff_max_min_luma_coding_block_size;
423    uint8_t  log2_min_transform_block_size_minus2;
424    uint8_t  log2_diff_max_min_transform_block_size;
425 
426    uint16_t conf_win_left_offset;
427    uint16_t conf_win_right_offset;
428    uint16_t conf_win_top_offset;
429    uint16_t conf_win_bottom_offset;
430 
431    uint32_t vui_parameters_present_flag;
432    struct {
433       uint32_t aspect_ratio_info_present_flag: 1;
434       uint32_t timing_info_present_flag: 1;
435       uint32_t reserved:30;
436    } vui_flags;
437    uint32_t aspect_ratio_idc;
438    uint32_t sar_width;
439    uint32_t sar_height;
440    uint32_t num_units_in_tick;
441    uint32_t time_scale;
442 
443    uint8_t  max_transform_hierarchy_depth_inter;
444    uint8_t  max_transform_hierarchy_depth_intra;
445    uint8_t  conformance_window_flag;
446    uint8_t  reserved;
447 };
448 
449 struct virgl_h265_enc_pic_param
450 {
451    uint8_t log2_parallel_merge_level_minus2;
452    uint8_t nal_unit_type;
453    uint8_t constrained_intra_pred_flag;
454    uint8_t pps_loop_filter_across_slices_enabled_flag;
455 
456    uint8_t transform_skip_enabled_flag;
457    uint8_t reserved[3];
458 };
459 
460 struct virgl_h265_enc_slice_param
461 {
462    uint8_t max_num_merge_cand;
463    int8_t  slice_cb_qp_offset;
464    int8_t  slice_cr_qp_offset;
465    int8_t  slice_beta_offset_div2;
466 
467    uint32_t slice_deblocking_filter_disabled_flag;
468 
469    int8_t  slice_tc_offset_div2;
470    uint8_t cabac_init_flag;
471    uint8_t slice_loop_filter_across_slices_enabled_flag;
472    uint8_t reserved;
473 };
474 
475 struct virgl_h265_enc_rate_control
476 {
477    uint32_t target_bitrate;
478    uint32_t peak_bitrate;
479    uint32_t frame_rate_num;
480    uint32_t frame_rate_den;
481    uint32_t quant_i_frames;
482    uint32_t quant_p_frames;
483    uint32_t quant_b_frames;
484    uint32_t vbv_buffer_size;
485    uint32_t vbv_buf_lv;
486    uint32_t target_bits_picture;
487    uint32_t peak_bits_picture_integer;
488    uint32_t peak_bits_picture_fraction;
489    uint32_t fill_data_enable;
490    uint32_t skip_frame_enable;
491    uint32_t enforce_hrd;
492    uint32_t max_au_size;
493    uint32_t max_qp;
494    uint32_t min_qp;
495 
496    uint8_t  rate_ctrl_method; /* see enum pipe_h2645_enc_rate_control_method */
497    uint8_t  reserved[3];
498 };
499 
500 struct virgl_h265_slice_descriptor
501 {
502    uint32_t slice_segment_address;
503    uint32_t num_ctu_in_slice;
504 
505    uint8_t  slice_type; /* see enum pipe_h265_slice_type */
506    uint8_t  reserved[3];
507 };
508 
509 struct virgl_h265_enc_picture_desc
510 {
511    struct virgl_base_picture_desc base;
512 
513    struct virgl_h265_enc_seq_param seq;
514    struct virgl_h265_enc_pic_param pic;
515    struct virgl_h265_enc_slice_param slice;
516    struct virgl_h265_enc_rate_control rc;
517 
518    uint32_t decoded_curr_pic;
519    uint32_t reference_frames[16];
520    uint32_t frame_num;
521    uint32_t pic_order_cnt;
522    uint32_t pic_order_cnt_type;
523    uint32_t num_ref_idx_l0_active_minus1;
524    uint32_t num_ref_idx_l1_active_minus1;
525    uint32_t ref_idx_l0_list[15];
526    uint32_t ref_idx_l1_list[15];
527    uint32_t num_slice_descriptors;
528    struct virgl_h265_slice_descriptor slices_descriptors[128];
529    struct virgl_enc_quality_modes quality_modes;
530 
531    uint8_t  picture_type; /* see enum pipe_h2645_enc_picture_type */
532    uint8_t  not_referenced;
533    uint8_t  reserved[2];
534 };
535 
536 struct virgl_mpeg4_picture_desc
537 {
538    struct virgl_base_picture_desc base;
539 
540    int32_t trd[2];
541    int32_t trb[2];
542    uint16_t vop_time_increment_resolution;
543    uint8_t vop_coding_type;
544    uint8_t vop_fcode_forward;
545    uint8_t vop_fcode_backward;
546    uint8_t resync_marker_disable;
547    uint8_t interlaced;
548    uint8_t quant_type;
549    uint8_t quarter_sample;
550    uint8_t short_video_header;
551    uint8_t rounding_control;
552    uint8_t alternate_vertical_scan_flag;
553    uint8_t top_field_first;
554 
555    uint8_t intra_matrix[64];
556    uint8_t non_intra_matrix[64];
557 
558    uint32_t ref[2];
559 };
560 
561 struct virgl_mpeg12_picture_desc
562 {
563     struct virgl_base_picture_desc base;
564 
565     unsigned picture_coding_type;
566     unsigned picture_structure;
567     unsigned frame_pred_frame_dct;
568     unsigned q_scale_type;
569     unsigned alternate_scan;
570     unsigned intra_vlc_format;
571     unsigned concealment_motion_vectors;
572     unsigned intra_dc_precision;
573     unsigned f_code[2][2];
574     unsigned top_field_first;
575     unsigned full_pel_forward_vector;
576     unsigned full_pel_backward_vector;
577     unsigned num_slices;
578 
579     uint8_t intra_matrix[64];
580     uint8_t non_intra_matrix[64];
581 
582     uint32_t ref[2];
583 };
584 
585 struct virgl_vc1_picture_desc
586 {
587    struct virgl_base_picture_desc base;
588 
589    uint32_t slice_count;
590    uint8_t picture_type;
591    uint8_t frame_coding_mode;
592    uint8_t postprocflag;
593    uint8_t pulldown;
594    uint8_t interlace;
595    uint8_t tfcntrflag;
596    uint8_t finterpflag;
597    uint8_t psf;
598    uint8_t dquant;
599    uint8_t panscan_flag;
600    uint8_t refdist_flag;
601    uint8_t quantizer;
602    uint8_t extended_mv;
603    uint8_t extended_dmv;
604    uint8_t overlap;
605    uint8_t vstransform;
606    uint8_t loopfilter;
607    uint8_t fastuvmc;
608    uint8_t range_mapy_flag;
609    uint8_t range_mapy;
610    uint8_t range_mapuv_flag;
611    uint8_t range_mapuv;
612    uint8_t multires;
613    uint8_t syncmarker;
614    uint8_t rangered;
615    uint8_t maxbframes;
616    uint8_t deblockEnable;
617    uint8_t pquant;
618 
619    uint32_t ref[2];
620 };
621 
622 struct virgl_mjpeg_picture_desc
623 {
624    struct virgl_base_picture_desc base;
625 
626     struct
627     {
628         uint16_t picture_width;
629         uint16_t picture_height;
630 
631         struct {
632             uint8_t component_id;
633             uint8_t h_sampling_factor;
634             uint8_t v_sampling_factor;
635             uint8_t quantiser_table_selector;
636         } components[255];
637 
638         uint8_t num_components;
639         uint16_t crop_x;
640         uint16_t crop_y;
641         uint16_t crop_width;
642         uint16_t crop_height;
643     } picture_parameter;
644 
645     struct
646     {
647         uint8_t load_quantiser_table[4];
648         uint8_t quantiser_table[4][64];
649     } quantization_table;
650 
651     struct
652     {
653         uint8_t load_huffman_table[2];
654 
655         struct {
656             uint8_t   num_dc_codes[16];
657             uint8_t   dc_values[12];
658             uint8_t   num_ac_codes[16];
659             uint8_t   ac_values[162];
660             uint8_t   pad[2];
661         } table[2];
662     } huffman_table;
663 
664     struct
665     {
666         unsigned slice_data_size;
667         unsigned slice_data_offset;
668         unsigned slice_data_flag;
669         unsigned slice_horizontal_position;
670         unsigned slice_vertical_position;
671 
672         struct {
673             uint8_t component_selector;
674             uint8_t dc_table_selector;
675             uint8_t ac_table_selector;
676         } components[4];
677 
678         uint8_t num_components;
679 
680         uint16_t restart_interval;
681         unsigned num_mcus;
682     } slice_parameter;
683 };
684 
685 struct virgl_vp9_segment_parameter
686 {
687     struct {
688         uint16_t segment_reference_enabled:1;
689         uint16_t segment_reference:2;
690         uint16_t segment_reference_skipped:1;
691     } segment_flags;
692 
693     uint8_t filter_level[4][2];
694     int16_t luma_ac_quant_scale;
695     int16_t luma_dc_quant_scale;
696     int16_t chroma_ac_quant_scale;
697     int16_t chroma_dc_quant_scale;
698 };
699 
700 struct virgl_vp9_picture_desc
701 {
702     struct virgl_base_picture_desc base;
703 
704     uint32_t ref[16];
705 
706     struct {
707         uint16_t frame_width;
708         uint16_t frame_height;
709 
710         struct {
711             uint32_t  subsampling_x:1;
712             uint32_t  subsampling_y:1;
713             uint32_t  frame_type:1;
714             uint32_t  show_frame:1;
715             uint32_t  error_resilient_mode:1;
716             uint32_t  intra_only:1;
717             uint32_t  allow_high_precision_mv:1;
718             uint32_t  mcomp_filter_type:3;
719             uint32_t  frame_parallel_decoding_mode:1;
720             uint32_t  reset_frame_context:2;
721             uint32_t  refresh_frame_context:1;
722             uint32_t  frame_context_idx:2;
723             uint32_t  segmentation_enabled:1;
724             uint32_t  segmentation_temporal_update:1;
725             uint32_t  segmentation_update_map:1;
726             uint32_t  last_ref_frame:3;
727             uint32_t  last_ref_frame_sign_bias:1;
728             uint32_t  golden_ref_frame:3;
729             uint32_t  golden_ref_frame_sign_bias:1;
730             uint32_t  alt_ref_frame:3;
731             uint32_t  alt_ref_frame_sign_bias:1;
732             uint32_t  lossless_flag:1;
733         } pic_fields;
734 
735         uint8_t filter_level;
736         uint8_t sharpness_level;
737         uint8_t log2_tile_rows;
738         uint8_t log2_tile_columns;
739         uint8_t frame_header_length_in_bytes;
740         uint16_t first_partition_size;
741         uint8_t mb_segment_tree_probs[7];
742         uint8_t segment_pred_probs[3];
743         uint8_t profile;
744         uint8_t bit_depth;
745 
746         bool mode_ref_delta_enabled;
747         bool mode_ref_delta_update;
748 
749         uint8_t base_qindex;
750         int8_t y_dc_delta_q;
751         int8_t uv_ac_delta_q;
752         int8_t uv_dc_delta_q;
753         uint8_t abs_delta;
754         uint8_t ref_deltas[4];
755         uint8_t mode_deltas[2];
756     } picture_parameter;
757 
758     struct {
759         uint32_t slice_data_size;
760         uint32_t slice_data_offset;
761         uint32_t slice_data_flag;
762         struct virgl_vp9_segment_parameter seg_param[8];
763     } slice_parameter;
764 };
765 
766 struct virgl_av1_picture_desc
767 {
768    struct virgl_base_picture_desc base;
769 
770    uint32_t ref[16];
771    uint32_t film_grain_target;
772    struct {
773       uint8_t profile;
774       uint8_t order_hint_bits_minus_1;
775       uint8_t bit_depth_idx;
776 
777       struct {
778          uint32_t use_128x128_superblock:1;
779          uint32_t enable_filter_intra:1;
780          uint32_t enable_intra_edge_filter:1;
781          uint32_t enable_interintra_compound:1;
782          uint32_t enable_masked_compound:1;
783          uint32_t enable_dual_filter:1;
784          uint32_t enable_order_hint:1;
785          uint32_t enable_jnt_comp:1;
786          uint32_t enable_cdef:1;
787          uint32_t mono_chrome:1;
788          uint32_t ref_frame_mvs:1;
789          uint32_t film_grain_params_present:1;
790       } seq_info_fields;
791 
792       uint32_t current_frame_id;
793 
794       uint16_t frame_width;
795       uint16_t frame_height;
796       uint16_t max_width;
797       uint16_t max_height;
798 
799       uint8_t ref_frame_idx[7];
800       uint8_t primary_ref_frame;
801       uint8_t order_hint;
802 
803       struct {
804          struct {
805             uint32_t enabled:1;
806             uint32_t update_map:1;
807             uint32_t update_data:1;
808             uint32_t temporal_update:1;
809          } segment_info_fields;
810 
811          int16_t feature_data[8][8];
812          uint8_t feature_mask[8];
813       } seg_info;
814 
815       struct {
816          struct {
817             uint32_t apply_grain:1;
818             uint32_t chroma_scaling_from_luma:1;
819             uint32_t grain_scaling_minus_8:2;
820             uint32_t ar_coeff_lag:2;
821             uint32_t ar_coeff_shift_minus_6:2;
822             uint32_t grain_scale_shift:2;
823             uint32_t overlap_flag:1;
824             uint32_t clip_to_restricted_range:1;
825          } film_grain_info_fields;
826 
827          uint16_t grain_seed;
828          uint8_t num_y_points;
829          uint8_t point_y_value[14];
830          uint8_t point_y_scaling[14];
831          uint8_t num_cb_points;
832          uint8_t point_cb_value[10];
833          uint8_t point_cb_scaling[10];
834          uint8_t num_cr_points;
835          uint8_t point_cr_value[10];
836          uint8_t point_cr_scaling[10];
837          int8_t ar_coeffs_y[24];
838          int8_t ar_coeffs_cb[25];
839          int8_t ar_coeffs_cr[25];
840          uint8_t cb_mult;
841          uint8_t cb_luma_mult;
842          uint16_t cb_offset;
843          uint8_t cr_mult;
844          uint8_t cr_luma_mult;
845          uint16_t cr_offset;
846       } film_grain_info;
847 
848       uint8_t tile_cols;
849       uint8_t tile_rows;
850       uint32_t tile_col_start_sb[65];
851       uint32_t tile_row_start_sb[65];
852       uint16_t width_in_sbs[64];
853       uint16_t height_in_sbs[64];
854       uint16_t context_update_tile_id;
855 
856       struct {
857          uint32_t frame_type:2;
858          uint32_t show_frame:1;
859          uint32_t showable_frame:1;
860          uint32_t error_resilient_mode:1;
861          uint32_t disable_cdf_update:1;
862          uint32_t allow_screen_content_tools:1;
863          uint32_t force_integer_mv:1;
864          uint32_t allow_intrabc:1;
865          uint32_t use_superres:1;
866          uint32_t allow_high_precision_mv:1;
867          uint32_t is_motion_mode_switchable:1;
868          uint32_t use_ref_frame_mvs:1;
869          uint32_t disable_frame_end_update_cdf:1;
870          uint32_t uniform_tile_spacing_flag:1;
871          uint32_t allow_warped_motion:1;
872          uint32_t large_scale_tile:1;
873       } pic_info_fields;
874 
875       uint8_t superres_scale_denominator;
876 
877       uint8_t interp_filter;
878       uint8_t filter_level[2];
879       uint8_t filter_level_u;
880       uint8_t filter_level_v;
881       struct {
882          uint8_t sharpness_level:3;
883          uint8_t mode_ref_delta_enabled:1;
884          uint8_t mode_ref_delta_update:1;
885       } loop_filter_info_fields;
886 
887       int8_t ref_deltas[8];
888       int8_t mode_deltas[2];
889 
890       uint8_t base_qindex;
891       int8_t y_dc_delta_q;
892       int8_t u_dc_delta_q;
893       int8_t u_ac_delta_q;
894       int8_t v_dc_delta_q;
895       int8_t v_ac_delta_q;
896 
897       struct {
898          uint16_t using_qmatrix:1;
899          uint16_t qm_y:4;
900          uint16_t qm_u:4;
901          uint16_t qm_v:4;
902       } qmatrix_fields;
903 
904       struct {
905          uint32_t delta_q_present_flag:1;
906          uint32_t log2_delta_q_res:2;
907          uint32_t delta_lf_present_flag:1;
908          uint32_t log2_delta_lf_res:2;
909          uint32_t delta_lf_multi:1;
910          uint32_t tx_mode:2;
911          uint32_t reference_select:1;
912          uint32_t reduced_tx_set_used:1;
913          uint32_t skip_mode_present:1;
914       } mode_control_fields;
915 
916       uint8_t cdef_damping_minus_3;
917       uint8_t cdef_bits;
918       uint8_t cdef_y_strengths[8];
919       uint8_t cdef_uv_strengths[8];
920 
921       struct {
922          uint16_t yframe_restoration_type:2;
923          uint16_t cbframe_restoration_type:2;
924          uint16_t crframe_restoration_type:2;
925          uint16_t lr_unit_shift:2;
926          uint16_t lr_uv_shift:1;
927       } loop_restoration_fields;
928 
929       uint16_t lr_unit_size[3];
930 
931       struct {
932          uint32_t wmtype;
933          uint8_t invalid;
934          int32_t wmmat[8];
935       } wm[7];
936 
937       uint32_t refresh_frame_flags;
938       uint8_t matrix_coefficients;
939    } picture_parameter;
940 
941    struct {
942       uint32_t slice_data_size[256];
943       uint32_t slice_data_offset[256];
944       uint16_t slice_data_row[256];
945       uint16_t slice_data_col[256];
946       uint8_t slice_data_anchor_frame_idx[256];
947       uint16_t slice_count;
948    } slice_parameter;
949 };
950 
951 union virgl_picture_desc {
952     struct virgl_base_picture_desc base;
953     struct virgl_h264_picture_desc h264;
954     struct virgl_h265_picture_desc h265;
955     struct virgl_mpeg4_picture_desc mpeg4;
956     struct virgl_mpeg12_picture_desc mpeg12;
957     struct virgl_vc1_picture_desc vc1;
958     struct virgl_mjpeg_picture_desc mjpeg;
959     struct virgl_av1_picture_desc av1;
960     struct virgl_h264_enc_picture_desc h264_enc;
961     struct virgl_h265_enc_picture_desc h265_enc;
962     struct virgl_vp9_picture_desc vp9;
963 };
964 
965 enum virgl_video_encode_stat {
966     VIRGL_VIDEO_ENCODE_STAT_NOT_STARTED = 0,
967     VIRGL_VIDEO_ENCODE_STAT_IN_PROGRESS,
968     VIRGL_VIDEO_ENCODE_STAT_SUCCESS,
969     VIRGL_VIDEO_ENCODE_STAT_FAILURE,
970 };
971 
972 struct virgl_video_encode_feedback {
973     uint8_t stat;           /* see enum virgl_video_encode_stat */
974     uint8_t reserved[3];
975 
976     uint32_t coded_size;    /* size of encoded data in bytes */
977 };
978 
979 #endif /* VIRGL_VIDEO_HW_H */
980 
981