// Copyright 2018-2024 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

include::{generated}/meta/{refprefix}VK_KHR_video_encode_h265.adoc[]

=== Other Extension Metadata

*Last Modified Date*::
    2023-12-05
*IP Status*::
    No known IP claims.
*Contributors*::
  - Ahmed Abdelkhalek, AMD
  - George Hao, AMD
  - Jake Beju, AMD
  - Chunbo Chen, Intel
  - Ping Liu, Intel
  - Srinath Kumarapuram, NVIDIA
  - Tony Zlatinski, NVIDIA
  - Ravi Chaudhary, NVIDIA
  - Daniel Rakos, RasterGrid
  - Aidan Fabius, Core Avionics & Industrial Inc.
  - Lynne Iribarren, Independent

=== Description

This extension builds upon the `apiext:VK_KHR_video_encode_queue` extension
by adding support for encoding elementary video stream sequences compliant
with the H.265/HEVC video compression standard.

[NOTE]
.Note
====
This extension was promoted to `KHR` from the provisional extension
`VK_EXT_video_encode_h265`.
====

include::{generated}/interfaces/VK_KHR_video_encode_h265.adoc[]

=== Version History

  * Revision 0, 2019-11-14 (Ahmed Abdelkhalek)
  ** Initial draft
  * Revision 0.5, 2020-02-13 (Tony Zlatinski)
  ** General Spec cleanup
  ** Added DPB structures
  ** Change the VCL frame encode structure
  ** Added a common Non-VCL Picture Paramarameters structure
  * Revision 2, Oct 10 2021 (Srinath Kumarapuram)
  ** Vulkan Video Encode h.265 update and spec edits
  * Revision 3, 2021-12-08 (Ahmed Abdelkhalek)
  ** Rate control updates
  * Revision 4, 2022-01-11 (Ahmed Abdelkhalek)
  ** Replace occurrences of "`slice`" by "`slice segment`" and rename
     structures/enums to reflect this.
  * Revision 5, 2022-02-10 (Ahmed Abdelkhalek)
  ** Updates to encode capability interface
  * Revision 6, 2022-03-16 (Ahmed Abdelkhalek)
  ** Relocate Std header version reporting/requesting from this extension to
     VK_KHR_video_queue extension.
  ** Remove the now empty VkVideoEncodeH265SessionCreateInfoEXT.
  * Revision 7, 2022-03-24 (Ahmed Abdelkhalek)
  ** Add capability flags to report support to disable transform skip and
     support to use B frame in L1 reference list.
  * Revision 8, 2022-07-18 (Daniel Rakos)
  ** Replace `VkVideoEncodeH265RateControlStructureFlagBitsEXT` bit enum
     with `VkVideoEncodeH265RateControlStructureEXT` enum
  ** Rename `VkVideoEncodeH265ProfileEXT` to
     `VkVideoEncodeH265ProfileInfoEXT`
  ** Rename `VkVideoEncodeH265ReferenceListsEXT` to
     `VkVideoEncodeH265ReferenceListsInfoEXT`
  ** Rename `VkVideoEncodeH265EmitPictureParametersEXT` to
     `VkVideoEncodeH265EmitPictureParametersInfoEXT`
  ** Rename `VkVideoEncodeH265NaluSliceSegmentEXT` to
     `VkVideoEncodeH265NaluSliceSegmentInfoEXT`
  * Revision 9, 2022-09-18 (Daniel Rakos)
  ** Rename `vpsStdCount`, `pVpsStd`, `spsStdCount`, `pSpsStd`,
     `ppsStdCount`, and `pPpsStd` to `stdVPSCount`, `pStdVPSs`,
     `stdSPSCount`, `pStdSPSs`, `stdPPSCount`, and `pStdPPSs`, respectively,
     in `VkVideoEncodeH265SessionParametersAddInfoEXT`
  ** Rename `maxVpsStdCount`, `maxSpsStdCount`, and `maxPpsStdCount` to
     `maxStdVPSCount`, `maxStdSPSCount` and `maxStdPPSCount`, respectively,
     in `VkVideoEncodeH265SessionParametersCreateInfoEXT`
  * Revision 10, 2023-03-06 (Daniel Rakos)
  ** Removed `VkVideoEncodeH265EmitPictureParametersInfoEXT`
  ** Changed member types in `VkVideoEncodeH265CapabilitiesEXT` and
     `VkVideoEncodeH265ReferenceListsInfoEXT` from `uint8_t` to `uint32_t`
  ** Changed the type of
     `VkVideoEncodeH265RateControlInfoEXT::subLayerCount` and
     `VkVideoEncodeH265RateControlLayerInfoEXT::temporalId` from `uint8_t`
     to `uint32_t`
  ** Removed `VkVideoEncodeH265InputModeFlagsEXT` and
     `VkVideoEncodeH265OutputModeFlagsEXT` as we only support
     frame-in-frame-out mode for now
  ** Rename `pCurrentPictureInfo` in `VkVideoEncodeH265VclFrameInfoEXT` to
     `pStdPictureInfo`
  ** Rename `pSliceSegmentHeaderStd` in
     `VkVideoEncodeH265NaluSliceSegmentInfoEXT` to `pStdSliceSegmentHeader`
  ** Rename `pReferenceFinalLists` in `VkVideoEncodeH265VclFrameInfoEXT` and
     `VkVideoEncodeH265NaluSliceSegmentInfoEXT` to `pStdReferenceFinalLists`
  ** Removed the `slotIndex` member of `VkVideoEncodeH265DpbSlotInfoEXT` and
     changed it to be chained to `VkVideoReferenceSlotInfoKHR`
  ** Replaced `VkVideoEncodeH265ReferenceListsInfoEXT` with the new Video
     Std header structure `StdVideoEncodeH265ReferenceLists`
  ** Added new capability flag
     `VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_REFERENCE_FINAL_LISTS_BIT_EXT`
  * Revision 11, 2023-05-26 (Daniel Rakos)
  ** Renamed `VkVideoEncodeH265VclFrameInfoEXT` to
     `VkVideoEncodeH265PictureInfoEXT`
  ** Removed `VkVideoEncodeH265RateControlLayerInfoEXT::temporalId`
  ** Added `expectDyadicTemporalSubLayerPattern` capability
  ** Added the `VkVideoEncodeH265SessionParametersGetInfoEXT` structure to
     identify the H.265 parameter sets to retrieve encoded parameter data
     for, and the `VkVideoEncodeH265SessionParametersFeedbackInfoEXT`
     structure to retrieve H.265 parameter set override information when
     using the new `vkGetEncodedVideoSessionParametersKHR` command
  ** Added `VkVideoEncodeH265NaluSliceSegmentInfoEXT::constantQp` to specify
     per-slice segment constant QP when rate control mode is
     `VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR`
  ** Added `VkVideoEncodeH265QualityLevelPropertiesEXT` for retrieving H.265
     specific quality level recommendations
  ** Replaced `VkVideoEncodeH265RateControlStructureEXT` enum with the flags
     type `VkVideoEncodeH265RateControlFlagsEXT` and bits defined in
     `VkVideoEncodeH265RateControlFlagBitsEXT` and added HRD compliance flag
  ** Removed `useInitialRcQp` and `initialRcQp` members of
     `VkVideoEncodeH265RateControlLayerInfoEXT`
  ** Added `prefersGopRemainingFrames` and `requiresGopRemainingFrames`, and
     the new `VkVideoEncodeH265GopRemainingFrameInfoEXT` structure to allow
     specifying remaining frames of each type in the rate control GOP
  ** Renamed `maxSubLayersCount` capability to `maxSubLayerCount`
  ** Added `maxQp`, and `minQp` capabilities
  ** Added `maxLevelIdc` capability and new
     `VkVideoEncodeH265SessionCreateInfoEXT` structure to specify upper
     bounds on the H.265 level of the produced video bitstream
  ** Moved capability flags specific to codec syntax restrictions from
     `VkVideoEncodeH265CapabilityFlagsEXT` to the new
     `VkVideoEncodeH265StdFlagsEXT` which is now included as a separate
     `stdSyntaxFlags` member in `VkVideoEncodeH265CapabilitiesEXT`
  ** Added `std` prefix to codec syntax capabilities in
     `VkVideoEncodeH265CapabilitiesEXT`
  ** Removed `VkVideoEncodeH265NaluSliceSegmentInfoEXT::ctbCount` and
     `VK_VIDEO_ENCODE_H265_CAPABILITY_SLICE_SEGMENT_CTB_COUNT_BIT_EXT`
  ** Replaced
     `VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_SEGMENTS_PER_FRAME_BIT_EXT`
     with the new `maxSliceSegmentCount` capability
  ** Added `maxTiles` capability
  ** Removed codec syntax min/max capabilities from
     `VkVideoEncodeH265CapabilitiesEXT`
  ** Removed capability flag
     `VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_REFERENCE_FINAL_LISTS_BIT_EXT`
     and removed `pStdReferenceFinalLists` members from the
     `VkVideoEncodeH265PictureInfoEXT` and
     `VkVideoEncodeH265NaluSliceSegmentInfoEXT` structures as reference
     lists info is now included in `pStdPictureInfo`
  ** Added capability flag
     `VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_EXT`
  * Revision 12, 2023-07-19 (Daniel Rakos)
  ** Added video std capability flags
     `VK_VIDEO_ENCODE_H265_STD_SLICE_QP_DELTA_BIT_EXT` and
     `VK_VIDEO_ENCODE_H265_STD_DIFFERENT_SLICE_QP_DELTA_BIT_EXT`
  ** Fixed optionality of the array members of
     `VkVideoEncodeH265SessionParametersAddInfoEXT`
  ** Fixed optionality of `VkVideoEncodeH265RateControlInfoEXT::flags`
  * Revision 13, 2023-09-04 (Daniel Rakos)
  ** Change extension from `EXT` to `KHR`
  ** Extension is no longer provisional
  * Revision 14, 2023-12-05 (Daniel Rakos)
  ** Condition reference picture setup based on the value of
     `StdVideoEncodeH265PictureInfo::flags.is_reference`
