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

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

=== Other Extension Metadata

*Last Modified Date*::
    2023-12-05
*IP Status*::
    No known IP claims.
*Contributors*::
  - Ahmed Abdelkhalek, AMD
  - Damien Kessler, NVIDIA
  - George Hao, AMD
  - Jake Beju, AMD
  - Peter Fang, AMD
  - Piers Daniell, NVIDIA
  - Srinath Kumarapuram, NVIDIA
  - Thomas J. Meier, NVIDIA
  - Tony Zlatinski, NVIDIA
  - Ravi Chaudhary, NVIDIA
  - Yang Liu, AMD
  - Daniel Rakos, RasterGrid
  - Ping Liu, Intel
  - Aidan Fabius, Core Avionics & Industrial Inc.
  - Lynne Iribarren, Independent

=== Description

This extension builds upon the `apiext:VK_KHR_video_queue` extension by
adding common APIs specific to video encoding and thus enabling
implementations to expose queue families supporting video encode operations.

More specifically, it adds video encode specific capabilities and a new
command buffer command that allows recording video encode operations against
a video session.

This extension is to be used in conjunction with other codec specific video
encode extensions that enable encoding video sequences of specific video
compression standards.

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

=== Version History

  * Revision 1, 2018-07-23 (Ahmed Abdelkhalek)
  ** Initial draft
  * Revision 1.1, 10/29/2019 (Tony Zlatinski)
  ** Updated the reserved spec tokens and renamed VkVideoEncoderKHR to
     VkVideoSessionKHR
  * Revision 1.6, Jan 08 2020 (Tony Zlatinski)
  ** API unify with the video_decode_queue spec
  * Revision 2, March 29 2021 (Tony Zlatinski)
  ** Spec and API updates.
  * Revision 3, 2021-09-30 (Jon Leech)
  ** Add interaction with `apiext:VK_KHR_format_feature_flags2` to `vk.xml`
  * Revision 4, 2022-02-10 (Ahmed Abdelkhalek)
  ** Updates to encode capability interface
  * Revision 5, 2022-03-31 (Ahmed Abdelkhalek)
  ** Remove redundant VkVideoEncodeInfoKHR.codedExtent
  * Revision 6, 2022-07-18 (Daniel Rakos)
  ** Remove `VkVideoEncodeRateControlFlagBitsKHR` and
     `VkVideoEncodeFlagBitsKHR` as they contain no defined flags for now
  ** Add `VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR` and
     `VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_LAYER_BIT_KHR` to indicate
     rate control and rate control layer change requests, respectively, in
     video coding control operations
  * Revision 7, 2022-08-12 (Daniel Rakos)
  ** Add VkVideoEncodeUsageInfoKHR structure and related flags
  * Revision 8, 2023-03-06 (Daniel Rakos)
  ** Replace `VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR` queries
     with more generic `VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR` queries
     that can be extended in the future with more feedback values
  ** Rename `dstBitstreamBuffer`, `dstBitstreamBufferOffset`, and
     `dstBitstreamBufferMaxRange` in `VkVideoEncodeInfoKHR` to `dstBuffer`,
     `dstBufferOffset`, and `dstBufferRange`, respectively, for consistency
     with the naming convention in the video decode extensions
  ** Change the type of `rateControlLayerCount` and `qualityLevelCount` in
     `VkVideoEncodeCapabilitiesKHR` from `uint8_t` to `uint32_t` and rename
     them to `maxRateControlLayers` and `maxQualityLevels`, respectively
  ** Change the type of `averageBitrate` and `maxBitrate` in
     `VkVideoEncodeRateControlLayerInfoKHR`` from `uint32_t` to `uint64_t`
  ** Fixed the definition of rate control flag bits and added the new
     `VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR` constant to indicate
     implementation-specific automatic rate control
  ** Change the type of `VkVideoEncodeRateControlInfoKHR::layerCount` from
     `uint8_t` to `uint32_t`
  ** Rename `pLayerConfigs` to `pLayers` in
     `VkVideoEncodeRateControlInfoKHR`
  * Revision 9, 2023-03-28 (Daniel Rakos)
  ** Removed `VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_LAYER_BIT_KHR` and
     the ability to change the state of individual rate control layers
  ** Added new `VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR`
     flag to video encode feedback queries
  ** Added new video session create flag
     `VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_PARAMETER_OPTIMIZATIONS_BIT_KHR`
     to opt-in to video session and encoding parameter optimizations
  ** Added the `vkGetEncodedVideoSessionParametersKHR` command to enable
     retrieving encoded video session parameter data
  ** Moved `virtualBufferSizeInMs` and `initialVirtualBufferSizeInMs` from
     `VkVideoEncodeRateControlLayerInfoKHR` to
     `VkVideoEncodeRateControlInfoKHR`
  ** Added `maxBitrate` capability
  ** Renamed `inputImageDataFillAlignment` capability to
     `encodeInputPictureGranularity` to better reflect its purpose
  ** Added new `vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR`
     command and related structures to enable querying recommended settings
     for video encode quality levels
  ** Added `VK_VIDEO_CODING_CONTROL_ENCODE_QUALITY_LEVEL_BIT_KHR` flag and
     `VkVideoEncodeQualityLevelInfoKHR` structure to allow controlling video
     encode quality level and removed `qualityLevel` from the encode
     operation parameters
  * Revision 10, 2023-07-19 (Daniel Rakos)
  ** Added `VK_QUERY_RESULT_STATUS_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_KHR`
     query result status code and the related capability flag
     `VK_VIDEO_ENCODE_CAPABILITY_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_DETECTION_BIT_KHR`
  * Revision 11, 2023-09-04 (Daniel Rakos)
  ** Extension is no longer provisional
  * Revision 12, 2023-12-05 (Daniel Rakos)
  ** Require the specification of a reconstructed picture in all cases,
     except when the video session was created with no DPB slots to match
     shipping implementations
  ** Make DPB slot activation behavior codec-specific to continue allowing
     application control over reference picture setup now that a
     reconstructed picture is always mandatory
