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;
|
size_t writtenSPSBytesCount = 0;
|
||||||
if (writeNewSPS) {
|
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,
|
pH264BitstreamBuilder->build_sps(pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificSequenceStateDescH264,
|
||||||
*profDesc.pH264Profile,
|
*profDesc.pH264Profile,
|
||||||
*levelDesc.pH264LevelSetting,
|
*levelDesc.pH264LevelSetting,
|
||||||
@@ -1137,8 +1132,9 @@ d3d12_video_encoder_build_codec_headers_h264(struct d3d12_video_encoder *pD3D12E
|
|||||||
writtenPPSBytesCount);
|
writtenPPSBytesCount);
|
||||||
|
|
||||||
std::vector<uint8_t>& active_pps = pH264BitstreamBuilder->get_active_pps();
|
std::vector<uint8_t>& active_pps = pH264BitstreamBuilder->get_active_pps();
|
||||||
if ( (writtenPPSBytesCount != active_pps.size()) ||
|
if (writeNewSPS ||
|
||||||
memcmp(pD3D12Enc->m_StagingHeadersBuffer.data(), active_pps.data(), writtenPPSBytesCount)) {
|
(writtenPPSBytesCount != active_pps.size()) ||
|
||||||
|
memcmp(pD3D12Enc->m_StagingHeadersBuffer.data(), active_pps.data(), writtenPPSBytesCount)) {
|
||||||
active_pps = pD3D12Enc->m_StagingHeadersBuffer;
|
active_pps = pD3D12Enc->m_StagingHeadersBuffer;
|
||||||
pD3D12Enc->m_BitstreamHeadersBuffer.resize(writtenAUDBytesCount + writtenSPSBytesCount + writtenPPSBytesCount);
|
pD3D12Enc->m_BitstreamHeadersBuffer.resize(writtenAUDBytesCount + writtenSPSBytesCount + writtenPPSBytesCount);
|
||||||
memcpy(&pD3D12Enc->m_BitstreamHeadersBuffer.data()[writtenAUDBytesCount + writtenSPSBytesCount], pD3D12Enc->m_StagingHeadersBuffer.data(), 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();
|
pWrittenCodecUnitsSizes.clear();
|
||||||
bool isFirstFrame = (pD3D12Enc->m_fenceValue == 1);
|
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 =
|
d3d12_video_bitstream_builder_hevc *pHEVCBitstreamBuilder =
|
||||||
static_cast<d3d12_video_bitstream_builder_hevc *>(pD3D12Enc->m_upBitstreamBuilder.get());
|
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);
|
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;
|
size_t writtenSPSBytesCount = 0;
|
||||||
if (writeNewSPS) {
|
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->build_sps(
|
||||||
pHEVCBitstreamBuilder->get_latest_vps(),
|
pHEVCBitstreamBuilder->get_latest_vps(),
|
||||||
pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificSequenceStateDescH265,
|
pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificSequenceStateDescH265,
|
||||||
@@ -1089,8 +1084,9 @@ d3d12_video_encoder_build_codec_headers_hevc(struct d3d12_video_encoder *pD3D12E
|
|||||||
writtenPPSBytesCount);
|
writtenPPSBytesCount);
|
||||||
|
|
||||||
std::vector<uint8_t>& active_pps = pHEVCBitstreamBuilder->get_active_pps();
|
std::vector<uint8_t>& active_pps = pHEVCBitstreamBuilder->get_active_pps();
|
||||||
if ( (writtenPPSBytesCount != active_pps.size()) ||
|
if (writeNewSPS ||
|
||||||
memcmp(pD3D12Enc->m_StagingHeadersBuffer.data(), active_pps.data(), writtenPPSBytesCount)) {
|
(writtenPPSBytesCount != active_pps.size()) ||
|
||||||
|
memcmp(pD3D12Enc->m_StagingHeadersBuffer.data(), active_pps.data(), writtenPPSBytesCount)) {
|
||||||
active_pps = pD3D12Enc->m_StagingHeadersBuffer;
|
active_pps = pD3D12Enc->m_StagingHeadersBuffer;
|
||||||
pD3D12Enc->m_BitstreamHeadersBuffer.resize(writtenSPSBytesCount + writtenVPSBytesCount + writtenPPSBytesCount);
|
pD3D12Enc->m_BitstreamHeadersBuffer.resize(writtenSPSBytesCount + writtenVPSBytesCount + writtenPPSBytesCount);
|
||||||
memcpy(&pD3D12Enc->m_BitstreamHeadersBuffer.data()[(writtenSPSBytesCount + writtenVPSBytesCount)], pD3D12Enc->m_StagingHeadersBuffer.data(), writtenPPSBytesCount);
|
memcpy(&pD3D12Enc->m_BitstreamHeadersBuffer.data()[(writtenSPSBytesCount + writtenVPSBytesCount)], pD3D12Enc->m_StagingHeadersBuffer.data(), writtenPPSBytesCount);
|
||||||
|
Reference in New Issue
Block a user