vulkan video: correctly set SPS VUI bits

According to the spec section E.1 flags such as overscan_info_present_flag are
independent of aspect_ratio_info_present_flag.

Reviewed-by: Hyunjun Ko <zzoon@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26669>
This commit is contained in:
Colin Marc 2023-12-11 22:27:04 +01:00 committed by Marge Bot
parent 07f8db02ff
commit a26119e124

View file

@ -1456,63 +1456,66 @@ vk_video_encode_h264_sps(StdVideoH264SequenceParameterSet *sps,
vl_bitstream_exp_golomb_ue(&enc, sps->frame_crop_bottom_offset);
}
vl_bitstream_put_bits(&enc, 1, sps->flags.vui_parameters_present_flag); /* vui parameters preseent flag */
vl_bitstream_put_bits(&enc, 1, sps->flags.vui_parameters_present_flag); /* vui parameters present flag */
if (sps->flags.vui_parameters_present_flag) {
const StdVideoH264SequenceParameterSetVui *vui = sps->pSequenceParameterSetVui;
vl_bitstream_put_bits(&enc, 1, vui->flags.aspect_ratio_info_present_flag);
if (vui->flags.aspect_ratio_info_present_flag) {
vl_bitstream_put_bits(&enc, 8, vui->aspect_ratio_idc);
if (vui->aspect_ratio_idc == STD_VIDEO_H264_ASPECT_RATIO_IDC_EXTENDED_SAR) {
vl_bitstream_put_bits(&enc, 16, vui->sar_width);
vl_bitstream_put_bits(&enc, 16, vui->sar_height);
}
vl_bitstream_put_bits(&enc, 1, vui->flags.overscan_info_present_flag);
if (vui->flags.overscan_info_present_flag)
vl_bitstream_put_bits(&enc, 1, vui->flags.overscan_appropriate_flag);
vl_bitstream_put_bits(&enc, 1, vui->flags.video_signal_type_present_flag);
if (vui->flags.video_signal_type_present_flag) {
vl_bitstream_put_bits(&enc, 3, vui->video_format);
vl_bitstream_put_bits(&enc, 1, vui->flags.video_full_range_flag);
vl_bitstream_put_bits(&enc, 1, vui->flags.color_description_present_flag);
if (vui->flags.color_description_present_flag) {
vl_bitstream_put_bits(&enc, 8, vui->colour_primaries);
vl_bitstream_put_bits(&enc, 8, vui->transfer_characteristics);
vl_bitstream_put_bits(&enc, 8, vui->matrix_coefficients);
}
}
}
vl_bitstream_put_bits(&enc, 1, vui->flags.chroma_loc_info_present_flag);
if (vui->flags.chroma_loc_info_present_flag) {
vl_bitstream_exp_golomb_ue(&enc, vui->chroma_sample_loc_type_top_field);
vl_bitstream_exp_golomb_ue(&enc, vui->chroma_sample_loc_type_bottom_field);
}
vl_bitstream_put_bits(&enc, 1, vui->flags.timing_info_present_flag);
if (vui->flags.timing_info_present_flag) {
vl_bitstream_put_bits(&enc, 32, vui->num_units_in_tick);
vl_bitstream_put_bits(&enc, 32, vui->time_scale);
vl_bitstream_put_bits(&enc, 32, vui->flags.fixed_frame_rate_flag);
}
vl_bitstream_put_bits(&enc, 1, vui->flags.nal_hrd_parameters_present_flag);
if (vui->flags.nal_hrd_parameters_present_flag)
encode_hrd_params(&enc, vui->pHrdParameters);
vl_bitstream_put_bits(&enc, 1, vui->flags.vcl_hrd_parameters_present_flag);
if (vui->flags.vcl_hrd_parameters_present_flag)
encode_hrd_params(&enc, vui->pHrdParameters);
if (vui->flags.nal_hrd_parameters_present_flag || vui->flags.vcl_hrd_parameters_present_flag)
vl_bitstream_put_bits(&enc, 1, 0);
vl_bitstream_put_bits(&enc, 1, 0);
vl_bitstream_put_bits(&enc, 1, vui->flags.bitstream_restriction_flag);
if (vui->flags.bitstream_restriction_flag) {
vl_bitstream_put_bits(&enc, 1, 0);
vl_bitstream_exp_golomb_ue(&enc, 0);
vl_bitstream_exp_golomb_ue(&enc, 0);
vl_bitstream_exp_golomb_ue(&enc, 0);
vl_bitstream_exp_golomb_ue(&enc, 0);
vl_bitstream_exp_golomb_ue(&enc, vui->max_num_reorder_frames);
vl_bitstream_exp_golomb_ue(&enc, vui->max_dec_frame_buffering);
vl_bitstream_put_bits(&enc, 1, vui->flags.overscan_info_present_flag);
if (vui->flags.overscan_info_present_flag)
vl_bitstream_put_bits(&enc, 1, vui->flags.overscan_appropriate_flag);
vl_bitstream_put_bits(&enc, 1, vui->flags.video_signal_type_present_flag);
if (vui->flags.video_signal_type_present_flag) {
vl_bitstream_put_bits(&enc, 3, vui->video_format);
vl_bitstream_put_bits(&enc, 1, vui->flags.video_full_range_flag);
vl_bitstream_put_bits(&enc, 1, vui->flags.color_description_present_flag);
if (vui->flags.color_description_present_flag) {
vl_bitstream_put_bits(&enc, 8, vui->colour_primaries);
vl_bitstream_put_bits(&enc, 8, vui->transfer_characteristics);
vl_bitstream_put_bits(&enc, 8, vui->matrix_coefficients);
}
}
vl_bitstream_put_bits(&enc, 1, vui->flags.chroma_loc_info_present_flag);
if (vui->flags.chroma_loc_info_present_flag) {
vl_bitstream_exp_golomb_ue(&enc, vui->chroma_sample_loc_type_top_field);
vl_bitstream_exp_golomb_ue(&enc, vui->chroma_sample_loc_type_bottom_field);
}
vl_bitstream_put_bits(&enc, 1, vui->flags.timing_info_present_flag);
if (vui->flags.timing_info_present_flag) {
vl_bitstream_put_bits(&enc, 32, vui->num_units_in_tick);
vl_bitstream_put_bits(&enc, 32, vui->time_scale);
vl_bitstream_put_bits(&enc, 32, vui->flags.fixed_frame_rate_flag);
}
vl_bitstream_put_bits(&enc, 1, vui->flags.nal_hrd_parameters_present_flag);
if (vui->flags.nal_hrd_parameters_present_flag)
encode_hrd_params(&enc, vui->pHrdParameters);
vl_bitstream_put_bits(&enc, 1, vui->flags.vcl_hrd_parameters_present_flag);
if (vui->flags.vcl_hrd_parameters_present_flag)
encode_hrd_params(&enc, vui->pHrdParameters);
if (vui->flags.nal_hrd_parameters_present_flag || vui->flags.vcl_hrd_parameters_present_flag)
vl_bitstream_put_bits(&enc, 1, 0);
vl_bitstream_put_bits(&enc, 1, 0);
vl_bitstream_put_bits(&enc, 1, vui->flags.bitstream_restriction_flag);
if (vui->flags.bitstream_restriction_flag) {
vl_bitstream_put_bits(&enc, 1, 0);
vl_bitstream_exp_golomb_ue(&enc, 0);
vl_bitstream_exp_golomb_ue(&enc, 0);
vl_bitstream_exp_golomb_ue(&enc, 0);
vl_bitstream_exp_golomb_ue(&enc, 0);
vl_bitstream_exp_golomb_ue(&enc, vui->max_num_reorder_frames);
vl_bitstream_exp_golomb_ue(&enc, vui->max_dec_frame_buffering);
}
}
vl_bitstream_rbsp_trailing(&enc);
vl_bitstream_flush(&enc);