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