1 /************************************************************************** 2 * 3 * Copyright 2009 Younes Manton. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 #ifndef PIPE_VIDEO_STATE_H 29 #define PIPE_VIDEO_STATE_H 30 31 #include "pipe/p_defines.h" 32 #include "pipe/p_format.h" 33 #include "pipe/p_state.h" 34 #include "pipe/p_screen.h" 35 #include "util/u_hash_table.h" 36 #include "util/u_inlines.h" 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 /* 43 * see table 6-12 in the spec 44 */ 45 enum pipe_mpeg12_picture_coding_type 46 { 47 PIPE_MPEG12_PICTURE_CODING_TYPE_I = 0x01, 48 PIPE_MPEG12_PICTURE_CODING_TYPE_P = 0x02, 49 PIPE_MPEG12_PICTURE_CODING_TYPE_B = 0x03, 50 PIPE_MPEG12_PICTURE_CODING_TYPE_D = 0x04 51 }; 52 53 /* 54 * see table 6-14 in the spec 55 */ 56 enum pipe_mpeg12_picture_structure 57 { 58 PIPE_MPEG12_PICTURE_STRUCTURE_RESERVED = 0x00, 59 PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_TOP = 0x01, 60 PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_BOTTOM = 0x02, 61 PIPE_MPEG12_PICTURE_STRUCTURE_FRAME = 0x03 62 }; 63 64 /* 65 * flags for macroblock_type, see section 6.3.17.1 in the spec 66 */ 67 enum pipe_mpeg12_macroblock_type 68 { 69 PIPE_MPEG12_MB_TYPE_QUANT = 0x01, 70 PIPE_MPEG12_MB_TYPE_MOTION_FORWARD = 0x02, 71 PIPE_MPEG12_MB_TYPE_MOTION_BACKWARD = 0x04, 72 PIPE_MPEG12_MB_TYPE_PATTERN = 0x08, 73 PIPE_MPEG12_MB_TYPE_INTRA = 0x10 74 }; 75 76 /* 77 * flags for motion_type, see table 6-17 and 6-18 in the spec 78 */ 79 enum pipe_mpeg12_motion_type 80 { 81 PIPE_MPEG12_MO_TYPE_RESERVED = 0x00, 82 PIPE_MPEG12_MO_TYPE_FIELD = 0x01, 83 PIPE_MPEG12_MO_TYPE_FRAME = 0x02, 84 PIPE_MPEG12_MO_TYPE_16x8 = 0x02, 85 PIPE_MPEG12_MO_TYPE_DUAL_PRIME = 0x03 86 }; 87 88 /* 89 * see section 6.3.17.1 and table 6-19 in the spec 90 */ 91 enum pipe_mpeg12_dct_type 92 { 93 PIPE_MPEG12_DCT_TYPE_FRAME = 0, 94 PIPE_MPEG12_DCT_TYPE_FIELD = 1 95 }; 96 97 enum pipe_mpeg12_field_select 98 { 99 PIPE_MPEG12_FS_FIRST_FORWARD = 0x01, 100 PIPE_MPEG12_FS_FIRST_BACKWARD = 0x02, 101 PIPE_MPEG12_FS_SECOND_FORWARD = 0x04, 102 PIPE_MPEG12_FS_SECOND_BACKWARD = 0x08 103 }; 104 105 enum pipe_h264_slice_type 106 { 107 PIPE_H264_SLICE_TYPE_P = 0x0, 108 PIPE_H264_SLICE_TYPE_B = 0x1, 109 PIPE_H264_SLICE_TYPE_I = 0x2, 110 PIPE_H264_SLICE_TYPE_SP = 0x3, 111 PIPE_H264_SLICE_TYPE_SI = 0x4 112 }; 113 114 enum pipe_h264_enc_picture_type 115 { 116 PIPE_H264_ENC_PICTURE_TYPE_P = 0x00, 117 PIPE_H264_ENC_PICTURE_TYPE_B = 0x01, 118 PIPE_H264_ENC_PICTURE_TYPE_I = 0x02, 119 PIPE_H264_ENC_PICTURE_TYPE_IDR = 0x03, 120 PIPE_H264_ENC_PICTURE_TYPE_SKIP = 0x04 121 }; 122 123 enum pipe_h264_enc_rate_control_method 124 { 125 PIPE_H264_ENC_RATE_CONTROL_METHOD_DISABLE = 0x00, 126 PIPE_H264_ENC_RATE_CONTROL_METHOD_CONSTANT_SKIP = 0x01, 127 PIPE_H264_ENC_RATE_CONTROL_METHOD_VARIABLE_SKIP = 0x02, 128 PIPE_H264_ENC_RATE_CONTROL_METHOD_CONSTANT = 0x03, 129 PIPE_H264_ENC_RATE_CONTROL_METHOD_VARIABLE = 0x04 130 }; 131 132 struct pipe_picture_desc 133 { 134 enum pipe_video_profile profile; 135 enum pipe_video_entrypoint entry_point; 136 }; 137 138 struct pipe_quant_matrix 139 { 140 enum pipe_video_format codec; 141 }; 142 143 struct pipe_macroblock 144 { 145 enum pipe_video_format codec; 146 }; 147 148 struct pipe_mpeg12_picture_desc 149 { 150 struct pipe_picture_desc base; 151 152 unsigned picture_coding_type; 153 unsigned picture_structure; 154 unsigned frame_pred_frame_dct; 155 unsigned q_scale_type; 156 unsigned alternate_scan; 157 unsigned intra_vlc_format; 158 unsigned concealment_motion_vectors; 159 unsigned intra_dc_precision; 160 unsigned f_code[2][2]; 161 unsigned top_field_first; 162 unsigned full_pel_forward_vector; 163 unsigned full_pel_backward_vector; 164 unsigned num_slices; 165 166 const uint8_t *intra_matrix; 167 const uint8_t *non_intra_matrix; 168 169 struct pipe_video_buffer *ref[2]; 170 }; 171 172 struct pipe_mpeg12_macroblock 173 { 174 struct pipe_macroblock base; 175 176 /* see section 6.3.17 in the spec */ 177 unsigned short x, y; 178 179 /* see section 6.3.17.1 in the spec */ 180 unsigned char macroblock_type; 181 182 union { 183 struct { 184 /* see table 6-17 in the spec */ 185 unsigned int frame_motion_type:2; 186 187 /* see table 6-18 in the spec */ 188 unsigned int field_motion_type:2; 189 190 /* see table 6-19 in the spec */ 191 unsigned int dct_type:1; 192 } bits; 193 unsigned int value; 194 } macroblock_modes; 195 196 /* see section 6.3.17.2 in the spec */ 197 unsigned char motion_vertical_field_select; 198 199 /* see Table 7-7 in the spec */ 200 short PMV[2][2][2]; 201 202 /* see figure 6.10-12 in the spec */ 203 unsigned short coded_block_pattern; 204 205 /* see figure 6.10-12 in the spec */ 206 short *blocks; 207 208 /* Number of skipped macroblocks after this macroblock */ 209 unsigned short num_skipped_macroblocks; 210 }; 211 212 struct pipe_mpeg4_picture_desc 213 { 214 struct pipe_picture_desc base; 215 216 int32_t trd[2]; 217 int32_t trb[2]; 218 uint16_t vop_time_increment_resolution; 219 uint8_t vop_coding_type; 220 uint8_t vop_fcode_forward; 221 uint8_t vop_fcode_backward; 222 uint8_t resync_marker_disable; 223 uint8_t interlaced; 224 uint8_t quant_type; 225 uint8_t quarter_sample; 226 uint8_t short_video_header; 227 uint8_t rounding_control; 228 uint8_t alternate_vertical_scan_flag; 229 uint8_t top_field_first; 230 231 const uint8_t *intra_matrix; 232 const uint8_t *non_intra_matrix; 233 234 struct pipe_video_buffer *ref[2]; 235 }; 236 237 struct pipe_vc1_picture_desc 238 { 239 struct pipe_picture_desc base; 240 241 uint32_t slice_count; 242 uint8_t picture_type; 243 uint8_t frame_coding_mode; 244 uint8_t postprocflag; 245 uint8_t pulldown; 246 uint8_t interlace; 247 uint8_t tfcntrflag; 248 uint8_t finterpflag; 249 uint8_t psf; 250 uint8_t dquant; 251 uint8_t panscan_flag; 252 uint8_t refdist_flag; 253 uint8_t quantizer; 254 uint8_t extended_mv; 255 uint8_t extended_dmv; 256 uint8_t overlap; 257 uint8_t vstransform; 258 uint8_t loopfilter; 259 uint8_t fastuvmc; 260 uint8_t range_mapy_flag; 261 uint8_t range_mapy; 262 uint8_t range_mapuv_flag; 263 uint8_t range_mapuv; 264 uint8_t multires; 265 uint8_t syncmarker; 266 uint8_t rangered; 267 uint8_t maxbframes; 268 uint8_t deblockEnable; 269 uint8_t pquant; 270 271 struct pipe_video_buffer *ref[2]; 272 }; 273 274 struct pipe_h264_sps 275 { 276 uint8_t level_idc; 277 uint8_t chroma_format_idc; 278 uint8_t separate_colour_plane_flag; 279 uint8_t bit_depth_luma_minus8; 280 uint8_t bit_depth_chroma_minus8; 281 uint8_t seq_scaling_matrix_present_flag; 282 uint8_t ScalingList4x4[6][16]; 283 uint8_t ScalingList8x8[6][64]; 284 uint8_t log2_max_frame_num_minus4; 285 uint8_t pic_order_cnt_type; 286 uint8_t log2_max_pic_order_cnt_lsb_minus4; 287 uint8_t delta_pic_order_always_zero_flag; 288 int32_t offset_for_non_ref_pic; 289 int32_t offset_for_top_to_bottom_field; 290 uint8_t num_ref_frames_in_pic_order_cnt_cycle; 291 int32_t offset_for_ref_frame[256]; 292 uint8_t max_num_ref_frames; 293 uint8_t frame_mbs_only_flag; 294 uint8_t mb_adaptive_frame_field_flag; 295 uint8_t direct_8x8_inference_flag; 296 }; 297 298 struct pipe_h264_pps 299 { 300 struct pipe_h264_sps *sps; 301 302 uint8_t entropy_coding_mode_flag; 303 uint8_t bottom_field_pic_order_in_frame_present_flag; 304 uint8_t num_slice_groups_minus1; 305 uint8_t slice_group_map_type; 306 uint8_t slice_group_change_rate_minus1; 307 uint8_t num_ref_idx_l0_default_active_minus1; 308 uint8_t num_ref_idx_l1_default_active_minus1; 309 uint8_t weighted_pred_flag; 310 uint8_t weighted_bipred_idc; 311 int8_t pic_init_qp_minus26; 312 int8_t chroma_qp_index_offset; 313 uint8_t deblocking_filter_control_present_flag; 314 uint8_t constrained_intra_pred_flag; 315 uint8_t redundant_pic_cnt_present_flag; 316 uint8_t ScalingList4x4[6][16]; 317 uint8_t ScalingList8x8[6][64]; 318 uint8_t transform_8x8_mode_flag; 319 int8_t second_chroma_qp_index_offset; 320 }; 321 322 struct pipe_h264_picture_desc 323 { 324 struct pipe_picture_desc base; 325 326 struct pipe_h264_pps *pps; 327 328 /* slice header */ 329 uint32_t frame_num; 330 uint8_t field_pic_flag; 331 uint8_t bottom_field_flag; 332 uint8_t num_ref_idx_l0_active_minus1; 333 uint8_t num_ref_idx_l1_active_minus1; 334 335 uint32_t slice_count; 336 int32_t field_order_cnt[2]; 337 bool is_reference; 338 uint8_t num_ref_frames; 339 340 bool is_long_term[16]; 341 bool top_is_reference[16]; 342 bool bottom_is_reference[16]; 343 uint32_t field_order_cnt_list[16][2]; 344 uint32_t frame_num_list[16]; 345 346 struct pipe_video_buffer *ref[16]; 347 }; 348 349 struct pipe_h264_enc_rate_control 350 { 351 enum pipe_h264_enc_rate_control_method rate_ctrl_method; 352 unsigned target_bitrate; 353 unsigned peak_bitrate; 354 unsigned frame_rate_num; 355 unsigned frame_rate_den; 356 unsigned vbv_buffer_size; 357 unsigned vbv_buf_lv; 358 unsigned target_bits_picture; 359 unsigned peak_bits_picture_integer; 360 unsigned peak_bits_picture_fraction; 361 unsigned fill_data_enable; 362 unsigned enforce_hrd; 363 }; 364 365 struct pipe_h264_enc_motion_estimation 366 { 367 unsigned motion_est_quarter_pixel; 368 unsigned enc_disable_sub_mode; 369 unsigned lsmvert; 370 unsigned enc_en_ime_overw_dis_subm; 371 unsigned enc_ime_overw_dis_subm_no; 372 unsigned enc_ime2_search_range_x; 373 unsigned enc_ime2_search_range_y; 374 }; 375 376 struct pipe_h264_enc_pic_control 377 { 378 unsigned enc_cabac_enable; 379 unsigned enc_constraint_set_flags; 380 }; 381 382 struct pipe_h264_enc_picture_desc 383 { 384 struct pipe_picture_desc base; 385 386 struct pipe_h264_enc_rate_control rate_ctrl; 387 388 struct pipe_h264_enc_motion_estimation motion_est; 389 struct pipe_h264_enc_pic_control pic_ctrl; 390 391 unsigned quant_i_frames; 392 unsigned quant_p_frames; 393 unsigned quant_b_frames; 394 395 enum pipe_h264_enc_picture_type picture_type; 396 unsigned frame_num; 397 unsigned frame_num_cnt; 398 unsigned p_remain; 399 unsigned i_remain; 400 unsigned idr_pic_id; 401 unsigned gop_cnt; 402 unsigned pic_order_cnt; 403 unsigned pic_order_cnt_type; 404 unsigned ref_idx_l0; 405 unsigned ref_idx_l1; 406 unsigned gop_size; 407 unsigned ref_pic_mode; 408 409 bool not_referenced; 410 bool enable_vui; 411 struct util_hash_table *frame_idx; 412 413 }; 414 415 struct pipe_h265_sps 416 { 417 uint8_t chroma_format_idc; 418 uint8_t separate_colour_plane_flag; 419 uint32_t pic_width_in_luma_samples; 420 uint32_t pic_height_in_luma_samples; 421 uint8_t bit_depth_luma_minus8; 422 uint8_t bit_depth_chroma_minus8; 423 uint8_t log2_max_pic_order_cnt_lsb_minus4; 424 uint8_t sps_max_dec_pic_buffering_minus1; 425 uint8_t log2_min_luma_coding_block_size_minus3; 426 uint8_t log2_diff_max_min_luma_coding_block_size; 427 uint8_t log2_min_transform_block_size_minus2; 428 uint8_t log2_diff_max_min_transform_block_size; 429 uint8_t max_transform_hierarchy_depth_inter; 430 uint8_t max_transform_hierarchy_depth_intra; 431 uint8_t scaling_list_enabled_flag; 432 uint8_t ScalingList4x4[6][16]; 433 uint8_t ScalingList8x8[6][64]; 434 uint8_t ScalingList16x16[6][64]; 435 uint8_t ScalingList32x32[2][64]; 436 uint8_t ScalingListDCCoeff16x16[6]; 437 uint8_t ScalingListDCCoeff32x32[2]; 438 uint8_t amp_enabled_flag; 439 uint8_t sample_adaptive_offset_enabled_flag; 440 uint8_t pcm_enabled_flag; 441 uint8_t pcm_sample_bit_depth_luma_minus1; 442 uint8_t pcm_sample_bit_depth_chroma_minus1; 443 uint8_t log2_min_pcm_luma_coding_block_size_minus3; 444 uint8_t log2_diff_max_min_pcm_luma_coding_block_size; 445 uint8_t pcm_loop_filter_disabled_flag; 446 uint8_t num_short_term_ref_pic_sets; 447 uint8_t long_term_ref_pics_present_flag; 448 uint8_t num_long_term_ref_pics_sps; 449 uint8_t sps_temporal_mvp_enabled_flag; 450 uint8_t strong_intra_smoothing_enabled_flag; 451 }; 452 453 struct pipe_h265_pps 454 { 455 struct pipe_h265_sps *sps; 456 457 uint8_t dependent_slice_segments_enabled_flag; 458 uint8_t output_flag_present_flag; 459 uint8_t num_extra_slice_header_bits; 460 uint8_t sign_data_hiding_enabled_flag; 461 uint8_t cabac_init_present_flag; 462 uint8_t num_ref_idx_l0_default_active_minus1; 463 uint8_t num_ref_idx_l1_default_active_minus1; 464 int8_t init_qp_minus26; 465 uint8_t constrained_intra_pred_flag; 466 uint8_t transform_skip_enabled_flag; 467 uint8_t cu_qp_delta_enabled_flag; 468 uint8_t diff_cu_qp_delta_depth; 469 int8_t pps_cb_qp_offset; 470 int8_t pps_cr_qp_offset; 471 uint8_t pps_slice_chroma_qp_offsets_present_flag; 472 uint8_t weighted_pred_flag; 473 uint8_t weighted_bipred_flag; 474 uint8_t transquant_bypass_enabled_flag; 475 uint8_t tiles_enabled_flag; 476 uint8_t entropy_coding_sync_enabled_flag; 477 uint8_t num_tile_columns_minus1; 478 uint8_t num_tile_rows_minus1; 479 uint8_t uniform_spacing_flag; 480 uint16_t column_width_minus1[20]; 481 uint16_t row_height_minus1[22]; 482 uint8_t loop_filter_across_tiles_enabled_flag; 483 uint8_t pps_loop_filter_across_slices_enabled_flag; 484 uint8_t deblocking_filter_control_present_flag; 485 uint8_t deblocking_filter_override_enabled_flag; 486 uint8_t pps_deblocking_filter_disabled_flag; 487 int8_t pps_beta_offset_div2; 488 int8_t pps_tc_offset_div2; 489 uint8_t lists_modification_present_flag; 490 uint8_t log2_parallel_merge_level_minus2; 491 uint8_t slice_segment_header_extension_present_flag; 492 }; 493 494 struct pipe_h265_picture_desc 495 { 496 struct pipe_picture_desc base; 497 498 struct pipe_h265_pps *pps; 499 500 uint8_t IDRPicFlag; 501 uint8_t RAPPicFlag; 502 uint8_t CurrRpsIdx; 503 uint32_t NumPocTotalCurr; 504 uint32_t NumDeltaPocsOfRefRpsIdx; 505 uint32_t NumShortTermPictureSliceHeaderBits; 506 uint32_t NumLongTermPictureSliceHeaderBits; 507 508 int32_t CurrPicOrderCntVal; 509 struct pipe_video_buffer *ref[16]; 510 int32_t PicOrderCntVal[16]; 511 uint8_t IsLongTerm[16]; 512 uint8_t NumPocStCurrBefore; 513 uint8_t NumPocStCurrAfter; 514 uint8_t NumPocLtCurr; 515 uint8_t RefPicSetStCurrBefore[8]; 516 uint8_t RefPicSetStCurrAfter[8]; 517 uint8_t RefPicSetLtCurr[8]; 518 uint8_t RefPicList[2][15]; 519 bool UseRefPicList; 520 }; 521 522 struct pipe_mjpeg_picture_desc 523 { 524 struct pipe_picture_desc base; 525 526 struct 527 { 528 uint16_t picture_width; 529 uint16_t picture_height; 530 531 struct { 532 uint8_t component_id; 533 uint8_t h_sampling_factor; 534 uint8_t v_sampling_factor; 535 uint8_t quantiser_table_selector; 536 } components[255]; 537 538 uint8_t num_components; 539 } picture_parameter; 540 541 struct 542 { 543 uint8_t load_quantiser_table[4]; 544 uint8_t quantiser_table[4][64]; 545 } quantization_table; 546 547 struct 548 { 549 uint8_t load_huffman_table[2]; 550 551 struct { 552 uint8_t num_dc_codes[16]; 553 uint8_t dc_values[12]; 554 uint8_t num_ac_codes[16]; 555 uint8_t ac_values[162]; 556 uint8_t pad[2]; 557 } table[2]; 558 } huffman_table; 559 560 struct 561 { 562 unsigned slice_data_size; 563 unsigned slice_data_offset; 564 unsigned slice_data_flag; 565 unsigned slice_horizontal_position; 566 unsigned slice_vertical_position; 567 568 struct { 569 uint8_t component_selector; 570 uint8_t dc_table_selector; 571 uint8_t ac_table_selector; 572 } components[4]; 573 574 uint8_t num_components; 575 576 uint16_t restart_interval; 577 unsigned num_mcus; 578 } slice_parameter; 579 }; 580 581 #ifdef __cplusplus 582 } 583 #endif 584 585 #endif /* PIPE_VIDEO_STATE_H */ 586