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:
@@ -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_motion_precision_limit = 0x200,
|
||||||
d3d12_video_encoder_config_dirty_flag_sequence_info = 0x400,
|
d3d12_video_encoder_config_dirty_flag_sequence_info = 0x400,
|
||||||
d3d12_video_encoder_config_dirty_flag_intra_refresh = 0x800,
|
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);
|
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_h264_enc_seq_param m_encoderCodecSpecificSequenceStateDescH264;
|
||||||
struct pipe_h265_enc_seq_param m_encoderCodecSpecificSequenceStateDescH265;
|
struct pipe_h265_enc_seq_param m_encoderCodecSpecificSequenceStateDescH265;
|
||||||
|
struct pipe_h265_enc_vid_param m_encoderCodecSpecificVideoStateDescH265;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct EncodedBitstreamResolvedMetadata
|
struct EncodedBitstreamResolvedMetadata
|
||||||
|
@@ -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;
|
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
|
// Set Sequence information
|
||||||
if (memcmp(&pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificSequenceStateDescH265,
|
if (memcmp(&pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificSequenceStateDescH265,
|
||||||
&hevcPic->seq,
|
&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 profDesc = d3d12_video_encoder_get_current_profile_desc(pD3D12Enc);
|
||||||
auto levelDesc = d3d12_video_encoder_get_current_level_desc(pD3D12Enc);
|
auto levelDesc = d3d12_video_encoder_get_current_level_desc(pD3D12Enc);
|
||||||
auto codecConfigDesc = d3d12_video_encoder_get_current_codec_config_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();
|
pWrittenCodecUnitsSizes.clear();
|
||||||
bool isFirstFrame = (pD3D12Enc->m_fenceValue == 1);
|
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;
|
size_t writtenVPSBytesCount = 0;
|
||||||
if (writeNewVPS) {
|
if (writeNewVPS) {
|
||||||
bool gopHasBFrames = (pD3D12Enc->m_currentEncodeConfig.m_encoderGOPConfigDesc.m_HEVCGroupOfPictures.PPicturePeriod > 1);
|
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,
|
*levelDesc.pHEVCLevelSetting,
|
||||||
pD3D12Enc->m_currentEncodeConfig.m_encodeFormatInfo.Format,
|
pD3D12Enc->m_currentEncodeConfig.m_encodeFormatInfo.Format,
|
||||||
MaxDPBCapacity, // max_num_ref_frames
|
|
||||||
gopHasBFrames,
|
gopHasBFrames,
|
||||||
active_video_parameter_set_id,
|
active_video_parameter_set_id,
|
||||||
pD3D12Enc->m_BitstreamHeadersBuffer,
|
pD3D12Enc->m_BitstreamHeadersBuffer,
|
||||||
|
@@ -298,10 +298,10 @@ d3d12_video_encoder_convert_pixel_size_hevc_to_12tusize(const uint32_t& TUSize)
|
|||||||
}
|
}
|
||||||
|
|
||||||
HevcVideoParameterSet
|
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 D3D12_VIDEO_ENCODER_LEVEL_TIER_CONSTRAINTS_HEVC& level,
|
||||||
const DXGI_FORMAT inputFmt,
|
const DXGI_FORMAT inputFmt,
|
||||||
uint8_t maxRefFrames,
|
|
||||||
bool gopHasBFrames,
|
bool gopHasBFrames,
|
||||||
uint8_t vps_video_parameter_set_id,
|
uint8_t vps_video_parameter_set_id,
|
||||||
std::vector<BYTE> &headerBitstream,
|
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);
|
init_profile_tier_level(&m_latest_vps.ptl, HEVCProfileIdc, HEVCLevelIdc, isHighTier);
|
||||||
m_latest_vps.vps_sub_layer_ordering_info_present_flag = 0u;
|
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++) {
|
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_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.
|
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.
|
||||||
}
|
}
|
||||||
|
@@ -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() {};
|
||||||
~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 D3D12_VIDEO_ENCODER_LEVEL_TIER_CONSTRAINTS_HEVC& level,
|
||||||
const DXGI_FORMAT inputFmt,
|
const DXGI_FORMAT inputFmt,
|
||||||
uint8_t maxRefFrames,
|
|
||||||
bool gopHasBFrames,
|
bool gopHasBFrames,
|
||||||
uint8_t vps_video_parameter_set_id,
|
uint8_t vps_video_parameter_set_id,
|
||||||
std::vector<BYTE> &headerBitstream,
|
std::vector<BYTE> &headerBitstream,
|
||||||
|
Reference in New Issue
Block a user