Skip to content

Commit 44f1d05

Browse files
krajunvzlatinski
authored andcommitted
decode: Include pSetupReferenceSlot in the VkVideoBeginCodingInfoKHR
Include pSetupReferenceSlot in the VkVideoBeginCodingInfoKHR::pReferenceSlots list when it is not null.
1 parent 0c2cd41 commit 44f1d05

File tree

2 files changed

+48
-26
lines changed

2 files changed

+48
-26
lines changed

vk_video_decoder/libs/VkVideoDecoder/VkVideoDecoder.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -937,8 +937,12 @@ int VkVideoDecoder::DecodePictureWithParameters(VkParserPerFrameDecodeParameters
937937
}
938938
}
939939

940-
decodeBeginInfo.referenceSlotCount = pCurrFrameDecParams->decodeFrameInfo.referenceSlotCount;
941-
decodeBeginInfo.pReferenceSlots = pCurrFrameDecParams->decodeFrameInfo.pReferenceSlots;
940+
// Add setup reference slot details to decodeBeginInfo
941+
decodeBeginInfo.referenceSlotCount = pCurrFrameDecParams->decodeFrameInfo.referenceSlotCount +
942+
(pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot ? 1 : 0);
943+
decodeBeginInfo.pReferenceSlots = (pCurrFrameDecParams->decodeFrameInfo.referenceSlotCount > 0) ?
944+
pCurrFrameDecParams->decodeFrameInfo.pReferenceSlots :
945+
pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot;
942946

943947
m_imageSpecsIndex.displayOut = ((m_dpbAndOutputCoincide == VK_TRUE) &&
944948
!(pDecodePictureInfo->flags.applyFilmGrain == VK_TRUE)) ?

vk_video_decoder/libs/VkVideoParser/VulkanVideoParser.cpp

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2279,11 +2279,6 @@ bool VulkanVideoParser::DecodePicture(
22792279
h264.stdPictureInfo.flags, &setupReferenceSlot.slotIndex);
22802280
// TODO: Remove it is for debugging only. Reserved fields must be set to "0".
22812281
pout->stdPictureInfo.reserved1 = pCurrFrameDecParams->numGopReferenceSlots;
2282-
assert(!pd->ref_pic_flag || (setupReferenceSlot.slotIndex >= 0));
2283-
if (setupReferenceSlot.slotIndex >= 0) {
2284-
setupReferenceSlot.pPictureResource = &pCurrFrameDecParams->dpbSetupPictureResource;
2285-
pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot = &setupReferenceSlot;
2286-
}
22872282
if (pCurrFrameDecParams->numGopReferenceSlots) {
22882283
assert(pCurrFrameDecParams->numGopReferenceSlots <= (int32_t)MAX_DPB_REF_SLOTS);
22892284
for (uint32_t dpbEntryIdx = 0; dpbEntryIdx < (uint32_t)pCurrFrameDecParams->numGopReferenceSlots;
@@ -2299,6 +2294,15 @@ bool VulkanVideoParser::DecodePicture(
22992294
pCurrFrameDecParams->decodeFrameInfo.pReferenceSlots = NULL;
23002295
pCurrFrameDecParams->decodeFrameInfo.referenceSlotCount = 0;
23012296
}
2297+
assert(!pd->ref_pic_flag || (setupReferenceSlot.slotIndex >= 0));
2298+
if (setupReferenceSlot.slotIndex >= 0) {
2299+
setupReferenceSlot.pPictureResource = &pCurrFrameDecParams->dpbSetupPictureResource;
2300+
pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot = &setupReferenceSlot;
2301+
2302+
// add the setup slot to the end of referenceSlots
2303+
assert((uint32_t)pCurrFrameDecParams->numGopReferenceSlots < MAX_DPB_REF_AND_SETUP_SLOTS);
2304+
referenceSlots[pCurrFrameDecParams->numGopReferenceSlots] = setupReferenceSlot;
2305+
}
23022306

23032307
}
23042308
else if (m_codecType == VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR) {
@@ -2388,11 +2392,6 @@ bool VulkanVideoParser::DecodePicture(
23882392
referenceSlots, pCurrFrameDecParams->pGopReferenceImagesIndexes,
23892393
&setupReferenceSlot.slotIndex);
23902394

2391-
assert(!pd->ref_pic_flag || (setupReferenceSlot.slotIndex >= 0));
2392-
if (setupReferenceSlot.slotIndex >= 0) {
2393-
setupReferenceSlot.pPictureResource = &pCurrFrameDecParams->dpbSetupPictureResource;
2394-
pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot = &setupReferenceSlot;
2395-
}
23962395

23972396
if (pCurrFrameDecParams->numGopReferenceSlots) {
23982397
assert(pCurrFrameDecParams->numGopReferenceSlots <= (int32_t)MAX_DPB_REF_SLOTS);
@@ -2410,6 +2409,16 @@ bool VulkanVideoParser::DecodePicture(
24102409
pCurrFrameDecParams->decodeFrameInfo.referenceSlotCount = 0;
24112410
}
24122411

2412+
assert(!pd->ref_pic_flag || (setupReferenceSlot.slotIndex >= 0));
2413+
if (setupReferenceSlot.slotIndex >= 0) {
2414+
setupReferenceSlot.pPictureResource = &pCurrFrameDecParams->dpbSetupPictureResource;
2415+
pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot = &setupReferenceSlot;
2416+
2417+
// add the setup slot to the end of referenceSlots
2418+
assert((uint32_t)pCurrFrameDecParams->numGopReferenceSlots < MAX_DPB_REF_AND_SETUP_SLOTS);
2419+
referenceSlots[pCurrFrameDecParams->numGopReferenceSlots] = setupReferenceSlot;
2420+
}
2421+
24132422
if (m_dumpParserData) {
24142423
for (int32_t i = 0; i < HEVC_MAX_DPB_SLOTS; i++) {
24152424
std::cout << "\tdpbIndex: " << i;
@@ -2462,12 +2471,6 @@ bool VulkanVideoParser::DecodePicture(
24622471
pCurrFrameDecParams->pGopReferenceImagesIndexes,
24632472
&setupReferenceSlot.slotIndex);
24642473

2465-
assert(!pd->ref_pic_flag || (setupReferenceSlot.slotIndex >= 0));
2466-
if (setupReferenceSlot.slotIndex >= 0) {
2467-
setupReferenceSlot.pPictureResource = &pCurrFrameDecParams->dpbSetupPictureResource;
2468-
pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot = &setupReferenceSlot;
2469-
}
2470-
24712474
if (pCurrFrameDecParams->numGopReferenceSlots) {
24722475
assert(pCurrFrameDecParams->numGopReferenceSlots <= (int32_t)MAX_DPB_REF_SLOTS);
24732476
for (uint32_t dpbEntryIdx = 0; dpbEntryIdx < (uint32_t)pCurrFrameDecParams->numGopReferenceSlots;
@@ -2483,6 +2486,17 @@ bool VulkanVideoParser::DecodePicture(
24832486
pCurrFrameDecParams->decodeFrameInfo.referenceSlotCount = 0;
24842487
}
24852488

2489+
2490+
assert(!pd->ref_pic_flag || (setupReferenceSlot.slotIndex >= 0));
2491+
if (setupReferenceSlot.slotIndex >= 0) {
2492+
setupReferenceSlot.pPictureResource = &pCurrFrameDecParams->dpbSetupPictureResource;
2493+
pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot = &setupReferenceSlot;
2494+
2495+
// add the setup slot to the end of referenceSlots
2496+
assert((uint32_t)pCurrFrameDecParams->numGopReferenceSlots < MAX_DPB_REF_AND_SETUP_SLOTS);
2497+
referenceSlots[pCurrFrameDecParams->numGopReferenceSlots] = setupReferenceSlot;
2498+
}
2499+
24862500
// @review: this field seems only useful for debug display, but since AV1 needs a dword, should probably change the interface.
24872501
//pDecodePictureInfo->videoFrameType = static_cast<uint16_t>(pin->frame_type);
24882502
pDecodePictureInfo->viewId = 0; // @review: Doesn't seem to be used in Vulkan?
@@ -2562,14 +2576,6 @@ bool VulkanVideoParser::DecodePicture(
25622576
pCurrFrameDecParams->pGopReferenceImagesIndexes,
25632577
&setupReferenceSlot.slotIndex);
25642578

2565-
assert(!pd->ref_pic_flag || (setupReferenceSlot.slotIndex >= 0));
2566-
if (setupReferenceSlot.slotIndex >= 0) {
2567-
pCurrFrameDecParams->dpbSetupPictureResource.codedExtent.width = pin->FrameWidth;
2568-
pCurrFrameDecParams->dpbSetupPictureResource.codedExtent.height = pin->FrameHeight;
2569-
setupReferenceSlot.pPictureResource = &pCurrFrameDecParams->dpbSetupPictureResource;
2570-
pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot = &setupReferenceSlot;
2571-
}
2572-
25732579
if (pCurrFrameDecParams->numGopReferenceSlots) {
25742580
assert(pCurrFrameDecParams->numGopReferenceSlots <= (int32_t)MAX_DPB_REF_SLOTS);
25752581
for (uint32_t dpbEntryIdx = 0; dpbEntryIdx < (uint32_t)pCurrFrameDecParams->numGopReferenceSlots;
@@ -2586,6 +2592,18 @@ bool VulkanVideoParser::DecodePicture(
25862592
pCurrFrameDecParams->decodeFrameInfo.referenceSlotCount = 0;
25872593
}
25882594

2595+
assert(!pd->ref_pic_flag || (setupReferenceSlot.slotIndex >= 0));
2596+
if (setupReferenceSlot.slotIndex >= 0) {
2597+
pCurrFrameDecParams->dpbSetupPictureResource.codedExtent.width = pin->FrameWidth;
2598+
pCurrFrameDecParams->dpbSetupPictureResource.codedExtent.height = pin->FrameHeight;
2599+
setupReferenceSlot.pPictureResource = &pCurrFrameDecParams->dpbSetupPictureResource;
2600+
pCurrFrameDecParams->decodeFrameInfo.pSetupReferenceSlot = &setupReferenceSlot;
2601+
2602+
// add the setup slot to the end of referenceSlots
2603+
assert((uint32_t)pCurrFrameDecParams->numGopReferenceSlots < MAX_DPB_REF_AND_SETUP_SLOTS);
2604+
referenceSlots[pCurrFrameDecParams->numGopReferenceSlots] = setupReferenceSlot;
2605+
}
2606+
25892607
// @review: this field seems only useful for debug display, but since AV1 needs a dword, should probably change the interface.
25902608
//pDecodePictureInfo->videoFrameType = static_cast<uint16_t>(pin->frame_type);
25912609
pDecodePictureInfo->viewId = 0; // @review: Doesn't seem to be used in Vulkan?

0 commit comments

Comments
 (0)