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