| // Copyright 2018-2021 The Khronos Group Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| [[video-decode-operations]] |
| == Video Decode Operations |
| |
| Before the application can start recording Vulkan command buffers for the |
| Video Decode Operations, it must: do the following, beforehand: |
| |
| . Ensure that the implementation can decode the Video Content by querying |
| the supported codec operations and profiles using |
| flink:vkGetPhysicalDeviceQueueFamilyProperties2. |
| . By using flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR and providing |
| one or more video profiles, choose the Vulkan formats supported by the |
| implementation. |
| The formats for <<decoded-output-picture,output>> and |
| <<reference-picture,reference>> pictures must: be queried and chosen |
| separately. |
| Refer to the section on |
| <<supported-video-input-output-dpb-formats-enumeration,enumeration of |
| supported video formats>>. |
| . Before creating an image to be used as a video picture resource, obtain |
| the supported image creation parameters by querying with |
| flink:vkGetPhysicalDeviceFormatProperties2 and |
| flink:vkGetPhysicalDeviceImageFormatProperties2 using one of the |
| reported formats and adding slink:VkVideoProfilesKHR to the pname:pNext |
| chain of slink:VkFormatProperties2. |
| When querying the parameters with |
| flink:vkGetPhysicalDeviceImageFormatProperties2 for images targeting |
| decoded <<decoded-output-picture,output>> and |
| <<reference-picture,reference (DPB)>> pictures, the |
| slink:VkPhysicalDeviceImageFormatInfo2::pname:usage field should contain |
| ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR and |
| ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR, respectively. |
| . Create none, some, or all of the required <<VkImage,images>> for the |
| <<decoded-output-picture,decoded output>> and |
| <<reference-picture,reference>> pictures. |
| More Video Picture Resources can: be created at some later point if |
| needed while processing the decoded content. |
| Also, if the decoded picture size is expected to change, the images can: |
| be created based on the maximum decoded content size required. |
| . Create the <<video-session,video session>> to be used for video decode |
| operations. |
| Before creating the Decode Video Session, the decode capabilities |
| should: be queried with flink:vkGetPhysicalDeviceVideoCapabilitiesKHR to |
| obtain the limits of the parameters allowed by the implementation for a |
| particular codec profile. |
| . Bind memory resources with the decode video session by calling |
| flink:vkBindVideoSessionMemoryKHR. |
| The video session cannot: be used until memory resources are allocated |
| and bound to it. |
| In order to determine the required memory sizes and heap types of the |
| device memory allocations, flink:vkGetVideoSessionMemoryRequirementsKHR |
| should: be called. |
| . Create one or more <<video-session-parameters-introduction,Session |
| Parameter objects>> for use across command buffer recording operations, |
| if required by the codec extension in use. |
| These objects must: be created against a <<video-session,video session>> |
| with the parameters required by the codec. |
| Each <<video-session-parameters-introduction,Session Parameter object>> |
| created is a child object of the associated <<video-session, Session |
| object>> and cannot: be bound in the command buffer with any other |
| <<video-session,Session Object>>. |
| |
| The recording of Video Decode Commands against a Vulkan command buffer |
| consists of the following sequence: |
| |
| . flink:vkCmdBeginVideoCodingKHR starts the recording of one or more Video |
| Decode operations in the command buffer. |
| For each Video Decode Command operation, a Video Session must: be bound |
| to the command buffer within this command. |
| This command establishes a Vulkan Video Decode Context that consists of |
| the bound Video Session Object, Session Parameters Object, and the |
| required Video Picture Resources. |
| The established Video Decode Context is in effect until the |
| flink:vkCmdEndVideoCodingKHR command is recorded. |
| If more Video Decode operations are to be required after the |
| flink:vkCmdEndVideoCodingKHR command, another Video Decode Context can: |
| be started with the flink:vkCmdBeginVideoCodingKHR command. |
| . flink:vkCmdDecodeVideoKHR specifies one or more compressed data buffers |
| to be decoded. |
| The slink:VkVideoDecodeInfoKHR parameters, and the codec extension |
| structures chained to this, specify the details of the decode operation. |
| . flink:vkCmdControlVideoCodingKHR records operations against the decoded |
| data, decoding device, or the Video Session state. |
| . flink:vkCmdEndVideoCodingKHR signals the end of the recording of the |
| Vulkan Video Decode Context, as established by |
| flink:vkCmdBeginVideoCodingKHR. |
| |
| In addition to the above, the following commands can: be recorded between |
| flink:vkCmdBeginVideoCodingKHR and flink:vkCmdEndVideoCodingKHR: |
| |
| * Query operations |
| * Global Memory Barriers |
| * Buffer Memory Barriers |
| * Image Memory Barriers (these must: be used to transition the Video |
| Picture Resources to the proper |
| ename:VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR and |
| ename:VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR layouts). |
| * Pipeline Barriers |
| * Events |
| * Timestamps |
| * Device Groups (device mask) |
| |
| The following Video Decode related commands must: be recorded *outside* the |
| Vulkan Video Decode Context established with the |
| flink:vkCmdBeginVideoCodingKHR and flink:vkCmdEndVideoCodingKHR commands: |
| |
| * Sparse Memory Binding |
| * Copy Commands |
| * Clear Commands |
| |
| |
| [[video-picture-decode-modes]] |
| === Video Picture Decode Modes |
| |
| There are a few ways that the flink:vkCmdDecodeVideoKHR can be configured |
| for the Video Picture Decode Operations, based on: |
| |
| * if the <<decoded-output-picture, output resource>> would need to be used |
| as <<reference-picture,Reference Picture>> for subsequent decode |
| operations and; |
| * if <<dpb-slot,DPB Slots>> are required for use as |
| <<reference-picture,Reference Pictures>> indexes. |
| |
| [[video-picture-decode-no-reference-picture-no-slot-update]] |
| The most basic Video Picture Decode operation with the |
| flink:vkCmdDecodeVideoKHR command is to output the decoded pixel data |
| without using any DPB <<reference-picture,Reference Pictures>> and without |
| updating any <<dpb-slot,DPB Slot's>> indexes. |
| |
| In this case, the following slink:VkVideoDecodeInfoKHR parameters must: be |
| set: |
| |
| * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding |
| must: be a valid slink:VkImageView. |
| This slink:VkImageView represents the <<decoded-output-picture, output |
| resource>> where the decoded pixels will be populated after a successful |
| decode operation. |
| * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->slotIndex must: |
| be an invalid <<dpb-slot,DPB Slot>> index (-1) since the decoded picture |
| is not intended to be used as a reference picture with subsequent video |
| decode operations. |
| * The value of the slink:VkVideoDecodeInfoKHR::pname:referenceSlotCount |
| can: be `0` and slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots can: |
| be `NULL`. |
| * If slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots is not `NULL`, it |
| can: still have entries representing <<dpb-slot,DPB Slot>> indexes with |
| a <<video-session-dpb-slot-states, Valid Picture Reference>>. |
| The codec extension selects the actual use of the |
| <<reference-picture,Reference Pictures>> by referring to a |
| <<dpb-slot,DPB Slot>> index with a <<video-session-dpb-slot-states, |
| Valid Picture Reference>>. |
| |
| [[video-picture-decode-with-references-no-slot-update]] |
| |
| Video Picture Decode operations with the flink:vkCmdDecodeVideoKHR command, |
| requiring one or more <<reference-picture,Reference Pictures>> for the |
| predictions of the values of samples for the <<decoded-output-picture, |
| decoded output picture>> would require <<dpb-slot,DPB Slots>> with |
| <<video-session-dpb-slot-states, Valid Picture Reference>>. |
| |
| In this case, the following slink:VkVideoDecodeInfoKHR parameters must: be |
| set: |
| |
| * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding |
| must: be a valid slink:VkImageView. |
| This slink:VkImageView represents the <<decoded-output-picture, output |
| resource>> where the decoded pixels will be populated after a successful |
| decode operation. |
| * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->slotIndex must: |
| be an invalid <<dpb-slot,DPB Slot>> index (-1) since the decoded picture |
| is not intended to be used as a reference picture with subsequent video |
| decode operations. |
| * The value of the slink:VkVideoDecodeInfoKHR::pname:referenceSlotCount |
| must: not be `0` and slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots |
| should represent at least the number of the reference slots required for |
| the decode operation. |
| The codec extension selects the actual use of the |
| <<reference-picture,Reference Pictures>> by referring to a |
| <<dpb-slot,DPB Slot>> index with a <<video-session-dpb-slot-states, |
| Valid Picture Reference>>. |
| If the implementation does not use an opaque DPB, each <<dpb-slot,DPB |
| slot>> representing a <<reference-picture,reference picture>> must: |
| refer to a valid <<VkImageView,image view>>. |
| The <<VkImageView,image views>> must: represent the same |
| <<resources-images, image resources>> that were used to create the |
| <<reference-picture,reference picture>> for the corresponding |
| <<dpb-slot,DPB Slot>> index. |
| * slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots can: still have |
| entries representing <<dpb-slot,DPB Slot>> indexes with a |
| <<video-session-dpb-slot-states, Valid Picture Reference>>. |
| |
| After the flink:vkCmdDecodeVideoKHR operation is completed successfully, the |
| slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding |
| pixel data will be updated with the decoded content. |
| The operation will not update any <<dpb-slot,DPB Slot>> with |
| <<reference-picture,Reference Pictures>> data. |
| However, any <<dpb-slot,DPB Slot>> activation, invalidation, or deactivation |
| operations requested via slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots |
| are still going to be performed. |
| |
| image::images/DecodeSessionDpbDecodeWithOutputToVkImageViewNoReferencePictureSlotUpdate.svg[align="center",title="Decoding a Frame to VkImageView without a slot update for a *Reference Picture*",opts="{imageopts}"] |
| |
| |
| [[video-picture-decode-with-reference-picture-and-slot-update]] |
| ==== Video Picture Decode with a <<reference-picture,Reference Picture>> slot update and using optional <<reference-picture,Reference Pictures>> |
| |
| When it is known that the picture to be decoded will be used as a |
| <<reference-picture,reference picture>> for subsequent decode operations, |
| one of the available <<dpb-slot,DPB Slots>> needs to be selected for |
| <<video-session-activating-dpb-slot, activation and update>> operations as |
| part of the flink:vkCmdDecodeVideoKHR command. |
| |
| Based on whether a decode operation |
| <<video-picture-decode-with-references-no-slot-update, with reference |
| pictures>> or <<video-picture-decode-no-reference-picture-no-slot-update, |
| without reference pictures>> is required, the flink:vkCmdDecodeVideoKHR |
| should be configured with parameters as described in the previous sections. |
| In addition, one of the available <<dpb-slot,DPB Slots>> must: be selected |
| by the application, activated with resources and then set-up for an update |
| with the decode operation. |
| |
| In this case, the following slink:VkVideoDecodeInfoKHR parameters must: be |
| set: |
| |
| * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding |
| must: be a valid slink:VkImageView. |
| This slink:VkImageView represents the <<decoded-output-picture, output |
| resource>> where the decoded pixels will be populated after a successful |
| decode operation. |
| If the implementation does not use an opaque DPB, both the |
| <<decoded-output-picture, output>> and <<reference-picture,reference |
| picture>> resource coincide. |
| * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->slotIndex must: |
| be a valid <<dpb-slot,DPB Slot>> index selected by the application, |
| based on the currently available slots. |
| * slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots can: still have |
| entries representing <<dpb-slot,DPB Slot>> indexes with a |
| <<video-session-dpb-slot-states, Valid Picture Reference>>. |
| |
| After the flink:vkCmdDecodeVideoKHR operation has completed successfully, |
| the decoded content will be available in the resource provided for |
| slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding. |
| In addition, this operation will update the selected <<dpb-slot,DPB Slot>> |
| with <<reference-picture,Reference Pictures>> data. |
| Any other <<dpb-slot,DPB Slot>> activation,invalidation, or deactivation |
| operation requested via the |
| slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots are going to be performed |
| as well. |
| |
| image::images/DecodeSessionDpbDecodeWithOutputToReferencePictureSlot.svg[align="center",title="Decoding a Frame to VkImageView with an update to a <<reference-picture,Reference Pictures>> DPB Slot",opts="{imageopts}"] |
| |
| |
| === Video Decode Command Buffer Commands |
| |
| [open,refpage='vkCmdDecodeVideoKHR',desc='Decode a frame',type='protos'] |
| -- |
| To decode a frame, call: |
| |
| include::{generated}/api/protos/vkCmdDecodeVideoKHR.txt[] |
| |
| * pname:commandBuffer is the command buffer to be filled with this |
| function for decode frame command. |
| * pname:pFrameInfo is a pointer to a slink:VkVideoDecodeInfoKHR structure. |
| |
| include::{generated}/validity/protos/vkCmdDecodeVideoKHR.txt[] |
| -- |
| |
| [open,refpage='VkVideoDecodeInfoKHR',desc='Structure specifying parameters of decoding a frame',type='structs'] |
| -- |
| The slink:VkVideoDecodeInfoKHR structure is defined as: |
| |
| include::{generated}/api/structs/VkVideoDecodeInfoKHR.txt[] |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| All the codec specific structures related to each frame(picture |
| parameters, quantization matrix, etc.) must: be chained here and pass to |
| decode session with the function call flink:vkCmdDecodeVideoKHR. |
| * pname:flags is a bitmask of elink:VkVideoDecodeFlagBitsKHR specifying |
| decode flags, reserved for future versions of this specification. |
| * pname:codedOffset is the coded offset of the decode operations. |
| The purpose of this field is interpreted based on the codec extension. |
| ifdef::VK_EXT_video_decode_h264[] |
| When decoding content in H.264 field mode, the pname:codedOffset |
| specifies the line or picture field's offset within the image. |
| endif::VK_EXT_video_decode_h264[] |
| * pname:codedExtent is the coded size of the decode operations. |
| * pname:srcBuffer is the source buffer that holds the encoded bitstream. |
| * pname:srcBufferOffset is the buffer offset where the valid encoded |
| bitstream starts in srcBuffer. |
| It must: meet the alignment requirement |
| pname:minBitstreamBufferOffsetAlignment within |
| slink:VkVideoCapabilitiesKHR queried with the |
| flink:vkGetPhysicalDeviceVideoCapabilitiesKHR function. |
| * pname:srcBufferRange is the size of the srcBuffer with valid encoded |
| bitstream, starting from pname:srcBufferOffset. |
| It must: meet the alignment requirement |
| pname:minBitstreamBufferSizeAlignment within |
| slink:VkVideoCapabilitiesKHR queried with the |
| flink:vkGetPhysicalDeviceVideoCapabilitiesKHR function. |
| * pname:dstPictureResource is the destination |
| <<decoded-output-picture,Decoded Output Picture>> Resource. |
| * pname:pSetupReferenceSlot is `NULL` or a pointer to a |
| slink:VkVideoReferenceSlotKHR structure used for generating a DPB |
| reference slot and Picture Resource. |
| pname:pSetupReferenceSlot->slotIndex specifies the slot index number to |
| use as a target for producing the DPB data. |
| pname:slotIndex must: reference a valid entry as specified in |
| slink:VkVideoBeginCodingInfoKHR via the pname:pReferenceSlots within the |
| flink:vkCmdBeginVideoCodingKHR command that established the Vulkan Video |
| Decode Context for this command. |
| * pname:referenceSlotCount is the number of the DPB Reference Pictures |
| that will be used when this decoding operation is executing. |
| * pname:pReferenceSlots is a pointer to an array of |
| slink:VkVideoReferenceSlotKHR structures specifying the DPB Reference |
| pictures that will be used when this decoding operation is executing. |
| |
| include::{generated}/validity/structs/VkVideoDecodeInfoKHR.txt[] |
| -- |
| |
| [open,refpage='VkVideoDecodeFlagBitsKHR',desc='Video Decode Command Flags',type='enums'] |
| -- |
| The flink:vkCmdDecodeVideoKHR flags are defined with the following |
| enumeration: |
| |
| include::{generated}/api/enums/VkVideoDecodeFlagBitsKHR.txt[] |
| |
| * ename:VK_VIDEO_DECODE_RESERVED_0_BIT_KHR The current version of the |
| specification has reserved this value for future use. |
| -- |
| |
| [open,refpage='VkVideoDecodeFlagsKHR',desc='Bitmask specifying the video decode flink:vkCmdDecodeVideoKHR flags',type='flags'] |
| -- |
| include::{generated}/api/flags/VkVideoDecodeFlagsKHR.txt[] |
| |
| tlink:VkVideoDecodeFlagsKHR is a bitmask type for setting a mask of zero or |
| more elink:VkVideoDecodeFlagBitsKHR. |
| -- |