Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 5 additions & 7 deletions vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1916,9 +1916,10 @@ VkResult VkVideoEncoder::RecordVideoCodingCmd(VkSharedBaseObj<VkVideoEncodeFrame
encodeFrameInfo->controlCmd};
vkDevCtx->CmdControlVideoCodingKHR(cmdBuf, &renderControlInfo);

assert(encodeFrameInfo->pControlCmdChain);

m_beginRateControlInfo = *(VkVideoEncodeRateControlInfoKHR*)encodeFrameInfo->pControlCmdChain;
Comment thread
dabrain34 marked this conversation as resolved.
// Do not walk the chain, otherwise we end up creating a loop here.
m_beginRateControlInfo.pNext = NULL;
const_cast<VkBaseInStructure*>(static_cast<const VkBaseInStructure*>(m_beginRateControlInfo.pNext))->pNext = NULL;
}

if (m_videoMaintenance1FeaturesSupported)
Expand All @@ -1929,13 +1930,10 @@ VkResult VkVideoEncoder::RecordVideoCodingCmd(VkSharedBaseObj<VkVideoEncodeFrame
videoInlineQueryInfoKHR.queryPool = queryPool;
videoInlineQueryInfoKHR.firstQuery = querySlotId;
videoInlineQueryInfoKHR.queryCount = numQuerySamples;
VkBaseInStructure* pStruct = (VkBaseInStructure*)&encodeFrameInfo->encodeInfo;
vk::ChainNextVkStruct(*pStruct, videoInlineQueryInfoKHR);

vkDevCtx->CmdEncodeVideoKHR(cmdBuf, &encodeFrameInfo->encodeInfo);
vk::ChainNextVkStruct(encodeFrameInfo->encodeInfo, videoInlineQueryInfoKHR);

// Remove the stack pointer from the chain, causes a use after free otherwise in GetEncodeFrameInfoH264
encodeFrameInfo->encodeInfo.pNext = videoInlineQueryInfoKHR.pNext;
vkDevCtx->CmdEncodeVideoKHR(cmdBuf, &encodeFrameInfo->encodeInfo);
}
else
{
Expand Down
8 changes: 3 additions & 5 deletions vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,7 @@ class VkVideoEncoder : public VkVideoRefCountBase {

struct VkVideoEncodeFrameInfo : public VkVideoRefCountBase
{
VkStructureType GetType() {
return (encodeInfo.pNext == nullptr) ?
VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR : reinterpret_cast<const VkBaseInStructure*>(encodeInfo.pNext)->sType;
}
virtual VkVideoCodecOperationFlagBitsKHR GetCodecType() const = 0;

VkVideoEncodeFrameInfo(const void* pNext = nullptr)
: encodeInfo{ VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR, pNext}
Expand Down Expand Up @@ -253,7 +250,8 @@ class VkVideoEncoder : public VkVideoRefCountBase {
virtual void Reset(bool releaseResources = true) {
// Clear and check state
assert(encodeInfo.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR);
assert(encodeInfo.pNext != nullptr);

encodeInfo.pNext = nullptr;

if ((frameInputOrderNum == (uint64_t)-1) &&
(frameEncodeInputOrderNum == (uint64_t)-1) &&
Expand Down
12 changes: 10 additions & 2 deletions vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoderAV1.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ class VkVideoEncoderAV1 : public VkVideoEncoder
VkVideoEncodeAV1RateControlInfoKHR rateControlInfoAV1;
VkVideoEncodeAV1RateControlLayerInfoKHR rateControlLayersInfoAV1[1];

VkVideoCodecOperationFlagBitsKHR GetCodecType() const override {
return VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR;
}

VkVideoEncodeFrameInfoAV1()
: VkVideoEncodeFrameInfo(&pictureInfo)
, pictureInfo{ VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR }
Expand All @@ -69,12 +73,16 @@ class VkVideoEncoderAV1 : public VkVideoEncoder
pictureInfo.pStdPictureInfo = &stdPictureInfo;
}

virtual void Reset(bool releaseResources = true) {
virtual void Reset(bool releaseResources = true) override {

pictureInfo.pNext = nullptr;

// Reset the base first
VkVideoEncodeFrameInfo::Reset(releaseResources);

// After resetting the base structure parameters, start building the pNext chain again
assert(pictureInfo.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR);
encodeInfo.pNext = &pictureInfo;
Comment thread
srinathkr-nv marked this conversation as resolved.
}

virtual ~VkVideoEncodeFrameInfoAV1() {
Expand Down Expand Up @@ -184,7 +192,7 @@ class VkVideoEncoderAV1 : public VkVideoEncoder

private:
VkVideoEncodeFrameInfoAV1* GetEncodeFrameInfoAV1(VkSharedBaseObj<VkVideoEncodeFrameInfo>& encodeFrameInfo) {
assert(VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR == encodeFrameInfo->GetType());
assert(VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR == encodeFrameInfo->GetCodecType());
VkVideoEncodeFrameInfo* pEncodeFrameInfo = encodeFrameInfo;
return (VkVideoEncodeFrameInfoAV1*)pEncodeFrameInfo;
}
Expand Down
11 changes: 9 additions & 2 deletions vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoderH264.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ class VkVideoEncoderH264 : public VkVideoEncoder {
StdVideoEncodeH264RefListModEntry refList1ModOperations[MAX_REFFERENCES];
StdVideoEncodeH264RefPicMarkingEntry refPicMarkingEntry[MAX_MEM_MGMNT_CTRL_OPS_COMMANDS];

VkVideoCodecOperationFlagBitsKHR GetCodecType() const override {
return VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR;
}

VkVideoEncodeFrameInfoH264()
: VkVideoEncodeFrameInfo(&pictureInfo)
, pictureInfo { VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PICTURE_INFO_KHR }
Expand Down Expand Up @@ -81,13 +85,16 @@ class VkVideoEncoderH264 : public VkVideoEncoder {
stdDpbSlotInfo->pStdReferenceInfo = stdReferenceInfo;
};

virtual void Reset(bool releaseResources = true) {
virtual void Reset(bool releaseResources = true) override {

pictureInfo.pNext = nullptr;

// Reset the base first
VkVideoEncodeFrameInfo::Reset(releaseResources);

// After resetting the base structure parameters, start building the pNext chain again
encodeInfo.pNext = &pictureInfo;

// Clear and check state
assert(pictureInfo.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PICTURE_INFO_KHR);
assert(naluSliceInfo[0].sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_INFO_KHR);
Expand Down Expand Up @@ -153,7 +160,7 @@ class VkVideoEncoderH264 : public VkVideoEncoder {
private:

VkVideoEncodeFrameInfoH264* GetEncodeFrameInfoH264(VkSharedBaseObj<VkVideoEncodeFrameInfo>& encodeFrameInfo) {
assert(VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PICTURE_INFO_KHR == encodeFrameInfo->GetType());
assert(VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR == encodeFrameInfo->GetCodecType());
VkVideoEncodeFrameInfo* pEncodeFrameInfo = encodeFrameInfo;
return (VkVideoEncodeFrameInfoH264*)pEncodeFrameInfo;
}
Expand Down
11 changes: 9 additions & 2 deletions vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoderH265.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ class VkVideoEncoderH265 : public VkVideoEncoder {
StdVideoEncodeH265ReferenceInfo stdReferenceInfo[MAX_REFFERENCES];
VkVideoEncodeH265DpbSlotInfoKHR stdDpbSlotInfo[MAX_REFFERENCES];

VkVideoCodecOperationFlagBitsKHR GetCodecType() const override {
return VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR;
}

VkVideoEncodeFrameInfoH265()
: VkVideoEncodeFrameInfo(&pictureInfo)
, pictureInfo { VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PICTURE_INFO_KHR }
Expand Down Expand Up @@ -80,13 +84,16 @@ class VkVideoEncoderH265 : public VkVideoEncoder {
stdDpbSlotInfo->pStdReferenceInfo = stdReferenceInfo;
};

virtual void Reset(bool releaseResources = true) {
virtual void Reset(bool releaseResources = true) override {

pictureInfo.pNext = nullptr;

// Reset the base first
VkVideoEncodeFrameInfo::Reset(releaseResources);

// After resetting the base structure parameters, start building the pNext chain again
encodeInfo.pNext = &pictureInfo;

// Clear and check state
assert(pictureInfo.sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PICTURE_INFO_KHR);
assert(naluSliceSegmentInfo[0].sType == VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_KHR);
Expand Down Expand Up @@ -148,7 +155,7 @@ class VkVideoEncoderH265 : public VkVideoEncoder {
private:

VkVideoEncodeFrameInfoH265* GetEncodeFrameInfoH265(VkSharedBaseObj<VkVideoEncodeFrameInfo>& encodeFrameInfo) {
assert(VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PICTURE_INFO_KHR == encodeFrameInfo->GetType());
assert(VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR == encodeFrameInfo->GetCodecType());
VkVideoEncodeFrameInfo* pEncodeFrameInfo = encodeFrameInfo;
return (VkVideoEncodeFrameInfoH265*)pEncodeFrameInfo;
}
Expand Down
Loading