| // 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[] |
| -- |