// Copyright 2018-2021 The Khronos Group Inc. // // SPDX-License-Identifier: CC-BY-4.0 [[encode-h265]] == Encode H.265 This extension adds H.265 codec-specific structures/types needed to support H.265 video encoding. Unless otherwise noted, all references to the H.265 specification are to the 2013 edition published by the ITU-T, dated April 2013. This specification is available at http://www.itu.int/rec/T-REC-H.265. === H.265 encode profile An H.265 encode profile is specified by including the slink:VkVideoEncodeH265ProfileEXT structure in the pname:pNext chain of the slink:VkVideoProfileKHR structure when slink:VkVideoProfileKHR::pname:videoCodecOperation is ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT. [open,refpage='VkVideoEncodeH265ProfileEXT',desc='Structure specifying H.265 encode profile',type='structs'] -- The sname:VkVideoEncodeH265ProfileEXT structure is defined as: include::{generated}/api/structs/VkVideoEncodeH265ProfileEXT.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:StdVideoH265ProfileIdc value specifying the H.265 codec profile IDC. include::{generated}/validity/structs/VkVideoEncodeH265ProfileEXT.txt[] -- === Capabilities [open,refpage='VkVideoEncodeH265CapabilitiesEXT',desc='Structure specifying H.265 encode capabilities',type='structs'] -- When calling flink:vkGetPhysicalDeviceVideoCapabilitiesKHR with pname:pVideoProfile->videoCodecOperation specified as ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT, the slink:VkVideoEncodeH265CapabilitiesEXT structure must: be included in the pname:pNext chain of the slink:VkVideoCapabilitiesKHR structure to retrieve H.265-specific capabilities for video encoding. The sname:VkVideoEncodeH265CapabilitiesEXT structure is defined as: include::{generated}/api/structs/VkVideoEncodeH265CapabilitiesEXT.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:inputModeFlags is a bitmask of elink:VkVideoEncodeH265InputModeFlagBitsEXT describing the command buffer input granularities/modes supported by the implementation. * pname:outputModeFlags is a bitmask of elink:VkVideoEncodeH265OutputModeFlagBitsEXT describing the output (bitstream size reporting) granularities/modes supported by the implementation. * pname:ctbSizes is a bitmask of elink:VkVideoEncodeH265CtbSizeFlagBitsEXT describing the supported CTB sizes. * pname:inputImageDataAlignment reports the alignment, in pixels, for the width and height of the picture data within the images used in video encoding. * pname:maxNumL0ReferenceForP reports the maximum number of reference pictures the implementation supports in the reference list L0 for P pictures. * pname:maxNumL0ReferenceForB reports the maximum number of reference pictures the implementation supports in the reference list L0 for B pictures. The reported value is `0` if encoding of B pictures is not supported. * pname:maxNumL1Reference reports the maximum number of reference pictures the implementation supports in the reference list L1 if encoding of B pictures is supported. The reported value is `0` if encoding of B pictures is not supported. * pname:maxNumSubLayers reports the maximum number of sublayers. * pname:qualityLevelCount is the number of quality levels supported. * pname:stdExtensionVersion is a slink:VkExtensionProperties structure in which the H.265 extension name and version supported by the implementation are returned. include::{generated}/validity/structs/VkVideoEncodeH265CapabilitiesEXT.txt[] -- [open,refpage='VkVideoEncodeH265CapabilityFlagsEXT',desc='Reserved for future use',type='flags'] -- include::{generated}/api/flags/VkVideoEncodeH265CapabilityFlagsEXT.txt[] tname:VkVideoEncodeH265CapabilityFlagsEXT is a bitmask type for setting a mask, but is currently reserved for future use. // ... a mask of zero or more elink:VkVideoEncodeH265CapabilityFlagBitsEXT. -- [open,refpage='VkVideoEncodeH265InputModeFlagsEXT',desc='Bitmask of VkVideoEncodeH265InputModeFlagBitsEXT',type='flags'] -- include::{generated}/api/flags/VkVideoEncodeH265InputModeFlagsEXT.txt[] tname:VkVideoEncodeH265InputModeFlagsEXT is a bitmask type for setting a mask of zero or more elink:VkVideoEncodeH265InputModeFlagBitsEXT. -- [open,refpage='VkVideoEncodeH265InputModeFlagBitsEXT',desc='Video encode H.265 input modes',type='enums'] -- Bits which may: be set in slink:VkVideoEncodeH265CapabilitiesEXT::pname:inputModeFlags, indicating the commmand buffer input granularities supported by the implementation, are: include::{generated}/api/enums/VkVideoEncodeH265InputModeFlagBitsEXT.txt[] * ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_FRAME_BIT_EXT indicates that a single command buffer must: at least encode an entire frame. Any non-VCL NALUs must: be encoded using the same command buffer as the frame if ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_NON_VCL_BIT_EXT is not supported. * ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_SLICE_BIT_EXT indicates that a single command buffer must: at least encode a single slice. Any non-VCL NALUs must: be encoded using the same command buffer as the first slice of the frame if ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_NON_VCL_BIT_EXT is not supported. * ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_NON_VCL_BIT_EXT indicates that a single command buffer may: encode a non-VCL NALU by itself. An implementation must: support at least one of ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_FRAME_BIT_EXT or ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_SLICE_BIT_EXT. -- [open,refpage='VkVideoEncodeH265OutputModeFlagsEXT',desc='Bitmask of VkVideoEncodeH265OutputModeFlagBitsEXT',type='flags'] -- include::{generated}/api/flags/VkVideoEncodeH265OutputModeFlagsEXT.txt[] tname:VkVideoEncodeH265OutputModeFlagsEXT is a bitmask type for setting a mask of zero or more elink:VkVideoEncodeH265OutputModeFlagBitsEXT. -- [open,refpage='VkVideoEncodeH265OutputModeFlagBitsEXT',desc='Video encode H.265 output modes',type='enums'] -- Bits which may: be set in slink:VkVideoEncodeH265CapabilitiesEXT::pname:outputModeFlags, indicating the minimum bitstream generation commands that must: be included between each flink:vkCmdBeginVideoCodingKHR and flink:vkCmdEndVideoCodingKHR pair (henceforth simply begin/end pair), are: include::{generated}/api/enums/VkVideoEncodeH265OutputModeFlagBitsEXT.txt[] * ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_FRAME_BIT_EXT indicates that calls to generate all NALUs of a frame must: be included within a single begin/end pair. Any non-VCL NALUs must: be encoded within the same begin/end pair if ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_NON_VCL_BIT_EXT is not supported. * ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_SLICE_BIT_EXT indicates that each begin/end pair must: encode at least one slice. Any non-VCL NALUs must: be encoded within the same begin/end pair as the first slice of the frame if ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_NON_VCL_BIT_EXT is not supported. * ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_NON_VCL_BIT_EXT indicates that each begin/end pair may: encode only a non-VCL NALU by itself. An implementation must: support at least one of ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_FRAME_BIT_EXT or ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_SLICE_BIT_EXT. A single begin/end pair must: not encode more than a single frame. The bitstreams of NALUs generated within a single begin/end pair are written continuously into the same bitstream buffer (any padding between the NALUs must: be compliant to the H.265 standard). The supported input modes must: be coarser or equal to the supported output modes. For example, it is illegal to report slice input is supported but only frame output is supported. An implementation must: report one of the following combinations of input/output modes: * Input: Frame, Output: Frame * Input: Frame, Output: Frame and Non-VCL * Input: Frame, Output: Slice * Input: Frame, Output: Slice and Non-VCL * Input: Slice, Output: Slice * Input: Slice, Output: Slice and Non-VCL * Input: Frame and Non-VCL, Output: Frame and Non-VCL * Input: Frame and Non-VCL, Output: Slice and Non-VCL * Input: Slice and Non-VCL, Output: Slice and Non-VCL -- [open,refpage='VkVideoEncodeH265CtbSizeFlagsEXT',desc='Bitmask of VkVideoEncodeH265CtbSizeFlagBitsEXT',type='flags'] -- include::{generated}/api/flags/VkVideoEncodeH265CtbSizeFlagsEXT.txt[] tname:VkVideoEncodeH265CtbSizeFlagsEXT is a bitmask type for setting a mask of zero or more elink:VkVideoEncodeH265CtbSizeFlagBitsEXT. -- [open,refpage='VkVideoEncodeH265CtbSizeFlagBitsEXT',desc='Supported CTB sizes for H.265 video encode',type='enums'] -- Bits which may: be set in slink:VkVideoEncodeH265CapabilitiesEXT::pname:ctbSizes, indicating the CTB sizes supported by the implementation, are: include::{generated}/api/enums/VkVideoEncodeH265CtbSizeFlagBitsEXT.txt[] * ename:VK_VIDEO_ENCODE_H265_CTB_SIZE_8_BIT_EXT specifies that a CTB size of 8x8 is supported. * ename:VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_EXT specifies that a CTB size of 16x16 is supported. * ename:VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_EXT specifies that a CTB size of 32x32 is supported. * ename:VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_EXT specifies that a CTB size of 64x64 is supported. -- === Create Information [open,refpage='VkVideoEncodeH265SessionCreateInfoEXT', desc='Structure specifies H.265 encoder creation parameters', type='structs'] -- When creating a Video Session object with slink:VkVideoSessionCreateInfoKHR::pname:pVideoProfile->videoCodecOperation specified as ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT, add a slink:VkVideoEncodeH265SessionCreateInfoEXT structure to the pname:pNext chain of the slink:VkVideoSessionCreateInfoKHR structure passed to flink:vkCreateVideoSessionKHR in order to specify the H.265-specific video encoder session creation parameters. The sname:VkVideoEncodeH265SessionCreateInfoEXT structure is defined as: include::{generated}/api/structs/VkVideoEncodeH265SessionCreateInfoEXT.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.265 codec extension version. include::{generated}/validity/structs/VkVideoEncodeH265SessionCreateInfoEXT.txt[] -- [open,refpage='VkVideoEncodeH265CreateFlagsEXT',desc='Reserved for future use',type='flags'] -- include::{generated}/api/flags/VkVideoEncodeH265CreateFlagsEXT.txt[] tname:VkVideoEncodeH265CreateFlagsEXT is a bitmask type for setting a mask, but is currently reserved for future use. -- === Encoder H.265 Video Session Parameters Object When creating a Video Session Parameters object, add a slink:VkVideoEncodeH265SessionParametersCreateInfoEXT structure to the pname:pNext chain of the slink:VkVideoSessionParametersCreateInfoKHR structure passed to flink:vkCreateVideoSessionParametersKHR in order to specify the H.265-specific video encoder session parameters. [open,refpage='VkVideoEncodeH265SessionParametersCreateInfoEXT',desc='Structure specifies H.265 encoder parameter set info',type='structs'] -- The sname:VkVideoEncodeH265SessionParametersCreateInfoEXT structure is defined as: include::{generated}/api/structs/VkVideoEncodeH265SessionParametersCreateInfoEXT.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:maxVpsStdCount is the maximum number of entries of type code:StdVideoH265VideoParameterSet within sname:VkVideoSessionParametersKHR. * pname:maxSpsStdCount is the maximum number of entries of type code:StdVideoH265SequenceParameterSet within sname:VkVideoSessionParametersKHR. * pname:maxPpsStdCount is the maximum number of entries of type code:StdVideoH265PictureParameterSet within sname:VkVideoSessionParametersKHR. * pname:pParametersAddInfo is `NULL` or a pointer to a slink:VkVideoEncodeH265SessionParametersAddInfoEXT structure specifying the video session parameters to add upon creation of this object. When a slink:VkVideoSessionParametersKHR object contains pname:maxVpsStdCount code:StdVideoH265VideoParameterSet entries, no additional code:StdVideoH265VideoParameterSet entries can be added to it, and ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made to add these entries. When a slink:VkVideoSessionParametersKHR object contains pname:maxSpsStdCount code:StdVideoH265SequenceParameterSet entries, no additional code:StdVideoH265SequenceParameterSet entries can be added to it, and ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made to add these entries. When a slink:VkVideoSessionParametersKHR object contains pname:maxPpsStdCount code:StdVideoH265PictureParameterSet entries, no additional code:StdVideoH265PictureParameterSet entries can be added to it, and ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made to add these entries. include::{generated}/validity/structs/VkVideoEncodeH265SessionParametersCreateInfoEXT.txt[] -- [open,refpage='VkVideoEncodeH265SessionParametersAddInfoEXT',desc='Structure specifies H.265 encoder parameter set info',type='structs'] -- The sname:VkVideoEncodeH265SessionParametersAddInfoEXT structure is defined as: include::{generated}/api/structs/VkVideoEncodeH265SessionParametersAddInfoEXT.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:vpsStdCount is the number of VPS elements in pname:pVpsStd. * pname:pVpsStd is a pointer to an array of pname:vpsStdCount code:StdVideoH265VideoParameterSet structures representing H.265 video parameter sets. * pname:spsStdCount is the number of SPS elements in pname:pSpsStd. * pname:pSpsStd is a pointer to an array of pname:spsStdCount code:StdVideoH265SequenceParameterSet structures representing H.265 sequence parameter sets. * pname:ppsStdCount is the number of PPS elements in pname:pPpsStd. * pname:pPpsStd is a pointer to an array of pname:ppsStdCount code:StdVideoH265PictureParameterSet structures representing H.265 picture parameter sets. include::{generated}/validity/structs/VkVideoEncodeH265SessionParametersAddInfoEXT.txt[] .Valid Usage **** * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-vpsStdCount-06438]] The values of pname:vpsStdCount, pname:spsStdCount and pname:ppsStdCount must: be less than or equal to the values of slink:VkVideoEncodeH265SessionParametersCreateInfoEXT::pname:maxVpsStdCount, slink:VkVideoEncodeH265SessionParametersCreateInfoEXT:pname:maxSpsStdCount, and slink:VkVideoEncodeH265SessionParametersCreateInfoEXT:pname:maxPpsStdCount, respectively * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-pVpsStd-06439]] Each code:StdVideoH265VideoParameterSet entry in pname:pVpsStd must: have a unique H.265 VPS ID * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-pSpsStd-06440]] Each code:StdVideoH265SequenceParameterSet entry in pname:pSpsStd must: have a unique H.265 VPS-SPS ID pair * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-pPpsStd-06441]] Each code:StdVideoH265PictureParameterSet entry in pname:pPpsStd must: have a unique H.265 VPS-SPS-PPS ID tuple * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-None-06442]] 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, VPS-SPS-PPS IDs * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-None-06443]] Parameter entries that already exist in Video Session Parameters object with a particular VPS-SPS-PPS IDs must: not be replaced nor updated * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-None-06444]] When creating a new object using a Video Session Parameters as a template, the array's parameters with the same VPS-SPS-PPS IDs as the ones from the template take precedence * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-None-06445]] VPS/SPS/PPS parameters must: comply with the limits specified in slink:VkVideoSessionCreateInfoKHR during Video Session creation **** -- === Frame Encoding In order to encode a frame, add a slink:VkVideoEncodeH265VclFrameInfoEXT structure to the pname:pNext chain of the slink:VkVideoEncodeInfoKHR structure passed to the flink:vkCmdEncodeVideoKHR command. [open,refpage='VkVideoEncodeH265VclFrameInfoEXT',desc='Structure specifies H.265 encode frame parameters',type='structs'] -- The structure slink:VkVideoEncodeH265VclFrameInfoEXT representing a frame encode operation is defined as: include::{generated}/api/structs/VkVideoEncodeH265VclFrameInfoEXT.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:pReferenceFinalLists is `NULL` or a pointer to a slink:VkVideoEncodeH265ReferenceListsEXT structure specifying the reference lists to be used for the current picture. * pname:naluSliceEntryCount is the number of slice NALUs in the frame. * pname:pNaluSliceEntries is a pointer to an array of slink:VkVideoEncodeH265NaluSliceEXT structures specifying the division of the current picture into slices and the properties of these slices. * pname:pCurrentPictureInfo is a pointer to a code:StdVideoEncodeH265PictureInfo structure specifying the syntax and other codec-specific information from the H.265 specification, associated with this picture. include::{generated}/validity/structs/VkVideoEncodeH265VclFrameInfoEXT.txt[] -- [open,refpage='VkVideoEncodeH265NaluSliceEXT',desc='Structure specifies H.265 encode slice NALU parameters',type='structs'] -- The structure slink:VkVideoEncodeH265NaluSliceEXT representing a slice is defined as: include::{generated}/api/structs/VkVideoEncodeH265NaluSliceEXT.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:ctbCount is the number of CTBs in this slice. * pname:pReferenceFinalLists is `NULL` or a pointer to a slink:VkVideoEncodeH265ReferenceListsEXT structure specifying the reference lists to be used for the current slice. If pname:pReferenceFinalLists is not `NULL`, these reference lists override the reference lists provided in slink:VkVideoEncodeH265VclFrameInfoEXT::pname:pReferenceFinalLists. * pname:pSliceHeaderStd is a pointer to a code:StdVideoEncodeH265SliceHeader structure specifying the slice header for the current slice. include::{generated}/validity/structs/VkVideoEncodeH265NaluSliceEXT.txt[] -- [open,refpage='VkVideoEncodeH265DpbSlotInfoEXT',desc='Structure specifies H.265 encode decoded pic info',type='structs'] -- The structure slink:VkVideoEncodeH265DpbSlotInfoEXT, representing a reconstructed picture that is being used as a reference picture, is defined as: include::{generated}/api/structs/VkVideoEncodeH265DpbSlotInfoEXT.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:slotIndex is the <> index for this picture. * pname:pStdReferenceInfo is a pointer to a code:StdVideoEncodeH265ReferenceInfo structure specifying the syntax and other codec-specific information from the H.265 specification, associated with this reference picture. include::{generated}/validity/structs/VkVideoEncodeH265DpbSlotInfoEXT.txt[] -- [open,refpage='VkVideoEncodeH265ReferenceListsEXT',desc='Structure specifies H.265 reference frame lists',type='structs'] -- The structure slink:VkVideoEncodeH265ReferenceListsEXT representing reference lists is defined as: include::{generated}/api/structs/VkVideoEncodeH265ReferenceListsEXT.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:referenceList0EntryCount is the number of reference pictures in reference list L0 and is identical to code:StdVideoEncodeH265SliceHeader::pname:num_ref_idx_l0_active_minus1 + 1. * pname:pReferenceList0Entries is a pointer to an array of pname:referenceList0EntryCount slink:VkVideoEncodeH265DpbSlotInfoEXT structures specifying the reference list L0 entries for the current picture. * pname:referenceList1EntryCount is the number of reference pictures in reference list L1 and is identical to code:StdVideoEncodeH265SliceHeader::pname:num_ref_idx_l1_active_minus1 + 1. * pname:pReferenceList1Entries is a pointer to an array of pname:referenceList1EntryCount slink:VkVideoEncodeH265DpbSlotInfoEXT structures specifying the reference list L1 entries for the current picture. * pname:pReferenceModifications is a pointer to a code:StdVideoEncodeH265ReferenceModifications structure specifying reference list modifications. include::{generated}/validity/structs/VkVideoEncodeH265ReferenceListsEXT.txt[] -- [open,refpage='VkVideoEncodeH265EmitPictureParametersEXT',desc='Structure specifies H.265 encode VPS NALU insertion parameters',type='structs'] -- The structure slink:VkVideoEncodeH265EmitPictureParametersEXT is defined as: include::{generated}/api/structs/VkVideoEncodeH265EmitPictureParametersEXT.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:vpsId is the H.265 VPS ID for the H.265 VPS to insert in the bitstream. The VPS ID must: match the VPS provided in pname:vpsStd of slink:VkVideoEncodeH265SessionParametersCreateInfoEXT. This is retrieved from the slink:VkVideoSessionParametersKHR object provided in slink:VkVideoBeginCodingInfoKHR. * pname:spsId is the H.265 SPS ID for the H.265 SPS to insert in the bitstream. The SPS ID must: match one of the IDs of the SPS(s) provided in pname:pSpsStd of slink:VkVideoEncodeH265SessionParametersCreateInfoEXT to identify the SPS parameter set to insert in the bitstream. This is retrieved from the slink:VkVideoSessionParametersKHR object provided in slink:VkVideoBeginCodingInfoKHR. * pname:emitVpsEnable enables the emitting of the VPS structure with id of pname:vpsId. * pname:emitSpsEnable enables the emitting of the SPS structure with id of pname:spsId. * pname:ppsIdEntryCount is the number of entries in the pname:ppsIdEntries. If this parameter is `0` then no pps entries are going to be emitted in the bitstream. * pname:ppsIdEntries is the H.265 PPS IDs for the H.265 PPS to insert in the bitstream. The PPS IDs must: match one of the IDs of the PPS(s) provided in pname:pPpsStd of slink:VkVideoEncodeH265SessionParametersCreateInfoEXT to identify the PPS parameter set to insert in the bitstream. This is retrieved from the slink:VkVideoSessionParametersKHR object provided in slink:VkVideoBeginCodingInfoKHR. include::{generated}/validity/structs/VkVideoEncodeH265EmitPictureParametersEXT.txt[] -- === Rate control [open,refpage='VkVideoEncodeH265RateControlInfoEXT',desc='Structure describing H.265 stream rate control parameters',type='structs'] -- In order to provide H.265-specific stream rate control parameters, add a slink:VkVideoEncodeH265RateControlInfoEXT structure to the pname:pNext chain of the slink:VkVideoEncodeRateControlInfoKHR structure in the pname:pNext chain of the slink:VkVideoCodingControlInfoKHR structure passed to the flink:vkCmdControlVideoCodingKHR command. The parameters from this structure act as a guidance for implementations to apply various rate control heuristics. The structure sname:VkVideoEncodeH265RateControlInfoEXT is defined as: include::{generated}/api/structs/VkVideoEncodeH265RateControlInfoEXT.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:gopFrameCount is the number of frames contained within the group of pictures (GOP), starting from an intra frame and until the next intra frame. If it is set to 0, the implementation chooses a suitable value. If it is set to code:UINT32_MAX, the GOP length is treated as infinite. This value is ignored when slink:VkVideoEncodeRateControlInfoKHR::pname:rateControlMode is ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR. * pname:idrPeriod is the interval, in terms of number of frames, between two IDR frames. If it is set to 0, the implementation chooses a suitable value. If it is set to code:UINT32_MAX, the IDR period is treated as infinite. This value is ignored when slink:VkVideoEncodeRateControlInfoKHR::pname:rateControlMode is ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR. * pname:consecutiveBFrameCount is the number of consecutive B-frames between I- and/or P-frames within the GOP. This value is ignored when slink:VkVideoEncodeRateControlInfoKHR::pname:rateControlMode is ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR. * pname:rateControlStructure is a elink:VkVideoEncodeH265RateControlStructureFlagBitsEXT value specifying the expected encode stream reference structure, to aid in rate control calculations. It is possible to infer the picture type to be used when encoding a frame, on the basis of the values provided for pname:consecutiveBFrameCount, pname:idrPeriod, and pname:gopFrameCount, but this inferred picture type will not be used by implementations to override the picture type provided in flink:vkCmdEncodeVideoKHR. Additionally, it is not required for the video session to be reset if the inferred picture type does not match the actual picture type. include::{generated}/validity/structs/VkVideoEncodeH265RateControlInfoEXT.txt[] -- [open,refpage='VkVideoEncodeH265RateControlStructureFlagBitsEXT',desc='Video encode H.265 rate control structure flags',type='enums'] -- The pname:rateControlStructure in slink:VkVideoEncodeH265RateControlInfoEXT specifies one of the following video stream reference structures as a hint for the rate control implementation: include::{generated}/api/enums/VkVideoEncodeH265RateControlStructureFlagBitsEXT.txt[] * ename:VK_VIDEO_ENCODE_H265_RATE_CONTROL_STRUCTURE_UNKNOWN_EXT is `0`, and specifies a reference structure unknown at the time of stream rate control configuration. * ename:VK_VIDEO_ENCODE_H265_RATE_CONTROL_STRUCTURE_FLAT_BIT_EXT specifies a flat reference structure. * ename:VK_VIDEO_ENCODE_H265_RATE_CONTROL_STRUCTURE_DYADIC_BIT_EXT specifies a dyadic reference structure. -- [open,refpage='VkVideoEncodeH265RateControlLayerInfoEXT',desc='Structure describing H.265 per-layer rate control parameters',type='structs'] -- H.265-specific per-layer rate control parameters must: be specified by adding slink:VkVideoEncodeH265RateControlLayerInfoEXT structure to the pname:pNext chain of each slink:VkVideoEncodeRateControlLayerInfoKHR structure in a call to flink:vkCmdControlVideoCodingKHR command, when the command buffer context has an active video encode H.265 session. The structure sname:VkVideoEncodeH265RateControlLayerInfoEXT is defined as: include::{generated}/api/structs/VkVideoEncodeH265RateControlLayerInfoEXT.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:temporalId specifies the H.265 temporal ID of the video coding layer that settings provided in this structure and its parent slink:VkVideoEncodeRateControlLayerInfoKHR structure apply to. * pname:useInitialRcQp indicates whether the values within pname:initialRcQp should be used by the implementation. * pname:initialRcQp provides the QP values for each picture type, to be used in rate control calculations at the start of video encode operations on a newly-created video session, or immediately after a session reset. These values are ignored when slink:VkVideoEncodeRateControlInfoKHR::pname:rateControlMode is ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR. * pname:useMinQp indicates whether the values within pname:minQp should be used by the implementation. When it is set to ename:VK_FALSE, the implementation ignores the values in pname:minQp and chooses suitable values. * pname:minQp provides the lower bound on the QP values for each picture type, to be used in rate control calculations. * pname:useMaxQp indicates whether the values within pname:maxQp should be used by the implementation. When it is set to ename:VK_FALSE, the implementation ignores the values in pname:maxQp and chooses suitable values. * pname:maxQp provides the upper bound on the QP values for each picture type, to be used in rate control calculations. * pname:useMaxFrameSize indicates whether the values within pname:maxFrameSize should be used by the implementation. * pname:maxFrameSize provides the upper bound on the encoded frame size for each picture type. The implementation does not guarantee the encoded frame sizes will be within the specified limits, however these limits may: be used as a guide in rate control calculations. If enabled and not set properly, the pname:maxQp limit may prevent the implementation from respecting the pname:maxFrameSize limit. .Valid Usage **** * [[VUID-VkVideoEncodeH265RateControlLayerInfoEXT-rateControlMode-06476]] When slink:VkVideoEncodeRateControlInfoKHR::pname:rateControlMode is ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR, both pname:useMinQp and pname:useMaxQp must be set to ename:VK_TRUE. * [[VUID-VkVideoEncodeH265RateControlLayerInfoEXT-rateControlMode-06477]] When slink:VkVideoEncodeRateControlInfoKHR::pname:rateControlMode is ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR, the values provided in pname:minQP must be identical to those provided in pname:maxQp. **** include::{generated}/validity/structs/VkVideoEncodeH265RateControlLayerInfoEXT.txt[] -- [open,refpage='VkVideoEncodeH265QpEXT',desc='Structure describing H.265 QP values per picture type',type='structs'] -- The structure sname:VkVideoEncodeH265QpEXT is defined as: include::{generated}/api/structs/VkVideoEncodeH265QpEXT.txt[] * pname:qpI is the QP to be used for I-frames. * pname:qpP is the QP to be used for P-frames. * pname:qpB is the QP to be used for B-frames. include::{generated}/validity/structs/VkVideoEncodeH265QpEXT.txt[] -- [open,refpage='VkVideoEncodeH265FrameSizeEXT',desc='Structure describing frame size values per H.265 picture type',type='structs'] -- The structure sname:VkVideoEncodeH265FrameSizeEXT is defined as: include::{generated}/api/structs/VkVideoEncodeH265FrameSizeEXT.txt[] * pname:frameISize is the size in bytes to be used for I-frames. * pname:framePSize is the size in bytes to be used for P-frames. * pname:frameBSize is the size in bytes to be used for B-frames. include::{generated}/validity/structs/VkVideoEncodeH265FrameSizeEXT.txt[] --