d3d12: Do not increase active_seq_parameter_set_id on new SPS. Force PPS on new SPS
Reviewed-by: Jesse Natalie <jenatali@microsoft.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26456>
This commit is contained in:
@@ -1105,11 +1105,6 @@ d3d12_video_encoder_build_codec_headers_h264(struct d3d12_video_encoder *pD3D12E
|
||||
|
||||
size_t writtenSPSBytesCount = 0;
|
||||
if (writeNewSPS) {
|
||||
// For every new SPS for reconfiguration, increase the active_sps_id
|
||||
if (!isFirstFrame) {
|
||||
active_seq_parameter_set_id++;
|
||||
pH264BitstreamBuilder->set_active_sps_id(active_seq_parameter_set_id);
|
||||
}
|
||||
pH264BitstreamBuilder->build_sps(pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificSequenceStateDescH264,
|
||||
*profDesc.pH264Profile,
|
||||
*levelDesc.pH264LevelSetting,
|
||||
@@ -1137,8 +1132,9 @@ d3d12_video_encoder_build_codec_headers_h264(struct d3d12_video_encoder *pD3D12E
|
||||
writtenPPSBytesCount);
|
||||
|
||||
std::vector<uint8_t>& active_pps = pH264BitstreamBuilder->get_active_pps();
|
||||
if ( (writtenPPSBytesCount != active_pps.size()) ||
|
||||
memcmp(pD3D12Enc->m_StagingHeadersBuffer.data(), active_pps.data(), writtenPPSBytesCount)) {
|
||||
if (writeNewSPS ||
|
||||
(writtenPPSBytesCount != active_pps.size()) ||
|
||||
memcmp(pD3D12Enc->m_StagingHeadersBuffer.data(), active_pps.data(), writtenPPSBytesCount)) {
|
||||
active_pps = pD3D12Enc->m_StagingHeadersBuffer;
|
||||
pD3D12Enc->m_BitstreamHeadersBuffer.resize(writtenAUDBytesCount + writtenSPSBytesCount + writtenPPSBytesCount);
|
||||
memcpy(&pD3D12Enc->m_BitstreamHeadersBuffer.data()[writtenAUDBytesCount + writtenSPSBytesCount], pD3D12Enc->m_StagingHeadersBuffer.data(), writtenPPSBytesCount);
|
||||
|
@@ -1023,11 +1023,6 @@ d3d12_video_encoder_build_codec_headers_hevc(struct d3d12_video_encoder *pD3D12E
|
||||
|
||||
pWrittenCodecUnitsSizes.clear();
|
||||
bool isFirstFrame = (pD3D12Enc->m_fenceValue == 1);
|
||||
bool writeNewSPS = isFirstFrame // on first frame
|
||||
|| ((pD3D12Enc->m_currentEncodeConfig.m_seqFlags & // also on resolution change
|
||||
D3D12_VIDEO_ENCODER_SEQUENCE_CONTROL_FLAG_RESOLUTION_CHANGE) != 0)
|
||||
// Also on input format dirty flag for new SPS, VUI etc
|
||||
|| (pD3D12Enc->m_currentEncodeConfig.m_ConfigDirtyFlags & d3d12_video_encoder_config_dirty_flag_sequence_info);
|
||||
|
||||
d3d12_video_bitstream_builder_hevc *pHEVCBitstreamBuilder =
|
||||
static_cast<d3d12_video_bitstream_builder_hevc *>(pD3D12Enc->m_upBitstreamBuilder.get());
|
||||
@@ -1054,14 +1049,14 @@ d3d12_video_encoder_build_codec_headers_hevc(struct d3d12_video_encoder *pD3D12E
|
||||
pWrittenCodecUnitsSizes.push_back(writtenVPSBytesCount);
|
||||
}
|
||||
|
||||
bool writeNewSPS = writeNewVPS // on new VPS written
|
||||
|| ((pD3D12Enc->m_currentEncodeConfig.m_seqFlags & // also on resolution change
|
||||
D3D12_VIDEO_ENCODER_SEQUENCE_CONTROL_FLAG_RESOLUTION_CHANGE) != 0)
|
||||
// Also on input format dirty flag for new SPS, VUI etc
|
||||
|| (pD3D12Enc->m_currentEncodeConfig.m_ConfigDirtyFlags & d3d12_video_encoder_config_dirty_flag_sequence_info);
|
||||
|
||||
size_t writtenSPSBytesCount = 0;
|
||||
if (writeNewSPS) {
|
||||
// For every new SPS for reconfiguration, increase the active_sps_id
|
||||
if (!isFirstFrame) {
|
||||
active_seq_parameter_set_id++;
|
||||
pHEVCBitstreamBuilder->set_active_sps_id(active_seq_parameter_set_id);
|
||||
}
|
||||
|
||||
pHEVCBitstreamBuilder->build_sps(
|
||||
pHEVCBitstreamBuilder->get_latest_vps(),
|
||||
pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificSequenceStateDescH265,
|
||||
@@ -1089,8 +1084,9 @@ d3d12_video_encoder_build_codec_headers_hevc(struct d3d12_video_encoder *pD3D12E
|
||||
writtenPPSBytesCount);
|
||||
|
||||
std::vector<uint8_t>& active_pps = pHEVCBitstreamBuilder->get_active_pps();
|
||||
if ( (writtenPPSBytesCount != active_pps.size()) ||
|
||||
memcmp(pD3D12Enc->m_StagingHeadersBuffer.data(), active_pps.data(), writtenPPSBytesCount)) {
|
||||
if (writeNewSPS ||
|
||||
(writtenPPSBytesCount != active_pps.size()) ||
|
||||
memcmp(pD3D12Enc->m_StagingHeadersBuffer.data(), active_pps.data(), writtenPPSBytesCount)) {
|
||||
active_pps = pD3D12Enc->m_StagingHeadersBuffer;
|
||||
pD3D12Enc->m_BitstreamHeadersBuffer.resize(writtenSPSBytesCount + writtenVPSBytesCount + writtenPPSBytesCount);
|
||||
memcpy(&pD3D12Enc->m_BitstreamHeadersBuffer.data()[(writtenSPSBytesCount + writtenVPSBytesCount)], pD3D12Enc->m_StagingHeadersBuffer.data(), writtenPPSBytesCount);
|
||||
|
Reference in New Issue
Block a user