23 #include <vdpau/vdpau.h>
41 VdpPictureInfoHEVC *
info = &pic_ctx->
info.hevc;
42 #ifdef VDP_YCBCR_FORMAT_Y_U_V_444
43 VdpPictureInfoHEVC444 *info2 = &pic_ctx->
info.hevc_444;
50 &
pps->scaling_list : &
sps->scaling_list;
55 info->chroma_format_idc =
sps->chroma_format_idc;
56 info->separate_colour_plane_flag =
sps->separate_colour_plane_flag;
57 info->pic_width_in_luma_samples =
sps->width;
58 info->pic_height_in_luma_samples =
sps->height;
59 info->bit_depth_luma_minus8 =
sps->bit_depth - 8;
60 info->bit_depth_chroma_minus8 =
sps->bit_depth - 8;
61 info->log2_max_pic_order_cnt_lsb_minus4 =
sps->log2_max_poc_lsb - 4;
64 info->sps_max_dec_pic_buffering_minus1 =
sps->temporal_layer[
sps->max_sub_layers - 1].max_dec_pic_buffering - 1;
65 info->log2_min_luma_coding_block_size_minus3 =
sps->log2_min_cb_size - 3;
66 info->log2_diff_max_min_luma_coding_block_size =
sps->log2_diff_max_min_coding_block_size;
67 info->log2_min_transform_block_size_minus2 =
sps->log2_min_tb_size - 2;
68 info->log2_diff_max_min_transform_block_size =
sps->log2_max_trafo_size -
sps->log2_min_tb_size;
69 info->max_transform_hierarchy_depth_inter =
sps->max_transform_hierarchy_depth_inter;
70 info->max_transform_hierarchy_depth_intra =
sps->max_transform_hierarchy_depth_intra;
71 info->scaling_list_enabled_flag =
sps->scaling_list_enable_flag;
73 for (
size_t i = 0;
i < 6;
i++) {
74 for (
size_t j = 0; j < 16; j++) {
80 for (
size_t j = 0; j < 64; j++) {
91 info->ScalingList32x32[
i][j] = sl->
sl[3][
i * 3][
pos];
100 info->ScalingListDCCoeff32x32[
i] = sl->
sl_dc[1][
i * 3];
103 info->amp_enabled_flag =
sps->amp_enabled_flag;
104 info->sample_adaptive_offset_enabled_flag =
sps->sao_enabled;
105 info->pcm_enabled_flag =
sps->pcm_enabled_flag;
106 if (
info->pcm_enabled_flag) {
108 info->pcm_sample_bit_depth_luma_minus1 =
sps->pcm.bit_depth - 1;
110 info->pcm_sample_bit_depth_chroma_minus1 =
sps->pcm.bit_depth_chroma - 1;
112 info->log2_min_pcm_luma_coding_block_size_minus3 =
sps->pcm.log2_min_pcm_cb_size - 3;
114 info->log2_diff_max_min_pcm_luma_coding_block_size =
sps->pcm.log2_max_pcm_cb_size -
sps->pcm.log2_min_pcm_cb_size;
116 info->pcm_loop_filter_disabled_flag =
sps->pcm.loop_filter_disable_flag;
120 info->num_short_term_ref_pic_sets =
sps->nb_st_rps;
121 info->long_term_ref_pics_present_flag =
sps->long_term_ref_pics_present_flag;
124 info->num_long_term_ref_pics_sps =
sps->num_long_term_ref_pics_sps;
125 info->sps_temporal_mvp_enabled_flag =
sps->sps_temporal_mvp_enabled_flag;
126 info->strong_intra_smoothing_enabled_flag =
sps->sps_strong_intra_smoothing_enable_flag;
129 info->dependent_slice_segments_enabled_flag =
pps->dependent_slice_segments_enabled_flag;
130 info->output_flag_present_flag =
pps->output_flag_present_flag;
131 info->num_extra_slice_header_bits =
pps->num_extra_slice_header_bits;
132 info->sign_data_hiding_enabled_flag =
pps->sign_data_hiding_flag;
133 info->cabac_init_present_flag =
pps->cabac_init_present_flag;
134 info->num_ref_idx_l0_default_active_minus1 =
pps->num_ref_idx_l0_default_active - 1;
135 info->num_ref_idx_l1_default_active_minus1 =
pps->num_ref_idx_l1_default_active - 1;
136 info->init_qp_minus26 =
pps->pic_init_qp_minus26;
137 info->constrained_intra_pred_flag =
pps->constrained_intra_pred_flag;
138 info->transform_skip_enabled_flag =
pps->transform_skip_enabled_flag;
139 info->cu_qp_delta_enabled_flag =
pps->cu_qp_delta_enabled_flag;
141 info->diff_cu_qp_delta_depth =
pps->diff_cu_qp_delta_depth;
142 info->pps_cb_qp_offset =
pps->cb_qp_offset;
143 info->pps_cr_qp_offset =
pps->cr_qp_offset;
144 info->pps_slice_chroma_qp_offsets_present_flag =
pps->pic_slice_level_chroma_qp_offsets_present_flag;
145 info->weighted_pred_flag =
pps->weighted_pred_flag;
146 info->weighted_bipred_flag =
pps->weighted_bipred_flag;
147 info->transquant_bypass_enabled_flag =
pps->transquant_bypass_enable_flag;
148 info->tiles_enabled_flag =
pps->tiles_enabled_flag;
149 info->entropy_coding_sync_enabled_flag =
pps->entropy_coding_sync_enabled_flag;
150 if (
info->tiles_enabled_flag) {
152 info->num_tile_columns_minus1 =
pps->num_tile_columns - 1;
154 info->num_tile_rows_minus1 =
pps->num_tile_rows - 1;
156 info->uniform_spacing_flag =
pps->uniform_spacing_flag;
160 for (ssize_t
i = 0;
i <
pps->num_tile_columns;
i++) {
161 info->column_width_minus1[
i] =
pps->column_width[
i] - 1;
166 for (ssize_t
i = 0;
i <
pps->num_tile_rows;
i++) {
167 info->row_height_minus1[
i] =
pps->row_height[
i] - 1;
171 info->loop_filter_across_tiles_enabled_flag =
pps->loop_filter_across_tiles_enabled_flag;
173 info->pps_loop_filter_across_slices_enabled_flag =
pps->seq_loop_filter_across_slices_enabled_flag;
174 info->deblocking_filter_control_present_flag =
pps->deblocking_filter_control_present_flag;
177 info->deblocking_filter_override_enabled_flag =
pps->deblocking_filter_override_enabled_flag;
180 info->pps_deblocking_filter_disabled_flag =
pps->disable_dbf;
183 info->pps_beta_offset_div2 =
pps->beta_offset / 2;
186 info->pps_tc_offset_div2 =
pps->tc_offset / 2;
187 info->lists_modification_present_flag =
pps->lists_modification_present_flag;
188 info->log2_parallel_merge_level_minus2 =
pps->log2_parallel_merge_level - 2;
189 info->slice_segment_header_extension_present_flag =
pps->slice_header_extension_present_flag;
198 info->CurrRpsIdx =
sps->nb_st_rps;
200 for (
size_t i = 0;
i <
sps->nb_st_rps;
i++) {
202 info->CurrRpsIdx =
i;
231 info->CurrPicOrderCntVal =
h->poc;
234 for (
size_t i = 0;
i < 16;
i++) {
235 info->RefPics[
i] = VDP_INVALID_HANDLE;
236 info->PicOrderCntVal[
i] = 0;
237 info->IsLongTerm[
i] = 0;
245 "VDPAU only supports up to 16 references in the DPB. "
246 "This frame may not be decoded correctly.\n");
261 info->IsLongTerm[j] = 0;
268 if (
info->NumPocStCurrBefore > 8) {
270 "VDPAU only supports up to 8 references in StCurrBefore. "
271 "This frame may not be decoded correctly.\n");
272 info->NumPocStCurrBefore = 8;
277 if (
info->NumPocStCurrAfter > 8) {
279 "VDPAU only supports up to 8 references in StCurrAfter. "
280 "This frame may not be decoded correctly.\n");
281 info->NumPocStCurrAfter = 8;
286 if (
info->NumPocLtCurr > 8) {
288 "VDPAU only supports up to 8 references in LtCurr. "
289 "This frame may not be decoded correctly.\n");
290 info->NumPocLtCurr = 8;
299 for (
size_t k = 0; k < 16; k++) {
300 if (
id ==
info->RefPics[k]) {
301 info->RefPicSetStCurrBefore[j] = k;
322 for (
size_t k = 0; k < 16; k++) {
323 if (
id ==
info->RefPics[k]) {
324 info->RefPicSetStCurrAfter[j] = k;
340 for (ssize_t
i = 0, j = 0;
i <
h->rps[
LT_CURR].nb_refs;
i++) {
345 for (
size_t k = 0; k < 16; k++) {
346 if (
id ==
info->RefPics[k]) {
347 info->RefPicSetLtCurr[j] = k;
362 #ifdef VDP_YCBCR_FORMAT_Y_U_V_444
363 if (
sps->sps_range_extension_flag) {
364 info2->sps_range_extension_flag = 1;
365 info2->transformSkipRotationEnableFlag =
sps->transform_skip_rotation_enabled_flag;
366 info2->transformSkipContextEnableFlag =
sps->transform_skip_context_enabled_flag;
367 info2->implicitRdpcmEnableFlag =
sps->implicit_rdpcm_enabled_flag;
368 info2->explicitRdpcmEnableFlag =
sps->explicit_rdpcm_enabled_flag;
369 info2->extendedPrecisionProcessingFlag =
sps->extended_precision_processing_flag;
370 info2->intraSmoothingDisabledFlag =
sps->intra_smoothing_disabled_flag;
371 info2->highPrecisionOffsetsEnableFlag =
sps->high_precision_offsets_enabled_flag;
372 info2->persistentRiceAdaptationEnableFlag =
sps->persistent_rice_adaptation_enabled_flag;
373 info2->cabacBypassAlignmentEnableFlag =
sps->cabac_bypass_alignment_enabled_flag;
375 info2->sps_range_extension_flag = 0;
377 if (
pps->pps_range_extensions_flag) {
378 info2->pps_range_extension_flag = 1;
379 info2->log2MaxTransformSkipSize =
pps->log2_max_transform_skip_block_size;
380 info2->crossComponentPredictionEnableFlag =
pps->cross_component_prediction_enabled_flag;
381 info2->chromaQpAdjustmentEnableFlag =
pps->chroma_qp_offset_list_enabled_flag;
382 info2->diffCuChromaQpAdjustmentDepth =
pps->diff_cu_chroma_qp_offset_depth;
383 info2->chromaQpAdjustmentTableSize =
pps->chroma_qp_offset_list_len_minus1 + 1;
384 info2->log2SaoOffsetScaleLuma =
pps->log2_sao_offset_scale_luma;
385 info2->log2SaoOffsetScaleChroma =
pps->log2_sao_offset_scale_chroma;
386 for (ssize_t
i = 0;
i < info2->chromaQpAdjustmentTableSize;
i++)
388 info2->cb_qp_adjustment[
i] =
pps->cb_qp_offset_list[
i];
389 info2->cr_qp_adjustment[
i] =
pps->cr_qp_offset_list[
i];
393 info2->pps_range_extension_flag = 0;
444 #define copy_field(name) h265_raw_ptl->general_ ## name = general_ptl->name
486 *vdp_profile = VDP_DECODER_PROFILE_HEVC_MAIN;
492 if (!strcmp(
profile->name,
"Main 12") ||
493 !strcmp(
profile->name,
"Main 12 Intra"))
494 *vdp_profile = VDP_DECODER_PROFILE_HEVC_MAIN_12;
495 #ifdef VDP_DECODER_PROFILE_HEVC_MAIN_444
496 else if (!strcmp(
profile->name,
"Main 4:4:4") ||
497 !strcmp(
profile->name,
"Main 4:4:4 Intra"))
498 *vdp_profile = VDP_DECODER_PROFILE_HEVC_MAIN_444;
500 #ifdef VDP_DECODER_PROFILE_HEVC_MAIN_444_10
501 else if (!strcmp(
profile->name,
"Main 4:4:4 10") ||
502 !strcmp(
profile->name,
"Main 4:4:4 10 Intra"))
503 *vdp_profile = VDP_DECODER_PROFILE_HEVC_MAIN_444_10;
504 else if (!strcmp(
profile->name,
"Main 4:4:4 12") ||
505 !strcmp(
profile->name,
"Main 4:4:4 12 Intra"))
506 *vdp_profile = VDP_DECODER_PROFILE_HEVC_MAIN_444_12;
523 profile = VDP_DECODER_PROFILE_HEVC_MAIN;
526 profile = VDP_DECODER_PROFILE_HEVC_MAIN_10;
529 profile = VDP_DECODER_PROFILE_HEVC_MAIN_STILL;
544 .
p.
name =
"hevc_vdpau",