blob: 7adb51d6ad830d708f61a1c9700145dd28ce8d92 [file] [log] [blame]
// Copyright 2018-2021 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0
[[decode-h264]]
== Video Decode of AVC (ITU-T H.264)
This extension adds H.264 codec specific structures needed for decode
session to execute decode jobs which include H.264 sequence header, picture
parameter header and quantization matrix etc.
Unless otherwise noted, all references to the H.264 specification are to the
2010 edition published by the ITU-T, dated March 2010.
This specification is available at http://www.itu.int/rec/T-REC-H.264.
=== H.264 decode profile
A H.264 decode profile is specified using slink:VkVideoDecodeH264ProfileEXT
chained to slink:VkVideoProfileKHR when the codec-operation in
slink:VkVideoProfileKHR is
ename:VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT.
[open,refpage='VkVideoDecodeH264ProfileEXT',desc='Structure specifying H.264 decode profile',type='structs']
--
The sname:VkVideoDecodeH264ProfileEXT structure is defined as:
include::{generated}/api/structs/VkVideoDecodeH264ProfileEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:stdProfileIdc is a code:StdVideoH264ProfileIdc value specifying
the H.264 codec profile IDC
* pname:pictureLayout is a bitmask of
elink:VkVideoDecodeH264PictureLayoutFlagBitsEXT specifying the layout of
the decoded picture's contents depending on the nature (progressive vs.
interlaced) of the input content.
[NOTE]
.Note
====
When passing sname:VkVideoDecodeH264ProfileEXT to
flink:vkCreateVideoSessionKHR in the pname:pNext chain of
slink:VkVideoSessionCreateInfoKHR, requests for a pname:pictureLayout not
supported by the implementation will result in failure of the command.
====
.Valid Usage
****
* [[VUID-VkVideoDecodeH264ProfileEXT-pNext-06259]]
If the slink:VkVideoDecodeH264ProfileEXT structure is included in the
pname:pNext chain of the slink:VkVideoCapabilitiesKHR structure passed
to flink:vkGetPhysicalDeviceVideoCapabilitiesKHR, the value in
pname:pictureLayout is treated as a bitmask of requested picture
layouts.
It is always valid to use the value
ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT as the
implementation is guaranteed to support decoding of progressive content.
* [[VUID-VkVideoDecodeH264ProfileEXT-pNext-06260]]
If the slink:VkVideoDecodeH264ProfileEXT structure is included in the
pname:pNext chain of the slink:VkVideoSessionCreateInfoKHR structure
passed to flink:vkCreateVideoSessionKHR, the value in
pname:pictureLayout must: be exactly one of
ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT,
ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT
or
ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT.
****
include::{generated}/validity/structs/VkVideoDecodeH264ProfileEXT.txt[]
--
[open,refpage='VkVideoDecodeH264PictureLayoutFlagsEXT',desc='Bitmask of VkVideoDecodeH264PictureLayoutFlagBitsEXT',type='flags']
--
include::{generated}/api/flags/VkVideoDecodeH264PictureLayoutFlagsEXT.txt[]
tname:VkVideoDecodeH264PictureLayoutFlagsEXT is a bitmask type for setting a
mask of zero or more elink:VkVideoDecodeH264PictureLayoutFlagBitsEXT.
--
[open,refpage='VkVideoDecodeH264PictureLayoutFlagBitsEXT',desc='H.264 video decode picture layout flags',type='enums']
--
The H.264 video decode picture layout flags are defined with the following
enum:
include::{generated}/api/enums/VkVideoDecodeH264PictureLayoutFlagBitsEXT.txt[]
* ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT specifies
support for progressive content.
This flag has the value `0`.
* ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT
specifies support for or use of a picture layout for interlaced content
where all lines belonging to the first field are decoded to the
even-numbered lines within the picture resource, and all lines belonging
to the second field are decoded to the odd-numbered lines within the
picture resource.
* ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT
specifies support for or use of a picture layout for interlaced content
where all lines belonging to the first field are grouped together in a
single plane, followed by another plane containing all lines belonging
to the second field.
--
=== Selecting a H.264 decode profile
When using flink:vkGetPhysicalDeviceVideoCapabilitiesKHR to query the
capabilities for the input pname:pVideoProfile with
pname:videoCodecOperation specified as
ename:VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT, a
slink:VkVideoDecodeH264ProfileEXT structure must: be chained to
slink:VkVideoProfileKHR to select a H.264 decode profile.
If supported, the implementation returns the capabilities associated with
the specified H.264 decode profile.
The requirement is similar when querying supported image formats using
flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR.
A supported H.264 decode profile must: be selected when creating a video
session by chaining slink:VkVideoDecodeH264ProfileEXT to the
slink:VkVideoProfileKHR field of slink:VkVideoSessionCreateInfoKHR.
=== Capabilities
[open,refpage='VkVideoDecodeH264CapabilitiesEXT',desc='Structure specifying H.264 decode capabilities',type='structs']
--
When using flink:vkGetPhysicalDeviceVideoCapabilitiesKHR to query the
capabilities for the input pname:pVideoProfile with
pname:videoCodecOperation specified as
ename:VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT, a
slink:VkVideoDecodeH264CapabilitiesEXT structure must: be chained to
slink:VkVideoCapabilitiesKHR to get this H.264 decode profile specific
capabilities.
The slink:VkVideoDecodeH264CapabilitiesEXT structure is defined as:
include::{generated}/api/structs/VkVideoDecodeH264CapabilitiesEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:maxLevel is the maximum H.264 level supported by the device.
* pname:fieldOffsetGranularity - if Interlaced Video Content is suported,
the maximum field offset granularity supported for the picture resource.
* pname:stdExtensionVersion is a slink:VkExtensionProperties structure
specifying the H.264 extension name and version supported by this
implementation.
include::{generated}/validity/structs/VkVideoDecodeH264CapabilitiesEXT.txt[]
--
=== Create Information
[open,refpage='VkVideoDecodeH264SessionCreateInfoEXT',desc='Structure specifies H.264 decode session creation parameters',type='structs']
--
A slink:VkVideoDecodeH264SessionCreateInfoEXT structure can: be chained to
slink:VkVideoSessionCreateInfoKHR when the function
flink:vkCreateVideoSessionKHR is called to create a video session for H.264
decode.
The slink:VkVideoDecodeH264SessionCreateInfoEXT structure is defined as:
include::{generated}/api/structs/VkVideoDecodeH264SessionCreateInfoEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:flags is reserved for future use.
* pname:pStdExtensionVersion is a pointer to a slink:VkExtensionProperties
structure specifying the H.264 codec extensions defined in
code:StdVideoH264Extensions.
include::{generated}/validity/structs/VkVideoDecodeH264SessionCreateInfoEXT.txt[]
--
[open,refpage='VkVideoDecodeH264CreateFlagsEXT',desc='Reserved for future use',type='flags']
--
include::{generated}/api/flags/VkVideoDecodeH264CreateFlagsEXT.txt[]
tname:VkVideoDecodeH264CreateFlagsEXT is a bitmask type for setting a mask,
but is currently reserved for future use.
--
=== Decoder Parameter Sets
To reduce parameter traffic during decoding, the decoder parameter set
object supports storing H.264 SPS/PPS parameter sets that may: be later
referenced during decoding.
[open,refpage='VkVideoDecodeH264SessionParametersCreateInfoEXT',desc='Structure specifies H.264 decoder parameter set information',type='structs']
--
A slink:VkVideoDecodeH264SessionParametersCreateInfoEXT structure holding
one H.264 SPS and at least one H.264 PPS paramater set must: be chained to
slink:VkVideoSessionParametersCreateInfoKHR when calling
flink:vkCreateVideoSessionParametersKHR to store these parameter set(s) with
the decoder parameter set object for later reference.
The provided H.264 SPS/PPS parameters must: be within the limits specified
during decoder creation for the decoder specified in
slink:VkVideoSessionParametersCreateInfoKHR.
The slink:VkVideoDecodeH264SessionParametersCreateInfoEXT structure is
defined as:
include::{generated}/api/structs/VkVideoDecodeH264SessionParametersCreateInfoEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:maxSpsStdCount is the maximum number of SPS parameters that the
sname:VkVideoSessionParametersKHR can contain.
* pname:maxPpsStdCount is the maximum number of PPS parameters that the
sname:VkVideoSessionParametersKHR can contain.
* pname:pParametersAddInfo is `NULL` or a pointer to a
slink:VkVideoDecodeH264SessionParametersAddInfoEXT structure specifying
H.264 parameters to add upon object creation.
include::{generated}/validity/structs/VkVideoDecodeH264SessionParametersCreateInfoEXT.txt[]
--
[open,refpage='VkVideoDecodeH264SessionParametersAddInfoEXT',desc='Structure specifies H.264 decoder parameter set information',type='structs']
--
include::{generated}/api/structs/VkVideoDecodeH264SessionParametersAddInfoEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:spsStdCount is the number of SPS elements in pname:pSpsStd.
Its value must: be less than or equal to the value of
pname:maxSpsStdCount.
* pname:pSpsStd is a pointer to an array of
code:StdVideoH264SequenceParameterSet structures representing H.264
sequence parameter sets.
Each element of the array must: have a unique H.264 SPS ID.
* pname:ppsStdCount is the number of PPS provided in pname:pPpsStd.
Its value must: be less than or equal to the value of
pname:maxPpsStdCount.
* pname:pPpsStd is a pointer to an array of
code:StdVideoH264PictureParameterSet structures representing H.264
picture parameter sets.
Each element of the array must: have a unique H.264 SPS-PPS ID pair.
.Valid Usage
****
* [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-spsStdCount-04822]]
The values of pname:spsStdCount and pname:ppsStdCount must: be less than
or equal to the values of pname:maxSpsStdCount and pname:maxPpsStdCount,
respectively
* [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-maxSpsStdCount-04823]]
When the pname:maxSpsStdCount number of parameters of type
StdVideoH264SequenceParameterSet in the Video Session Parameters object
is reached, no additional parameters of that type can be added to this
object.
ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
to add additional data to this object at this point
* [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-maxPpsStdCount-04824]]
When the pname:maxPpsStdCount number of parameters of type
StdVideoH264PictureParameterSet in the Video Session Parameters object
is reached, no additional parameters of that type can be added to this
object.
ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
to add additional data to this object at this point
* [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04825]]
Each entry to be added must: have a unique, to the rest of the parameter
array entries and the existing parameters in the Video Session
Parameters Object that is being updated, SPS-PPS IDs
* [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04826]]
Parameter entries that already exist in Video Session Parameters object
with a particular SPS-PPS IDs cannot: be replaced nor updated
* [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04827]]
When creating a new object using a Video Session Parameters as a
template, the array's parameters with the same SPS-PPS IDs as the ones
from the template take precedence
* [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04828]]
SPS/PPS parameters must: comply with the limits specified in
slink:VkVideoSessionCreateInfoKHR during Video Session creation
****
include::{generated}/validity/structs/VkVideoDecodeH264SessionParametersAddInfoEXT.txt[]
--
=== Picture Decoding
To decode a picture, the structure slink:VkVideoDecodeH264PictureInfoEXT
may: be chained to slink:VkVideoDecodeInfoKHR when calling
flink:vkCmdDecodeVideoKHR.
[open,refpage='VkVideoDecodeH264PictureInfoEXT',desc='Structure specifies H.264 decode picture parameters when decoding a picture',type='structs']
--
The structure slink:VkVideoDecodeH264PictureInfoEXT representing a picture
decode operation is defined as:
include::{generated}/api/structs/VkVideoDecodeH264PictureInfoEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:pStdPictureInfo is a pointer to a
code:StdVideoDecodeH264PictureInfo structure specifying the codec
standard specific picture information from the H.264 specification.
* pname:slicesCount is the number of slices in this picture.
* pname:pSlicesDataOffsets is a pointer to an array of pname:slicesCount
offsets indicating the start offset of each slice within the bitstream
buffer.
include::{generated}/validity/structs/VkVideoDecodeH264PictureInfoEXT.txt[]
--
[open,refpage='VkVideoDecodeH264DpbSlotInfoEXT',desc='Structure specifies H.264 decode DPB picture information',type='structs']
--
The slink:VkVideoDecodeH264DpbSlotInfoEXT structure correlates a DPB Slot
index with codec-specific information and is defined as:
include::{generated}/api/structs/VkVideoDecodeH264DpbSlotInfoEXT.txt[]
* pname:sType is the type of this structure.
* pname:pStdReferenceInfo is a pointer to a
code:StdVideoDecodeH264ReferenceInfo structure specifying the codec
standard specific picture reference information from the H.264
specification.
include::{generated}/validity/structs/VkVideoDecodeH264DpbSlotInfoEXT.txt[]
--
[open,refpage='VkVideoDecodeH264MvcEXT',desc='Structure specifies parameters of mvc views',type='structs']
--
The slink:VkVideoDecodeH264MvcEXT structure is defined as:
include::{generated}/api/structs/VkVideoDecodeH264MvcEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to a structure extending this
structure.
* pname:pStdMvc is a pointer to a code:StdVideoDecodeH264Mvc structure
specifying H.264 codec specification information for MVC.
When the content type is H.264 MVC, a slink:VkVideoDecodeH264MvcEXT
structure must: be chained to slink:VkVideoDecodeH264PictureInfoEXT.
include::{generated}/validity/structs/VkVideoDecodeH264MvcEXT.txt[]
--