d3d12: Video Encode HEVC - Use VPS information from frontend, specifically for vps_max_dec_pic_buffering_minus1

Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30908>
This commit is contained in:
Sil Vilerino
2024-08-29 08:04:30 -04:00
committed by Marge Bot
parent e268ed0613
commit 7530487e60
4 changed files with 17 additions and 8 deletions

View File

@@ -133,6 +133,7 @@ enum d3d12_video_encoder_config_dirty_flags
d3d12_video_encoder_config_dirty_flag_motion_precision_limit = 0x200,
d3d12_video_encoder_config_dirty_flag_sequence_info = 0x400,
d3d12_video_encoder_config_dirty_flag_intra_refresh = 0x800,
d3d12_video_encoder_config_dirty_flag_video_header = 0x1000,
};
DEFINE_ENUM_FLAG_OPERATORS(d3d12_video_encoder_config_dirty_flags);
@@ -280,6 +281,7 @@ struct D3D12EncodeConfiguration
struct pipe_h264_enc_seq_param m_encoderCodecSpecificSequenceStateDescH264;
struct pipe_h265_enc_seq_param m_encoderCodecSpecificSequenceStateDescH265;
struct pipe_h265_enc_vid_param m_encoderCodecSpecificVideoStateDescH265;
};
struct EncodedBitstreamResolvedMetadata

View File

@@ -779,6 +779,14 @@ d3d12_video_encoder_update_current_encoder_config_state_hevc(struct d3d12_video_
}
pD3D12Enc->m_currentEncodeConfig.m_encoderCodecDesc = D3D12_VIDEO_ENCODER_CODEC_HEVC;
// Set VPS information
if (memcmp(&pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificVideoStateDescH265,
&hevcPic->vid,
sizeof(hevcPic->vid)) != 0) {
pD3D12Enc->m_currentEncodeConfig.m_ConfigDirtyFlags |= d3d12_video_encoder_config_dirty_flag_video_header;
}
pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificVideoStateDescH265 = hevcPic->vid;
// Set Sequence information
if (memcmp(&pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificSequenceStateDescH265,
&hevcPic->seq,
@@ -1031,7 +1039,6 @@ d3d12_video_encoder_build_codec_headers_hevc(struct d3d12_video_encoder *pD3D12E
auto profDesc = d3d12_video_encoder_get_current_profile_desc(pD3D12Enc);
auto levelDesc = d3d12_video_encoder_get_current_level_desc(pD3D12Enc);
auto codecConfigDesc = d3d12_video_encoder_get_current_codec_config_desc(pD3D12Enc);
auto MaxDPBCapacity = d3d12_video_encoder_get_current_max_dpb_capacity(pD3D12Enc);
pWrittenCodecUnitsSizes.clear();
bool isFirstFrame = (pD3D12Enc->m_fenceValue == 1);
@@ -1048,10 +1055,10 @@ d3d12_video_encoder_build_codec_headers_hevc(struct d3d12_video_encoder *pD3D12E
size_t writtenVPSBytesCount = 0;
if (writeNewVPS) {
bool gopHasBFrames = (pD3D12Enc->m_currentEncodeConfig.m_encoderGOPConfigDesc.m_HEVCGroupOfPictures.PPicturePeriod > 1);
HevcVideoParameterSet vps = pHEVCBitstreamBuilder->build_vps(*profDesc.pHEVCProfile,
HevcVideoParameterSet vps = pHEVCBitstreamBuilder->build_vps(pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificVideoStateDescH265,
*profDesc.pHEVCProfile,
*levelDesc.pHEVCLevelSetting,
pD3D12Enc->m_currentEncodeConfig.m_encodeFormatInfo.Format,
MaxDPBCapacity, // max_num_ref_frames
gopHasBFrames,
active_video_parameter_set_id,
pD3D12Enc->m_BitstreamHeadersBuffer,

View File

@@ -298,10 +298,10 @@ d3d12_video_encoder_convert_pixel_size_hevc_to_12tusize(const uint32_t& TUSize)
}
HevcVideoParameterSet
d3d12_video_bitstream_builder_hevc::build_vps(const D3D12_VIDEO_ENCODER_PROFILE_HEVC& profile,
d3d12_video_bitstream_builder_hevc::build_vps(const struct pipe_h265_enc_vid_param & vidData,
const D3D12_VIDEO_ENCODER_PROFILE_HEVC& profile,
const D3D12_VIDEO_ENCODER_LEVEL_TIER_CONSTRAINTS_HEVC& level,
const DXGI_FORMAT inputFmt,
uint8_t maxRefFrames,
bool gopHasBFrames,
uint8_t vps_video_parameter_set_id,
std::vector<BYTE> &headerBitstream,
@@ -334,7 +334,7 @@ d3d12_video_bitstream_builder_hevc::build_vps(const D3D12_VIDEO_ENCODER_PROFILE_
init_profile_tier_level(&m_latest_vps.ptl, HEVCProfileIdc, HEVCLevelIdc, isHighTier);
m_latest_vps.vps_sub_layer_ordering_info_present_flag = 0u;
for (int i = (m_latest_vps.vps_sub_layer_ordering_info_present_flag ? 0 : m_latest_vps.vps_max_sub_layers_minus1); i <= m_latest_vps.vps_max_sub_layers_minus1; i++) {
m_latest_vps.vps_max_dec_pic_buffering_minus1[i] = (maxRefFrames/*previous reference frames*/ + 1 /*additional current frame recon pic*/) - 1/**minus1 for header*/;
m_latest_vps.vps_max_dec_pic_buffering_minus1[i] = vidData.vps_max_dec_pic_buffering_minus1[i];
m_latest_vps.vps_max_num_reorder_pics[i] = gopHasBFrames ? m_latest_vps.vps_max_dec_pic_buffering_minus1[i] : 0;
m_latest_vps.vps_max_latency_increase_plus1[i] = 0; // When vps_max_latency_increase_plus1[ i ] is equal to 0, no corresponding limit is expressed.
}

View File

@@ -34,10 +34,10 @@ class d3d12_video_bitstream_builder_hevc : public d3d12_video_bitstream_builder_
d3d12_video_bitstream_builder_hevc() {};
~d3d12_video_bitstream_builder_hevc() {};
HevcVideoParameterSet build_vps(const D3D12_VIDEO_ENCODER_PROFILE_HEVC& profile,
HevcVideoParameterSet build_vps(const struct pipe_h265_enc_vid_param & vidData,
const D3D12_VIDEO_ENCODER_PROFILE_HEVC& profile,
const D3D12_VIDEO_ENCODER_LEVEL_TIER_CONSTRAINTS_HEVC& level,
const DXGI_FORMAT inputFmt,
uint8_t maxRefFrames,
bool gopHasBFrames,
uint8_t vps_video_parameter_set_id,
std::vector<BYTE> &headerBitstream,