blob: 8ba6d63229bbbabcedc90e81311ec4707a3d08ec [file] [log] [blame]
// 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.
--