视频编码

Vulkan 实现可能会公开一个或多个支持视频编码操作的队列族。这些操作通过将它们记录到视频编码范围内的命令缓冲区中,并将它们提交到具有兼容视频编码功能的队列来执行。

Vulkan 视频功能旨在通过一组相互构建的 API 提供,包括

  • 提供通用视频编码功能的核心 API,

  • 分别提供与编解码器无关的视频解码和视频编码相关功能的 API,

  • 构建在这些 API 之上的其他特定于编解码器的 API。

本章详细介绍了这些 API 的基本组件和操作。

视频图像资源

在视频编码的上下文中,可以用作视频编码操作的源或目标的多维图像数据数组被称为视频图像资源。它们可能存储额外的元数据,其中包括在执行视频编码操作期间使用的实现私有信息,如稍后所述。

视频图像资源由 VkImage 对象支持。从这些资源创建的 VkImageView 对象的各个子区域可以用作解码输出图像编码输入图像重建图像和/或参考图像

视频图像资源的参数使用 VkVideoPictureResourceInfoKHR 结构指定。

VkVideoPictureResourceInfoKHR 结构定义如下

// Provided by VK_KHR_video_queue
typedef struct VkVideoPictureResourceInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkOffset2D         codedOffset;
    VkExtent2D         codedExtent;
    uint32_t           baseArrayLayer;
    VkImageView        imageViewBinding;
} VkVideoPictureResourceInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • codedOffset 是要使用的图像子区域的纹素偏移量。

  • codedExtent 是编码图像数据的大小(以像素为单位)。

  • baseArrayLayerimageViewBinding 中指定的图像视图的数组层,用作视频图像资源。

  • imageViewBinding 是表示视频图像资源的图像视图。

此类结构引用的图像子资源定义为 baseArrayLayer 中指定的图像数组层索引,相对于创建 imageViewBinding 中指定的图像视图时使用的图像子资源范围。

codedOffsetcodedExtent 的含义取决于使用视频图像资源的命令和上下文,以及所使用的视频配置文件和相应的编解码器特定语义,如稍后所述。

视频图像资源由该结构的实例引用的图像子资源以及 codedOffsetcodedExtent 成员唯一定义,这些成员根据特定的编解码器语义标识引用的图像子资源内对应于视频图像资源的图像子区域。

对视频图像资源中的图像数据的访问发生在 VkVideoCapabilitiesKHR::pictureAccessGranularity 指示的粒度上,该粒度由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回。因此,给定与视频图像资源对应的有效图像子区域,实际访问的图像子区域可能大于该子区域,因为它可能包含由于图像访问粒度而产生的额外填充纹素。视频编码操作对这些填充纹素执行的任何写入都会导致未定义的纹素值。

如果两个视频图像资源引用相同的图像子资源,并且它们指定相同的 codedOffsetcodedExtent 值,则它们匹配。

有效用法
  • VUID-VkVideoPictureResourceInfoKHR-baseArrayLayer-07175
    baseArrayLayer 必须小于创建图像视图 imageViewBinding 时指定的 VkImageViewCreateInfo::subresourceRange.layerCount

有效用法(隐式)
  • VUID-VkVideoPictureResourceInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR

  • VUID-VkVideoPictureResourceInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkVideoPictureResourceInfoKHR-imageViewBinding-parameter
    imageViewBinding 必须是有效的 VkImageView 句柄

解码图像缓冲区

视频编码管道的一个组成部分是从压缩的视频比特流中重建图像。重建图像 是此过程产生的 视频图像资源

这些重建图像可以在后续的视频编码操作中用作参考图像,以提供对后续解码或编码图像的样本值的预测。正确使用此类重建图像作为参考图像取决于视频压缩标准、实现以及特定于应用程序的用例。

在单个视频编码操作中用于提供此类预测的参考图像列表称为活动参考图像列表。

解码图像缓冲区 (DPB) 是一个索引数据结构,它维护可用于视频编码操作的参考图像集。 DPB 的各个索引条目称为解码图像缓冲区 (DPB) 插槽 有效 DPB 插槽索引的范围在零到 N-1 之间,其中 N 是 DPB 的容量。每个 DPB 插槽可以引用包含视频帧的参考图像,或者可以引用最多两个包含顶部和/或底部的参考图像,当两者都存在时,它们共同表示一个完整的视频帧

在 Vulkan 中,DPB 的状态和后备存储如下分离

此外,实现可能还维护与 DPB 插槽关联的不透明元数据,包括

  • 与 DPB 插槽关联的视频图像资源相对应的参考图像元数据

实现可以将此类元数据存储为视频会话维护的 DPB 插槽状态的一部分,或者作为支持 DPB 插槽的视频图像资源的一部分。

存储在支持 DPB 插槽的视频图像资源中的任何元数据都独立于用于存储它的视频会话,因此此类视频图像资源可以与其他视频会话共享。相应地,任何依赖于视频会话的元数据都将始终存储为该视频会话维护的 DPB 插槽状态的一部分。

管理 DPB 的责任在应用程序和实现之间分摊,如下所示

此外,除非另有规定,否则应用程序还负责管理编解码器特定的图像 ID 和 DPB 插槽之间的映射,以及任何其他编解码器特定的状态。

DPB 插槽状态

在给定时间,每个 DPB 插槽都处于活动非活动状态。最初,由 视频会话 管理的所有 DPB 插槽都处于非活动状态。

通过根据编解码器特定的语义,在视频编码操作中将其用作图像重建的目标,并将重建图像请求设置为参考图像,从而可以激活 DPB 插槽,将其状态更改为活动,并将其与 重建图像图像参考相关联。

某些视频编码标准允许将多个图像参考与单个 DPB 插槽关联。在这种情况下,可以独立更新各个图像参考的状态。

例如,H.264 解码允许将单独的顶场和底场图像与同一个 DPB 插槽关联。

作为参考图像设置的一部分,实现可能还会生成 参考图像元数据。此类参考图像元数据特定于与 DPB 插槽关联的每个图像参考。

如果此类视频编码操作成功完成,则激活的 DPB 插槽将具有有效的图像参考,并且 重建图像与 DPB 插槽关联。即使 DPB 插槽用作仅设置顶场或底场参考图像的图像重建的目标,因此尚未引用完整帧,也是如此。但是,如果作为此类视频编码操作的输入提供的任何数据不符合所使用的视频压缩标准,则该视频编码操作可能无法成功完成,在这种情况下,激活的 DPB 插槽将具有无效的图像参考。即使 DPB 插槽之前对顶场或底场参考图像有有效的图像参考,但 DPB 插槽对应的另一个场的重建失败,也是如此。

应用程序可以使用 查询来获取有关视频编码操作结果的反馈,并使用生成的 VkQueryResultStatusKHR 值来确定视频编码操作是否成功完成(结果状态为正)或未成功完成(结果状态为负)。

在后续视频编码操作中,使用与具有无效图像参考的 DPB 插槽关联的 参考图像作为 活动参考图像是合法的,但是,此类操作的输出内容是未定义的,并且由此类视频编码操作激活的任何 DPB 插槽也将具有无效的图像参考。即使此类视频编码操作可能以其他方式成功完成,也是如此。

应用程序也可以停用 DPB 插槽,将其状态更改为非活动,并使与 DPB 插槽关联的任何图像参考和 参考图像元数据无效。

如果在视频编码操作中,已经处于活动状态的 DPB 插槽用作图像重建的目标,但根据编解码器特定的语义,未请求将解码的图像设置为参考图像,则不会发生参考图像设置,并且相应的图像参考和 参考图像元数据在 DPB 插槽内失效。如果 DPB 插槽在此类操作之后不再有任何关联的图像参考,则 DPB 插槽将隐式停用。

如果解码未标记为参考的场图像时,将已经处于活动状态的 DPB 插槽用作图像重建的目标,则行为如下

  • 如果 DPB 插槽当前与帧关联,则 DPB 插槽将被停用。

  • 如果 DPB 插槽当前未与顶场图像关联,并且解码的图像是顶场图像,或者如果 DPB 插槽当前未与底场图像关联,并且解码的图像是底场图像,则 DPB 插槽的其他场图像关联(如果有)不会被干扰。

  • 如果DPB槽当前与顶场图像关联,并且解码后的图像也是顶场图像,或者DPB槽当前与底场图像关联,并且解码后的图像也是底场图像,则该图像关联将被无效化,而不影响其他场图像关联(如果有)。如果DPB槽在执行此类操作后不再有任何关联的图像引用,则该DPB槽将被隐式停用。

即使DPB槽已经处于激活状态,也可以用新的帧激活它。在这种情况下,DPB槽与参考图像的所有先前关联将被替换为与用于激活它的重建图像的关联。

如果已激活的DPB槽使用重建的场图像激活,则行为如下:

  • 如果DPB槽当前与帧关联,则该关联将被替换为与用于激活它的重建场图像的关联。

  • 如果DPB槽当前未与顶场图像关联,并且该DPB槽使用顶场图像激活,或者如果DPB槽当前未与底场图像关联,并且该DPB槽使用底场图像激活,则该DPB槽将与用于激活它的重建场图像关联,而不影响其他场图像关联(如果有)。

  • 如果DPB槽当前与顶场图像关联,并且该DPB槽使用新的顶场图像激活,或者如果DPB槽当前与底场图像关联,并且该DPB槽使用新的底场图像激活,则该关联将被替换为与用于激活它的重建场图像的关联,而不影响其他场图像关联(如果有)。

视频配置文件

VkVideoProfileInfoKHR 结构定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkVideoProfileInfoKHR {
    VkStructureType                     sType;
    const void*                         pNext;
    VkVideoCodecOperationFlagBitsKHR    videoCodecOperation;
    VkVideoChromaSubsamplingFlagsKHR    chromaSubsampling;
    VkVideoComponentBitDepthFlagsKHR    lumaBitDepth;
    VkVideoComponentBitDepthFlagsKHR    chromaBitDepth;
} VkVideoProfileInfoKHR;

视频配置文件作为输入提供给视频功能查询,例如 vkGetPhysicalDeviceVideoCapabilitiesKHRvkGetPhysicalDeviceVideoFormatPropertiesKHR,以及在创建用于视频编码操作的资源(如图像、缓冲区、查询池和视频会话)时使用。

视频配置文件的完整描述由该结构的实例以及其 pNext 链中提供的编解码器特定和辅助结构指定。

当此结构被指定为 vkGetPhysicalDeviceVideoCapabilitiesKHR 的输入参数,或者通过 VkVideoProfileListInfoKHR 结构的 pProfiles 成员(在查询命令的输入参数的 pNext 链中,例如 vkGetPhysicalDeviceVideoFormatPropertiesKHRvkGetPhysicalDeviceImageFormatProperties2)时,以下错误代码指示查询操作失败的特定原因:

  • VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR 指定请求的视频图像布局(例如,通过包含在 VkVideoProfileInfoKHRpNext 链中的 VkVideoDecodeH264ProfileInfoKHR 结构的 pictureLayout 成员)不受支持。

  • VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR 指定 videoCodecOperation 指定的视频配置文件操作不受支持。

  • VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR 指定 chromaSubsamplinglumaBitDepthchromaBitDepth 指定的视频格式参数不受支持。

  • VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR 指定与视频编解码器操作对应的编解码器特定参数不受支持。

有效用法
  • VUID-VkVideoProfileInfoKHR-chromaSubsampling-07013
    chromaSubsampling 必须设置单个位

  • VUID-VkVideoProfileInfoKHR-lumaBitDepth-07014
    lumaBitDepth 必须设置单个位

  • VUID-VkVideoProfileInfoKHR-chromaSubsampling-07015
    如果 chromaSubsampling 不是 VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR,则 chromaBitDepth 必须设置单个位

  • VUID-VkVideoProfileInfoKHR-videoCodecOperation-07179
    如果 videoCodecOperationVK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR,则 pNext必须包含一个 VkVideoDecodeH264ProfileInfoKHR 结构

  • VUID-VkVideoProfileInfoKHR-videoCodecOperation-07180
    如果 videoCodecOperationVK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR,则 pNext必须包含一个 VkVideoDecodeH265ProfileInfoKHR 结构

  • VUID-VkVideoProfileInfoKHR-videoCodecOperation-09256
    如果 videoCodecOperationVK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR,则 pNext必须包含一个 VkVideoDecodeAV1ProfileInfoKHR 结构

  • VUID-VkVideoProfileInfoKHR-videoCodecOperation-07181
    如果 videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR,则 pNext必须包含一个 VkVideoEncodeH264ProfileInfoKHR 结构

  • VUID-VkVideoProfileInfoKHR-videoCodecOperation-07182
    如果 videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR,则 pNext必须包含一个 VkVideoEncodeH265ProfileInfoKHR 结构

  • VUID-VkVideoProfileInfoKHR-videoCodecOperation-10262
    如果 videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,则 pNext必须包含一个 VkVideoEncodeAV1ProfileInfoKHR 结构

有效用法(隐式)
  • VUID-VkVideoProfileInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR

  • VUID-VkVideoProfileInfoKHR-videoCodecOperation-parameter
    videoCodecOperation 必须是有效的 VkVideoCodecOperationFlagBitsKHR

  • VUID-VkVideoProfileInfoKHR-chromaSubsampling-parameter
    chromaSubsampling 必须是有效的 VkVideoChromaSubsamplingFlagBitsKHR 值的组合

  • VUID-VkVideoProfileInfoKHR-chromaSubsampling-requiredbitmask
    chromaSubsampling 必须不是 0

  • VUID-VkVideoProfileInfoKHR-lumaBitDepth-parameter
    lumaBitDepth 必须VkVideoComponentBitDepthFlagBitsKHR 值的有效组合。

  • VUID-VkVideoProfileInfoKHR-lumaBitDepth-requiredbitmask
    lumaBitDepth 不能0

  • VUID-VkVideoProfileInfoKHR-chromaBitDepth-parameter
    chromaBitDepth 必须VkVideoComponentBitDepthFlagBitsKHR 值的有效组合。

VkVideoProfileInfoKHR::videoCodecOperation 的可能值,指定视频配置文件使用的视频编解码操作类型和视频压缩标准如下:

// Provided by VK_KHR_video_queue
typedef enum VkVideoCodecOperationFlagBitsKHR {
    VK_VIDEO_CODEC_OPERATION_NONE_KHR = 0,
  // Provided by VK_KHR_video_encode_h264
    VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR = 0x00010000,
  // Provided by VK_KHR_video_encode_h265
    VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR = 0x00020000,
  // Provided by VK_KHR_video_decode_h264
    VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR = 0x00000001,
  // Provided by VK_KHR_video_decode_h265
    VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR = 0x00000002,
  // Provided by VK_KHR_video_decode_av1
    VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR = 0x00000004,
  // Provided by VK_KHR_video_encode_av1
    VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR = 0x00040000,
} VkVideoCodecOperationFlagBitsKHR;
  • VK_VIDEO_CODEC_OPERATION_NONE_KHR 指定不支持任何视频编解码操作。

  • VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 指定支持 H.264 解码操作

  • VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 指定支持 H.265 解码操作

  • VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 指定支持 AV1 解码操作

  • VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 指定支持 H.264 编码操作

  • VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 指定支持 H.265 编码操作

  • VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 指定支持 AV1 编码操作

// Provided by VK_KHR_video_queue
typedef VkFlags VkVideoCodecOperationFlagsKHR;

VkVideoCodecOperationFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoCodecOperationFlagBitsKHR 的掩码。

视频格式色度子采样由以下枚举定义:

// Provided by VK_KHR_video_queue
typedef enum VkVideoChromaSubsamplingFlagBitsKHR {
    VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR = 0,
    VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR = 0x00000001,
    VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR = 0x00000002,
    VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR = 0x00000004,
    VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR = 0x00000008,
} VkVideoChromaSubsamplingFlagBitsKHR;
  • VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR 指定格式为单色。

  • VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR 指定格式为 4:2:0 色度子采样,即两个色度分量在水平和垂直方向上的采样率均为亮度分量的一半。

  • VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR - 格式为 4:2:2 色度子采样,即两个色度分量在水平方向上的采样率均为亮度分量的一半。

  • VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR - 格式为 4:4:4 色度采样,即 Y′CBCR 格式的所有三个分量都以相同的速率采样,因此没有色度子采样。

有关色度子采样的更多详细信息,请参见 色度重建 部分。

// Provided by VK_KHR_video_queue
typedef VkFlags VkVideoChromaSubsamplingFlagsKHR;

VkVideoChromaSubsamplingFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoChromaSubsamplingFlagBitsKHR 的掩码。

视频格式分量位深度的可能值如下:

// Provided by VK_KHR_video_queue
typedef enum VkVideoComponentBitDepthFlagBitsKHR {
    VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR = 0,
    VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR = 0x00000001,
    VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR = 0x00000004,
    VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR = 0x00000010,
} VkVideoComponentBitDepthFlagBitsKHR;
  • VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR 指定分量位深度为 8 位。

  • VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR 指定分量位深度为 10 位。

  • VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR 指定分量位深度为 12 位。

// Provided by VK_KHR_video_queue
typedef VkFlags VkVideoComponentBitDepthFlagsKHR;

VkVideoComponentBitDepthFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoComponentBitDepthFlagBitsKHR 的掩码。

通过将 VkVideoDecodeUsageInfoKHR 结构添加到 VkVideoProfileInfoKHRpNext 链中,可以提供有关视频解码用例的更多信息。

VkVideoDecodeUsageInfoKHR 结构定义如下:

// Provided by VK_KHR_video_decode_queue
typedef struct VkVideoDecodeUsageInfoKHR {
    VkStructureType               sType;
    const void*                   pNext;
    VkVideoDecodeUsageFlagsKHR    videoUsageHints;
} VkVideoDecodeUsageInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • videoUsageHintsVkVideoDecodeUsageFlagBitsKHR 的位掩码,指定有关视频解码配置文件预期用途的提示。

有效用法(隐式)
  • VUID-VkVideoDecodeUsageInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR

  • VUID-VkVideoDecodeUsageInfoKHR-videoUsageHints-parameter
    videoUsageHints 必须VkVideoDecodeUsageFlagBitsKHR 值的有效组合。

以下位可以VkVideoDecodeUsageInfoKHR::videoUsageHints 中指定,作为有关视频解码用例的提示:

// Provided by VK_KHR_video_decode_queue
typedef enum VkVideoDecodeUsageFlagBitsKHR {
    VK_VIDEO_DECODE_USAGE_DEFAULT_KHR = 0,
    VK_VIDEO_DECODE_USAGE_TRANSCODING_BIT_KHR = 0x00000001,
    VK_VIDEO_DECODE_USAGE_OFFLINE_BIT_KHR = 0x00000002,
    VK_VIDEO_DECODE_USAGE_STREAMING_BIT_KHR = 0x00000004,
} VkVideoDecodeUsageFlagBitsKHR;
  • VK_VIDEO_DECODE_USAGE_TRANSCODING_BIT_KHR 指定视频解码旨在与视频编码结合使用,以使用相同和/或不同的编解码器转码视频码流。

  • VK_VIDEO_DECODE_USAGE_OFFLINE_BIT_KHR 指定视频解码旨在用于消费本地视频码流。

  • VK_VIDEO_DECODE_USAGE_STREAMING_BIT_KHR 指定视频解码旨在用于消费通过网络以连续流接收的视频码流。

对于应用程序可以指定的位的组合没有任何限制。但是,应用程序应该使用合理的组合,以便实现能够为特定用例选择最合适的操作模式。

// Provided by VK_KHR_video_decode_queue
typedef VkFlags VkVideoDecodeUsageFlagsKHR;

VkVideoDecodeUsageFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoDecodeUsageFlagBitsKHR 的掩码。

通过将 VkVideoEncodeUsageInfoKHR 结构添加到 VkVideoProfileInfoKHRpNext 链中,可以提供有关视频编码用例的更多信息。

VkVideoEncodeUsageInfoKHR 结构定义如下:

// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeUsageInfoKHR {
    VkStructureType                 sType;
    const void*                     pNext;
    VkVideoEncodeUsageFlagsKHR      videoUsageHints;
    VkVideoEncodeContentFlagsKHR    videoContentHints;
    VkVideoEncodeTuningModeKHR      tuningMode;
} VkVideoEncodeUsageInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • videoUsageHintsVkVideoEncodeUsageFlagBitsKHR 的位掩码,指定有关视频编码配置文件预期用途的提示。

  • videoContentHintsVkVideoEncodeContentFlagBitsKHR 的位掩码,指定有关要使用视频编码配置文件编码的内容的提示。

  • tuningMode 是一个 VkVideoEncodeTuningModeKHR 值,指定在使用视频配置文件进行编码时要使用的调整模式。

有效用法(隐式)
  • VUID-VkVideoEncodeUsageInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_USAGE_INFO_KHR

  • VUID-VkVideoEncodeUsageInfoKHR-videoUsageHints-parameter
    videoUsageHints 必须VkVideoEncodeUsageFlagBitsKHR 值的有效组合。

  • VUID-VkVideoEncodeUsageInfoKHR-videoContentHints-parameter
    videoContentHints 必须VkVideoEncodeContentFlagBitsKHR 值的有效组合。

  • VUID-VkVideoEncodeUsageInfoKHR-tuningMode-parameter
    如果 tuningMode 不为 0,则 tuningMode 必须是有效的 VkVideoEncodeTuningModeKHR 值。

以下位可以VkVideoEncodeUsageInfoKHR::videoUsageHints 中指定,作为有关视频编码用例的提示:

// Provided by VK_KHR_video_encode_queue
typedef enum VkVideoEncodeUsageFlagBitsKHR {
    VK_VIDEO_ENCODE_USAGE_DEFAULT_KHR = 0,
    VK_VIDEO_ENCODE_USAGE_TRANSCODING_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_USAGE_STREAMING_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_USAGE_RECORDING_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_USAGE_CONFERENCING_BIT_KHR = 0x00000008,
} VkVideoEncodeUsageFlagBitsKHR;
  • VK_VIDEO_ENCODE_USAGE_TRANSCODING_BIT_KHR 指定视频编码旨在与视频解码结合使用,以使用相同和/或不同的编解码器转码视频码流。

  • VK_VIDEO_ENCODE_USAGE_STREAMING_BIT_KHR 指定视频编码旨在用于生成预期作为通过网络连续发送的视频码流。

  • VK_VIDEO_ENCODE_USAGE_RECORDING_BIT_KHR 指定视频编码旨在用于离线消费的实时录制。

  • VK_VIDEO_ENCODE_USAGE_CONFERENCING_BIT_KHR 指定视频编码旨在用于视频会议场景。

对于应用程序可以指定的位的组合没有任何限制。但是,应用程序应该使用合理的组合,以便实现能够为特定用例选择最合适的操作模式。

// Provided by VK_KHR_video_encode_queue
typedef VkFlags VkVideoEncodeUsageFlagsKHR;

VkVideoEncodeUsageFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeUsageFlagBitsKHR 的掩码。

以下位可以在 VkVideoEncodeUsageInfoKHR::videoContentHints 中指定,作为关于编码视频内容的提示

// Provided by VK_KHR_video_encode_queue
typedef enum VkVideoEncodeContentFlagBitsKHR {
    VK_VIDEO_ENCODE_CONTENT_DEFAULT_KHR = 0,
    VK_VIDEO_ENCODE_CONTENT_CAMERA_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_CONTENT_DESKTOP_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_CONTENT_RENDERED_BIT_KHR = 0x00000004,
} VkVideoEncodeContentFlagBitsKHR;
  • VK_VIDEO_ENCODE_CONTENT_CAMERA_BIT_KHR 指定视频编码旨在用于编码相机内容。

  • VK_VIDEO_ENCODE_CONTENT_DESKTOP_BIT_KHR 指定视频编码旨在用于编码桌面内容。

  • VK_VIDEO_ENCODE_CONTENT_RENDERED_BIT_KHR 指定视频编码旨在用于编码渲染内容(例如,游戏内容)。

对应用程序可以指定的位的组合没有限制。但是,应用程序应该使用合理的组合,以便实现能够为特定内容类型选择最合适的运行模式。

// Provided by VK_KHR_video_encode_queue
typedef VkFlags VkVideoEncodeContentFlagsKHR;

VkVideoEncodeContentFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeContentFlagBitsKHR 的掩码。

可能的视频编码调整模式值如下:

// Provided by VK_KHR_video_encode_queue
typedef enum VkVideoEncodeTuningModeKHR {
    VK_VIDEO_ENCODE_TUNING_MODE_DEFAULT_KHR = 0,
    VK_VIDEO_ENCODE_TUNING_MODE_HIGH_QUALITY_KHR = 1,
    VK_VIDEO_ENCODE_TUNING_MODE_LOW_LATENCY_KHR = 2,
    VK_VIDEO_ENCODE_TUNING_MODE_ULTRA_LOW_LATENCY_KHR = 3,
    VK_VIDEO_ENCODE_TUNING_MODE_LOSSLESS_KHR = 4,
} VkVideoEncodeTuningModeKHR;
  • VK_VIDEO_ENCODE_TUNING_MODE_DEFAULT_KHR 指定默认调整模式。

  • VK_VIDEO_ENCODE_TUNING_MODE_HIGH_QUALITY_KHR 指定视频编码针对高质量进行调整。当使用此调整模式时,实现可能会牺牲视频编码操作的延迟来提高质量。

  • VK_VIDEO_ENCODE_TUNING_MODE_LOW_LATENCY_KHR 指定视频编码针对低延迟进行调整。当使用此调整模式时,实现可能会牺牲质量来提高性能并降低视频编码操作的延迟。

  • VK_VIDEO_ENCODE_TUNING_MODE_ULTRA_LOW_LATENCY_KHR 指定视频编码针对超低延迟进行调整。当使用此调整模式时,实现可能会牺牲质量,以最大化性能并最小化视频编码操作的延迟。

  • VK_VIDEO_ENCODE_TUNING_MODE_LOSSLESS_KHR 指定视频编码针对无损编码进行调整。当使用此调整模式时,视频编码操作会产生无损输出。

VkVideoProfileListInfoKHR 结构定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkVideoProfileListInfoKHR {
    VkStructureType                 sType;
    const void*                     pNext;
    uint32_t                        profileCount;
    const VkVideoProfileInfoKHR*    pProfiles;
} VkVideoProfileListInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • profileCountpProfiles 数组中的元素数量。

  • pProfiles 是指向 VkVideoProfileInfoKHR 结构数组的指针。

视频转码是需要在各种上下文中指定多个配置文件的用例示例。

当应用程序在配置文件列表中提供一个视频解码配置文件和一个或多个视频编码配置文件时,实现会确保返回的任何能力或创建的资源都适用于视频转码用例,而无需手动数据转换。

有效用法
  • VUID-VkVideoProfileListInfoKHR-pProfiles-06813
    pProfiles 必须不能包含多个其 videoCodecOperation 成员指定解码操作的元素

有效用法(隐式)
  • VUID-VkVideoProfileListInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR

  • VUID-VkVideoProfileListInfoKHR-pProfiles-parameter
    如果 profileCount 不为 0,则 pProfiles 必须是指向 profileCount 个有效的 VkVideoProfileInfoKHR 结构数组的有效指针

视频能力

视频编码能力

要查询特定视频配置文件的视频编码能力,请调用

// Provided by VK_KHR_video_queue
VkResult vkGetPhysicalDeviceVideoCapabilitiesKHR(
    VkPhysicalDevice                            physicalDevice,
    const VkVideoProfileInfoKHR*                pVideoProfile,
    VkVideoCapabilitiesKHR*                     pCapabilities);
  • physicalDevice 是要从中查询视频解码或编码能力的物理设备。

  • pVideoProfile 是指向 VkVideoProfileInfoKHR 结构的指针。

  • pCapabilities 是指向 VkVideoCapabilitiesKHR 结构的指针,该结构中返回能力。

如果 pVideoProfile 描述的视频配置文件受实现支持,则此命令返回 VK_SUCCESS,并且 pCapabilities 将填充指定视频配置文件支持的能力。否则,返回视频配置文件特定错误代码之一。

有效用法
  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pVideoProfile-07183
    如果 pVideoProfile->videoCodecOperation 指定解码操作,则 pCapabilitiespNext必须包含 VkVideoDecodeCapabilitiesKHR 结构

  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pVideoProfile-07184
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR,则 pCapabilitiespNext必须包含 VkVideoDecodeH264CapabilitiesKHR 结构

  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pVideoProfile-07185
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR,则 pCapabilitiespNext必须包含 VkVideoDecodeH265CapabilitiesKHR 结构

  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pVideoProfile-09257
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR,则 pCapabilitiespNext必须包含 VkVideoDecodeAV1CapabilitiesKHR 结构

  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pVideoProfile-07186
    如果 pVideoProfile->videoCodecOperation 指定编码操作,则 pCapabilitiespNext必须包含 VkVideoEncodeCapabilitiesKHR 结构

  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pVideoProfile-07187
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR,则 pCapabilitiespNext必须包含 VkVideoEncodeH264CapabilitiesKHR 结构

  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pVideoProfile-07188
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR,则 pCapabilitiespNext必须包含 VkVideoEncodeH265CapabilitiesKHR 结构

  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pVideoProfile-10263
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,则 pCapabilitiespNext必须包含 VkVideoEncodeAV1CapabilitiesKHR 结构

有效用法(隐式)
  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-physicalDevice-parameter
    physicalDevice 必须是有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pVideoProfile-parameter
    pVideoProfile 必须 是指向有效 VkVideoProfileInfoKHR 结构的有效指针。

  • VUID-vkGetPhysicalDeviceVideoCapabilitiesKHR-pCapabilities-parameter
    pCapabilities 必须 是指向 VkVideoCapabilitiesKHR 结构的有效指针。

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR

VkVideoCapabilitiesKHR 结构定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkVideoCapabilitiesKHR {
    VkStructureType              sType;
    void*                        pNext;
    VkVideoCapabilityFlagsKHR    flags;
    VkDeviceSize                 minBitstreamBufferOffsetAlignment;
    VkDeviceSize                 minBitstreamBufferSizeAlignment;
    VkExtent2D                   pictureAccessGranularity;
    VkExtent2D                   minCodedExtent;
    VkExtent2D                   maxCodedExtent;
    uint32_t                     maxDpbSlots;
    uint32_t                     maxActiveReferencePictures;
    VkExtensionProperties        stdHeaderVersion;
} VkVideoCapabilitiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkVideoCapabilityFlagBitsKHR 的位掩码,指定功能标志。

  • minBitstreamBufferOffsetAlignment 是码流缓冲区偏移的最小对齐值。

  • minBitstreamBufferSizeAlignment 是码流缓冲区范围大小的最小对齐值。

  • pictureAccessGranularity 是对视频图像资源进行图像访问的粒度。

  • minCodedExtent 是编码帧的最小宽度和高度。

  • maxCodedExtent 是编码帧的最大宽度和高度。

  • maxDpbSlots 是单个视频会话支持的 DPB 插槽的最大数量。

  • maxActiveReferencePictures 是单个视频编码操作可以使用的活动参考图像的最大数量。

  • stdHeaderVersion 是一个 VkExtensionProperties 结构,报告视频配置文件支持的 Video Std 头名称和版本。

视频压缩标准通常允许将与活动 DPB 插槽关联的所有参考图像用作活动参考图像,因此对于视频解码配置文件,maxDpbSlotsmaxActiveReferencePictures 中返回的值通常相等。同样,对于支持场图像的视频解码配置文件,maxActiveReferencePictures 的值通常等于 maxDpbSlots × 2

有效用法(隐式)

可以在 VkVideoCapabilitiesKHR::flags 中设置的位是:

// Provided by VK_KHR_video_queue
typedef enum VkVideoCapabilityFlagBitsKHR {
    VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
    VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0x00000002,
} VkVideoCapabilityFlagBitsKHR;
  • VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR 指定视频会话支持生成和使用受保护的内容。

  • VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR 指示与视频会话的 DPB 插槽关联的视频图像资源可以由单独的 VkImage 对象支持。如果不存在此功能标志,则视频会话的所有 DPB 插槽必须与由同一个 VkImage 对象(例如,使用同一图像的不同层)支持的视频图像资源关联。

// Provided by VK_KHR_video_queue
typedef VkFlags VkVideoCapabilityFlagsKHR;

VkVideoCapabilityFlagsKHR 是一种位掩码类型,用于设置零个或多个 VkVideoCapabilityFlagBitsKHR 的掩码。

视频格式功能

要枚举特定视频配置文件支持的视频格式和相应的功能,请调用:

// Provided by VK_KHR_video_queue
VkResult vkGetPhysicalDeviceVideoFormatPropertiesKHR(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceVideoFormatInfoKHR*   pVideoFormatInfo,
    uint32_t*                                   pVideoFormatPropertyCount,
    VkVideoFormatPropertiesKHR*                 pVideoFormatProperties);
  • physicalDevice 是从中查询视频格式属性的物理设备。

  • pVideoFormatInfo 是指向 VkPhysicalDeviceVideoFormatInfoKHR 结构的指针,该结构指定要返回支持的图像格式和功能的使用情况和视频配置文件。

  • pVideoFormatPropertyCount 是指向整数的指针,该整数与可用或查询的视频格式属性的数量有关,如下所述。

  • pVideoFormatProperties 是指向 VkVideoFormatPropertiesKHR 结构数组的指针,其中返回支持的图像格式和功能。

如果 pVideoFormatPropertiesNULL,则在 pVideoFormatPropertyCount 中返回给定 physicalDevice 支持的视频格式属性的数量。否则,pVideoFormatPropertyCount 必须指向应用程序设置为 pVideoFormatProperties 数组中元素数量的变量,并且在返回时,该变量将被实际写入 pVideoFormatProperties 的值的数量覆盖。如果 pVideoFormatPropertyCount 的值小于支持的视频格式属性的数量,则最多将 pVideoFormatPropertyCount 个值写入 pVideoFormatProperties,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非返回所有可用的值。

视频格式属性始终针对一组特定的视频配置文件进行查询。这些是通过将 VkVideoProfileListInfoKHR 结构链接到 pVideoFormatInfo 来指定的。

对于大多数用例,图像由单个视频会话使用,并提供单个视频配置文件。对于视频转码等用例,其中解码会话输出图像可以用作一个或多个编码会话中的编码输入,必须提供与将共享图像的视频会话相对应的多个视频配置文件。

如果通过 VkVideoProfileListInfoKHR::pProfiles 指定的任何视频配置文件不受支持,则此命令将返回特定于视频配置文件的错误代码之一。此外,如果 VkPhysicalDeviceVideoFormatInfoKHR::imageUsage 包含指定视频配置文件不支持的任何图像使用标志,则此命令将返回 VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR

如果 VkPhysicalDeviceVideoFormatInfoKHR::imageUsage 不包含 VkVideoDecodeCapabilitiesKHR::flags 中返回的解码功能标志所指示的相应标志,则此命令还会返回 VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR, 这针对在 pVideoFormatInfopNext 链中提供的 VkVideoProfileListInfoKHR 结构中指定的任何配置文件。

如果解码功能标志包括 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR 但不包括 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR,那么为了查询解码 DPB 和输出用法的视频格式属性,VkPhysicalDeviceVideoFormatInfoKHR::imageUsage 必须同时包括 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHRVK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR。否则,调用将失败并返回 VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR

如果解码能力标志包含 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR 但不包含 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR,为了查询用于解码 DPB 的视频格式属性,VkPhysicalDeviceVideoFormatInfoKHR::imageUsage 必须 包含 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR,但不能包含 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR。否则,调用将失败,并返回 VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR。类似地,为了查询用于解码输出的视频格式属性,VkPhysicalDeviceVideoFormatInfoKHR::imageUsage 必须 包含 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,但不能包含 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR。否则,调用将失败,并返回 VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR

VkPhysicalDeviceVideoFormatInfoKHR 结构的 imageUsage 成员指定了返回的视频格式必须支持的预期视频用途标志。相应地,返回的每个 VkVideoFormatPropertiesKHR 结构的 imageUsageFlags 成员将至少包含相同的图像用途标志集。

如果实现支持在视频解码/编码之外的其他操作中使用特定格式的图像,则返回的相应 VkVideoFormatPropertiesKHR 结构的 imageUsageFlags 成员将包含额外的图像用途标志,指示这一点。

对于大多数用例,只会指定与解码或编码相关的用途标志。对于诸如转码之类的用例,如果要解码和编码会话共享图像,则可以同时设置解码和编码相关的用途标志。

可以返回多个具有相同 format 成员但具有不同 componentMappingimageTypeimageTiling 值的 VkVideoFormatPropertiesKHR 条目,如下所述。

如果 VkPhysicalDeviceVideoFormatInfoKHR::imageUsageFlags 包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR,则当查询的量化映射类型支持多个不同的 量化映射纹素大小 时,可以返回多个具有相同 formatcomponentMappingimageTypeimageTiling 成员值,但在 VkVideoFormatQuantizationMapPropertiesKHR 结构(如果包含在 VkVideoFormatPropertiesKHR::pNext 链中)中返回不同 quantizationMapTexelSizeVkVideoFormatPropertiesKHR 条目。

此外,根据 VkPhysicalDeviceVideoFormatInfoKHR 结构的 imageUsage 成员,即使对于同一组视频配置文件,也可以返回不同的 VkVideoFormatPropertiesKHR 条目集,例如,基于请求编码输入、编码 DPB、解码输出和/或解码 DPB 用途。

应用程序可以选择 VkVideoFormatPropertiesKHR 条目中返回的参数,并在创建输入、输出和 DPB 图像时使用兼容的参数。实现将报告所有用于所请求视频配置文件的图像的有效图像创建和用途标志,但应用程序应该仅使用那些特定用例所必需的标志创建图像。

在创建图像之前,应用程序可以通过调用 vkGetPhysicalDeviceImageFormatProperties2 并使用从报告的 VkVideoFormatPropertiesKHR 条目之一的成员派生的参数,以及将相同的 VkVideoProfileListInfoKHR 结构添加到 VkPhysicalDeviceImageFormatInfo2pNext 链中,来获取支持的完整图像格式特性集。

以下内容适用于 vkGetPhysicalDeviceVideoFormatPropertiesKHR 返回的所有 VkVideoFormatPropertiesKHR 条目

  • 当使用 VkVideoFormatPropertiesKHR::format 调用时,vkGetPhysicalDeviceFormatProperties2 必须成功。

  • 如果 VkVideoFormatPropertiesKHR::imageTilingVK_IMAGE_TILING_OPTIMAL,则 vkGetPhysicalDeviceFormatProperties2 返回的 optimalTilingFeatures 必须包含该格式在 VkVideoFormatPropertiesKHR::imageUsageFlags 中报告的图像用途标志所需的所有格式特性,如格式特性依赖的用途标志部分所示。

  • 如果 VkVideoFormatPropertiesKHR::imageTilingVK_IMAGE_TILING_LINEAR,则 vkGetPhysicalDeviceFormatProperties2 返回的 linearTilingFeatures 必须包含该格式在 VkVideoFormatPropertiesKHR::imageUsageFlags 中报告的图像用途标志所需的所有格式特性,如格式特性依赖的用途标志部分所示。

  • 当使用包含以下信息的 VkPhysicalDeviceImageFormatInfo2 结构调用 vkGetPhysicalDeviceImageFormatProperties2 时,必须成功。

    • pNext 链包括用于调用 vkGetPhysicalDeviceVideoFormatPropertiesKHR 的同一 VkVideoProfileListInfoKHR 结构。

    • format 设置为 VkVideoFormatPropertiesKHR::format 的值。

    • type 设置为 VkVideoFormatPropertiesKHR::imageType 的值。

    • tiling 设置为 VkVideoFormatPropertiesKHR::imageTiling 的值。

    • usage 设置为 VkVideoFormatPropertiesKHR::imageUsageFlags 的值。

    • flags 设置为 VkVideoFormatPropertiesKHR::imageCreateFlags 的值。

VkVideoFormatPropertiesKHRcomponentMapping 成员定义了从 VkVideoProfileListInfoKHR 中指定的视频编解码器操作的角度来看的 Y′CBCR 颜色通道的排序。例如,如果实现生成格式为 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM 的视频解码输出,其中蓝色和红色色度通道被交换,则相应 VkVideoFormatPropertiesKHR 结构的 componentMapping 成员将具有以下成员值

components.r = VK_COMPONENT_SWIZZLE_B;        // Cb component
components.g = VK_COMPONENT_SWIZZLE_IDENTITY; // Y component
components.b = VK_COMPONENT_SWIZZLE_R;        // Cr component
components.a = VK_COMPONENT_SWIZZLE_IDENTITY; // unused, defaults to 1.0
有效用法
  • VUID-vkGetPhysicalDeviceVideoFormatPropertiesKHR-pNext-06812
    pVideoFormatInfopNext必须包含一个 profileCount 大于 0VkVideoProfileListInfoKHR 结构

有效用法(隐式)
  • VUID-vkGetPhysicalDeviceVideoFormatPropertiesKHR-physicalDevice-parameter
    physicalDevice 必须是有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceVideoFormatPropertiesKHR-pVideoFormatInfo-parameter
    pVideoFormatInfo 必须是指向有效的 VkPhysicalDeviceVideoFormatInfoKHR 结构的有效指针

  • VUID-vkGetPhysicalDeviceVideoFormatPropertiesKHR-pVideoFormatPropertyCount-parameter
    pVideoFormatPropertyCount 必须是指向 uint32_t 值的有效指针

  • VUID-vkGetPhysicalDeviceVideoFormatPropertiesKHR-pVideoFormatProperties-parameter
    如果 pVideoFormatPropertyCount 引用的值不为 0,且 pVideoFormatProperties 不为 NULL,则 pVideoFormatProperties 必须是指向 pVideoFormatPropertyCountVkVideoFormatPropertiesKHR 结构数组的有效指针

返回值
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR

VkPhysicalDeviceVideoFormatInfoKHR 结构定义为

// Provided by VK_KHR_video_queue
typedef struct VkPhysicalDeviceVideoFormatInfoKHR {
    VkStructureType      sType;
    const void*          pNext;
    VkImageUsageFlags    imageUsage;
} VkPhysicalDeviceVideoFormatInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • imageUsage 是一个 VkImageUsageFlagBits 的位掩码,指定视频图像的预期用途。

有效用法(隐式)
  • VUID-VkPhysicalDeviceVideoFormatInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR

  • VUID-VkPhysicalDeviceVideoFormatInfoKHR-pNext-pNext
    pNext 必须NULL 或指向 VkVideoProfileListInfoKHR 有效实例的指针

  • VUID-VkPhysicalDeviceVideoFormatInfoKHR-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkPhysicalDeviceVideoFormatInfoKHR-imageUsage-parameter
    imageUsage 必须VkImageUsageFlagBits 值的有效组合

  • VUID-VkPhysicalDeviceVideoFormatInfoKHR-imageUsage-requiredbitmask
    imageUsage 必须 不为 0

VkVideoFormatPropertiesKHR 结构定义如下

// Provided by VK_KHR_video_queue
typedef struct VkVideoFormatPropertiesKHR {
    VkStructureType       sType;
    void*                 pNext;
    VkFormat              format;
    VkComponentMapping    componentMapping;
    VkImageCreateFlags    imageCreateFlags;
    VkImageType           imageType;
    VkImageTiling         imageTiling;
    VkImageUsageFlags     imageUsageFlags;
} VkVideoFormatPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • format 是一个 VkFormat,指定可以与指定的视频配置文件和图像用途一起使用的格式。

  • componentMapping 定义了用于格式的颜色通道顺序。format 以及 componentMapping 描述了在生成视频解码器输出时或在视频编码器输入中预期如何排列颜色通道(如果适用)。如果报告的 format 不需要组件交换,则 componentMapping 的所有成员都将设置为 VK_COMPONENT_SWIZZLE_IDENTITY

  • imageCreateFlags 是一个 VkImageCreateFlagBits 的位掩码,指定了该格式支持的图像创建标志。

  • imageType 是一个 VkImageType,指定了该格式可以使用的图像类型。

  • imageTiling 是一个 VkImageTiling,指定了该格式可以使用的图像平铺方式。

  • imageUsageFlags 是一个 VkImageUsageFlagBits 的位掩码,指定了该格式支持的图像用途标志。

有效用法(隐式)

对于一组图像用途标志,关于 视频配置文件支持的视频格式属性列表定义为 VkVideoFormatPropertiesKHR 结构及其 pNext 链中包含的任何结构的列表,通过调用 vkGetPhysicalDeviceVideoFormatPropertiesKHR 获得,其中 VkPhysicalDeviceVideoFormatInfoKHR::imageUsage 等于有问题的 VkImageUsageFlags,并且 VkPhysicalDeviceVideoFormatInfoKHR::pNext 链包含一个 VkVideoProfileListInfoKHR 结构,其 pProfiles 成员包含一个指定 VkVideoProfileInfoKHR 结构链的单个数组元素,用于描述有问题的视频配置文件。

视频会话

视频会话是对象,表示并维护使用特定视频配置文件执行视频解码或编码操作所需的状态。

对于视频编码配置文件,这包括当前的码率控制配置和当前设置的视频编码质量级别

视频会话由 VkVideoSessionKHR 句柄表示

// Provided by VK_KHR_video_queue
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionKHR)

创建视频会话

要创建视频会话对象,请调用

// Provided by VK_KHR_video_queue
VkResult vkCreateVideoSessionKHR(
    VkDevice                                    device,
    const VkVideoSessionCreateInfoKHR*          pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkVideoSessionKHR*                          pVideoSession);
  • device 是创建视频会话的逻辑设备。

  • pCreateInfo 是指向 VkVideoSessionCreateInfoKHR 结构的指针,该结构包含用于创建视频会话的参数。

  • pAllocator 控制主机内存分配,如内存分配章节中所述。

  • pVideoSession 是指向 VkVideoSessionKHR 句柄的指针,其中返回生成的视频会话对象。

生成的视频会话对象被称为使用 pCreateInfo->pVideoProfile→videoCodecOperation 中指定的视频编解码操作创建的。

要与视频会话一起使用的编解码器特定视频标准标头的名称和版本由 pCreateInfo->pStdHeaderVersion 指向的 VkExtensionProperties 结构指定。如果 pCreateInfo->pStdHeaderVersion→specVersion 中指定了不存在或不支持的视频标准标头版本,则此命令返回 VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR

视频会话对象以未初始化状态创建。为了将视频会话转换为初始状态,应用程序必须发出一个 vkCmdControlVideoCodingKHR 命令,其中 VkVideoCodingControlInfoKHR::flags 包括 VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR

视频会话对象还维护 DPB 的状态。与创建的视频会话一起使用的 DPB 插槽的数量在 pCreateInfo->maxDpbSlots 中指定,并且每个插槽最初都处于非活动状态

创建的视频会话维护的每个DPB 插槽可以引用表示视频帧的参考帧

此外,如果 pCreateInfo->pVideoProfile 指向的 VkVideoProfileInfoKHR 结构的 videoCodecOperation 成员为 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR,并且 VkVideoProfileInfoKHR::pNext 链中提供的 VkVideoDecodeH264ProfileInfoKHR 结构的 pictureLayout 成员不是 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR,则创建的视频会话支持隔行帧,并且创建的视频会话维护的每个 DPB 插槽 可以改为引用单独的顶场和底场参考帧,它们共同可以表示一个完整的视频帧。在这种情况下,由应用程序根据视频内容来决定是否将任何单独的 DPB 插槽与单独的顶场和/或底场帧或表示完整帧的单个帧相关联。

可以使用创建的视频会话来执行视频编码操作,使用最大大小为 pCreateInfo->maxCodedExtent 中指定的视频帧。允许的最小帧大小隐式地从 VkVideoCapabilitiesKHR::minCodedExtent 中导出,如 vkGetPhysicalDeviceVideoCapabilitiesKHRpCreateInfo->pVideoProfile 指定的视频配置文件返回。因此,创建的视频会话被称为使用等于该值的 minCodedExtent 创建的。

如果视频会话对象是通过视频编码操作创建的,如果任何指定的视频标准参数不符合所用视频压缩标准的语法或语义要求,或者如果根据所用视频压缩标准定义的规则从参数导出的值不符合视频压缩标准或实现的能力,则实现可能返回 VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR 错误。

应用程序不应依赖任何命令返回 VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR 错误来验证视频标准参数,因为实现不要求在任何特定情况下报告此错误。

有效用法(隐式)
  • VUID-vkCreateVideoSessionKHR-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkCreateVideoSessionKHR-pCreateInfo-parameter
    pCreateInfo 必须是一个指向有效 VkVideoSessionCreateInfoKHR 结构的有效指针

  • VUID-vkCreateVideoSessionKHR-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是一个指向有效的 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateVideoSessionKHR-pVideoSession-parameter
    pVideoSession 必须是一个指向 VkVideoSessionKHR 句柄的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR

  • VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR

VkVideoSessionCreateInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkVideoSessionCreateInfoKHR {
    VkStructureType                 sType;
    const void*                     pNext;
    uint32_t                        queueFamilyIndex;
    VkVideoSessionCreateFlagsKHR    flags;
    const VkVideoProfileInfoKHR*    pVideoProfile;
    VkFormat                        pictureFormat;
    VkExtent2D                      maxCodedExtent;
    VkFormat                        referencePictureFormat;
    uint32_t                        maxDpbSlots;
    uint32_t                        maxActiveReferencePictures;
    const VkExtensionProperties*    pStdHeaderVersion;
} VkVideoSessionCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • queueFamilyIndex 是将要使用创建的视频会话的队列族的索引。

  • flags 是一个 VkVideoSessionCreateFlagBitsKHR 的位掩码,用于指定创建标志。

  • pVideoProfile 是一个指向 VkVideoProfileInfoKHR 结构的指针,用于指定将要使用创建的视频会话的视频配置文件。

  • pictureFormat 是将要使用创建的视频会话的图像格式。如果 pVideoProfile->videoCodecOperation 指定了解码操作,则 pictureFormat 是可与创建的视频会话一起使用的解码输出图像的图像格式。如果 pVideoProfile->videoCodecOperation 指定了编码操作,则 pictureFormat 是可与创建的视频会话一起使用的编码输入图像的图像格式。

  • maxCodedExtent 是将要使用创建的视频会话的编码帧的最大宽度和高度。

  • referencePictureFormat 是存储在DPB中的参考图像的图像格式,该 DPB 将用于创建的视频会话。

  • maxDpbSlots 是可以与创建的视频会话一起使用的DPB 插槽的最大数量。

  • maxActiveReferencePictures 是在单个视频编码操作中使用创建的视频会话时可以使用的活动参考图像的最大数量。

  • pStdHeaderVersion 是一个指向 VkExtensionProperties 结构的指针,用于请求为 pVideoProfile 中指定的 videoCodecOperation 使用的视频标准头版本。

有效用法
  • VUID-VkVideoSessionCreateInfoKHR-protectedMemory-07189
    如果未启用protectedMemory功能,或者如果VkVideoCapabilitiesKHR::flags不包含 VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR(如 vkGetPhysicalDeviceVideoCapabilitiesKHRpVideoProfile 指定的视频配置文件返回的结果所示),则 flags 必须不包含 VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR

  • VUID-VkVideoSessionCreateInfoKHR-flags-08371
    如果 flags 包含 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR,则必须启用videoMaintenance1

  • VUID-VkVideoSessionCreateInfoKHR-flags-10264
    如果 flags 包含 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR,则必须启用videoEncodeQuantizationMap功能

  • VUID-VkVideoSessionCreateInfoKHR-flags-10265
    如果 flags 包含 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR,则 pVideoProfile->videoCodecOperation 必须指定编码操作

  • VUID-VkVideoSessionCreateInfoKHR-flags-10266
    如果 flags 包含 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR,则它必须不能同时包含 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR

  • VUID-VkVideoSessionCreateInfoKHR-flags-10267
    如果 VkVideoEncodeCapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR(如 vkGetPhysicalDeviceVideoCapabilitiesKHRpVideoProfile 指定的视频配置文件返回的结果所示),则 flags 必须不包含 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR

  • VUID-VkVideoSessionCreateInfoKHR-flags-10268
    如果 VkVideoEncodeCapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR(如 vkGetPhysicalDeviceVideoCapabilitiesKHRpVideoProfile 指定的视频配置文件返回的结果所示),则 flags 必须不包含 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR

  • VUID-VkVideoSessionCreateInfoKHR-pVideoProfile-04845
    pVideoProfile 必须是一个支持的视频配置文件

  • VUID-VkVideoSessionCreateInfoKHR-maxDpbSlots-04847
    maxDpbSlots 必须小于或等于 VkVideoCapabilitiesKHR::maxDpbSlots(如 vkGetPhysicalDeviceVideoCapabilitiesKHRpVideoProfile 指定的视频配置文件返回的结果所示)

  • VUID-VkVideoSessionCreateInfoKHR-maxActiveReferencePictures-04849
    maxActiveReferencePictures 必须小于或等于 VkVideoCapabilitiesKHR::maxActiveReferencePictures(如 vkGetPhysicalDeviceVideoCapabilitiesKHRpVideoProfile 指定的视频配置文件返回的结果所示)

  • VUID-VkVideoSessionCreateInfoKHR-maxDpbSlots-04850
    如果 maxDpbSlotsmaxActiveReferencePictures 中的任何一个是 0,则两者必须均为 0

  • VUID-VkVideoSessionCreateInfoKHR-maxCodedExtent-04851
    maxCodedExtent 必须介于 VkVideoCapabilitiesKHR::minCodedExtentVkVideoCapabilitiesKHR::maxCodedExtent(包含端点)之间,如 vkGetPhysicalDeviceVideoCapabilitiesKHRpVideoProfile 指定的视频配置文件返回的结果所示

  • VUID-VkVideoSessionCreateInfoKHR-referencePictureFormat-04852
    如果 pVideoProfile->videoCodecOperation 指定的是解码操作,且 maxActiveReferencePictures 大于 0,那么 referencePictureFormat 必须vkGetPhysicalDeviceVideoFormatPropertiesKHR 返回的受支持的解码 DPB 格式之一,该格式在 VkVideoFormatPropertiesKHR::format 中返回,当调用该函数时,其 pVideoFormatInfo 参数的 imageUsage 成员包含 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR,且其 pVideoFormatInfo 参数的 pNext 链中指定了一个 VkVideoProfileListInfoKHR 结构,该结构的 pProfiles 成员包含一个与 pVideoProfile 匹配的元素。

  • VUID-VkVideoSessionCreateInfoKHR-referencePictureFormat-06814
    如果 pVideoProfile->videoCodecOperation 指定的是编码操作,且 maxActiveReferencePictures 大于 0,那么 referencePictureFormat 必须vkGetPhysicalDeviceVideoFormatPropertiesKHR 返回的受支持的编码 DPB 格式之一,该格式在 VkVideoFormatPropertiesKHR::format 中返回,当调用该函数时,其 pVideoFormatInfo 参数的 imageUsage 成员包含 VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR,且其 pVideoFormatInfo 参数的 pNext 链中指定了一个 VkVideoProfileListInfoKHR 结构,该结构的 pProfiles 成员包含一个与 pVideoProfile 匹配的元素。

  • VUID-VkVideoSessionCreateInfoKHR-pictureFormat-04853
    如果 pVideoProfile->videoCodecOperation 指定的是解码操作,那么 pictureFormat 必须vkGetPhysicalDeviceVideoFormatPropertiesKHR 返回的受支持的解码输出格式之一,该格式在 VkVideoFormatPropertiesKHR::format 中返回,当调用该函数时,其 pVideoFormatInfo 参数的 imageUsage 成员包含 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,且其 pVideoFormatInfo 参数的 pNext 链中指定了一个 VkVideoProfileListInfoKHR 结构,该结构的 pProfiles 成员包含一个与 pVideoProfile 匹配的元素。

  • VUID-VkVideoSessionCreateInfoKHR-pictureFormat-04854
    如果 pVideoProfile->videoCodecOperation 指定的是编码操作,那么 pictureFormat 必须vkGetPhysicalDeviceVideoFormatPropertiesKHR 返回的受支持的编码输入格式之一,该格式在 VkVideoFormatPropertiesKHR::format 中返回,当调用该函数时,其 pVideoFormatInfo 参数的 imageUsage 成员包含 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR,且其 pVideoFormatInfo 参数的 pNext 链中指定了一个 VkVideoProfileListInfoKHR 结构,该结构的 pProfiles 成员包含一个与 pVideoProfile 匹配的元素。

  • VUID-VkVideoSessionCreateInfoKHR-pStdHeaderVersion-07190
    pStdHeaderVersion->extensionName 必须VkVideoCapabilitiesKHR::stdHeaderVersion.extensionName 相匹配,后者由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对 pVideoProfile 指定的视频配置文件返回。

  • VUID-VkVideoSessionCreateInfoKHR-pStdHeaderVersion-07191
    pStdHeaderVersion->specVersion 必须小于或等于 VkVideoCapabilitiesKHR::stdHeaderVersion.specVersion,后者由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对 pVideoProfile 指定的视频配置文件返回。

  • VUID-VkVideoSessionCreateInfoKHR-pVideoProfile-08251
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 并且此结构的 pNext 链包含 VkVideoEncodeH264SessionCreateInfoKHR 结构,那么它的 maxLevelIdc 成员 必须小于或等于 VkVideoEncodeH264CapabilitiesKHR::maxLevelIdc,后者由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对 pVideoProfile 中指定的视频配置文件返回。

  • VUID-VkVideoSessionCreateInfoKHR-pVideoProfile-08252
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 并且此结构的 pNext 链包含 VkVideoEncodeH265SessionCreateInfoKHR 结构,那么它的 maxLevelIdc 成员 必须小于或等于 VkVideoEncodeH265CapabilitiesKHR::maxLevelIdc,后者由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对 pVideoProfile 中指定的视频配置文件返回。

  • VUID-VkVideoSessionCreateInfoKHR-pVideoProfile-10269
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,那么 videoEncodeAV1 功能 必须被启用。

  • VUID-VkVideoSessionCreateInfoKHR-pVideoProfile-10270
    如果 pVideoProfile->videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 并且此结构的 pNext 链包含 VkVideoEncodeAV1SessionCreateInfoKHR 结构,那么它的 maxLevel 成员 必须小于或等于 VkVideoEncodeAV1CapabilitiesKHR::maxLevel,后者由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对 pVideoProfile 中指定的视频配置文件返回。

有效用法(隐式)
  • VUID-VkVideoSessionCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR

  • VUID-VkVideoSessionCreateInfoKHR-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员 必须NULL 或指向 VkVideoEncodeAV1SessionCreateInfoKHRVkVideoEncodeH264SessionCreateInfoKHRVkVideoEncodeH265SessionCreateInfoKHR 的有效实例的指针。

  • VUID-VkVideoSessionCreateInfoKHR-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkVideoSessionCreateInfoKHR-flags-parameter
    flags 必须VkVideoSessionCreateFlagBitsKHR 值的有效组合。

  • VUID-VkVideoSessionCreateInfoKHR-pVideoProfile-parameter
    pVideoProfile 必须 是指向有效 VkVideoProfileInfoKHR 结构的有效指针。

  • VUID-VkVideoSessionCreateInfoKHR-pictureFormat-parameter
    pictureFormat 必须是一个有效的 VkFormat

  • VUID-VkVideoSessionCreateInfoKHR-referencePictureFormat-parameter
    referencePictureFormat 必须是一个有效的 VkFormat

  • VUID-VkVideoSessionCreateInfoKHR-pStdHeaderVersion-parameter
    pStdHeaderVersion 必须是一个指向有效 VkExtensionProperties 结构的有效指针

VkVideoSessionCreateInfoKHR::flags可以设置的位有

// Provided by VK_KHR_video_queue
typedef enum VkVideoSessionCreateFlagBitsKHR {
    VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
  // Provided by VK_KHR_video_encode_queue
    VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_PARAMETER_OPTIMIZATIONS_BIT_KHR = 0x00000002,
  // Provided by VK_KHR_video_maintenance1
    VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR = 0x00000004,
  // Provided by VK_KHR_video_encode_quantization_map
    VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x00000008,
  // Provided by VK_KHR_video_encode_quantization_map
    VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x00000010,
} VkVideoSessionCreateFlagBitsKHR;
  • VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR 指定视频会话使用受保护的视频内容。

  • VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_PARAMETER_OPTIMIZATIONS_BIT_KHR 指定允许实现根据 视频配置文件 和使用的 视频编码质量级别 中指定的用例信息,覆盖视频会话参数和其他编解码器特定的编码参数,以优化视频编码操作。

    不指定 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_PARAMETER_OPTIMIZATIONS_BIT_KHR 并不能保证实现不会进行任何编解码器特定的参数覆盖,因为某些覆盖对于视频编码器实现的正确操作是必要的,这是由于该实现上可用的编码工具的限制所致。 然而,此标志允许实现应用进一步的优化覆盖。

  • VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 指定使用创建的视频会话在视频编码范围内的查询与视频编码操作内联执行

  • VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR 指定视频会话可以用于编码具有量化增量图的图像。

  • VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR 指定视频会话可以用于编码具有强调图的图像。

// Provided by VK_KHR_video_queue
typedef VkFlags VkVideoSessionCreateFlagsKHR;

VkVideoSessionCreateFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoSessionCreateFlagBitsKHR 的掩码。

销毁视频会话

要销毁一个视频会话,调用

// Provided by VK_KHR_video_queue
void vkDestroyVideoSessionKHR(
    VkDevice                                    device,
    VkVideoSessionKHR                           videoSession,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁视频会话的逻辑设备。

  • videoSession 是要销毁的视频会话。

  • pAllocator 控制主机内存分配,如内存分配章节中所述。

有效用法
  • VUID-vkDestroyVideoSessionKHR-videoSession-07192
    所有引用 videoSession 的已提交命令必须已完成执行

  • VUID-vkDestroyVideoSessionKHR-videoSession-07193
    如果在创建 videoSession 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyVideoSessionKHR-videoSession-07194
    如果在创建 videoSession 时没有提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyVideoSessionKHR-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkDestroyVideoSessionKHR-videoSession-parameter
    如果 videoSession 不是 VK_NULL_HANDLE,则 videoSession 必须是一个有效的 VkVideoSessionKHR 句柄

  • VUID-vkDestroyVideoSessionKHR-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是一个指向有效的 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroyVideoSessionKHR-videoSession-parent
    如果 videoSession 是一个有效的句柄,则它必须已从 device 创建、分配或检索

主机同步
  • videoSession 的主机访问必须进行外部同步

视频会话内存关联

在创建视频会话对象之后,并且在可以使用该对象将视频编码操作记录到使用它的命令缓冲区之前,应用程序必须分配设备内存并将设备内存绑定到视频会话。 设备内存是单独分配的(请参见设备内存),然后与视频会话关联。

视频会话可能具有由唯一无符号整数值标识的多个内存绑定。 在使用视频会话记录使用它的命令缓冲命令之前,必须将适当的设备内存绑定到每个此类内存绑定。

要确定视频会话对象的内存需求,请调用

// Provided by VK_KHR_video_queue
VkResult vkGetVideoSessionMemoryRequirementsKHR(
    VkDevice                                    device,
    VkVideoSessionKHR                           videoSession,
    uint32_t*                                   pMemoryRequirementsCount,
    VkVideoSessionMemoryRequirementsKHR*        pMemoryRequirements);
  • device 是拥有视频会话的逻辑设备。

  • videoSession 是要查询的视频会话。

  • pMemoryRequirementsCount 是一个指向整数的指针,该整数与可用或查询的内存绑定需求数量相关,如下所述。

  • pMemoryRequirementsNULL 或指向 VkVideoSessionMemoryRequirementsKHR 结构数组的指针,其中返回视频会话的内存绑定需求。

如果 pMemoryRequirementsNULL,则视频会话所需的内存绑定数量将在 pMemoryRequirementsCount 中返回。否则,pMemoryRequirementsCount 必须指向由应用程序设置为 pMemoryRequirements 数组中元素数量的变量,并且在返回时,该变量将被实际写入 pMemoryRequirements 的内存绑定需求的数量覆盖。如果 pMemoryRequirementsCount 小于视频会话所需的内存绑定数量,则最多将 pMemoryRequirementsCount 个元素写入 pMemoryRequirements,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非所有所需的内存绑定需求都已返回。

有效用法(隐式)
  • VUID-vkGetVideoSessionMemoryRequirementsKHR-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkGetVideoSessionMemoryRequirementsKHR-videoSession-parameter
    videoSession 必须是一个有效的 VkVideoSessionKHR 句柄

  • VUID-vkGetVideoSessionMemoryRequirementsKHR-pMemoryRequirementsCount-parameter
    pMemoryRequirementsCount 必须是指向 uint32_t 值的有效指针

  • VUID-vkGetVideoSessionMemoryRequirementsKHR-pMemoryRequirements-parameter
    如果 pMemoryRequirementsCount 引用的值不为 0,并且 pMemoryRequirements 不为 NULL,则 pMemoryRequirements 必须是指向 pMemoryRequirementsCountVkVideoSessionMemoryRequirementsKHR 结构的有效指针数组。

  • VUID-vkGetVideoSessionMemoryRequirementsKHR-videoSession-parent
    videoSession 必须已从 device 创建、分配或检索。

返回值
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败

VkVideoSessionMemoryRequirementsKHR 结构的定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkVideoSessionMemoryRequirementsKHR {
    VkStructureType         sType;
    void*                   pNext;
    uint32_t                memoryBindIndex;
    VkMemoryRequirements    memoryRequirements;
} VkVideoSessionMemoryRequirementsKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • memoryBindIndex 是内存绑定的索引。

  • memoryRequirements 是一个 VkMemoryRequirements 结构,其中返回了由 memoryBindIndex 指定的绑定索引所请求的内存绑定要求。

有效用法(隐式)
  • VUID-VkVideoSessionMemoryRequirementsKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR

  • VUID-VkVideoSessionMemoryRequirementsKHR-pNext-pNext
    pNext 必须NULL

要将内存附加到视频会话对象,请调用:

// Provided by VK_KHR_video_queue
VkResult vkBindVideoSessionMemoryKHR(
    VkDevice                                    device,
    VkVideoSessionKHR                           videoSession,
    uint32_t                                    bindSessionMemoryInfoCount,
    const VkBindVideoSessionMemoryInfoKHR*      pBindSessionMemoryInfos);
  • device 是拥有视频会话的逻辑设备。

  • videoSession 是要与设备内存绑定的视频会话。

  • bindSessionMemoryInfoCountpBindSessionMemoryInfos 中的元素数量。

  • pBindSessionMemoryInfos 是指向 bindSessionMemoryInfoCountVkBindVideoSessionMemoryInfoKHR 结构数组的指针,这些结构指定要绑定到视频会话特定内存绑定的内存区域。

以下有效使用语句指的是与 pBindSessionMemoryInfos 的特定元素对应的 VkMemoryRequirements 结构,其定义如下:

  • 如果 pBindSessionMemoryInfos 的元素的 memoryBindIndex 成员与使用相同的 videoSessionpMemoryRequirementsCount 等于 bindSessionMemoryInfoCount 调用 vkGetVideoSessionMemoryRequirementsKHR 时,pMemoryRequirements 中返回的元素之一的 memoryBindIndex 成员匹配,则 pMemoryRequirements 的该元素的 memoryRequirements 成员是与 pBindSessionMemoryInfos 的元素对应的 VkMemoryRequirements 结构。

  • 否则,据说 pBindSessionMemoryInfos 的相关元素没有相应的 VkMemoryRequirements 结构。

有效用法
  • VUID-vkBindVideoSessionMemoryKHR-videoSession-07195
    pBindSessionMemoryInfos 的任何元素的 memoryBindIndex 成员标识的 videoSession 的内存绑定必须尚未被内存对象支持。

  • VUID-vkBindVideoSessionMemoryKHR-memoryBindIndex-07196
    pBindSessionMemoryInfos 的每个元素的 memoryBindIndex 成员在 pBindSessionMemoryInfos必须是唯一的。

  • VUID-vkBindVideoSessionMemoryKHR-pBindSessionMemoryInfos-07197
    pBindSessionMemoryInfos 的每个元素必须具有相应的 VkMemoryRequirements 结构。

  • VUID-vkBindVideoSessionMemoryKHR-pBindSessionMemoryInfos-07198
    如果 pBindSessionMemoryInfos 的元素具有相应的 VkMemoryRequirements 结构,则 pBindSessionMemoryInfos 的该元素的 memory 成员必须使用相应的 VkMemoryRequirements 结构的 memoryTypeBits 成员中允许的内存类型之一分配。

  • VUID-vkBindVideoSessionMemoryKHR-pBindSessionMemoryInfos-07199
    如果 pBindSessionMemoryInfos 的元素具有相应的 VkMemoryRequirements 结构,则 pBindSessionMemoryInfos 的该元素的 memoryOffset 成员必须是相应的 VkMemoryRequirements 结构的 alignment 成员的整数倍。

  • VUID-vkBindVideoSessionMemoryKHR-pBindSessionMemoryInfos-07200
    如果 pBindSessionMemoryInfos 的元素具有相应的 VkMemoryRequirements 结构,则 pBindSessionMemoryInfos 的该元素的 memorySize 成员必须等于相应的 VkMemoryRequirements 结构的 size 成员。

有效用法(隐式)
  • VUID-vkBindVideoSessionMemoryKHR-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkBindVideoSessionMemoryKHR-videoSession-parameter
    videoSession 必须是一个有效的 VkVideoSessionKHR 句柄

  • VUID-vkBindVideoSessionMemoryKHR-pBindSessionMemoryInfos-parameter
    pBindSessionMemoryInfos 必须是指向 bindSessionMemoryInfoCount 个有效的 VkBindVideoSessionMemoryInfoKHR 结构数组的有效指针。

  • VUID-vkBindVideoSessionMemoryKHR-bindSessionMemoryInfoCount-arraylength
    bindSessionMemoryInfoCount 必须大于 0

  • VUID-vkBindVideoSessionMemoryKHR-videoSession-parent
    videoSession 必须已从 device 创建、分配或检索。

主机同步
  • videoSession 的主机访问必须进行外部同步

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkBindVideoSessionMemoryInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkBindVideoSessionMemoryInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           memoryBindIndex;
    VkDeviceMemory     memory;
    VkDeviceSize       memoryOffset;
    VkDeviceSize       memorySize;
} VkBindVideoSessionMemoryInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • memoryBindIndex 是要将内存绑定到的内存绑定索引。

  • memory 是要绑定到视频会话的内存绑定(索引为 memoryBindIndex)的已分配的设备内存。

  • memoryOffset 是要绑定的 memory 区域的起始偏移量。

  • memorySize 是从 memoryOffset 字节开始,要绑定的 memory 区域的大小(以字节为单位)。

有效用法
  • VUID-VkBindVideoSessionMemoryInfoKHR-memoryOffset-07201
    memoryOffset 必须小于 memory 的大小。

  • VUID-VkBindVideoSessionMemoryInfoKHR-memorySize-07202
    memorySize 必须小于或等于 memory 的大小减去 memoryOffset

有效用法(隐式)
  • VUID-VkBindVideoSessionMemoryInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR

  • VUID-VkBindVideoSessionMemoryInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkBindVideoSessionMemoryInfoKHR-memory-parameter
    memory 必须是有效的 VkDeviceMemory 句柄。

视频配置文件兼容性

与特定视频会话一起使用的资源和查询池必须与创建该视频会话的 视频配置文件兼容。

如果 VkBuffer 是使用 VkBufferCreateInfo::pNext 链(包括一个 VkVideoProfileListInfoKHR 结构,其 pProfiles 成员包含一个与描述视频配置文件的 VkVideoProfileInfoKHR 结构链匹配的元素)以及 VkBufferCreateInfo::usage(至少包括一个特定于视频编码用法的位)创建的,则它与视频配置文件兼容。

  • VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR

  • VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR

  • VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR

  • VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR

如果 VkBuffer 创建时,其 VkBufferCreateInfo::flags 包含 VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR,则该 VkBuffer 也与视频配置文件兼容。

如果 VkImage 创建时,其 VkImageCreateInfo::pNext 链包含一个 VkVideoProfileListInfoKHR 结构,且该结构的 pProfiles 成员包含与描述视频配置文件的 VkVideoProfileInfoKHR 结构链匹配的元素,并且 VkImageCreateInfo::usage 包含至少一个特定于视频编码用途的位,则该 VkImage 与视频配置文件兼容。

  • VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR

  • VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR

如果使用创建图像的 VkImageCreateInfo 结构满足以下所有条件,则 VkImage 也与视频配置文件兼容:

虽然其中一些规则允许创建可能与任何视频配置文件兼容的缓冲区或图像资源,但应用程序仍然应该首选包含预期将使用该缓冲区或图像资源的特定视频配置文件(通过相应的创建信息结构的 pNext 链中包含的 VkVideoProfileListInfoKHR 结构),只要在资源创建时可以获得关于完整视频配置文件集的信息,以使实现能够针对特定用例优化创建的资源。在缺少该信息的情况下,实现可能必须对资源的内存需求或表示形式做出保守的决定。

如果 VkImageView 创建自的 VkImage 也与该视频配置文件兼容,则该 VkImageView 与该视频配置文件兼容。

如果 VkQueryPool 创建时,其 VkQueryPoolCreateInfo::pNext 链包含一个描述相同视频配置文件的 VkVideoProfileInfoKHR 结构链,并且 VkQueryPoolCreateInfo::queryType 具有以下值之一,则该 VkQueryPool 与视频配置文件兼容:

  • VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR

  • VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR

视频会话参数

视频会话参数对象可以存储与兼容视频会话一起使用的预处理编解码器特定参数,并能够在将视频编码操作记录到命令缓冲区时减少需要提供和处理的参数数量。

存储在此类对象中的参数是不可变的,以方便在多个线程中并发使用存储的参数。同时,可以使用 vkUpdateVideoSessionParametersKHR 命令将新参数添加到现有对象中。

为了支持在允许使用新参数扩展视频会话参数对象的同时并发使用存储的不可变参数,每个视频会话参数对象都会维护一个更新序列计数器,该计数器在对象创建时设置为 0,并且必须由每个后续更新操作递增。

符合特定视频压缩标准的某些视频序列允许更新先前提供的参数。如果需要参数更新,应用程序有以下选项:

  • 在应用程序端缓存参数集,并创建新的视频会话参数对象,并根据需要添加所有具有适当更改的参数;或者

  • 创建一个新的视频会话参数对象,仅提供更新的参数,并将先前使用的对象作为模板,这确保了在创建时未指定的参数将从模板对象中未修改地复制。

可以存储的实际参数类型、单个参数类型的容量以及初始化、更新和引用单个参数的方法特定于创建视频会话参数对象时使用的视频编解码器操作。

  • 对于 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR,这些在H.264 解码参数集部分中定义。

  • 对于 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR,这些在H.265 解码参数集部分中定义。

  • 对于 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR,这些在AV1 解码参数集部分中定义。

  • 对于 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR,这些在H.264 编码参数集部分中定义。

  • 对于 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR,这些在H.265 编码参数集部分中定义。

  • 对于 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,这些在AV1 编码参数集部分中定义。

使用编码操作创建的视频会话参数对象会根据视频会话参数使用的视频编码质量级别进行进一步的专门化,因为实现可能会根据使用的质量级别应用不同的参数覆盖集。这使得实现可以将潜在优化的参数集存储在这些对象中,进一步限制了在将视频编码操作记录到命令缓冲区时所需的处理。

视频会话参数由VkVideoSessionParametersKHR句柄表示。

// Provided by VK_KHR_video_queue
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionParametersKHR)

创建视频会话参数

要创建视频会话参数对象,请调用

// Provided by VK_KHR_video_queue
VkResult vkCreateVideoSessionParametersKHR(
    VkDevice                                    device,
    const VkVideoSessionParametersCreateInfoKHR* pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkVideoSessionParametersKHR*                pVideoSessionParameters);
  • device是创建视频会话参数对象的逻辑设备。

  • pCreateInfo是指向VkVideoSessionParametersCreateInfoKHR结构的指针,该结构包含用于创建视频会话参数对象的参数。

  • pAllocator 控制主机内存分配,如内存分配章节中所述。

  • pVideoSessionParameters是指向VkVideoSessionParametersKHR句柄的指针,结果的视频会话参数对象将返回到该句柄中。

结果的视频会话参数对象被认为是用创建pCreateInfo->videoSession的视频编解码器操作创建的。

使用编码操作创建的视频会话参数对象始终是相对于视频编码质量级别创建的。默认情况下,创建的视频会话参数对象使用质量级别零创建,除非在pCreateInfo->pNext链中包含VkVideoEncodeQualityLevelInfoKHR结构另有指定,在这种情况下,视频会话参数对象使用VkVideoEncodeQualityLevelInfoKHR::qualityLevel中指定的质量级别创建。

如果pCreateInfo->videoSessionParametersTemplate不是VK_NULL_HANDLE,则它将用作构造新视频会话参数对象的模板。这是通过首先根据pCreateInfo->pNext链中提供的其他创建参数添加任何参数,然后添加模板对象中具有与任何已添加参数的键不匹配的键的任何参数来实现的。

对于使用编码操作创建的视频会话参数对象,pCreateInfo->videoSessionParametersTemplate中指定的模板对象必须已使用与新创建的对象相同的视频编码质量级别创建。

这意味着存储在视频会话参数对象中的编解码器特定参数只能通过重新指定来在不同的视频编码质量级别之间重用,因为先前针对其他质量级别创建的视频会话参数不能用作模板,因为原始的编解码器特定参数(在实现可能应用参数覆盖之前)可能不再可用于构造派生对象。

视频会话参数对象只有在创建时pCreateInfo->flags包含VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR时才与量化映射兼容。

使用VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR针对使用VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR创建的视频会话对象创建的视频会话参数对象,会使用VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR结构中quantizationMapTexelSize成员指定的特定兼容的量化映射纹素大小创建,该结构包含在pCreateInfopNext链中。

这意味着这种视频会话参数对象兼容的量化映射纹素大小在该对象的生命周期内是固定的。应用程序必须创建单独的视频会话参数对象,以便在单个视频会话对象中使用不同的量化映射纹素大小。这是必要的,因为所使用的量化映射纹素大小可能会影响实现必须执行的参数覆盖,从而影响所使用的编解码器特定参数的最终值。

对于使用VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR创建的视频会话参数对象,pCreateInfo->videoSessionParametersTemplate中指定的模板对象必须也已使用VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR创建,并且在VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR::quantizationMapTexelSize中指定了相同的兼容的量化映射纹素大小

这意味着存储在视频会话参数对象中的编解码器特定参数只能通过重新指定来在不同的量化映射纹素大小中重用,因为先前针对其他量化映射纹素大小创建的视频会话参数不能用作模板,因为原始的编解码器特定参数(在实现可能应用参数覆盖之前)可能不再可用于构造派生对象。

对于在没有VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR的情况下创建的视频会话参数对象,pCreateInfo->videoSessionParametersTemplate中指定的模板对象必须也已在没有VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR的情况下创建。

如果pCreateInfo->videoSession是使用视频编解码器操作VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR创建的,则创建的视频会话参数对象最初将包含以下参数条目集

  • 表示H.264 SPS条目的StdVideoH264SequenceParameterSet结构,如下所示

    • 如果pCreateInfo->pNext链中提供的VkVideoDecodeH264SessionParametersCreateInfoKHR结构的pParametersAddInfo成员不是NULL,则首先添加pParametersAddInfo->pStdSPSs中指定的StdVideoH264SequenceParameterSet条目集;

    • 如果pCreateInfo->videoSessionParametersTemplate不是VK_NULL_HANDLE,则如果创建的对象尚未包含具有相同seq_parameter_set_id的此类条目,则将其中存储的每个StdVideoH264SequenceParameterSet条目复制到创建的视频会话参数对象中。

  • 表示H.264 PPS条目的StdVideoH264PictureParameterSet结构,如下所示

    • 如果pCreateInfo->pNext链中提供的VkVideoDecodeH264SessionParametersCreateInfoKHR结构的pParametersAddInfo成员不是NULL,则首先添加pParametersAddInfo->pStdPPSs中指定的StdVideoH264PictureParameterSet条目集;

    • 如果 pCreateInfo->videoSessionParametersTemplate 不是 VK_NULL_HANDLE,则存储在其中的每个 StdVideoH264PictureParameterSet 条目都会被复制到创建的视频会话参数对象中,如果创建的对象尚未包含具有相同 seq_parameter_set_idpic_parameter_set_id 的此类条目。

如果 pCreateInfo->videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则创建的视频会话参数对象最初将包含以下参数条目集

  • 代表 H.265 VPS 条目的 StdVideoH265VideoParameterSet 结构,如下所示

    • 如果 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员(在 pCreateInfo->pNext 链中提供)不是 NULL,则首先添加 pParametersAddInfo->pStdVPSs 中指定的 StdVideoH265VideoParameterSet 条目集;

    • 如果 pCreateInfo->videoSessionParametersTemplate 不是 VK_NULL_HANDLE,则存储在其中的每个 StdVideoH265VideoParameterSet 条目都会被复制到创建的视频会话参数对象中,如果创建的对象尚未包含具有相同 vps_video_parameter_set_id 的此类条目。

  • 代表 H.265 SPS 条目的 StdVideoH265SequenceParameterSet 结构,如下所示

    • 如果 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员(在 pCreateInfo->pNext 链中提供)不是 NULL,则首先添加 pParametersAddInfo->pStdSPSs 中指定的 StdVideoH265SequenceParameterSet 条目集;

    • 如果 pCreateInfo->videoSessionParametersTemplate 不是 VK_NULL_HANDLE,则存储在其中的每个 StdVideoH265SequenceParameterSet 条目都会被复制到创建的视频会话参数对象中,如果创建的对象尚未包含具有相同 sps_video_parameter_set_idsps_seq_parameter_set_id 的此类条目。

  • 代表 H.265 PPS 条目的 StdVideoH265PictureParameterSet 结构,如下所示

    • 如果 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员(在 pCreateInfo->pNext 链中提供)不是 NULL,则首先添加 pParametersAddInfo->pStdPPSs 中指定的 StdVideoH265PictureParameterSet 条目集;

    • 如果 pCreateInfo->videoSessionParametersTemplate 不是 VK_NULL_HANDLE,则存储在其中的每个 StdVideoH265PictureParameterSet 条目都会被复制到创建的视频会话参数对象中,如果创建的对象尚未包含具有相同 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 的此类条目。

如果 pCreateInfo->videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,则创建的视频会话参数对象将包含一个 AV1 序列头,由 VkVideoDecodeAV1SessionParametersCreateInfoKHR 结构的 pStdSequenceHeader 成员(在 pCreateInfo->pNext 链中提供)指定的 StdVideoAV1SequenceHeader 结构表示。由于此类视频会话参数对象只能包含一个 AV1 序列头,因此无法使用先前创建的对象作为模板或随后更新创建的视频会话参数对象。

如果 pCreateInfo->videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则创建的视频会话参数对象最初将包含以下参数条目集

  • 代表 H.264 SPS 条目的 StdVideoH264SequenceParameterSet 结构,如下所示

    • 如果 VkVideoEncodeH264SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员(在 pCreateInfo->pNext 链中提供)不是 NULL,则首先添加 pParametersAddInfo->pStdSPSs 中指定的 StdVideoH264SequenceParameterSet 条目集;

    • 如果pCreateInfo->videoSessionParametersTemplate不是VK_NULL_HANDLE,则如果创建的对象尚未包含具有相同seq_parameter_set_id的此类条目,则将其中存储的每个StdVideoH264SequenceParameterSet条目复制到创建的视频会话参数对象中。

  • 代表 H.264 PPS 条目的 StdVideoH264PictureParameterSet 结构,如下所示

    • 如果 VkVideoEncodeH264SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员(在 pCreateInfo->pNext 链中提供)不是 NULL,则首先添加 pParametersAddInfo->pStdPPSs 中指定的 StdVideoH264PictureParameterSet 条目集;

    • 如果 pCreateInfo->videoSessionParametersTemplate 不是 VK_NULL_HANDLE,则存储在其中的每个 StdVideoH264PictureParameterSet 条目都会被复制到创建的视频会话参数对象中,如果创建的对象尚未包含具有相同 seq_parameter_set_idpic_parameter_set_id 的此类条目。

如果 pCreateInfo->videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则创建的视频会话参数对象最初将包含以下参数条目集

  • 代表 H.265 VPS 条目的 StdVideoH265VideoParameterSet 结构,如下所示

    • 如果 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员(在 pCreateInfo->pNext 链中提供)不是 NULL,则首先添加 pParametersAddInfo->pStdVPSs 中指定的 StdVideoH265VideoParameterSet 条目集;

    • 如果 pCreateInfo->videoSessionParametersTemplate 不是 VK_NULL_HANDLE,则存储在其中的每个 StdVideoH265VideoParameterSet 条目都会被复制到创建的视频会话参数对象中,如果创建的对象尚未包含具有相同 vps_video_parameter_set_id 的此类条目。

  • 代表 H.265 SPS 条目的 StdVideoH265SequenceParameterSet 结构,如下所示

    • 如果 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员(在 pCreateInfo->pNext 链中提供)不是 NULL,则首先添加 pParametersAddInfo->pStdSPSs 中指定的 StdVideoH265SequenceParameterSet 条目集;

    • 如果 pCreateInfo->videoSessionParametersTemplate 不是 VK_NULL_HANDLE,则存储在其中的每个 StdVideoH265SequenceParameterSet 条目都会被复制到创建的视频会话参数对象中,如果创建的对象尚未包含具有相同 sps_video_parameter_set_idsps_seq_parameter_set_id 的此类条目。

  • 代表 H.265 PPS 条目的 StdVideoH265PictureParameterSet 结构,如下所示

    • 如果 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员(在 pCreateInfo->pNext 链中提供)不是 NULL,则首先添加 pParametersAddInfo->pStdPPSs 中指定的 StdVideoH265PictureParameterSet 条目集;

    • 如果 pCreateInfo->videoSessionParametersTemplate 不是 VK_NULL_HANDLE,则存储在其中的每个 StdVideoH265PictureParameterSet 条目都会被复制到创建的视频会话参数对象中,如果创建的对象尚未包含具有相同 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 的此类条目。

如果 pCreateInfo->videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则创建的视频会话参数对象将包含一个 AV1 序列头,通过 VkVideoEncodeAV1SessionParametersCreateInfoKHR 结构的成员(在 pCreateInfo->pNext 链中提供)指定。由于此类视频会话参数对象只能包含一个 AV1 序列头,因此无法使用先前创建的对象作为模板或随后更新创建的视频会话参数对象。

在通过视频编码操作创建的视频会话参数对象的情况下,如果任何指定的视频标准参数不符合所用视频压缩标准的语法或语义要求,或者如果根据所用视频压缩标准定义的规则从参数派生的值不符合视频压缩标准或实现的功能,则实现可能返回 VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR 错误。

应用程序不应依赖任何命令返回 VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR 错误来验证视频标准参数,因为实现不要求在任何特定情况下报告此错误。

有效用法(隐式)
  • VUID-vkCreateVideoSessionParametersKHR-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkCreateVideoSessionParametersKHR-pCreateInfo-parameter
    pCreateInfo 必须是指向有效的 VkVideoSessionParametersCreateInfoKHR 结构的有效指针

  • VUID-vkCreateVideoSessionParametersKHR-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是一个指向有效的 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateVideoSessionParametersKHR-pVideoSessionParameters-parameter
    pVideoSessionParameters 必须是指向 VkVideoSessionParametersKHR 句柄的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR

VkVideoSessionParametersCreateInfoKHR 结构的定义如下

// Provided by VK_KHR_video_queue
typedef struct VkVideoSessionParametersCreateInfoKHR {
    VkStructureType                           sType;
    const void*                               pNext;
    VkVideoSessionParametersCreateFlagsKHR    flags;
    VkVideoSessionParametersKHR               videoSessionParametersTemplate;
    VkVideoSessionKHR                         videoSession;
} VkVideoSessionParametersCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkVideoSessionParametersCreateFlagBitsKHR 的位掩码,用于指定创建标志。

  • videoSessionParametersTemplate 可以是 VK_NULL_HANDLE,也可以是一个指向 VkVideoSessionParametersKHR 对象的有效句柄,该对象用作构造新的视频会话参数对象的模板。

  • videoSession 是要创建视频会话参数对象的视频会话对象。

以下定义了此结构的相关有效用法语句所引用的限制值。

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则让 StdVideoH264SequenceParameterSet spsAddList[] 作为要添加到创建的视频会话参数对象的 H.264 SPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoDecodeH264SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则将 pParametersAddInfo->pStdSPSs 中指定的 StdVideoH264SequenceParameterSet 条目集合添加到 spsAddList 中;

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 seq_parameter_set_idspsAddList 中已有的任何条目都不匹配的 StdVideoH264SequenceParameterSet 条目添加到 spsAddList 中。

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则让 StdVideoH264PictureParameterSet ppsAddList[] 作为要添加到创建的视频会话参数对象的 H.264 PPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoDecodeH264SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则将 pParametersAddInfo->pStdPPSs 中指定的 StdVideoH264PictureParameterSet 条目集合添加到 ppsAddList 中;

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 seq_parameter_set_idpic_parameter_set_idppsAddList 中已有的任何条目都不匹配的 StdVideoH264PictureParameterSet 条目添加到 ppsAddList 中。

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则让 StdVideoH265VideoParameterSet vpsAddList[] 作为要添加到创建的视频会话参数对象的 H.265 VPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则将 pParametersAddInfo->pStdVPSs 中指定的 StdVideoH265VideoParameterSet 条目集合添加到 vpsAddList 中;

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 vps_video_parameter_set_idvpsAddList 中已有的任何条目都不匹配的 StdVideoH265VideoParameterSet 条目添加到 vpsAddList 中。

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则让 StdVideoH265SequenceParameterSet spsAddList[] 作为要添加到创建的视频会话参数对象的 H.265 SPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则将 pParametersAddInfo->pStdSPSs 中指定的 StdVideoH265SequenceParameterSet 条目集合添加到 spsAddList 中;

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 sps_video_parameter_set_idsps_seq_parameter_set_idspsAddList 中已有的任何条目都不匹配的 StdVideoH265SequenceParameterSet 条目添加到 spsAddList 中。

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则让 StdVideoH265PictureParameterSet ppsAddList[] 作为要添加到创建的视频会话参数对象的 H.265 PPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则将 pParametersAddInfo->pStdPPSs 中指定的 StdVideoH265PictureParameterSet 条目集合添加到 ppsAddList 中;

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_idppsAddList 中已有的任何条目都不匹配的 StdVideoH265PictureParameterSet 条目添加到 ppsAddList 中。

  • 如果 videoSession 是使用编码操作创建的,则让 uint32_t qualityLevel 作为创建的视频会话参数对象的视频编码质量级别,定义如下

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则让 StdVideoH264SequenceParameterSet spsAddList[] 作为要添加到创建的视频会话参数对象的 H.264 SPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoEncodeH264SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则将 pParametersAddInfo->pStdSPSs 中指定的 StdVideoH264SequenceParameterSet 条目集合添加到 spsAddList 中;

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 seq_parameter_set_idspsAddList 中已有的任何条目都不匹配的 StdVideoH264SequenceParameterSet 条目添加到 spsAddList 中。

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则让 StdVideoH264PictureParameterSet ppsAddList[] 作为要添加到创建的视频会话参数对象的 H.264 PPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoEncodeH264SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则将 pParametersAddInfo->pStdPPSs 中指定的 StdVideoH264PictureParameterSet 条目集合添加到 ppsAddList 中;

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 seq_parameter_set_idpic_parameter_set_idppsAddList 中已有的任何条目都不匹配的 StdVideoH264PictureParameterSet 条目添加到 ppsAddList 中。

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则让 StdVideoH265VideoParameterSet vpsAddList[] 作为要添加到创建的视频会话参数对象的 H.265 VPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则将 pParametersAddInfo->pStdVPSs 中指定的 StdVideoH265VideoParameterSet 条目集合添加到 vpsAddList 中;

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 vps_video_parameter_set_idvpsAddList 中已有的任何条目都不匹配的 StdVideoH265VideoParameterSet 条目添加到 vpsAddList 中。

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则让 StdVideoH265SequenceParameterSet spsAddList[] 作为要添加到创建的视频会话参数对象的 H.265 SPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则将 pParametersAddInfo->pStdSPSs 中指定的 StdVideoH265SequenceParameterSet 条目集合添加到 spsAddList 中;

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 sps_video_parameter_set_idsps_seq_parameter_set_idspsAddList 中已有的任何条目都不匹配的 StdVideoH265SequenceParameterSet 条目添加到 spsAddList 中。

  • 如果 videoSession 是使用编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则让 StdVideoH265PictureParameterSet ppsAddList[] 作为要添加到创建的视频会话参数对象的 H.265 PPS 条目列表,定义如下

    • 如果 pNext 链中提供的 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构的 pParametersAddInfo 成员不为 NULL,则 pParametersAddInfo->pStdPPSs 中指定的 StdVideoH265PictureParameterSet 条目集将添加到 ppsAddList

    • 如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则将其中存储的每个 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_idppsAddList 中已有的任何条目都不匹配的 StdVideoH265PictureParameterSet 条目添加到 ppsAddList 中。

有效用法
  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSessionParametersTemplate-04855
    如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLE,则它必须是针对 videoSession 创建的。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSessionParametersTemplate-08310
    如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLEvideoSession 是使用编码操作创建的,则 qualityLevel **必须**等于创建 videoSessionParametersTemplate 时使用的 视频编码质量级别。

  • VUID-VkVideoSessionParametersCreateInfoKHR-flags-10271
    如果 flags 包含 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR,则 videoSession **必须**使用 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR 创建。

  • VUID-VkVideoSessionParametersCreateInfoKHR-flags-10272
    如果 flags 包含 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR,则 pNext 链**必须**包含一个 VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR 结构。

  • VUID-VkVideoSessionParametersCreateInfoKHR-flags-10273
    如果 flags 包含 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHRvideoSession 是使用 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR 创建的,则 支持的视频格式属性列表中,对于图像使用标志 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR 必须有一个元素,该元素的 VkVideoFormatQuantizationMapPropertiesKHR::quantizationMapTexelSize 等于 pNext 链中包含的 VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR 结构的 quantizationMapTexelSize 成员。

  • VUID-VkVideoSessionParametersCreateInfoKHR-flags-10274
    如果 flags 包含 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHRvideoSession 是使用 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR 创建的,则 支持的视频格式属性列表中,对于图像使用标志 VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR 必须有一个元素,该元素的 VkVideoFormatQuantizationMapPropertiesKHR::quantizationMapTexelSize 等于 pNext 链中包含的 VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR 结构的 quantizationMapTexelSize 成员。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSessionParametersTemplate-10275
    如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLEflags 包含 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR,则 videoSessionParametersTemplate **必须**使用 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR 创建。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSessionParametersTemplate-10276
    如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLEflags 包含 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR,则 videoSessionParametersTemplate **必须**使用与 pNext 链中包含的 VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR 结构的 quantizationMapTexelSize 成员中指定的 量化映射纹素大小相同的大小创建。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSessionParametersTemplate-10277
    如果 videoSessionParametersTemplate 不为 VK_NULL_HANDLEflags 不包含 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR,则 videoSessionParametersTemplate **必须**在不使用 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR 的情况下创建。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-07203
    如果 videoSession 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则 pNext 链**必须**包含 VkVideoDecodeH264SessionParametersCreateInfoKHR 结构。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-07204
    如果 videoSession 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则 spsAddList 的元素数量**必须**小于或等于 pNext 链中包含的 VkVideoDecodeH264SessionParametersCreateInfoKHR 结构中指定的 maxStdSPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-07205
    如果 videoSession 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则 ppsAddList 的元素数量**必须**小于或等于 pNext 链中包含的 VkVideoDecodeH264SessionParametersCreateInfoKHR 结构中指定的 maxStdPPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-07206
    如果 videoSession 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则 pNext 链**必须**包含 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-07207
    如果 videoSession 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则 vpsAddList 的元素数量**必须**小于或等于 pNext 链中包含的 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构中指定的 maxStdVPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-07208
    如果 videoSession 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则 spsAddList 的元素数量**必须**小于或等于 pNext 链中包含的 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构中指定的 maxStdSPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-07209
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则 ppsAddList 的元素数量必须小于或等于 pNext 链中包含的 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构中指定的 maxStdPPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-09258
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,则 videoSessionParametersTemplate 必须VK_NULL_HANDLE

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-09259
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,则 pNext必须包含一个 VkVideoDecodeAV1SessionParametersCreateInfoKHR 结构。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-07210
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 pNext必须包含一个 VkVideoEncodeH264SessionParametersCreateInfoKHR 结构。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-04839
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 spsAddList 的元素数量必须小于或等于 pNext 链中包含的 VkVideoEncodeH264SessionParametersCreateInfoKHR 结构中指定的 maxStdSPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-04840
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 ppsAddList 的元素数量必须小于或等于 pNext 链中包含的 VkVideoEncodeH264SessionParametersCreateInfoKHR 结构中指定的 maxStdPPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-07211
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则 pNext必须包含一个 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-04841
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则 vpsAddList 的元素数量必须小于或等于 pNext 链中包含的 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构中指定的 maxStdVPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-04842
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则 spsAddList 的元素数量必须小于或等于 pNext 链中包含的 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构中指定的 maxStdSPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-04843
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则 ppsAddList 的元素数量必须小于或等于 pNext 链中包含的 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构中指定的 maxStdPPSCount

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-08319
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则对于 ppsAddList 的每个元素,num_tile_columns_minus1 必须小于 VkVideoEncodeH265CapabilitiesKHR::maxTiles.width,这是通过 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建 videoSession 时使用的视频配置返回的值。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-08320
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则对于 ppsAddList 的每个元素,num_tile_rows_minus1 必须小于 VkVideoEncodeH265CapabilitiesKHR::maxTiles.height,这是通过 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建 videoSession 时使用的视频配置返回的值。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-10278
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则 videoSessionParametersTemplate 必须VK_NULL_HANDLE

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-10279
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则 pNext必须包含一个 VkVideoEncodeAV1SessionParametersCreateInfoKHR 结构。

  • VUID-VkVideoSessionParametersCreateInfoKHR-videoSession-10280
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则 pNext 链中包含的 VkVideoEncodeAV1SessionParametersCreateInfoKHR 结构的 stdOperatingPointCount 成员必须小于或等于 VkVideoEncodeAV1CapabilitiesKHR::maxOperatingPoints,这是通过 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建 videoSession 时使用的视频配置返回的值。

有效用法(隐式)

可以在 VkVideoSessionParametersCreateInfoKHR::flags 中设置的位是

// Provided by VK_KHR_video_encode_quantization_map
typedef enum VkVideoSessionParametersCreateFlagBitsKHR {
  // Provided by VK_KHR_video_encode_quantization_map
    VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR = 0x00000001,
} VkVideoSessionParametersCreateFlagBitsKHR;
  • VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR 指定创建的视频会话参数对象可以量化映射一起使用。

// Provided by VK_KHR_video_queue
typedef VkFlags VkVideoSessionParametersCreateFlagsKHR;

VkVideoSessionParametersCreateFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoSessionParametersCreateFlagBitsKHR 的掩码。

VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR 结构的定义如下

// Provided by VK_KHR_video_encode_quantization_map
typedef struct VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkExtent2D         quantizationMapTexelSize;
} VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • quantizationMapTexelSize 指定与使用 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR 创建的视频会话参数对象兼容的量化映射纹素大小

有效用法(隐式)
  • VUID-VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_SESSION_PARAMETERS_CREATE_INFO_KHR

销毁视频会话参数

要销毁视频会话参数对象,请调用

// Provided by VK_KHR_video_queue
void vkDestroyVideoSessionParametersKHR(
    VkDevice                                    device,
    VkVideoSessionParametersKHR                 videoSessionParameters,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁视频会话参数对象的逻辑设备。

  • videoSessionParameters 是要销毁的视频会话参数对象。

  • pAllocator 控制主机内存分配,如内存分配章节中所述。

有效用法
  • VUID-vkDestroyVideoSessionParametersKHR-videoSessionParameters-07212
    所有引用 videoSessionParameters 的已提交命令必须已完成执行

  • VUID-vkDestroyVideoSessionParametersKHR-videoSessionParameters-07213
    如果创建 videoSessionParameters 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyVideoSessionParametersKHR-videoSessionParameters-07214
    如果创建 videoSessionParameters 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyVideoSessionParametersKHR-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkDestroyVideoSessionParametersKHR-videoSessionParameters-parameter
    如果 videoSessionParameters 不是 VK_NULL_HANDLE,则 videoSessionParameters 必须是有效的 VkVideoSessionParametersKHR 句柄

  • VUID-vkDestroyVideoSessionParametersKHR-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是一个指向有效的 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroyVideoSessionParametersKHR-videoSessionParameters-parent
    如果 videoSessionParameters 是有效句柄,则它必须已从 device 创建、分配或检索

主机同步
  • videoSessionParameters 的主机访问必须进行外部同步

更新视频会话参数

要使用新参数更新视频会话参数对象,请调用

// Provided by VK_KHR_video_queue
VkResult vkUpdateVideoSessionParametersKHR(
    VkDevice                                    device,
    VkVideoSessionParametersKHR                 videoSessionParameters,
    const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo);
  • device 是更新视频会话参数的逻辑设备。

  • videoSessionParameters 是要更新的视频会话参数对象。

  • pUpdateInfo 是一个指向 VkVideoSessionParametersUpdateInfoKHR 结构的指针,该结构指定参数更新信息。

成功调用此命令后,videoSessionParameters更新序列计数器将更改为 pUpdateInfo->updateSequenceCount 中指定的值。

由于对视频会话参数对象发出的每个更新都需要指定下一个可用的更新序列计数值,因此固有地不允许同时更新同一个视频会话参数对象。但是,允许将视频编码操作记录到引用先前添加到视频会话参数对象的参数的命令缓冲区中,即使正在进行并发更新,将一些新条目添加到该对象也是如此。

如果 videoSessionParameters 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,并且 pUpdateInfo->pNext 链包含 VkVideoDecodeH264SessionParametersAddInfoKHR 结构,则此命令会将以下参数条目添加到 videoSessionParameters

如果 videoSessionParameters 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,并且 pUpdateInfo->pNext 链包含 VkVideoDecodeH265SessionParametersAddInfoKHR 结构,则此命令会将以下参数条目添加到 videoSessionParameters

如果 videoSessionParameters 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 pUpdateInfo->pNext 链包含 VkVideoEncodeH264SessionParametersAddInfoKHR 结构,则此命令会将以下参数条目添加到 videoSessionParameters

如果 videoSessionParameters 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 pUpdateInfo->pNext 链包含 VkVideoEncodeH265SessionParametersAddInfoKHR 结构,则此命令会将以下参数条目添加到 videoSessionParameters

在通过视频编码操作创建的视频会话参数对象的情况下,如果任何指定的视频标准参数不符合所用视频压缩标准的语法或语义要求,或者如果根据所用视频压缩标准定义的规则从参数派生的值不符合视频压缩标准或实现的功能,则实现可能返回 VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR 错误。

应用程序不应依赖任何命令返回 VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR 错误来验证视频标准参数,因为实现不要求在任何特定情况下报告此错误。

有效用法
  • VUID-vkUpdateVideoSessionParametersKHR-pUpdateInfo-07215
    pUpdateInfo->updateSequenceCount 必须等于 videoSessionParameters 当前的更新序列计数器加一

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07216
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoDecodeH264SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 不包含 seq_parameter_set_idVkVideoDecodeH264SessionParametersAddInfoKHR::pStdSPSs 的任何元素匹配的 StdVideoH264SequenceParameterSet 条目。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07217
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则已存储在其中的 StdVideoH264SequenceParameterSet 条目数量加上 pUpdateInfo->pNext 链中包含的 VkVideoDecodeH264SessionParametersAddInfoKHR 结构的 stdSPSCount 成员的值 必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoDecodeH264SessionParametersCreateInfoKHR::maxStdSPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07218
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoDecodeH264SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 不包含 seq_parameter_set_idpic_parameter_set_id 都与 VkVideoDecodeH264SessionParametersAddInfoKHR::pStdPPSs 的任何元素匹配的 StdVideoH264PictureParameterSet 条目。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07219
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则已存储在其中的 StdVideoH264PictureParameterSet 条目数量加上 pUpdateInfo->pNext 链中包含的 VkVideoDecodeH264SessionParametersAddInfoKHR 结构的 stdPPSCount 成员的值 必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoDecodeH264SessionParametersCreateInfoKHR::maxStdPPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07220
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoDecodeH265SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 不包含 vps_video_parameter_set_idVkVideoDecodeH265SessionParametersAddInfoKHR::pStdVPSs 的任何元素匹配的 StdVideoH265VideoParameterSet 条目。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07221
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则已存储在其中的 StdVideoH265VideoParameterSet 条目数量加上 pUpdateInfo->pNext 链中包含的 VkVideoDecodeH265SessionParametersAddInfoKHR 结构的 stdVPSCount 成员的值 必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoDecodeH265SessionParametersCreateInfoKHR::maxStdVPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07222
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoDecodeH265SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 不包含 sps_video_parameter_set_idsps_seq_parameter_set_id 都与 VkVideoDecodeH265SessionParametersAddInfoKHR::pStdSPSs 的任何元素匹配的 StdVideoH265SequenceParameterSet 条目。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07223
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则已存储在其中的 StdVideoH265SequenceParameterSet 条目数量加上 pUpdateInfo->pNext 链中包含的 VkVideoDecodeH265SessionParametersAddInfoKHR 结构的 stdSPSCount 成员的值 必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoDecodeH265SessionParametersCreateInfoKHR::maxStdSPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07224
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoDecodeH265SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 不包含 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 都与 VkVideoDecodeH265SessionParametersAddInfoKHR::pStdPPSs 的任何元素匹配的 StdVideoH265PictureParameterSet 条目。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07225
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则已存储在其中的 StdVideoH265PictureParameterSet 条目数量加上 pUpdateInfo->pNext 链中包含的 VkVideoDecodeH265SessionParametersAddInfoKHR 结构的 stdPPSCount 成员的值 必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoDecodeH265SessionParametersCreateInfoKHR::maxStdPPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-09260
    videoSessionParameters 必须 不是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07226
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoEncodeH264SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 尚未包含一个 StdVideoH264SequenceParameterSet 条目,其 seq_parameter_set_idVkVideoEncodeH264SessionParametersAddInfoKHR::pStdSPSs 的任何元素匹配。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-06441
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则其中已存储的 StdVideoH264SequenceParameterSet 条目数加上 pUpdateInfo->pNext 链中包含的 VkVideoEncodeH264SessionParametersAddInfoKHR 结构的 stdSPSCount 成员的值,必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoEncodeH264SessionParametersCreateInfoKHR::maxStdSPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07227
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoEncodeH264SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 尚未包含一个 StdVideoH264PictureParameterSet 条目,其 seq_parameter_set_idpic_parameter_set_id 都与 VkVideoEncodeH264SessionParametersAddInfoKHR::pStdPPSs 的任何元素匹配。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-06442
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则其中已存储的 StdVideoH264PictureParameterSet 条目数加上 pUpdateInfo->pNext 链中包含的 VkVideoEncodeH264SessionParametersAddInfoKHR 结构的 stdPPSCount 成员的值,必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoEncodeH264SessionParametersCreateInfoKHR::maxStdPPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07228
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoEncodeH265SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 尚未包含一个 StdVideoH265VideoParameterSet 条目,其 vps_video_parameter_set_idVkVideoEncodeH265SessionParametersAddInfoKHR::pStdVPSs 的任何元素匹配。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-06443
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则其中已存储的 StdVideoH265VideoParameterSet 条目数加上 pUpdateInfo->pNext 链中包含的 VkVideoEncodeH265SessionParametersAddInfoKHR 结构的 stdVPSCount 成员的值,必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoEncodeH265SessionParametersCreateInfoKHR::maxStdVPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07229
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoEncodeH265SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 尚未包含一个 StdVideoH265SequenceParameterSet 条目,其 sps_video_parameter_set_idsps_seq_parameter_set_id 都与 VkVideoEncodeH265SessionParametersAddInfoKHR::pStdSPSs 的任何元素匹配。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-06444
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则其中已存储的 StdVideoH265SequenceParameterSet 条目数加上 pUpdateInfo->pNext 链中包含的 VkVideoEncodeH265SessionParametersAddInfoKHR 结构的 stdSPSCount 成员的值,必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoEncodeH265SessionParametersCreateInfoKHR::maxStdSPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-07230
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoEncodeH265SessionParametersAddInfoKHR 结构,则 videoSessionParameters 必须 尚未包含一个 StdVideoH265PictureParameterSet 条目,其 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 都与 VkVideoEncodeH265SessionParametersAddInfoKHR::pStdPPSs 的任何元素匹配。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-06445
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则其中已存储的 StdVideoH265PictureParameterSet 条目数加上 pUpdateInfo->pNext 链中包含的 VkVideoEncodeH265SessionParametersAddInfoKHR 结构的 stdPPSCount 成员的值,必须 小于或等于创建 videoSessionParameters 时使用的 VkVideoEncodeH265SessionParametersCreateInfoKHR::maxStdPPSCount

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-08321
    如果 videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 pUpdateInfopNext 链包含 VkVideoEncodeH265SessionParametersAddInfoKHR 结构,则对于 VkVideoEncodeH265SessionParametersAddInfoKHR::pStdPPSs 的每个元素,num_tile_columns_minus1 必须 小于 VkVideoEncodeH265CapabilitiesKHR::maxTiles.width,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建 videoSessionParameters 时使用的视频配置文件返回。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-08322
    如果使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建了 videoSessionParameters,并且 pUpdateInfopNext 链中包含 VkVideoEncodeH265SessionParametersAddInfoKHR 结构,那么对于 VkVideoEncodeH265SessionParametersAddInfoKHR::pStdPPSs 的每个元素,num_tile_rows_minus1 必须小于 VkVideoEncodeH265CapabilitiesKHR::maxTiles.height,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建 videoSessionParameters 时使用的视频配置文件返回。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-10281
    videoSessionParameters 必须不是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的。

有效用法(隐式)
  • VUID-vkUpdateVideoSessionParametersKHR-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-parameter
    videoSessionParameters 必须是一个有效的 VkVideoSessionParametersKHR 句柄。

  • VUID-vkUpdateVideoSessionParametersKHR-pUpdateInfo-parameter
    pUpdateInfo 必须是一个指向有效 VkVideoSessionParametersUpdateInfoKHR 结构的有效指针。

  • VUID-vkUpdateVideoSessionParametersKHR-videoSessionParameters-parent
    videoSessionParameters 必须是从 device 创建、分配或检索的。

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR

VkVideoSessionParametersUpdateInfoKHR 结构定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkVideoSessionParametersUpdateInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           updateSequenceCount;
} VkVideoSessionParametersUpdateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • updateSequenceCount 是要为视频会话参数对象设置的新的更新序列计数

有效用法(隐式)

视频编码范围

应用程序 可以仅在视频编码范围内记录视频编码命令。

要开始视频编码范围,请调用

// Provided by VK_KHR_video_queue
void vkCmdBeginVideoCodingKHR(
    VkCommandBuffer                             commandBuffer,
    const VkVideoBeginCodingInfoKHR*            pBeginInfo);
  • commandBuffer 是要在其中记录命令的命令缓冲区。

  • pBeginInfo 是一个指向 VkVideoBeginCodingInfoKHR 结构的指针,该结构指定视频编码范围的参数,包括要使用的视频会话和视频会话参数对象。

开始视频编码范围后,pBeginInfo->videoSession 中指定的视频会话对象将绑定到命令缓冲区,并且该命令缓冲区已准备好记录视频编码操作。类似地,如果 pBeginInfo->videoSessionParameters 不是 VK_NULL_HANDLE,它也会绑定到命令缓冲区,并且视频编码操作 可以引用其中存储的编解码器特定参数。

此命令还建立了一组绑定的参考图片资源,这些资源 可以在视频编码范围内用作重建图片参考图片。此集合的每个元素都包含一个视频图片资源和与之关联的DPB槽索引(如果有)。

绑定参考图片资源集在视频编码范围内是不可变的,但是,任何绑定参考图片资源关联的DPB槽索引都 可以在视频编码范围内响应视频编码操作而更改。

作为 pBeginInfo->pReferenceSlots 元素提供的 VkVideoReferenceSlotInfoKHR 结构由此命令解释如下:

  • 如果 slotIndex 为非负数且 pPictureResource 不为 NULL,则由 pPictureResource 指向的 VkVideoPictureResourceInfoKHR 结构定义的视频图片资源将添加到绑定参考图片资源集中,并与 slotIndex 中指定的DPB槽索引关联。

  • 如果 slotIndex 为非负数且 pPictureResourceNULL,则此命令将停用索引为 slotIndex 的DPB槽。

  • 如果 slotIndex 为负数且 pPictureResource 不为 NULL,则由 pPictureResource 指向的 VkVideoPictureResourceInfoKHR 结构定义的视频图片资源将添加到绑定参考图片资源集中,而不与DPB槽关联。这样的图片资源 可以随后用作重建图片,以将其与DPB槽关联。

  • 如果 slotIndex 为负数且 pPictureResourceNULL,则忽略该元素。

多个绑定参考图片资源可能与同一DPB槽索引关联,或者单个绑定参考图片可能引用多个单独的参考图片。例如,在支持隔行帧的H.264解码配置文件的情况下,单个DPB槽可以引用顶部和底部字段的两个单独的图片。根据H.264解码配置文件使用的图片布局,可能会出现以下特殊情况:

  • 如果图片布局为 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR,则顶部和底部字段图片物理上位于同一视频图片资源中,其中偶数扫描线对应于顶部字段,奇数扫描线对应于底部字段。

  • 如果图片布局为 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR,则顶部和底部字段图片存储在单独的视频图片资源中(在同一图像层的单独子区域中,在同一图像的单独层中,或在完全单独的图像中),因此 VkVideoBeginCodingInfoKHR::pReferenceSlots 的两个元素 可以包含相同的 slotIndex,但在其 pPictureResource 成员中指定不同的视频图片资源。

pBeginInfo->pReferenceSlots 的元素中指定的所有非负 slotIndex必须标识在设备上执行此命令时处于活动状态的视频会话的DPB槽。

应用程序不必在 pBeginInfo->pReferenceSlots 中指定与视频会话的所有活动DPB槽对应的条目,而只需指定那些打算在视频编码范围内使用的条目。这样,应用程序可以避免与将相应图片资源绑定到命令缓冲区相关的任何潜在运行时开销。

对于视频编码会话,应用程序还负责通过在 pBeginInfopNext 链中包含 VkVideoEncodeRateControlInfoKHR 结构的实例,来提供有关为视频会话配置的当前速率控制状态的信息。 如果未包含 VkVideoEncodeRateControlInfoKHR,则表示存在一个空的 VkVideoEncodeRateControlInfoKHR 结构,这表明当前的速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR。 指定的状态必须与在设备上执行记录的命令时为视频会话配置的有效速率控制状态匹配

pBeginInfopNext 链中包含 VkVideoEncodeRateControlInfoKHR 结构的实例不会更改为视频会话配置的速率控制状态,而只是指定在设备上执行记录的命令时配置的预期速率控制状态,这允许实现获取有关命令缓冲区记录时配置的速率控制状态的信息。 为了更改视频会话的当前速率控制状态,应用程序必须按照视频编码控制速率控制状态部分中的描述,发出相应的 vkCmdControlVideoCodingKHR 命令。

有效用法
  • VUID-vkCmdBeginVideoCodingKHR-commandBuffer-07231
    分配 commandBufferVkCommandPool 必须支持使用 pBeginInfo->videoSession 创建的视频编解码器操作,如 vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyVideoPropertiesKHR::videoCodecOperations 中返回的那样。

  • VUID-vkCmdBeginVideoCodingKHR-None-07232
    必须没有活动查询。

  • VUID-vkCmdBeginVideoCodingKHR-commandBuffer-07233
    如果 commandBuffer 是一个非受保护的命令缓冲区,并且不支持protectedNoFault,则 pBeginInfo->videoSession 必须不是使用 VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR 创建的。

  • VUID-vkCmdBeginVideoCodingKHR-commandBuffer-07234
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持protectedNoFault,则 pBeginInfo->videoSession 必须是使用 VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR 创建的。

  • VUID-vkCmdBeginVideoCodingKHR-commandBuffer-07235
    如果 commandBuffer 是一个非受保护的命令缓冲区,不支持 protectedNoFault,并且 pBeginInfo->pReferenceSlots 的任何元素的 pPictureResource 成员不是 NULL,则该元素的 pPictureResource->imageViewBinding 必须不指定从受保护的图像创建的图像视图。

  • VUID-vkCmdBeginVideoCodingKHR-commandBuffer-07236
    如果 commandBuffer 是一个受保护的命令缓冲区,不支持protectedNoFault,并且 pBeginInfo->pReferenceSlots 的任何元素的 pPictureResource 成员不是 NULL,则该元素的 pPictureResource->imageViewBinding 必须指定从受保护的图像创建的图像视图。

  • VUID-vkCmdBeginVideoCodingKHR-slotIndex-07239
    如果 pBeginInfo->pReferenceSlots 的任何元素的 slotIndex 成员不是负数,则它必须指定在设备上执行命令时 pBeginInfo->videoSession 中处于活动状态的 DPB 插槽的索引。

  • VUID-vkCmdBeginVideoCodingKHR-pPictureResource-07265
    pBeginInfo->pReferenceSlots 的元素中指定的任何非 NULLpPictureResource 成员所指定的每个视频图片资源(slotIndex 不是负数)必须匹配在设备上执行命令时,当前与由 slotIndex 指定的 pBeginInfo->videoSession 的 DPB 插槽索引关联的视频图片资源之一。

  • VUID-vkCmdBeginVideoCodingKHR-pBeginInfo-08253
    如果 pBeginInfo->videoSession 是使用视频编码操作创建的,并且 pBeginInfopNext 链不包含 VkVideoEncodeRateControlInfoKHR 结构的实例,则在设备上执行命令时为 pBeginInfo->videoSession 配置的速率控制模式必须VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR

  • VUID-vkCmdBeginVideoCodingKHR-pBeginInfo-08254
    如果 pBeginInfo->videoSession 是使用视频编码操作创建的,并且 pBeginInfopNext 链包含 VkVideoEncodeRateControlInfoKHR 结构的实例,则它必须与在设备上执行命令时为 pBeginInfo->videoSession 配置的速率控制状态匹配

  • VUID-vkCmdBeginVideoCodingKHR-pBeginInfo-08255
    如果 pBeginInfo->videoSession 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,当前的速率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,并且 VkVideoEncodeH264CapabilitiesKHR::requiresGopRemainingFramesVK_TRUE(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对创建 pBeginInfo->videoSession 的视频配置文件返回),则 pBeginInfopNext必须包含一个 VkVideoEncodeH264GopRemainingFrameInfoKHR 的实例,其 useGopRemainingFrames 成员设置为 VK_TRUE

  • VUID-vkCmdBeginVideoCodingKHR-pBeginInfo-08256
    如果 pBeginInfo->videoSession 是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,当前的速率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,并且 VkVideoEncodeH265CapabilitiesKHR::requiresGopRemainingFramesVK_TRUE(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对创建 pBeginInfo->videoSession 的视频配置文件返回),则 pBeginInfopNext必须包含一个 VkVideoEncodeH265GopRemainingFrameInfoKHR 的实例,其 useGopRemainingFrames 成员设置为 VK_TRUE

  • VUID-vkCmdBeginVideoCodingKHR-pBeginInfo-10282
    如果使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建了 pBeginInfo->videoSession,并且当前的速率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,并且 VkVideoEncodeAV1CapabilitiesKHR::requiresGopRemainingFramesVK_TRUE(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对创建 pBeginInfo->videoSession 时使用的视频配置文件返回),则 pBeginInfopNext必须 包含一个 VkVideoEncodeAV1GopRemainingFrameInfoKHR 的实例,且其 useGopRemainingFrames 成员设置为 VK_TRUE

有效用法(隐式)
  • VUID-vkCmdBeginVideoCodingKHR-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdBeginVideoCodingKHR-pBeginInfo-parameter
    pBeginInfo 必须 是指向有效 VkVideoBeginCodingInfoKHR 结构的有效指针。

  • VUID-vkCmdBeginVideoCodingKHR-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdBeginVideoCodingKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持解码或编码操作。

  • VUID-vkCmdBeginVideoCodingKHR-renderpass
    此命令 必须 仅在渲染过程实例之外调用。

  • VUID-vkCmdBeginVideoCodingKHR-videocoding
    此命令 必须 仅在视频编码范围之外调用。

  • VUID-vkCmdBeginVideoCodingKHR-bufferlevel
    commandBuffer 必须 是一个主要的 VkCommandBuffer

主机同步
  • commandBuffer 的主机访问 必须 进行外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 必须 进行外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要

外部

外部

解码
编码

操作
状态

VkVideoBeginCodingInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkVideoBeginCodingInfoKHR {
    VkStructureType                       sType;
    const void*                           pNext;
    VkVideoBeginCodingFlagsKHR            flags;
    VkVideoSessionKHR                     videoSession;
    VkVideoSessionParametersKHR           videoSessionParameters;
    uint32_t                              referenceSlotCount;
    const VkVideoReferenceSlotInfoKHR*    pReferenceSlots;
} VkVideoBeginCodingInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 保留供将来使用。

  • videoSession 是将绑定用于处理视频命令的视频会话对象。

  • videoSessionParametersVK_NULL_HANDLE 或用于处理视频命令的 VkVideoSessionParametersKHR 对象的句柄。如果为 VK_NULL_HANDLE,则在视频编码范围的持续时间内不绑定视频会话参数对象。

  • referenceSlotCountpReferenceSlots 数组中的元素数量。

  • pReferenceSlots 是指向 VkVideoReferenceSlotInfoKHR 结构数组的指针,指定用于确定视频编码范围的绑定参考图像资源集及其与 DPB 插槽索引的初始关联的信息。

以下定义了此结构的相关有效用法语句所引用的限制值。

有效用法
  • VUID-VkVideoBeginCodingInfoKHR-videoSession-07237
    videoSession 必须 将内存绑定到 vkGetVideoSessionMemoryRequirementsKHRvideoSession 返回的所有内存绑定。

  • VUID-VkVideoBeginCodingInfoKHR-slotIndex-04856
    pReferenceSlots 元素中指定的每个非负 VkVideoReferenceSlotInfoKHR::slotIndex 必须 小于创建 videoSession 时指定的 VkVideoSessionCreateInfoKHR::maxDpbSlots

  • VUID-VkVideoBeginCodingInfoKHR-pPictureResource-07238
    pReferenceSlots 元素中指定的任何非 NULLpPictureResource 成员对应的每个视频图像资源在 pReferenceSlots必须 唯一

  • VUID-VkVideoBeginCodingInfoKHR-pPictureResource-07240
    如果 pReferenceSlots 的任何元素的 pPictureResource 成员不是 NULL,则该元素中 pPictureResource->imageViewBinding 中指定的图像视图 必须 与创建 videoSession 时使用的视频配置文件兼容

  • VUID-VkVideoBeginCodingInfoKHR-pPictureResource-07241
    如果 pReferenceSlots 的任何元素的 pPictureResource 成员不是 NULL,则该元素中 pPictureResource->imageViewBinding 中指定的图像视图的格式 必须 与创建 videoSession 时使用的 VkVideoSessionCreateInfoKHR::referencePictureFormat 匹配。

  • VUID-VkVideoBeginCodingInfoKHR-pPictureResource-07242
    如果 pReferenceSlots 的任何元素的 pPictureResource 成员不是 NULL,则其 codedOffset 成员 必须codedOffsetGranularity 的整数倍。

  • VUID-VkVideoBeginCodingInfoKHR-pPictureResource-07243
    如果 pReferenceSlots 的任何元素的 pPictureResource 成员不是 NULL,则其 codedExtent 成员 必须 介于创建 videoSession 时指定的 minCodedExtentmaxCodedExtent 之间(包含这两个值)。

  • VUID-VkVideoBeginCodingInfoKHR-flags-07244
    如果 VkVideoCapabilitiesKHR::flags 不包含 VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对创建 videoSession 时使用的视频配置文件返回的值,则所有具有非 NULL pPictureResource 成员的 pReferenceSlots 元素的 pPictureResource->imageViewBinding 必须 指定从同一图像创建的图像视图。

  • VUID-VkVideoBeginCodingInfoKHR-slotIndex-07245
    如果 videoSession 是使用解码操作创建的,并且 pReferenceSlots 中任何元素的 slotIndex 成员不是负数,则该元素的 pPictureResource->imageViewBinding 中指定的图像视图必须使用 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR 创建。

  • VUID-VkVideoBeginCodingInfoKHR-slotIndex-07246
    如果 videoSession 是使用编码操作创建的,并且 pReferenceSlots 中任何元素的 slotIndex 成员不是负数,则该元素的 pPictureResource->imageViewBinding 中指定的图像视图必须使用 VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR 创建。

  • VUID-VkVideoBeginCodingInfoKHR-videoSession-07247
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则 videoSessionParameters 必须不是 VK_NULL_HANDLE

  • VUID-VkVideoBeginCodingInfoKHR-videoSession-07248
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则 videoSessionParameters 必须不是 VK_NULL_HANDLE

  • VUID-VkVideoBeginCodingInfoKHR-videoSession-09261
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,则 videoSessionParameters 必须不是 VK_NULL_HANDLE

  • VUID-VkVideoBeginCodingInfoKHR-videoSession-07249
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 videoSessionParameters 必须不是 VK_NULL_HANDLE

  • VUID-VkVideoBeginCodingInfoKHR-videoSession-07250
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则 videoSessionParameters 必须不是 VK_NULL_HANDLE

  • VUID-VkVideoBeginCodingInfoKHR-videoSession-10283
    如果 videoSession 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则 videoSessionParameters 必须不是 VK_NULL_HANDLE

  • VUID-VkVideoBeginCodingInfoKHR-videoSessionParameters-04857
    如果 videoSessionParameters 不是 VK_NULL_HANDLE,它必须是使用 VkVideoSessionParametersCreateInfoKHR::videoSession 中指定的 videoSession 创建的。

有效用法(隐式)
// Provided by VK_KHR_video_queue
typedef VkFlags VkVideoBeginCodingFlagsKHR;

VkVideoBeginCodingFlagsKHR 是用于设置掩码的位掩码类型,但目前保留以供将来使用。

VkVideoReferenceSlotInfoKHR 结构定义为:

// Provided by VK_KHR_video_queue
typedef struct VkVideoReferenceSlotInfoKHR {
    VkStructureType                         sType;
    const void*                             pNext;
    int32_t                                 slotIndex;
    const VkVideoPictureResourceInfoKHR*    pPictureResource;
} VkVideoReferenceSlotInfoKHR;
有效用法(隐式)

要结束视频编码范围,请调用:

// Provided by VK_KHR_video_queue
void vkCmdEndVideoCodingKHR(
    VkCommandBuffer                             commandBuffer,
    const VkVideoEndCodingInfoKHR*              pEndCodingInfo);
  • commandBuffer 是要在其中记录命令的命令缓冲区。

  • pEndCodingInfo 是指向 VkVideoEndCodingInfoKHR 结构体的指针,该结构体指定用于结束视频编码范围的参数。

结束视频编码范围后,视频会话对象、可选的视频会话参数对象以及先前由对应的 vkCmdBeginVideoCodingKHR 命令绑定的所有参考图像资源都将解除绑定

有效用法
  • VUID-vkCmdEndVideoCodingKHR-None-07251
    必须没有活动查询。

有效用法(隐式)
  • VUID-vkCmdEndVideoCodingKHR-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdEndVideoCodingKHR-pEndCodingInfo-parameter
    pEndCodingInfo 必须是指向有效的 VkVideoEndCodingInfoKHR 结构的有效指针。

  • VUID-vkCmdEndVideoCodingKHR-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdEndVideoCodingKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持解码或编码操作。

  • VUID-vkCmdEndVideoCodingKHR-renderpass
    此命令 必须 仅在渲染过程实例之外调用。

  • VUID-vkCmdEndVideoCodingKHR-videocoding
    此命令必须仅在视频编码作用域内调用。

  • VUID-vkCmdEndVideoCodingKHR-bufferlevel
    commandBuffer 必须 是一个主要的 VkCommandBuffer

主机同步
  • commandBuffer 的主机访问 必须 进行外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 必须 进行外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要

外部

在内部

解码
编码

操作
状态

VkVideoEndCodingInfoKHR 结构定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkVideoEndCodingInfoKHR {
    VkStructureType             sType;
    const void*                 pNext;
    VkVideoEndCodingFlagsKHR    flags;
} VkVideoEndCodingInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 保留供将来使用。

有效用法(隐式)
  • VUID-VkVideoEndCodingInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR

  • VUID-VkVideoEndCodingInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkVideoEndCodingInfoKHR-flags-zerobitmask
    flags 必须0

// Provided by VK_KHR_video_queue
typedef VkFlags VkVideoEndCodingFlagsKHR;

VkVideoEndCodingFlagsKHR 是用于设置掩码的位掩码类型,但目前保留供将来使用。

视频编码控制

要将动态控制应用于绑定的视频会话对象,请调用

// Provided by VK_KHR_video_queue
void vkCmdControlVideoCodingKHR(
    VkCommandBuffer                             commandBuffer,
    const VkVideoCodingControlInfoKHR*          pCodingControlInfo);
  • commandBuffer 是要在其中记录命令的命令缓冲区。

  • pCodingControlInfo 是指向 VkVideoCodingControlInfoKHR 结构的指针,该结构指定控制参数。

此调用中提供的控制参数在命令在设备上执行时应用于视频会话,并且在后续调用此命令且绑定了相同视频会话时更改相应的控制参数之前有效。

新创建的视频会话必须在使用它执行视频编码操作之前重置,方法是在 pCodingControlInfo->flags 中包含 VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR。重置操作还会将视频会话的所有 DPB 插槽返回到非活动状态。相应地,与绑定的参考图片资源关联的任何 DPB 插槽索引都将被删除。

对于编码会话,重置操作会将速率控制配置返回到实现默认设置,并将视频编码质量级别设置为零。

在使用视频会话执行视频编码操作之后,可以可以使用重置操作将视频会话返回到与重置新创建的视频会话之后相同的*初始*状态。例如,当需要使用相同的视频会话对象处理不同的视频序列时,可以可以使用此方法。

如果 pCodingControlInfo->flags 包含 VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR,则该命令会将视频会话维护的速率控制配置替换为VkVideoEncodeRateControlInfoKHR结构中指定的配置,该结构包含在 pCodingControlInfo->pNext 链中。

如果 pCodingControlInfo->flags 包含 VK_VIDEO_CODING_CONTROL_ENCODE_QUALITY_LEVEL_BIT_KHR,则该命令会将当前视频编码质量级别更改为VkVideoEncodeQualityLevelInfoKHR结构的 qualityLevel 成员中指定的值,该结构包含在 pCodingControlInfo->pNext 链中。

有效用法
  • VUID-vkCmdControlVideoCodingKHR-flags-07017
    如果 pCodingControlInfo->flags 不包含 VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR,则在设备上执行该命令时,绑定的视频会话必须不处于未初始化状态。

  • VUID-vkCmdControlVideoCodingKHR-pCodingControlInfo-08243
    如果绑定的视频会话不是通过编码操作创建的,则 pCodingControlInfo->flags 必须不包含 VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHRVK_VIDEO_CODING_CONTROL_ENCODE_QUALITY_LEVEL_BIT_KHR

有效用法(隐式)
  • VUID-vkCmdControlVideoCodingKHR-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdControlVideoCodingKHR-pCodingControlInfo-parameter
    pCodingControlInfo 必须是指向有效的 VkVideoCodingControlInfoKHR 结构的有效指针。

  • VUID-vkCmdControlVideoCodingKHR-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdControlVideoCodingKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持解码或编码操作。

  • VUID-vkCmdControlVideoCodingKHR-renderpass
    此命令 必须 仅在渲染过程实例之外调用。

  • VUID-vkCmdControlVideoCodingKHR-videocoding
    此命令必须仅在视频编码作用域内调用。

  • VUID-vkCmdControlVideoCodingKHR-bufferlevel
    commandBuffer 必须 是一个主要的 VkCommandBuffer

主机同步
  • commandBuffer 的主机访问 必须 进行外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 必须 进行外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要

外部

在内部

解码
编码

操作

VkVideoCodingControlInfoKHR 结构定义如下:

// Provided by VK_KHR_video_queue
typedef struct VkVideoCodingControlInfoKHR {
    VkStructureType                 sType;
    const void*                     pNext;
    VkVideoCodingControlFlagsKHR    flags;
} VkVideoCodingControlInfoKHR;
有效用法
  • VUID-VkVideoCodingControlInfoKHR-flags-07018
    如果 flags 包含 VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR,则 pNext必须包含 VkVideoEncodeRateControlInfoKHR 结构。

  • VUID-VkVideoCodingControlInfoKHR-flags-08349
    如果 flags 包含 VK_VIDEO_CODING_CONTROL_ENCODE_QUALITY_LEVEL_BIT_KHR,则 pNext必须包含 VkVideoEncodeQualityLevelInfoKHR 结构。

有效用法(隐式)

可以在 VkVideoCodingControlInfoKHR::flags 中设置的位,用于指定要修改的视频编码控制参数,如下所示:

// Provided by VK_KHR_video_queue
typedef enum VkVideoCodingControlFlagBitsKHR {
    VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR = 0x00000001,
  // Provided by VK_KHR_video_encode_queue
    VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR = 0x00000002,
  // Provided by VK_KHR_video_encode_queue
    VK_VIDEO_CODING_CONTROL_ENCODE_QUALITY_LEVEL_BIT_KHR = 0x00000004,
} VkVideoCodingControlFlagBitsKHR;
  • VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR 指定请求在应用其他编码控制参数之前重置绑定的视频会话。

  • VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR 指定编码控制参数包含视频编码速率控制参数(参见VkVideoEncodeRateControlInfoKHR)。

  • VK_VIDEO_CODING_CONTROL_ENCODE_QUALITY_LEVEL_BIT_KHR 指定编码控制参数包含视频编码质量级别参数(参见VkVideoEncodeQualityLevelInfoKHR)。

// Provided by VK_KHR_video_queue
typedef VkFlags VkVideoCodingControlFlagsKHR;

VkVideoCodingControlFlagsKHR 是一个位掩码类型,用于设置零个或多个VkVideoCodingControlFlagBitsKHR的掩码。

内联查询

如果视频会话是用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建的,则不允许在视频编码范围内使用 vkCmdBeginQuery 等命令开始查询。相反,查询是通过在视频编码命令参数的 pNext 链中包含 VkVideoInlineQueryInfoKHR 结构的实例来内联执行的,其 queryPool 成员设置为有效的 VkQueryPool 句柄。

VkVideoInlineQueryInfoKHR 结构定义如下:

// Provided by VK_KHR_video_maintenance1
typedef struct VkVideoInlineQueryInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkQueryPool        queryPool;
    uint32_t           firstQuery;
    uint32_t           queryCount;
} VkVideoInlineQueryInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • queryPoolVK_NULL_HANDLE 或指向 VkQueryPool 对象的有效句柄,该对象将管理查询的结果。

  • firstQuery 是查询池内的查询索引,它将包含第一个视频编码操作的查询结果。后续视频编码操作的查询结果将包含在后续的查询索引中。

  • queryCount 是要执行的查询数量。

    实际上,如果 queryPool 不是 VK_NULL_HANDLE,则 queryCount 始终必须与此结构指定的视频编码命令发出的视频编码操作的数量相匹配,这意味着在视频编码命令中使用内联查询将始终为每个发出的视频编码操作执行查询。

此结构可以包含在视频编码命令的输入参数结构的 pNext 链中。

  • vkCmdDecodeVideoKHR 命令的 pDecodeInfo 参数的 pNext 链中,以执行该命令发出的每个视频解码操作的查询。

  • vkCmdEncodeVideoKHR 命令的 pEncodeInfo 参数的 pNext 链中,以执行该命令发出的每个视频编码操作的查询。

有效用法
  • VUID-VkVideoInlineQueryInfoKHR-queryPool-08372
    如果 queryPool 不是 VK_NULL_HANDLE,则 firstQuery 必须小于 queryPool 中的查询数量。

  • VUID-VkVideoInlineQueryInfoKHR-queryPool-08373
    如果 queryPool 不是 VK_NULL_HANDLE,则 firstQueryqueryCount 的总和必须小于或等于 queryPool 中的查询数量。

有效用法(隐式)
  • VUID-VkVideoInlineQueryInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_INLINE_QUERY_INFO_KHR

  • VUID-VkVideoInlineQueryInfoKHR-queryPool-parameter
    如果 queryPool 不是 VK_NULL_HANDLE,则 queryPool 必须是有效的 VkQueryPool 句柄。

视频解码操作

视频解码操作从视频码流缓冲区和零个或多个参考图像中消耗压缩的视频数据,并生成一个解码输出图像和一个可选的重建图像

这样的解码输出图像可以与解码图像缓冲区共享,也可以用作视频编码操作的输入,与图形或计算操作一起使用,或与 窗口系统集成 API 一起使用,具体取决于实现的性能。

视频解码操作可能VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR 阶段访问以下资源:

  • 源视频码流缓冲区范围和与 活动参考图像列表相对应的图像子区域,访问权限为 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR

  • 与目标解码输出图像重建图像相对应的图像子区域,访问权限为 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR

视频解码操作访问的每个视频图像资源的图像子资源使用相应的 VkVideoPictureResourceInfoKHR 结构指定。每个这样的图像子资源必须处于适当的图像布局,如下所示:

  • 如果图像子资源在视频解码操作中仅用作解码输出图像,则它必须处于 VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR 布局。

  • 如果图像子资源在视频解码操作中既用作解码输出图像又用作重建图像,则它必须处于 VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR 布局。

  • 如果图像子资源在视频解码操作中仅用作重建图像,则它必须处于 VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR 布局。

  • 如果图像子资源在视频解码操作中用作参考图像,则它必须处于 VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR 布局。

视频解码操作可能无法成功完成。在这种情况下,解码输出图像的内容将是未定义的。同样,如果请求参考图像设置,则重建图像的内容也将是未定义的,并且激活的 DPB 插槽将具有无效的图像参考

编解码器特定语义

视频解码操作的以下方面是编解码器特定的:

  • 源视频码流缓冲区范围内容的解释。

  • 活动参考图像列表的构造和解释,以及对相应图像子区域引用的图像数据的解释。

  • 解码输出图像相关的信息的构造和解释,以及向相应图像子区域生成图像数据。

  • 关于参考图像设置的决定。

  • 与可选的重建图像相关的信息的构造和解释,以及向相应图像子区域生成图像数据。

这些编解码器特定的行为是为每个视频编解码器操作单独定义的。

  • 如果使用的视频编解码器操作是 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR,则视频解码过程的编解码器特定方面将按照 H.264 解码操作 部分的定义执行。

  • 如果使用的视频编解码器操作是 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR,则视频解码过程的编解码器特定方面将按照 H.265 解码操作 部分的定义执行。

  • 如果使用的视频编解码器操作是 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR,则视频解码过程的编解码器特定方面将按照 AV1 解码操作 部分的定义执行。

视频解码操作步骤

每个视频解码操作都会在 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR 阶段执行以下步骤

  1. 从源视频码流缓冲区范围读取编码的视频数据。

  2. 根据 编解码器特定语义,执行编码视频数据的图像重建,在此过程中应用从 活动参考图像 读取的任何预测数据;

  3. 根据 编解码器特定语义,将解码的图像数据写入 解码输出图像,并可选择写入 重建图像(如果指定了重建图像且与解码输出图像不同);

  4. 如果请求 参考图像设置,则 重建图像信息 中指定的 DPB 插槽索引 将使用 重建图像 激活

当提供 重建图像信息 时,指定的 DPB 插槽 索引将与相应的 绑定的参考图像资源 相关联,无论是否请求 参考图像设置

能力

当使用 pVideoProfile->videoCodecOperation 指定解码操作调用 vkGetPhysicalDeviceVideoCapabilitiesKHR 时,VkVideoCapabilitiesKHR 结构的 pNext 链中必须包含 VkVideoDecodeCapabilitiesKHR 结构,以检索特定于视频解码的功能。

VkVideoDecodeCapabilitiesKHR 结构定义如下

// Provided by VK_KHR_video_decode_queue
typedef struct VkVideoDecodeCapabilitiesKHR {
    VkStructureType                    sType;
    void*                              pNext;
    VkVideoDecodeCapabilityFlagsKHR    flags;
} VkVideoDecodeCapabilitiesKHR;
有效用法(隐式)
  • VUID-VkVideoDecodeCapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR

VkVideoDecodeCapabilitiesKHR::flags可以设置的位,表示支持的解码功能是

// Provided by VK_KHR_video_decode_queue
typedef enum VkVideoDecodeCapabilityFlagBitsKHR {
    VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR = 0x00000001,
    VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR = 0x00000002,
} VkVideoDecodeCapabilityFlagBitsKHR;
  • VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR 表示支持在视频解码操作中使用相同的视频图像资源作为 重建图像解码输出图像

  • VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR 表示支持在视频解码操作中使用不同的视频图像资源作为 重建图像解码输出图像

    即使视频解码配置文件不支持 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR,某些视频配置文件也允许在特定的视频解码操作中使用不同的视频图像资源作为重建图像和解码输出图像。即使实现仅报告重合,启用 胶片颗粒 的帧的解码输出图像也必须与重建图像不同,因为胶片颗粒是在编码循环之外应用的。

实现仅需要支持 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHRVK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR 中的一个。因此,应用程序应该处理这两种情况,以最大限度地提高可移植性。

如果同时支持 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHRVK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR,则应用程序可以选择为解码 DPB 和解码输出创建单独的图像。例如,在解码输出图像首选(并支持)线性平铺,而 DPB 需要最佳平铺的情况下,这避免了在解码期间额外内存带宽需求的情况下进行单独复制的需要。

// Provided by VK_KHR_video_decode_queue
typedef VkFlags VkVideoDecodeCapabilityFlagsKHR;

VkVideoDecodeCapabilityFlagsKHR 是一种位掩码类型,用于设置零个或多个 VkVideoDecodeCapabilityFlagBitsKHR 的掩码。

视频解码命令

要启动视频解码操作,请调用

// Provided by VK_KHR_video_decode_queue
void vkCmdDecodeVideoKHR(
    VkCommandBuffer                             commandBuffer,
    const VkVideoDecodeInfoKHR*                 pDecodeInfo);
  • commandBuffer 是要在其中记录命令的命令缓冲区。

  • pDecodeInfo 是指向 VkVideoDecodeInfoKHR 结构的指针,该结构指定视频解码操作的参数。

每次调用都会发出一个或多个视频解码操作。隐式参数 opCount 对应于命令发出的视频解码操作的数量。调用此命令后,每个 活动 查询的活动查询索引 都会增加 opCount

目前,每次调用此命令都会导致发出单个视频解码操作。

如果使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建了绑定的视频会话,并且 pDecodeInfopNext 链包含一个 VkVideoInlineQueryInfoKHR 结构,其 queryPool 成员指定了一个有效的 VkQueryPool 句柄,则此命令将为发出的每个视频解码操作执行查询。

活动参考图像信息

视频解码操作使用的 活动参考图像 列表是作为 参考图像 数据源使用的图像子区域以及相关参数的列表,并且是从作为 pDecodeInfo->pReferenceSlots 数组元素提供的 VkVideoReferenceSlotInfoKHR 结构派生的。对于 pDecodeInfo->pReferenceSlots 的每个元素,都会根据 编解码器特定语义 的定义,将一个或多个元素添加到活动参考图像列表中。此列表的每个元素都包含以下信息

  • 图像子资源中引用的图像子区域,该子资源由用作参考图像的 视频图像资源 引用。

  • 参考图像关联的 DPB 插槽 索引。

  • 与参考图像相关的编解码器特定参考信息。

重建图像信息

与视频解码操作使用的可选 重建图像 相关的信息是从 pDecodeInfo->pSetupReferenceSlot 指向的 VkVideoReferenceSlotInfoKHR 结构派生的(如果不是 NULL),根据 编解码器特定语义 的定义,并包含以下内容

  • 重建图像中,由引用的图像子资源内的图像子区域,该子区域由用作重建图像的视频图像资源指定。

  • 用于图像重建的DPB槽索引。

  • 与重建图像相关的编解码器特定参考信息。

除非视频会话创建时,VkVideoSessionCreateInfoKHR::maxDpbSlot等于零,否则始终需要在pDecodeInfo->pSetupReferenceSlot中指定一个有效的VkVideoReferenceSlotInfoKHR结构。但是,只有根据编解码器特定语义请求参考图像设置时,pDecodeInfo->pSetupReferenceSlot→slotIndex标识的DPB槽才会被激活,并使用pDecodeInfo->pSetupReferenceSlot→pPictureResource中指定的重建图像

如果指定了重建图像信息,并且pDecodeInfo->pSetupReferenceSlot→pPictureResource引用的视频图像资源解码输出图像的不同,但未请求参考图像设置,则视频解码操作后,对应于重建图像的视频图像资源的内容将是未定义的

即使重建图像未标记为将来参考,一些实现也可能始终输出重建图像或在视频解码操作期间将其用作临时存储。

解码输出图像信息

视频解码操作使用的解码输出图像相关信息,来源于pDecodeInfo->dstPictureResource以及pDecodeInfo->pNext链中提供的任何编解码器特定参数,由编解码器特定语义定义,并包含以下内容:

  • 解码输出图像中,由引用的图像子资源内的图像子区域,该子区域由用作解码输出图像的视频图像资源指定。

  • 与解码输出图像相关的编解码器特定图像信息。

下面定义了一些限制值,这些值被此命令的相关有效使用语句引用。

  • uint32_t activeReferencePictureCount为视频解码操作使用的活动参考图像列表的大小。除非另有定义,否则activeReferencePictureCount设置为pDecodeInfo->referenceSlotCount的值。

    • 如果绑定的视频会话是使用H.264解码配置文件创建的,那么令activeReferencePictureCountpDecodeInfo->referenceSlotCount的值,加上pDecodeInfo->pReferenceSlots数组中包含VkVideoDecodeH264DpbSlotInfoKHR结构的元素的数量,其中pNext链中同时设置了pStdReferenceInfo->flags.top_field_flagpStdReferenceInfo->flags.bottom_field_flag

      这意味着,根据H.264解码操作的活动参考图像列表构造规则pDecodeInfo->pReferenceSlots中既包含顶部场参考又包含底部场参考的元素被视为两个单独的活动参考图像。

  • VkOffset2D codedOffsetGranularity 为视频图像资源的编码偏移的最小对齐要求。除非另有定义,否则 codedOffsetGranularityxy 成员的值均为 0

  • uint32_t dpbFrameUseCount[]为大小为maxDpbSlots的数组,其中maxDpbSlots是绑定的视频会话创建时使用的VkVideoSessionCreateInfoKHR::maxDpbSlots,每个元素表示视频编码操作引用与相应DPB槽索引关联的帧的次数。令数组的每个元素的初始值为0

    • 如果pDecodeInfo->pSetupReferenceSlot不为NULL,那么dpbFrameUseCount[i]增加1,其中i等于pDecodeInfo->pSetupReferenceSlot→slotIndex。如果绑定的视频会话对象是使用H.264解码配置文件创建的,那么如果pDecodeInfo->pSetupReferenceSlot→pNext链中的VkVideoDecodeH264DpbSlotInfoKHR结构中设置了pStdReferenceInfo->flags.top_field_flagpStdReferenceInfo->flags.bottom_field_flag,则dpbFrameUseCount[i]减1。

    • 对于pDecodeInfo->pReferenceSlots的每个元素,dpbFrameUseCount[i]增加1,其中i等于相应元素的slotIndex成员。如果绑定的视频会话对象是使用H.264解码配置文件创建的,那么如果pDecodeInfo->pReferenceSlots的相应元素的pNext链中的VkVideoDecodeH264DpbSlotInfoKHR结构中设置了pStdReferenceInfo->flags.top_field_flagpStdReferenceInfo->flags.bottom_field_flag,则dpbFrameUseCount[i]减1。

  • uint32_t dpbTopFieldUseCount[]uint32_t dpbBottomFieldUseCount[]为大小为maxDpbSlots的数组,其中maxDpbSlots是绑定的视频会话创建时使用的VkVideoSessionCreateInfoKHR::maxDpbSlots,每个元素分别表示视频编码操作引用与相应DPB槽索引关联的顶部场或底部场的次数。令数组的每个元素的初始值为0

    • 如果绑定的视频会话对象是使用H.264解码配置文件创建的,并且pDecodeInfo->pSetupReferenceSlot不为NULL,则执行以下操作:

      • 如果pDecodeInfo->pSetupReferenceSlot→pNext链中的VkVideoDecodeH264DpbSlotInfoKHR结构中设置了pStdReferenceInfo->flags.top_field_flag,则dpbTopFieldUseCount[i]增加1,其中i等于pDecodeInfo->pSetupReferenceSlot→slotIndex

      • 如果pDecodeInfo->pSetupReferenceSlot→pNext链中的VkVideoDecodeH264DpbSlotInfoKHR结构中设置了pStdReferenceInfo->flags.bottom_field_flag,则dpbBottomFieldUseCount[i]增加1,其中i等于pDecodeInfo->pSetupReferenceSlot→slotIndex

    • 如果绑定的视频会话对象是使用H.264解码配置文件创建的,则对pDecodeInfo->pReferenceSlots的每个元素执行以下操作:

      • 如果元素的pNext链中的VkVideoDecodeH264DpbSlotInfoKHR结构中设置了pStdReferenceInfo->flags.top_field_flag,则dpbTopFieldUseCount[i]增加1,其中i等于该元素的slotIndex成员。

      • 如果元素的pNext链中的VkVideoDecodeH264DpbSlotInfoKHR结构中设置了pStdReferenceInfo->flags.bottom_field_flag,则dpbBottomFieldUseCount[i]增加1,其中i等于该元素的slotIndex成员。

有效用法
  • VUID-vkCmdDecodeVideoKHR-None-08249
    绑定的视频会话必须已使用解码操作创建。

  • VUID-vkCmdDecodeVideoKHR-None-07011
    在设备上执行命令时,绑定的视频会话必须不在未初始化状态。

  • VUID-vkCmdDecodeVideoKHR-opCount-07134
    对于每个活跃查询,对应于该查询类型的活跃查询索引加上opCount必须小于或等于对应于该查询类型的最后可激活查询索引加一。

  • VUID-vkCmdDecodeVideoKHR-pNext-08365
    如果绑定的视频会话是使用VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR创建的,并且pDecodeInfopNext链包含一个VkVideoInlineQueryInfoKHR结构,其queryPool成员指定一个有效的VkQueryPool句柄,则VkVideoInlineQueryInfoKHR::queryCount必须等于opCount

  • VUID-vkCmdDecodeVideoKHR-pNext-08366
    如果绑定的视频会话是使用VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR创建的,并且pDecodeInfopNext链包含一个VkVideoInlineQueryInfoKHR结构,其queryPool成员指定一个有效的VkQueryPool句柄,则命令使用的所有查询,如VkVideoInlineQueryInfoKHR结构指定的,必须是*不可用*的。

  • VUID-vkCmdDecodeVideoKHR-queryType-08367
    如果绑定的视频会话是使用VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR创建的,那么用于创建pDecodeInfopNext链中包含的VkVideoInlineQueryInfoKHR结构中指定的queryPoolqueryType必须VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR

  • VUID-vkCmdDecodeVideoKHR-queryPool-08368
    如果绑定的视频会话是使用VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR创建的,那么在pDecodeInfopNext链中包含的VkVideoInlineQueryInfoKHR结构中指定的queryPool必须使用包含在VkQueryPoolCreateInfopNext链中的VkVideoProfileInfoKHR结构创建,该结构与创建绑定的视频会话时VkVideoSessionCreateInfoKHR::pVideoProfile中指定的结构相同。

  • VUID-vkCmdDecodeVideoKHR-queryType-08369
    如果绑定的视频会话是使用VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR创建的,并且用于创建pDecodeInfopNext链中包含的VkVideoInlineQueryInfoKHR结构中指定的queryPoolqueryTypeVK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR,那么分配commandBufferVkCommandPool必须使用支持结果状态查询的队列族索引创建,如VkQueueFamilyQueryResultStatusPropertiesKHR::queryResultStatusSupport所示。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07135
    pDecodeInfo->srcBuffer必须与创建绑定的视频会话时使用的视频配置文件兼容

  • VUID-vkCmdDecodeVideoKHR-commandBuffer-07136
    如果commandBuffer是一个未受保护的命令缓冲区,并且不支持protectedNoFault,则pDecodeInfo->srcBuffer必须不是受保护的缓冲区。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07138
    pDecodeInfo->srcBufferOffset必须VkVideoCapabilitiesKHR::minBitstreamBufferOffsetAlignment的整数倍,如vkGetPhysicalDeviceVideoCapabilitiesKHR为创建绑定的视频会话时使用的视频配置文件返回的值。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07139
    pDecodeInfo->srcBufferRange必须VkVideoCapabilitiesKHR::minBitstreamBufferSizeAlignment的整数倍,如vkGetPhysicalDeviceVideoCapabilitiesKHR为创建绑定的视频会话时使用的视频配置文件返回的值。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07140
    如果pDecodeInfo->pSetupReferenceSlot不是NULL,并且VkVideoDecodeCapabilitiesKHR::flags不包含VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR,如vkGetPhysicalDeviceVideoCapabilitiesKHR为创建绑定的视频会话时使用的视频配置文件返回的值,则pDecodeInfo->dstPictureResourcepDecodeInfo->pSetupReferenceSlot→pPictureResource指定的视频图像资源必须匹配

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07141
    如果pDecodeInfo->pSetupReferenceSlot不是NULL,并且以下任何一项都不为真:

    pDecodeInfo->dstPictureResourcepDecodeInfo->pSetupReferenceSlot→pPictureResource指定的视频图像资源必须匹配

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07142
    pDecodeInfo->dstPictureResource.imageViewBinding必须与创建绑定的视频会话时使用的视频配置文件兼容

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07143
    pDecodeInfo->dstPictureResource.imageViewBinding的格式必须与创建绑定的视频会话时使用的VkVideoSessionCreateInfoKHR::pictureFormat匹配。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07144
    pDecodeInfo->dstPictureResource.codedOffset必须codedOffsetGranularity的整数倍。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07145
    pDecodeInfo->dstPictureResource.codedExtent 必须介于 minCodedExtentmaxCodedExtent 之间(包括边界值),这两个值是创建绑定视频会话时使用的。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07146
    pDecodeInfo->dstPictureResource.imageViewBinding 必须使用 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR 创建。

  • VUID-vkCmdDecodeVideoKHR-commandBuffer-07147
    如果 commandBuffer 是一个非保护命令缓冲区,并且不支持 protectedNoFault,则 pDecodeInfo->dstPictureResource.imageViewBinding 不得从受保护的图像创建。

  • VUID-vkCmdDecodeVideoKHR-commandBuffer-07148
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则 pDecodeInfo->dstPictureResource.imageViewBinding 必须从受保护的图像创建。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-08376
    pDecodeInfo->pSetupReferenceSlot 不得NULL,除非绑定视频会话的创建使用了 VkVideoSessionCreateInfoKHR::maxDpbSlots 等于零。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07170
    如果 pDecodeInfo->pSetupReferenceSlot 不为 NULL,则 pDecodeInfo->pSetupReferenceSlot→slotIndex 必须小于创建绑定视频会话时指定的 VkVideoSessionCreateInfoKHR::maxDpbSlots

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07173
    如果 pDecodeInfo->pSetupReferenceSlot 不为 NULL,则 pDecodeInfo->pSetupReferenceSlot→pPictureResource→codedOffset 必须codedOffsetGranularity 的整数倍。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07149
    如果 pDecodeInfo->pSetupReferenceSlot 不为 NULL,则 pDecodeInfo->pSetupReferenceSlot→pPictureResource 必须 匹配一个 绑定的参考图像资源

  • VUID-vkCmdDecodeVideoKHR-activeReferencePictureCount-07150
    activeReferencePictureCount 必须小于或等于创建绑定视频会话时指定的 VkVideoSessionCreateInfoKHR::maxActiveReferencePictures

  • VUID-vkCmdDecodeVideoKHR-slotIndex-07256
    pDecodeInfo->pReferenceSlots 的每个元素的 slotIndex 成员必须小于创建绑定视频会话时指定的 VkVideoSessionCreateInfoKHR::maxDpbSlots

  • VUID-vkCmdDecodeVideoKHR-codedOffset-07257
    pDecodeInfo->pReferenceSlots 的每个元素的 pPictureResource 成员指向的 VkVideoPictureResourceInfoKHR 结构的 codedOffset 成员必须codedOffsetGranularity 的整数倍。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07151
    pDecodeInfo->pReferenceSlots 的每个元素的 pPictureResource 成员必须 匹配与该元素的 slotIndex 成员中指定的 DPB 插槽索引关联的 绑定参考图像资源之一。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07264
    pDecodeInfo->pReferenceSlots 的元素中指定的 pPictureResource 成员对应的每个视频图像资源在 pDecodeInfo->pReferenceSlots必须唯一的。

  • VUID-vkCmdDecodeVideoKHR-dpbFrameUseCount-07176
    dpbFrameUseCount 的所有元素必须小于或等于 1

  • VUID-vkCmdDecodeVideoKHR-dpbTopFieldUseCount-07177
    dpbTopFieldUseCount 的所有元素必须小于或等于 1

  • VUID-vkCmdDecodeVideoKHR-dpbBottomFieldUseCount-07178
    dpbBottomFieldUseCount 的所有元素必须小于或等于 1

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07252
    如果 pDecodeInfo->pSetupReferenceSlotNULLpDecodeInfo->pSetupReferenceSlot→pPictureResource 没有引用pDecodeInfo->dstPictureResource 相同的图像子资源,则在设备上执行视频解码操作时,pDecodeInfo->dstPictureResource 引用的图像子资源必须处于 VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR 布局。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07253
    如果 pDecodeInfo->pSetupReferenceSlot 不为 NULLpDecodeInfo->pSetupReferenceSlot→pPictureResource 引用pDecodeInfo->dstPictureResource 相同的图像子资源,则在设备上执行视频解码操作时,pDecodeInfo->dstPictureResource 引用的图像子资源必须处于 VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR 布局。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07254
    如果 pDecodeInfo->pSetupReferenceSlot 不为 NULL,则在设备上执行视频解码操作时,pDecodeInfo->pSetupReferenceSlot→pPictureResource 引用的图像子资源必须处于 VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR 布局。

  • VUID-vkCmdDecodeVideoKHR-pPictureResource-07255
    在设备上执行视频解码操作时,pDecodeInfo->pReferenceSlots 的每个元素的 pPictureResource 成员 引用的图像子资源必须处于 VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR 布局。

  • VUID-vkCmdDecodeVideoKHR-pNext-07152
    如果绑定视频会话的创建使用了视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR,则 pDecodeInfopNext必须包含 VkVideoDecodeH264PictureInfoKHR 结构。

  • VUID-vkCmdDecodeVideoKHR-None-07258
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,但未使用 隔行帧支持 创建,则解码输出图像 必须 表示一个帧

  • VUID-vkCmdDecodeVideoKHR-pSliceOffsets-07153
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则 pDecodeInfopNext 链中包含的 VkVideoDecodeH264PictureInfoKHR 结构的 pSliceOffsets 成员的所有元素必须小于 pDecodeInfo->srcBufferRange

  • VUID-vkCmdDecodeVideoKHR-StdVideoH264SequenceParameterSet-07154
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则绑定的视频会话参数对象必须包含一个 StdVideoH264SequenceParameterSet 条目,其 seq_parameter_set_idpDecodeInfopNext 链中包含的 VkVideoDecodeH264PictureInfoKHR 结构的 pStdPictureInfo 成员中提供的 StdVideoDecodeH264PictureInfo::seq_parameter_set_id 匹配

  • VUID-vkCmdDecodeVideoKHR-StdVideoH264PictureParameterSet-07155
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则绑定的视频会话参数对象必须包含一个 StdVideoH264PictureParameterSet 条目,其 seq_parameter_set_idpic_parameter_set_id 分别与 pDecodeInfopNext 链中包含的 VkVideoDecodeH264PictureInfoKHR 结构的 pStdPictureInfo 成员中提供的 StdVideoDecodeH264PictureInfo::seq_parameter_set_idStdVideoDecodeH264PictureInfo::pic_parameter_set_id 匹配

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07156
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,且 pDecodeInfo->pSetupReferenceSlot 不为 NULL,则 pDecodeInfo->pSetupReferenceSlotpNext必须包含一个 VkVideoDecodeH264DpbSlotInfoKHR 结构

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07259
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,但未使用 隔行帧支持 创建,且 pDecodeInfo->pSetupReferenceSlot 不为 NULL,则重建图像 必须 表示一个帧

  • VUID-vkCmdDecodeVideoKHR-pNext-07157
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,则 pDecodeInfo->pReferenceSlots 的每个元素的 pNext必须包含一个 VkVideoDecodeH264DpbSlotInfoKHR 结构

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07260
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,但未使用 隔行帧支持 创建,则与 pDecodeInfo->pReferenceSlots 的元素对应的每个活动参考图像 必须 表示一个帧

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07261
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,pDecodeInfo->pSetupReferenceSlot 不为 NULL,且 解码输出图像 表示一个帧,则重建图像 必须 也表示一个帧

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07262
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,pDecodeInfo->pSetupReferenceSlot 不为 NULL,且 解码输出图像 表示一个顶场,则重建图像 必须 也表示一个顶场

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07263
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,pDecodeInfo->pSetupReferenceSlot 不为 NULL,且 解码输出图像 表示一个底场,则重建图像 必须 也表示一个底场

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07266
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,且与 pDecodeInfo->pReferenceSlots 的任何元素对应的活动参考图像 表示一个帧,则由该元素的 slotIndex 成员指定的绑定视频会话的 DPB 插槽索引必须当前与在设备上执行命令时由同一元素的 pPictureResource 成员指定的视频图像资源匹配的帧图像关联

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07267
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,且与 pDecodeInfo->pReferenceSlots 的任何元素对应的活动参考图像 表示一个顶场,则由该元素的 slotIndex 成员指定的绑定视频会话的 DPB 插槽索引必须当前与在设备上执行命令时由同一元素的 pPictureResource 成员指定的视频图像资源匹配的顶场图像关联

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07268
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的,且与 pDecodeInfo->pReferenceSlots 的任何元素对应的活动参考图像 表示一个底场,则由该元素的 slotIndex 成员指定的绑定视频会话的 DPB 插槽索引必须当前与在设备上执行命令时由同一元素的 pPictureResource 成员指定的视频图像资源匹配的底场图像关联

  • VUID-vkCmdDecodeVideoKHR-pNext-07158
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,则 pDecodeInfopNext必须包含一个 VkVideoDecodeH265PictureInfoKHR 结构

  • VUID-vkCmdDecodeVideoKHR-pSliceSegmentOffsets-07159
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,那么 pDecodeInfopNext 链中包含的 VkVideoDecodeH265PictureInfoKHR 结构的 pSliceSegmentOffsets 成员的所有元素必须小于 pDecodeInfo->srcBufferRange

  • VUID-vkCmdDecodeVideoKHR-StdVideoH265VideoParameterSet-07160
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,那么绑定的视频会话参数对象必须包含一个 StdVideoH265VideoParameterSet 条目,其 vps_video_parameter_set_idpDecodeInfopNext 链中包含的 VkVideoDecodeH265PictureInfoKHR 结构的 pStdPictureInfo 成员中提供的 StdVideoDecodeH265PictureInfo::sps_video_parameter_set_id 相匹配。

  • VUID-vkCmdDecodeVideoKHR-StdVideoH265SequenceParameterSet-07161
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,那么绑定的视频会话参数对象必须包含一个 StdVideoH265SequenceParameterSet 条目,其 sps_video_parameter_set_idsps_seq_parameter_set_id 分别与 pDecodeInfopNext 链中包含的 VkVideoDecodeH265PictureInfoKHR 结构的 pStdPictureInfo 成员中提供的 StdVideoDecodeH265PictureInfo::sps_video_parameter_set_idStdVideoDecodeH265PictureInfo::pps_seq_parameter_set_id 相匹配。

  • VUID-vkCmdDecodeVideoKHR-StdVideoH265PictureParameterSet-07162
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,那么绑定的视频会话参数对象必须包含一个 StdVideoH265PictureParameterSet 条目,其 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 分别与 pDecodeInfopNext 链中包含的 VkVideoDecodeH265PictureInfoKHR 结构的 pStdPictureInfo 成员中提供的 StdVideoDecodeH265PictureInfo::sps_video_parameter_set_idStdVideoDecodeH265PictureInfo::pps_seq_parameter_set_idStdVideoDecodeH265PictureInfo::pps_pic_parameter_set_id 相匹配。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07163
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,并且 pDecodeInfo->pSetupReferenceSlot 不为 NULL,那么 pDecodeInfo->pSetupReferenceSlotpNext必须包含一个 VkVideoDecodeH265DpbSlotInfoKHR 结构。

  • VUID-vkCmdDecodeVideoKHR-pNext-07164
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的,那么 pDecodeInfo->pReferenceSlots 的每个元素的 pNext必须包含一个 VkVideoDecodeH265DpbSlotInfoKHR 结构。

  • VUID-vkCmdDecodeVideoKHR-filmGrainSupport-09248
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,并且 VkVideoDecodeAV1ProfileInfoKHR::filmGrainSupport 设置为 VK_FALSE,那么解码后的图像必须不启用胶片颗粒

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-09249
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,pDecodeInfo->pSetupReferenceSlot 不为 NULL,并且解码后的图像启用了胶片颗粒,那么 pDecodeInfo->dstPictureResourcepDecodeInfo->pSetupReferenceSlot→pPictureResource 指定的视频图像资源必须匹配

  • VUID-vkCmdDecodeVideoKHR-pNext-09250
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,那么 pDecodeInfopNext必须包含一个 VkVideoDecodeAV1PictureInfoKHR 结构。

  • VUID-vkCmdDecodeVideoKHR-frameHeaderOffset-09251
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,那么 pDecodeInfopNext 链中包含的 VkVideoDecodeAV1PictureInfoKHR 结构的 frameHeaderOffset 成员必须小于 pDecodeInfo->srcBufferRange

  • VUID-vkCmdDecodeVideoKHR-pTileOffsets-09253
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,那么 pDecodeInfopNext 链中包含的 VkVideoDecodeAV1PictureInfoKHR 结构的 pTileOffsets 成员的所有元素必须小于 pDecodeInfo->srcBufferRange

  • VUID-vkCmdDecodeVideoKHR-pTileOffsets-09252
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,那么对于 pDecodeInfopNext 链中包含的 VkVideoDecodeAV1PictureInfoKHR 结构的 pTileOffsetspTileSizes 成员的每个元素 ipTileOffsets[i] 和 pTileSizes[i] 的总和必须小于或等于 pDecodeInfo->srcBufferRange

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-09254
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,并且 pDecodeInfo->pSetupReferenceSlot 不为 NULL,那么 pDecodeInfo->pSetupReferenceSlotpNext必须包含一个 VkVideoDecodeAV1DpbSlotInfoKHR 结构。

  • VUID-vkCmdDecodeVideoKHR-pNext-09255
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,那么 pDecodeInfo->pReferenceSlots 的每个元素的 pNext必须包含一个 VkVideoDecodeAV1DpbSlotInfoKHR 结构。

  • VUID-vkCmdDecodeVideoKHR-referenceNameSlotIndices-09262
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,那么 pDecodeInfopNext 链中包含的 VkVideoDecodeAV1PictureInfoKHR 结构的 referenceNameSlotIndices 数组成员的每个元素必须为负数,或者必须等于 pDecodeInfo->pReferenceSlots 的其中一个元素的 slotIndex 成员。

  • VUID-vkCmdDecodeVideoKHR-slotIndex-09263
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的,那么 pDecodeInfo->pReferenceSlots 的每个元素的 slotIndex 成员必须等于 pDecodeInfopNext 链中包含的 VkVideoDecodeAV1PictureInfoKHR 结构的 referenceNameSlotIndices 数组成员的其中一个元素。

有效用法(隐式)
  • VUID-vkCmdDecodeVideoKHR-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdDecodeVideoKHR-pDecodeInfo-parameter
    pDecodeInfo 必须是指向有效 VkVideoDecodeInfoKHR 结构的有效指针。

  • VUID-vkCmdDecodeVideoKHR-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdDecodeVideoKHR-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持解码操作。

  • VUID-vkCmdDecodeVideoKHR-renderpass
    此命令 必须 仅在渲染过程实例之外调用。

  • VUID-vkCmdDecodeVideoKHR-videocoding
    此命令必须仅在视频编码作用域内调用。

  • VUID-vkCmdDecodeVideoKHR-bufferlevel
    commandBuffer 必须 是一个主要的 VkCommandBuffer

主机同步
  • commandBuffer 的主机访问 必须 进行外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 必须 进行外部同步。

VkVideoDecodeInfoKHR 结构定义如下:

// Provided by VK_KHR_video_decode_queue
typedef struct VkVideoDecodeInfoKHR {
    VkStructureType                       sType;
    const void*                           pNext;
    VkVideoDecodeFlagsKHR                 flags;
    VkBuffer                              srcBuffer;
    VkDeviceSize                          srcBufferOffset;
    VkDeviceSize                          srcBufferRange;
    VkVideoPictureResourceInfoKHR         dstPictureResource;
    const VkVideoReferenceSlotInfoKHR*    pSetupReferenceSlot;
    uint32_t                              referenceSlotCount;
    const VkVideoReferenceSlotInfoKHR*    pReferenceSlots;
} VkVideoDecodeInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 保留供将来使用。

  • srcBuffer 是读取编码码流的源视频码流缓冲区。

  • srcBufferOffset 是从 srcBuffer 的起始位置到读取编码码流的起始字节偏移量。

  • srcBufferRange 是从 srcBufferOffset 开始,从 srcBuffer 解码的编码码流的字节大小。

  • dstPictureResource 是用作解码输出图像的视频图像资源。

  • pSetupReferenceSlotNULL 或指向 VkVideoReferenceSlotInfoKHR 结构的指针,该结构指定重建图像信息

  • referenceSlotCountpReferenceSlots 数组中的元素数量。

  • pReferenceSlotsNULL 或指向 VkVideoReferenceSlotInfoKHR 结构数组的指针,该数组描述了 DPB 插槽以及在此视频解码操作中使用的相应参考图像资源(活动参考图像的集合)。

有效用法
  • VUID-VkVideoDecodeInfoKHR-srcBuffer-07165
    创建 srcBuffer必须设置了 VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR

  • VUID-VkVideoDecodeInfoKHR-srcBufferOffset-07166
    srcBufferOffset 必须小于 srcBuffer 的大小。

  • VUID-VkVideoDecodeInfoKHR-srcBufferRange-07167
    srcBufferRange 必须小于或等于 srcBuffer 的大小减去 srcBufferOffset

  • VUID-VkVideoDecodeInfoKHR-pSetupReferenceSlot-07168
    如果 pSetupReferenceSlot 不是 NULL,则其 slotIndex 成员必须不是负数。

  • VUID-VkVideoDecodeInfoKHR-pSetupReferenceSlot-07169
    如果 pSetupReferenceSlot 不是 NULL,则其 pPictureResource 必须不是 NULL

  • VUID-VkVideoDecodeInfoKHR-slotIndex-07171
    pReferenceSlots 的每个元素的 slotIndex 成员必须不是负数。

  • VUID-VkVideoDecodeInfoKHR-pPictureResource-07172
    pReferenceSlots 的每个元素的 pPictureResource 成员必须不是 NULL

有效用法(隐式)
  • VUID-VkVideoDecodeInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR

  • VUID-VkVideoDecodeInfoKHR-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkVideoDecodeAV1PictureInfoKHRVkVideoDecodeH264PictureInfoKHRVkVideoDecodeH265PictureInfoKHRVkVideoInlineQueryInfoKHR 的有效实例的指针。

  • VUID-VkVideoDecodeInfoKHR-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkVideoDecodeInfoKHR-flags-zerobitmask
    flags 必须0

  • VUID-VkVideoDecodeInfoKHR-srcBuffer-parameter
    srcBuffer 必须是有效的 VkBuffer 句柄。

  • VUID-VkVideoDecodeInfoKHR-dstPictureResource-parameter
    dstPictureResource 必须是有效的 VkVideoPictureResourceInfoKHR 结构。

  • VUID-VkVideoDecodeInfoKHR-pSetupReferenceSlot-parameter
    如果 pSetupReferenceSlot 不是 NULL,则 pSetupReferenceSlot 必须是指向有效 VkVideoReferenceSlotInfoKHR 结构的有效指针。

  • VUID-VkVideoDecodeInfoKHR-pReferenceSlots-parameter
    如果 referenceSlotCount 不是 0,则 pReferenceSlots 必须是指向 referenceSlotCount 个有效 VkVideoReferenceSlotInfoKHR 结构体的有效指针。

// Provided by VK_KHR_video_decode_queue
typedef VkFlags VkVideoDecodeFlagsKHR;

VkVideoDecodeFlagsKHR 是一个用于设置掩码的位掩码类型,但目前保留供将来使用。

H.264 解码操作

可以使用使用H.264 解码配置文件的视频解码操作来解码符合ITU-T H.264 规范的基本视频流序列。

有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言

此过程根据视频解码操作步骤执行,编解码器特定的语义定义在 ITU-T H.264 规范第 8 节中,如下所示:

如果参数和比特流符合ITU-T H.264 规范相应章节中定义的语法和语义要求(如上所述),并且与活动参考图像关联的DPB槽都指向有效的图像参考,则视频解码操作将成功完成。否则,视频解码操作可能不成功

H.264 解码比特流数据访问

如果目标解码输出图像是一个帧,则视频比特流缓冲区范围应该包含一个由切片头和表示整个帧的图像数据组成的VCL NAL单元,如ITU-T H.264 规范的第7.3.3和7.3.4节定义,并且这些数据按照第7.4.3和7.4.4节的定义进行解释。

如果目标解码输出图像是一个场,则视频比特流缓冲区范围应该包含一个由切片头和表示一个场的图像数据组成的VCL NAL单元,如ITU-T H.264 规范的第7.3.3和7.3.4节定义,并且这些数据按照第7.4.3和7.4.4节的定义进行解释。

VkVideoDecodeH264PictureInfoKHR::pSliceOffsets 中提供的偏移量应该指定视频比特流缓冲区范围内每个切片头的起始偏移量。

H.264 解码图像数据访问

与使用H.264 解码配置文件的视频解码操作中使用的解码输出图像参考图像重建图像对应的有效 imageOffsetimageExtent 定义如下:

  • 如果图像表示一个帧,则 imageOffset(codedOffset.x,codedOffset.y)imageExtent(codedExtent.width, codedExtent.height)

  • 如果图像表示一个场,并且所用H.264 解码配置文件的图像布局为 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR,则 imageOffset(codedOffset.x,codedOffset.y)imageExtent(codedExtent.width, codedExtent.height)

  • 如果图像表示一个场,并且所用H.264 解码配置文件的图像布局为 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR,则 imageOffset(codedOffset.x,codedOffset.y)imageExtent(codedExtent.width, codedExtent.height / 2)

其中 codedOffsetcodedExtent 是与该图像对应的 VkVideoPictureResourceInfoKHR 结构的成员。

但是,对视频图像资源内的图像数据的访问,发生在 VkVideoCapabilitiesKHR::pictureAccessGranularity 指示的粒度上,这是由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所用的视频配置文件返回的。这意味着使用H.264 解码配置文件进行视频编码操作所访问的完整图像子区域,定义为坐标范围内的纹素集合:

([startX,endX), [startY,endY))

其中

  • startX 等于 imageOffset.x 向下舍入到最接近的 pictureAccessGranularity.width 的整数倍;

  • endX 等于 imageOffset.x + imageExtent.width 向上舍入到最接近的 pictureAccessGranularity.width 的整数倍,并限制到由相应的 VkVideoPictureResourceInfoKHR 结构引用的图像子资源的宽度;

  • startY 等于 imageOffset.y 向下舍入到最接近的 pictureAccessGranularity.height 的整数倍;

  • endY 等于 imageOffset.y + imageExtent.height 向上舍入到最接近的 pictureAccessGranularity.height 的整数倍,并限制到由相应的 VkVideoPictureResourceInfoKHR 结构引用的图像子资源的高度。

在使用H.264 解码配置文件的视频解码操作中,按照ITU-T H.264 规范定义,对坐标 (x,y) 处的图像的任何访问,都是对由相应的VkVideoPictureResourceInfoKHR 结构引用的图像子资源的访问,其纹素坐标如下所示:

  • 如果访问的图像表示一个帧,则为 (x,y)

  • 如果访问的图像表示一个顶场,并且所用H.264 解码配置文件的图像布局为 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR,则为 (x,y × 2)

  • 如果访问的图像表示一个底场,并且所用H.264 解码配置文件的图像布局为 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR,则为 (x,y × 2 + 1)

  • 如果访问的图像表示一个顶场,并且所用H.264 解码配置文件的图像布局为 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR,则为 (x,y)

  • 如果访问的图像表示一个底场,并且所用H.264 解码配置文件的图像布局为 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR,则为 (codedOffset.x + x,codedOffset.y + y)

其中 codedOffset 是相应 VkVideoPictureResourceInfoKHR 结构的成员。

H.264 解码配置文件

通过将 VkVideoProfileInfoKHR::videoCodecOperation 设置为 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR,并将 VkVideoDecodeH264ProfileInfoKHR 结构添加到 VkVideoProfileInfoKHR::pNext 链中,来指定支持 H.264 视频解码操作的视频配置文件。

VkVideoDecodeH264ProfileInfoKHR 结构定义如下:

// Provided by VK_KHR_video_decode_h264
typedef struct VkVideoDecodeH264ProfileInfoKHR {
    VkStructureType                              sType;
    const void*                                  pNext;
    StdVideoH264ProfileIdc                       stdProfileIdc;
    VkVideoDecodeH264PictureLayoutFlagBitsKHR    pictureLayout;
} VkVideoDecodeH264ProfileInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdProfileIdc 是一个 StdVideoH264ProfileIdc 值,指定 H.264 编解码器配置文件 IDC,如ITU-T H.264 规范的 A.2 节定义。

  • pictureLayout 是一个 VkVideoDecodeH264PictureLayoutFlagBitsKHR 值,指定要解码的 H.264 视频序列使用的图像布局。

有效用法(隐式)
  • VUID-VkVideoDecodeH264ProfileInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR

  • VUID-VkVideoDecodeH264ProfileInfoKHR-pictureLayout-parameter
    如果 pictureLayout 不为 0,则 pictureLayout 必须 为有效的 VkVideoDecodeH264PictureLayoutFlagBitsKHR

H.264 视频解码图像布局标志定义如下

// Provided by VK_KHR_video_decode_h264
typedef enum VkVideoDecodeH264PictureLayoutFlagBitsKHR {
    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR = 0,
    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR = 0x00000001,
    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR = 0x00000002,
} VkVideoDecodeH264PictureLayoutFlagBitsKHR;
  • VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR 指定支持逐行内容。此标志的值为 0

  • VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR 指定支持或使用隔行内容的图像布局,其中属于顶场的所有行被解码到图像资源内的偶数行,而属于底场的所有行被解码到图像资源内的奇数行。

  • VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR 指定支持或使用隔行内容的图像布局,其中属于一个场的所有行被分组在单个图像子区域中,并且构成帧的两个场可以存储在同一图像子资源的单独图像子区域中,或存储在单独的图像子资源中。

// Provided by VK_KHR_video_decode_h264
typedef VkFlags VkVideoDecodeH264PictureLayoutFlagsKHR;

VkVideoDecodeH264PictureLayoutFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoDecodeH264PictureLayoutFlagBitsKHR 的掩码。

H.264 解码能力

当调用 vkGetPhysicalDeviceVideoCapabilitiesKHR 查询 H.264 解码配置文件 的能力时,VkVideoCapabilitiesKHR::pNext必须包含一个 VkVideoDecodeH264CapabilitiesKHR 结构,该结构将填充特定于配置文件的能力。

VkVideoDecodeH264CapabilitiesKHR 结构定义如下

// Provided by VK_KHR_video_decode_h264
typedef struct VkVideoDecodeH264CapabilitiesKHR {
    VkStructureType         sType;
    void*                   pNext;
    StdVideoH264LevelIdc    maxLevelIdc;
    VkOffset2D              fieldOffsetGranularity;
} VkVideoDecodeH264CapabilitiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxLevelIdc 是一个 StdVideoH264LevelIdc 值,指示配置文件支持的最大 H.264 级别,其中枚举常量 STD_VIDEO_H264_LEVEL_IDC_<major>_<minor> 表示 ITU-T H.264 规范的 A.3 节中定义的 H.264 级别 <major>.<minor>

  • fieldOffsetGranularity 是在使用图像布局 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR 时,为 VkVideoPictureResourceInfoKHR::codedOffset 指定的 视频图像资源 的最小对齐方式。

有效用法(隐式)
  • VUID-VkVideoDecodeH264CapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR

H.264 解码参数集

使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建的 视频会话参数 对象可以包含以下类型的参数

H.264 序列参数集 (SPS)

StdVideoH264SequenceParameterSet 结构表示,并解释如下

  • reserved1reserved2 仅用于填充目的,否则将被忽略;

  • seq_parameter_set_id 用作 SPS 条目的键;

  • level_idc 是枚举常量 STD_VIDEO_H264_LEVEL_IDC_<major>_<minor> 之一,表示 ITU-T H.264 规范的 A.3 节中定义的 H.264 级别 <major>.<minor>

  • 如果设置了 flags.seq_scaling_matrix_present_flag,则 pScalingLists 指向的 StdVideoH264ScalingLists 结构解释如下

    • scaling_list_present_mask 是一个位掩码,其中位索引 i 对应于 ITU-T H.264 规范的 7.4.2.1 节中定义的 seq_scaling_list_present_flag[i]

    • use_default_scaling_matrix_mask 是一个位掩码,其中位索引 i 对应于 UseDefaultScalingMatrix4x4Flag[i](当 i < 6 时),或者对应于 UseDefaultScalingMatrix8x8Flag[i-6](否则),如 ITU-T H.264 规范的 7.3.2.1 节中所定义;

    • ScalingList4x4ScalingList8x8 对应于 ITU-T H.264 规范的 7.3.2.1 节中定义的同名语法元素;

  • 如果设置了 flags.vui_parameters_present_flag,则 pSequenceParameterSetVui 是指向 StdVideoH264SequenceParameterSetVui 结构的指针,该结构解释如下

    • reserved1 仅用于填充目的,否则将被忽略;

    • flags.color_description_present_flag 被解释为 colour_description_present_flag 的值,如 ITU-T H.264 规范的 E.2.1 节中所定义;

      colour_description_present_flag 的名称在视频标准头文件中拼写错误。

    • 如果设置了 flags.nal_hrd_parameters_present_flagflags.vcl_hrd_parameters_present_flag,则 pHrdParameters 指向的 StdVideoH264HrdParameters 结构解释如下

      • reserved1 仅用于填充目的,否则将被忽略;

      • StdVideoH264HrdParameters 的所有其他成员都按照 ITU-T H.264 规范的 E.2.2 节中的定义进行解释;

    • StdVideoH264SequenceParameterSetVui 的所有其他成员都按照 ITU-T H.264 规范的 E.2.1 节中的定义进行解释;

  • StdVideoH264SequenceParameterSet 的所有其他成员都按照 ITU-T H.264 规范的 7.4.2.1 节中的定义进行解释。

H.264 图像参数集 (PPS)

StdVideoH264PictureParameterSet 结构表示,并解释如下

  • seq_parameter_set_idpic_parameter_set_id 构成的对用作 PPS 条目的键;

  • 如果设置了 flags.pic_scaling_matrix_present_flag,则 pScalingLists 指向的 StdVideoH264ScalingLists 结构解释如下

    • scaling_list_present_mask 是一个位掩码,其中位索引 i 对应于 ITU-T H.264 规范的 7.4.2.2 节中定义的 pic_scaling_list_present_flag[i]

    • use_default_scaling_matrix_mask 是一个位掩码,其中位索引 i 对应于 UseDefaultScalingMatrix4x4Flag[i](当 i < 6 时),或者对应于 UseDefaultScalingMatrix8x8Flag[i-6](否则),如 ITU-T H.264 规范的 7.3.2.2 节中所定义;

    • ScalingList4x4ScalingList8x8 对应于 ITU-T H.264 规范的 7.3.2.2 节中定义的同名语法元素;

  • StdVideoH264PictureParameterSet 的所有其他成员都按照 ITU-T H.264 规范的 7.4.2.2 节中的定义进行解释。

当使用编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 创建 视频会话参数 对象时,VkVideoSessionParametersCreateInfoKHR::pNext必须包含一个 VkVideoDecodeH264SessionParametersCreateInfoKHR 结构,该结构指定对象的容量和初始内容。

VkVideoDecodeH264SessionParametersCreateInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_decode_h264
typedef struct VkVideoDecodeH264SessionParametersCreateInfoKHR {
    VkStructureType                                        sType;
    const void*                                            pNext;
    uint32_t                                               maxStdSPSCount;
    uint32_t                                               maxStdPPSCount;
    const VkVideoDecodeH264SessionParametersAddInfoKHR*    pParametersAddInfo;
} VkVideoDecodeH264SessionParametersCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxStdSPSCount 是创建的 VkVideoSessionParametersKHR 可以包含的 H.264 SPS 条目的最大数量。

  • maxStdPPSCount 是创建的 VkVideoSessionParametersKHR 可以包含的 H.264 PPS 条目的最大数量。

  • pParametersAddInfo 可以是 NULL,也可以是指向 VkVideoDecodeH264SessionParametersAddInfoKHR 结构的指针,该结构指定在对象创建时要添加的 H.264 参数。

有效用法(隐式)
  • VUID-VkVideoDecodeH264SessionParametersCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR

  • VUID-VkVideoDecodeH264SessionParametersCreateInfoKHR-pParametersAddInfo-parameter
    如果 pParametersAddInfo 不为 NULL,则 pParametersAddInfo 必须是指向有效的 VkVideoDecodeH264SessionParametersAddInfoKHR 结构的有效指针。

VkVideoDecodeH264SessionParametersAddInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_decode_h264
typedef struct VkVideoDecodeH264SessionParametersAddInfoKHR {
    VkStructureType                            sType;
    const void*                                pNext;
    uint32_t                                   stdSPSCount;
    const StdVideoH264SequenceParameterSet*    pStdSPSs;
    uint32_t                                   stdPPSCount;
    const StdVideoH264PictureParameterSet*     pStdPPSs;
} VkVideoDecodeH264SessionParametersAddInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdSPSCountpStdSPSs 数组中的元素数量。

  • pStdSPSs 是指向 StdVideoH264SequenceParameterSet 结构数组的指针,这些结构描述要添加的 H.264 SPS 条目。

  • stdPPSCountpStdPPSs 数组中的元素数量。

  • pStdPPSs 是指向 StdVideoH264PictureParameterSet 结构数组的指针,这些结构描述要添加的 H.264 PPS 条目。

此结构可以在以下位置指定:

有效用法
  • VUID-VkVideoDecodeH264SessionParametersAddInfoKHR-None-04825
    pStdSPSs 的元素中指定的每个 StdVideoH264SequenceParameterSet 结构的 seq_parameter_set_id 成员在 pStdSPSs必须是唯一的。

  • VUID-VkVideoDecodeH264SessionParametersAddInfoKHR-None-04826
    pStdPPSs 的元素中指定的每个 StdVideoH264PictureParameterSet 结构的 seq_parameter_set_idpic_parameter_set_id 成员组成的对在 pStdPPSs必须是唯一的。

有效用法(隐式)
  • VUID-VkVideoDecodeH264SessionParametersAddInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR

  • VUID-VkVideoDecodeH264SessionParametersAddInfoKHR-pStdSPSs-parameter
    如果 stdSPSCount 不为 0,则 pStdSPSs 必须是指向 stdSPSCountStdVideoH264SequenceParameterSet 值的数组的有效指针。

  • VUID-VkVideoDecodeH264SessionParametersAddInfoKHR-pStdPPSs-parameter
    如果 stdPPSCount 不为 0,则 pStdPPSs 必须是指向 stdPPSCountStdVideoH264PictureParameterSet 值的数组的有效指针。

H.264 解码参数

VkVideoDecodeH264PictureInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_decode_h264
typedef struct VkVideoDecodeH264PictureInfoKHR {
    VkStructureType                         sType;
    const void*                             pNext;
    const StdVideoDecodeH264PictureInfo*    pStdPictureInfo;
    uint32_t                                sliceCount;
    const uint32_t*                         pSliceOffsets;
} VkVideoDecodeH264PictureInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdPictureInfo 是指向 StdVideoDecodeH264PictureInfo 结构的指针,该结构指定 H.264 图像信息

  • sliceCountpSliceOffsets 中的元素数量。

  • pSliceOffsets 是指向 sliceCount 个偏移量的数组的指针,这些偏移量指定 VkVideoDecodeInfoKHR 中指定的视频码流缓冲区范围内图像切片的起始偏移量。

此结构在传递给 vkCmdDecodeVideoKHRVkVideoDecodeInfoKHR 结构的 pNext 链中指定,以指定 H.264 解码操作的编解码器特定图像信息。

解码输出图像信息

当此结构在传递给 vkCmdDecodeVideoKHRVkVideoDecodeInfoKHR 结构的 pNext 链中指定时,与 解码输出图像 相关的信息定义如下:

  • 如果 pStdPictureInfo->flags.field_pic_flag 未设置,则该图像表示一个帧。

  • 如果 pStdPictureInfo->flags.field_pic_flag 已设置,则该图像表示一个场。具体而言:

    • 如果 pStdPictureInfo->flags.bottom_field_flag 未设置,则该图像表示帧的顶场。

    • 如果 pStdPictureInfo->flags.bottom_field_flag 已设置,则该图像表示帧的底场。

  • 所使用的图像子区域根据 H.264 解码图像数据访问 部分确定。

  • 解码输出图像与 pStdPictureInfo 中提供的 H.264 图像信息相关联。

标准图像信息

pStdPictureInfo 指向的 StdVideoDecodeH264PictureInfo 结构的成员解释如下:

  • reserved1reserved2 仅用于填充目的,否则将被忽略;

  • flags.is_intra,如 ITU-T H.264 规范的第 3.73 节中所定义;

  • flags.is_reference,如 ITU-T H.264 规范的第 3.136 节中所定义;

  • flags.complementary_field_pair 的定义参见 ITU-T H.264 规范 的 3.35 节;

  • seq_parameter_set_idpic_parameter_set_id 用于标识活动参数集,如下所述;

  • 所有其他成员的解释均按照 ITU-T H.264 规范 的 7.4.3 节中的定义。

参考图像的设置由 StdVideoDecodeH264PictureInfo::flags.is_reference 的值控制。如果设置了该标志,并且指定了重建图像,则后者将用作图像重建的目标,以激活pDecodeInfo->pSetupReferenceSlot→slotIndex 中指定的DPB 插槽。如果 StdVideoDecodeH264PictureInfo::flags.is_reference 未设置,但指定了重建图像,则与该 DPB 插槽关联的相应图像参考将被无效化,如DPB 插槽状态部分所述。

活动参数集

pStdPictureInfo 指向的 StdVideoDecodeH264PictureInfo 结构的成员用于从绑定的视频会话参数对象中选择要使用的活动参数集,如下所示

  • 活动 SPS 是由 StdVideoDecodeH264PictureInfo::seq_parameter_set_id 中指定的键标识的 SPS

  • 活动 PPS 是由 StdVideoDecodeH264PictureInfo::seq_parameter_set_idStdVideoDecodeH264PictureInfo::pic_parameter_set_id 构造的对指定的键标识的 PPS

有效用法(隐式)
  • VUID-VkVideoDecodeH264PictureInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR

  • VUID-VkVideoDecodeH264PictureInfoKHR-pStdPictureInfo-parameter
    pStdPictureInfo 必须是指向有效 StdVideoDecodeH264PictureInfo 值的有效指针

  • VUID-VkVideoDecodeH264PictureInfoKHR-pSliceOffsets-parameter
    pSliceOffsets 必须是指向 sliceCountuint32_t 值数组的有效指针

  • VUID-VkVideoDecodeH264PictureInfoKHR-sliceCount-arraylength
    sliceCount 必须大于 0

VkVideoDecodeH264DpbSlotInfoKHR 结构的定义如下

// Provided by VK_KHR_video_decode_h264
typedef struct VkVideoDecodeH264DpbSlotInfoKHR {
    VkStructureType                           sType;
    const void*                               pNext;
    const StdVideoDecodeH264ReferenceInfo*    pStdReferenceInfo;
} VkVideoDecodeH264DpbSlotInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdReferenceInfo 是指向 StdVideoDecodeH264ReferenceInfo 结构的指针,该结构指定了 H.264 参考信息

如果 pSetupReferenceSlot 不为 NULL,则此结构在 VkVideoDecodeInfoKHRpNext 链中指定,并且在 VkVideoDecodeInfoKHR::pReferenceSlots 的元素的 pNext 链中指定,以指定 H.264 解码操作的编解码器特定参考图像信息。

活动参考图像信息

当此结构在 VkVideoDecodeInfoKHR::pReferenceSlots 的元素的 pNext 链中指定时,对于 VkVideoDecodeInfoKHR::pReferenceSlots 的每个元素,会向视频解码操作使用的活动参考图像列表中添加一个或两个元素,如下所示

  • 如果 pStdReferenceInfo->flags.top_field_flagpStdReferenceInfo->flags.bottom_field_flag 都未设置,则该图像将作为帧参考添加到活动参考图像列表中。

  • 如果设置了 pStdReferenceInfo->flags.top_field_flag,则该图像将作为顶场参考添加到活动参考图像列表中。

  • 如果设置了 pStdReferenceInfo->flags.bottom_field_flag,则该图像将作为底场参考添加到活动参考图像列表中。

  • 对于每个添加的参考图像,根据H.264 解码图像数据访问部分确定使用的相应图像子区域。

  • 每个添加的参考图像都与 VkVideoDecodeInfoKHR::pReferenceSlots 的相应元素的 slotIndex 成员中指定的 DPB 插槽索引关联。

  • 每个添加的参考图像都与 pStdReferenceInfo 中提供的 H.264 参考信息关联。

当当前与 DPB 插槽关联的隔行扫描帧的顶场和底场都打算用作活动参考图像,并且两个场都存储在同一图像子区域中时(在使用 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR 时就是这种情况,它将两个场存储在同一图像子区域的偶数和奇数扫描线上),必须通过单个 VkVideoReferenceSlotInfoKHR 结构提供这两个参考,该结构的 StdVideoDecodeH264ReferenceInfo 结构(由 VkVideoDecodeH264DpbSlotInfoKHR 结构(包含在对应的 VkVideoReferenceSlotInfoKHR 结构的 pNext 链中)的 pStdReferenceInfo 成员指向)中同时设置了 flags.top_field_flagflags.bottom_field_flag。但是,只有当两个场都存储在同一图像子区域中时,才能使用此方法。如果不是这种情况(例如,在使用 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR 时,它要求为两个场提供单独的 codedOffset 值,并且还允许将帧的两个场存储在单独的图像层或完全单独的图像中),则需要为引用两个场提供单独的 VkVideoReferenceSlotInfoKHR 结构,每个结构仅设置 flags.top_field_flagflags.bottom_field_flag 中的一个,并在 VkVideoReferenceSlotInfoKHR::pPictureResource 中提供适当的视频图像资源信息。

重建图像信息

当此结构在 VkVideoDecodeInfoKHR::pSetupReferenceSlotpNext 链中指定时,与重建图像相关的信息定义如下

  • 如果 pStdReferenceInfo->flags.top_field_flagpStdReferenceInfo->flags.bottom_field_flag 都未设置,则该图像表示一个帧。

  • 如果设置了 pStdReferenceInfo->flags.top_field_flag,则该图像表示一个场,具体来说,是帧的顶场。

  • 如果设置了 pStdReferenceInfo->flags.bottom_field_flag,则该图像表示一个场,具体来说,是帧的底场。

  • 所使用的图像子区域根据 H.264 解码图像数据访问 部分确定。

  • 如果请求了参考图像设置,则重建图像将用于激活VkVideoDecodeInfoKHR::pSetupReferenceSlot->slotIndex 中指定的索引对应的DPB 插槽

  • 重建图像与 pStdReferenceInfo 中提供的 H.264 参考信息关联。

Std 参考信息

pStdReferenceInfo 指向的 StdVideoDecodeH264ReferenceInfo 结构的成员解释如下

  • flags.top_field_flag 用于指示参考是否用作顶场参考;

  • flags.bottom_field_flag 用于指示参考是否用作底场参考;

  • flags.used_for_long_term_reference 用于指示该图像是否被标记为“用于长期参考”,如 ITU-T H.264 规范 的 8.2.5.1 节中所定义;

  • flags.is_non_existing 用于指示该图像是否被标记为“不存在”,如 ITU-T H.264 规范 的 8.2.5.2 节中所定义;

  • 所有其他成员的解释均按照 ITU-T H.264 规范 的 8.2 节中的定义。

有效用法(隐式)
  • VUID-VkVideoDecodeH264DpbSlotInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR

  • VUID-VkVideoDecodeH264DpbSlotInfoKHR-pStdReferenceInfo-parameter
    pStdReferenceInfo 必须是一个指向有效 StdVideoDecodeH264ReferenceInfo 值的有效指针

H.264 解码要求

本节描述了对于至少有一个队列族支持 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR 视频编解码操作的物理设备,其必需的 H.264 解码能力,该操作由 vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyVideoPropertiesKHR::videoCodecOperations 中返回。

表 1. 必需的视频标准头版本
视频标准头名称 版本

vulkan_video_codec_h264std_decode

1.0.0

表 2. 必需的视频功能
视频功能 要求 要求类型1

VkVideoCapabilitiesKHR

flags

-

min

minBitstreamBufferOffsetAlignment

4096

max

minBitstreamBufferSizeAlignment

4096

max

pictureAccessGranularity

(64,64)

max

minCodedExtent

-

max

maxCodedExtent

-

min

maxDpbSlots

0

min

maxActiveReferencePictures

0

min

VkVideoDecodeCapabilitiesKHR

flags

VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHRVK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR

min

VkVideoDecodeH264CapabilitiesKHR

maxLevelIdc

STD_VIDEO_H264_LEVEL_IDC_1_0

min

fieldOffsetGranularity

(0,0) 除了使用 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR 的配置文件

实现相关

1

要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。

H.265 解码操作

使用 H.265 解码配置文件的视频解码操作可以用于解码符合 ITU-T H.265 规范的原始视频流序列。

有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言

此过程按照视频解码操作步骤执行,编解码器特定的语义在ITU-T H.265 规范的第 8 节中定义。

如果参数和码流符合ITU-T H.265 规范的相应部分中定义的语法和语义要求(如上所述),并且与活动参考图像关联的DPB 插槽都指向有效的图像参考,则视频解码操作将成功完成。 否则,视频解码操作可能不成功

H.265 解码码流数据访问

视频码流缓冲区范围包含一个 VCL NAL 单元,该单元由表示帧的图像的片分段头和数据组成,如 7.3.6 和 7.3.8 节中定义,并且此数据按照ITU-T H.265 规范的 7.4.7 和 7.4.9 节中的定义进行解释。

VkVideoDecodeH265PictureInfoKHR::pSliceSegmentOffsets 中提供的偏移量指定视频码流缓冲区范围内每个片分段头的起始偏移量。

H.265 解码图像数据访问

对视频图像资源中的图像数据的访问发生在由 VkVideoCapabilitiesKHR::pictureAccessGranularity 指示的粒度上,该粒度由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所用的视频配置文件返回。 因此,使用 H.265 解码配置文件 的视频编码操作访问的解码输出图像参考图像重建图像的完整图像子区域定义为坐标范围内的纹素集合

([0,endX), [0,endY))

其中

  • endX 等于codedExtent.width向上舍入到 pictureAccessGranularity.width 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的宽度;

  • endY 等于codedExtent.height向上舍入到 pictureAccessGranularity.height 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的高度;

其中 codedExtent 是对应于图像的 VkVideoPictureResourceInfoKHR 结构的成员。

在使用 H.265 解码配置文件 的视频解码操作的情况下,在坐标 (x,y)(由 ITU-T H.265 规范 定义)对图像的任何访问都是对 引用的对应 VkVideoPictureResourceInfoKHR 结构在纹素坐标 (x,y) 处的图像子资源的访问。

H.265 解码配置文件

通过将 VkVideoProfileInfoKHR::videoCodecOperation 设置为 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR,并在 VkVideoProfileInfoKHR::pNext 链中添加一个 VkVideoDecodeH265ProfileInfoKHR 结构,可以指定支持 H.265 视频解码操作的视频配置文件。

VkVideoDecodeH265ProfileInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_decode_h265
typedef struct VkVideoDecodeH265ProfileInfoKHR {
    VkStructureType           sType;
    const void*               pNext;
    StdVideoH265ProfileIdc    stdProfileIdc;
} VkVideoDecodeH265ProfileInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdProfileIdc 是一个 StdVideoH265ProfileIdc 值,指定 H.265 编解码器配置文件 IDC,如 ITU-T H.265 规范 的 A.3 节中所定义。

有效用法(隐式)
  • VUID-VkVideoDecodeH265ProfileInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR

H.265 解码能力

当调用 vkGetPhysicalDeviceVideoCapabilitiesKHR 来查询 H.265 解码配置文件 的能力时,VkVideoCapabilitiesKHR::pNext必须包含一个 VkVideoDecodeH265CapabilitiesKHR 结构,该结构将填充特定于配置文件的能力。

VkVideoDecodeH265CapabilitiesKHR 结构的定义如下:

// Provided by VK_KHR_video_decode_h265
typedef struct VkVideoDecodeH265CapabilitiesKHR {
    VkStructureType         sType;
    void*                   pNext;
    StdVideoH265LevelIdc    maxLevelIdc;
} VkVideoDecodeH265CapabilitiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxLevelIdc 是一个 StdVideoH265LevelIdc 值,表示配置文件支持的最大 H.265 级别,其中枚举常量 STD_VIDEO_H265_LEVEL_IDC_<major>_<minor> 标识 H.265 级别 <major>.<minor>,如 ITU-T H.265 规范 的 A.4 节中所定义。

有效用法(隐式)
  • VUID-VkVideoDecodeH265CapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR

H.265 解码参数集

使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建的视频会话参数对象可以包含以下类型的参数:

H.265 视频参数集 (VPS)

StdVideoH265VideoParameterSet 结构表示,并按如下方式解释:

  • reserved1reserved2reserved3 仅用于填充目的,否则将被忽略;

  • vps_video_parameter_set_id 用作 VPS 条目的键;

  • pDecPicBufMgr 指向的 StdVideoH265DecPicBufMgr 结构的 max_latency_increase_plus1max_dec_pic_buffering_minus1max_num_reorder_pics 成员分别对应于 vps_max_latency_increase_plus1vps_max_dec_pic_buffering_minus1vps_max_num_reorder_pics,如 ITU-T H.265 规范 的 7.4.3.1 节中所定义;

  • pHrdParameters 指向的 StdVideoH265HrdParameters 结构按如下方式解释:

    • reserved 仅用于填充目的,否则将被忽略;

    • flags.fixed_pic_rate_general_flag 是一个位掩码,其中位索引 i 对应于 fixed_pic_rate_general_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

    • flags.fixed_pic_rate_within_cvs_flag 是一个位掩码,其中位索引 i 对应于 fixed_pic_rate_within_cvs_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

    • flags.low_delay_hrd_flag 是一个位掩码,其中位索引 i 对应于 low_delay_hrd_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

    • 如果设置了 flags.nal_hrd_parameters_present_flag,则 pSubLayerHrdParametersNal 是一个指向 vps_max_sub_layers_minus1 + 1StdVideoH265SubLayerHrdParameters 结构数组的指针,其中 vps_max_sub_layers_minus1 是包含此结构的 StdVideoH265VideoParameterSet 结构的对应成员,并且每个元素按如下方式解释:

      • cbr_flag 是一个位掩码,其中位索引 i 对应于 cbr_flag[i],如 ITU-T H.265 规范 的 E.3.3 节中所定义;

      • StdVideoH265SubLayerHrdParameters 结构的所有其他成员都按照 ITU-T H.265 规范 的 E.3.3 节中的定义进行解释;

    • 如果设置了 flags.vcl_hrd_parameters_present_flag,则 pSubLayerHrdParametersVcl 是一个指向 vps_max_sub_layers_minus1 + 1StdVideoH265SubLayerHrdParameters 结构数组的指针,其中 vps_max_sub_layers_minus1 是包含此结构的 StdVideoH265VideoParameterSet 结构的对应成员,并且每个元素按如下方式解释:

      • cbr_flag 是一个位掩码,其中位索引 i 对应于 cbr_flag[i],如 ITU-T H.265 规范 的 E.3.3 节中所定义;

      • StdVideoH265SubLayerHrdParameters 结构的所有其他成员都按照 ITU-T H.265 规范 的 E.3.3 节中的定义进行解释;

    • StdVideoH265HrdParameters 的所有其他成员都按照 ITU-T H.265 规范 的 E.3.2 节中的定义进行解释;

  • pProfileTierLevel 指向的 StdVideoH265ProfileTierLevel 结构按如下方式解释:

    • general_level_idc 是枚举常量 STD_VIDEO_H265_LEVEL_IDC_<major>_<minor> 之一,用于标识 H.265 级别 <major>.<minor>,如 ITU-T H.265 规范 的 A.4 节中所定义;

    • StdVideoH265ProfileTierLevel 的所有其他成员都按照 ITU-T H.265 规范 的 7.4.4 节中的定义进行解释;

  • StdVideoH265VideoParameterSet 的所有其他成员都按照 ITU-T H.265 规范 的 7.4.3.1 节中的定义进行解释。

H.265 序列参数集 (SPS)

StdVideoH265SequenceParameterSet 结构表示,并按如下方式解释:

  • reserved1reserved2 仅用于填充目的,否则将被忽略;

  • sps_video_parameter_set_idsps_seq_parameter_set_id 构造的对用作 SPS 条目的键;

  • pProfileTierLevel 指向的 StdVideoH265ProfileTierLevel 结构按如下方式解释:

    • general_level_idc 是枚举常量 STD_VIDEO_H265_LEVEL_IDC_<major>_<minor> 之一,用于标识 H.265 级别 <major>.<minor>,如 ITU-T H.265 规范 的 A.4 节中所定义;

    • StdVideoH265ProfileTierLevel 的所有其他成员都按照 ITU-T H.265 规范 的 7.4.4 节中的定义进行解释;

  • pDecPicBufMgr 指向的 StdVideoH265DecPicBufMgr 结构的 max_latency_increase_plus1max_dec_pic_buffering_minus1max_num_reorder_pics 成员分别对应于 sps_max_latency_increase_plus1sps_max_dec_pic_buffering_minus1sps_max_num_reorder_pics,如 ITU-T H.265 规范 的 7.4.3.2 节中所定义;

  • 如果设置了 flags.sps_scaling_list_data_present_flag,则 pScalingLists 指向的 StdVideoH265ScalingLists 结构按如下方式解释:

    • ScalingList4x4ScalingList8x8ScalingList16x16ScalingList32x32 分别对应于 ScalingList[0]ScalingList[1]ScalingList[2]ScalingList[3],如 ITU-T H.265 规范 的 7.3.4 节中所定义;

    • ScalingListDCCoef16x16ScalingListDCCoef32x32 分别对应于 scaling_list_dc_coef_minus8[0]scaling_list_dc_coef_minus8[1],如 ITU-T H.265 规范 的 7.3.4 节中所定义;

  • pShortTermRefPicSet 是一个指向 num_short_term_ref_pic_setsStdVideoH265ShortTermRefPicSet 结构数组的指针,其中每个元素按如下方式解释:

    • reserved1reserved2reserved3 仅用于填充目的,否则将被忽略;

    • used_by_curr_pic_flag 是一个位掩码,其中位索引 i 对应于 used_by_curr_pic_flag[i],如 ITU-T H.265 规范 的 7.4.8 节中所定义;

    • use_delta_flag 是一个位掩码,其中位索引 i 对应于 use_delta_flag[i],如 ITU-T H.265 规范 的 7.4.8 节中所定义;

    • used_by_curr_pic_s0_flag 是一个位掩码,其中位索引 i 对应于 used_by_curr_pic_s0_flag[i],如 ITU-T H.265 规范 的 7.4.8 节中所定义;

    • used_by_curr_pic_s1_flag 是一个位掩码,其中位索引 i 对应于 used_by_curr_pic_s1_flag[i],如 ITU-T H.265 规范 的 7.4.8 节中所定义;

    • StdVideoH265ShortTermRefPicSet 的所有其他成员都按照 ITU-T H.265 规范 的 7.4.8 节中的定义进行解释;

  • 如果设置了 flags.long_term_ref_pics_present_flag,则 pLongTermRefPicsSps 指向的 StdVideoH265LongTermRefPicsSps 结构按如下方式解释:

    • used_by_curr_pic_lt_sps_flag 是一个位掩码,其中位索引 i 对应于 ITU-T H.265 规范的 7.4.3.2 节中定义的 used_by_curr_pic_lt_sps_flag[i]

    • StdVideoH265LongTermRefPicsSps 的所有其他成员的解释均按照 ITU-T H.265 规范的 7.4.3.2 节中的定义;

  • 如果设置了 flags.vui_parameters_present_flag,则由 pSequenceParameterSetVui 指向的 StdVideoH265SequenceParameterSetVui 结构的解释如下

    • reserved1reserved2reserved3 仅用于填充目的,否则将被忽略;

    • pHrdParameters 指向的 StdVideoH265HrdParameters 结构按如下方式解释:

      • flags.fixed_pic_rate_general_flag 是一个位掩码,其中位索引 i 对应于 fixed_pic_rate_general_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

      • flags.fixed_pic_rate_within_cvs_flag 是一个位掩码,其中位索引 i 对应于 fixed_pic_rate_within_cvs_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

      • flags.low_delay_hrd_flag 是一个位掩码,其中位索引 i 对应于 low_delay_hrd_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

      • 如果设置了 flags.nal_hrd_parameters_present_flag,则 pSubLayerHrdParametersNal 是一个指向 sps_max_sub_layers_minus1 + 1StdVideoH265SubLayerHrdParameters 结构数组的指针,其中 sps_max_sub_layers_minus1 是包含它的 StdVideoH265SequenceParameterSet 结构的对应成员,并且每个元素的解释如下

        • cbr_flag 是一个位掩码,其中位索引 i 对应于 cbr_flag[i],如 ITU-T H.265 规范 的 E.3.3 节中所定义;

        • StdVideoH265SubLayerHrdParameters 结构的所有其他成员都按照 ITU-T H.265 规范 的 E.3.3 节中的定义进行解释;

      • 如果设置了 flags.vcl_hrd_parameters_present_flag,则 pSubLayerHrdParametersVcl 是一个指向 sps_max_sub_layers_minus1 + 1StdVideoH265SubLayerHrdParameters 结构数组的指针,其中 sps_max_sub_layers_minus1 是包含它的 StdVideoH265SequenceParameterSet 结构的对应成员,并且每个元素的解释如下

        • cbr_flag 是一个位掩码,其中位索引 i 对应于 cbr_flag[i],如 ITU-T H.265 规范 的 E.3.3 节中所定义;

        • StdVideoH265SubLayerHrdParameters 结构的所有其他成员都按照 ITU-T H.265 规范 的 E.3.3 节中的定义进行解释;

      • StdVideoH265HrdParameters 的所有其他成员都按照 ITU-T H.265 规范 的 E.3.2 节中的定义进行解释;

    • pSequenceParameterSetVui 的所有其他成员的解释均按照 ITU-T H.265 规范的 E.3.1 节中的定义;

  • 如果设置了 flags.sps_palette_predictor_initializer_present_flag,则由 pPredictorPaletteEntries 指向的 StdVideoH265PredictorPaletteEntries 结构的 PredictorPaletteEntries 成员的解释均按照 ITU-T H.265 规范的 7.4.9.13 节中的定义;

  • StdVideoH265SequenceParameterSet 的所有其他成员的解释均按照 ITU-T H.265 规范的 7.4.3.1 节中的定义。

H.265 图像参数集 (PPS)

StdVideoH265PictureParameterSet 结构表示,并解释如下

  • reserved1reserved2reserved3 仅用于填充目的,否则将被忽略;

  • sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 构成的三元组用作 PPS 条目的键;

  • 如果设置了 flags.pps_scaling_list_data_present_flag,则由 pScalingLists 指向的 StdVideoH265ScalingLists 结构的解释如下

    • ScalingList4x4ScalingList8x8ScalingList16x16ScalingList32x32 分别对应于 ScalingList[0]ScalingList[1]ScalingList[2]ScalingList[3],如 ITU-T H.265 规范 的 7.3.4 节中所定义;

    • ScalingListDCCoef16x16ScalingListDCCoef32x32 分别对应于 scaling_list_dc_coef_minus8[0]scaling_list_dc_coef_minus8[1],如 ITU-T H.265 规范 的 7.3.4 节中所定义;

  • 如果设置了 flags.pps_palette_predictor_initializer_present_flag,则由 pPredictorPaletteEntries 指向的 StdVideoH265PredictorPaletteEntries 结构的 PredictorPaletteEntries 成员的解释均按照 ITU-T H.265 规范的 7.4.9.13 节中的定义;

  • StdVideoH265PictureParameterSet 的所有其他成员的解释均按照 ITU-T H.265 规范的 7.4.3.3 节中的定义。

当使用编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 创建 视频会话参数 对象时,VkVideoSessionParametersCreateInfoKHR::pNext 链 **必须** 包含一个 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构,指定对象的容量和初始内容。

VkVideoDecodeH265SessionParametersCreateInfoKHR 结构定义如下

// Provided by VK_KHR_video_decode_h265
typedef struct VkVideoDecodeH265SessionParametersCreateInfoKHR {
    VkStructureType                                        sType;
    const void*                                            pNext;
    uint32_t                                               maxStdVPSCount;
    uint32_t                                               maxStdSPSCount;
    uint32_t                                               maxStdPPSCount;
    const VkVideoDecodeH265SessionParametersAddInfoKHR*    pParametersAddInfo;
} VkVideoDecodeH265SessionParametersCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxStdVPSCount 是创建的 VkVideoSessionParametersKHR **可以** 包含的最大 H.265 VPS 条目数。

  • maxStdSPSCount 是创建的 VkVideoSessionParametersKHR **可以** 包含的最大 H.265 SPS 条目数。

  • maxStdPPSCount 是创建的 VkVideoSessionParametersKHR **可以** 包含的最大 H.265 PPS 条目数。

  • pParametersAddInfoNULL 或指向 VkVideoDecodeH265SessionParametersAddInfoKHR 结构的指针,该结构指定在创建对象时要添加的 H.265 参数。

有效用法(隐式)
  • VUID-VkVideoDecodeH265SessionParametersCreateInfoKHR-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR

  • VUID-VkVideoDecodeH265SessionParametersCreateInfoKHR-pParametersAddInfo-parameter
    如果 pParametersAddInfo 不为 NULL,则 pParametersAddInfo **必须** 是指向有效 VkVideoDecodeH265SessionParametersAddInfoKHR 结构的有效指针

VkVideoDecodeH265SessionParametersAddInfoKHR 结构定义如下

// Provided by VK_KHR_video_decode_h265
typedef struct VkVideoDecodeH265SessionParametersAddInfoKHR {
    VkStructureType                            sType;
    const void*                                pNext;
    uint32_t                                   stdVPSCount;
    const StdVideoH265VideoParameterSet*       pStdVPSs;
    uint32_t                                   stdSPSCount;
    const StdVideoH265SequenceParameterSet*    pStdSPSs;
    uint32_t                                   stdPPSCount;
    const StdVideoH265PictureParameterSet*     pStdPPSs;
} VkVideoDecodeH265SessionParametersAddInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdVPSCountpStdVPSs 数组中的元素数量。

  • pStdVPSs 是指向描述要添加的 H.265 VPS 条目的 StdVideoH265VideoParameterSet 结构数组的指针。

  • stdSPSCountpStdSPSs 数组中的元素数量。

  • pStdSPSs 是指向描述要添加的 H.265 SPS 条目的 StdVideoH265SequenceParameterSet 结构数组的指针。

  • stdPPSCountpStdPPSs 数组中的元素数量。

  • pStdPPSs 是指向描述要添加的 H.265 PPS 条目的 StdVideoH265PictureParameterSet 结构数组的指针。

此结构可以在以下位置指定:

有效用法
  • VUID-VkVideoDecodeH265SessionParametersAddInfoKHR-None-04833
    pStdVPSs 的元素中指定的每个 StdVideoH265VideoParameterSet 结构的 vps_video_parameter_set_id 成员在 pStdVPSs 中**必须**是唯一的

  • VUID-VkVideoDecodeH265SessionParametersAddInfoKHR-None-04834
    pStdSPSs 的元素中指定的每个 StdVideoH265SequenceParameterSet 结构的 sps_video_parameter_set_idsps_seq_parameter_set_id 成员构成的对在 pStdSPSs 中**必须**是唯一的

  • VUID-VkVideoDecodeH265SessionParametersAddInfoKHR-None-04835
    pStdPPSs 的元素中指定的每个 StdVideoH265PictureParameterSet 结构的 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 成员构成的三元组在 pStdPPSs 中**必须**是唯一的

有效用法(隐式)
  • VUID-VkVideoDecodeH265SessionParametersAddInfoKHR-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR

  • VUID-VkVideoDecodeH265SessionParametersAddInfoKHR-pStdVPSs-parameter
    如果 stdVPSCount 不为 0,则 pStdVPSs 必须是指向包含 stdVPSCountStdVideoH265VideoParameterSet 值的数组的有效指针。

  • VUID-VkVideoDecodeH265SessionParametersAddInfoKHR-pStdSPSs-parameter
    如果 stdSPSCount 不为 0,则 pStdSPSs 必须是指向包含 stdSPSCountStdVideoH265SequenceParameterSet 值的数组的有效指针。

  • VUID-VkVideoDecodeH265SessionParametersAddInfoKHR-pStdPPSs-parameter
    如果 stdPPSCount 不为 0,则 pStdPPSs 必须是指向包含 stdPPSCountStdVideoH265PictureParameterSet 值的数组的有效指针。

H.265 解码参数

VkVideoDecodeH265PictureInfoKHR 结构定义如下:

// Provided by VK_KHR_video_decode_h265
typedef struct VkVideoDecodeH265PictureInfoKHR {
    VkStructureType                         sType;
    const void*                             pNext;
    const StdVideoDecodeH265PictureInfo*    pStdPictureInfo;
    uint32_t                                sliceSegmentCount;
    const uint32_t*                         pSliceSegmentOffsets;
} VkVideoDecodeH265PictureInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdPictureInfo 是指向 StdVideoDecodeH265PictureInfo 结构的指针,该结构指定 H.265 图像信息

  • sliceSegmentCountpSliceSegmentOffsets 中的元素数量。

  • pSliceSegmentOffsets 是指向包含 sliceSegmentCount 个偏移量的数组的指针,这些偏移量指定图像的切片段在 VkVideoDecodeInfoKHR 中指定的视频比特流缓冲区范围内的起始偏移量。

此结构在传递给 vkCmdDecodeVideoKHRVkVideoDecodeInfoKHR 结构的 pNext 链中指定,以指定 H.265 解码操作 的编解码器特定图像信息。

解码输出图像信息

当此结构在传递给 vkCmdDecodeVideoKHRVkVideoDecodeInfoKHR 结构的 pNext 链中指定时,与 解码输出图像 相关的信息定义如下:

标准图像信息

pStdPictureInfo 指向的 StdVideoDecodeH265PictureInfo 结构的成员解释如下:

  • reserved 仅用于填充目的,否则将被忽略;

  • flags.IrapPicFlag,如 ITU-T H.265 规范 的第 3.73 节中定义;

  • flags.IdrPicFlag,如 ITU-T H.265 规范 的第 3.67 节中定义;

  • flags.IsReference,如 ITU-T H.265 规范 的第 3.132 节中定义;

  • sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 用于标识活动参数集,如下所述;

  • PicOrderCntVal,如 ITU-T H.265 规范 的第 8.3.1 节中定义;

  • NumBitsForSTRefPicSetInSlice 是当 short_term_ref_pic_set_sps_flag0 时在 st_ref_pic_set 中使用的位数,否则为 0,如 ITU-T H.265 规范 的第 7.4.7 和 7.4.8 节中定义;

  • NumDeltaPocsOfRefRpsIdx 是当 short_term_ref_pic_set_sps_flag1NumDeltaPocs[RefRpsIdx] 的值,否则为 0,如 ITU-T H.265 规范 的第 7.4.7 和 7.4.8 节中定义;

  • RefPicSetStCurrBeforeRefPicSetStCurrAfterRefPicSetLtCurr 的解释如 ITU-T H.265 规范 的第 8.3.2 节中定义,其中这些数组的每个元素要么使用其 DPB 插槽 索引标识一个 活动参考图像,要么包含值 STD_VIDEO_H265_NO_REFERENCE_PICTURE 以表示“无参考图像”;

  • 所有其他成员的解释如 ITU-T H.265 规范 的第 8.3.2 节中定义。

参考图像设置由 StdVideoDecodeH265PictureInfo::flags.IsReference 的值控制。如果设置了该值,并且指定了 重建图像,则后者用作图像重建的目标,以激活相应的 DPB 插槽。如果未设置 StdVideoDecodeH265PictureInfo::flags.IsReference,但指定了 重建图像,则与 DPB 插槽 关联的相应图像参考将失效,如 DPB 插槽状态 部分所述。

活动参数集

pStdPictureInfo 指向的 StdVideoDecodeH265PictureInfo 结构的成员用于从绑定的视频会话参数对象中选择要使用的活动参数集,如下所示:

  • 活动 VPS 是由 StdVideoDecodeH265PictureInfo::sps_video_parameter_set_id 中指定的键标识的 VPS

  • 活动 SPS 是由从 StdVideoDecodeH265PictureInfo::sps_video_parameter_set_idStdVideoDecodeH265PictureInfo::pps_seq_parameter_set_id 构造的对指定的键标识的 SPS

  • 活动 PPS 是由从 StdVideoDecodeH265PictureInfo::sps_video_parameter_set_idStdVideoDecodeH265PictureInfo::pps_seq_parameter_set_idStdVideoDecodeH265PictureInfo::pps_pic_parameter_set_id 构造的三元组指定的键标识的 PPS

有效用法(隐式)
  • VUID-VkVideoDecodeH265PictureInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR

  • VUID-VkVideoDecodeH265PictureInfoKHR-pStdPictureInfo-parameter
    pStdPictureInfo 必须是指向有效 StdVideoDecodeH265PictureInfo 值的有效指针

  • VUID-VkVideoDecodeH265PictureInfoKHR-pSliceSegmentOffsets-parameter
    pSliceSegmentOffsets 必须是指向包含 sliceSegmentCountuint32_t 值的数组的有效指针

  • VUID-VkVideoDecodeH265PictureInfoKHR-sliceSegmentCount-arraylength
    sliceSegmentCount 必须大于 0

VkVideoDecodeH265DpbSlotInfoKHR 结构定义如下:

// Provided by VK_KHR_video_decode_h265
typedef struct VkVideoDecodeH265DpbSlotInfoKHR {
    VkStructureType                           sType;
    const void*                               pNext;
    const StdVideoDecodeH265ReferenceInfo*    pStdReferenceInfo;
} VkVideoDecodeH265DpbSlotInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdReferenceInfo 是指向 StdVideoDecodeH265ReferenceInfo 结构的指针,该结构指定 ITU-T H.265 规范 第 8.3 节中描述的参考图像信息。

此结构在 VkVideoDecodeInfoKHR::pSetupReferenceSlot(如果不是 NULL)的 pNext 链和 VkVideoDecodeInfoKHR::pReferenceSlots 元素的 pNext 链中指定,以指定 H.265 解码操作的编解码器特定参考图像信息。

活动参考图像信息

当此结构在 VkVideoDecodeInfoKHR::pReferenceSlots 元素的 pNext 链中指定时,会将一个元素添加到 活动参考图像 列表中,该列表由视频解码操作用于 VkVideoDecodeInfoKHR::pReferenceSlots 的每个元素,如下所示:

重建图像信息

当此结构在 VkVideoDecodeInfoKHR::pSetupReferenceSlotpNext 链中指定时,与重建图像相关的信息定义如下

Std 参考信息

pStdReferenceInfo 指向的 StdVideoDecodeH265ReferenceInfo 结构的成员解释如下:

  • flags.used_for_long_term_reference 用于指示该图像是否被标记为“用于长期参考”,如 ITU-T H.265 规范的 8.3.2 节中所定义;

  • flags.unused_for_reference 用于指示该图像是否被标记为“不用于参考”,如 ITU-T H.265 规范的 8.3.2 节中所定义;

  • 所有其他成员的解释如 ITU-T H.265 规范的 8.3 节中所定义。

有效用法(隐式)
  • VUID-VkVideoDecodeH265DpbSlotInfoKHR-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR

  • VUID-VkVideoDecodeH265DpbSlotInfoKHR-pStdReferenceInfo-parameter
    pStdReferenceInfo **必须** 是指向有效的 StdVideoDecodeH265ReferenceInfo 值的有效指针

H.265 解码要求

本节描述了对于至少有一个队列族支持视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR 的物理设备,**必需** 的 H.265 解码能力,该操作由 vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyVideoPropertiesKHR::videoCodecOperations 中返回。

表 3. 必需的 视频标准头版本
视频标准头名称 版本

vulkan_video_codec_h265std_decode

1.0.0

表 4. 必需的视频功能
视频功能 要求 要求类型1

VkVideoCapabilitiesKHR

flags

-

min

minBitstreamBufferOffsetAlignment

4096

max

minBitstreamBufferSizeAlignment

4096

max

pictureAccessGranularity

(64,64)

max

minCodedExtent

-

max

maxCodedExtent

-

min

maxDpbSlots

0

min

maxActiveReferencePictures

0

min

VkVideoDecodeCapabilitiesKHR

flags

VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHRVK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR

min

VkVideoDecodeH265CapabilitiesKHR

maxLevelIdc

STD_VIDEO_H265_LEVEL_IDC_1_0

min

1

要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。

AV1 解码操作

使用 AV1 解码配置文件 的视频解码操作**可以**用于解码符合 AV1 规范的基本视频流序列。

有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言

此过程根据 视频解码操作步骤执行,其编解码器特定语义在 AV1 规范的第 7 节中定义

如果参数和码流符合AV1 规范相应章节中定义的语法和语义要求(如上所述),并且与活动参考图像关联的DPB插槽都指向有效的图像参考,则视频解码操作将成功完成。否则,视频解码操作**可能**不成功地完成。

AV1 解码码流数据访问

视频码流缓冲区范围**应**包含一个或多个帧 OBU,由一个帧头 OBU 和瓦片组 OBU 组成,它们一起表示一个完整的帧,如 AV1 规范的 5.10、5.9 和 5.11 节中所定义,并且此数据的解释如 AV1 规范的 6.9、6.8 和 6.10 节中分别定义。

VkVideoDecodeAV1PictureInfoKHR::frameHeaderOffset 中指定的偏移量**应**指定帧的帧头 OBU 的起始偏移量。

当帧的瓦片被编码到多个瓦片组中时,每个帧 OBU 都有一个单独的帧头 OBU,但根据 AV1 规范的要求,它们的内容应匹配。因此,当存在多个瓦片组时,frameHeaderOffset 中指定的偏移量**可以**是任何其他相同的帧头 OBU 的偏移量。

VkVideoDecodeAV1PictureInfoKHR::pTileOffsetsVkVideoDecodeAV1PictureInfoKHR::pTileSizes 中分别提供的偏移量和大小,**应**指定视频码流缓冲区范围中每个瓦片对应的起始偏移量和大小。

AV1 解码图像数据访问

对视频图像资源中的图像数据的访问发生在 VkVideoCapabilitiesKHR::pictureAccessGranularity 指示的粒度上,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回。因此,使用 AV1 解码配置文件的视频编码操作访问的解码输出图像参考图像重建图像的完整图像子区域定义为坐标范围内的纹素集

([0,endX), [0,endY))

其中

  • endX 等于codedExtent.width向上舍入到 pictureAccessGranularity.width 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的宽度;

  • endY 等于codedExtent.height向上舍入到 pictureAccessGranularity.height 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的高度;

其中 codedExtent 是对应于图像的 VkVideoPictureResourceInfoKHR 结构的成员。

在使用 AV1 解码配置文件的视频解码操作中,按照 AV1 规范的定义,对坐标 (x,y) 处的图像的任何访问,都是对对应的 VkVideoPictureResourceInfoKHR 结构在纹素坐标 (x,y)引用的图像子资源的访问。

AV1 参考名称和语义

解码过程中使用的各个参考帧具有不同的语义,如 AV1 规范的 6.10.24 节中所定义。与参考图像关联的 AV1 语义由 Video Std 枚举类型 StdVideoAV1ReferenceName 中定义的相应枚举常量指示

  • STD_VIDEO_AV1_REFERENCE_NAME_INTRA_FRAME 标识用于帧内编码的参考(INTRA_FRAME),如 AV1 规范的第 2 节和 7.11.2 节中所定义。

  • 所有其他枚举常量指的是用于帧间编码的向后或向前参考,如 AV1 规范的第 2 节和 7.11.3 节中所定义

    • STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME 标识 LAST_FRAME 参考

    • STD_VIDEO_AV1_REFERENCE_NAME_LAST2_FRAME 标识 LAST2_FRAME 参考

    • STD_VIDEO_AV1_REFERENCE_NAME_LAST3_FRAME 标识 LAST3_FRAME 参考帧

    • STD_VIDEO_AV1_REFERENCE_NAME_GOLDEN_FRAME 标识 GOLDEN_FRAME 参考帧

    • STD_VIDEO_AV1_REFERENCE_NAME_BWDREF_FRAME 标识 BWDREF_FRAME 参考帧

    • STD_VIDEO_AV1_REFERENCE_NAME_ALTREF2_FRAME 标识 ALTREF2_FRAME 参考帧

    • STD_VIDEO_AV1_REFERENCE_NAME_ALTREF_FRAME 标识 ALTREF_FRAME 参考帧

这些枚举常量不会直接在任何 API 中使用,而是用于间接索引到某些 Video Std 和 Vulkan API 参数数组中。

AV1 解码配置文件

通过将 VkVideoProfileInfoKHR::videoCodecOperation 设置为 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR,并在 VkVideoProfileInfoKHR::pNext 链中添加一个 VkVideoDecodeAV1ProfileInfoKHR 结构,来指定支持 AV1 视频解码操作的视频配置文件。

VkVideoDecodeAV1ProfileInfoKHR 结构定义如下:

// Provided by VK_KHR_video_decode_av1
typedef struct VkVideoDecodeAV1ProfileInfoKHR {
    VkStructureType       sType;
    const void*           pNext;
    StdVideoAV1Profile    stdProfile;
    VkBool32              filmGrainSupport;
} VkVideoDecodeAV1ProfileInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdProfile 是一个 StdVideoAV1Profile 值,指定 AV1 编解码器配置文件,如 AV1 规范 的 A.2 节中所定义。

  • filmGrainSupport 指定是否可以在视频配置文件中使用 AV1 胶片颗粒,如 AV1 规范 的 7.8.3 节中所定义。当此成员为 VK_TRUE 时,针对视频配置文件创建的视频会话对象将能够解码启用胶片颗粒的图像。

启用 filmGrainSupport 可能会增加某些实现上的视频会话和/或视频图像资源的内存需求。

有效用法(隐式)
  • VUID-VkVideoDecodeAV1ProfileInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR

AV1 解码能力

当调用 vkGetPhysicalDeviceVideoCapabilitiesKHR 来查询AV1 解码配置文件的能力时,VkVideoCapabilitiesKHR::pNext必须包含一个 VkVideoDecodeAV1CapabilitiesKHR 结构,该结构将填充配置文件特定的能力。

VkVideoDecodeAV1CapabilitiesKHR 结构定义如下:

// Provided by VK_KHR_video_decode_av1
typedef struct VkVideoDecodeAV1CapabilitiesKHR {
    VkStructureType     sType;
    void*               pNext;
    StdVideoAV1Level    maxLevel;
} VkVideoDecodeAV1CapabilitiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxLevel 是一个 StdVideoAV1Level 值,指定配置文件支持的最大 AV1 级别,如 AV1 规范 的 A.3 节中所定义。

有效用法(隐式)
  • VUID-VkVideoDecodeAV1CapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR

AV1 解码参数集

使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建的视频会话参数对象包含以下参数集的单个实例:

AV1 序列头

StdVideoAV1SequenceHeader 结构表示,并按如下方式解释:

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • pColorConfig 指向的 StdVideoAV1ColorConfig 结构按如下方式解释:

    • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

    • StdVideoAV1ColorConfig 的所有其他成员都按照AV1 规范的 6.4.2 节中的定义进行解释;

  • 如果设置了 flags.timing_info_present_flag,则 pTimingInfo 指向的 StdVideoAV1TimingInfo 结构按如下方式解释:

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • StdVideoAV1TimingInfo 的所有其他成员都按照AV1 规范的 6.4.3 节中的定义进行解释;

  • StdVideoAV1SequenceHeader 的所有其他成员都按照AV1 规范的 6.4 节中的定义进行解释。

当使用编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 创建视频会话参数对象时,VkVideoSessionParametersCreateInfoKHR::pNext必须包含一个 VkVideoDecodeAV1SessionParametersCreateInfoKHR 结构,以指定对象的内容。

VkVideoDecodeAV1SessionParametersCreateInfoKHR 结构定义如下:

// Provided by VK_KHR_video_decode_av1
typedef struct VkVideoDecodeAV1SessionParametersCreateInfoKHR {
    VkStructureType                     sType;
    const void*                         pNext;
    const StdVideoAV1SequenceHeader*    pStdSequenceHeader;
} VkVideoDecodeAV1SessionParametersCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdSequenceHeader 是指向一个 StdVideoAV1SequenceHeader 结构的指针,该结构描述要存储在创建的对象中的AV1 序列头条目。

由于 AV1 视频会话参数对象将始终只包含一个 AV1 序列头,因此必须在对象创建时指定此头,并且无法使用 vkUpdateVideoSessionParametersKHR 命令更新此类视频会话参数对象。当从输入视频码流解码新的 AV1 序列头时,应用程序需要创建一个新的视频会话参数对象来存储它。

有效用法(隐式)
  • VUID-VkVideoDecodeAV1SessionParametersCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR

  • VUID-VkVideoDecodeAV1SessionParametersCreateInfoKHR-pStdSequenceHeader-parameter
    pStdSequenceHeader 必须是指向有效 StdVideoAV1SequenceHeader 值的有效指针

AV1 解码参数

VkVideoDecodeAV1PictureInfoKHR 结构定义如下:

// Provided by VK_KHR_video_decode_av1
typedef struct VkVideoDecodeAV1PictureInfoKHR {
    VkStructureType                        sType;
    const void*                            pNext;
    const StdVideoDecodeAV1PictureInfo*    pStdPictureInfo;
    int32_t                                referenceNameSlotIndices[VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR];
    uint32_t                               frameHeaderOffset;
    uint32_t                               tileCount;
    const uint32_t*                        pTileOffsets;
    const uint32_t*                        pTileSizes;
} VkVideoDecodeAV1PictureInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdPictureInfo 是指向 StdVideoDecodeAV1PictureInfo 结构的指针,该结构指定AV1 图像信息

  • referenceNameSlotIndices 是一个包含七个(VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR,等于 Video Std 定义的 STD_VIDEO_AV1_REFS_PER_FRAME)有符号整数值的数组,为每个用于帧间编码的AV1 参考名称指定DPB 插槽的索引或负整数值。特别是,AV1 参考名称 frame 的 DPB 插槽索引在 referenceNameSlotIndices[frame - STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME] 中指定。

  • frameHeaderOffset 是 AV1 帧头 OBU 的字节偏移量,如 AV1 规范 的 5.9 节中所定义,位于 VkVideoDecodeInfoKHR 中指定的视频码流缓冲区范围内。

  • tileCountpTileOffsetspTileSizes 中元素的数量。

  • pTileOffsets 是指向一个包含 tileCount 个整数的数组的指针,这些整数指定图像的瓦片在 VkVideoDecodeInfoKHR 中指定的视频码流缓冲区范围内的字节偏移量。

  • pTileSizes 是指向一个包含 tileCount 个整数的数组的指针,这些整数指定图像的瓦片在 VkVideoDecodeInfoKHR 中指定的视频码流缓冲区范围内的字节大小。

此结构在传递给 vkCmdDecodeVideoKHRVkVideoDecodeInfoKHR 结构的 pNext 链中指定,以指定 AV1 解码操作的编解码器特定图像信息。

解码输出图像信息

当此结构在传递给 vkCmdDecodeVideoKHRVkVideoDecodeInfoKHR 结构的 pNext 链中指定时,与 解码输出图像 相关的信息定义如下:

标准图像信息

pStdPictureInfo 指向的 StdVideoDecodeAV1PictureInfo 结构的成员按如下方式解释:

  • flags.reservedreserved1reserved2 仅用于填充目的,否则将被忽略;

  • flags.apply_grain 指示已解码的图像启用了胶片颗粒,如 AV1 规范 的 6.8.20 节中所定义;

  • OrderHintOrderHintsexpectedFrameId 按照AV1 规范 的 6.8.2 节中的定义进行解释;

  • pTileInfo 指向的 StdVideoAV1TileInfo 结构按如下方式解释:

    • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

    • pMiColStarts 是一个指向 TileCols 个无符号整数数组的指针,它对应于 AV1 规范的 6.8.14 节中定义的 MiColStarts

    • pMiRowStarts 是一个指向 TileRows 个无符号整数数组的指针,它对应于 AV1 规范的 6.8.14 节中定义的 MiRowStarts

    • pWidthInSbsMinus1 是一个指向 TileCols 个无符号整数数组的指针,它对应于 AV1 规范的 6.8.14 节中定义的 width_in_sbs_minus_1

    • pHeightInSbsMinus1 是一个指向 TileRows 个无符号整数数组的指针,它对应于 AV1 规范的 6.8.14 节中定义的 height_in_sbs_minus_1

    • StdVideoAV1TileInfo 的所有其他成员都按照 AV1 规范的 6.8.14 节中的定义进行解释;

  • pQuantization 指向的 StdVideoAV1Quantization 结构按如下方式解释

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • StdVideoAV1Quantization 的所有其他成员都按照 AV1 规范的 6.8.11 节中的定义进行解释;

  • 如果设置了 flags.segmentation_enabled,则由 pSegmentation 指向的 StdVideoAV1Segmentation 结构按如下方式解释

    • FeatureEnabled 的元素是位掩码,其中元素 i 的位索引 j 对应于 AV1 规范的 5.9.14 节中定义的 FeatureEnabled[i][j]

    • FeatureData 按照 AV1 规范的 5.9.14 节中的定义进行解释;

  • pLoopFilter 指向的 StdVideoAV1LoopFilter 结构按如下方式解释

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • update_ref_delta 是一个位掩码,其中位索引 i 被解释为对应于 loop_filter_ref_deltas 的元素 iupdate_ref_delta 的值,如 AV1 规范的 6.8.10 节中所定义;

    • update_mode_delta 是一个位掩码,其中位索引 i 被解释为对应于 loop_filter_mode_deltas 的元素 iupdate_mode_delta 的值,如 AV1 规范的 6.8.10 节中所定义;

    • StdVideoAV1LoopFilter 的所有其他成员都按照 AV1 规范的 6.8.10 节中的定义进行解释;

      如果对应于 loop_filter_ref_deltasloop_filter_mode_deltas 的语法元素不存在或未按照 AV1 规范的 5.9.11 节定义,则应用程序应指定之前的值,如 AV1 规范的 6.8.10 节中所定义。

  • 如果在活动序列头中设置了 flags.enable_cdef,则由 pCDEF 指向的 StdVideoAV1CDEF 结构的成员按如下方式解释

    • cdef_y_sec_strengthcdef_uv_sec_strengthAV1 规范的 5.9.19 节中定义的相应语法元素的比特流值;

    • StdVideoAV1CDEF 的所有其他成员都按照 AV1 规范的 6.10.14 节中的定义进行解释;

  • pLoopRestoration 指向的 StdVideoAV1LoopRestoration 结构按如下方式解释

    • LoopRestorationSize[plane] 被解释为 log2(size) - 5,其中 sizeLoopRestorationSize[plane] 的值,如 AV1 规范的 6.10.15 节中所定义。

    • StdVideoAV1LoopRestoration 的所有其他成员都按照 AV1 规范的 6.10.15 节中的定义进行定义;

  • global_motion 中提供的 StdVideoAV1GlobalMotion 结构的成员按 AV1 规范的 7.10 节中的定义进行解释;

  • 如果在活动序列头中设置了 flags.film_grain_params_present,则由 pFilmGrain 指向的 StdVideoAV1FilmGrain 结构按如下方式解释

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • StdVideoAV1FilmGrain 的所有其他成员都按照 AV1 规范的 6.8.20 节中的定义进行解释;

  • 所有其他成员都按照 AV1 规范的 6.8 节中的定义进行解释。

当为解码帧启用胶片颗粒时,AV1 解码操作将忽略 StdVideoAV1FilmGrain 中指定的 flags.update_grainfilm_grain_params_ref_idx 值,并且不会执行 AV1 规范的 6.8.20 节中定义的 load_grain_params 函数。相反,应用程序负责在 StdVideoAV1FilmGrain 中指定帧的有效胶片颗粒参数。

当为解码帧启用胶片颗粒时,即使实现不报告对视频解码配置文件的 VkVideoDecodeCapabilitiesKHR::flags 中的 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR 的支持,也需要在VkVideoDecodeInfoKHR::dstPictureResource 中指定与 VkVideoDecodeInfoKHR::pSetupReferenceSlot->pPictureResource 中指定的重建图像不同的解码输出图像资源。

参考图像设置由 StdVideoDecodeAV1PictureInfo::refresh_frame_flags 的值控制。如果它不为零,并且指定了重建图像,则后者用作图像重建的目标,以激活 pDecodeInfo->pSetupReferenceSlot→slotIndex 中指定的DPB 插槽。如果 StdVideoDecodeAV1PictureInfo::refresh_frame_flags 为零,但指定了重建图像,则与DPB 插槽关联的相应图像参考将失效,如DPB 插槽状态部分所述。

活动参数集

活动序列头 是存储在绑定的视频会话参数对象中的 AV1 序列头

有效用法(隐式)
  • VUID-VkVideoDecodeAV1PictureInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PICTURE_INFO_KHR

  • VUID-VkVideoDecodeAV1PictureInfoKHR-pStdPictureInfo-parameter
    pStdPictureInfo 必须 是指向有效 StdVideoDecodeAV1PictureInfo 值的有效指针

  • VUID-VkVideoDecodeAV1PictureInfoKHR-pTileOffsets-parameter
    pTileOffsets 必须是指向 tileCountuint32_t 值的数组的有效指针

  • VUID-VkVideoDecodeAV1PictureInfoKHR-pTileSizes-parameter
    pTileSizes 必须是指向 tileCountuint32_t 值的数组的有效指针

  • VUID-VkVideoDecodeAV1PictureInfoKHR-tileCount-arraylength
    tileCount 必须大于 0

VkVideoDecodeAV1DpbSlotInfoKHR 结构的定义如下

// Provided by VK_KHR_video_decode_av1
typedef struct VkVideoDecodeAV1DpbSlotInfoKHR {
    VkStructureType                          sType;
    const void*                              pNext;
    const StdVideoDecodeAV1ReferenceInfo*    pStdReferenceInfo;
} VkVideoDecodeAV1DpbSlotInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdReferenceInfo 是指向 StdVideoDecodeAV1ReferenceInfo 结构的指针,指定 AV1 参考信息

如果非 NULL,此结构在 VkVideoDecodeInfoKHR::pSetupReferenceSlotpNext 链中指定,并在 VkVideoDecodeInfoKHR::pReferenceSlots 的元素的 pNext 链中指定,用于为 AV1 解码操作指定编解码器特定的参考图像信息。

活动参考图像信息

当此结构在 VkVideoDecodeInfoKHR::pReferenceSlots 元素的 pNext 链中指定时,会将一个元素添加到 活动参考图像 列表中,该列表由视频解码操作用于 VkVideoDecodeInfoKHR::pReferenceSlots 的每个元素,如下所示:

重建图像信息

当此结构在 VkVideoDecodeInfoKHR::pSetupReferenceSlotpNext 链中指定时,与重建图像相关的信息定义如下

Std 参考信息

pStdReferenceInfo 指向的 StdVideoDecodeAV1ReferenceInfo 结构的成员解释如下

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • flags.disable_frame_end_update_cdf 的解释如 AV1 规范的 6.8.2 节中所定义;

  • flags.segmentation_enabled 的解释如 AV1 规范的 6.8.13 节中所定义;

  • frame_type 的解释如 AV1 规范的 6.8.2 节中所定义;

    frame_type 成员定义为 uint8_t 类型,但它采用与 StdVideoAV1FrameType 枚举类型中定义的 StdVideoDecodeAV1PictureInfo::frame_type 相同的值。

  • RefFrameSignBias 是一个位掩码,其中位索引 i 对应于 AV1 规范的 6.8.2 节中定义的 RefFrameSignBias[i]

  • OrderHint 的解释如 AV1 规范的 6.8.2 节中所定义;

  • SavedOrderHints 的解释如 AV1 规范的 7.20 节中所定义。

    当为重建的图像提供 AV1 参考信息时,某些参数(例如 frame_type)在 AV1 图像信息和 AV1 参考信息中都有指定。这是必要的,因为与仅用于相关视频解码操作的 AV1 图像信息不同,为重建的图像指定的 AV1 参考信息可能与激活的 DPB 插槽相关联,这意味着某些实现可能将其作为与 DPB 插槽关联的视频图像资源的参考图像元数据的一部分进行维护。当为活动参考图像提供 AV1 参考信息时,指定的参数对应于在用参考图像激活(设置)DPB 插槽时指定的参数,通常是为了将这些参数传递给不将这些参数的任何子集作为 DPB 插槽的 参考图像元数据的一部分维护的实现。

有效用法(隐式)
  • VUID-VkVideoDecodeAV1DpbSlotInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR

  • VUID-VkVideoDecodeAV1DpbSlotInfoKHR-pStdReferenceInfo-parameter
    pStdReferenceInfo 必须是指向有效的 StdVideoDecodeAV1ReferenceInfo 值的有效指针

AV1 解码要求

本节描述了对于至少有一个队列族支持视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR 的物理设备,必需的 AV1 解码能力,由 vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyVideoPropertiesKHR::videoCodecOperations 中返回。

表 5. 必需的 视频标准标头版本
视频标准头名称 版本

vulkan_video_codec_av1std_decode

1.0.0

表 6. 必需的视频功能
视频功能 要求 要求类型1

VkVideoCapabilitiesKHR

flags

-

min

minBitstreamBufferOffsetAlignment

4096

max

minBitstreamBufferSizeAlignment

4096

max

pictureAccessGranularity

(64,64)

max

minCodedExtent

-

max

maxCodedExtent

-

min

maxDpbSlots

0

min

maxActiveReferencePictures

0

min

VkVideoDecodeCapabilitiesKHR

flags

VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHRVK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR

min

VkVideoDecodeAV1CapabilitiesKHR

maxLevel

STD_VIDEO_AV1_LEVEL_2_0

min

1

要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。

视频编码操作

视频编码操作消耗一个编码输入图像和零个或多个参考图像,并将压缩的视频数据生成到视频比特流缓冲区和可选的重建图像

此类编码输入图像可以用作视频解码操作的输出,与图形或计算操作一起使用,或者与 窗口系统集成 API 一起使用,具体取决于实现的性能。

视频编码操作可能VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR 阶段访问以下资源

  • 与源编码输入图像活动参考图像相对应的图像子区域,访问权限为 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR

  • 目标视频比特流缓冲区范围和可选的重建图像,访问权限为 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR

视频编码操作访问的每个视频图像资源的图像子资源使用相应的VkVideoPictureResourceInfoKHR 结构指定。每个此类图像子资源必须采用适当的图像布局,如下所示

  • 如果图像子资源在视频编码操作中用作编码输入图像,则它必须处于 VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR 布局中。

  • 如果图像子资源在视频编码操作中用作重建图像参考图像,则它必须处于 VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR 布局中。

  • 如果图像子资源在视频编码操作中用作量化图,则它必须处于 VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR 布局中。

视频编码操作可能会不成功地完成。在这种情况下,目标视频码流缓冲区的内容将是未定义的。类似地,如果请求进行参考图像设置,则重建图像的内容也将是未定义的,并且激活的DPB槽将具有一个无效的图像参考

如果视频编码操作成功完成,并且应用程序提供的编解码器特定参数符合相应视频压缩标准中定义的语法和语义要求,则目标视频码流缓冲区在执行视频编码操作后将包含压缩的视频数据,具体根据相应的编解码器特定语义

编解码器特定语义

视频编码操作的以下方面是编解码器特定的:

  • 写入目标视频码流缓冲区的压缩视频数据范围。

  • 活动参考图像列表的构建和解释,以及对相应图像子区域所引用的图像数据的解释。

  • 编码输入图像相关的信息的构建和解释,以及对相应图像子区域所引用的图像数据的解释。

  • 参考图像设置的决策。

  • 与可选的重建图像相关的信息的构建和解释,以及对相应图像子区域的图像数据的生成。

  • 码率控制的某些方面。

这些编解码器特定的行为是为每个视频编解码器操作单独定义的。

  • 如果使用的视频编解码器操作是VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR,则视频编码过程的编解码器特定方面按照H.264 编码操作部分中的定义执行。

  • 如果使用的视频编解码器操作是VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR,则视频编码过程的编解码器特定方面按照H.265 编码操作部分中的定义执行。

  • 如果使用的视频编解码器操作是VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,则视频编码过程的编解码器特定方面按照AV1 编码操作部分中的定义执行。

视频编码参数覆盖

对于任何特定的视频编解码器操作,支持视频编码操作的实现通常只支持相应视频压缩标准定义的可用编码工具的子集。因此,某些依赖于实现的限制可能适用于通过与所使用的视频编解码器操作相对应的视频标准头文件中定义的结构提供的编解码器特定参数。

以应用程序可查询的功能的形式公开所有这些对特定编解码器特定参数值或其组合的限制是不切实际的,因此,本规范允许实现覆盖任何编解码器特定参数的值,除非另有说明,只要满足以下所有条件:

  • 如果应用程序提供的编解码器特定参数符合所使用的视频压缩标准定义的语法和语义要求和规则,因此可以用于生成符合该标准的视频码流,则从实现覆盖过程中产生的编解码器特定参数必须也符合相同的要求和规则,并且使用覆盖后的参数生成的任何视频码流也必须符合标准。

  • 覆盖后的编解码器特定参数值必须不对为视频编码操作定义的独立于编解码器的行为产生影响。

  • 实现必须不覆盖任何指定给命令的编解码器特定参数,这些参数可能导致指定给后续命令的应用程序提供的编解码器特定参数不再符合所使用的视频压缩标准定义的语义要求和规则,除非该实现也覆盖这些参数以符合任何此类要求和规则。

  • 覆盖后的编解码器特定参数值必须不对编解码器特定的图像数据访问语义产生影响。

  • 覆盖后的编解码器特定参数值可能会更改视频编码操作产生的或应用程序以其他方式检索的编解码器特定码流元素的内容(例如,使用vkGetEncodedVideoSessionParametersKHR命令),但必须仍然符合为该视频编解码器操作定义的编解码器特定语义,包括但不限于编码的编解码器特定码流元素的数量、类型和顺序。

除了为实现相关原因执行的编解码器特定参数覆盖之外,应用程序可以使实现应用额外的优化覆盖,这可能会提高视频编码操作的效率或性能。但是,即使在进行此类优化覆盖的情况下,实现必须满足上面列出的条件。

除非应用程序选择使用优化覆盖,否则不期望实现覆盖任何编解码器特定的参数,除非由于该实现上可用编码工具的限制而需要此类覆盖才能正确操作视频编码器实现。

视频编码操作步骤

每个视频编码操作在VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR阶段执行以下步骤:

  1. 编码输入图像中读取输入图像数据;

  2. 根据编解码器特定语义和当前的码率控制状态确定派生的编码质量参数;

  3. 根据编解码器特定语义压缩输入图像数据,在此过程中应用从活动参考图像读取的任何预测数据和码率控制限制;

  4. 将编码的码流数据写入目标视频码流缓冲区范围;

  5. 根据编解码器特定语义执行编码视频数据的图像重建,如果指定了重建图像并请求了参考图像设置,则在此过程中应用从活动参考图像读取的任何预测数据;

  6. 如果请求了参考图像设置,则重建图像信息中指定的DPB槽索引将通过重建图像进行激活

  7. 如果指定了重建图像,则根据编解码器特定语义将重建的图像数据写入重建图像

当提供重建图像信息时,指定的DPB槽索引与相应的绑定的参考图像资源关联,无论是否请求了参考图像设置

功能

当使用pVideoProfile->videoCodecOperation指定编码操作调用vkGetPhysicalDeviceVideoCapabilitiesKHR时,VkVideoEncodeCapabilitiesKHR结构必须包含在VkVideoCapabilitiesKHR结构的pNext链中,以检索特定于视频编码的功能。

VkVideoEncodeCapabilitiesKHR结构定义如下:

// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeCapabilitiesKHR {
    VkStructureType                         sType;
    void*                                   pNext;
    VkVideoEncodeCapabilityFlagsKHR         flags;
    VkVideoEncodeRateControlModeFlagsKHR    rateControlModes;
    uint32_t                                maxRateControlLayers;
    uint64_t                                maxBitrate;
    uint32_t                                maxQualityLevels;
    VkExtent2D                              encodeInputPictureGranularity;
    VkVideoEncodeFeedbackFlagsKHR           supportedEncodeFeedbackFlags;
} VkVideoEncodeCapabilitiesKHR;

实现必须supportedEncodeFeedbackFlags 中至少包含对 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHRVK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR 的支持。

encodeInputPictureGranularity 提供有关 编码输入图像 数据如何用作视频编码操作的输入的信息。特别是,某些实现可能无法将用于编码输出视频比特流的纹素集限制为 VkVideoPictureResourceInfoKHR 结构中指定的与编码输入图像相对应的图像子区域(即,其 codedExtent 成员中指定的要编码的图像数据分辨率)。

例如,应用程序请求编码范围为 1920x1080,但实现只能以编解码器特定的编码块大小(即 16x16 像素)的粒度(或如 encodeInputPictureGranularity 中另行指示的)获取编码输入图像数据。在此示例中,内容在水平方向上与编码块大小对齐,但在垂直方向上未与之对齐。因此,编码最后一行编码块将受到输入图像中纹素行 1080 到 1087 内容的影响(后者是与编码块大小垂直对齐的下一行,假设基于零的纹素行索引)。

如果 codedExtent 四舍五入到 encodeInputPictureGranularity 的下一个整数倍大于为 编码输入图像 指定的图像子资源的范围,则与图像子资源边界之外的纹素坐标对应的纹素值可能未定义的。但是,为了最大限度地提高最后编码块行/列的编码效率,以及/或者为了确保对相同输入内容重复编码时获得一致的编码结果,实现应该为此类纹素使用明确定义的默认值。尽管如此,用于此类纹素的值必须不影响视频编码操作是否生成兼容的比特流,并且必须对编码的图像数据没有其他影响,超出将这些纹素值用作任何压缩算法的输入(如使用的视频压缩标准中所定义)可能产生的其他影响。

尽管不是必需的,但通常情况下,应用程序最好确保用于编码输入图像的图像子资源的范围是编解码器特定的编码块大小(或至少是 encodeInputPictureGranularity)的整数倍,并且此填充区域填充已知值,以提高编码效率、可移植性和可重复性。

有效用法(隐式)
  • VUID-VkVideoEncodeCapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR

VkVideoEncodeCapabilitiesKHR::flags 中可以设置的位,指示支持的编码工具有

// Provided by VK_KHR_video_encode_queue
typedef enum VkVideoEncodeCapabilityFlagBitsKHR {
    VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_CAPABILITY_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_DETECTION_BIT_KHR = 0x00000002,
  // Provided by VK_KHR_video_encode_quantization_map
    VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x00000004,
  // Provided by VK_KHR_video_encode_quantization_map
    VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR = 0x00000008,
} VkVideoEncodeCapabilityFlagBitsKHR;
  • VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR 指定实现支持使用 VkVideoEncodeInfoKHR::precedingExternallyEncodedBytes

  • VK_VIDEO_ENCODE_CAPABILITY_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_DETECTION_BIT_KHR 指定当应用程序提供的目标视频比特流缓冲区范围不足以容纳视频编码操作生成的编码比特流数据时,实现能够检测并报告,方法是报告 VK_QUERY_RESULT_STATUS_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_KHR 查询结果状态代码

    某些实现可能无法在所有情况下都可靠地检测到比特流缓冲区范围不足的情况。此类实现不会报告对视频配置文件的 VK_VIDEO_ENCODE_CAPABILITY_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_DETECTION_BIT_KHR 编码能力标志的支持,但仍然可能在某些情况下报告 VK_QUERY_RESULT_STATUS_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_KHR 查询结果状态代码。即使实现不支持所讨论视频配置文件的此编码能力标志,应用程序应该始终检查特定的查询结果状态代码 VK_QUERY_RESULT_STATUS_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_KHR。但是,除非支持此编码能力标志,否则应用程序必须不能假设指示视频编码操作未成功完成的不同负查询结果状态代码不是比特流缓冲区条件不足的结果。

  • VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR 表示支持使用 量化增量图

  • VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR 指定支持使用 强调图

// Provided by VK_KHR_video_encode_queue
typedef VkFlags VkVideoEncodeCapabilityFlagsKHR;

VkVideoEncodeCapabilityFlagsKHR 是一种位掩码类型,用于设置零个或多个 VkVideoEncodeCapabilityFlagBitsKHR 的掩码。

视频编码质量级别

实现可以为一个视频编码配置文件支持多个视频编码质量级别,这些级别控制编码过程中使用的特定于实现的编码工具和算法的数量和类型。

通常,使用更高的视频编码质量级别可能会以额外的处理时间为代价产生更高质量的视频流。但是,由于编码图像的最终质量取决于 编码输入图像 的内容、活动参考图像 的内容、编解码器特定的编码参数以及与各个视频编码质量级别相对应的特定于实现的工具,因此不能保证对于任何给定的输入集,使用更高的视频编码质量级别总是会产生更高质量的编码图像。

要查询视频编码配置文件支持的特定视频编码质量级别的属性,请调用

// Provided by VK_KHR_video_encode_queue
VkResult vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR* pQualityLevelInfo,
    VkVideoEncodeQualityLevelPropertiesKHR*     pQualityLevelProperties);
有效用法
  • VUID-vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR-pQualityLevelInfo-08257
    如果 pQualityLevelInfo->pVideoProfile→videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR,则 pQualityLevelPropertiespNext必须包含一个 VkVideoEncodeH264QualityLevelPropertiesKHR 结构

  • VUID-vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR-pQualityLevelInfo-08258
    如果 pQualityLevelInfo->pVideoProfile→videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR,则 pQualityLevelPropertiespNext 链中必须包含 VkVideoEncodeH265QualityLevelPropertiesKHR 结构体。

  • VUID-vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR-pQualityLevelInfo-10305
    如果 pQualityLevelInfo->pVideoProfile→videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,则 pQualityLevelPropertiespNext 链中必须包含 VkVideoEncodeAV1QualityLevelPropertiesKHR 结构体。

有效用法(隐式)
  • VUID-vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR-physicalDevice-parameter
    physicalDevice 必须是有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR-pQualityLevelInfo-parameter
    pQualityLevelInfo 必须是指向有效的 VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR 结构体的有效指针。

  • VUID-vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR-pQualityLevelProperties-parameter
    pQualityLevelProperties 必须是指向 VkVideoEncodeQualityLevelPropertiesKHR 结构体的有效指针。

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR

  • VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR

VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR 结构体的定义如下:

// Provided by VK_KHR_video_encode_queue
typedef struct VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR {
    VkStructureType                 sType;
    const void*                     pNext;
    const VkVideoProfileInfoKHR*    pVideoProfile;
    uint32_t                        qualityLevel;
} VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pVideoProfile 是指向 VkVideoProfileInfoKHR 结构体的指针,用于指定要查询视频编码质量级别属性的视频配置文件。

  • qualityLevel 是要查询属性的视频编码质量级别。

有效用法
  • VUID-VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR-pVideoProfile-08259
    pVideoProfile 必须是一个支持的视频配置文件

  • VUID-VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR-pVideoProfile-08260
    pVideoProfile->videoCodecOperation 必须指定一个编码操作。

  • VUID-VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR-qualityLevel-08261
    qualityLevel 必须小于 VkVideoEncodeCapabilitiesKHR::maxQualityLevels,这是由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对 pVideoProfile 中指定的视频配置文件返回的值。

有效用法(隐式)
  • VUID-VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR

  • VUID-VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR-pVideoProfile-parameter
    pVideoProfile 必须 是指向有效 VkVideoProfileInfoKHR 结构的有效指针。

VkVideoEncodeQualityLevelPropertiesKHR 结构体的定义如下:

// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeQualityLevelPropertiesKHR {
    VkStructureType                            sType;
    void*                                      pNext;
    VkVideoEncodeRateControlModeFlagBitsKHR    preferredRateControlMode;
    uint32_t                                   preferredRateControlLayerCount;
} VkVideoEncodeQualityLevelPropertiesKHR;
有效用法(隐式)

VkVideoEncodeQualityLevelInfoKHR 结构体的定义如下:

// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeQualityLevelInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           qualityLevel;
} VkVideoEncodeQualityLevelInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • qualityLevel 是使用的视频编码质量级别。

此结构可以在以下位置指定:

有效用法
有效用法(隐式)
  • VUID-VkVideoEncodeQualityLevelInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR

检索编码的会话参数

存储在视频会话参数对象中的任何编解码器特定参数,根据所使用的视频压缩标准,可能需要单独编码并包含在最终的视频码流数据中。在这种情况下,应用程序必须调用 vkGetEncodedVideoSessionParametersKHR 命令,从所使用的视频会话参数对象中检索编码的参数数据,以便能够生成符合规范的视频码流。

这是必需的,因为实现可能更改了存储在视频会话参数对象中的某些编解码器特定参数,如视频编码参数覆盖部分中所定义。此外,vkGetEncodedVideoSessionParametersKHR 命令使应用程序能够在不必手动编码这些编解码器特定参数的情况下检索编码的参数数据。

可以使用以下命令从使用视频编码操作创建的视频会话参数对象中检索编码的参数数据:

// Provided by VK_KHR_video_encode_queue
VkResult vkGetEncodedVideoSessionParametersKHR(
    VkDevice                                    device,
    const VkVideoEncodeSessionParametersGetInfoKHR* pVideoSessionParametersInfo,
    VkVideoEncodeSessionParametersFeedbackInfoKHR* pFeedbackInfo,
    size_t*                                     pDataSize,
    void*                                       pData);
  • device 是拥有视频会话参数对象的逻辑设备。

  • pVideoSessionParametersInfo 是指向 VkVideoEncodeSessionParametersGetInfoKHR 结构体的指针,用于指定要检索的编码参数数据的参数。

  • pFeedbackInfo 可以是 NULL,也可以是指向 VkVideoEncodeSessionParametersFeedbackInfoKHR 结构体的指针,其中返回有关请求的参数数据的反馈信息。

  • pDataSize 是指向 size_t 值的指针,该值与返回的编码参数数据量有关,如下所述。

  • pData 可以是 NULL,也可以是指向用于写入编码参数数据的缓冲区的指针。

如果 pDataNULL,则在 pDataSize 中返回可以检索的编码参数数据的大小(以字节为单位)。否则,pDataSize必须指向一个由应用程序设置为 pData 指向的缓冲区大小(以字节为单位)的变量,并且在返回时,该变量将被实际写入 pData 的字节数覆盖。如果 pDataSize 小于可以检索的编码参数数据的大小,则不会将数据写入 pDatapDataSize 将被写入零,并且将返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示没有返回编码的参数数据。

如果 pFeedbackInfo 不为 NULL,则 VkVideoEncodeSessionParametersFeedbackInfoKHR 结构的成员,以及其 pNext 链中包含的任何适用于 pVideoSessionParametersInfo->videoSessionParameters 中指定的视频会话参数对象的其他结构,将在所有成功调用此命令时,填充有关请求的参数数据的反馈信息。

这包括 pDataNULL 或命令返回 VK_INCOMPLETE 的情况,并允许应用程序确定实现是否覆盖了任何请求的视频会话参数,而无需实际检索编码的参数数据本身。

有效用法
  • VUID-vkGetEncodedVideoSessionParametersKHR-pVideoSessionParametersInfo-08359
    pVideoSessionParametersInfo->videoSessionParameters必须是使用编码操作创建的

  • VUID-vkGetEncodedVideoSessionParametersKHR-pVideoSessionParametersInfo-08262
    如果 pVideoSessionParametersInfo->videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 pVideoSessionParametersInfopNext必须包含 VkVideoEncodeH264SessionParametersGetInfoKHR 结构

  • VUID-vkGetEncodedVideoSessionParametersKHR-pVideoSessionParametersInfo-08263
    如果 pVideoSessionParametersInfo->videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则对于 pVideoSessionParametersInfopNext 链中包含的 VkVideoEncodeH264SessionParametersGetInfoKHR 结构,如果其 writeStdSPS 成员为 VK_TRUE,则 pVideoSessionParametersInfo->videoSessionParameters必须包含一个 StdVideoH264SequenceParameterSet 条目,其 seq_parameter_set_idVkVideoEncodeH264SessionParametersGetInfoKHR::stdSPSId 匹配

  • VUID-vkGetEncodedVideoSessionParametersKHR-pVideoSessionParametersInfo-08264
    如果 pVideoSessionParametersInfo->videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则对于 pVideoSessionParametersInfopNext 链中包含的 VkVideoEncodeH264SessionParametersGetInfoKHR 结构,如果其 writeStdPPS 成员为 VK_TRUE,则 pVideoSessionParametersInfo->videoSessionParameters必须包含一个 StdVideoH264PictureParameterSet 条目,其 seq_parameter_set_idpic_parameter_set_id 分别与 VkVideoEncodeH264SessionParametersGetInfoKHR::stdSPSIdVkVideoEncodeH264SessionParametersGetInfoKHR::stdPPSId 匹配

  • VUID-vkGetEncodedVideoSessionParametersKHR-pVideoSessionParametersInfo-08265
    如果 pVideoSessionParametersInfo->videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则 pVideoSessionParametersInfopNext必须包含 VkVideoEncodeH265SessionParametersGetInfoKHR 结构

  • VUID-vkGetEncodedVideoSessionParametersKHR-pVideoSessionParametersInfo-08266
    如果 pVideoSessionParametersInfo->videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则对于 pVideoSessionParametersInfopNext 链中包含的 VkVideoEncodeH265SessionParametersGetInfoKHR 结构,如果其 writeStdVPS 成员为 VK_TRUE,则 pVideoSessionParametersInfo->videoSessionParameters必须包含一个 StdVideoH265VideoParameterSet 条目,其 vps_video_parameter_set_idVkVideoEncodeH265SessionParametersGetInfoKHR::stdVPSId 匹配

  • VUID-vkGetEncodedVideoSessionParametersKHR-pVideoSessionParametersInfo-08267
    如果 pVideoSessionParametersInfo->videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则对于 pVideoSessionParametersInfopNext 链中包含的 VkVideoEncodeH265SessionParametersGetInfoKHR 结构,如果其 writeStdSPS 成员为 VK_TRUE,则 pVideoSessionParametersInfo->videoSessionParameters必须包含一个 StdVideoH265SequenceParameterSet 条目,其 sps_video_parameter_set_idsps_seq_parameter_set_id 分别与 VkVideoEncodeH265SessionParametersGetInfoKHR::stdVPSIdVkVideoEncodeH265SessionParametersGetInfoKHR::stdSPSId 匹配

  • VUID-vkGetEncodedVideoSessionParametersKHR-pVideoSessionParametersInfo-08268
    如果 pVideoSessionParametersInfo->videoSessionParameters 是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则对于 pVideoSessionParametersInfopNext 链中包含的 VkVideoEncodeH265SessionParametersGetInfoKHR 结构,如果其 writeStdPPS 成员为 VK_TRUE,则 pVideoSessionParametersInfo->videoSessionParameters必须包含一个 StdVideoH265PictureParameterSet 条目,其 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 分别与 VkVideoEncodeH265SessionParametersGetInfoKHR::stdVPSIdVkVideoEncodeH265SessionParametersGetInfoKHR::stdSPSIdVkVideoEncodeH265SessionParametersGetInfoKHR::stdPPSId 匹配

有效用法(隐式)
  • VUID-vkGetEncodedVideoSessionParametersKHR-device-parameter
    device 必须是一个有效的 VkDevice 句柄

  • VUID-vkGetEncodedVideoSessionParametersKHR-pVideoSessionParametersInfo-parameter
    pVideoSessionParametersInfo必须是指向有效的 VkVideoEncodeSessionParametersGetInfoKHR 结构的有效指针

  • VUID-vkGetEncodedVideoSessionParametersKHR-pFeedbackInfo-parameter
    如果 pFeedbackInfo 不为 NULL,则 pFeedbackInfo必须是指向 VkVideoEncodeSessionParametersFeedbackInfoKHR 结构的有效指针

  • VUID-vkGetEncodedVideoSessionParametersKHR-pDataSize-parameter
    pDataSize 必须 是指向 size_t 值的有效指针

  • VUID-vkGetEncodedVideoSessionParametersKHR-pData-parameter
    如果 pDataSize 引用的值不为 0,且 pData 不为 NULL,则 pData 必须 是指向 pDataSize 字节数组的有效指针

返回值
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkVideoEncodeSessionParametersGetInfoKHR 结构定义如下

// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeSessionParametersGetInfoKHR {
    VkStructureType                sType;
    const void*                    pNext;
    VkVideoSessionParametersKHR    videoSessionParameters;
} VkVideoEncodeSessionParametersGetInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • videoSessionParameters 是要从中检索编码参数数据的 VkVideoSessionParametersKHR 对象。

根据所使用的视频编码操作,可能需要在该结构的 pNext 链中包含额外的编解码器特定结构,以识别要从中检索编码参数数据的特定视频会话参数,如相应章节中所述。

有效用法(隐式)
  • VUID-VkVideoEncodeSessionParametersGetInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR

  • VUID-VkVideoEncodeSessionParametersGetInfoKHR-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkVideoEncodeH264SessionParametersGetInfoKHRVkVideoEncodeH265SessionParametersGetInfoKHR 的有效实例的指针

  • VUID-VkVideoEncodeSessionParametersGetInfoKHR-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkVideoEncodeSessionParametersGetInfoKHR-videoSessionParameters-parameter
    videoSessionParameters 必须是一个有效的 VkVideoSessionParametersKHR 句柄。

VkVideoEncodeSessionParametersFeedbackInfoKHR 结构定义如下

// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeSessionParametersFeedbackInfoKHR {
    VkStructureType    sType;
    void*              pNext;
    VkBool32           hasOverrides;
} VkVideoEncodeSessionParametersFeedbackInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • hasOverrides 指示所请求的任何参数数据是否被实现覆盖

根据所使用的视频编码操作,可以在此结构的 pNext 链中包含额外的编解码器特定结构,以捕获有关所请求参数数据的编解码器特定反馈信息,如相应章节中所述。

有效用法(隐式)
  • VUID-VkVideoEncodeSessionParametersFeedbackInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR

  • VUID-VkVideoEncodeSessionParametersFeedbackInfoKHR-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkVideoEncodeH264SessionParametersFeedbackInfoKHRVkVideoEncodeH265SessionParametersFeedbackInfoKHR 的有效实例的指针

  • VUID-VkVideoEncodeSessionParametersFeedbackInfoKHR-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

视频编码命令

要启动视频编码操作,请调用

// Provided by VK_KHR_video_encode_queue
void vkCmdEncodeVideoKHR(
    VkCommandBuffer                             commandBuffer,
    const VkVideoEncodeInfoKHR*                 pEncodeInfo);
  • commandBuffer 是要在其中记录命令的命令缓冲区。

  • pEncodeInfo 是指向 VkVideoEncodeInfoKHR 结构的指针,指定视频编码操作的参数。

每次调用都会发出一个或多个视频编码操作。隐式参数 opCount 对应于该命令发出的视频编码操作的数量。调用此命令后,每个活动查询的活动查询索引将递增 opCount

目前,每次调用此命令都会导致发出单个视频编码操作。

如果绑定的视频会话是使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建的,并且 pEncodeInfopNext 链包含一个 VkVideoInlineQueryInfoKHR 结构,其 queryPool 成员指定有效的 VkQueryPool 句柄,那么此命令将为它发出的每个视频编码操作执行一个查询。

活动参考图像信息

视频编码操作使用的活动参考图片列表是用作 参考图片数据源和相关参数的图像子区域列表,并且是从作为 pEncodeInfo->pReferenceSlots 数组的元素的 VkVideoReferenceSlotInfoKHR 结构派生的。对于 pEncodeInfo->pReferenceSlots 的每个元素,根据编解码器特定语义的定义,将一个或多个元素添加到活动参考图片列表。此列表的每个元素都包含以下信息

  • 图像子资源中引用的图像子区域,该子资源由用作参考图像的 视频图像资源 引用。

  • 参考图像关联的 DPB 插槽 索引。

  • 与参考图像相关的编解码器特定参考信息。

重建图像信息

与视频编码操作使用的可选 重建图片相关的信息来自 pEncodeInfo->pSetupReferenceSlot 指向的 VkVideoReferenceSlotInfoKHR 结构(如果不是 NULL),如编解码器特定语义所定义,并且包含以下内容

  • 重建图像中,由引用的图像子资源内的图像子区域,该子区域由用作重建图像的视频图像资源指定。

  • 用于图像重建的DPB槽索引。

  • 与重建图像相关的编解码器特定参考信息。

始终需要在 pEncodeInfo->pSetupReferenceSlot 中指定有效的 VkVideoReferenceSlotInfoKHR 结构,除非视频会话是使用 VkVideoSessionCreateInfoKHR::maxDpbSlot 等于零创建的。但是,只有在根据编解码器特定语义请求参考图片设置时,由 pEncodeInfo->pSetupReferenceSlot→slotIndex 标识的 DPB 插槽才会被使用 pEncodeInfo->pSetupReferenceSlot→pPictureResource 中指定的 重建图片激活

如果指定了重建图片信息,但根据编解码器特定语义未请求参考图片设置,则与重建图片对应的视频图片资源的内容在视频编码操作后将是未定义的

某些实现可能总是输出重建图片或在视频编码操作期间将其用作临时存储,即使重建图片未标记为供将来参考。

编码输入图片信息

与视频编码操作使用的 编码输入图片 相关的信息来自 pEncodeInfo->srcPictureResource 以及 pEncodeInfo->pNext 链中提供的任何编解码器特定参数,如编解码器特定语义所定义,并且包含以下内容

  • 图像子资源中由用作编码输入图片的视频图片资源引用的图像子区域。

  • 与编码图片相关的编解码器特定图片信息。

下面定义了一些限制值,这些值被此命令的相关有效使用语句引用。

  • uint32_t activeReferencePictureCount 为视频编码操作使用的活动参考图片列表的大小。除非另有定义,否则 activeReferencePictureCount 设置为 pEncodeInfo->referenceSlotCount 的值。

  • VkOffset2D codedOffsetGranularity 为视频图像资源的编码偏移的最小对齐要求。除非另有定义,否则 codedOffsetGranularityxy 成员的值均为 0

  • uint32_t dpbFrameUseCount[]为大小为maxDpbSlots的数组,其中maxDpbSlots是绑定的视频会话创建时使用的VkVideoSessionCreateInfoKHR::maxDpbSlots,每个元素表示视频编码操作引用与相应DPB槽索引关联的帧的次数。令数组的每个元素的初始值为0

    • 如果 pEncodeInfo->pSetupReferenceSlot 不为 NULL,则 dpbFrameUseCount[i] 递增 1,其中 i 等于 pEncodeInfo->pSetupReferenceSlot→slotIndex

    • 对于 pEncodeInfo->pReferenceSlots 的每个元素,dpbFrameUseCount[i] 递增 1,其中 i 等于相应元素的 slotIndex 成员。

  • 如果使用 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR 创建了绑定的视频会话参数对象,则令 VkExtent2D quantizationMapTexelSize 为创建该绑定视频会话参数对象时使用的量化映射纹素大小

  • VkExtent2D maxCodingBlockSize 为视频编码操作可能使用的最大编解码器特定的编码块大小。

  • 如果定义了 maxCodingBlockSize,则令 VkExtent2D minCodingBlockExtent编码输入图片的编码范围,以编解码器特定的编码块表示,假设此类编码块的最大大小由 maxCodingBlockSize 定义,从 pEncodeInfo->srcPictureResourcecodedExtent 成员的值计算得出,如下所示:

    • minCodingBlockExtent.width = (codedExtent.width
      maxCodingBlockSize.width - 1) / maxCodingBlockSize.width

    • minCodingBlockExtent.height = (codedExtent.height
      maxCodingBlockSize.height - 1) / maxCodingBlockSize.height

  • 如果绑定的视频会话对象是使用 H.264 编码配置文件创建的,则

    • StdVideoH264PictureType h264PictureType 为编码图片的图片类型,设置为 pEncodeInfo->pNext 链中包含的 VkVideoEncodeH264PictureInfoKHR 结构中指定的 pStdPictureInfo->primary_pic_type 的值。

    • StdVideoH264PictureType h264L0PictureTypes[]StdVideoH264PictureType h264L1PictureTypes[] 分别为 L0 和 L1 参考列表中参考图片的图片类型。如果 pEncodeInfo->pNext 链中包含的 VkVideoEncodeH264PictureInfoKHR 结构中指定的 pStdPictureInfo->pRefLists 不为 NULL,则对于 pStdPictureInfo->pRefLists→RefPicList0pStdPictureInfo->pRefLists→RefPicList1 数组元素中指定的每个参考索引,如果参考索引不为 STD_VIDEO_H264_NO_REFERENCE_PICTURE,则将 pStdReferenceInfo->primary_pic_type 分别添加到 h264L0PictureTypesh264L1PictureTypes 中,其中 pStdReferenceInfopEncodeInfo->pReferenceSlots 的元素的 pNext 链中包含的 VkVideoEncodeH264DpbSlotInfoKHR 结构的成员,对于该元素,slotIndex 等于有问题的参考索引。

  • 如果绑定的视频会话对象是使用 H.265 编码配置文件创建的,则

    • StdVideoH265PictureType h265PictureType 为编码图片的图片类型,设置为 pEncodeInfo->pNext 链中包含的 VkVideoEncodeH265PictureInfoKHR 结构中指定的 pStdPictureInfo->pic_type 的值。

    • StdVideoH265PictureType h265L0PictureTypes[]StdVideoH265PictureType h265L1PictureTypes[] 分别为 L0 和 L1 参考列表中参考图片的图片类型。如果 pEncodeInfo->pNext 链中包含的 VkVideoEncodeH265PictureInfoKHR 结构中指定的 pStdPictureInfo->pRefLists 不为 NULL,则对于 pStdPictureInfo->pRefLists→RefPicList0pStdPictureInfo->pRefLists→RefPicList1 数组元素中指定的每个参考索引,如果参考索引不为 STD_VIDEO_H265_NO_REFERENCE_PICTURE,则将 pStdReferenceInfo->pic_type 分别添加到 h265L0PictureTypesh265L1PictureTypes 中,其中 pStdReferenceInfopEncodeInfo->pReferenceSlots 的元素的 pNext 链中包含的 VkVideoEncodeH265DpbSlotInfoKHR 结构的成员,对于该元素,slotIndex 等于有问题的参考索引。

  • 如果绑定的视频会话对象是使用 AV1 编码配置文件创建的,则

    • 如果 pEncodeInfo->pNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 primaryReferenceCdfOnly 成员设置为 VK_TRUE,则令 int32_t cdfOnlyReferenceIndexVkVideoEncodeAV1PictureInfoKHR::pStdPictureInfo->primary_ref_frame 的值。

    • 否则,令 int32_t cdfOnlyReferenceIndex-1

有效用法
  • VUID-vkCmdEncodeVideoKHR-None-08250
    绑定的视频会话必须已使用编码操作创建

  • VUID-vkCmdEncodeVideoKHR-None-07012
    在设备上执行命令时,绑定的视频会话必须不在未初始化状态。

  • VUID-vkCmdEncodeVideoKHR-None-08318
    绑定的视频会话参数对象必须已使用当前为绑定视频会话设置的视频编码质量级别创建,该级别是在设备上执行该命令时确定的。

  • VUID-vkCmdEncodeVideoKHR-opCount-07174
    对于每个活跃查询,对应于该查询类型的活跃查询索引加上opCount必须小于或等于对应于该查询类型的最后可激活查询索引加一。

  • VUID-vkCmdEncodeVideoKHR-pNext-08360
    如果绑定的视频会话是使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建的,并且 pEncodeInfopNext 链中包含一个 VkVideoInlineQueryInfoKHR 结构,其 queryPool 成员指定一个有效的 VkQueryPool 句柄,则 VkVideoInlineQueryInfoKHR::queryCount 必须等于 opCount

  • VUID-vkCmdEncodeVideoKHR-pNext-08361
    如果使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建了绑定的视频会话,并且 pEncodeInfopNext 链包含一个 VkVideoInlineQueryInfoKHR 结构,其 queryPool 成员指定了一个有效的 VkQueryPool 句柄,那么该命令使用的所有查询(由 VkVideoInlineQueryInfoKHR 结构指定)必须不可用的

  • VUID-vkCmdEncodeVideoKHR-queryType-08362
    如果使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建了绑定的视频会话,那么用于创建在 pEncodeInfopNext 链中包含的 VkVideoInlineQueryInfoKHR 结构中指定的 queryPoolqueryType 必须VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHRVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR

  • VUID-vkCmdEncodeVideoKHR-queryPool-08363
    如果使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建了绑定的视频会话,那么在 pEncodeInfopNext 链中包含的 VkVideoInlineQueryInfoKHR 结构中指定的 queryPool 必须是用包含在 VkQueryPoolCreateInfopNext 链中的 VkVideoProfileInfoKHR 结构创建的,该结构与创建绑定的视频会话时在 VkVideoSessionCreateInfoKHR::pVideoProfile 中指定的结构相同

  • VUID-vkCmdEncodeVideoKHR-queryType-08364
    如果使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建了绑定的视频会话,并且用于创建 pEncodeInfopNext 链中包含的 VkVideoInlineQueryInfoKHR 结构中指定的 queryPoolqueryTypeVK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR,那么分配 commandBufferVkCommandPool 必须已使用支持结果状态查询的队列族索引创建,如 VkQueueFamilyQueryResultStatusPropertiesKHR::queryResultStatusSupport 所示

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08201
    pEncodeInfo->dstBuffer 必须与创建绑定的视频会话时使用的视频配置文件兼容

  • VUID-vkCmdEncodeVideoKHR-commandBuffer-08202
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,那么 pEncodeInfo->dstBuffer 必须不是受保护的缓冲区

  • VUID-vkCmdEncodeVideoKHR-commandBuffer-08203
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,那么 pEncodeInfo->dstBuffer 必须是受保护的缓冲区

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08204
    pEncodeInfo->dstBufferOffset 必须VkVideoCapabilitiesKHR::minBitstreamBufferOffsetAlignment 的整数倍,由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对创建绑定的视频会话时使用的视频配置文件返回

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08205
    pEncodeInfo->dstBufferRange 必须VkVideoCapabilitiesKHR::minBitstreamBufferSizeAlignment 的整数倍,由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对创建绑定的视频会话时使用的视频配置文件返回

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08206
    pEncodeInfo->srcPictureResource.imageViewBinding 必须与创建绑定的视频会话时使用的视频配置文件兼容

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08207
    pEncodeInfo->srcPictureResource.imageViewBinding 的格式 必须与创建绑定的视频会话时使用的 VkVideoSessionCreateInfoKHR::pictureFormat 匹配

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08208
    pEncodeInfo->srcPictureResource.codedOffset 必须codedOffsetGranularity 的整数倍

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08209
    pEncodeInfo->srcPictureResource.codedExtent 必须在创建绑定的视频会话时使用的 minCodedExtentmaxCodedExtent 之间(包括这两个值)

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08210
    pEncodeInfo->srcPictureResource.imageViewBinding 必须已使用 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR 创建

  • VUID-vkCmdEncodeVideoKHR-commandBuffer-08211
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,那么 pEncodeInfo->srcPictureResource.imageViewBinding 必须不是从受保护的图像创建的

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08377
    pEncodeInfo->pSetupReferenceSlot 不能NULL,除非创建绑定的视频会话时 VkVideoSessionCreateInfoKHR::maxDpbSlots 等于零

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08213
    如果 pEncodeInfo->pSetupReferenceSlot 不为 NULL,那么 pEncodeInfo->pSetupReferenceSlot→slotIndex 必须小于创建绑定的视频会话时指定的 VkVideoSessionCreateInfoKHR::maxDpbSlots

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08214
    如果 pEncodeInfo->pSetupReferenceSlot 不为 NULL,那么 pEncodeInfo->pSetupReferenceSlot→pPictureResource→codedOffset 必须codedOffsetGranularity 的整数倍

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08215
    如果 pEncodeInfo->pSetupReferenceSlot 不为 NULL,那么 pEncodeInfo->pSetupReferenceSlot→pPictureResource 必须匹配一个绑定的参考图像资源

  • VUID-vkCmdEncodeVideoKHR-activeReferencePictureCount-08216
    activeReferencePictureCount 必须小于或等于创建绑定视频会话时指定的 VkVideoSessionCreateInfoKHR::maxActiveReferencePictures

  • VUID-vkCmdEncodeVideoKHR-slotIndex-08217
    pEncodeInfo->pReferenceSlots 的每个元素的 slotIndex 成员必须小于绑定视频会话创建时指定的 VkVideoSessionCreateInfoKHR::maxDpbSlots

  • VUID-vkCmdEncodeVideoKHR-codedOffset-08218
    pEncodeInfo->pReferenceSlots 的每个元素的 pPictureResource 成员指向的 VkVideoPictureResourceInfoKHR 结构的 codedOffset 成员必须codedOffsetGranularity 的整数倍。

  • VUID-vkCmdEncodeVideoKHR-pPictureResource-08219
    pEncodeInfo->pReferenceSlots 的每个元素的 pPictureResource 成员必须匹配与该元素的 slotIndex 成员中指定的 DPB 插槽索引关联的绑定的参考图像资源之一。

  • VUID-vkCmdEncodeVideoKHR-pPictureResource-08220
    pEncodeInfo->pReferenceSlots 元素中指定的 pPictureResource 成员相对应的每个视频图像资源在 pEncodeInfo->pReferenceSlots必须唯一的

  • VUID-vkCmdEncodeVideoKHR-dpbFrameUseCount-08221
    dpbFrameUseCount 的所有元素必须小于或等于 1

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08222
    在设备上执行视频编码操作时,pEncodeInfo->srcPictureResource 引用的图像子资源必须处于 VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR 布局。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08223
    如果 pEncodeInfo->pSetupReferenceSlot 不为 NULL,则在设备上执行视频编码操作时,pEncodeInfo->pSetupReferenceSlot→pPictureResource 引用的图像子资源必须处于 VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR 布局。

  • VUID-vkCmdEncodeVideoKHR-pPictureResource-08224
    在设备上执行视频编码操作时,pEncodeInfo->pReferenceSlots 的每个元素的 pPictureResource 成员引用的图像子资源必须处于 VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR 布局。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10306
    如果 pEncodeInfo->flags 包含 VK_VIDEO_ENCODE_WITH_QUANTIZATION_DELTA_MAP_BIT_KHR,则绑定的视频会话必须已使用 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR 创建。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10307
    如果 pEncodeInfo->flags 包含 VK_VIDEO_ENCODE_WITH_EMPHASIS_MAP_BIT_KHR,则绑定的视频会话必须已使用 VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR 创建。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10308
    如果当前的速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 pEncodeInfo->flags 必须不包含 VK_VIDEO_ENCODE_WITH_EMPHASIS_MAP_BIT_KHR

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10309
    如果 pEncodeInfo->flags 包含 VK_VIDEO_ENCODE_WITH_QUANTIZATION_DELTA_MAP_BIT_KHRVK_VIDEO_ENCODE_WITH_EMPHASIS_MAP_BIT_KHR,则 pEncodeInfopNext必须包含一个 VkVideoEncodeQuantizationMapInfoKHR 结构,且其 quantizationMap 成员指定有效的 VkImageView 句柄。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10310
    如果 pEncodeInfo->flags 包含 VK_VIDEO_ENCODE_WITH_QUANTIZATION_DELTA_MAP_BIT_KHRVK_VIDEO_ENCODE_WITH_EMPHASIS_MAP_BIT_KHR,则 pNext 链中包含的 VkVideoEncodeQuantizationMapInfoKHR 结构的 quantizationMap 成员指定的 VkImageView 必须与创建绑定的视频会话时使用的视频配置文件兼容

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10311
    如果 pEncodeInfo->flags 包含 VK_VIDEO_ENCODE_WITH_QUANTIZATION_DELTA_MAP_BIT_KHR,则 pEncodeInfopNext 链中包含的 VkVideoEncodeQuantizationMapInfoKHR 结构的 quantizationMap 成员指定的 VkImageView 必须已使用 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR 创建。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10312
    如果 pEncodeInfo->flags 包含 VK_VIDEO_ENCODE_WITH_EMPHASIS_MAP_BIT_KHR,则 pEncodeInfopNext 链中包含的 VkVideoEncodeQuantizationMapInfoKHR 结构的 quantizationMap 成员指定的 VkImageView 必须已使用 VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR 创建。

  • VUID-vkCmdEncodeVideoKHR-pNext-10313
    如果 VkVideoEncodeQuantizationMapInfoKHR 结构的实例包含在 pEncodeInfopNext 链中,其 quantizationMap 成员不是 VK_NULL_HANDLEcommandBuffer 是一个不受保护的命令缓冲区,并且不支持 protectedNoFault,则 VkVideoEncodeQuantizationMapInfoKHR::quantizationMap 必须不是从受保护的图像创建的。

  • VUID-vkCmdEncodeVideoKHR-pNext-10314
    如果 VkVideoEncodeQuantizationMapInfoKHR 结构的实例包含在 pEncodeInfopNext 链中,并且其 quantizationMap 成员不是 VK_NULL_HANDLE,则 quantizationMap 引用的图像子资源范围在设备上执行视频编码操作时必须处于 VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR 布局。

  • VUID-vkCmdEncodeVideoKHR-pNext-10315
    如果 VkVideoEncodeQuantizationMapInfoKHR 结构的实例包含在 pEncodeInfopNext 链中,并且其 quantizationMap 成员不是 VK_NULL_HANDLE,并且存在绑定的视频会话参数对象,则绑定的视频会话参数对象必须已使用 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR 创建。

  • VUID-vkCmdEncodeVideoKHR-pNext-10316
    如果 VkVideoEncodeQuantizationMapInfoKHR 结构的实例包含在 pEncodeInfopNext 链中,其 quantizationMap 成员不是 VK_NULL_HANDLE,并且存在使用 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR 创建的绑定的视频会话参数对象,则 quantizationMapExtent 必须等于 pEncodeInfo->srcPictureResource.codedExtent / quantizationMapTexelSize

  • VUID-vkCmdEncodeVideoKHR-pNext-08225
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 pEncodeInfopNext必须包含一个 VkVideoEncodeH264PictureInfoKHR 结构。

  • VUID-vkCmdEncodeVideoKHR-StdVideoH264SequenceParameterSet-08226
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则绑定的视频会话参数对象必须包含一个 StdVideoH264SequenceParameterSet 条目,其 seq_parameter_set_idVkVideoEncodeH264PictureInfoKHR 结构的 pNext 链中提供的 StdVideoEncodeH264PictureInfo::seq_parameter_set_id 匹配。

  • VUID-vkCmdEncodeVideoKHR-StdVideoH264PictureParameterSet-08227
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则绑定的视频会话参数对象必须包含一个 StdVideoH264PictureParameterSet 条目,其 seq_parameter_set_idpic_parameter_set_id 分别与 VkVideoEncodeH264PictureInfoKHR 结构的 pNext 链中提供的 StdVideoEncodeH264PictureInfo::seq_parameter_set_idStdVideoEncodeH264PictureInfo::pic_parameter_set_id 匹配。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08228
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 pEncodeInfo->pSetupReferenceSlot 不是 NULL,则 pEncodeInfo->pSetupReferenceSlotpNext必须包含一个 VkVideoEncodeH264DpbSlotInfoKHR 结构。

  • VUID-vkCmdEncodeVideoKHR-pNext-08229
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 pEncodeInfo->pReferenceSlots 的每个元素的 pNext必须包含一个 VkVideoEncodeH264DpbSlotInfoKHR 结构。

  • VUID-vkCmdEncodeVideoKHR-constantQp-08269
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且当前的码率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 VkVideoEncodeH264NaluSliceInfoKHR::constantQp 必须对于 pEncodeInfopNext 链中包含的 VkVideoEncodeH264PictureInfoKHR 结构的 pNaluSliceEntries 成员的每个元素都为零。

  • VUID-vkCmdEncodeVideoKHR-constantQp-08270
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且当前的码率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 VkVideoEncodeH264NaluSliceInfoKHR::constantQp 必须VkVideoEncodeH264CapabilitiesKHR::minQpVkVideoEncodeH264CapabilitiesKHR::maxQp 之间,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回的那样,对于 pEncodeInfopNext 链中包含的 VkVideoEncodeH264PictureInfoKHR 结构的 pNaluSliceEntries 成员的每个元素。

  • VUID-vkCmdEncodeVideoKHR-constantQp-08271
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 VkVideoEncodeH264CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回的那样,则 VkVideoEncodeH264NaluSliceInfoKHR::constantQp 必须对于 pEncodeInfopNext 链中包含的 VkVideoEncodeH264PictureInfoKHR 结构的 pNaluSliceEntries 成员的每个元素具有相同的值。

  • VUID-vkCmdEncodeVideoKHR-naluSliceEntryCount-08302
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 pEncodeInfopNext 链中包含的 VkVideoEncodeH264PictureInfoKHR 结构的 naluSliceEntryCount 成员必须小于或等于 minCodingBlockExtent.width 乘以 minCodingBlockExtent.height

  • VUID-vkCmdEncodeVideoKHR-naluSliceEntryCount-08312
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 VkVideoEncodeH264CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回的那样,则 pEncodeInfopNext 链中包含的 VkVideoEncodeH264PictureInfoKHR 结构的 naluSliceEntryCount 成员必须小于或等于 minCodingBlockExtent.height

  • VUID-vkCmdEncodeVideoKHR-pNext-08352
    如果绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,pEncodeInfopNext 链包含一个 VkVideoEncodeH264PictureInfoKHR 结构,并且 pEncodeInfo->referenceSlotCount 大于零,则 VkVideoEncodeH264PictureInfoKHR::pStdPictureInfo->pRefLists 必须不是 NULL

  • VUID-vkCmdEncodeVideoKHR-pNext-08339
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 pEncodeInfopNext 链包含一个 VkVideoEncodeH264PictureInfoKHR 结构,并且 VkVideoEncodeH264PictureInfoKHR::pStdPictureInfo->pRefLists 不为 NULL,那么 RefPicList0RefPicList1 数组成员(由 VkVideoEncodeH264PictureInfoKHR::pStdPictureInfo->pRefLists 指向的 StdVideoEncodeH264ReferenceListsInfo 结构)的每个元素 必须 要么为 STD_VIDEO_H264_NO_REFERENCE_PICTURE,要么 必须 等于 pEncodeInfo->pReferenceSlots 的某个元素的 slotIndex 成员。

  • VUID-vkCmdEncodeVideoKHR-pNext-08353
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,则 pEncodeInfopNext 链包含一个 VkVideoEncodeH264PictureInfoKHR 结构,并且 pEncodeInfo->referenceSlotCount 大于零,那么 pEncodeInfo->pReferenceSlots 的每个元素的 slotIndex 成员 必须 等于 RefPicList0RefPicList1 数组成员(由 VkVideoEncodeH264PictureInfoKHR::pStdPictureInfo->pRefLists 指向的 StdVideoEncodeH264ReferenceListsInfo 结构)的某个元素。

  • VUID-vkCmdEncodeVideoKHR-maxPPictureL0ReferenceCount-08340
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 VkVideoEncodeH264CapabilitiesKHR::maxPPictureL0ReferenceCount 为零(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定的视频会话所使用的视频配置文件返回),则 h264PictureType 以及 h264L0PictureTypesh264L1PictureTypes 的每个元素 必须 不为 STD_VIDEO_H264_PICTURE_TYPE_P

  • VUID-vkCmdEncodeVideoKHR-maxBPictureL0ReferenceCount-08341
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 VkVideoEncodeH264CapabilitiesKHR::maxBPictureL0ReferenceCountVkVideoEncodeH264CapabilitiesKHR::maxL1ReferenceCount 都为零(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定的视频会话所使用的视频配置文件返回),则 h264PictureType 以及 h264L0PictureTypesh264L1PictureTypes 的每个元素 必须 不为 STD_VIDEO_H264_PICTURE_TYPE_B

  • VUID-vkCmdEncodeVideoKHR-flags-08342
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 VkVideoEncodeH264CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定的视频会话所使用的视频配置文件返回),则 h264L0PictureTypes 的每个元素 必须 不为 STD_VIDEO_H264_PICTURE_TYPE_B

  • VUID-vkCmdEncodeVideoKHR-flags-08343
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的,并且 VkVideoEncodeH264CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定的视频会话所使用的视频配置文件返回),则 h264L1PictureTypes 的每个元素 必须 不为 STD_VIDEO_H264_PICTURE_TYPE_B

  • VUID-vkCmdEncodeVideoKHR-pNext-08230
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则 pEncodeInfopNext必须 包含一个 VkVideoEncodeH265PictureInfoKHR 结构。

  • VUID-vkCmdEncodeVideoKHR-StdVideoH265VideoParameterSet-08231
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则绑定的视频会话参数对象 必须 包含一个 StdVideoH265VideoParameterSet 条目,其 vps_video_parameter_set_idVkVideoEncodeH265PictureInfoKHR 结构的 pStdPictureInfo 成员中提供的 StdVideoEncodeH265PictureInfo::sps_video_parameter_set_id 相匹配。

  • VUID-vkCmdEncodeVideoKHR-StdVideoH265SequenceParameterSet-08232
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则绑定的视频会话参数对象 必须 包含一个 StdVideoH265SequenceParameterSet 条目,其 sps_video_parameter_set_idsps_seq_parameter_set_id 分别与 VkVideoEncodeH265PictureInfoKHR 结构的 pStdPictureInfo 成员中提供的 StdVideoEncodeH265PictureInfo::sps_video_parameter_set_idStdVideoEncodeH265PictureInfo::pps_seq_parameter_set_id 相匹配。

  • VUID-vkCmdEncodeVideoKHR-StdVideoH265PictureParameterSet-08233
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则绑定的视频会话参数对象 必须 包含一个 StdVideoH265PictureParameterSet 条目,其 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 分别与 VkVideoEncodeH265PictureInfoKHR 结构的 pStdPictureInfo 成员中提供的 StdVideoEncodeH265PictureInfo::sps_video_parameter_set_idStdVideoEncodeH265PictureInfo::pps_seq_parameter_set_idStdVideoEncodeH265PictureInfo::pps_pic_parameter_set_id 相匹配。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-08234
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 pEncodeInfo->pSetupReferenceSlot 不为 NULL,则 pEncodeInfo->pSetupReferenceSlotpNext必须 包含一个 VkVideoEncodeH265DpbSlotInfoKHR 结构。

  • VUID-vkCmdEncodeVideoKHR-pNext-08235
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,则 pEncodeInfo->pReferenceSlots 的每个元素的 pNext必须 包含一个 VkVideoEncodeH265DpbSlotInfoKHR 结构。

  • VUID-vkCmdEncodeVideoKHR-constantQp-08272
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且当前的码率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 VkVideoEncodeH265NaluSliceSegmentInfoKHR::constantQp 对于 pEncodeInfopNext 链中包含的 VkVideoEncodeH265PictureInfoKHR 结构的 pNaluSliceSegmentEntries 成员的每个元素 必须 为零。

  • VUID-vkCmdEncodeVideoKHR-constantQp-08273
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且当前的速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,那么 VkVideoEncodeH265NaluSliceSegmentInfoKHR::constantQp 必须介于 VkVideoEncodeH265CapabilitiesKHR::minQpVkVideoEncodeH265CapabilitiesKHR::maxQp 之间,这些值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回,对于 pEncodeInfopNext 链中包含的 VkVideoEncodeH265PictureInfoKHR 结构的 pNaluSliceSegmentEntries 成员的每个元素。

  • VUID-vkCmdEncodeVideoKHR-constantQp-08274
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 VkVideoEncodeH265CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR,这是 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回的,那么 VkVideoEncodeH265NaluSliceSegmentInfoKHR::constantQp 必须对于 pEncodeInfopNext 链中包含的 VkVideoEncodeH264PictureInfoKHR 结构的 pNaluSliceSegmentEntries 成员的每个元素具有相同的值。

  • VUID-vkCmdEncodeVideoKHR-naluSliceSegmentEntryCount-08307
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,那么 pEncodeInfopNext 链中包含的 VkVideoEncodeH265PictureInfoKHR 结构的 naluSliceSegmentEntryCount 成员必须小于或等于 minCodingBlockExtent.width 乘以 minCodingBlockExtent.height

  • VUID-vkCmdEncodeVideoKHR-naluSliceSegmentEntryCount-08313
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 VkVideoEncodeH265CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_KHR,这是 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回的,那么 pEncodeInfopNext 链中包含的 VkVideoEncodeH265PictureInfoKHR 结构的 naluSliceSegmentEntryCount 成员必须小于或等于 minCodingBlockExtent.height

  • VUID-vkCmdEncodeVideoKHR-pNext-08354
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,pEncodeInfopNext 链包含 VkVideoEncodeH265PictureInfoKHR 结构,并且 pEncodeInfo->referenceSlotCount 大于零,那么 VkVideoEncodeH265PictureInfoKHR::pStdPictureInfo->pRefLists 必须不是 NULL

  • VUID-vkCmdEncodeVideoKHR-pNext-08344
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,pEncodeInfopNext 链包含 VkVideoEncodeH265PictureInfoKHR 结构,并且 VkVideoEncodeH265PictureInfoKHR::pStdPictureInfo->pRefLists 不是 NULL,那么 VkVideoEncodeH265PictureInfoKHR::pStdPictureInfo->pRefLists 指向的 StdVideoEncodeH265ReferenceListsInfo 结构的 RefPicList0RefPicList1 数组成员的每个元素,必须STD_VIDEO_H265_NO_REFERENCE_PICTURE,或者必须等于 pEncodeInfo->pReferenceSlots 的其中一个元素的 slotIndex 成员。

  • VUID-vkCmdEncodeVideoKHR-pNext-08355
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,pEncodeInfopNext 链包含 VkVideoEncodeH265PictureInfoKHR 结构,并且 pEncodeInfo->referenceSlotCount 大于零,那么 pEncodeInfo->pReferenceSlots 的每个元素的 slotIndex 成员,必须等于 VkVideoEncodeH265PictureInfoKHR::pStdPictureInfo->pRefLists 指向的 StdVideoEncodeH265ReferenceListsInfo 结构的 RefPicList0RefPicList1 数组成员的其中一个元素。

  • VUID-vkCmdEncodeVideoKHR-maxPPictureL0ReferenceCount-08345
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 VkVideoEncodeH265CapabilitiesKHR::maxPPictureL0ReferenceCount 为零,这是 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回的,那么 h265PictureType 以及 h265L0PictureTypesh265L1PictureTypes 的每个元素必须不是 STD_VIDEO_H265_PICTURE_TYPE_P

  • VUID-vkCmdEncodeVideoKHR-maxBPictureL0ReferenceCount-08346
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 VkVideoEncodeH265CapabilitiesKHR::maxBPictureL0ReferenceCountVkVideoEncodeH265CapabilitiesKHR::maxL1ReferenceCount 都为零,这是 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回的,那么 h265PictureType 以及 h265L0PictureTypesh265L1PictureTypes 的每个元素必须不是 STD_VIDEO_H265_PICTURE_TYPE_B

  • VUID-vkCmdEncodeVideoKHR-flags-08347
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 VkVideoEncodeH265CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR,这是 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回的,那么 h265L0PictureTypes 的每个元素必须不是 STD_VIDEO_H264_PICTURE_TYPE_B

  • VUID-vkCmdEncodeVideoKHR-flags-08348
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,并且 VkVideoEncodeH265CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR,这是 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回的,那么 h265L1PictureTypes 的每个元素必须不是 STD_VIDEO_H265_PICTURE_TYPE_B

  • VUID-vkCmdEncodeVideoKHR-pNext-10317
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,那么 pEncodeInfopNext必须包含 VkVideoEncodeAV1PictureInfoKHR 结构。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10318
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 pEncodeInfo->pSetupReferenceSlot 不为 NULL,那么 pEncodeInfo->pSetupReferenceSlotpNext必须包含一个 VkVideoEncodeAV1DpbSlotInfoKHR 结构体

  • VUID-vkCmdEncodeVideoKHR-pNext-10319
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,那么 pEncodeInfo->pReferenceSlots 中每个元素的 pNext必须包含一个 VkVideoEncodeAV1DpbSlotInfoKHR 结构体

  • VUID-vkCmdEncodeVideoKHR-constantQIndex-10320
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且当前的速率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,那么包含在 pEncodeInfopNext 链中的 VkVideoEncodeAV1PictureInfoKHR 结构体的 constantQIndex 成员必须为零

  • VUID-vkCmdEncodeVideoKHR-constantQIndex-10321
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且当前的速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,那么包含在 pEncodeInfopNext 链中的 VkVideoEncodeAV1PictureInfoKHR 结构体的 constantQIndex 成员必须VkVideoEncodeAV1CapabilitiesKHR::minQIndexVkVideoEncodeAV1CapabilitiesKHR::maxQIndex 之间,这两个值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回

  • VUID-vkCmdEncodeVideoKHR-flags-10322
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回,那么包含在 pEncodeInfopNext 链中的 VkVideoEncodeAV1PictureInfoKHR 结构体的 pStdPictureInfo->flags.frame_size_override_flag 必须为零

  • VUID-vkCmdEncodeVideoKHR-flags-10323
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回,那么 pEncodeInfo->srcPictureResource.codedExtent.width 必须等于StdVideoAV1SequenceHeader::max_frame_width_minus_1 + 1,这个值来自活动的 AV1 序列头

  • VUID-vkCmdEncodeVideoKHR-flags-10324
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回,那么 pEncodeInfo->srcPictureResource.codedExtent.height 必须等于StdVideoAV1SequenceHeader::max_frame_height_minus_1 + 1,这个值来自活动的 AV1 序列头

  • VUID-vkCmdEncodeVideoKHR-flags-10325
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1CapabilitiesKHR::flags 不包含 VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回,那么 pEncodeInfo->pReferenceSlots 的每个元素i pEncodeInfo->pReferenceSlots[i].pPictureResource->codedExtent 必须pEncodeInfo->srcPictureResource.codedExtent 匹配

  • VUID-vkCmdEncodeVideoKHR-predictionMode-10326
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且包含在 pEncodeInfopNext 链中的 VkVideoEncodeAV1PictureInfoKHR 结构体的 predictionMode 成员是 VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR,那么 VkVideoEncodeAV1PictureInfoKHR::pStdPictureInfo->frame_type 必须STD_VIDEO_AV1_FRAME_TYPE_KEYSTD_VIDEO_AV1_FRAME_TYPE_INTRA_ONLY

  • VUID-vkCmdEncodeVideoKHR-pStdPictureInfo-10327
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且包含在 pEncodeInfopNext 链中的 VkVideoEncodeAV1PictureInfoKHR 结构体的 pStdPictureInfo 成员的 pStdPictureInfo->frame_typeSTD_VIDEO_AV1_FRAME_TYPE_KEYSTD_VIDEO_AV1_FRAME_TYPE_INTRA_ONLY,那么 VkVideoEncodeAV1PictureInfoKHR::predictionMode 必须VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR

  • VUID-vkCmdEncodeVideoKHR-maxSingleReferenceCount-10328
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1CapabilitiesKHR::maxSingleReferenceCount 为零,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回,那么包含在 pEncodeInfopNext 链中的 VkVideoEncodeAV1PictureInfoKHR 结构体的 predictionMode 成员必须不是 VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR

  • VUID-vkCmdEncodeVideoKHR-predictionMode-10329
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且包含在 pEncodeInfopNext 链中的 VkVideoEncodeAV1PictureInfoKHR 结构体的 predictionMode 成员是 VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR,那么 VkVideoEncodeAV1PictureInfoKHR::referenceNameSlotIndices 必须至少有一个非负元素,该元素索引为 i,且不等于 cdfOnlyReferenceIndex,并且对于该元素索引iVkVideoEncodeAV1CapabilitiesKHR::singleReferenceNameMask 中的位索引i 已设置,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回

  • VUID-vkCmdEncodeVideoKHR-maxUnidirectionalCompoundReferenceCount-10330
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1CapabilitiesKHR::maxUnidirectionalCompoundReferenceCount 为零(如通过 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回),则 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 predictionMode 成员必须不是 VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_UNIDIRECTIONAL_COMPOUND_KHR

  • VUID-vkCmdEncodeVideoKHR-predictionMode-10331
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 predictionMode 成员是 VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_UNIDIRECTIONAL_COMPOUND_KHR,则 VkVideoEncodeAV1PictureInfoKHR::referenceNameSlotIndices必须至少有两个非负元素,其元素索引分别为 ij,其中 (i,j) ∈ {(0,1),(0,2),(0,3),(4,6)},并且这两个元素都不能等于 cdfOnlyReferenceIndex,并且对于这两个元素的位索引 ijVkVideoEncodeAV1CapabilitiesKHR::unidirectionalCompoundReferenceNameMask 中设置(如通过 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回)。

  • VUID-vkCmdEncodeVideoKHR-maxBidirectionalCompoundReferenceCount-10332
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1CapabilitiesKHR::maxBidirectionalCompoundReferenceCount 为零(如通过 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回),则 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 predictionMode 成员必须不是 VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR

  • VUID-vkCmdEncodeVideoKHR-predictionMode-10333
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 predictionMode 成员是 VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR,则 VkVideoEncodeAV1PictureInfoKHR::referenceNameSlotIndices必须至少有两个非负元素,其元素索引分别为 i ∈ {0,1,2,3}j ∈ {4,5,6},并且这两个元素都不能等于 cdfOnlyReferenceIndex,并且对于这两个元素的位索引 ijVkVideoEncodeAV1CapabilitiesKHR::bidirectionalCompoundReferenceNameMask 中设置(如通过 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回)。

  • VUID-vkCmdEncodeVideoKHR-referenceNameSlotIndices-10334
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 referenceNameSlotIndices 数组的每个元素必须要么为负,要么必须等于 pEncodeInfo->pReferenceSlots 的其中一个元素的 slotIndex 成员。

  • VUID-vkCmdEncodeVideoKHR-slotIndex-10335
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则 pEncodeInfo->pReferenceSlots 的每个元素的 slotIndex 成员必须等于 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 referenceNameSlotIndices 数组的其中一个元素。

  • VUID-vkCmdEncodeVideoKHR-pExtensionHeader-10336
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 VkVideoEncodeAV1PictureInfoKHR::pStdPictureInfopExtensionHeader 成员不是 NULL,则 pExtensionHeader->temporal_id 必须小于 VkVideoEncodeAV1CapabilitiesKHR::maxTemporalLayerCount(如通过 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回)。

  • VUID-vkCmdEncodeVideoKHR-pExtensionHeader-10337
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 VkVideoEncodeAV1PictureInfoKHR::pStdPictureInfopExtensionHeader 成员不是 NULL,则 pExtensionHeader->spatial_id 必须小于 VkVideoEncodeAV1CapabilitiesKHR::maxSpatialLayerCount(如通过 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话的视频配置文件返回)。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10338
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 pEncodeInfo->pSetupReferenceSlot 不是 NULL,则 pEncodeInfo->pSetupReferenceSlotpNext 链中包含的 VkVideoEncodeAV1DpbSlotInfoKHR 结构的 VkVideoEncodeAV1DpbSlotInfoKHR::pStdReferenceInfopExtensionHeader 成员以及 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 VkVideoEncodeAV1PictureInfoKHR::pStdPictureInfopExtensionHeader 成员必须都为 NULL 或都不为 NULL

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10339
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,pEncodeInfo->pSetupReferenceSlot 不是 NULL,并且 pEncodeInfo->pSetupReferenceSlotpNext 链中包含的 VkVideoEncodeAV1DpbSlotInfoKHR 结构的 VkVideoEncodeAV1DpbSlotInfoKHR::pStdReferenceInfopExtensionHeader 成员不是 NULL,则 pExtensionHeader->temporal_id 必须等于 pEncodeInfopNext 链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的 pStdPictureInfo->pExtensionHeader→temporal_id

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-10340
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 pEncodeInfo->pSetupReferenceSlot 不为 NULL,并且 VkVideoEncodeAV1DpbSlotInfoKHR 结构体的 pStdReferenceInfo 成员(该结构体包含在 pEncodeInfo->pSetupReferenceSlotpNext 链中)中的 pExtensionHeader 成员不为 NULL,那么 VkVideoEncodeAV1PictureInfoKHR 结构体(包含在 pEncodeInfopNext 链中)中的 pStdPictureInfo->pExtensionHeader→spatial_id 必须等于 pExtensionHeader->spatial_id

  • VUID-vkCmdEncodeVideoKHR-pExtensionHeader-10341
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且对于 pEncodeInfo->pReferenceSlots 的任何元素的 pNext 链中包含的任何 VkVideoEncodeAV1DpbSlotInfoKHR 结构体,其 pStdReferenceInfo 成员的 pExtensionHeader 成员不为 NULL,则 pExtensionHeader->temporal_id 必须小于 VkVideoEncodeAV1CapabilitiesKHR::maxTemporalLayerCount,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回。

  • VUID-vkCmdEncodeVideoKHR-pExtensionHeader-10342
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且对于 pEncodeInfo->pReferenceSlots 的任何元素的 pNext 链中包含的任何 VkVideoEncodeAV1DpbSlotInfoKHR 结构体,其 pStdReferenceInfo 成员的 pExtensionHeader 成员不为 NULL,则 pExtensionHeader->spatial_id 必须小于 VkVideoEncodeAV1CapabilitiesKHR::maxSpatialLayerCount,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回。

  • VUID-vkCmdEncodeVideoKHR-pTileInfo-10343
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1PictureInfoKHR 结构体(包含在 pEncodeInfopNext 链中)的 pStdPictureInfo 成员的 pTileInfo 成员不为 NULL,则 pTileInfo->TileCols 必须大于 0

  • VUID-vkCmdEncodeVideoKHR-pTileInfo-10344
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1PictureInfoKHR 结构体(包含在 pEncodeInfopNext 链中)的 pStdPictureInfo 成员的 pTileInfo 成员不为 NULL,则 pTileInfo->TileRows 必须大于 0

  • VUID-vkCmdEncodeVideoKHR-pTileInfo-10345
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1PictureInfoKHR 结构体(包含在 pEncodeInfopNext 链中)的 pStdPictureInfo 成员的 pTileInfo 成员不为 NULL,则 pTileInfo->TileCols 必须小于或等于 VkVideoEncodeAV1CapabilitiesKHR::maxTiles.width,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回。

  • VUID-vkCmdEncodeVideoKHR-pTileInfo-10346
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1PictureInfoKHR 结构体(包含在 pEncodeInfopNext 链中)的 pStdPictureInfo 成员的 pTileInfo 成员不为 NULL,则 pTileInfo->TileRows 必须小于或等于 VkVideoEncodeAV1CapabilitiesKHR::maxTiles.height,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回。

  • VUID-vkCmdEncodeVideoKHR-pTileInfo-10347
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1PictureInfoKHR 结构体(包含在 pEncodeInfopNext 链中)的 pStdPictureInfo 成员的 pTileInfo 成员不为 NULL,则 pEncodeInfo->srcPictureResource.codedExtent.width / pTileInfo->TileCols 必须介于 VkVideoEncodeAV1CapabilitiesKHR::minTileSize.widthVkVideoEncodeAV1CapabilitiesKHR::maxTileSize.width 之间(包括两者),该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回。

  • VUID-vkCmdEncodeVideoKHR-pTileInfo-10348
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,并且 VkVideoEncodeAV1PictureInfoKHR 结构体(包含在 pEncodeInfopNext 链中)的 pStdPictureInfo 成员的 pTileInfo 成员不为 NULL,则 pEncodeInfo->srcPictureResource.codedExtent.height / pTileInfo->TileRows 必须介于 VkVideoEncodeAV1CapabilitiesKHR::minTileSize.heightVkVideoEncodeAV1CapabilitiesKHR::maxTileSize.height 之间(包括两者),该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为绑定视频会话创建时使用的视频配置文件返回。

  • VUID-vkCmdEncodeVideoKHR-pStdPictureInfo-10349
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则 VkVideoEncodeAV1PictureInfoKHR 结构体(包含在 pEncodeInfopNext 链中)的 pStdPictureInfo->flags.segmentation_enabled 必须为零。

  • VUID-vkCmdEncodeVideoKHR-pStdPictureInfo-10350
    如果绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则 VkVideoEncodeAV1PictureInfoKHR 结构体(包含在 pEncodeInfopNext 链中)的 pStdPictureInfo->pSegmentation 必须NULL

有效用法(隐式)
  • VUID-vkCmdEncodeVideoKHR-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdEncodeVideoKHR-pEncodeInfo-parameter
    pEncodeInfo 必须是指向有效的 VkVideoEncodeInfoKHR 结构的有效指针。

  • VUID-vkCmdEncodeVideoKHR-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdEncodeVideoKHR-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持编码操作

  • VUID-vkCmdEncodeVideoKHR-renderpass
    此命令 必须 仅在渲染过程实例之外调用。

  • VUID-vkCmdEncodeVideoKHR-videocoding
    此命令必须仅在视频编码作用域内调用。

  • VUID-vkCmdEncodeVideoKHR-bufferlevel
    commandBuffer 必须 是一个主要的 VkCommandBuffer

主机同步
  • commandBuffer 的主机访问 必须 进行外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 必须 进行外部同步。

VkVideoEncodeInfoKHR 结构定义如下

// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeInfoKHR {
    VkStructureType                       sType;
    const void*                           pNext;
    VkVideoEncodeFlagsKHR                 flags;
    VkBuffer                              dstBuffer;
    VkDeviceSize                          dstBufferOffset;
    VkDeviceSize                          dstBufferRange;
    VkVideoPictureResourceInfoKHR         srcPictureResource;
    const VkVideoReferenceSlotInfoKHR*    pSetupReferenceSlot;
    uint32_t                              referenceSlotCount;
    const VkVideoReferenceSlotInfoKHR*    pReferenceSlots;
    uint32_t                              precedingExternallyEncodedBytes;
} VkVideoEncodeInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNext 是一个指向扩展此结构的结构的指针。

  • flags 是一个 VkVideoEncodeFlagBitsKHR 的位掩码,指示视频编码命令标志。

  • dstBuffer 是用于写入编码比特流的目标视频比特流缓冲区。

  • dstBufferOffset 是从 dstBuffer 的起始位置开始,用于写入编码比特流的起始字节偏移量。

  • dstBufferRange 是可以写入 dstBuffer 的最大比特流大小(以字节为单位),从 dstBufferOffset 开始。

  • srcPictureResource 是用作 编码输入图像 的视频图像资源。

  • pSetupReferenceSlotNULL 或指向 VkVideoReferenceSlotInfoKHR 结构的指针,该结构指定重构图像信息

  • referenceSlotCountpReferenceSlots 数组中的元素数量。

  • pReferenceSlotsNULL 或指向 VkVideoReferenceSlotInfoKHR 结构数组的指针,该数组描述了 DPB 插槽和对应的参考图像资源,用于此视频编码操作(活动参考图像的集合)。

  • precedingExternallyEncodedBytes 是应用程序外部编码到视频比特流的字节数,用于更新实现 速率控制 算法的内部状态,以说明这些外部编码字节消耗的比特率预算。

有效用法
  • VUID-VkVideoEncodeInfoKHR-dstBuffer-08236
    创建 dstBuffer必须设置了 VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR

  • VUID-VkVideoEncodeInfoKHR-dstBufferOffset-08237
    dstBufferOffset 必须小于 dstBuffer 的大小

  • VUID-VkVideoEncodeInfoKHR-dstBufferRange-08238
    dstBufferRange 必须小于或等于 dstBuffer 的大小减去 dstBufferOffset

  • VUID-VkVideoEncodeInfoKHR-pSetupReferenceSlot-08239
    如果 pSetupReferenceSlot 不是 NULL,则其 slotIndex 成员必须不是负数。

  • VUID-VkVideoEncodeInfoKHR-pSetupReferenceSlot-08240
    如果 pSetupReferenceSlot 不是 NULL,则其 pPictureResource 必须不是 NULL

  • VUID-VkVideoEncodeInfoKHR-slotIndex-08241
    pReferenceSlots 的每个元素的 slotIndex 成员必须不是负数。

  • VUID-VkVideoEncodeInfoKHR-pPictureResource-08242
    pReferenceSlots 的每个元素的 pPictureResource 成员必须不是 NULL

有效用法(隐式)

可以在 VkVideoEncodeInfoKHR::flags 中设置的位,指定视频编码标志,如下所示

// Provided by VK_KHR_video_encode_quantization_map
typedef enum VkVideoEncodeFlagBitsKHR {
  // Provided by VK_KHR_video_encode_quantization_map
    VK_VIDEO_ENCODE_WITH_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x00000001,
  // Provided by VK_KHR_video_encode_quantization_map
    VK_VIDEO_ENCODE_WITH_EMPHASIS_MAP_BIT_KHR = 0x00000002,
} VkVideoEncodeFlagBitsKHR;
// Provided by VK_KHR_video_encode_queue
typedef VkFlags VkVideoEncodeFlagsKHR;

VkVideoEncodeFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeFlagBitsKHR 的掩码。

视频编码速率控制

视频编码操作产生的编码比特流数据的大小是以下一系列约束的函数

  • 所使用的视频压缩标准定义和采用的压缩算法的功能;

  • 根据所使用的视频压缩标准定义的规则,所选视频配置文件施加的限制;

  • 实现对所选视频配置文件支持的功能施加的进一步限制;

  • 编码输入图像中的图像数据以及活动参考图像集(因为这些会影响视频编码操作采用的压缩算法的有效性);

  • 应用程序提供的编解码器特定和编解码器无关的编码参数集。

这些还固有地定义了解码器重建和处理编码比特流中图像数据所需的解码器功能集。

视频编码使用比特率作为与编码比特流数据大小相关的定量指标,该指标表示视频比特流数据可以传输或处理的速率,以每秒比特数衡量。该比特率既是编码图像的编码比特流数据大小的函数,也是视频序列使用的帧速率的函数。

视频编码操作使用码率控制算法来调整编码参数,以达到目标比特率,或者直接或间接地控制生成的视频比特流数据的比特率。这些算法通常不由所使用的视频压缩标准定义,尽管一些视频压缩标准确实为实现提供了非规范性指南。

因此,本规范不强制要求实现针对视频编码操作产生相同的编码比特流数据输出,但是,它确实定义了一组编解码器无关和编解码器特定的参数,使应用程序能够控制实现所支持的码率控制算法的行为。其中一些参数保证了某些实现行为,而另一些参数则为实现提供了应用各种码率控制启发法的指导。

应用程序需要确保它们正确配置码率控制参数,并且遵循通过为实现的码率控制算法和启发法提供指导的参数向实现做出的承诺,以便能够获得所需的码率控制行为并达到设定的比特率目标。此外,即使所使用的视频配置文件的功能在这些实现之间匹配,码率控制的行为也可能因实现而异。这可能是由于实现内部应用了不同的码率控制算法或启发法,因此即使同一组指导参数值也可能对不同实现的码率控制行为产生不同的影响。

码率控制模式

在视频会话重置为初始状态后,视频编码码率控制的默认行为和参数完全取决于实现,并且除非应用程序更改视频会话的码率控制配置,否则应用程序不能影响视频编码操作产生的编码比特流数据的比特率或质量参数,如视频编码控制部分所述。

对于每个支持的视频配置文件,实现可以公开一组码率控制模式,供应用程序在编码目标为该视频配置文件的比特流时使用。这些模式允许使用不同的码率控制算法,这些算法属于以下两个类别之一

  1. 按操作码率控制

  2. 流级码率控制

按操作码率控制的情况下,生成的视频比特流数据的比特率由应用程序为每个单独的视频编码操作指定的质量、大小或其他编码参数间接控制。

流级码率控制的情况下,除了其他编码参数外,应用程序可以直接指定目标比特率,以控制实现所使用的跨多个视频编码操作的码率控制算法的行为。

码率控制模式由以下枚举定义

// Provided by VK_KHR_video_encode_queue
typedef enum VkVideoEncodeRateControlModeFlagBitsKHR {
    VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR = 0,
    VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR = 0x00000004,
} VkVideoEncodeRateControlModeFlagBitsKHR;
  • VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR 指定使用特定于实现的码率控制。

  • VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR 指定禁用码率控制,并且应用程序将指定控制编码质量的按操作码率控制参数。在此模式下,实现将独立于先前视频编码操作的输出比特率对图片进行编码。

  • VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR 指定使用恒定比特率(CBR)码率控制模式。在此模式下,实现将尝试以恒定比特率生成编码比特流,同时符合其他码率控制参数的约束。

  • VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR 指定使用可变比特率(VBR)码率控制模式。在此模式下,实现将根据其他码率控制参数的约束以可变比特率生成编码比特流。

// Provided by VK_KHR_video_encode_queue
typedef VkFlags VkVideoEncodeRateControlModeFlagsKHR;

VkVideoEncodeRateControlModeFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeRateControlModeFlagBitsKHR 的掩码。

漏桶模型

视频编码实现使用漏桶模型进行流级码率控制。漏桶是指视频编码器和消费者(例如,网络连接)之间的接口的概念,其中视频编码器生成与编码图片相对应的编码比特流数据,并将其添加到漏桶中,同时其内容被消费者消耗。

类似地,在视频解码器的输入接口处也认为存在类似的漏桶,编码比特流数据被连续添加到其中,然后被视频解码器消耗。最好避免此漏桶溢出或下溢,因为

  • 在下溢的情况下,视频解码器将无法消耗编码比特流数据来解码图片(并且可以选择显示它们)。

  • 在溢出的情况下,漏桶将无法容纳更多的编码比特流数据,并且此类数据可能需要被丢弃,从而导致相应的编码图片丢失。

这些要求可以通过对编码器侧漏桶施加各种约束来满足,以避免其溢出或下溢,具体取决于所使用的码率控制算法和编解码器参数。但是,枚举这些约束超出了本规范的范围。

术语虚拟缓冲区通常用作指代漏桶的替代术语。

此虚拟缓冲区模型由以下参数定义

  • 期望处理编码比特流的比特率 (R)。

  • 虚拟缓冲区的大小 (B)。

  • 虚拟缓冲区的初始占用率 (F)。

在此模型中,虚拟缓冲区用于平滑编码比特流比特率随时间的波动,而不会出现缓冲区溢出或下溢,只要编码流的比特率在较长的时间内不偏离目标比特率。

这种缓冲可能会固有地带来处理延迟,因为该模型的目标是使解码器能够以变化的速率保持对编码比特流的一致处理速率。

初始或启动延迟 (D) 计算为

D = F / R

应用程序需要配置足够大小的虚拟缓冲区,以避免或最大程度地减少缓冲区溢出和下溢,同时也要保持足够小,以满足其延迟目标。

码率控制层

一些视频压缩标准和视频配置文件允许将编码图像与特定的视频编码层关联。与此类视频编码层关联的名称、标识和语义由相应的视频压缩标准定义。

类似地,可以配置流级别的码率控制以使用一个或多个码率控制层

  • 当配置单个码率控制层时,它将应用于所有编码图像,而不管该图像的视频编码层如何。在这种情况下,可用比特率预算在视频编码层之间的分配取决于实现。

  • 当配置多个码率控制层时,每个码率控制层都应用于相应的视频编码层,即仅应用于属于相应视频编码层的编码图像。

各个码率控制层使用介于零和N-1之间的层索引进行标识,其中 N 是活动码率控制层的数量。

码率控制层仅在使用流级别码率控制模式时适用。

码率控制状态

码率控制状态由实现在视频会话对象中维护,其参数使用VkVideoEncodeRateControlInfoKHR结构的实例指定。视频会话的完整码率控制状态由以下一组参数定义

如果上述列出的所有参数都匹配,则两个码率控制状态匹配。

VkVideoEncodeRateControlInfoKHR结构的定义如下

// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeRateControlInfoKHR {
    VkStructureType                                sType;
    const void*                                    pNext;
    VkVideoEncodeRateControlFlagsKHR               flags;
    VkVideoEncodeRateControlModeFlagBitsKHR        rateControlMode;
    uint32_t                                       layerCount;
    const VkVideoEncodeRateControlLayerInfoKHR*    pLayers;
    uint32_t                                       virtualBufferSizeInMs;
    uint32_t                                       initialVirtualBufferSizeInMs;
} VkVideoEncodeRateControlInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 保留供将来使用。

  • rateControlMode 是一个 VkVideoEncodeRateControlModeFlagBitsKHR 值,指定码率控制模式

  • layerCount 指定要使用的码率控制层的数量。

  • pLayers 是指向 layerCountVkVideoEncodeRateControlLayerInfoKHR结构数组的指针,每个结构指定相应码率控制层的码率控制配置。

  • virtualBufferSizeInMs 是实现码率控制算法用于漏桶模型的虚拟缓冲区的大小(以毫秒为单位),相对于通过对pLayers数组的元素的averageBitrate成员的值求和计算的流的平均比特率。

  • initialVirtualBufferSizeInMs 是实现码率控制算法用于漏桶模型的虚拟缓冲区的初始占用量(以毫秒为单位)。

如果 layerCount 为零,则忽略 virtualBufferSizeInMsinitialVirtualBufferSizeInMs 的值。

此结构可以在以下位置指定:

VkVideoCodingControlInfoKHRpNext链中包含此结构,并在VkVideoCodingControlInfoKHR::flags中包含VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR,可以更新绑定视频会话的码率控制配置。这将替换绑定视频会话的整个码率控制配置,并可能根据以下列出的相应部分中定义的编解码器特定的码率控制语义,将所有启用的码率控制层的状态重置为初始状态。

layerCount大于一时,将配置多个码率控制层,并且每个码率控制层都应用于由pLayer相应元素的索引标识的相应视频编码层。

  • 如果视频会话是使用视频编解码器操作VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR创建的,则此索引指定码率控制层应用到的视频编码层的H.264时间层ID。

  • 如果视频会话是使用视频编解码器操作VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR创建的,则此索引指定码率控制层应用到的视频编码层的H.265时间ID。

  • 如果视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,则此索引指定应用速率控制层的 AV1 时间 ID。

根据绑定视频会话创建时使用的视频配置文件VkVideoCodingControlInfoKHRpNext 链中可以包含提供编解码器特定速率控制参数的其他结构。 更多细节请参考

新的速率控制配置在设备上执行相应的 vkCmdControlVideoCodingKHR 时生效,并且只影响执行顺序中后续的视频编码操作。

有效用法
  • VUID-VkVideoEncodeRateControlInfoKHR-rateControlMode-08248
    如果 rateControlModeVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 layerCount 必须0

  • VUID-VkVideoEncodeRateControlInfoKHR-rateControlMode-08275
    如果 rateControlModeVK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR,则 layerCount 必须大于 0

  • VUID-VkVideoEncodeRateControlInfoKHR-rateControlMode-08244
    如果 rateControlMode 不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR,则它必须指定 VkVideoEncodeCapabilitiesKHR::rateControlModes 中包含的位之一,该位由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回

  • VUID-VkVideoEncodeRateControlInfoKHR-layerCount-08245
    layerCount 成员必须小于或等于 VkVideoEncodeCapabilitiesKHR::maxRateControlLayers,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回

  • VUID-VkVideoEncodeRateControlInfoKHR-pLayers-08276
    对于 pLayers 的每个元素,其 averageBitrate 成员必须介于 1VkVideoEncodeCapabilitiesKHR::maxBitrate 之间,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回

  • VUID-VkVideoEncodeRateControlInfoKHR-pLayers-08277
    对于 pLayers 的每个元素,其 maxBitrate 成员必须介于 1VkVideoEncodeCapabilitiesKHR::maxBitrate 之间,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回

  • VUID-VkVideoEncodeRateControlInfoKHR-rateControlMode-08356
    如果 rateControlModeVK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR,则对于 pLayers 的每个元素,其 averageBitrate 成员必须等于其 maxBitrate 成员

  • VUID-VkVideoEncodeRateControlInfoKHR-rateControlMode-08278
    如果 rateControlModeVK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR,则对于 pLayers 的每个元素,其 averageBitrate 成员必须小于或等于其 maxBitrate 成员

  • VUID-VkVideoEncodeRateControlInfoKHR-layerCount-08357
    如果 layerCount 不为零,则 virtualBufferSizeInMs 必须大于零

  • VUID-VkVideoEncodeRateControlInfoKHR-layerCount-08358
    如果 layerCount 不为零,则 initialVirtualBufferSizeInMs 必须小于或等于 virtualBufferSizeInMs

  • VUID-VkVideoEncodeRateControlInfoKHR-videoCodecOperation-07022
    如果所使用的视频配置文件的 videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR,则此结构所包含的 pNext 链中还包含 VkVideoEncodeH264RateControlInfoKHR 结构的实例,并且 layerCount 大于 1,则 layerCount 必须等于 VkVideoEncodeH264RateControlInfoKHR::temporalLayerCount

  • VUID-VkVideoEncodeRateControlInfoKHR-videoCodecOperation-07025
    如果所使用的视频配置文件的 videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR,则此结构所包含的 pNext 链中还包含 VkVideoEncodeH265RateControlInfoKHR 结构的实例,并且 layerCount 大于 1,则 layerCount 必须等于 VkVideoEncodeH265RateControlInfoKHR::subLayerCount

  • VUID-VkVideoEncodeRateControlInfoKHR-videoCodecOperation-10351
    如果所使用的视频配置文件的 videoCodecOperationVK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,则此结构所包含的 pNext 链中还包含 VkVideoEncodeAV1RateControlInfoKHR 结构的实例,并且 layerCount 大于 1,则 layerCount 必须等于 VkVideoEncodeAV1RateControlInfoKHR::temporalLayerCount

有效用法(隐式)
  • VUID-VkVideoEncodeRateControlInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR

  • VUID-VkVideoEncodeRateControlInfoKHR-flags-zerobitmask
    flags 必须0

  • VUID-VkVideoEncodeRateControlInfoKHR-rateControlMode-parameter
    如果 rateControlMode 不为 0,则 rateControlMode 必须是有效的 VkVideoEncodeRateControlModeFlagBitsKHR

  • VUID-VkVideoEncodeRateControlInfoKHR-pLayers-parameter
    如果 layerCount 不为 0,则 pLayers 必须是指向 layerCount 个有效 VkVideoEncodeRateControlLayerInfoKHR 结构数组的有效指针

// Provided by VK_KHR_video_encode_queue
typedef VkFlags VkVideoEncodeRateControlFlagsKHR;

VkVideoEncodeRateControlFlagsKHR 是一种用于设置掩码的位掩码类型,但目前保留供将来使用。

速率控制层状态

使用 VkVideoEncodeRateControlLayerInfoKHR 结构的实例指定各个速率控制层的配置。

VkVideoEncodeRateControlLayerInfoKHR 结构定义如下:

// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeRateControlLayerInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    uint64_t           averageBitrate;
    uint64_t           maxBitrate;
    uint32_t           frameRateNumerator;
    uint32_t           frameRateDenominator;
} VkVideoEncodeRateControlLayerInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNext 是一个指向扩展此结构的结构的指针。

  • averageBitrate 是实现速率控制算法所针对的平均比特率

  • maxBitrate 是实现速率控制算法所针对的峰值比特率

  • frameRateNumerator 是实现速率控制算法所假定的帧率的分子。

  • frameRateDenominator 是实现速率控制算法所假定的帧率的分母。

实现速率控制算法匹配请求的平均和/或峰值比特率的能力可能会受到应用程序指定的其他编解码器无关和编解码器特定的速率控制参数、输入内容以及应用程序是否符合提供给实现的速率控制指导的限制,如先前所述。

根据绑定视频会话创建时使用的视频配置文件,可以在 VkVideoEncodeRateControlLayerInfoKHRpNext 链中包含提供编解码器特定速率控制参数的其他结构。 详细信息请参见

有效用法
  • VUID-VkVideoEncodeRateControlLayerInfoKHR-frameRateNumerator-08350
    frameRateNumerator 必须大于零

  • VUID-VkVideoEncodeRateControlLayerInfoKHR-frameRateDenominator-08351
    frameRateDenominator 必须大于零

有效用法(隐式)

视频编码量化映射

量化映射是 VkImage 对象,用于视频编码操作中,以控制编码图片中相对量化参数值。量化映射中的每个纹素控制用于编码编码输入图片中相应矩形纹素块的相对量化参数值。

每个量化映射纹素覆盖的矩形纹素块的大小称为量化映射纹素大小

因此,当编码编码范围为 (width,height) 的图片时,用作量化映射的图像子资源的范围必须至少为 (⌈width / texelSize.width⌉, ⌈height / texelSize.height⌉),其中 texelSize 是使用的量化映射纹素大小。

特别是,位置 (x,y) 处的量化映射纹素包含用于编码编码输入图片中起始于纹素位置 (x × texelSize.width, y × texelSize.height)texelSize 大小的矩形块的相对量化参数值。

量化映射纹素大小并不总是与编码期间使用的编解码器特定的编码块的大小匹配。此外,某些视频压缩标准允许编解码器特定的编码块的大小在编码图片中变化。为了适应量化参数存储在量化映射中的粒度和将其应用于编码期间的编解码器特定编码块的粒度之间的这种不匹配,将应用以下映射规则来定义与编码输入图片中纹素位置 (x,y) 处的尺寸为 (width,height) 的给定编解码器特定编码块相对应的量化映射纹素值:

  • 如果编解码器特定编码块的大小与使用的量化映射纹素大小匹配,则与编解码器特定编码块对应的获取的量化映射值是纹素位置 (x / texelSize.width, y / texelSize.height) 处的纹素值。

  • 如果编解码器特定的编码块的大小小于使用的量化映射纹素大小,则与编解码器特定的编码块相对应的获取的量化映射值是纹素位置 (⌊x / texelSize.width⌋, ⌊y / texelSize.height⌋) 处的纹素值。

  • 如果编解码器特定的编码块的大小大于使用的量化映射纹素大小,则与编解码器特定的编码块对应的获取的量化映射值可以是起始于纹素位置 (x / texelSize.width,y / texelSize.height) 且大小为 (⌈width / texelSize.width⌉, ⌈height / texelSize.height⌉) 的子区域中量化映射纹素值的线性插值的任何值。

存储在量化映射中的实际控制参数取决于其类型。本规范支持以下类型的量化映射:

量化增量映射

量化增量映射包含直接影响用于编码编码输入图片的相应块的编解码器特定量化参数值的值。

量化增量映射可以与任何速率控制模式结合使用,包括VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR

由于它们的编解码器特定性质,它们将在支持它们的视频编码操作的相应编解码器特定部分中进行更详细的描述。 特别是:

本规范不支持任何其他视频编码操作的量化增量映射。

强调映射

强调映射包含的值间接影响用于编码编码输入图像的相应块的编解码器特定的量化参数值。

强调映射的纹素包含向编码器实现提供关于编码图像区域相对重要性(强调)的输入值,以便使实现的码率控制算法能够为具有较高强调值的编码图像区域分配比具有较低强调值的区域更多的比特率预算。

只有当为视频会话配置的当前码率控制模式不是VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR时,才能使用强调映射。

由于这些强调值仅控制所使用的码率控制算法的特定于实现的其它行为,因此除了描述量化行为的相应编解码器特定章节中概述的限制之外,本规范不对实现施加其他限制。

本规范不支持任何其他视频编码操作的强调映射。

强调映射始终具有单通道无符号归一化整数格式,并且当视频编码配置文件支持VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR时,实现必须支持 VK_FORMAT_R8_UNORM 格式的强调映射,如 VkVideoFormatPropertiesKHR::format 中报告的那样。

量化映射能力

当使用pVideoProfile->videoCodecOperation指定编码操作调用vkGetPhysicalDeviceVideoCapabilitiesKHR时,VkVideoEncodeQuantizationMapCapabilitiesKHR结构可以包含在VkVideoCapabilitiesKHR结构的pNext链中,以检索特定于视频编码量化映射的能力。

VkVideoEncodeQuantizationMapCapabilitiesKHR 结构定义如下:

// Provided by VK_KHR_video_encode_quantization_map
typedef struct VkVideoEncodeQuantizationMapCapabilitiesKHR {
    VkStructureType    sType;
    void*              pNext;
    VkExtent2D         maxQuantizationMapExtent;
} VkVideoEncodeQuantizationMapCapabilitiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxQuantizationMapExtent 指示量化映射支持的最大宽度和高度。

有效用法(隐式)
  • VUID-VkVideoEncodeQuantizationMapCapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR

当调用vkGetPhysicalDeviceVideoCapabilitiesKHR以查询H.264编码配置文件的功能时,VkVideoEncodeH264QuantizationMapCapabilitiesKHR结构可以包含在VkVideoCapabilitiesKHR结构的pNext链中,以检索特定于 H.264 编码配置文件的其他视频编码量化映射能力。

VkVideoEncodeH264QuantizationMapCapabilitiesKHR 结构定义如下:

// Provided by VK_KHR_video_encode_h264 with VK_KHR_video_encode_quantization_map
typedef struct VkVideoEncodeH264QuantizationMapCapabilitiesKHR {
    VkStructureType    sType;
    void*              pNext;
    int32_t            minQpDelta;
    int32_t            maxQpDelta;
} VkVideoEncodeH264QuantizationMapCapabilitiesKHR;
有效用法(隐式)
  • VUID-VkVideoEncodeH264QuantizationMapCapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR

当调用vkGetPhysicalDeviceVideoCapabilitiesKHR以查询H.265 编码配置文件的功能时,VkVideoEncodeH265QuantizationMapCapabilitiesKHR结构可以包含在VkVideoCapabilitiesKHR结构的pNext链中,以检索特定于 H.265 编码配置文件的其他视频编码量化映射能力。

VkVideoEncodeH265QuantizationMapCapabilitiesKHR 结构定义如下:

// Provided by VK_KHR_video_encode_h265 with VK_KHR_video_encode_quantization_map
typedef struct VkVideoEncodeH265QuantizationMapCapabilitiesKHR {
    VkStructureType    sType;
    void*              pNext;
    int32_t            minQpDelta;
    int32_t            maxQpDelta;
} VkVideoEncodeH265QuantizationMapCapabilitiesKHR;
有效用法(隐式)
  • VUID-VkVideoEncodeH265QuantizationMapCapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR

当调用vkGetPhysicalDeviceVideoCapabilitiesKHR以查询AV1 编码配置文件的功能时,VkVideoEncodeAV1QuantizationMapCapabilitiesKHR结构可以包含在VkVideoCapabilitiesKHR结构的pNext链中,以检索特定于 AV1 编码配置文件的其他视频编码量化映射能力。

VkVideoEncodeAV1QuantizationMapCapabilitiesKHR 结构定义如下:

// Provided by VK_KHR_video_encode_av1 with VK_KHR_video_encode_quantization_map
typedef struct VkVideoEncodeAV1QuantizationMapCapabilitiesKHR {
    VkStructureType    sType;
    void*              pNext;
    int32_t            minQIndexDelta;
    int32_t            maxQIndexDelta;
} VkVideoEncodeAV1QuantizationMapCapabilitiesKHR;
有效用法(隐式)
  • VUID-VkVideoEncodeAV1QuantizationMapCapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUANTIZATION_MAP_CAPABILITIES_KHR

量化映射格式属性

当调用 vkGetPhysicalDeviceVideoFormatPropertiesKHR 时,VkVideoFormatQuantizationMapPropertiesKHR 结构可以包含在 VkVideoFormatPropertiesKHR 结构的 pNext 链中,以检索特定于视频编码量化映射的视频格式属性。

VkVideoFormatQuantizationMapPropertiesKHR 结构定义如下:

// Provided by VK_KHR_video_encode_quantization_map
typedef struct VkVideoFormatQuantizationMapPropertiesKHR {
    VkStructureType    sType;
    void*              pNext;
    VkExtent2D         quantizationMapTexelSize;
} VkVideoFormatQuantizationMapPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • quantizationMapTexelSize 指示视频格式的量化映射纹素大小,即每个量化映射纹素对应的像素数。

只有当此视频格式的 VkVideoFormatPropertiesKHR::imageUsageFlags 中返回的允许图像使用标志包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR 时,才定义此结构中返回的值。

对于特定的视频格式,实现可以支持多个量化映射纹素大小,这通过 vkGetPhysicalDeviceVideoFormatPropertiesKHR 返回具有不同 quantizationMapTexelSize 值的多个条目来指示。

有效用法(隐式)
  • VUID-VkVideoFormatQuantizationMapPropertiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR

当调用 vkGetPhysicalDeviceVideoFormatPropertiesKHR 时,VkVideoFormatH265QuantizationMapPropertiesKHR 结构可以包含在 VkVideoFormatPropertiesKHR 结构的 pNext 链中,以检索特定于与 H.265 编码配置文件一起使用的视频编码量化映射的视频格式属性。

VkVideoFormatH265QuantizationMapPropertiesKHR 结构定义如下:

// Provided by VK_KHR_video_encode_h265 with VK_KHR_video_encode_quantization_map
typedef struct VkVideoFormatH265QuantizationMapPropertiesKHR {
    VkStructureType                     sType;
    void*                               pNext;
    VkVideoEncodeH265CtbSizeFlagsKHR    compatibleCtbSizes;
} VkVideoFormatH265QuantizationMapPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • compatibleCtbSizes 是一个 VkVideoEncodeH265CtbSizeFlagBitsKHR 的位掩码,指示使用此视频格式的量化映射兼容的 CTB 大小。

    compatibleCtbSizes 的值不会限制特定量化映射格式的使用,但会限制实现无法编码具有 compatibleCtbSizes 中未包含但使用的视频配置文件(如 VkVideoEncodeH265CapabilitiesKHR::ctbSizes 所指示)支持的其他 CTB 大小的图片。特别是,使用较小的量化映射纹素大小可能会阻止实现使用较大的 CTB 大小进行编码,这可能会对编码器的效率产生负面影响。

只有当此视频格式的 VkVideoFormatPropertiesKHR::imageUsageFlags 中返回的允许图像使用标志包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR 时,才定义此结构中返回的值。

有效用法(隐式)
  • VUID-VkVideoFormatH265QuantizationMapPropertiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR

当调用 vkGetPhysicalDeviceVideoFormatPropertiesKHR 时,可以将 VkVideoFormatAV1QuantizationMapPropertiesKHR 结构体包含在 VkVideoFormatPropertiesKHR 结构的 pNext 链中,以检索与 AV1 编码配置文件一起使用的视频编码量化映射的特定视频格式属性。

VkVideoFormatAV1QuantizationMapPropertiesKHR 结构体的定义如下:

// Provided by VK_KHR_video_encode_av1 with VK_KHR_video_encode_quantization_map
typedef struct VkVideoFormatAV1QuantizationMapPropertiesKHR {
    VkStructureType                           sType;
    void*                                     pNext;
    VkVideoEncodeAV1SuperblockSizeFlagsKHR    compatibleSuperblockSizes;
} VkVideoFormatAV1QuantizationMapPropertiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • compatibleSuperblockSizes 是一个 VkVideoEncodeAV1SuperblockSizeFlagBitsKHR 的位掩码,指示使用此视频格式的量化映射兼容的 AV1 超级块大小。

    compatibleSuperblockSizes 的值不限制特定量化映射格式的使用,但限制了实现无法使用未包含在 compatibleSuperblockSizes 中但受所使用的视频配置文件支持的超级块大小来编码图像,如 VkVideoEncodeAV1CapabilitiesKHR::superblockSizes 所指示。特别是,使用较小的 量化映射纹素大小 可能会阻止实现使用较大的超级块大小进行编码,这可能会对编码器的效率产生负面影响。

只有当此视频格式的 VkVideoFormatPropertiesKHR::imageUsageFlags 中返回的允许图像使用标志包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR 时,才定义此结构中返回的值。

有效用法(隐式)
  • VUID-VkVideoFormatAV1QuantizationMapPropertiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR

使用量化映射进行编码

VkVideoEncodeQuantizationMapInfoKHR 结构体 可以 包含在传递给 vkCmdEncodeVideoKHR 命令的 VkVideoEncodeInfoKHR 结构的 pNext 链中,以指定发出的视频编码操作使用的量化映射。

VkVideoEncodeQuantizationMapInfoKHR 结构体的定义如下:

// Provided by VK_KHR_video_encode_quantization_map
typedef struct VkVideoEncodeQuantizationMapInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkImageView        quantizationMap;
    VkExtent2D         quantizationMapExtent;
} VkVideoEncodeQuantizationMapInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • quantizationMap 指定要用作量化映射的图像视图。

  • quantizationMapExtent 指定要用作量化映射的 quantizationMap 的图像子区域的范围,从偏移量 (0,0) 开始。

有效用法
  • VUID-VkVideoEncodeQuantizationMapInfoKHR-quantizationMapExtent-10352
    quantizationMapExtent.width 必须 小于或等于 quantizationMap 的宽度

  • VUID-VkVideoEncodeQuantizationMapInfoKHR-quantizationMapExtent-10353
    quantizationMapExtent.height 必须 小于或等于 quantizationMap 的高度

有效用法(隐式)
  • VUID-VkVideoEncodeQuantizationMapInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_INFO_KHR

  • VUID-VkVideoEncodeQuantizationMapInfoKHR-quantizationMap-parameter
    如果 quantizationMap 不是 VK_NULL_HANDLE,则 quantizationMap 必须 是有效的 VkImageView 句柄

H.264 编码操作

使用 H.264 编码配置文件 的视频编码操作 可以 用于编码符合 ITU-T H.264 规范 的基本视频流序列。

有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言

此过程按照 视频编码操作步骤 执行,并根据 ITU-T H.264 规范 第 8 节中定义的编解码器特定语义执行,如下所示:

如果参数符合 ITU-T H.264 规范 的相应章节中定义的语法和语义要求(如上所述),并且与 活动参考图像 相关联的 DPB 插槽 全部指向 有效的图像参考,则视频编码操作将成功完成。否则,视频编码操作 可能不成功地 完成。

H.264 编码参数覆盖

实现 可以 覆盖,除非另有说明,以下 Video Std 结构中指定的任何 H.264 编码参数

  • StdVideoH264SequenceParameterSet

  • StdVideoH264PictureParameterSet

  • StdVideoEncodeH264PictureInfo

  • StdVideoEncodeH264SliceHeader

  • StdVideoEncodeH264ReferenceInfo

所有此类 H.264 编码参数覆盖 必须 满足 视频编码参数覆盖 部分中定义的条件。

此外,实现 必须 不覆盖以下任何 H.264 编码参数

  • StdVideoEncodeH264PictureInfo::primary_pic_type

  • StdVideoEncodeH264SliceHeader::slice_type

如果 H.264 编码参数存储在 视频会话参数 对象中,应用程序需要使用 vkGetEncodedVideoSessionParametersKHR 命令来确定是否发生了任何实现覆盖。如果查询表明已应用实现覆盖,则应用程序需要检索并使用比特流中编码的 H.264 参数集,以便能够使用存储在视频会话参数对象中的 H.264 编码参数生成符合标准的 H.264 视频比特流。

如果任何 H.264 编码参数存储在视频编码操作生成的编码比特流中,如果实现支持 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR 视频编码反馈查询 标志,则应用程序 可以 使用此类查询来检索有关是否已对这些 H.264 编码参数应用任何实现覆盖的反馈。

H.264 编码比特流数据访问

每个视频编码操作根据 ITU-T H.264 规范 的第 7.3.3 节和 7.3.4 节中定义的格式(分别根据第 7.4.3 节和 7.4.4 节中定义的语义),写入一个或多个由编码图像的片头和数据组成的 VCL NAL 单元。写入的 VCL NAL 单元的数量由 VkVideoEncodeH264PictureInfoKHR::naluSliceEntryCount 指定。

此外,如果 VkVideoEncodeH264PictureInfoKHR::generatePrefixNalu 对于视频编码操作为 VK_TRUE,则在每个 VCL NAL 单元之前,会根据 ITU-T H.264 规范的第 7.3.2.12 节中定义的格式,以及第 7.4.2.12 节中定义的语义,写入一个额外的 prefix NAL 单元,该 VCL NAL 单元对应于各个切片。

H.264 编码图像数据访问

视频图像资源中的图像数据访问发生在由 VkVideoCapabilitiesKHR::pictureAccessGranularity 指示的粒度上,该粒度由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的 视频配置文件 返回。因此,使用 H.264 编码配置文件的视频编码操作访问的 编码输入图像参考图像重建图像 的完整图像子区域被定义为坐标范围内的纹素集合

([0,endX), [0,endY))

其中

  • endX 等于codedExtent.width向上舍入到 pictureAccessGranularity.width 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的宽度;

  • endY 等于codedExtent.height向上舍入到 pictureAccessGranularity.height 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的高度;

其中 codedExtent 是对应于图像的 VkVideoPictureResourceInfoKHR 结构的成员。

在使用 H.264 编码配置文件的视频编码操作中,在坐标 (x,y) 处访问图像时,如 ITU-T H.264 规范所定义,是对相应的 VkVideoPictureResourceInfoKHR 结构在纹素坐标 (x,y)引用的图像子资源的访问。

实现可以选择不访问视频编码操作可用的某些或所有 参考图像 内的纹素(例如,由于 视频编码参数覆盖限制了有效使用的参考图像集,或者如果编码算法选择不使用参考图像数据的某些子区域进行样本预测)。

H.264 帧、图像和切片

H.264 图像被划分为切片,如 ITU-T H.264 规范的第 6.3 节所定义。

出于本规范的目的,组成图像的 H.264 切片被称为图像的图像分区

使用 H.264 编码配置文件的视频编码操作可以编码不同类型的切片,如 ITU-T H.264 规范的第 7.4.3 节所定义,通过在 H.264 切片头参数中,从视频标准枚举类型 StdVideoH264SliceType 中指定 StdVideoEncodeH264SliceHeader::slice_type 中相应的枚举常量值。

  • STD_VIDEO_H264_SLICE_TYPE_P 表示该切片是 ITU-T H.264 规范第 3.109 节中定义的P 切片

  • STD_VIDEO_H264_SLICE_TYPE_B 表示该切片是 ITU-T H.264 规范第 3.9 节中定义的B 切片

  • STD_VIDEO_H264_SLICE_TYPE_I 表示该切片是 ITU-T H.264 规范第 3.66 节中定义的I 切片

由这些切片构成的图像可以是不同的类型,如 ITU-T H.264 规范的第 7.4.2.4 节所定义。使用 H.264 编码配置文件的视频编码操作可以通过在 H.264 图像信息中,从视频标准枚举类型 StdVideoH264PictureType 中指定 StdVideoEncodeH264PictureInfo::primary_pic_type 中相应的枚举常量值,来编码特定类型的图像。

  • STD_VIDEO_H264_PICTURE_TYPE_P 表示该图像是P 图像。由 P 图像组成的帧也称为 P 帧

  • STD_VIDEO_H264_PICTURE_TYPE_B 表示该图像是B 图像。由 B 图像组成的帧也称为 B 帧

  • STD_VIDEO_H264_PICTURE_TYPE_I 表示该图像是I 图像。由 I 图像组成的帧也称为 I 帧

  • STD_VIDEO_H264_PICTURE_TYPE_IDR 表示该图像是一种特殊的 I 图像,称为 IDR 图像,如 ITU-T H.264 规范的第 3.69 节所定义。由 IDR 图像组成的帧也称为 IDR 帧

H.264 编码块

H.264 编码支持一种称为宏块的编码块类型,如 ITU-T H.264 规范的第 3.84 节所定义。

H.264 编码配置文件

支持 H.264 视频编码操作的视频配置文件通过将 VkVideoProfileInfoKHR::videoCodecOperation 设置为 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 并在 VkVideoProfileInfoKHR::pNext 链中添加 VkVideoEncodeH264ProfileInfoKHR 结构来指定。

VkVideoEncodeH264ProfileInfoKHR 结构定义如下

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264ProfileInfoKHR {
    VkStructureType           sType;
    const void*               pNext;
    StdVideoH264ProfileIdc    stdProfileIdc;
} VkVideoEncodeH264ProfileInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdProfileIdc 是一个 StdVideoH264ProfileIdc 值,指定 H.264 编解码器配置文件 IDC,如ITU-T H.264 规范的 A.2 节定义。

有效用法(隐式)
  • VUID-VkVideoEncodeH264ProfileInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR

H.264 编码能力

当调用 vkGetPhysicalDeviceVideoCapabilitiesKHR 查询 H.264 编码配置文件的功能时,VkVideoCapabilitiesKHR::pNext必须包含一个 VkVideoEncodeH264CapabilitiesKHR 结构,该结构将填充特定于配置文件的功能。

VkVideoEncodeH264CapabilitiesKHR 结构定义如下

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264CapabilitiesKHR {
    VkStructureType                        sType;
    void*                                  pNext;
    VkVideoEncodeH264CapabilityFlagsKHR    flags;
    StdVideoH264LevelIdc                   maxLevelIdc;
    uint32_t                               maxSliceCount;
    uint32_t                               maxPPictureL0ReferenceCount;
    uint32_t                               maxBPictureL0ReferenceCount;
    uint32_t                               maxL1ReferenceCount;
    uint32_t                               maxTemporalLayerCount;
    VkBool32                               expectDyadicTemporalLayerPattern;
    int32_t                                minQp;
    int32_t                                maxQp;
    VkBool32                               prefersGopRemainingFrames;
    VkBool32                               requiresGopRemainingFrames;
    VkVideoEncodeH264StdFlagsKHR           stdSyntaxFlags;
} VkVideoEncodeH264CapabilitiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkVideoEncodeH264CapabilityFlagBitsKHR 的位掩码,指示支持的 H.264 编码能力。

  • maxLevelIdc 是一个 StdVideoH264LevelIdc 值,指示配置文件支持的最大 H.264 级别,其中枚举常量 STD_VIDEO_H264_LEVEL_IDC_<major>_<minor> 表示 ITU-T H.264 规范的 A.3 节中定义的 H.264 级别 <major>.<minor>

  • maxSliceCount 指示单个图像可以编码的最大切片数。根据其他功能和编解码器特定的规则,单个图像可以编码的切片数可能还存在其他限制。

  • maxPPictureL0ReferenceCount 指示实现支持的 P 图像参考列表 L0 中的最大参考图像数。

    由于实现可能 覆盖参考列表,maxPPictureL0ReferenceCount 不限制应用程序可以为 P 图像在 L0 参考列表中指定元素的数量。但是,如果 maxPPictureL0ReferenceCount 为零,则不允许使用 P 图像。

  • maxBPictureL0ReferenceCount 指示实现支持的 B 图像参考列表 L0 中的最大参考图像数。

  • maxL1ReferenceCount 指示如果支持 B 图像的编码,则实现支持的参考列表 L1 中的最大参考图像数。

    由于实现可能 覆盖参考列表,maxBPictureL0ReferenceCountmaxL1ReferenceCount 不限制应用程序可以为 B 图像在 L0 和 L1 参考列表中指定元素的数量。但是,如果 maxBPictureL0ReferenceCountmaxL1ReferenceCount 均为零,则不允许使用 B 图像。

  • maxTemporalLayerCount 指示实现支持的最大 H.264 时间层数。

  • expectDyadicTemporalLayerPattern 指示当编码多个时间层时,实现的速率控制算法期望应用程序使用双时间层模式

  • minQp 指示支持的最小 QP 值。

  • maxQp 指示支持的最大 QP 值。

  • prefersGopRemainingFrames 表示当开始一个视频编码范围时,该实现的速率控制算法倾向于应用程序指定当前图像组中每种类型剩余的帧数。

  • requiresGopRemainingFrames 表示当开始一个视频编码范围时,该实现的速率控制算法要求应用程序指定当前图像组中每种类型剩余的帧数。

  • stdSyntaxFlags 是一个VkVideoEncodeH264StdFlagBitsKHR的位掩码,指示与 H.264 语法元素相关的能力。

有效用法(隐式)
  • VUID-VkVideoEncodeH264CapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR

VkVideoEncodeH264CapabilitiesKHR::flags可以设置的位,指示支持的 H.264 编码能力,包括:

// Provided by VK_KHR_video_encode_h264
typedef enum VkVideoEncodeH264CapabilityFlagBitsKHR {
    VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_KHR = 0x00000008,
    VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR = 0x00000010,
    VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR = 0x00000020,
    VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR = 0x00000040,
    VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR = 0x00000080,
    VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR = 0x00000100,
  // Provided by VK_KHR_video_encode_h264 with VK_KHR_video_encode_quantization_map
    VK_VIDEO_ENCODE_H264_CAPABILITY_MB_QP_DIFF_WRAPAROUND_BIT_KHR = 0x00000200,
} VkVideoEncodeH264CapabilityFlagBitsKHR;
  • VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR 指定如果激活的 SPS中,StdVideoH264SpsVuiFlags的任何成员nal_hrd_parameters_present_flagvcl_hrd_parameters_present_flag被设置为1,该实现可能能够生成符合 HRD 标准的码流。

  • VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR 指定如果在编码P 帧B 帧时,激活的 PPSStdVideoH264PpsFlags::weighted_pred_flag被设置为1StdVideoH264PictureParameterSet::weighted_bipred_idc被设置为STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_EXPLICIT,则该实现能够内部决定pred_weight_table的语法,如ITU-T H.264 规范的第 7.4.3.2 节所定义,并且应用程序不是必须H.264 切片头参数中提供权重表。

  • VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR 指定具有多个切片的帧中的每个切片可以从宏块行的任意偏移量开始或结束。如果不支持,则帧中的所有切片必须从宏块行的开头开始(因此每个切片必须在宏块行的末尾结束)。

  • VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_KHR 指定当使用多个切片编码帧时,该实现允许使用在H.264 切片头参数中指定的不同StdVideoEncodeH264SliceHeader::slice_type来编码每个切片。如果不支持,则帧的所有切片必须使用与帧的图像类型相对应的相同slice_type进行编码。

  • VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR 指定支持使用B 帧作为 L0 参考,如H.264 图像信息StdVideoEncodeH264ReferenceListsInfo::RefPicList0所指定。

  • VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR 指定支持使用B 帧作为 L1 参考,如H.264 图像信息StdVideoEncodeH264ReferenceListsInfo::RefPicList1所指定。

  • VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR 指定支持在VkVideoEncodeH264QpKHR的成员中指定不同的 QP 值。

  • VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR 指定支持为每个切片指定不同的恒定 QP 值。

  • VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR 指定支持通过将VkVideoEncodeH264PictureInfoKHR::generatePrefixNalu设置为VK_TRUE来生成前缀 NAL 单元。

  • VK_VIDEO_ENCODE_H264_CAPABILITY_MB_QP_DIFF_WRAPAROUND_BIT_KHR 指示支持在计算后续编码的宏块的 QP 值期间进行环绕,如ITU-T H.264 规范的公式 7-37 中所定义。如果不支持,ITU-T H.264 规范的公式 7-37 实际上简化为以下公式:

    QPY = QPY,PREV + mb_qp_delta

    这样做的效果是将后续宏块之间的最大 QP 差限制在[-(26 + QpBdOffsetY / 2), 25 + QpBdOffsetY / 2]范围内。

// Provided by VK_KHR_video_encode_h264
typedef VkFlags VkVideoEncodeH264CapabilityFlagsKHR;

VkVideoEncodeH264CapabilityFlagsKHR 是一个位掩码类型,用于设置零个或多个VkVideoEncodeH264CapabilityFlagBitsKHR的掩码。

VkVideoEncodeH264CapabilitiesKHR::stdSyntaxFlags可以设置的位,指示与 H.264 语法元素相关的能力,包括:

// Provided by VK_KHR_video_encode_h264
typedef enum VkVideoEncodeH264StdFlagBitsKHR {
    VK_VIDEO_ENCODE_H264_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_H264_STD_QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG_SET_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_H264_STD_SCALING_MATRIX_PRESENT_FLAG_SET_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_H264_STD_CHROMA_QP_INDEX_OFFSET_BIT_KHR = 0x00000008,
    VK_VIDEO_ENCODE_H264_STD_SECOND_CHROMA_QP_INDEX_OFFSET_BIT_KHR = 0x00000010,
    VK_VIDEO_ENCODE_H264_STD_PIC_INIT_QP_MINUS26_BIT_KHR = 0x00000020,
    VK_VIDEO_ENCODE_H264_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR = 0x00000040,
    VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_EXPLICIT_BIT_KHR = 0x00000080,
    VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_IMPLICIT_BIT_KHR = 0x00000100,
    VK_VIDEO_ENCODE_H264_STD_TRANSFORM_8X8_MODE_FLAG_SET_BIT_KHR = 0x00000200,
    VK_VIDEO_ENCODE_H264_STD_DIRECT_SPATIAL_MV_PRED_FLAG_UNSET_BIT_KHR = 0x00000400,
    VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_UNSET_BIT_KHR = 0x00000800,
    VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_SET_BIT_KHR = 0x00001000,
    VK_VIDEO_ENCODE_H264_STD_DIRECT_8X8_INFERENCE_FLAG_UNSET_BIT_KHR = 0x00002000,
    VK_VIDEO_ENCODE_H264_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR = 0x00004000,
    VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_DISABLED_BIT_KHR = 0x00008000,
    VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_ENABLED_BIT_KHR = 0x00010000,
    VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_PARTIAL_BIT_KHR = 0x00020000,
    VK_VIDEO_ENCODE_H264_STD_SLICE_QP_DELTA_BIT_KHR = 0x00080000,
    VK_VIDEO_ENCODE_H264_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR = 0x00100000,
} VkVideoEncodeH264StdFlagBitsKHR;
  • VK_VIDEO_ENCODE_H264_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR 指定当SPS中的StdVideoH264SpsFlags::separate_colour_plane_flag的值为1时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG_SET_BIT_KHR 指定当SPS中的StdVideoH264SpsFlags::qpprime_y_zero_transform_bypass_flag的值为1时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_SCALING_MATRIX_PRESENT_FLAG_SET_BIT_KHR 指定当SPS中的StdVideoH264SpsFlags::seq_scaling_matrix_present_flagPPS中的StdVideoH264PpsFlags::pic_scaling_matrix_present_flag的值为1时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_CHROMA_QP_INDEX_OFFSET_BIT_KHR 指定当PPS中的StdVideoH264PictureParameterSet::chroma_qp_index_offset的值非零时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_SECOND_CHROMA_QP_INDEX_OFFSET_BIT_KHR 指定当PPS中的StdVideoH264PictureParameterSet::second_chroma_qp_index_offset的值非零时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_PIC_INIT_QP_MINUS26_BIT_KHR 指定当PPS中的StdVideoH264PictureParameterSet::pic_init_qp_minus26的值非零时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR 指定当PPS中的StdVideoH264PpsFlags::weighted_pred_flag的值为1时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_EXPLICIT_BIT_KHR 指定当PPS中的StdVideoH264PictureParameterSet::weighted_bipred_idc的值为STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_EXPLICIT时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_IMPLICIT_BIT_KHR 指定当PPS中的StdVideoH264PictureParameterSet::weighted_bipred_idc的值为STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_IMPLICIT时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_TRANSFORM_8X8_MODE_FLAG_SET_BIT_KHR 指定当PPS中的StdVideoH264PpsFlags::transform_8x8_mode_flag的值为1时,该实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_DIRECT_SPATIAL_MV_PRED_FLAG_UNSET_BIT_KHR 指定实现是否支持在 H.264 片头参数 中,当 StdVideoEncodeH264SliceHeaderFlags::direct_spatial_mv_pred_flag 的值为 0 时,使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_UNSET_BIT_KHR 指定实现是否支持 ITU-T H.264 规范 第 9.2 节中定义的 CAVLC 熵编码,并因此支持在 PPS 中,当 StdVideoH264PpsFlags::entropy_coding_mode_flag 的值为 0 时,使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_SET_BIT_KHR 指定实现是否支持 ITU-T H.264 规范 第 9.3 节中定义的 CABAC 熵编码,并因此支持在 PPS 中,当 StdVideoH264PpsFlags::entropy_coding_mode_flag 的值为 1 时,使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_DIRECT_8X8_INFERENCE_FLAG_UNSET_BIT_KHR 指定实现是否支持在 SPS 中,当 StdVideoH264SpsFlags::direct_8x8_inference_flag 的值为 0 时,使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR 指定实现是否支持在 PPS 中,当 StdVideoH264PpsFlags::constrained_intra_pred_flag 的值为 1 时,使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_DISABLED_BIT_KHR 指定实现是否支持在 H.264 片头参数 中,当 StdVideoEncodeH264SliceHeader::disable_deblocking_filter_idc 的值为 STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_DISABLED 时,使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_ENABLED_BIT_KHR 指定实现是否支持在 H.264 片头参数 中,当 StdVideoEncodeH264SliceHeader::disable_deblocking_filter_idc 的值为 STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_ENABLED 时,使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_PARTIAL_BIT_KHR 指定实现是否支持在 H.264 片头参数 中,当 StdVideoEncodeH264SliceHeader::disable_deblocking_filter_idc 的值为 STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_PARTIAL 时,使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_SLICE_QP_DELTA_BIT_KHR 指定实现是否支持在 H.264 片头参数 中,当 StdVideoEncodeH264SliceHeader::slice_qp_delta 的值在编码帧的各个切片中都相同时,使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H264_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR 指定实现是否支持在 H.264 片头参数 中,当 StdVideoEncodeH264SliceHeader::slice_qp_delta 的值在编码帧的各个切片中不同时,使用应用程序提供的值。

这些能力标志向应用程序提供有关实现支持的特定 H.264 语法元素值的信息,而无需覆盖它们,并且不会以其他方式限制应用程序可以为任何提及的 H.264 语法元素指定的值。

// Provided by VK_KHR_video_encode_h264
typedef VkFlags VkVideoEncodeH264StdFlagsKHR;

VkVideoEncodeH264StdFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeH264StdFlagBitsKHR 的掩码。

H.264 编码质量级别属性

当使用 pVideoProfile->videoCodecOperation 指定为 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 调用 vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR 时,VkVideoEncodeH264QualityLevelPropertiesKHR 结构必须包含在 VkVideoEncodeQualityLevelPropertiesKHR 结构的 pNext 链中,以检索特定于 H.264 编码的其他视频编码质量级别属性。

VkVideoEncodeH264QualityLevelPropertiesKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264QualityLevelPropertiesKHR {
    VkStructureType                         sType;
    void*                                   pNext;
    VkVideoEncodeH264RateControlFlagsKHR    preferredRateControlFlags;
    uint32_t                                preferredGopFrameCount;
    uint32_t                                preferredIdrPeriod;
    uint32_t                                preferredConsecutiveBFrameCount;
    uint32_t                                preferredTemporalLayerCount;
    VkVideoEncodeH264QpKHR                  preferredConstantQp;
    uint32_t                                preferredMaxL0ReferenceCount;
    uint32_t                                preferredMaxL1ReferenceCount;
    VkBool32                                preferredStdEntropyCodingModeFlag;
} VkVideoEncodeH264QualityLevelPropertiesKHR;
有效用法(隐式)
  • VUID-VkVideoEncodeH264QualityLevelPropertiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUALITY_LEVEL_PROPERTIES_KHR

H.264 编码会话

当使用 H.264 编码配置文件创建视频会话时,可以通过在 VkVideoSessionCreateInfoKHRpNext 链中包含 VkVideoEncodeH264SessionCreateInfoKHR 结构的实例来指定其他参数。

VkVideoEncodeH264SessionCreateInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264SessionCreateInfoKHR {
    VkStructureType         sType;
    const void*             pNext;
    VkBool32                useMaxLevelIdc;
    StdVideoH264LevelIdc    maxLevelIdc;
} VkVideoEncodeH264SessionCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • useMaxLevelIdc 指示实现是否应使用 maxLevelIdc 的值。当值为 VK_FALSE 时,实现会忽略 maxLevelIdc 的值,并使用 VkVideoEncodeH264CapabilitiesKHR::maxLevelIdc 的值,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为视频配置文件所报告的那样。

  • maxLevelIdc 是一个 StdVideoH264LevelIdc 值,指定由创建的视频会话生成的视频码流的 H.264 级别的上限,其中枚举常量 STD_VIDEO_H264_LEVEL_IDC_<major>_<minor> 将 H.264 级别标识为 ITU-T H.264 规范 的 A.3 节中定义的 <major>.<minor>

有效用法(隐式)
  • VUID-VkVideoEncodeH264SessionCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_KHR

H.264 编码参数集

使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建的视频会话参数对象可以包含以下类型的参数:

H.264 序列参数集 (SPS)

StdVideoH264SequenceParameterSet 结构表示,并解释如下

  • reserved1reserved2 仅用于填充目的,否则将被忽略;

  • seq_parameter_set_id 用作 SPS 条目的键;

  • level_idc 是枚举常量 STD_VIDEO_H264_LEVEL_IDC_<major>_<minor> 之一,表示 ITU-T H.264 规范的 A.3 节中定义的 H.264 级别 <major>.<minor>

  • 如果设置了 flags.seq_scaling_matrix_present_flag,则 pScalingLists 指向的 StdVideoH264ScalingLists 结构解释如下

    • scaling_list_present_mask 是一个位掩码,其中位索引 i 对应于 ITU-T H.264 规范的 7.4.2.1 节中定义的 seq_scaling_list_present_flag[i]

    • use_default_scaling_matrix_mask 是一个位掩码,其中位索引 i 对应于 UseDefaultScalingMatrix4x4Flag[i](当 i < 6 时),或者对应于 UseDefaultScalingMatrix8x8Flag[i-6](否则),如 ITU-T H.264 规范的 7.3.2.1 节中所定义;

    • ScalingList4x4ScalingList8x8 对应于 ITU-T H.264 规范的 7.3.2.1 节中定义的同名语法元素;

  • 如果设置了 flags.vui_parameters_present_flag,则 pSequenceParameterSetVui 是指向 StdVideoH264SequenceParameterSetVui 结构的指针,该结构解释如下

    • reserved1 仅用于填充目的,否则将被忽略;

    • flags.color_description_present_flag 被解释为 colour_description_present_flag 的值,如 ITU-T H.264 规范的 E.2.1 节中所定义;

      colour_description_present_flag 的名称在视频标准头文件中拼写错误。

    • 如果设置了 flags.nal_hrd_parameters_present_flagflags.vcl_hrd_parameters_present_flag,则 pHrdParameters 指向的 StdVideoH264HrdParameters 结构解释如下

      • reserved1 仅用于填充目的,否则将被忽略;

      • StdVideoH264HrdParameters 的所有其他成员都按照 ITU-T H.264 规范的 E.2.2 节中的定义进行解释;

    • StdVideoH264SequenceParameterSetVui 的所有其他成员都按照 ITU-T H.264 规范的 E.2.1 节中的定义进行解释;

  • StdVideoH264SequenceParameterSet 的所有其他成员都按照 ITU-T H.264 规范的 7.4.2.1 节中的定义进行解释。

H.264 图像参数集 (PPS)

StdVideoH264PictureParameterSet 结构表示,并解释如下

  • seq_parameter_set_idpic_parameter_set_id 构成的对用作 PPS 条目的键;

  • 如果设置了 flags.pic_scaling_matrix_present_flag,则 pScalingLists 指向的 StdVideoH264ScalingLists 结构解释如下

    • scaling_list_present_mask 是一个位掩码,其中位索引 i 对应于 ITU-T H.264 规范的 7.4.2.2 节中定义的 pic_scaling_list_present_flag[i]

    • use_default_scaling_matrix_mask 是一个位掩码,其中位索引 i 对应于 UseDefaultScalingMatrix4x4Flag[i](当 i < 6 时),或者对应于 UseDefaultScalingMatrix8x8Flag[i-6](否则),如 ITU-T H.264 规范的 7.3.2.2 节中所定义;

    • ScalingList4x4ScalingList8x8 对应于 ITU-T H.264 规范的 7.3.2.2 节中定义的同名语法元素;

  • StdVideoH264PictureParameterSet 的所有其他成员都按照 ITU-T H.264 规范的 7.4.2.2 节中的定义进行解释。

实现可以根据 视频编码参数覆盖部分中定义的语义覆盖这些参数中的任何一个,然后再将生成的 H.264 参数集存储到视频会话参数对象中。应用程序需要使用 vkGetEncodedVideoSessionParametersKHR 命令来确定是否发生了任何实现覆盖,并检索编码的 H.264 参数集,以便能够生成符合标准的 H.264 视频码流。

此类 H.264 参数集覆盖可能还会对应用于视频编码操作生成的编码码流的实现覆盖产生级联影响。如果实现支持 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR 视频编码反馈查询标志,则应用程序可以使用此类查询来检索有关是否已对编码码流应用任何实现覆盖的反馈。

当使用编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 创建 视频会话参数 对象时,VkVideoSessionParametersCreateInfoKHR::pNext必须包含一个 VkVideoEncodeH264SessionParametersCreateInfoKHR 结构,该结构指定对象的容量和初始内容。

VkVideoEncodeH264SessionParametersCreateInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264SessionParametersCreateInfoKHR {
    VkStructureType                                        sType;
    const void*                                            pNext;
    uint32_t                                               maxStdSPSCount;
    uint32_t                                               maxStdPPSCount;
    const VkVideoEncodeH264SessionParametersAddInfoKHR*    pParametersAddInfo;
} VkVideoEncodeH264SessionParametersCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxStdSPSCount 是创建的 VkVideoSessionParametersKHR 可以包含的 H.264 SPS 条目的最大数量。

  • maxStdPPSCount 是创建的 VkVideoSessionParametersKHR 可以包含的 H.264 PPS 条目的最大数量。

  • pParametersAddInfoNULL 或指向 VkVideoEncodeH264SessionParametersAddInfoKHR 结构的指针,该结构指定在对象创建时要添加的 H.264 参数。

有效用法(隐式)
  • VUID-VkVideoEncodeH264SessionParametersCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR

  • VUID-VkVideoEncodeH264SessionParametersCreateInfoKHR-pParametersAddInfo-parameter
    如果 pParametersAddInfo 不为 NULL,则 pParametersAddInfo 必须是指向有效 VkVideoEncodeH264SessionParametersAddInfoKHR 结构的有效指针

VkVideoEncodeH264SessionParametersAddInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264SessionParametersAddInfoKHR {
    VkStructureType                            sType;
    const void*                                pNext;
    uint32_t                                   stdSPSCount;
    const StdVideoH264SequenceParameterSet*    pStdSPSs;
    uint32_t                                   stdPPSCount;
    const StdVideoH264PictureParameterSet*     pStdPPSs;
} VkVideoEncodeH264SessionParametersAddInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdSPSCountpStdSPSs 数组中的元素数量。

  • pStdSPSs 是指向 StdVideoH264SequenceParameterSet 结构数组的指针,该数组描述要添加的 H.264 SPS 条目。

  • stdPPSCountpStdPPSs 数组中的元素数量。

  • pStdPPSs 是指向 StdVideoH264PictureParameterSet 结构数组的指针,该数组描述要添加的 H.264 PPS 条目。

此结构可以在以下位置指定:

有效用法
  • VUID-VkVideoEncodeH264SessionParametersAddInfoKHR-None-04837
    pStdSPSs 的元素中指定的每个 StdVideoH264SequenceParameterSet 结构的 seq_parameter_set_id 成员在 pStdSPSs必须是唯一的。

  • VUID-VkVideoEncodeH264SessionParametersAddInfoKHR-None-04838
    pStdPPSs 的元素中指定的每个 StdVideoH264PictureParameterSet 结构的 seq_parameter_set_idpic_parameter_set_id 成员组成的对在 pStdPPSs必须是唯一的。

有效用法(隐式)
  • VUID-VkVideoEncodeH264SessionParametersAddInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR

  • VUID-VkVideoEncodeH264SessionParametersAddInfoKHR-pStdSPSs-parameter
    如果 stdSPSCount 不为 0,并且 pStdSPSs 不为 NULL,则 pStdSPSs 必须是指向 stdSPSCountStdVideoH264SequenceParameterSet 值的有效指针

  • VUID-VkVideoEncodeH264SessionParametersAddInfoKHR-pStdPPSs-parameter
    如果 stdPPSCount 不为 0,并且 pStdPPSs 不为 NULL,则 pStdPPSs 必须是指向 stdPPSCountStdVideoH264PictureParameterSet 值的有效指针

VkVideoEncodeH264SessionParametersGetInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264SessionParametersGetInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkBool32           writeStdSPS;
    VkBool32           writeStdPPS;
    uint32_t           stdSPSId;
    uint32_t           stdPPSId;
} VkVideoEncodeH264SessionParametersGetInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • writeStdSPS 指示是否请求检索由 stdSPSId 标识的编码 H.264 序列参数集

  • writeStdPPS 指示是否请求检索由 stdSPSIdstdPPSId 构造的对标识的编码 H.264 图片参数集

  • stdSPSId 指定用于标识检索到的 H.264 序列和/或图片参数集的 H.264 序列参数集 ID。

  • writeStdPPSVK_TRUE 时,stdPPSId 指定用于标识检索到的 H.264 图片参数集的 H.264 图片参数集 ID。

当此结构在传递给 vkGetEncodedVideoSessionParametersKHRVkVideoEncodeSessionParametersGetInfoKHR 结构的 pNext 链中指定时,该命令将按以下顺序将编码的参数数据写入输出缓冲区

  1. 如果 writeStdSPSVK_TRUE,则为由 stdSPSId 标识的 H.264 序列参数集

  2. 如果 writeStdPPSVK_TRUE,则为由 stdSPSIdstdPPSId 构造的对标识的 H.264 图片参数集

有效用法
  • VUID-VkVideoEncodeH264SessionParametersGetInfoKHR-writeStdSPS-08279
    writeStdSPSwriteStdPPS 中至少一个必须VK_TRUE

有效用法(隐式)
  • VUID-VkVideoEncodeH264SessionParametersGetInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR

VkVideoEncodeH264SessionParametersFeedbackInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264SessionParametersFeedbackInfoKHR {
    VkStructureType    sType;
    void*              pNext;
    VkBool32           hasStdSPSOverrides;
    VkBool32           hasStdPPSOverrides;
} VkVideoEncodeH264SessionParametersFeedbackInfoKHR;
有效用法(隐式)
  • VUID-VkVideoEncodeH264SessionParametersFeedbackInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_FEEDBACK_INFO_KHR

H.264 编码参数

VkVideoEncodeH264PictureInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264PictureInfoKHR {
    VkStructureType                             sType;
    const void*                                 pNext;
    uint32_t                                    naluSliceEntryCount;
    const VkVideoEncodeH264NaluSliceInfoKHR*    pNaluSliceEntries;
    const StdVideoEncodeH264PictureInfo*        pStdPictureInfo;
    VkBool32                                    generatePrefixNalu;
} VkVideoEncodeH264PictureInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • naluSliceEntryCountpNaluSliceEntries 中的元素数。

  • pNaluSliceEntries 是指向 naluSliceEntryCountVkVideoEncodeH264NaluSliceInfoKHR 结构数组的指针,该数组指定要为输入图片编码的各个 H.264 片段的参数。

  • pStdPictureInfo 是指向 StdVideoEncodeH264PictureInfo 结构的指针,该结构指定H.264 图片信息

  • generatePrefixNalu 控制是否在目标码流中将前缀 NALU 生成到片段 NALU 之前,如 ITU-T H.264 规范的 7.3.2.12 和 7.4.2.12 节中所定义。

此结构在传递给 vkCmdEncodeVideoKHRVkVideoEncodeInfoKHR 结构的 pNext 链中指定,以指定 H.264 编码操作的特定于编解码器的图片信息。

编码输入图片信息

当此结构在传递给 vkCmdEncodeVideoKHRVkVideoEncodeInfoKHR 结构的 pNext 链中指定时,与编码输入图像相关的信息定义如下

标准图像信息

pStdPictureInfo 指向的 StdVideoEncodeH264PictureInfo 结构的成员解释如下

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • flags.IdrPicFlag,如ITU-T H.264 规范的 7.4.1 节中所定义;

  • flags.is_reference,如 ITU-T H.264 规范的第 3.136 节中所定义;

  • seq_parameter_set_idpic_parameter_set_id 用于标识活动参数集,如下所述;

  • primary_pic_type,如ITU-T H.264 规范的 7.4.2 节中所定义;

  • PicOrderCnt,如ITU-T H.264 规范的 8.2 节中所定义;

  • temporal_id,如ITU-T H.264 规范的 G.7.4.1.1 节中所定义;

  • 如果 pRefLists 不为 NULL,则它是一个指向 StdVideoEncodeH264ReferenceListsInfo 结构的指针,解释如下

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • ref_pic_list_modification_flag_l0ref_pic_list_modification_flag_l1,如ITU-T H.264 规范的 7.4.3.1 节中所定义;

    • num_ref_idx_l0_active_minus1num_ref_idx_l1_active_minus1,如ITU-T H.264 规范的 7.4.3 节中所定义;

    • RefPicList0RefPicList1,如ITU-T H.264 规范的 8.2.4 节中所定义,其中这些数组的每个元素使用其 DPB槽 索引标识一个活动参考图像,或者包含值 STD_VIDEO_H264_NO_REFERENCE_PICTURE 以指示“无参考图像”;

    • 如果 refList0ModOpCount 不为零,则 pRefList0ModOperations 是一个指向 refList0ModOpCountStdVideoEncodeH264RefListModEntry 结构的数组的指针,该结构指定参考列表 L0 的修改参数,如ITU-T H.264 规范的 7.4.3.1 节中所定义;

    • 如果 refList1ModOpCount 不为零,则 pRefList1ModOperations 是一个指向 refList1ModOpCountStdVideoEncodeH264RefListModEntry 结构的数组的指针,该结构指定参考列表 L1 的修改参数,如ITU-T H.264 规范的 7.4.3.1 节中所定义;

    • 如果 refPicMarkingOpCount 不为零,则 refPicMarkingOperations 是一个指向 refPicMarkingOpCountStdVideoEncodeH264RefPicMarkingEntry 结构的数组的指针,该结构指定参考图像标记参数,如ITU-T H.264 规范的 7.4.3.3 节中所定义;

  • 所有其他成员的解释均按照 ITU-T H.264 规范 的 7.4.3 节中的定义。

参考图像的设置由 StdVideoEncodeH264PictureInfo::flags.is_reference 的值控制。如果它被设置并且指定了一个重建图像,则后者将用作图像重建的目标,以激活 pEncodeInfo->pSetupReferenceSlot→slotIndex 中指定的 DPB 槽。 如果 StdVideoEncodeH264PictureInfo::flags.is_reference 未设置,但指定了一个重建图像,则与DPB 槽关联的相应图像参考将被无效化,如 DPB 槽状态 部分所述。

活动参数集

pStdPictureInfo 指向的 StdVideoEncodeH264PictureInfo 结构的成员用于从绑定的视频会话参数对象中选择要使用的活动参数集,如下所示

  • 活动 SPS 是由 StdVideoEncodeH264PictureInfo::seq_parameter_set_id 中指定的键标识的 SPS

  • 活动 PPS 是由 StdVideoEncodeH264PictureInfo::seq_parameter_set_idStdVideoEncodeH264PictureInfo::pic_parameter_set_id 组成的键对标识的 PPS

如果对于活动的 PPSpNaluSliceEntries 相应元素的 pStdSliceHeader 成员,以下任何条件为真,则 H.264 编码将对切片使用显式加权样本预测,如ITU-T H.264 规范的 8.4.2.3 节中所定义。

  • pStdSliceHeader->slice_typeSTD_VIDEO_H264_SLICE_TYPE_P 并且在活动 PPS 中启用了 weighted_pred_flag

  • pStdSliceHeader->slice_typeSTD_VIDEO_H264_SLICE_TYPE_B 并且活动 PPS 中的 weighted_bipred_idc 等于 STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_EXPLICIT

有效用法
有效用法(隐式)
  • VUID-VkVideoEncodeH264PictureInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PICTURE_INFO_KHR

  • VUID-VkVideoEncodeH264PictureInfoKHR-pNaluSliceEntries-parameter
    pNaluSliceEntries 必须是指向 naluSliceEntryCount 个有效的 VkVideoEncodeH264NaluSliceInfoKHR 结构数组的有效指针。

  • VUID-VkVideoEncodeH264PictureInfoKHR-pStdPictureInfo-parameter
    pStdPictureInfo 必须 是指向有效 StdVideoEncodeH264PictureInfo 值的有效指针

  • VUID-VkVideoEncodeH264PictureInfoKHR-naluSliceEntryCount-arraylength
    naluSliceEntryCount 必须 大于 0

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264NaluSliceInfoKHR {
    VkStructureType                         sType;
    const void*                             pNext;
    int32_t                                 constantQp;
    const StdVideoEncodeH264SliceHeader*    pStdSliceHeader;
} VkVideoEncodeH264NaluSliceInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • 如果为视频会话配置的当前速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 constantQp 是用于切片的 QP。

  • pStdSliceHeader 是指向 StdVideoEncodeH264SliceHeader 结构的指针,该结构指定切片的H.264 切片头参数

Std 切片头参数

pStdSliceHeader 指向的 StdVideoEncodeH264SliceHeader 结构的成员解释如下

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • 如果 pWeightTable 不是 NULL,则它是指向 StdVideoEncodeH264WeightTable 的指针,其解释如下

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • StdVideoEncodeH264WeightTable 的所有其他成员的解释均按照ITU-T H.264 规范第 7.4.3.2 节中的定义;

  • 所有其他成员的解释均按照 ITU-T H.264 规范 的 7.4.3 节中的定义。

有效用法(隐式)
  • VUID-VkVideoEncodeH264NaluSliceInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_INFO_KHR

  • VUID-VkVideoEncodeH264NaluSliceInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkVideoEncodeH264NaluSliceInfoKHR-pStdSliceHeader-parameter
    pStdSliceHeader 必须 是指向有效 StdVideoEncodeH264SliceHeader 值的有效指针

VkVideoEncodeH264DpbSlotInfoKHR 结构定义如下

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264DpbSlotInfoKHR {
    VkStructureType                           sType;
    const void*                               pNext;
    const StdVideoEncodeH264ReferenceInfo*    pStdReferenceInfo;
} VkVideoEncodeH264DpbSlotInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdReferenceInfo 是指向 StdVideoEncodeH264ReferenceInfo 结构的指针,该结构指定H.264 参考信息

如果不是 NULL,则此结构在 VkVideoEncodeInfoKHR::pSetupReferenceSlotpNext 链中指定,并且在 VkVideoEncodeInfoKHR::pReferenceSlots 元素的 pNext 链中指定,以指定H.264 编码操作的编解码器特定参考图片信息。

活动参考图像信息

当此结构在 VkVideoEncodeInfoKHR::pReferenceSlots 的元素的 pNext 链中指定时,对于 VkVideoEncodeInfoKHR::pReferenceSlots 的每个元素,会将一个元素添加到视频编码操作使用的活动参考图片列表中,如下所示

重建图像信息

当此结构在 VkVideoEncodeInfoKHR::pSetupReferenceSlotpNext 链中指定时,与重建图片相关的信息定义如下

Std 参考信息

pStdReferenceInfo 指向的 StdVideoEncodeH264ReferenceInfo 结构的成员解释如下

  • flags.reserved 仅用于填充目的,否则将被忽略;

  • flags.used_for_long_term_reference 用于指示该图像是否被标记为“用于长期参考”,如 ITU-T H.264 规范 的 8.2.5.1 节中所定义;

  • primary_pic_type,如ITU-T H.264 规范的 7.4.2 节中所定义;

  • long_term_pic_numlong_term_frame_idx,如ITU-T H.264 规范第 7.4.3 节中所定义;

  • temporal_id,如ITU-T H.264 规范的 G.7.4.1.1 节中所定义;

  • 所有其他成员的解释均按照 ITU-T H.264 规范 的 8.2 节中的定义。

有效用法(隐式)
  • VUID-VkVideoEncodeH264DpbSlotInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_KHR

  • VUID-VkVideoEncodeH264DpbSlotInfoKHR-pStdReferenceInfo-parameter
    pStdReferenceInfo 必须 是指向有效 StdVideoEncodeH264ReferenceInfo 值的有效指针

H.264 编码速率控制

图像组

在 H.264 编码的情况下,通常的做法是在编码后续帧时,在显示顺序中遵循不同图片类型的规则模式。此模式称为图像组 (GOP)。

常规 GOP 由以下参数定义

  • GOP 中的帧数;

  • 在显示顺序中,I 帧和/或 P 帧之间连续 B 帧的数量。

GOP 进一步分类为开放 GOP 和闭合 GOP。

开放 GOP 中的帧类型在显示顺序中按照以下算法相互跟随

  1. 第一帧始终是 I 帧。

  2. 接下来是若干个连续的 B 帧,如上所述。

  3. 如果尚未达到 GOP 中的帧数,则下一帧是 P 帧,并且该算法从步骤 2 继续。

h26x open gop
图 1. H.264 开放 GOP

在闭合 GOP 的情况下,在某个周期使用 IDR 帧

h26x closed gop
图 2. H.264 闭合 GOP

H.264 编码的另一个典型做法是在 GOP 的帧中使用特定的参考图片使用模式。使用最常见的两个参考模式如下所示

平面参考模式
  • 每个 P 帧在显示顺序中使用最后一个非 B 帧作为参考。

  • 每个 B 帧在显示顺序中使用最后一个非 B 帧作为其前向参考,并在显示顺序中使用下一个非 B 帧作为其后向参考。

h26x ref pattern flat
图 3. H.264 平面参考模式
二元参考模式
  • 每个 P 帧在显示顺序中使用最后一个非 B 帧作为参考。

  • 以下算法应用于显示顺序中 I 帧和/或 P 帧之间连续 B 帧的序列

    1. 此序列中间的 B 帧使用该序列之前的帧作为其前向参考,并使用该序列之后的帧作为其后向参考。

    2. 对于以下帧序列,递归执行该算法

      • 原始序列中位于中间帧之前的 B 帧(如果有)。

      • 原始序列中位于中间帧之后的 B 帧(如果有)。

h26x ref pattern dyadic
图 4. H.264 二元参考模式

应用程序可以向实现 的速率控制算法提供有关应用程序使用的 GOP 结构的指导。任何关于 GOP 及其结构的此类指导并不强制应用程序使用特定的 GOP 结构,因为各个编码图片的图片类型仍然由应用程序控制,但是,任何偏离所提供指导的行为可能导致不希望的速率控制行为,包括但不限于实现无法符合应用程序指定的预期平均或目标比特率,或其他速率控制参数。

当 H.264 编码会话用于编码多个时间层时,通常的做法是当编码后续帧时,在显示顺序中遵循编码图片的 H.264 时间 ID 的规则模式。此模式称为时间 GOP。最常见的时间层模式使用如下

二元时间层模式
  • 时间 GOP 中的帧数为 2n-1,其中 n 是时间层的数量。

  • 当且仅当 i 中设置的最低有效位的索引等于 n-t-1 时,时间 GOP 中的第 i 帧才使用时间 ID t,但第一帧除外,第一帧是时间 GOP 中唯一使用时间 ID 零的帧。

  • 时间 GOP 中的第 ith 帧使用第 rth 帧作为参考,其中 r 是通过清除 i 中设置的最低有效位来计算的,但时间 GOP 中的第一帧除外,如果存在,它使用前一个时间 GOP 的第一帧作为参考。

h26x layer pattern dyadic
图 5. H.264 二元时间层模式

多层速率控制和多层编码通常用于期望低延迟的流媒体情况,因此通常不使用具有后向预测的 B 帧。

VkVideoEncodeH264RateControlInfoKHR 结构定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264RateControlInfoKHR {
    VkStructureType                         sType;
    const void*                             pNext;
    VkVideoEncodeH264RateControlFlagsKHR    flags;
    uint32_t                                gopFrameCount;
    uint32_t                                idrPeriod;
    uint32_t                                consecutiveBFrameCount;
    uint32_t                                temporalLayerCount;
} VkVideoEncodeH264RateControlInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flagsVkVideoEncodeH264RateControlFlagBitsKHR 的位掩码,用于指定 H.264 速率控制标志。

  • gopFrameCount 是应用程序打算使用的 图像组 (GOP) 中的帧数。如果为 0,则速率控制算法可能假设一个与实现相关的 GOP 长度。如果为 UINT32_MAX,则将 GOP 长度视为无限。

  • idrPeriod 是两个 IDR 帧之间(请参阅 IDR 周期)的帧数间隔。如果为 0,则速率控制算法可能假设一个与实现相关的 IDR 周期。如果为 UINT32_MAX,则将 IDR 周期视为无限。

  • consecutiveBFrameCountGOP 内 I 帧和/或 P 帧之间连续 B 帧的数量。

  • temporalLayerCount 指定应用程序打算使用的 H.264 时间层数。

当此结构的实例包含在传递给 vkCmdControlVideoCodingKHR 命令的 VkVideoCodingControlInfoKHR 结构的 pNext 链中,并且 VkVideoCodingControlInfoKHR::flags 包含 VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR 时,此结构中的参数将用作实现速率控制算法的指导(请参阅 视频编码控制)。

如果 flags 包含 VK_VIDEO_ENCODE_H264_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR,则速率控制状态将重置为初始状态,以满足 HRD 合规性要求。否则,新的速率控制状态可能在不重置的情况下应用,具体取决于实现和指定的速率控制参数。

根据为 consecutiveBFrameCountidrPeriodgopFrameCount 提供的值,可以推断出编码帧时要使用的图像类型,但是实现不会使用此推断的图像类型来覆盖提供给视频编码操作的图像类型。

有效用法
  • VUID-VkVideoEncodeH264RateControlInfoKHR-flags-08280
    如果 VkVideoEncodeH264CapabilitiesKHR::flags(由用于视频配置文件的 vkGetPhysicalDeviceVideoCapabilitiesKHR 返回)不包含 VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR,则 flags 必须不包含 VK_VIDEO_ENCODE_H264_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR

  • VUID-VkVideoEncodeH264RateControlInfoKHR-flags-08281
    如果 flags 包含 VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHRVK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR,则它必须还包含 VK_VIDEO_ENCODE_H264_RATE_CONTROL_REGULAR_GOP_BIT_KHR

  • VUID-VkVideoEncodeH264RateControlInfoKHR-flags-08282
    如果 flags 包含 VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR,则它必须不包含 VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR

  • VUID-VkVideoEncodeH264RateControlInfoKHR-flags-08283
    如果 flags 包含 VK_VIDEO_ENCODE_H264_RATE_CONTROL_REGULAR_GOP_BIT_KHR,则 gopFrameCount 必须大于 0

  • VUID-VkVideoEncodeH264RateControlInfoKHR-idrPeriod-08284
    如果 idrPeriod 不为 0,则它必须大于或等于 gopFrameCount

  • VUID-VkVideoEncodeH264RateControlInfoKHR-consecutiveBFrameCount-08285
    如果 consecutiveBFrameCount 不为 0,则它必须小于 gopFrameCount

有效用法(隐式)
  • VUID-VkVideoEncodeH264RateControlInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_INFO_KHR

  • VUID-VkVideoEncodeH264RateControlInfoKHR-flags-parameter
    flags 必须VkVideoEncodeH264RateControlFlagBitsKHR 值的有效组合

可以在 VkVideoEncodeH264RateControlInfoKHR::flags 中设置的位,用于指定 H.264 速率控制标志,如下所示:

// Provided by VK_KHR_video_encode_h264
typedef enum VkVideoEncodeH264RateControlFlagBitsKHR {
    VK_VIDEO_ENCODE_H264_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_H264_RATE_CONTROL_REGULAR_GOP_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR = 0x00000008,
    VK_VIDEO_ENCODE_H264_RATE_CONTROL_TEMPORAL_LAYER_PATTERN_DYADIC_BIT_KHR = 0x00000010,
} VkVideoEncodeH264RateControlFlagBitsKHR;
  • VK_VIDEO_ENCODE_H264_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR 指定速率控制应该尝试生成符合 HRD 的比特流,如 ITU-T H.264 规范的附录 C 中所定义。

  • VK_VIDEO_ENCODE_H264_RATE_CONTROL_REGULAR_GOP_BIT_KHR 指定应用程序打算根据 VkVideoEncodeH264RateControlInfoKHR 结构的 gopFrameCountidrPeriodconsecutiveBFrameCount 成员中指定的参数使用常规 GOP 结构

  • VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR 指定应用程序打算在 GOP 中遵循平面参考模式

  • VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR 指定应用程序打算在 GOP 中遵循二元参考模式

  • VK_VIDEO_ENCODE_H264_RATE_CONTROL_TEMPORAL_LAYER_PATTERN_DYADIC_BIT_KHR 指定应用程序打算遵循二元时间层模式

// Provided by VK_KHR_video_encode_h264
typedef VkFlags VkVideoEncodeH264RateControlFlagsKHR;

VkVideoEncodeH264RateControlFlagsKHR 是一种位掩码类型,用于设置零个或多个 VkVideoEncodeH264RateControlFlagBitsKHR 的掩码。

速率控制层

VkVideoEncodeH264RateControlLayerInfoKHR 结构定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264RateControlLayerInfoKHR {
    VkStructureType                  sType;
    const void*                      pNext;
    VkBool32                         useMinQp;
    VkVideoEncodeH264QpKHR           minQp;
    VkBool32                         useMaxQp;
    VkVideoEncodeH264QpKHR           maxQp;
    VkBool32                         useMaxFrameSize;
    VkVideoEncodeH264FrameSizeKHR    maxFrameSize;
} VkVideoEncodeH264RateControlLayerInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • useMinQp 指示是否将速率控制确定的 QP 值钳制到 minQp 中指定的 QP 值下限。

  • minQp 指定当 useMinQpVK_TRUE 时,实现速率控制算法将使用的每个图像类型的 QP 值下限。

  • useMaxQp 指示是否将速率控制确定的 QP 值钳制到 maxQp 中指定的 QP 值上限。

  • maxQp 指定当 useMaxQpVK_TRUE 时,实现速率控制算法将使用的每个图像类型的 QP 值上限。

  • useMaxFrameSize 指示实现速率控制算法应该是否使用 maxFrameSize 中指定的值作为每个图像类型的编码帧大小的上限。

  • maxFrameSize 指定当 useMaxFrameSizeVK_TRUE 时,每个图像类型的编码帧大小的上限。

使用时,minQpmaxQp 中的值保证实现使用的有效 QP 值将分别遵守这些下限和上限。但是,限制实现能够使用的 QP 值范围也会限制实现速率控制算法符合其他约束的能力。特别是,实现可能无法符合以下要求:

  • 要在编码比特流中使用的平均和/或峰值比特率值,在 VkVideoEncodeRateControlLayerInfoKHR 结构的 averageBitratemaxBitrate 成员中指定。

  • VkVideoEncodeH264RateControlLayerInfoKHRmaxFrameSize 成员中指定的每个图像类型的编码帧大小的上限。

通常,应用程序需要适当地配置速率控制参数,以便获得所需的速率控制行为,如视频编码速率控制部分所述。

当此结构的实例包含在VkVideoEncodeRateControlLayerInfoKHR结构的pNext链中,而该结构又在传递给vkCmdControlVideoCodingKHR命令的VkVideoEncodeRateControlInfoKHR结构的pLayers数组成员的某个元素中指定时,如果VkVideoCodingControlInfoKHR::flags包含VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR,并且绑定的视频会话是使用视频编解码操作VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR创建的,则它将指定与pLayers的该元素对应的速率控制层的 H.264 特定速率控制参数。

有效用法
有效用法(隐式)
  • VUID-VkVideoEncodeH264RateControlLayerInfoKHR-sType-sType
    sType必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_KHR

  • VUID-VkVideoEncodeH264RateControlLayerInfoKHR-minQp-parameter
    minQp必须为有效的VkVideoEncodeH264QpKHR结构。

  • VUID-VkVideoEncodeH264RateControlLayerInfoKHR-maxQp-parameter
    maxQp必须为有效的VkVideoEncodeH264QpKHR结构。

  • VUID-VkVideoEncodeH264RateControlLayerInfoKHR-maxFrameSize-parameter
    maxFrameSize必须为有效的VkVideoEncodeH264FrameSizeKHR结构。

VkVideoEncodeH264QpKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264QpKHR {
    int32_t    qpI;
    int32_t    qpP;
    int32_t    qpB;
} VkVideoEncodeH264QpKHR;
  • qpI 是用于I 帧的 QP。

  • qpP 是用于P 帧的 QP。

  • qpB 是用于B 帧的 QP。

VkVideoEncodeH264FrameSizeKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264FrameSizeKHR {
    uint32_t    frameISize;
    uint32_t    framePSize;
    uint32_t    frameBSize;
} VkVideoEncodeH264FrameSizeKHR;
  • frameISize 是用于I 帧的大小(以字节为单位)。

  • framePSize 是用于P 帧的大小(以字节为单位)。

  • frameBSize 是用于B 帧的大小(以字节为单位)。

GOP 剩余帧

除了会话级别的速率控制配置之外,应用程序可以指定图像组(GOP)中每种帧类型剩余的帧数。

VkVideoEncodeH264GopRemainingFrameInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264GopRemainingFrameInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkBool32           useGopRemainingFrames;
    uint32_t           gopRemainingI;
    uint32_t           gopRemainingP;
    uint32_t           gopRemainingB;
} VkVideoEncodeH264GopRemainingFrameInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • useGopRemainingFrames 指示实现中的速率控制算法是否应该使用gopRemainingIgopRemainingPgopRemainingB 中指定的值。如果 useGopRemainingFramesVK_FALSE,则 gopRemainingIgopRemainingPgopRemainingB 的值将被忽略。

  • gopRemainingI 指定在执行视频编码操作之前,实现中的速率控制算法应该假定在GOP 中剩余的I 帧数。

  • gopRemainingP 指定在执行视频编码操作之前,实现中的速率控制算法应该假定在GOP 中剩余的P 帧数。

  • gopRemainingB 指定在执行视频编码操作之前,实现中的速率控制算法应该假定在GOP 中剩余的B 帧数。

仅当用于视频配置文件VkVideoEncodeH264CapabilitiesKHR::requiresGopRemainingFrames 报告为 VK_TRUE 时,才必须将 useGopRemainingFrames 设置为 VK_TRUE 并将此结构包含在VkVideoBeginCodingInfoKHRpNext 链中。但是,即使不是必需的,实现可以使用这些剩余的帧计数(如果指定了)。特别是当应用程序不使用常规 GOP 结构时,这些值可以为实现中的速率控制算法提供额外的指导。

VkVideoEncodeH264CapabilitiesKHR::prefersGopRemainingFrames 功能还用于指示如果应用程序使用此结构指定剩余的帧计数,则实现中的速率控制算法可能会更准确地运行。

与其他速率控制指导值一样,如果应用程序编码的帧的有效顺序和数量与在任何给定点在此结构中指定的剩余帧计数不一致,则实现中的速率控制算法的行为可能会偏离应用程序预期的行为。

有效用法(隐式)
  • VUID-VkVideoEncodeH264GopRemainingFrameInfoKHR-sType-sType
    sType必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_GOP_REMAINING_FRAME_INFO_KHR

H.264 QP Delta 映射

H.264 编码配置文件一起使用的量化增量映射被称为QP 增量映射,它们的纹素包含表示 QP 增量值的整数值,这些值在确定编码图片的量化参数的过程中应用。

因此,如 VkVideoFormatPropertiesKHR::format 中所述,H.264 QP delta 映射始终具有单通道整数格式。

码率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR 时,QP delta 值会添加到每个切片的恒定 QP 值中,从而使应用程序能够有效地在所使用的量化映射纹素大小的粒度上显式控制所使用的 QP 值。

对于所有其他码率控制模式,QP delta 值可以用来偏移码率控制算法原本会产生的 QP 值。

H.264 编码量化

执行 H.264 编码操作涉及将 QP 值分配给单个 H.264 宏块的过程。 此过程取决于所使用的码率控制模式以及其他编码和码率控制参数,如下所述。

  • 如果配置的码率控制模式为 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR,则 QP 值由特定于实现的默认码率控制算法初始化。

  • 如果配置的码率控制模式为 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 QP 值从为宏块所属的H.264 切片指定的恒定 QP 值初始化。

  • 如果配置的码率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 QP 值由相应的码率控制算法初始化。

    • 如果视频编码操作是使用量化 delta 映射发出的,则从量化映射中获取的与宏块对应的 QP delta 值会添加到先前确定的 QP 值中。 如果获取的 QP delta 值超出 VkVideoEncodeH264QuantizationMapCapabilitiesKHRminQpDeltamaxQpDelta 成员中报告的受支持的 QP delta 值范围,则宏块使用的 QP 值将变为未定义

    • 如果视频编码操作是使用强调映射发出的,则码率控制将根据与宏块对应的强调值(如从量化映射中获取)调整 QP 值,根据以下公式:

      QPnew = f(QPprev,e)

      其中 QPnew 是最终的 QP 值,QPprev 是先前确定的 QP 值,e 是与宏块对应的强调值,而 f 是一个实现定义的函数,该函数满足以下含义:

      e1 < e2 ⇒ f(QP,e1) ≥ f(QP,e2)

      这意味着较低的强调值将导致较高的 QP 值,而较高的强调值将导致较低的 QP 值,但是对于给定的输入 QP 值,该函数不会相对于输入强调值严格递减。

    • 如果应用的码率控制层中启用了最小 QP 值限制,则 QP 值将限制为相应的最小 QP 值。

    • 如果应用的码率控制层中启用了最大 QP 值限制,则 QP 值将限制为相应的最大 QP 值。

  • 如果不支持 VK_VIDEO_ENCODE_H264_CAPABILITY_MB_QP_DIFF_WRAPAROUND_BIT_KHR,则确定的 QP 值将以这样一种方式进行限制,使得编码的宏块的 mb_qp_delta 值符合修改后的版本ITU-T H.264 规范的公式 7-37。

    这样做的效果是,后续宏块之间的最大 QP 差值被限制在 [-(26 + QpBdOffsetY / 2), 25 + QpBdOffsetY / 2] 范围内,并且只有在视频编码操作是使用QP delta 映射发出的时,才会有可观察到的行为变化。

  • 在所有情况下,最终的 QP 值都将限制为视频配置文件支持的 QP 值范围,如 VkVideoEncodeH264CapabilitiesKHRminQpmaxQp 成员中报告的那样。

H.264 编码要求

本节描述了对于至少有一个队列族支持视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR 的物理设备来说,必需的 H.264 编码功能,该操作由 vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyVideoPropertiesKHR::videoCodecOperations 中返回。

表 7. 必需的视频标准标头版本
视频标准头名称 版本

vulkan_video_codec_h264std_encode

1.0.0

表 8. 必需的视频功能
视频功能 要求 要求类型1

VkVideoCapabilitiesKHR

flags

-

min

minBitstreamBufferOffsetAlignment

4096

max

minBitstreamBufferSizeAlignment

4096

max

pictureAccessGranularity

(64,64)

max

minCodedExtent

-

max

maxCodedExtent

-

min

maxDpbSlots

0

min

maxActiveReferencePictures

0

min

VkVideoEncodeCapabilitiesKHR

flags

-

min

rateControlModes

-

min

maxBitrate

64000

min

maxQualityLevels

1

min

encodeInputPictureGranularity

(64,64)

max

supportedEncodeFeedbackFlags

VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR

min

VkVideoEncodeH264CapabilitiesKHR

flags

-

min

maxLevelIdc

STD_VIDEO_H264_LEVEL_IDC_1_0

min

maxSliceCount

1

min

maxPPictureL0ReferenceCount

0

min

maxBPictureL0ReferenceCount

0

min

maxL1ReferenceCount

0

min

maxTemporalLayerCount

1

min

expectDyadicTemporalLayerPattern

-

实现相关

minQp

-

max

maxQp

-

min

prefersGopRemainingFrames

-

实现相关

requiresGopRemainingFrames

-

实现相关

stdSyntaxFlags

-

min

VkVideoEncodeQuantizationMapCapabilitiesKHR

maxQuantizationMapExtent

- 2

min

VkVideoEncodeH264QuantizationMapCapabilitiesKHR

minQpDelta

- 3

max

maxQpDelta

- 3

min

1

要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。

2

如果 VkVideoCapabilitiesKHR::flags 包括 VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHRVK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR,则 maxQuantizationMapExtentwidthheight 成员必须大于零。

3

如果 VkVideoCapabilitiesKHR::flags 包括 VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR,则 maxQpDelta 必须大于 minQpDelta

H.265 编码操作

使用H.265 编码配置文件的视频编码操作可以用于编码符合ITU-T H.265 规范的基本视频流序列。

有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言

此过程根据视频编码操作步骤执行,其中编解码器特定的语义在ITU-T H.265 规范的第 8 节中定义,如下所示:

如果参数符合上述ITU-T H.265 规范相应部分定义的句法和语义要求,并且与活动参考图像关联的DPB 插槽都指向有效的图像参考,那么视频编码操作将成功完成。否则,视频编码操作可能不成功

H.265 编码参数覆盖

除非另有规定,否则实现可能会覆盖以下视频标准结构中指定的任何 H.265 编码参数

  • StdVideoH265VideoParameterSet

  • StdVideoH265SequenceParameterSet

  • StdVideoH265PictureParameterSet

  • StdVideoEncodeH265PictureInfo

  • StdVideoEncodeH265SliceSegmentHeader

  • StdVideoEncodeH265ReferenceInfo

所有此类 H.265 编码参数覆盖必须满足视频编码参数覆盖部分中定义的条件。

此外,实现必须不覆盖以下任何 H.265 编码参数

  • StdVideoEncodeH265PictureInfo::pic_type

  • StdVideoEncodeH265SliceSegmentHeader::slice_type

对于使用 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR 创建的视频会话参数对象,以下 H.265 SPSPPS 参数可能会被实现根据创建视频会话参数对象的量化映射纹素大小覆盖。

  • StdVideoH265SequenceParameterSet::log2_min_luma_coding_block_size_minus3

  • StdVideoH265SequenceParameterSet::log2_diff_max_min_luma_coding_block_size

  • StdVideoH265SequenceParameterSet::log2_min_pcm_luma_coding_block_size_minus3

  • StdVideoH265SequenceParameterSet::log2_diff_max_min_pcm_luma_coding_block_size

  • StdVideoH265PictureParameterSet::diff_cu_qp_delta_depth

可能是必要的,以便在使用特定的量化映射纹素大小时,将图像编码期间使用的 H.265 编码单元和编码树单元大小限制为实现支持的大小。

对于存储在视频会话参数对象中的 H.265 编码参数,应用程序需要使用 vkGetEncodedVideoSessionParametersKHR 命令来确定是否发生了任何实现覆盖。如果查询表明应用了实现覆盖,那么应用程序需要检索并使用比特流中编码的 H.265 参数集,以便能够使用存储在视频会话参数对象中的 H.265 编码参数生成符合标准的 H.265 视频比特流。

对于视频编码操作生成的编码比特流中存储的任何 H.265 编码参数,如果实现支持 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR 视频编码反馈查询标志,则应用程序可以使用此类查询来检索有关是否对这些 H.265 编码参数应用了任何实现覆盖的反馈信息。

H.265 编码比特流数据访问

每个视频编码操作都会写入一个或多个 VCL NAL 单元,这些单元包括切片段头和编码图像的数据,其格式如ITU-T H.265 规范的第 7.3.6 和 7.3.8 节中定义,分别根据第 7.4.7 和 7.4.9 节中定义的语义。写入的 VCL NAL 单元的数量由 VkVideoEncodeH265PictureInfoKHR::naluSliceSegmentEntryCount 指定。

H.265 编码图像数据访问

对视频图像资源中的图像数据的访问发生在 VkVideoCapabilitiesKHR::pictureAccessGranularity 指示的粒度上,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为使用的视频配置文件返回的。因此,使用H.265 编码配置文件的视频编码操作访问的编码输入图像参考图像重建图像的完整图像子区域定义为坐标范围内的纹素集

([0,endX), [0,endY))

其中

  • endX 等于codedExtent.width向上舍入到 pictureAccessGranularity.width 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的宽度;

  • endY 等于codedExtent.height向上舍入到 pictureAccessGranularity.height 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的高度;

其中 codedExtent 是对应于图像的 VkVideoPictureResourceInfoKHR 结构的成员。

在使用H.265 编码配置文件的视频编码操作中,按照ITU-T H.265 规范的定义,在坐标(x,y)处对图像的任何访问都是对引用的相应VkVideoPictureResourceInfoKHR 结构在纹素坐标 (x,y) 处的图像子资源的访问。

实现可以选择不访问视频编码操作可用的某些或所有 参考图像 内的纹素(例如,由于 视频编码参数覆盖限制了有效使用的参考图像集,或者如果编码算法选择不使用参考图像数据的某些子区域进行样本预测)。

H.265 帧、图像、切片段和瓦片

H.265 图像由一个或多个切片、切片段和瓦片组成,如ITU-T H.265 规范的第 6.3.1 节中定义。

为了本规范的目的,构成图像的 H.265 切片段被称为图像的图像分区

使用H.265 编码配置文件的视频编码操作可以编码不同类型的切片段,如ITU-T H.265 规范的第 7.4.7.1 节中所定义,方法是在来自视频标准枚举类型 StdVideoH265SliceTypeH.265 切片段头参数中,在 StdVideoEncodeH265SliceSegmentHeader::slice_type 中指定相应的枚举常量值

  • STD_VIDEO_H265_SLICE_TYPE_B 表示切片段是ITU-T H.265 规范的第 3.12 节中定义的B 切片的一部分。

  • STD_VIDEO_H265_SLICE_TYPE_P 表示切片段是ITU-T H.265 规范的第 3.111 节中定义的P 切片的一部分。

  • STD_VIDEO_H265_SLICE_TYPE_I 表示切片段是ITU-T H.265 规范的第 3.74 节中定义的I 切片的一部分。

由这种切片片段构建的图像可以是不同的类型,如ITU-T H.265规范的7.4.3.5节所定义。使用H.265编码配置文件的视频编码操作可以通过在H.265图像信息StdVideoEncodeH265PictureInfo::pic_type中指定相应的枚举常量值,并使用视频标准枚举类型StdVideoH265PictureType来编码特定类型的图像。

  • STD_VIDEO_H265_PICTURE_TYPE_P表示该图像为P帧。一个由P帧组成的帧也称为P帧

  • STD_VIDEO_H265_PICTURE_TYPE_B表示该图像为B帧。一个由B帧组成的帧也称为B帧

  • STD_VIDEO_H265_PICTURE_TYPE_I表示该图像为I帧。一个由I帧组成的帧也称为I帧

  • STD_VIDEO_H265_PICTURE_TYPE_IDR表示该图像为一种特殊的I帧,称为IDR帧,如ITU-T H.265规范的3.67节所定义。一个由IDR帧组成的帧也称为IDR帧

H.265编码块

H.265编码支持两种类型的编码块

H.265编码配置文件

通过将VkVideoProfileInfoKHR::videoCodecOperation设置为VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR,并将VkVideoEncodeH265ProfileInfoKHR结构添加到VkVideoProfileInfoKHR::pNext链中,可以指定支持H.265视频编码操作的视频配置文件。

VkVideoEncodeH265ProfileInfoKHR结构的定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265ProfileInfoKHR {
    VkStructureType           sType;
    const void*               pNext;
    StdVideoH265ProfileIdc    stdProfileIdc;
} VkVideoEncodeH265ProfileInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdProfileIdc 是一个 StdVideoH265ProfileIdc 值,指定 H.265 编解码器配置文件 IDC,如 ITU-T H.265 规范 的 A.3 节中所定义。

有效用法(隐式)
  • VUID-VkVideoEncodeH265ProfileInfoKHR-sType-sType
    sType必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR

H.265编码能力

当调用vkGetPhysicalDeviceVideoCapabilitiesKHR查询H.265编码配置文件的能力时,VkVideoCapabilitiesKHR::pNext必须包含一个VkVideoEncodeH265CapabilitiesKHR结构,该结构将填充特定于配置文件的能力。

VkVideoEncodeH265CapabilitiesKHR结构的定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265CapabilitiesKHR {
    VkStructureType                                sType;
    void*                                          pNext;
    VkVideoEncodeH265CapabilityFlagsKHR            flags;
    StdVideoH265LevelIdc                           maxLevelIdc;
    uint32_t                                       maxSliceSegmentCount;
    VkExtent2D                                     maxTiles;
    VkVideoEncodeH265CtbSizeFlagsKHR               ctbSizes;
    VkVideoEncodeH265TransformBlockSizeFlagsKHR    transformBlockSizes;
    uint32_t                                       maxPPictureL0ReferenceCount;
    uint32_t                                       maxBPictureL0ReferenceCount;
    uint32_t                                       maxL1ReferenceCount;
    uint32_t                                       maxSubLayerCount;
    VkBool32                                       expectDyadicTemporalSubLayerPattern;
    int32_t                                        minQp;
    int32_t                                        maxQp;
    VkBool32                                       prefersGopRemainingFrames;
    VkBool32                                       requiresGopRemainingFrames;
    VkVideoEncodeH265StdFlagsKHR                   stdSyntaxFlags;
} VkVideoEncodeH265CapabilitiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags是一个VkVideoEncodeH265CapabilityFlagBitsKHR的位掩码,指示支持的H.265编码能力。

  • maxLevelIdc 是一个 StdVideoH265LevelIdc 值,表示配置文件支持的最大 H.265 级别,其中枚举常量 STD_VIDEO_H265_LEVEL_IDC_<major>_<minor> 标识 H.265 级别 <major>.<minor>,如 ITU-T H.265 规范 的 A.4 节中所定义。

  • maxSliceSegmentCount指示单个图像可以编码的最大切片片段数。根据其他能力和编解码器特定的规则,对于单个图像可以编码的切片片段数量可能会有限制。

  • maxTiles指示单个图像可以编码的最大H.265图块列数和行数,如ITU-T H.265规范的3.175和3.176节所定义。根据其他能力和编解码器特定的规则,对于单个图像可以编码的H.265图块数量可能会有限制。

  • ctbSizes是一个VkVideoEncodeH265CtbSizeFlagBitsKHR的位掩码,描述支持的CTB大小。

  • transformBlockSizes是一个VkVideoEncodeH265TransformBlockSizeFlagBitsKHR的位掩码,描述支持的变换块大小。

  • maxPPictureL0ReferenceCount指示实现对P帧的参考列表L0中支持的最大参考帧数量。

    由于实现可能覆盖参考列表,maxPPictureL0ReferenceCount不会限制应用程序在P帧的L0参考列表中可以指定的元素数量。但是,如果maxPPictureL0ReferenceCount为零,则不允许使用P帧。在H.265编码的情况下,即使不支持P帧,也可以仅使用前向预测对图像进行编码,因为ITU-T H.265规范支持广义P和B帧(也称为低延迟B帧),而B帧可以通过L0和L1参考列表引用过去的帧。

  • maxBPictureL0ReferenceCount指示实现对B帧的参考列表L0中支持的最大参考帧数量。

  • maxL1ReferenceCount指示如果支持B帧的编码,则实现对参考列表L1中支持的最大参考帧数量。

    由于实现可能 覆盖参考列表,maxBPictureL0ReferenceCountmaxL1ReferenceCount 不限制应用程序可以为 B 图像在 L0 和 L1 参考列表中指定元素的数量。但是,如果 maxBPictureL0ReferenceCountmaxL1ReferenceCount 均为零,则不允许使用 B 图像。

  • maxSubLayerCount指示实现支持的最大H.265子层数。

  • expectDyadicTemporalSubLayerPattern指示实现的速率控制算法希望应用程序在编码多个时间子层时使用二元时间子层模式

  • minQp 指示支持的最小 QP 值。

  • maxQp 指示支持的最大 QP 值。

  • prefersGopRemainingFrames指示实现的速率控制算法希望应用程序在开始视频编码范围时指定当前图像组中每种类型剩余的帧数。

  • requiresGopRemainingFrames指示实现的速率控制算法要求应用程序在开始视频编码范围时指定当前图像组中每种类型剩余的帧数。

  • stdSyntaxFlags是一个VkVideoEncodeH265StdFlagBitsKHR的位掩码,指示与H.265语法元素相关的能力。

有效用法(隐式)
  • VUID-VkVideoEncodeH265CapabilitiesKHR-sType-sType
    sType必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR

可以在VkVideoEncodeH265CapabilitiesKHR::flags中设置的位,指示支持的H.265编码能力,如下所示:

// Provided by VK_KHR_video_encode_h265
typedef enum VkVideoEncodeH265CapabilityFlagBitsKHR {
    VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_H265_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_SLICE_SEGMENT_TYPE_BIT_KHR = 0x00000008,
    VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR = 0x00000010,
    VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR = 0x00000020,
    VK_VIDEO_ENCODE_H265_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR = 0x00000040,
    VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR = 0x00000080,
    VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILES_PER_SLICE_SEGMENT_BIT_KHR = 0x00000100,
    VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_SEGMENTS_PER_TILE_BIT_KHR = 0x00000200,
  // Provided by VK_KHR_video_encode_h265 with VK_KHR_video_encode_quantization_map
    VK_VIDEO_ENCODE_H265_CAPABILITY_CU_QP_DIFF_WRAPAROUND_BIT_KHR = 0x00000400,
} VkVideoEncodeH265CapabilityFlagBitsKHR;
  • VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_KHR指定如果在活动VPS活动SPS的HRD参数中,StdVideoH265HrdFlags的任何nal_hrd_parameters_present_flagvcl_hrd_parameters_present_flagsub_pic_hrd_params_present_flag成员设置为1,或者如果在活动SPS中,StdVideoH265SpsVuiFlags::vui_hrd_parameters_present_flag设置为1,则该实现可能能够生成符合HRD标准的比特流。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR 指定,如果 活动 PPSStdVideoH265PpsFlagsweighted_pred_flagweighted_bipred_flag 成员在编码 P 帧B 帧 时分别设置为 1,则实现能够内部决定 ITU-T H.265 规范 第 7.4.7.3 节中定义的 pred_weight_table 的语法,并且应用无需H.265 片段头参数 中提供权重表。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_KHR 指定,帧中每个切片片段(每个切片包含一个或多个瓦片)可以在 CTB 行中的任意偏移处开始或结束。如果不支持,则此类帧中的所有切片片段必须在 CTB 行的开头开始(因此每个切片片段必须在 CTB 行的末尾结束)。还指示每个切片片段(每个瓦片包含多个切片)可以在封闭瓦片的 CTB 行内的任意偏移处开始或结束。如果不支持,则此类帧中的切片片段必须在封闭瓦片的 CTB 行的开头开始(因此每个切片片段必须在封闭瓦片的 CTB 行的末尾结束)。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_SLICE_SEGMENT_TYPE_BIT_KHR 指定,当使用多个切片片段编码帧时,实现允许使用 H.265 片段头参数 中指定的不同 StdVideoEncodeH265SliceSegmentHeader::slice_type 编码每个切片片段。如果不支持,则帧的所有切片片段必须使用与帧的图像类型对应的相同 slice_type 进行编码。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR 指定支持使用 B 帧 作为 L0 参考,如 H.265 图像信息StdVideoEncodeH265ReferenceListsInfo::RefPicList0 所指定。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR 指定支持使用 B 帧 作为 L1 参考,如 H.265 图像信息StdVideoEncodeH265ReferenceListsInfo::RefPicList1 所指定。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR 指定支持在 VkVideoEncodeH265QpKHR 的成员中指定不同的 QP 值。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR 指定支持为每个切片片段指定不同的恒定 QP 值。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILES_PER_SLICE_SEGMENT_BIT_KHR 指定是否支持每个切片片段编码多个瓦片,如 ITU-T H.265 规范 第 6.3.1 节中所定义。如果此功能标志不存在,则实现只能为每个切片片段编码单个瓦片。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_SEGMENTS_PER_TILE_BIT_KHR 指定是否支持每个瓦片编码多个切片片段,如 ITU-T H.265 规范 第 6.3.1 节中所定义。如果此功能标志不存在,则实现只能为每个瓦片编码单个切片片段。

  • VK_VIDEO_ENCODE_H265_CAPABILITY_CU_QP_DIFF_WRAPAROUND_BIT_KHR 指示支持在计算后续编码单元的 QP 值期间进行回绕,如 ITU-T H.265 规范 第 7.4.9.14 节中所定义。如果不支持,则 ITU-T H.265 规范 的等式 8-283 有效地简化为以下形式:

    QpY = qPY_PRED + CuQpDeltaVal

    这样做的效果是,后续编码单元的最大 QP 差值被限制在 [-(26 + QpBdOffsetY / 2), 25 + QpBdOffsetY / 2] 范围内。

// Provided by VK_KHR_video_encode_h265
typedef VkFlags VkVideoEncodeH265CapabilityFlagsKHR;

VkVideoEncodeH265CapabilityFlagsKHR 是一种位掩码类型,用于设置零个或多个 VkVideoEncodeH265CapabilityFlagBitsKHR 的掩码。

VkVideoEncodeH265CapabilitiesKHR::stdSyntaxFlags可能设置的位,指示与 H.265 语法元素相关的功能,包括:

// Provided by VK_KHR_video_encode_h265
typedef enum VkVideoEncodeH265StdFlagBitsKHR {
    VK_VIDEO_ENCODE_H265_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_H265_STD_SCALING_LIST_DATA_PRESENT_FLAG_SET_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_H265_STD_PCM_ENABLED_FLAG_SET_BIT_KHR = 0x00000008,
    VK_VIDEO_ENCODE_H265_STD_SPS_TEMPORAL_MVP_ENABLED_FLAG_SET_BIT_KHR = 0x00000010,
    VK_VIDEO_ENCODE_H265_STD_INIT_QP_MINUS26_BIT_KHR = 0x00000020,
    VK_VIDEO_ENCODE_H265_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR = 0x00000040,
    VK_VIDEO_ENCODE_H265_STD_WEIGHTED_BIPRED_FLAG_SET_BIT_KHR = 0x00000080,
    VK_VIDEO_ENCODE_H265_STD_LOG2_PARALLEL_MERGE_LEVEL_MINUS2_BIT_KHR = 0x00000100,
    VK_VIDEO_ENCODE_H265_STD_SIGN_DATA_HIDING_ENABLED_FLAG_SET_BIT_KHR = 0x00000200,
    VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR = 0x00000400,
    VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_UNSET_BIT_KHR = 0x00000800,
    VK_VIDEO_ENCODE_H265_STD_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG_SET_BIT_KHR = 0x00001000,
    VK_VIDEO_ENCODE_H265_STD_TRANSQUANT_BYPASS_ENABLED_FLAG_SET_BIT_KHR = 0x00002000,
    VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR = 0x00004000,
    VK_VIDEO_ENCODE_H265_STD_ENTROPY_CODING_SYNC_ENABLED_FLAG_SET_BIT_KHR = 0x00008000,
    VK_VIDEO_ENCODE_H265_STD_DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG_SET_BIT_KHR = 0x00010000,
    VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG_SET_BIT_KHR = 0x00020000,
    VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENT_FLAG_SET_BIT_KHR = 0x00040000,
    VK_VIDEO_ENCODE_H265_STD_SLICE_QP_DELTA_BIT_KHR = 0x00080000,
    VK_VIDEO_ENCODE_H265_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR = 0x00100000,
} VkVideoEncodeH265StdFlagBitsKHR;
  • VK_VIDEO_ENCODE_H265_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR 指定当 StdVideoH265SpsFlags::separate_colour_plane_flagSPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR 指定当 StdVideoH265SpsFlags::sample_adaptive_offset_enabled_flagSPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_SCALING_LIST_DATA_PRESENT_FLAG_SET_BIT_KHR 指定当 SPSStdVideoH265SpsFlagsscaling_list_enabled_flagsps_scaling_list_data_present_flag 成员以及 PPSStdVideoH265PpsFlags::pps_scaling_list_data_present_flag 成员的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_PCM_ENABLED_FLAG_SET_BIT_KHR 指定当 StdVideoH265SpsFlags::pcm_enable_flagSPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_SPS_TEMPORAL_MVP_ENABLED_FLAG_SET_BIT_KHR 指定当 StdVideoH265SpsFlags::sps_temporal_mvp_enabled_flagSPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_INIT_QP_MINUS26_BIT_KHR 指定当 PPSStdVideoH265PictureParameterSet::init_qp_minus26 的值为非零值时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR 指定当 StdVideoH265PpsFlags::weighted_pred_flagPPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_WEIGHTED_BIPRED_FLAG_SET_BIT_KHR 指定当 StdVideoH265PpsFlags::weighted_bipred_flagPPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_LOG2_PARALLEL_MERGE_LEVEL_MINUS2_BIT_KHR 指定当 PPSStdVideoH265PictureParameterSet::log2_parallel_merge_level_minus2 的值为非零值时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_SIGN_DATA_HIDING_ENABLED_FLAG_SET_BIT_KHR 指定当 StdVideoH265PpsFlags::sign_data_hiding_enabled_flagPPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR 指定当 StdVideoH265PpsFlags::transform_skip_enabled_flagPPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_UNSET_BIT_KHR 指定当 StdVideoH265PpsFlags::transform_skip_enabled_flagPPS 中的值为 0 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG_SET_BIT_KHR 指定当 StdVideoH265PpsFlags::pps_slice_chroma_qp_offsets_present_flagPPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_TRANSQUANT_BYPASS_ENABLED_FLAG_SET_BIT_KHR 指定当 StdVideoH265PpsFlags::transquant_bypass_enabled_flagPPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR 指定当 StdVideoH265PpsFlags::constrained_intra_pred_flagPPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_ENTROPY_CODING_SYNC_ENABLED_FLAG_SET_BIT_KHR 指定当 StdVideoH265PpsFlags::entropy_coding_sync_enabled_flagPPS 中的值为 1 时,实现是否支持使用应用程序提供的值。

  • VK_VIDEO_ENCODE_H265_STD_DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG_SET_BIT_KHR 指定了实现是否支持在 PPS 中使用应用程序提供的 StdVideoH265PpsFlags::deblocking_filter_override_enabled_flag 值,当该值为 1 时。

  • VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG_SET_BIT_KHR 指定了实现是否支持在 PPS 中使用应用程序提供的 StdVideoH265PpsFlags::dependent_slice_segments_enabled_flag 值,当该值为 1 时。

  • VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENT_FLAG_SET_BIT_KHR 指定了实现是否支持在 H.265 切片分段头参数 中使用应用程序提供的 StdVideoEncodeH265SliceSegmentHeader::dependent_slice_segment_flag 值,当该值为 1 时。

  • VK_VIDEO_ENCODE_H265_STD_SLICE_QP_DELTA_BIT_KHR 指定了实现是否支持在 H.265 切片分段头参数 中使用应用程序提供的 StdVideoEncodeH265SliceSegmentHeader::slice_qp_delta 值,当该值在编码帧的切片分段中相同时。

  • VK_VIDEO_ENCODE_H265_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR 指定了实现是否支持在 H.265 切片分段头参数 中使用应用程序提供的 StdVideoEncodeH265SliceSegmentHeader::slice_qp_delta 值,当该值在编码帧的切片分段中不同时。

这些能力标志为应用程序提供了关于实现支持的特定 H.265 语法元素值的信息,而无需覆盖它们,并且不会以其他方式限制应用程序可以为任何提及的 H.265 语法元素指定的值。

// Provided by VK_KHR_video_encode_h265
typedef VkFlags VkVideoEncodeH265StdFlagsKHR;

VkVideoEncodeH265StdFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeH265StdFlagBitsKHR 的掩码。

VkVideoEncodeH265CapabilitiesKHR::ctbSizes可以设置的位,指示实现支持的 CTB 大小,是

// Provided by VK_KHR_video_encode_h265
typedef enum VkVideoEncodeH265CtbSizeFlagBitsKHR {
    VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR = 0x00000004,
} VkVideoEncodeH265CtbSizeFlagBitsKHR;
  • VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_KHR 指定支持 16x16 的 CTB 大小。

  • VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR 指定支持 32x32 的 CTB 大小。

  • VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR 指定支持 64x64 的 CTB 大小。

// Provided by VK_KHR_video_encode_h265
typedef VkFlags VkVideoEncodeH265CtbSizeFlagsKHR;

VkVideoEncodeH265CtbSizeFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeH265CtbSizeFlagBitsKHR 的掩码。

实现必须支持至少一个 VkVideoEncodeH265CtbSizeFlagBitsKHR

VkVideoEncodeH265CapabilitiesKHR::transformBlockSizes可以设置的位,指示实现支持的变换块大小,是

// Provided by VK_KHR_video_encode_h265
typedef enum VkVideoEncodeH265TransformBlockSizeFlagBitsKHR {
    VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR = 0x00000008,
} VkVideoEncodeH265TransformBlockSizeFlagBitsKHR;
  • VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR 指定支持 4x4 的变换块大小。

  • VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR 指定支持 8x8 的变换块大小。

  • VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR 指定支持 16x16 的变换块大小。

  • VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR 指定支持 32x32 的变换块大小。

// Provided by VK_KHR_video_encode_h265
typedef VkFlags VkVideoEncodeH265TransformBlockSizeFlagsKHR;

VkVideoEncodeH265TransformBlockSizeFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeH265TransformBlockSizeFlagBitsKHR 的掩码。

实现必须支持至少一个 VkVideoEncodeH265TransformBlockSizeFlagBitsKHR

H.265 编码质量级别属性

当使用 pVideoProfile->videoCodecOperation 指定为 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 调用 vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR 时,VkVideoEncodeH265QualityLevelPropertiesKHR 结构必须包含在 VkVideoEncodeQualityLevelPropertiesKHR 结构的 pNext 链中,以检索特定于 H.265 编码的额外视频编码质量级别属性。

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265QualityLevelPropertiesKHR {
    VkStructureType                         sType;
    void*                                   pNext;
    VkVideoEncodeH265RateControlFlagsKHR    preferredRateControlFlags;
    uint32_t                                preferredGopFrameCount;
    uint32_t                                preferredIdrPeriod;
    uint32_t                                preferredConsecutiveBFrameCount;
    uint32_t                                preferredSubLayerCount;
    VkVideoEncodeH265QpKHR                  preferredConstantQp;
    uint32_t                                preferredMaxL0ReferenceCount;
    uint32_t                                preferredMaxL1ReferenceCount;
} VkVideoEncodeH265QualityLevelPropertiesKHR;
有效用法(隐式)
  • VUID-VkVideoEncodeH265QualityLevelPropertiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUALITY_LEVEL_PROPERTIES_KHR

H.265 编码会话

在创建具有 H.265 编码配置文件的视频会话时,可以通过在 VkVideoSessionCreateInfoKHRpNext 链中包含 VkVideoEncodeH265SessionCreateInfoKHR 结构的实例来指定其他参数。

VkVideoEncodeH265SessionCreateInfoKHR 结构定义如下

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265SessionCreateInfoKHR {
    VkStructureType         sType;
    const void*             pNext;
    VkBool32                useMaxLevelIdc;
    StdVideoH265LevelIdc    maxLevelIdc;
} VkVideoEncodeH265SessionCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • useMaxLevelIdc 指示实现是否应使用 maxLevelIdc 的值。当它是 VK_FALSE 时,实现会忽略 maxLevelIdc 的值,并使用 VkVideoEncodeH265CapabilitiesKHR::maxLevelIdc 的值,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为视频配置文件报告的那样。

  • maxLevelIdc 是一个 StdVideoH265LevelIdc 值,指定创建的视频会话生成的视频比特流的 H.265 级别的上限,其中枚举常量 STD_VIDEO_H265_LEVEL_IDC_<major>_<minor> 标识 ITU-T H.265 规范 A.4 节中定义的 H.265 级别 <major>.<minor>

有效用法(隐式)
  • VUID-VkVideoEncodeH265SessionCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_KHR

H.265 编码参数集

使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的视频会话参数对象可以包含以下类型的参数

H.265 视频参数集 (VPS)

StdVideoH265VideoParameterSet 结构表示,并按如下方式解释:

  • reserved1reserved2reserved3 仅用于填充目的,否则将被忽略;

  • vps_video_parameter_set_id 用作 VPS 条目的键;

  • pDecPicBufMgr 指向的 StdVideoH265DecPicBufMgr 结构的 max_latency_increase_plus1max_dec_pic_buffering_minus1max_num_reorder_pics 成员分别对应于 vps_max_latency_increase_plus1vps_max_dec_pic_buffering_minus1vps_max_num_reorder_pics,如 ITU-T H.265 规范 的 7.4.3.1 节中所定义;

  • pHrdParameters 指向的 StdVideoH265HrdParameters 结构按如下方式解释:

    • reserved 仅用于填充目的,否则将被忽略;

    • flags.fixed_pic_rate_general_flag 是一个位掩码,其中位索引 i 对应于 fixed_pic_rate_general_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

    • flags.fixed_pic_rate_within_cvs_flag 是一个位掩码,其中位索引 i 对应于 fixed_pic_rate_within_cvs_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

    • flags.low_delay_hrd_flag 是一个位掩码,其中位索引 i 对应于 low_delay_hrd_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

    • 如果设置了 flags.nal_hrd_parameters_present_flag,则 pSubLayerHrdParametersNal 是一个指向 vps_max_sub_layers_minus1 + 1StdVideoH265SubLayerHrdParameters 结构数组的指针,其中 vps_max_sub_layers_minus1 是包含此结构的 StdVideoH265VideoParameterSet 结构的对应成员,并且每个元素按如下方式解释:

      • cbr_flag 是一个位掩码,其中位索引 i 对应于 cbr_flag[i],如 ITU-T H.265 规范 的 E.3.3 节中所定义;

      • StdVideoH265SubLayerHrdParameters 结构的所有其他成员都按照 ITU-T H.265 规范 的 E.3.3 节中的定义进行解释;

    • 如果设置了 flags.vcl_hrd_parameters_present_flag,则 pSubLayerHrdParametersVcl 是一个指向 vps_max_sub_layers_minus1 + 1StdVideoH265SubLayerHrdParameters 结构数组的指针,其中 vps_max_sub_layers_minus1 是包含此结构的 StdVideoH265VideoParameterSet 结构的对应成员,并且每个元素按如下方式解释:

      • cbr_flag 是一个位掩码,其中位索引 i 对应于 cbr_flag[i],如 ITU-T H.265 规范 的 E.3.3 节中所定义;

      • StdVideoH265SubLayerHrdParameters 结构的所有其他成员都按照 ITU-T H.265 规范 的 E.3.3 节中的定义进行解释;

    • StdVideoH265HrdParameters 的所有其他成员都按照 ITU-T H.265 规范 的 E.3.2 节中的定义进行解释;

  • pProfileTierLevel 指向的 StdVideoH265ProfileTierLevel 结构按如下方式解释:

    • general_level_idc 是枚举常量 STD_VIDEO_H265_LEVEL_IDC_<major>_<minor> 之一,用于标识 H.265 级别 <major>.<minor>,如 ITU-T H.265 规范 的 A.4 节中所定义;

    • StdVideoH265ProfileTierLevel 的所有其他成员都按照 ITU-T H.265 规范 的 7.4.4 节中的定义进行解释;

  • StdVideoH265VideoParameterSet 的所有其他成员都按照 ITU-T H.265 规范 的 7.4.3.1 节中的定义进行解释。

H.265 序列参数集 (SPS)

StdVideoH265SequenceParameterSet 结构表示,并按如下方式解释:

  • reserved1reserved2 仅用于填充目的,否则将被忽略;

  • sps_video_parameter_set_idsps_seq_parameter_set_id 构造的对用作 SPS 条目的键;

  • pProfileTierLevel 指向的 StdVideoH265ProfileTierLevel 结构按如下方式解释:

    • general_level_idc 是枚举常量 STD_VIDEO_H265_LEVEL_IDC_<major>_<minor> 之一,用于标识 H.265 级别 <major>.<minor>,如 ITU-T H.265 规范 的 A.4 节中所定义;

    • StdVideoH265ProfileTierLevel 的所有其他成员都按照 ITU-T H.265 规范 的 7.4.4 节中的定义进行解释;

  • pDecPicBufMgr 指向的 StdVideoH265DecPicBufMgr 结构的 max_latency_increase_plus1max_dec_pic_buffering_minus1max_num_reorder_pics 成员分别对应于 sps_max_latency_increase_plus1sps_max_dec_pic_buffering_minus1sps_max_num_reorder_pics,如 ITU-T H.265 规范 的 7.4.3.2 节中所定义;

  • 如果设置了 flags.sps_scaling_list_data_present_flag,则 pScalingLists 指向的 StdVideoH265ScalingLists 结构按如下方式解释:

    • ScalingList4x4ScalingList8x8ScalingList16x16ScalingList32x32 分别对应于 ScalingList[0]ScalingList[1]ScalingList[2]ScalingList[3],如 ITU-T H.265 规范 的 7.3.4 节中所定义;

    • ScalingListDCCoef16x16ScalingListDCCoef32x32 分别对应于 scaling_list_dc_coef_minus8[0]scaling_list_dc_coef_minus8[1],如 ITU-T H.265 规范 的 7.3.4 节中所定义;

  • pShortTermRefPicSet 是一个指向 num_short_term_ref_pic_setsStdVideoH265ShortTermRefPicSet 结构数组的指针,其中每个元素按如下方式解释:

    • reserved1reserved2reserved3 仅用于填充目的,否则将被忽略;

    • used_by_curr_pic_flag 是一个位掩码,其中位索引 i 对应于 used_by_curr_pic_flag[i],如 ITU-T H.265 规范 的 7.4.8 节中所定义;

    • use_delta_flag 是一个位掩码,其中位索引 i 对应于 use_delta_flag[i],如 ITU-T H.265 规范 的 7.4.8 节中所定义;

    • used_by_curr_pic_s0_flag 是一个位掩码,其中位索引 i 对应于 used_by_curr_pic_s0_flag[i],如 ITU-T H.265 规范 的 7.4.8 节中所定义;

    • used_by_curr_pic_s1_flag 是一个位掩码,其中位索引 i 对应于 used_by_curr_pic_s1_flag[i],如 ITU-T H.265 规范 的 7.4.8 节中所定义;

    • StdVideoH265ShortTermRefPicSet 的所有其他成员都按照 ITU-T H.265 规范 的 7.4.8 节中的定义进行解释;

  • 如果设置了 flags.long_term_ref_pics_present_flag,则 pLongTermRefPicsSps 指向的 StdVideoH265LongTermRefPicsSps 结构按如下方式解释:

    • used_by_curr_pic_lt_sps_flag 是一个位掩码,其中位索引 i 对应于 ITU-T H.265 规范的 7.4.3.2 节中定义的 used_by_curr_pic_lt_sps_flag[i]

    • StdVideoH265LongTermRefPicsSps 的所有其他成员的解释均按照 ITU-T H.265 规范的 7.4.3.2 节中的定义;

  • 如果设置了 flags.vui_parameters_present_flag,则由 pSequenceParameterSetVui 指向的 StdVideoH265SequenceParameterSetVui 结构的解释如下

    • reserved1reserved2reserved3 仅用于填充目的,否则将被忽略;

    • pHrdParameters 指向的 StdVideoH265HrdParameters 结构按如下方式解释:

      • flags.fixed_pic_rate_general_flag 是一个位掩码,其中位索引 i 对应于 fixed_pic_rate_general_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

      • flags.fixed_pic_rate_within_cvs_flag 是一个位掩码,其中位索引 i 对应于 fixed_pic_rate_within_cvs_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

      • flags.low_delay_hrd_flag 是一个位掩码,其中位索引 i 对应于 low_delay_hrd_flag[i],如 ITU-T H.265 规范 的 E.3.2 节中所定义;

      • 如果设置了 flags.nal_hrd_parameters_present_flag,则 pSubLayerHrdParametersNal 是一个指向 sps_max_sub_layers_minus1 + 1StdVideoH265SubLayerHrdParameters 结构数组的指针,其中 sps_max_sub_layers_minus1 是包含它的 StdVideoH265SequenceParameterSet 结构的对应成员,并且每个元素的解释如下

        • cbr_flag 是一个位掩码,其中位索引 i 对应于 cbr_flag[i],如 ITU-T H.265 规范 的 E.3.3 节中所定义;

        • StdVideoH265SubLayerHrdParameters 结构的所有其他成员都按照 ITU-T H.265 规范 的 E.3.3 节中的定义进行解释;

      • 如果设置了 flags.vcl_hrd_parameters_present_flag,则 pSubLayerHrdParametersVcl 是一个指向 sps_max_sub_layers_minus1 + 1StdVideoH265SubLayerHrdParameters 结构数组的指针,其中 sps_max_sub_layers_minus1 是包含它的 StdVideoH265SequenceParameterSet 结构的对应成员,并且每个元素的解释如下

        • cbr_flag 是一个位掩码,其中位索引 i 对应于 cbr_flag[i],如 ITU-T H.265 规范 的 E.3.3 节中所定义;

        • StdVideoH265SubLayerHrdParameters 结构的所有其他成员都按照 ITU-T H.265 规范 的 E.3.3 节中的定义进行解释;

      • StdVideoH265HrdParameters 的所有其他成员都按照 ITU-T H.265 规范 的 E.3.2 节中的定义进行解释;

    • pSequenceParameterSetVui 的所有其他成员的解释均按照 ITU-T H.265 规范的 E.3.1 节中的定义;

  • 如果设置了 flags.sps_palette_predictor_initializer_present_flag,则由 pPredictorPaletteEntries 指向的 StdVideoH265PredictorPaletteEntries 结构的 PredictorPaletteEntries 成员的解释均按照 ITU-T H.265 规范的 7.4.9.13 节中的定义;

  • StdVideoH265SequenceParameterSet 的所有其他成员的解释均按照 ITU-T H.265 规范的 7.4.3.1 节中的定义。

H.265 图像参数集 (PPS)

StdVideoH265PictureParameterSet 结构表示,并解释如下

  • reserved1reserved2reserved3 仅用于填充目的,否则将被忽略;

  • sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 构成的三元组用作 PPS 条目的键;

  • 如果设置了 flags.pps_scaling_list_data_present_flag,则由 pScalingLists 指向的 StdVideoH265ScalingLists 结构的解释如下

    • ScalingList4x4ScalingList8x8ScalingList16x16ScalingList32x32 分别对应于 ScalingList[0]ScalingList[1]ScalingList[2]ScalingList[3],如 ITU-T H.265 规范 的 7.3.4 节中所定义;

    • ScalingListDCCoef16x16ScalingListDCCoef32x32 分别对应于 scaling_list_dc_coef_minus8[0]scaling_list_dc_coef_minus8[1],如 ITU-T H.265 规范 的 7.3.4 节中所定义;

  • 如果设置了 flags.pps_palette_predictor_initializer_present_flag,则由 pPredictorPaletteEntries 指向的 StdVideoH265PredictorPaletteEntries 结构的 PredictorPaletteEntries 成员的解释均按照 ITU-T H.265 规范的 7.4.9.13 节中的定义;

  • StdVideoH265PictureParameterSet 的所有其他成员的解释均按照 ITU-T H.265 规范的 7.4.3.3 节中的定义。

实现可能会根据视频编码参数覆盖部分中定义的语义覆盖这些参数中的任何一个,然后再将生成的 H.265 参数集存储到视频会话参数对象中。应用程序需要使用 vkGetEncodedVideoSessionParametersKHR 命令来确定是否发生了任何实现覆盖,并检索编码的 H.265 参数集,以便能够生成符合标准的 H.265 视频比特流。

这种 H.265 参数集覆盖可能还会对应用于视频编码操作生成的编码比特流的实现覆盖产生级联影响。如果实现支持 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR 视频编码反馈查询标志,则应用程序可以使用此类查询来检索有关是否已将任何实现覆盖应用于编码比特流的反馈。

当使用编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建视频会话参数对象时,VkVideoSessionParametersCreateInfoKHR::pNext必须包含一个 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构体,该结构体指定对象的容量和初始内容。

VkVideoEncodeH265SessionParametersCreateInfoKHR 结构体的定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265SessionParametersCreateInfoKHR {
    VkStructureType                                        sType;
    const void*                                            pNext;
    uint32_t                                               maxStdVPSCount;
    uint32_t                                               maxStdSPSCount;
    uint32_t                                               maxStdPPSCount;
    const VkVideoEncodeH265SessionParametersAddInfoKHR*    pParametersAddInfo;
} VkVideoEncodeH265SessionParametersCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • maxStdVPSCount 是创建的 VkVideoSessionParametersKHR 可以包含的最大 H.265 VPS 条目数。

  • maxStdSPSCount 是创建的 VkVideoSessionParametersKHR 可以包含的最大 H.265 SPS 条目数。

  • maxStdPPSCount 是创建的 VkVideoSessionParametersKHR 可以包含的最大 H.265 PPS 条目数。

  • pParametersAddInfoNULL 或者指向 VkVideoEncodeH265SessionParametersAddInfoKHR 结构体的指针,该结构体指定在对象创建时要添加的 H.265 参数。

有效用法(隐式)
  • VUID-VkVideoEncodeH265SessionParametersCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR

  • VUID-VkVideoEncodeH265SessionParametersCreateInfoKHR-pParametersAddInfo-parameter
    如果 pParametersAddInfo 不为 NULL,则 pParametersAddInfo 必须是指向有效的 VkVideoEncodeH265SessionParametersAddInfoKHR 结构体的有效指针。

VkVideoEncodeH265SessionParametersAddInfoKHR 结构体的定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265SessionParametersAddInfoKHR {
    VkStructureType                            sType;
    const void*                                pNext;
    uint32_t                                   stdVPSCount;
    const StdVideoH265VideoParameterSet*       pStdVPSs;
    uint32_t                                   stdSPSCount;
    const StdVideoH265SequenceParameterSet*    pStdSPSs;
    uint32_t                                   stdPPSCount;
    const StdVideoH265PictureParameterSet*     pStdPPSs;
} VkVideoEncodeH265SessionParametersAddInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdVPSCountpStdVPSs 数组中的元素数量。

  • pStdVPSs 是一个指向 StdVideoH265VideoParameterSet 结构体数组的指针,该数组描述要添加的 H.265 VPS 条目。

  • stdSPSCountpStdSPSs 数组中的元素数量。

  • pStdSPSs 是一个指向 StdVideoH265SequenceParameterSet 结构体数组的指针,该数组描述要添加的 H.265 SPS 条目。

  • stdPPSCountpStdPPSs 数组中的元素数量。

  • pStdPPSs 是一个指向 StdVideoH265PictureParameterSet 结构体数组的指针,该数组描述要添加的 H.265 PPS 条目。

此结构可以在以下位置指定:

有效用法(隐式)
  • VUID-VkVideoEncodeH265SessionParametersAddInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR

  • VUID-VkVideoEncodeH265SessionParametersAddInfoKHR-pStdVPSs-parameter
    如果 stdVPSCount 不为 0,并且 pStdVPSs 不为 NULL,则 pStdVPSs 必须是指向 stdVPSCountStdVideoH265VideoParameterSet 值的数组的有效指针。

  • VUID-VkVideoEncodeH265SessionParametersAddInfoKHR-pStdSPSs-parameter
    如果 stdSPSCount 不为 0,并且 pStdSPSs 不为 NULL,则 pStdSPSs 必须是指向 stdSPSCountStdVideoH265SequenceParameterSet 值的数组的有效指针。

  • VUID-VkVideoEncodeH265SessionParametersAddInfoKHR-pStdPPSs-parameter
    如果 stdPPSCount 不为 0,并且 pStdPPSs 不为 NULL,则 pStdPPSs 必须是指向 stdPPSCountStdVideoH265PictureParameterSet 值的数组的有效指针。

有效用法
  • VUID-VkVideoEncodeH265SessionParametersAddInfoKHR-None-06438
    pStdVPSs 的元素中指定的每个 StdVideoH265VideoParameterSet 结构的 vps_video_parameter_set_id 成员在 pStdVPSs 中**必须**是唯一的

  • VUID-VkVideoEncodeH265SessionParametersAddInfoKHR-None-06439
    pStdSPSs 的元素中指定的每个 StdVideoH265SequenceParameterSet 结构的 sps_video_parameter_set_idsps_seq_parameter_set_id 成员构成的对在 pStdSPSs 中**必须**是唯一的

  • VUID-VkVideoEncodeH265SessionParametersAddInfoKHR-None-06440
    pStdPPSs 的元素中指定的每个 StdVideoH265PictureParameterSet 结构的 sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 成员构成的三元组在 pStdPPSs 中**必须**是唯一的

VkVideoEncodeH265SessionParametersGetInfoKHR 结构体的定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265SessionParametersGetInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkBool32           writeStdVPS;
    VkBool32           writeStdSPS;
    VkBool32           writeStdPPS;
    uint32_t           stdVPSId;
    uint32_t           stdSPSId;
    uint32_t           stdPPSId;
} VkVideoEncodeH265SessionParametersGetInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • writeStdVPS 指示是否请求检索由 stdVPSId 标识的编码后的 H.265 视频参数集

  • writeStdSPS 指示是否请求检索由 stdVPSIdstdSPSId 组成的对标识的编码后的 H.265 序列参数集

  • writeStdPPS 指示是否请求检索由 stdVPSIdstdSPSIdstdPPSId 组成的元组标识的编码后的 H.265 图片参数集

  • stdVPSId 指定用于标识检索到的 H.265 视频、序列和/或图片参数集的 H.265 视频参数集 ID。

  • stdSPSId 指定当 writeStdSPS 和/或 writeStdPPSVK_TRUE 时,用于标识检索到的 H.265 序列和/或图片参数集的 H.265 序列参数集 ID。

  • stdPPSId 指定当 writeStdPPSVK_TRUE 时,用于标识检索到的 H.265 图片参数集的 H.265 图片参数集 ID。

当此结构在传递给 vkGetEncodedVideoSessionParametersKHRVkVideoEncodeSessionParametersGetInfoKHR 结构的 pNext 链中指定时,该命令将按以下顺序将编码的参数数据写入输出缓冲区

  1. stdVPSId 标识的 H.265 视频参数集,如果 writeStdVPSVK_TRUE

  2. stdVPSIdstdSPSId 组成的对标识的 H.265 序列参数集,如果 writeStdSPSVK_TRUE

  3. stdVPSIdstdSPSIdstdPPSId 组成的元组标识的 H.265 图片参数集,如果 writeStdPPSVK_TRUE

有效用法
  • VUID-VkVideoEncodeH265SessionParametersGetInfoKHR-writeStdVPS-08290
    writeStdVPSwriteStdSPSwriteStdPPS 中至少有一个必须VK_TRUE

有效用法(隐式)
  • VUID-VkVideoEncodeH265SessionParametersGetInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR

VkVideoEncodeH265SessionParametersFeedbackInfoKHR 结构体的定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265SessionParametersFeedbackInfoKHR {
    VkStructureType    sType;
    void*              pNext;
    VkBool32           hasStdVPSOverrides;
    VkBool32           hasStdSPSOverrides;
    VkBool32           hasStdPPSOverrides;
} VkVideoEncodeH265SessionParametersFeedbackInfoKHR;
有效用法(隐式)
  • VUID-VkVideoEncodeH265SessionParametersFeedbackInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_FEEDBACK_INFO_KHR

H.265 编码参数

VkVideoEncodeH265PictureInfoKHR 结构体定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265PictureInfoKHR {
    VkStructureType                                    sType;
    const void*                                        pNext;
    uint32_t                                           naluSliceSegmentEntryCount;
    const VkVideoEncodeH265NaluSliceSegmentInfoKHR*    pNaluSliceSegmentEntries;
    const StdVideoEncodeH265PictureInfo*               pStdPictureInfo;
} VkVideoEncodeH265PictureInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • naluSliceSegmentEntryCountpNaluSliceSegmentEntries 中的元素数量。

  • pNaluSliceSegmentEntries 是一个指向 naluSliceSegmentEntryCountVkVideoEncodeH265NaluSliceSegmentInfoKHR 结构体数组的指针,该数组指定了要为输入图像编码的各个 H.265 片段的参数。

  • pStdPictureInfo 是一个指向 StdVideoEncodeH265PictureInfo 结构的指针,该结构指定了 H.265 图像信息

此结构在传递给 vkCmdEncodeVideoKHRVkVideoEncodeInfoKHR 结构的 pNext 链中指定,用于为 H.265 编码操作 指定编解码器特定的图像信息。

编码输入图片信息

当此结构在传递给 vkCmdEncodeVideoKHRVkVideoEncodeInfoKHR 结构的 pNext 链中指定时,与编码输入图像相关的信息定义如下

标准图像信息

pStdPictureInfo 指向的 StdVideoEncodeH265PictureInfo 结构的成员解释如下:

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • flags.is_reference 的定义见 ITU-T H.265 规范 的 3.132 节;

  • flags.IrapPicFlag,如 ITU-T H.265 规范 的第 3.73 节中定义;

  • flags.used_for_long_term_reference 用于指示该图像是否被标记为“用于长期参考”,如 ITU-T H.265 规范的 8.3.2 节中所定义;

  • flags.discardable_flagcross_layer_bla_flag 的定义见 ITU-T H.265 规范 的 F.7.4.7.1 节;

  • pic_type 的定义见 ITU-T H.265 规范 的 7.4.3.5 节;

  • sps_video_parameter_set_idpps_seq_parameter_set_idpps_pic_parameter_set_id 用于标识活动参数集,如下所述;

  • PicOrderCntVal,如 ITU-T H.265 规范 的第 8.3.1 节中定义;

  • TemporalId 的定义见 ITU-T H.265 规范 的 7.4.2.2 节;

  • 如果 pRefLists 不为 NULL,则它是一个指向 StdVideoEncodeH265ReferenceListsInfo 结构的指针,其解释如下:

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • ref_pic_list_modification_flag_l0ref_pic_list_modification_flag_l1 的定义见 ITU-T H.265 规范 的 7.4.7.2 节;

    • num_ref_idx_l0_active_minus1num_ref_idx_l1_active_minus1 的定义见 ITU-T H.265 规范 的 7.4.7.1 节;

    • RefPicList0RefPicList1 的定义见 ITU-T H.265 规范 的 8.3.4 节,其中这些数组的每个元素使用其 DPB 插槽 索引来标识一个 活动参考图像,或者包含值 STD_VIDEO_H265_NO_REFERENCE_PICTURE 以表示“无参考图像”;

    • list_entry_l0list_entry_l1 的定义见 ITU-T H.265 规范 的 7.4.7.2 节;

  • 如果设置了 flags.short_term_ref_pic_set_sps_flag,则 pShortTermRefPicSet 指向的 StdVideoH265ShortTermRefPicSet 结构的解释与 H.265 序列参数集 中指定的 pShortTermRefPicSet 数组的元素的定义相同。

  • 如果在 活动 SPS 中设置了 flags.long_term_ref_pics_present_flag,则 pLongTermRefPics 指向的 StdVideoEncodeH265LongTermRefPics 结构的解释如下:

    • used_by_curr_pic_lt_flag 是一个位掩码,其中位索引 i 对应于 ITU-T H.265 规范 的 7.4.7.1 节中定义的 used_by_curr_pic_lt_flag[i]

    • StdVideoEncodeH265LongTermRefPics 的所有其他成员的解释均与 ITU-T H.265 规范 的 7.4.7.1 节中的定义相同;

  • 所有其他成员的解释均与 ITU-T H.265 规范 的 7.4.7.1 节中的定义相同。

参考图像的设置由 StdVideoEncodeH265PictureInfo::flags.is_reference 的值控制。如果设置了该值,并且指定了重建图像,则后者将用作图像重建的目标,以激活 pEncodeInfo->pSetupReferenceSlot→slotIndex 中指定的 DPB 插槽。如果未设置 StdVideoEncodeH265PictureInfo::flags.is_reference,但指定了重建图像,则与DPB 插槽关联的相应图像参考将失效,如 DPB 插槽状态 部分所述。

活动参数集

pStdPictureInfo 指向的 StdVideoEncodeH265PictureInfo 结构的成员用于从绑定的视频会话参数对象中选择要使用的活动参数集,如下所示:

  • *活动 VPS* 是由 StdVideoEncodeH265PictureInfo::sps_video_parameter_set_id 中指定的键标识的 VPS

  • *活动 SPS* 是由 StdVideoEncodeH265PictureInfo::sps_video_parameter_set_idStdVideoEncodeH265PictureInfo::pps_seq_parameter_set_id 组成的键对标识的 SPS

  • *活动 PPS* 是由 StdVideoEncodeH265PictureInfo::sps_video_parameter_set_idStdVideoEncodeH265PictureInfo::pps_seq_parameter_set_idStdVideoEncodeH265PictureInfo::pps_pic_parameter_set_id 组成的键三元组标识的 PPS

如果活动 PPSpNaluSliceSegmentEntries 的相应元素的 pStdSliceSegmentHeader 成员满足以下任一条件,则 H.265 编码将对片段使用 *显式加权样本预测*,如 ITU-T H.265 规范 的 8.5.3.3.4 节中定义:

  • pStdSliceSegmentHeader->slice_typeSTD_VIDEO_H265_SLICE_TYPE_P,并且在活动 PPS 中启用了 weighted_pred_flag

  • pStdSliceSegmentHeader->slice_typeSTD_VIDEO_H265_SLICE_TYPE_B,并且在活动 PPS 中启用了 weighted_bipred_flag

H.265 片(如 ITU-T H.265 规范 的 3.174 节中所定义)的数量由活动 PPSnum_tile_columns_minus1num_tile_rows_minus1 成员得出,如下所示:

(num_tile_columns_minus1 + 1) × (num_tile_rows_minus1 + 1)

有效用法
有效用法(隐式)
  • VUID-VkVideoEncodeH265PictureInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PICTURE_INFO_KHR

  • VUID-VkVideoEncodeH265PictureInfoKHR-pNaluSliceSegmentEntries-parameter
    pNaluSliceSegmentEntries 必须是一个有效的指针,指向包含 naluSliceSegmentEntryCount 个有效 VkVideoEncodeH265NaluSliceSegmentInfoKHR 结构的数组。

  • VUID-VkVideoEncodeH265PictureInfoKHR-pStdPictureInfo-parameter
    pStdPictureInfo 必须是一个有效指针,指向一个有效的 StdVideoEncodeH265PictureInfo 值。

  • VUID-VkVideoEncodeH265PictureInfoKHR-naluSliceSegmentEntryCount-arraylength
    naluSliceSegmentEntryCount 必须大于 0

VkVideoEncodeH265NaluSliceSegmentInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265NaluSliceSegmentInfoKHR {
    VkStructureType                                sType;
    const void*                                    pNext;
    int32_t                                        constantQp;
    const StdVideoEncodeH265SliceSegmentHeader*    pStdSliceSegmentHeader;
} VkVideoEncodeH265NaluSliceSegmentInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • 如果为视频会话配置的当前速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 constantQp 是用于切片片段的 QP。

  • pStdSliceSegmentHeader 是指向 StdVideoEncodeH265SliceSegmentHeader 结构的指针,该结构指定切片片段的H.265 切片片段头参数

标准切片片段头参数

pStdSliceSegmentHeader 所指向的 StdVideoEncodeH265SliceSegmentHeader 结构的成员解释如下:

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • 如果 pWeightTable 不为 NULL,则它是指向 StdVideoEncodeH265WeightTable 的指针,其解释如下:

    • flags.luma_weight_l0_flagflags.chroma_weight_l0_flagflags.luma_weight_l1_flagflags.chroma_weight_l1_flag 是位掩码,其中位索引 i 分别对应于 ITU-T H.265 规范第 7.4.7.3 节中定义的 luma_weight_l0_flag[i]chroma_weight_l0_flag[i]luma_weight_l1_flag[i]chroma_weight_l1_flag[i]

    • StdVideoEncodeH265WeightTable 的所有其他成员的解释均如 ITU-T H.265 规范第 7.4.7.3 节中所定义;

  • 所有其他成员的解释均与 ITU-T H.265 规范 的 7.4.7.1 节中的定义相同。

有效用法(隐式)
  • VUID-VkVideoEncodeH265NaluSliceSegmentInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_KHR

  • VUID-VkVideoEncodeH265NaluSliceSegmentInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkVideoEncodeH265NaluSliceSegmentInfoKHR-pStdSliceSegmentHeader-parameter
    pStdSliceSegmentHeader 必须是一个有效指针,指向一个有效的 StdVideoEncodeH265SliceSegmentHeader 值。

VkVideoEncodeH265DpbSlotInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265DpbSlotInfoKHR {
    VkStructureType                           sType;
    const void*                               pNext;
    const StdVideoEncodeH265ReferenceInfo*    pStdReferenceInfo;
} VkVideoEncodeH265DpbSlotInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdReferenceInfo 是指向 StdVideoEncodeH265ReferenceInfo 结构的指针,该结构指定H.265 参考信息

如果 pSetupReferenceSlot 不为 NULL,则此结构在 VkVideoEncodeInfoKHR::pSetupReferenceSlotpNext 链中指定,并且在 VkVideoEncodeInfoKHR::pReferenceSlots 的元素的 pNext 链中指定,以指定 H.265 编码操作的编解码器特定参考图片信息。

活动参考图像信息

当此结构在 VkVideoEncodeInfoKHR::pReferenceSlots 的元素的 pNext 链中指定时,对于 VkVideoEncodeInfoKHR::pReferenceSlots 的每个元素,会将一个元素添加到视频编码操作使用的活动参考图片列表中,如下所示

重建图像信息

当此结构在 VkVideoEncodeInfoKHR::pSetupReferenceSlotpNext 链中指定时,与重建图片相关的信息定义如下

Std 参考信息

pStdReferenceInfo 所指向的 StdVideoEncodeH265ReferenceInfo 结构的成员解释如下:

  • flags.reserved 仅用于填充目的,否则将被忽略;

  • flags.used_for_long_term_reference 用于指示该图像是否被标记为“用于长期参考”,如 ITU-T H.265 规范的 8.3.2 节中所定义;

  • flags.unused_for_reference 用于指示该图像是否被标记为“不用于参考”,如 ITU-T H.265 规范的 8.3.2 节中所定义;

  • pic_type 的定义见 ITU-T H.265 规范 的 7.4.3.5 节;

  • PicOrderCntVal,如 ITU-T H.265 规范 的第 8.3.1 节中定义;

  • ITU-T H.265 规范第 7.4.2.2 节中定义的 TemporalId

有效用法(隐式)
  • VUID-VkVideoEncodeH265DpbSlotInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_KHR

  • VUID-VkVideoEncodeH265DpbSlotInfoKHR-pStdReferenceInfo-parameter
    pStdReferenceInfo 必须是一个有效指针,指向一个有效的 StdVideoEncodeH265ReferenceInfo 值。

H.265 编码速率控制

图片组

在 H.265 编码中,常见的做法是在编码后续帧时,按照显示顺序遵循不同图片类型的规则模式。此模式称为图片组 (GOP)。

常规 GOP 由以下参数定义

  • GOP 中的帧数;

  • 在显示顺序中,I 帧和/或 P 帧之间连续 B 帧的数量。

GOP 进一步分类为开放 GOP 和闭合 GOP。

开放 GOP 中的帧类型在显示顺序中按照以下算法相互跟随

  1. 第一帧始终是 I 帧。

  2. 接下来是若干个连续的 B 帧,如上所述。

  3. 如果尚未达到 GOP 中的帧数,则下一帧是 P 帧,并且该算法从步骤 2 继续。

h26x open gop
图 6. H.265 开放 GOP

在闭合 GOP 的情况下,在某个周期使用 IDR 帧

h26x closed gop
图 7. H.265 闭合 GOP

H.265 编码的典型做法是在 GOP 的帧中使用特定的参考图片使用模式。最常用的两种参考模式如下:

平面参考模式
  • 每个 P 帧在显示顺序中使用最后一个非 B 帧作为参考。

  • 每个 B 帧在显示顺序中使用最后一个非 B 帧作为其前向参考,并在显示顺序中使用下一个非 B 帧作为其后向参考。

h26x ref pattern flat
图 8. H.265 平面参考模式
二元参考模式
  • 每个 P 帧在显示顺序中使用最后一个非 B 帧作为参考。

  • 以下算法应用于显示顺序中 I 帧和/或 P 帧之间连续 B 帧的序列

    1. 此序列中间的 B 帧使用该序列之前的帧作为其前向参考,并使用该序列之后的帧作为其后向参考。

    2. 对于以下帧序列,递归执行该算法

      • 原始序列中位于中间帧之前的 B 帧(如果有)。

      • 原始序列中位于中间帧之后的 B 帧(如果有)。

h26x ref pattern dyadic
图 9. H.265 二元参考模式

应用程序可以向实现 的速率控制算法提供有关应用程序使用的 GOP 结构的指导。任何关于 GOP 及其结构的此类指导并不强制应用程序使用特定的 GOP 结构,因为各个编码图片的图片类型仍然由应用程序控制,但是,任何偏离所提供指导的行为可能导致不希望的速率控制行为,包括但不限于实现无法符合应用程序指定的预期平均或目标比特率,或其他速率控制参数。

当 H.265 编码会话用于编码多个时间子层时,常见的做法是在编码后续帧时,按照显示顺序遵循编码图片的 H.265 时间 ID 的规则模式。此模式称为时间 GOP。最常用的时间层模式如下:

二元时间子层模式
  • 时间 GOP 中的帧数为 2n-1,其中 n 是时间子层的数量。

  • 当且仅当 i 中设置的最低有效位的索引等于 n-t-1 时,时间 GOP 中的第 i 帧才使用时间 ID t,但第一帧除外,第一帧是时间 GOP 中唯一使用时间 ID 零的帧。

  • 时间 GOP 中的第 ith 帧使用第 rth 帧作为参考,其中 r 是通过清除 i 中设置的最低有效位来计算的,但时间 GOP 中的第一帧除外,如果存在,它使用前一个时间 GOP 的第一帧作为参考。

h26x layer pattern dyadic
图 10. H.265 二元时间子层模式

多层速率控制和多层编码通常用于期望低延迟的流媒体情况,因此通常不使用具有后向预测的 B 帧。

VkVideoEncodeH265RateControlInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265RateControlInfoKHR {
    VkStructureType                         sType;
    const void*                             pNext;
    VkVideoEncodeH265RateControlFlagsKHR    flags;
    uint32_t                                gopFrameCount;
    uint32_t                                idrPeriod;
    uint32_t                                consecutiveBFrameCount;
    uint32_t                                subLayerCount;
} VkVideoEncodeH265RateControlInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkVideoEncodeH265RateControlFlagBitsKHR 位掩码,用于指定 H.265 速率控制标志。

  • gopFrameCount 是应用程序打算使用的图片组 (GOP) 中的帧数。如果为 0,则速率控制算法可以假定一个与实现相关的 GOP 长度。如果为 UINT32_MAX,则将 GOP 长度视为无限。

  • idrPeriod 是两个 IDR 帧之间的间隔,以帧数为单位(请参阅 IDR 周期)。如果为 0,则速率控制算法可能会采用一个与实现相关的 IDR 周期。如果为 UINT32_MAX,则 IDR 周期被视为无限大。

  • consecutiveBFrameCountGOP 内 I 帧和/或 P 帧之间连续 B 帧的数量。

  • subLayerCount 指定应用程序打算使用的 H.265 子层的数量。

当此结构的实例包含在传递给 vkCmdControlVideoCodingKHR 命令的 VkVideoCodingControlInfoKHR 结构的 pNext 链中,并且 VkVideoCodingControlInfoKHR::flags 包含 VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR 时,此结构中的参数将用作实现速率控制算法的指导(请参阅 视频编码控制)。

如果 flags 包含 VK_VIDEO_ENCODE_H265_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR,则速率控制状态将重置为初始状态,以满足 HRD 合规性要求。否则,新的速率控制状态可能会在不重置的情况下应用,具体取决于实现和指定的速率控制参数。

根据为 consecutiveBFrameCountidrPeriodgopFrameCount 提供的值,可以推断出编码帧时要使用的图像类型,但是实现不会使用此推断的图像类型来覆盖提供给视频编码操作的图像类型。

有效用法
  • VUID-VkVideoEncodeH265RateControlInfoKHR-flags-08291
    如果 VkVideoEncodeH265CapabilitiesKHR::flags(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回)不包含 VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_KHR,则 flags 必须不包含 VK_VIDEO_ENCODE_H265_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR

  • VUID-VkVideoEncodeH265RateControlInfoKHR-flags-08292
    如果 flags 包含 VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHRVK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR,则它必须也包含 VK_VIDEO_ENCODE_H265_RATE_CONTROL_REGULAR_GOP_BIT_KHR

  • VUID-VkVideoEncodeH265RateControlInfoKHR-flags-08293
    如果 flags 包含 VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR,则它必须不包含 VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR

  • VUID-VkVideoEncodeH265RateControlInfoKHR-flags-08294
    如果 flags 包含 VK_VIDEO_ENCODE_H265_RATE_CONTROL_REGULAR_GOP_BIT_KHR,则 gopFrameCount 必须大于 0

  • VUID-VkVideoEncodeH265RateControlInfoKHR-idrPeriod-08295
    如果 idrPeriod 不为 0,则它必须大于或等于 gopFrameCount

  • VUID-VkVideoEncodeH265RateControlInfoKHR-consecutiveBFrameCount-08296
    如果 consecutiveBFrameCount 不为 0,则它必须小于 gopFrameCount

有效用法(隐式)
  • VUID-VkVideoEncodeH265RateControlInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_KHR

  • VUID-VkVideoEncodeH265RateControlInfoKHR-flags-parameter
    flags 必须VkVideoEncodeH265RateControlFlagBitsKHR 值的有效组合。

可以在 VkVideoEncodeH265RateControlInfoKHR::flags 中设置的位,指定 H.265 速率控制标志,如下所示:

// Provided by VK_KHR_video_encode_h265
typedef enum VkVideoEncodeH265RateControlFlagBitsKHR {
    VK_VIDEO_ENCODE_H265_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_H265_RATE_CONTROL_REGULAR_GOP_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR = 0x00000008,
    VK_VIDEO_ENCODE_H265_RATE_CONTROL_TEMPORAL_SUB_LAYER_PATTERN_DYADIC_BIT_KHR = 0x00000010,
} VkVideoEncodeH265RateControlFlagBitsKHR;
  • VK_VIDEO_ENCODE_H265_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR 指定速率控制应该尝试生成符合 HRD 的比特流,如 ITU-T H.265 规范的附录 C 中所定义的那样。

  • VK_VIDEO_ENCODE_H265_RATE_CONTROL_REGULAR_GOP_BIT_KHR 指定应用程序打算根据 VkVideoEncodeH265RateControlInfoKHR 结构的 gopFrameCountidrPeriodconsecutiveBFrameCount 成员中指定的参数,使用规则 GOP 结构

  • VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR 指定应用程序打算在 GOP 中遵循平面参考模式

  • VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR 指定应用程序打算在 GOP 中遵循双元参考模式

  • VK_VIDEO_ENCODE_H265_RATE_CONTROL_TEMPORAL_SUB_LAYER_PATTERN_DYADIC_BIT_KHR 指定应用程序打算遵循双元时间子层模式

// Provided by VK_KHR_video_encode_h265
typedef VkFlags VkVideoEncodeH265RateControlFlagsKHR;

VkVideoEncodeH265RateControlFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeH265RateControlFlagBitsKHR 的掩码。

速率控制层

VkVideoEncodeH265RateControlLayerInfoKHR 结构定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265RateControlLayerInfoKHR {
    VkStructureType                  sType;
    const void*                      pNext;
    VkBool32                         useMinQp;
    VkVideoEncodeH265QpKHR           minQp;
    VkBool32                         useMaxQp;
    VkVideoEncodeH265QpKHR           maxQp;
    VkBool32                         useMaxFrameSize;
    VkVideoEncodeH265FrameSizeKHR    maxFrameSize;
} VkVideoEncodeH265RateControlLayerInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • useMinQp 指示是否将速率控制确定的 QP 值钳制到 minQp 中指定的 QP 值下限。

  • minQp 指定当 useMinQpVK_TRUE 时,实现速率控制算法将使用的每个图像类型的 QP 值下限。

  • useMaxQp 指示是否将速率控制确定的 QP 值钳制到 maxQp 中指定的 QP 值上限。

  • maxQp 指定当 useMaxQpVK_TRUE 时,实现速率控制算法将使用的每个图像类型的 QP 值上限。

  • useMaxFrameSize 指示实现速率控制算法应该是否使用 maxFrameSize 中指定的值作为每个图像类型的编码帧大小的上限。

  • maxFrameSize 指定当 useMaxFrameSizeVK_TRUE 时,每个图像类型的编码帧大小的上限。

使用时,minQpmaxQp 中的值保证实现使用的有效 QP 值将分别遵守这些下限和上限。但是,限制实现能够使用的 QP 值范围也会限制实现速率控制算法符合其他约束的能力。特别是,实现可能无法符合以下要求:

  • 要在编码比特流中使用的平均和/或峰值比特率值,在 VkVideoEncodeRateControlLayerInfoKHR 结构的 averageBitratemaxBitrate 成员中指定。

  • VkVideoEncodeH265RateControlLayerInfoKHRmaxFrameSize 成员中,为每种图片类型指定的编码帧大小的上限。

通常,应用程序需要适当地配置速率控制参数,以便获得所需的速率控制行为,如视频编码速率控制部分所述。

当此结构的实例包含在 vkCmdControlVideoCodingKHR 命令传递的 VkVideoEncodeRateControlInfoKHR 结构的 pLayers 数组成员中的一个元素的 VkVideoEncodeRateControlLayerInfoKHR 结构的 pNext 链中,VkVideoCodingControlInfoKHR::flags 包含 VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR,并且绑定的视频会话是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 创建的,它指定了与 pLayers 的该元素对应的速率控制层的 H.265 特定速率控制参数。

有效用法
有效用法(隐式)
  • VUID-VkVideoEncodeH265RateControlLayerInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_KHR

  • VUID-VkVideoEncodeH265RateControlLayerInfoKHR-minQp-parameter
    minQp 必须是一个有效的 VkVideoEncodeH265QpKHR 结构。

  • VUID-VkVideoEncodeH265RateControlLayerInfoKHR-maxQp-parameter
    maxQp 必须是一个有效的 VkVideoEncodeH265QpKHR 结构。

  • VUID-VkVideoEncodeH265RateControlLayerInfoKHR-maxFrameSize-parameter
    maxFrameSize 必须是一个有效的 VkVideoEncodeH265FrameSizeKHR 结构。

VkVideoEncodeH265QpKHR 结构定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265QpKHR {
    int32_t    qpI;
    int32_t    qpP;
    int32_t    qpB;
} VkVideoEncodeH265QpKHR;
  • qpI 是用于 I 帧的 QP 值。

  • qpP 是用于 P 帧的 QP 值。

  • qpB 是用于 B 帧的 QP 值。

VkVideoEncodeH265FrameSizeKHR 结构定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265FrameSizeKHR {
    uint32_t    frameISize;
    uint32_t    framePSize;
    uint32_t    frameBSize;
} VkVideoEncodeH265FrameSizeKHR;
  • frameISize 是用于 I 帧的大小(以字节为单位)。

  • framePSize 是用于 P 帧的大小(以字节为单位)。

  • frameBSize 是用于 B 帧的大小(以字节为单位)。

GOP 剩余帧

除了会话级别的码率控制配置外,应用程序可以指定在图像组 (GOP)中每种帧类型剩余的帧数。

VkVideoEncodeH265GopRemainingFrameInfoKHR 结构定义如下:

// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265GopRemainingFrameInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkBool32           useGopRemainingFrames;
    uint32_t           gopRemainingI;
    uint32_t           gopRemainingP;
    uint32_t           gopRemainingB;
} VkVideoEncodeH265GopRemainingFrameInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • useGopRemainingFrames 指示实现中的速率控制算法是否应该使用gopRemainingIgopRemainingPgopRemainingB 中指定的值。如果 useGopRemainingFramesVK_FALSE,则 gopRemainingIgopRemainingPgopRemainingB 的值将被忽略。

  • gopRemainingI 指定在执行视频编码操作之前,实现码率控制算法应该假定在GOP中剩余的 I 帧的数量。

  • gopRemainingP 指定在执行视频编码操作之前,实现码率控制算法应该假定在GOP中剩余的 P 帧的数量。

  • gopRemainingB 指定在执行视频编码操作之前,实现码率控制算法应该假定在GOP中剩余的 B 帧的数量。

只有当为所使用的 视频配置文件报告的 VkVideoEncodeH265CapabilitiesKHR::requiresGopRemainingFramesVK_TRUE 时,才强制要求将 useGopRemainingFrames 设置为 VK_TRUE,并将此结构包含在 VkVideoBeginCodingInfoKHRpNext 链中。但是,实现可以使用这些剩余帧计数(如果指定),即使不是必需的。特别是,当应用程序不使用规则的 GOP 结构时,这些值可以为实现的码率控制算法提供额外的指导。

VkVideoEncodeH265CapabilitiesKHR::prefersGopRemainingFrames 功能也用于指示如果应用程序使用此结构指定剩余帧计数,则实现的码率控制算法可能会更准确地运行。

与其他速率控制指导值一样,如果应用程序编码的帧的有效顺序和数量与在任何给定点在此结构中指定的剩余帧计数不一致,则实现中的速率控制算法的行为可能会偏离应用程序预期的行为。

有效用法(隐式)
  • VUID-VkVideoEncodeH265GopRemainingFrameInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_GOP_REMAINING_FRAME_INFO_KHR

H.265 QP Delta 映射

H.265 编码配置文件一起使用的量化增量映射被称为QP 增量映射,它们的纹素包含表示 QP 增量值的整数值,这些值在确定编码图像的量化参数的过程中应用。

因此,如 VkVideoFormatPropertiesKHR::format 中报告的那样,H.265 QP 增量映射始终具有单通道整数格式。

码率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR 时,QP 增量值将添加到每个切片段的恒定 QP 值中,这实际上使应用程序能够以所使用的量化映射纹素大小的粒度显式控制所使用的 QP 值。

对于所有其他码率控制模式,QP delta 值可以用来偏移码率控制算法原本会产生的 QP 值。

H.265 编码量化

执行 H.265 编码操作涉及将 QP 值分配给各个 H.265 编码单元的过程。此过程取决于所使用的码率控制模式以及其他编码和码率控制参数,如下所述。

  • 如果配置的码率控制模式为 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR,则 QP 值由特定于实现的默认码率控制算法初始化。

    • 如果视频编码操作是使用量化增量映射发出的,则从量化映射中提取的、与编码单元对应的 QP 增量值将添加到先前确定的 QP 值中。如果提取的 QP 增量值超出 VkVideoEncodeH265QuantizationMapCapabilitiesKHRminQpDeltamaxQpDelta 成员中报告的支持的 QP 增量值范围,则用于编码单元的 QP 值将变为未定义

  • 如果配置的码率控制模式为 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 QP 值将从为编码单元所属的 H.265 切片段指定的恒定 QP 值进行初始化。

    • 如果视频编码操作是使用量化增量映射发出的,则从量化映射中提取的、与编码单元对应的 QP 增量值将添加到先前确定的 QP 值中。如果提取的 QP 增量值超出 VkVideoEncodeH265QuantizationMapCapabilitiesKHRminQpDeltamaxQpDelta 成员中报告的支持的 QP 增量值范围,则用于编码单元的 QP 值将变为未定义

  • 如果配置的码率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 QP 值由相应的码率控制算法初始化。

    • 如果视频编码操作是使用量化增量映射发出的,则从量化映射中提取的、与编码单元对应的 QP 增量值将添加到先前确定的 QP 值中。如果提取的 QP 增量值超出 VkVideoEncodeH265QuantizationMapCapabilitiesKHRminQpDeltamaxQpDelta 成员中报告的支持的 QP 增量值范围,则用于编码单元的 QP 值将变为未定义

    • 如果视频编码操作是使用强调映射发出的,则码率控制将根据与编码单元对应的强调值(从量化映射中提取)根据以下公式调整 QP 值:

      QPnew = f(QPprev,e)

      其中 QPnew 是结果 QP 值,QPprev 是先前确定的 QP 值,e 是与编码单元对应的强调值,f 是一个实现定义的函数,该函数满足以下蕴涵:

      e1 < e2 ⇒ f(QP,e1) ≥ f(QP,e2)

      这意味着较低的强调值将导致较高的 QP 值,而较高的强调值将导致较低的 QP 值,但是对于给定的输入 QP 值,该函数不会相对于输入强调值严格递减。

    • 如果应用的码率控制层中启用了最小 QP 值限制,则 QP 值将限制为相应的最小 QP 值。

    • 如果应用的码率控制层中启用了最大 QP 值限制,则 QP 值将限制为相应的最大 QP 值。

  • 如果不支持 VK_VIDEO_ENCODE_H265_CAPABILITY_CU_QP_DIFF_WRAPAROUND_BIT_KHR,则确定的 QP 值将以某种方式进行钳位,以使编码的编码单元的 CuQpDeltaVal 值符合 ITU-T H.265 规范的等式 8-283 的修改版本

    其效果是,后续编码单元之间的最大 QP 差异限制在 [-(26 + QpBdOffsetY / 2), 25 + QpBdOffsetY / 2] 范围内,并且仅当视频编码操作是使用 QP 增量映射发出时,才会有可观察到的行为变化。

  • 在所有情况下,最终 QP 值都会被钳制到视频配置文件支持的 QP 值范围内,如 VkVideoEncodeH265CapabilitiesKHRminQpmaxQp 成员中报告的那样。

H.265 编码要求

本节描述了对于至少有一个队列族支持视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR 的物理设备来说,必需 的 H.265 编码能力,该操作由 vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyVideoPropertiesKHR::videoCodecOperations 中返回。

表 9. 必需的 视频标准头版本
视频标准头名称 版本

vulkan_video_codec_h265std_encode

1.0.0

表 10. 必需的视频能力
视频功能 要求 要求类型1

VkVideoCapabilitiesKHR

flags

-

min

minBitstreamBufferOffsetAlignment

4096

max

minBitstreamBufferSizeAlignment

4096

max

pictureAccessGranularity

(64,64)

max

minCodedExtent

-

max

maxCodedExtent

-

min

maxDpbSlots

0

min

maxActiveReferencePictures

0

min

VkVideoEncodeCapabilitiesKHR

flags

-

min

rateControlModes

-

min

maxBitrate

128000

min

maxQualityLevels

1

min

encodeInputPictureGranularity

(64,64)

max

supportedEncodeFeedbackFlags

VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR

min

VkVideoEncodeH265CapabilitiesKHR

flags

-

min

maxLevelIdc

STD_VIDEO_H265_LEVEL_IDC_1_0

min

maxSliceSegmentCount

1

min

maxTiles

(1,1)

min

ctbSizes

至少设置一位

实现相关

transformBlockSizes

至少设置一位

实现相关

maxPPictureL0ReferenceCount

0

min

maxBPictureL0ReferenceCount

0

min

maxL1ReferenceCount

0

min

maxSubLayerCount

1

min

expectDyadicTemporalSubLayerPattern

-

实现相关

minQp

-

max

maxQp

-

min

prefersGopRemainingFrames

-

实现相关

requiresGopRemainingFrames

-

实现相关

stdSyntaxFlags

-

min

VkVideoEncodeQuantizationMapCapabilitiesKHR

maxQuantizationMapExtent

- 2

min

VkVideoEncodeH265QuantizationMapCapabilitiesKHR

minQpDelta

- 3

max

maxQpDelta

- 3

min

1

要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。

2

如果 VkVideoCapabilitiesKHR::flags 包括 VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHRVK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR,则 maxQuantizationMapExtentwidthheight 成员必须大于零。

3

如果 VkVideoCapabilitiesKHR::flags 包括 VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR,则 maxQpDelta 必须大于 minQpDelta

AV1 编码操作

使用 AV1 编码配置 的视频编码操作可以用来编码符合 AV1 规范 的基本视频流序列。

有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言

此过程按照视频编码操作步骤执行,并在 AV1 规范 第 7 节中定义了编解码器特定的语义。

如果参数符合上述 AV1 规范相应章节中定义的语法和语义要求,并且与活动参考图像关联的DPB 插槽都引用有效的图像引用,则视频编码操作将成功完成。否则,视频编码操作可能失败

AV1 编码参数覆盖

除非另有说明,否则实现可以覆盖以下视频标准结构中指定的任何 AV1 编码参数

  • StdVideoAV1SequenceHeader

  • StdVideoEncodeAV1DecoderModelInfo

  • StdVideoEncodeAV1OperatingPointInfo

  • StdVideoEncodeAV1PictureInfo

  • StdVideoEncodeAV1ReferenceInfo

所有此类 AV1 编码参数覆盖必须满足视频编码参数覆盖部分中定义的条件。

此外,实现必须不覆盖以下任何 AV1 编码参数

  • StdVideoAV1SequenceHeader 中指定的以下参数

    • flags.still_picture

    • flags.enable_order_hint

    • flags.frame_id_numbers_present_flag

    • flags.film_grain_params_present

    • flags.timing_info_present_flag

    • flags.initial_display_delay_present_flag

    • delta_frame_id_length_minus_2

    • additional_frame_id_length_minus_1

    • order_hint_bits_minus_1

  • StdVideoAV1SequenceHeader::pColorConfig 指向的 StdVideoAV1ColorConfig 结构中指定的以下参数

    • flags.mono_chrome

    • flags.color_range

    • BitDepth

    • subsampling_x

    • subsampling_y

    • color_primaries

    • transfer_characteristics

    • matrix_coefficients

    • chroma_sample_position

  • StdVideoAV1SequenceHeader::pTimingInfo 指向的 StdVideoAV1TimingInfo 结构中指定的以下参数

    • flags.equal_picture_interval

    • num_units_in_display_tick

    • time_scale

    • num_ticks_per_picture_minus_1

  • StdVideoEncodeAV1DecoderModelInfo 中指定的参数

  • StdVideoEncodeAV1OperatingPointInfo 中指定的参数

  • StdVideoEncodeAV1PictureInfo 中指定的以下参数

    • flags.show_frame

    • flags.showable_frame

    • frame_type

    • frame_presentation_time

    • current_frame_id

    • order_hint

    • refresh_frame_flags

    • render_width_minus_1

    • render_height_minus_1

    • ref_order_hint

    • ref_frame_idx

    • delta_frame_id_minus_1

  • VkVideoEncodeAV1PictureInfoKHR::generateObuExtensionHeader 设置为 VK_TRUE 时,由 StdVideoEncodeAV1PictureInfo::pExtensionHeader 指向的 StdVideoEncodeAV1ExtensionHeader 结构中指定的以下参数

    • temporal_id

    • spatial_id

如果对于视频编码操作 VkVideoEncodeAV1PictureInfoKHR::primaryReferenceCdfOnly 设置为 VK_TRUE,则实现将不会覆盖 StdVideoEncodeAV1PictureInfo::primary_ref_frame

支持在 VkVideoEncodeAV1CapabilitiesKHR::stdSyntaxFlag 中报告的 VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR AV1 语法元素能力的实现,也保证使用应用程序指定的 StdVideoEncodeAV1PictureInfo::primary_ref_frame 的值。虽然支持 VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR 保证实现不会覆盖应用程序指定的 primary_ref_frame,但它并不强制实现使用 primary_ref_frame 指示的参考图像进行样本预测,因为实现始终可以决定仅使用应用程序指定的参考图像的子集进行样本预测。这意味着即使应用程序未将 VkVideoEncodeAV1PictureInfoKHR::primaryReferenceCdfOnly 设置为 VK_TRUE,支持 VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR 的实现最终也可能仅将 primary_ref_frame 指示的参考图像用于 CDF 数据参考。

如果对于使用的视频配置文件,VkVideoEncodeAV1CapabilitiesKHR::codedPictureAlignment 不等于 {8,8},则实现将按以下方式覆盖编码图像的分辨率以及与宽度和高度相关的参数

  • wh 为与编码输入图像对应的 VkVideoPictureResourceInfoKHR 结构的 codedExtent.widthcodedExtent.height,向上舍入到 8 的最接近的整数倍。

  • aWaH 分别为 wh,向上舍入到 codedPictureAlignment.widthcodedPictureAlignment.height 的最接近的整数倍。

  • 如果 w 等于 aW,则不会发生覆盖。否则,编码宽度将为 aW

  • 如果 h 等于 aH,则不会发生覆盖。否则,编码高度将为 aH

AV1 规范将所有分辨率编码为 8x8 对齐,但通过隐式裁剪支持未对齐的分辨率。因此,如果原始编码范围(与 8x8 对齐)满足实现所需的对齐要求,则无需进行任何覆盖。否则,实现无法编码请求的编码范围,因此比特流中的最终分辨率将被覆盖为与实现所需的对齐方式对齐。

例如,考虑一个只能输出 16x16 对齐比特流的实现(如 VkVideoEncodeAV1CapabilitiesKHR::codedPictureAlignment 所示)。如果应用程序请求的编码范围为 1920x1080,则生成的比特流将为 1920x1088。另一方面,如果请求 1920x1082,则不会进行覆盖,因为此分辨率的 8x8 对齐(1920x1088)是 16x16 对齐的。

如果使用 VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR 创建了视频会话参数对象,则以下 AV1 序列头参数可能会被实现覆盖,具体取决于创建视频会话参数对象时使用的量化映射纹素大小

  • StdVideoAV1SequenceHeader::flags.use_128x128_superblock

可能是必要的,以更改编码期间使用的 AV1 超级块大小,使其与所使用的量化映射纹素大小兼容。

如果 AV1 编码参数存储在视频会话参数对象中,应用程序需要使用 vkGetEncodedVideoSessionParametersKHR 命令来确定是否发生了任何实现覆盖。如果查询表明应用了实现覆盖,则应用程序需要检索并使用比特流中的编码 AV1 序列头,以便能够使用存储在视频会话参数对象中的 AV1 编码参数生成符合标准的 AV1 视频比特流。

对于视频编码操作生成的编码比特流中存储的任何 AV1 编码参数,如果实现支持 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR 视频编码反馈查询标志,则应用程序可以使用此类查询来检索有关是否对这些 AV1 编码参数应用了任何实现覆盖的反馈。

AV1 编码比特流数据访问

每个视频编码操作要么写入:

  • 一个 obu_type 等于 OBU_FRAME 的 OBU,包含编码图片的帧头和切片数据,要么

  • 一个 obu_type 等于 OBU_FRAME_HEADER 的 OBU,封装了编码图片的帧头,后跟一个或多个 obu_type 等于 OBU_TILE_GROUP 的 OBU,包含编码图片的切片数据。

此外,如果为视频编码操作设置了 VkVideoEncodeAV1PictureInfoKHR::generateObuExtensionHeaderVK_TRUE,则生成的比特流中将包含 OBU 扩展头,如AV1 规范的 5.3.1、5.3.2 和 5.3.3 节中所定义。

AV1 编码图像数据访问

对视频图像资源中的图像数据的访问发生在 VkVideoCapabilitiesKHR::pictureAccessGranularity 指示的粒度上,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回。因此,使用 AV1 编码配置文件的视频编码操作访问的编码输入图像参考图像重建图像的完整图像子区域定义为坐标范围内的纹素集:

([0,endX),[0,endY))

其中

  • endX 等于codedExtent.width向上舍入到 pictureAccessGranularity.width 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的宽度;

  • endY 等于codedExtent.height向上舍入到 pictureAccessGranularity.height 的最接近整数倍,并钳制为 引用的对应 VkVideoPictureResourceInfoKHR 结构所引用的图像子资源的高度;

其中 codedExtent 是对应于图像的 VkVideoPictureResourceInfoKHR 结构的成员。

在使用 AV1 编码配置文件的视频编码操作中,根据AV1 规范定义的,对坐标 (x,y) 的图像的任何访问,都是对 引用的对应 VkVideoPictureResourceInfoKHR 结构在纹素坐标 (x,y) 处的图像子资源的访问。

实现可以选择不访问视频编码操作可用的某些或所有 参考图像 内的纹素(例如,由于 视频编码参数覆盖限制了有效使用的参考图像集,或者如果编码算法选择不使用参考图像数据的某些子区域进行样本预测)。

AV1 参考名称和语义

编码过程中使用的各个参考帧具有不同的语义,如AV1 规范的 6.10.24 节中所定义。与参考图像关联的 AV1 语义由 Video Std 枚举类型 StdVideoAV1ReferenceName 中定义的相应枚举常量指示。

  • STD_VIDEO_AV1_REFERENCE_NAME_INTRA_FRAME 标识用于帧内编码的参考(INTRA_FRAME),如 AV1 规范的第 2 节和 7.11.2 节中所定义。

  • 所有其他枚举常量指的是用于帧间编码的向后或向前参考,如 AV1 规范的第 2 节和 7.11.3 节中所定义

    • STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME 标识 LAST_FRAME 参考

    • STD_VIDEO_AV1_REFERENCE_NAME_LAST2_FRAME 标识 LAST2_FRAME 参考

    • STD_VIDEO_AV1_REFERENCE_NAME_LAST3_FRAME 标识 LAST3_FRAME 参考帧

    • STD_VIDEO_AV1_REFERENCE_NAME_GOLDEN_FRAME 标识 GOLDEN_FRAME 参考帧

    • STD_VIDEO_AV1_REFERENCE_NAME_BWDREF_FRAME 标识 BWDREF_FRAME 参考帧

    • STD_VIDEO_AV1_REFERENCE_NAME_ALTREF2_FRAME 标识 ALTREF2_FRAME 参考帧

    • STD_VIDEO_AV1_REFERENCE_NAME_ALTREF_FRAME 标识 ALTREF_FRAME 参考帧

这些枚举常量不会直接在任何 API 中使用,而是用于间接索引到某些 Video Std 和 Vulkan API 参数数组中。

AV1 预测模式

AV1 编码支持多种类型的预测模式,如AV1 规范的 6.10.24 节中所述。

可能的 AV1 编码预测模式如下:

// Provided by VK_KHR_video_encode_av1
typedef enum VkVideoEncodeAV1PredictionModeKHR {
    VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR = 0,
    VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR = 1,
    VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_UNIDIRECTIONAL_COMPOUND_KHR = 2,
    VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR = 3,
} VkVideoEncodeAV1PredictionModeKHR;
  • VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR 指定使用仅帧内预测模式,用于编码类型为 STD_VIDEO_AV1_FRAME_TYPE_KEYSTD_VIDEO_AV1_FRAME_TYPE_INTRA_ONLY 的 AV1 帧。

  • VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR 指定使用单参考预测模式,用于编码类型为 STD_VIDEO_AV1_FRAME_TYPE_INTERSTD_VIDEO_AV1_FRAME_TYPE_SWITCHreference_select(如AV1 规范的 6.8.23 节中所定义)等于 0 的 AV1 帧。当使用此预测模式时,应用程序必须VkVideoEncodeAV1PictureInfoKHR::referenceNameSlotIndices 中至少一个实现支持的AV1 参考名称指定参考图像,如 VkVideoEncodeAV1CapabilitiesKHR::singleReferenceNameMask 中报告的那样。

  • VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_UNIDIRECTIONAL_COMPOUND_KHR 指定使用单向复合预测模式,用于编码类型为 STD_VIDEO_AV1_FRAME_TYPE_INTERSTD_VIDEO_AV1_FRAME_TYPE_SWITCHreference_select(如AV1 规范的 6.8.23 节中所定义)等于 1,并且用于预测的两个参考名称都来自同一参考帧组(如AV1 规范的 6.10.24 节中所定义)的 AV1 帧。当使用此预测模式时,应用程序必须VkVideoEncodeAV1PictureInfoKHR::referenceNameSlotIndices 中至少两个实现支持的AV1 参考名称指定参考图像,如 VkVideoEncodeAV1CapabilitiesKHR::unidirectionalCompoundReferenceNameMask 中报告的那样。其中这两个参考名称是AV1 规范的 5.11.25 节中定义的允许参考名称对之一,如下所示:

    • LAST_FRAMELAST2_FRAME

    • LAST_FRAMELAST3_FRAME

    • LAST_FRAMEGOLDEN_FRAME,或者

    • BWDREF_FRAMEALTREF_FRAME

  • VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR 指定使用双向复合预测模式,当编码 STD_VIDEO_AV1_FRAME_TYPE_INTERSTD_VIDEO_AV1_FRAME_TYPE_SWITCH 类型的 AV1 帧时使用,并且 AV1 规范 第 6.8.23 节定义的 reference_select 等于 1,并且用于预测的两个参考名称来自不同的参考帧组,如 AV1 规范 第 6.10.24 节所定义。当使用此预测模式时,应用程序必须VkVideoEncodeAV1PictureInfoKHR::referenceNameSlotIndices 中每个参考帧组的至少一个 AV1 参考名称指定一个参考图像,该参考图像由实现支持,如 VkVideoEncodeAV1CapabilitiesKHR::bidirectionalCompoundReferenceNameMask 中报告的那样。

用于编码单个 AV1 模式信息块的有效预测模式可能使用比应用程序为帧设置的更简单的预测模式,如 AV1 规范 所允许的那样,特别是:

  • 使用单参考预测模式编码的帧可能包含使用仅帧内预测模式编码的模式信息块。

  • 使用单向复合预测模式编码的帧可能包含使用仅帧内或单参考预测模式编码的模式信息块。

  • 使用双向复合预测模式编码的帧可能包含使用仅帧内、单参考或单向复合预测模式编码的模式信息块。

AV1 编码块

AV1 编码支持两种类型的编码块,如 AV1 规范 第 2 节所定义:

  • 超块.

  • 模式信息块.

AV1 编码配置文件

支持 AV1 视频编码操作的视频配置文件通过将 VkVideoProfileInfoKHR::videoCodecOperation 设置为 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 并将 VkVideoEncodeAV1ProfileInfoKHR 结构添加到 VkVideoProfileInfoKHR::pNext 链来指定。

VkVideoEncodeAV1ProfileInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1ProfileInfoKHR {
    VkStructureType       sType;
    const void*           pNext;
    StdVideoAV1Profile    stdProfile;
} VkVideoEncodeAV1ProfileInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stdProfile 是一个 StdVideoAV1Profile 值,指定 AV1 编解码器配置文件,如 AV1 规范 的 A.2 节中所定义。

有效用法(隐式)
  • VUID-VkVideoEncodeAV1ProfileInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR

AV1 编码能力

当调用 vkGetPhysicalDeviceVideoCapabilitiesKHR 以查询 AV1 编码配置文件的能力时,VkVideoCapabilitiesKHR::pNext必须包含一个 VkVideoEncodeAV1CapabilitiesKHR 结构,该结构将填充特定于配置文件的能力。

VkVideoEncodeAV1CapabilitiesKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1CapabilitiesKHR {
    VkStructureType                           sType;
    void*                                     pNext;
    VkVideoEncodeAV1CapabilityFlagsKHR        flags;
    StdVideoAV1Level                          maxLevel;
    VkExtent2D                                codedPictureAlignment;
    VkExtent2D                                maxTiles;
    VkExtent2D                                minTileSize;
    VkExtent2D                                maxTileSize;
    VkVideoEncodeAV1SuperblockSizeFlagsKHR    superblockSizes;
    uint32_t                                  maxSingleReferenceCount;
    uint32_t                                  singleReferenceNameMask;
    uint32_t                                  maxUnidirectionalCompoundReferenceCount;
    uint32_t                                  maxUnidirectionalCompoundGroup1ReferenceCount;
    uint32_t                                  unidirectionalCompoundReferenceNameMask;
    uint32_t                                  maxBidirectionalCompoundReferenceCount;
    uint32_t                                  maxBidirectionalCompoundGroup1ReferenceCount;
    uint32_t                                  maxBidirectionalCompoundGroup2ReferenceCount;
    uint32_t                                  bidirectionalCompoundReferenceNameMask;
    uint32_t                                  maxTemporalLayerCount;
    uint32_t                                  maxSpatialLayerCount;
    uint32_t                                  maxOperatingPoints;
    uint32_t                                  minQIndex;
    uint32_t                                  maxQIndex;
    VkBool32                                  prefersGopRemainingFrames;
    VkBool32                                  requiresGopRemainingFrames;
    VkVideoEncodeAV1StdFlagsKHR               stdSyntaxFlags;
} VkVideoEncodeAV1CapabilitiesKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkVideoEncodeAV1CapabilityFlagBitsKHR 的位掩码,指示支持的 AV1 编码能力。

  • maxLevel 是一个 StdVideoAV1Level 值,指示配置文件支持的最大 AV1 级别,如 AV1 规范 A.3 节所定义。

  • codedPictureAlignment 指示实现将编码图像的对齐方式。此功能不会对应用程序施加任何有效的用法约束。但是,根据编码输入图像资源的 codedExtent,此功能可能导致编码图像的分辨率发生变化,如下文更详细的描述。

  • maxTiles 指示实现支持的最大 AV1 瓦片列数和行数。

  • minTileSize 指示实现支持的单个 AV1 瓦片的最小范围。

  • maxTileSize 指示实现支持的单个 AV1 瓦片的最大范围。

  • superblockSizes 是一个 VkVideoEncodeAV1SuperblockSizeFlagBitsKHR 值的位掩码,指示支持的 AV1 超块大小。

  • maxSingleReferenceCount 指示在使用单参考预测模式时,实现支持的最大参考图像数量。

  • singleReferenceNameMask 是在使用单参考预测模式时,支持的 AV1 参考名称 的位掩码。

  • maxUnidirectionalCompoundReferenceCount 指示在使用单向复合预测模式时,实现支持的最大参考图像数量。

  • maxUnidirectionalCompoundGroup1ReferenceCount 指示在使用 单向复合预测模式 时,从参考帧组 1 中实现支持的最大参考图像数量,如 AV1 规范 第 6.10.24 节所定义。

  • unidirectionalCompoundReferenceNameMask 是在使用 单向复合预测模式 时,支持的 AV1 参考名称 的位掩码。

  • maxBidirectionalCompoundReferenceCount 指示在使用 双向复合预测模式 时,实现支持的最大参考图像数量。

  • maxBidirectionalCompoundGroup1ReferenceCount 指示在使用 双向复合预测模式 时,从参考帧组 1 中实现支持的最大参考图像数量,如 AV1 规范 第 6.10.24 节所定义。

  • maxBidirectionalCompoundGroup2ReferenceCount 指示在使用 双向复合预测模式 时,从参考帧组 2 中实现支持的最大参考图像数量,如 AV1 规范 第 6.10.24 节所定义。

  • bidirectionalCompoundReferenceNameMask 是在使用 双向复合预测模式 时,支持的 AV1 参考名称 的位掩码。

  • maxTemporalLayerCount 指示实现支持的最大 AV1 时间层数量。

  • maxSpatialLayerCount 指示实现支持的最大 AV1 空间层数量。

  • maxOperatingPoints 指示实现支持的最大 AV1 操作点数量。

  • minQIndex 指示支持的最小量化器索引值。

  • maxQIndex 指示支持的最大量化器索引值。

  • prefersGopRemainingFrames 指示实现的速率控制算法更倾向于应用程序在开始 视频编码范围 时,指定当前 图片组 中每个 AV1 速率控制组 剩余的帧数。

  • requiresGopRemainingFrames 指示实现的速率控制算法要求应用程序在开始 视频编码范围 时,指定当前 图片组 中每个 AV1 速率控制组 剩余的帧数。

  • stdSyntaxFlagsVkVideoEncodeAV1StdFlagBitsKHR 的位掩码,指示与 AV1 语法元素相关的能力。

singleReferenceNameMaskunidirectionalCompoundReferenceNameMaskbidirectionalCompoundReferenceNameMask 的编码方式是,当位索引 i 被设置时,它指示支持 AV1 参考名称 STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME + i

这些掩码指示 VkVideoEncodeAV1PictureInfoKHRreferenceNameSlotIndices 成员中的哪些元素受实现支持使用。重要的是要注意,这些掩码的位和 referenceNameSlotIndices 的元素都进行了索引,使得第一个值分别指定 AV1 参考名称 STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME 的支持位和 DPB 插槽索引 (即,没有 STD_VIDEO_AV1_REFERENCE_NAME_INTRA_FRAME 的位或元素)。

codedPictureAlignment 提供关于实现编码任意分辨率的限制信息。特别是,某些实现可能无法生成符合 AV1 规范 (8x8) 要求的比特流。在这种情况下,实现可能覆盖比特流的宽度和高度,以便生成符合AV1 规范的比特流。如果发生这种覆盖,编码图像的编码分辨率将会扩大,超出编码输入图像资源的 codedExtent 范围的纹素值将首先受关于编码输入图像粒度的规则约束。超出编码输入图像粒度所描述区域的任何纹素值都由实现定义。为了最大限度地减少对生成的编码内容的影响,实现应该使用定义良好的值。

此功能不施加额外的应用程序要求。但是,这些覆盖会更改比特流的有效分辨率并添加填充像素。对这种覆盖敏感的应用程序可以使用此功能和相应的覆盖行为来计算重现原始编码输入的裁剪量,并在侧通道中传输(例如,通过使用容器中可用的裁剪字段)。此外,应用程序可以在其编码范围中显式考虑这种对齐方式,以避免将实现定义的纹素值包含在编码内容中。

有效用法(隐式)
  • VUID-VkVideoEncodeAV1CapabilitiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR

VkVideoEncodeAV1CapabilitiesKHR::flags可能设置的位,表示支持的 AV1 编码功能为:

// Provided by VK_KHR_video_encode_av1
typedef enum VkVideoEncodeAV1CapabilityFlagBitsKHR {
    VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR = 0x00000008,
    VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR = 0x00000010,
} VkVideoEncodeAV1CapabilityFlagBitsKHR;
  • VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR 表示支持在 VkVideoEncodeAV1QIndexKHR 的成员中指定不同的量化器索引值。

  • VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR 表示支持生成 OBU 扩展头,如 AV1 规范的第 5.3.3 节中所定义。

  • VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR 表示支持仅将 AV1 图像信息StdVideoEncodeAV1PictureInfo::primary_ref_frame 的值指示的主参考帧用于 CDF 数据参考,如 AV1 规范的第 6.8.2 节中所定义。

  • VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR 表示支持编码具有与活动 AV1 序列头中定义的最大帧大小不同的帧大小的图像。如果不支持此功能,则必须不在编码帧的 AV1 图像信息中设置 frame_size_override_flag,并且编码输入图像的编码范围必须活动 AV1 序列头允许的最大编码范围相匹配,即 (max_frame_width_minus_1 + 1, max_frame_height_minus_1 + 1)

  • VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR 表示支持运动矢量缩放,如 AV1 规范的第 7.11.3.3 节中所定义。如果不支持此功能,则所有活动参考图像的编码范围必须编码输入图像的编码范围相匹配。仅当同时也支持 VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR 时,视频配置文件可能支持此功能。

// Provided by VK_KHR_video_encode_av1
typedef VkFlags VkVideoEncodeAV1CapabilityFlagsKHR;

VkVideoEncodeAV1CapabilityFlagsKHR 是一个位掩码类型,用于设置零个或多个VkVideoEncodeAV1CapabilityFlagBitsKHR的掩码。

VkVideoEncodeAV1CapabilitiesKHR::stdSyntaxFlags可能设置的位,表示与 AV1 语法元素相关的功能为:

// Provided by VK_KHR_video_encode_av1
typedef enum VkVideoEncodeAV1StdFlagBitsKHR {
    VK_VIDEO_ENCODE_AV1_STD_UNIFORM_TILE_SPACING_FLAG_SET_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_AV1_STD_SKIP_MODE_PRESENT_UNSET_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_AV1_STD_DELTA_Q_BIT_KHR = 0x00000008,
} VkVideoEncodeAV1StdFlagBitsKHR;
  • VK_VIDEO_ENCODE_AV1_STD_UNIFORM_TILE_SPACING_FLAG_SET_BIT_KHR 表示当 AV1 分块参数StdVideoAV1TileInfoFlags::uniform_tile_spacing_flag 的应用程序提供的值为 1 时,无论编码输入图像的编码范围以及 StdVideoAV1TileInfoTileColsTileRows 成员中请求的分块列数和行数如何,实现都支持使用该值。

  • VK_VIDEO_ENCODE_AV1_STD_SKIP_MODE_PRESENT_UNSET_BIT_KHR 指定当 StdVideoEncodeAV1PictureInfoFlags::skip_mode_present 的应用程序提供的值为 0 时,实现是否支持使用该值。

  • VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR 指定实现是否支持使用 StdVideoEncodeAV1PictureInfo::primary_ref_frame 的应用程序提供的值。

  • VK_VIDEO_ENCODE_AV1_STD_DELTA_Q_BIT_KHR 指定实现是否支持使用 StdVideoAV1QuantizationDeltaQYDcDeltaQUDcDeltaQUAcDeltaQVDcDeltaQVAc 成员的应用程序提供的值。

这些功能标志为应用程序提供有关特定 AV1 语法元素值的信息,这些值在不需要覆盖它们的情况下,实现支持使用。它们不会以其他方式限制应用程序可以为任何提及的 AV1 语法元素指定的值。

// Provided by VK_KHR_video_encode_av1
typedef VkFlags VkVideoEncodeAV1StdFlagsKHR;

VkVideoEncodeAV1StdFlagsKHR 是一个位掩码类型,用于设置零个或多个VkVideoEncodeAV1StdFlagBitsKHR的掩码。

VkVideoEncodeAV1CapabilitiesKHR::superblockSizes可能设置的位,表示实现支持的超块大小为:

// Provided by VK_KHR_video_encode_av1
typedef enum VkVideoEncodeAV1SuperblockSizeFlagBitsKHR {
    VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR = 0x00000002,
} VkVideoEncodeAV1SuperblockSizeFlagBitsKHR;
  • VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR 指定支持 64x64 的超块大小。

  • VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR 指定支持 128x128 的超块大小。

// Provided by VK_KHR_video_encode_av1
typedef VkFlags VkVideoEncodeAV1SuperblockSizeFlagsKHR;

VkVideoEncodeAV1SuperblockSizeFlagsKHR 是一个位掩码类型,用于设置零个或多个VkVideoEncodeAV1SuperblockSizeFlagBitsKHR的掩码。

实现必须支持至少一个 VkVideoEncodeAV1SuperblockSizeFlagBitsKHR

AV1 编码质量级别属性

当使用指定为 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHRpVideoProfile->videoCodecOperation 调用 vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR 时,VkVideoEncodeAV1QualityLevelPropertiesKHR 结构必须包含在 VkVideoEncodeQualityLevelPropertiesKHR 结构的 pNext 链中,以检索特定于 AV1 编码的额外视频编码质量级别属性。

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1QualityLevelPropertiesKHR {
    VkStructureType                        sType;
    void*                                  pNext;
    VkVideoEncodeAV1RateControlFlagsKHR    preferredRateControlFlags;
    uint32_t                               preferredGopFrameCount;
    uint32_t                               preferredKeyFramePeriod;
    uint32_t                               preferredConsecutiveBipredictiveFrameCount;
    uint32_t                               preferredTemporalLayerCount;
    VkVideoEncodeAV1QIndexKHR              preferredConstantQIndex;
    uint32_t                               preferredMaxSingleReferenceCount;
    uint32_t                               preferredSingleReferenceNameMask;
    uint32_t                               preferredMaxUnidirectionalCompoundReferenceCount;
    uint32_t                               preferredMaxUnidirectionalCompoundGroup1ReferenceCount;
    uint32_t                               preferredUnidirectionalCompoundReferenceNameMask;
    uint32_t                               preferredMaxBidirectionalCompoundReferenceCount;
    uint32_t                               preferredMaxBidirectionalCompoundGroup1ReferenceCount;
    uint32_t                               preferredMaxBidirectionalCompoundGroup2ReferenceCount;
    uint32_t                               preferredBidirectionalCompoundReferenceNameMask;
} VkVideoEncodeAV1QualityLevelPropertiesKHR;

preferredSingleReferenceNameMaskpreferredUnidirectionalCompoundReferenceNameMaskpreferredBidirectionalCompoundReferenceNameMask 的编码方式是:当位索引 i 被设置时,表示首选使用 AV1 参考名称 STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME + i

有效用法(隐式)
  • VUID-VkVideoEncodeAV1QualityLevelPropertiesKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR

AV1 编码会话

当使用 AV1 编码配置文件创建视频会话时,可以通过在 VkVideoSessionCreateInfoKHRpNext 链中包含 VkVideoEncodeAV1SessionCreateInfoKHR 结构的实例来指定其他参数。

VkVideoEncodeAV1SessionCreateInfoKHR 结构定义如下

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1SessionCreateInfoKHR {
    VkStructureType     sType;
    const void*         pNext;
    VkBool32            useMaxLevel;
    StdVideoAV1Level    maxLevel;
} VkVideoEncodeAV1SessionCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • useMaxLevel 指示实现是否应使用 maxLevel 的值。当设置为 VK_FALSE 时,实现会忽略 maxLevel 的值,并使用 VkVideoEncodeAV1CapabilitiesKHR::maxLevel 的值,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为视频配置文件报告。

  • maxLevel 是一个 StdVideoAV1Level 值,用于指定创建的视频会话生成的视频比特流的 AV1 级别的上限。

有效用法(隐式)
  • VUID-VkVideoEncodeAV1SessionCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_CREATE_INFO_KHR

AV1 编码参数集

使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的视频会话参数对象包含以下参数集的单个实例

AV1 序列头

StdVideoAV1SequenceHeader 结构表示,并按如下方式解释:

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • pColorConfig 指向的 StdVideoAV1ColorConfig 结构按如下方式解释:

    • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

    • StdVideoAV1ColorConfig 的所有其他成员都按照AV1 规范的 6.4.2 节中的定义进行解释;

  • 如果设置了 flags.timing_info_present_flag,则 pTimingInfo 指向的 StdVideoAV1TimingInfo 结构按如下方式解释:

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • StdVideoAV1TimingInfo 的所有其他成员都按照AV1 规范的 6.4.3 节中的定义进行解释;

  • StdVideoAV1SequenceHeader 的所有其他成员都按照AV1 规范的 6.4 节中的定义进行解释。

StdVideoAV1SequenceHeader::flags.timing_info_present_flag 被设置时,AV1 序列头可以使用 AV1 解码器模型信息进行修改,该信息由 StdVideoEncodeAV1DecoderModelInfo 结构表示,并解释如下

  • reserved1 仅用于填充目的,否则将被忽略;

  • StdVideoEncodeAV1DecoderModelInfo 的所有其他成员的解释均与 AV1 规范的 6.4.4 节中定义的一致。

StdVideoAV1SequenceHeader::flags.reduced_still_picture_header 未被设置时,AV1 序列头可以使用 AV1 操作点信息进行修改,该信息由 StdVideoEncodeAV1OperatingPointInfo 结构数组表示,并解释如下

  • flags.reserved 仅用于填充目的,否则将被忽略;

  • StdVideoEncodeAV1OperatingPointInfo 的所有其他成员的解释均与 AV1 规范的 6.4 节中定义的各个数组的相应元素一致。

实现可以根据视频编码参数覆盖部分中定义的语义覆盖这些参数中的任何一个,然后再将生成的 AV1 序列头存储到视频会话参数对象中。应用程序需要使用 vkGetEncodedVideoSessionParametersKHR 命令来确定是否发生了任何实现覆盖,并检索编码的 AV1 序列头,以便能够生成符合标准的 AV1 视频比特流。

使用 vkGetEncodedVideoSessionParametersKHR 命令检索到的编码 AV1 序列头被编码为单个 OBU,其 obu_type 等于 OBU_SEQUENCE_HEADER,如 AV1 规范的 5.3 节中所定义。

这种 AV1 序列头覆盖可能也会对应用于视频编码操作生成的编码比特流的实现覆盖产生级联效应。如果实现支持 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR 视频编码反馈查询标志,则应用程序可以使用此类查询来检索有关是否已对编码比特流应用任何实现覆盖的反馈。

当使用编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建视频会话参数对象时,VkVideoSessionParametersCreateInfoKHR::pNext必须包含一个 VkVideoEncodeAV1SessionParametersCreateInfoKHR 结构,用于指定对象的内容。

VkVideoEncodeAV1SessionParametersCreateInfoKHR 结构定义如下

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1SessionParametersCreateInfoKHR {
    VkStructureType                               sType;
    const void*                                   pNext;
    const StdVideoAV1SequenceHeader*              pStdSequenceHeader;
    const StdVideoEncodeAV1DecoderModelInfo*      pStdDecoderModelInfo;
    uint32_t                                      stdOperatingPointCount;
    const StdVideoEncodeAV1OperatingPointInfo*    pStdOperatingPoints;
} VkVideoEncodeAV1SessionParametersCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdSequenceHeader 是指向 StdVideoAV1SequenceHeader 结构的指针,该结构描述了要存储在创建的对象中的AV1 序列头条目的参数。

  • pStdDecoderModelInfoNULL 或指向 StdVideoEncodeAV1DecoderModelInfo 结构的指针,该结构指定要存储在创建的对象中的AV1 解码器模型信息

  • stdOperatingPointCountpStdOperatingPoints 数组中的元素数量。

  • pStdOperatingPointsNULL 或指向 stdOperatingPointCountStdVideoEncodeAV1OperatingPointInfo 结构组成的数组的指针,该结构指定要存储在创建的对象中的AV1 操作点信息。每个元素 i 指定与 AV1 规范的 6.4 节中定义的语法元素的元素 i 对应的参数值。

有效用法
  • VUID-VkVideoEncodeAV1SessionParametersCreateInfoKHR-pStdSequenceHeader-10288
    pStdSequenceHeader->flags.film_grain_params_present 必须为零

有效用法(隐式)
  • VUID-VkVideoEncodeAV1SessionParametersCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR

  • VUID-VkVideoEncodeAV1SessionParametersCreateInfoKHR-pStdSequenceHeader-parameter
    pStdSequenceHeader 必须是指向有效 StdVideoAV1SequenceHeader 值的有效指针

  • VUID-VkVideoEncodeAV1SessionParametersCreateInfoKHR-pStdDecoderModelInfo-parameter
    如果 pStdDecoderModelInfo 不为 NULL,则 pStdDecoderModelInfo 必须是指向有效 StdVideoEncodeAV1DecoderModelInfo 值的有效指针

  • VUID-VkVideoEncodeAV1SessionParametersCreateInfoKHR-pStdOperatingPoints-parameter
    如果 stdOperatingPointCount 不为 0,并且 pStdOperatingPoints 不为 NULL,则 pStdOperatingPoints 必须是指向 stdOperatingPointCountStdVideoEncodeAV1OperatingPointInfo 值的有效指针数组。

AV1 编码参数

VkVideoEncodeAV1PictureInfoKHR 结构体定义如下:

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1PictureInfoKHR {
    VkStructureType                        sType;
    const void*                            pNext;
    VkVideoEncodeAV1PredictionModeKHR      predictionMode;
    VkVideoEncodeAV1RateControlGroupKHR    rateControlGroup;
    uint32_t                               constantQIndex;
    const StdVideoEncodeAV1PictureInfo*    pStdPictureInfo;
    int32_t                                referenceNameSlotIndices[VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR];
    VkBool32                               primaryReferenceCdfOnly;
    VkBool32                               generateObuExtensionHeader;
} VkVideoEncodeAV1PictureInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • predictionMode 指定用于编码帧的 AV1 预测模式

  • rateControlGroup 指定当当前速率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR 时,用于编码帧的 AV1 速率控制组。否则将被忽略。

  • 如果为视频会话配置的当前速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则 constantQIndex 是用于编码帧的量化索引。

  • pStdPictureInfo 是指向 StdVideoEncodeAV1PictureInfo 结构的指针,该结构指定 AV1 图像信息

  • referenceNameSlotIndices 是一个包含七个(VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR,其值等于视频标准定义 STD_VIDEO_AV1_REFS_PER_FRAME)有符号整数值的数组,指定用于帧间编码的每个AV1 参考名称DPB 插槽的索引或一个负整数值。 特别是,AV1 参考名称 frame 的 DPB 插槽索引在 referenceNameSlotIndices[frame - STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME] 中指定。

  • primaryReferenceCdfOnly 控制由 pStdPictureInfo->primary_ref_frame 的值指示的主参考帧是否仅用于 CDF 数据参考,如 AV1 规范的 6.8.2 节中所定义。 如果设置为 VK_TRUE,则主参考帧的图像数据将不用于样本预测。

  • generateObuExtensionHeader 控制是否将 OBU 扩展头生成到目标比特流中,如 AV1 规范的 5.3.1、5.3.2 和 5.3.3 节中所定义。

此结构在传递给 vkCmdEncodeVideoKHRVkVideoEncodeInfoKHR 结构的 pNext 链中指定,以指定AV1 编码操作的编解码器特定图像信息。

编码输入图片信息

当此结构在传递给 vkCmdEncodeVideoKHRVkVideoEncodeInfoKHR 结构的 pNext 链中指定时,与编码输入图像相关的信息定义如下

标准图像信息

pStdPictureInfo 指向的 StdVideoEncodeAV1PictureInfo 结构的成员解释如下:

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • pSegmentation 必须NULL

    视频编码操作当前不支持 AV1 分割。 因此,应用程序需要将 flags.segmentation_enabled 设置为 0,并将 pSegmentation 设置为 NULL

  • pTileInfoNULL 或指向 StdVideoAV1TileInfo 结构的指针,该结构指定 AV1 瓦片参数

  • pQuantization 指向的 StdVideoAV1Quantization 结构按如下方式解释

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • StdVideoAV1Quantization 的所有其他成员都按照 AV1 规范的 6.8.11 节中的定义进行解释;

  • pLoopFilter 指向的 StdVideoAV1LoopFilter 结构按如下方式解释

    • flags.reserved 仅用于填充目的,否则将被忽略;

    • update_ref_delta 是一个位掩码,其中位索引 i 被解释为对应于 loop_filter_ref_deltas 的元素 iupdate_ref_delta 的值,如 AV1 规范的 6.8.10 节中所定义;

    • update_mode_delta 是一个位掩码,其中位索引 i 被解释为对应于 loop_filter_mode_deltas 的元素 iupdate_mode_delta 的值,如 AV1 规范的 6.8.10 节中所定义;

    • StdVideoAV1LoopFilter 的所有其他成员都按照 AV1 规范的 6.8.10 节中的定义进行解释;

  • 如果在活动序列头中设置了 flags.enable_cdef,则由 pCDEF 指向的 StdVideoAV1CDEF 结构的成员解释如下:

    • cdef_y_sec_strengthcdef_uv_sec_strengthAV1 规范的 5.9.19 节中定义的相应语法元素的比特流值;

    • StdVideoAV1CDEF 的所有其他成员都按照 AV1 规范的 6.10.14 节中的定义进行解释;

  • 如果在活动序列头中设置了 flags.UsesLr,则由 pLoopRestoration 指向的 StdVideoAV1LoopRestoration 结构解释如下:

    • LoopRestorationSize[plane] 被解释为 log2(size) - 5,其中 sizeAV1 规范 6.10.15 节中定义的 LoopRestorationSize[plane] 的值。

    • StdVideoAV1LoopRestoration 的所有其他成员都按照 AV1 规范的 6.10.15 节中的定义进行定义;

  • global_motion 中提供的 StdVideoAV1GlobalMotion 结构的成员按 AV1 规范的 7.10 节中的定义进行解释;

  • pExtensionHeaderNULL 或指向 StdVideoEncodeAV1ExtensionHeader 结构的指针,该结构的 temporal_idspatial_id 成员分别指定参考帧的时间层 ID 和空间层 ID(如果对于编码操作,VkVideoEncodeAV1PictureInfoKHR::generateObuExtensionHeader 设置为 VK_TRUE,则这些 ID 会被编码到 OBU 扩展头中)。

  • 如果设置了 flags.buffer_removal_time_present_flag,则 pBufferRemovalTimes 是指向 N 个无符号整数值数组的指针,该数组指定 buffer_removal_time 数组的元素,如 AV1 规范的 6.8.2 节中所定义,其中 N 是通过 VkVideoEncodeAV1SessionParametersCreateInfoKHR::stdOperatingPointCount活动序列头指定的运行点数量。

  • 所有其他成员都按照 AV1 规范的 6.8 节中的定义进行解释。

参考图像设置由 StdVideoEncodeAV1PictureInfo::refresh_frame_flags 的值控制。 如果它不为零,并且指定了重建图像,则后者用作图像重建的目标,以激活 pEncodeInfo->pSetupReferenceSlot→slotIndex 中指定的 DPB 插槽。 如果 StdVideoEncodeAV1PictureInfo::refresh_frame_flags 为零,但指定了重建图像,则与DPB 插槽关联的相应图像参考将被失效,如 DPB 插槽状态部分所述。

标准瓦片参数

指定 AV1 瓦片参数是可选的。 如果 StdVideoEncodeAV1PictureInfo::pTileInfoNULL,则实现以实现相关的方式确定 AV1 规范 6.8.14 节中定义的 AV1 瓦片参数的值。 如果 StdVideoEncodeAV1PictureInfo::pTileInfo 不为 NULL,则由 StdVideoEncodeAV1PictureInfo::pTileInfo 指向的 StdVideoAV1TileInfo 结构的成员解释如下:

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • TileColsTileRows 指定瓦片列数和瓦片行数,如 AV1 规范 6.8.14 节中所定义。

  • tile_size_bytes_minus_1 被忽略,因为它的值,如 AV1 规范 6.8.14 节中所定义,是编码过程的结果所确定的。

  • pMiColStartspMiRowStarts 被忽略,因为 AV1 规范 6.8.14 节中定义的 MiColStartsMiRowStarts 数组的元素由实现根据实现确定的或通过 pWidthInSbsMinus1pHeightInSbsMinus1 数组分别指定的瓦片宽度和高度来确定。

  • pWidthInSbsMinus1NULL 或指向一个包含 TileCols 个无符号整数的数组的指针,该数组对应于 AV1 规范 6.8.14 节中定义的 width_in_sbs_minus_1

  • pHeightInSbsMinus1NULL 或指向一个包含 TileRows 个无符号整数的数组的指针,该数组对应于 AV1 规范 6.8.14 节中定义的 height_in_sbs_minus_1

  • StdVideoAV1TileInfo 的所有其他成员的解释如 AV1 规范 6.8.14 节中所定义。

如果设置了 flags.uniform_tile_spacing_flag,则 pWidthInSbsMinus1pHeightInSbsMinus1 将被忽略。

如果未设置 flags.uniform_tile_spacing_flag 并且 pWidthInSbsMinus1NULL,则单个瓦片列的宽度将以实现相关的方式确定。

如果未设置 flags.uniform_tile_spacing_flag 并且 pHeightInSbsMinus1NULL,则单个瓦片行的高度将以实现相关的方式确定。

一般来说,实现应遵循应用程序指定的 AV1 瓦片参数。然而,由于实现可能对瓦片列和行计数以及瓦片宽度和高度的组合有限制,这些限制与 AV1 规范和本规范(通过视频配置文件功能)中指定的限制相比,某些参数组合可能需要实现进行覆盖,以符合此类特定于实现的限制。

活动参数集

活动序列头是存储在绑定视频会话参数对象中的 AV1 序列头

有效用法
  • VUID-VkVideoEncodeAV1PictureInfoKHR-flags-10289
    如果 VkVideoEncodeAV1CapabilitiesKHR::flags(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回)不包含 VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR,则 primaryReferenceCdfOnly 必须VK_FALSE

  • VUID-VkVideoEncodeAV1PictureInfoKHR-primaryReferenceCdfOnly-10290
    如果 primaryReferenceCdfOnly 设置为 VK_TRUE,则 pStdPictureInfo->primary_ref_frame 必须小于 VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR

  • VUID-VkVideoEncodeAV1PictureInfoKHR-pStdPictureInfo-10291
    如果 pStdPictureInfo->primary_ref_frame 小于 VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR,则 referenceNameSlotIndices[pStdPictureInfo->primary_ref_frame] 必须不为负数。

  • VUID-VkVideoEncodeAV1PictureInfoKHR-flags-10292
    如果 VkVideoEncodeAV1CapabilitiesKHR::flags(由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回)不包含 VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR,则 generateObuExtensionHeader 必须VK_FALSE

  • VUID-VkVideoEncodeAV1PictureInfoKHR-generateObuExtensionHeader-10293
    如果 generateObuExtensionHeader 设置为 VK_TRUE,则 pStdPictureInfo->pExtensionHeader 必须不为 NULL

有效用法(隐式)
  • VUID-VkVideoEncodeAV1PictureInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR

  • VUID-VkVideoEncodeAV1PictureInfoKHR-predictionMode-parameter
    predictionMode 必须为有效的 VkVideoEncodeAV1PredictionModeKHR 值。

  • VUID-VkVideoEncodeAV1PictureInfoKHR-rateControlGroup-parameter
    rateControlGroup 必须为有效的 VkVideoEncodeAV1RateControlGroupKHR 值。

  • VUID-VkVideoEncodeAV1PictureInfoKHR-pStdPictureInfo-parameter
    pStdPictureInfo 必须是指向有效 StdVideoEncodeAV1PictureInfo 值的有效指针。

VkVideoEncodeAV1DpbSlotInfoKHR 结构定义如下:

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1DpbSlotInfoKHR {
    VkStructureType                          sType;
    const void*                              pNext;
    const StdVideoEncodeAV1ReferenceInfo*    pStdReferenceInfo;
} VkVideoEncodeAV1DpbSlotInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pStdReferenceInfo 是指向 StdVideoEncodeAV1ReferenceInfo 结构的指针,该结构指定 AV1 参考信息

如果 pSetupReferenceSlot 不为 NULL,则此结构在 VkVideoEncodeInfoKHR::pNext 链中指定,并在 VkVideoEncodeInfoKHR::pReferenceSlots 的元素的 pNext 链中指定,以指定 AV1 编码操作的特定于编解码器的参考图像信息。

活动参考图像信息

当此结构在 VkVideoEncodeInfoKHR::pReferenceSlots 的元素的 pNext 链中指定时,对于 VkVideoEncodeInfoKHR::pReferenceSlots 的每个元素,会将一个元素添加到视频编码操作使用的活动参考图片列表中,如下所示

重建图像信息

当此结构在 VkVideoEncodeInfoKHR::pSetupReferenceSlotpNext 链中指定时,与重建图片相关的信息定义如下

Std 参考信息

pStdReferenceInfo 指向的 StdVideoEncodeAV1ReferenceInfo 结构的成员解释如下:

  • flags.reservedreserved1 仅用于填充目的,否则将被忽略;

  • flags.disable_frame_end_update_cdf 的解释如 AV1 规范的 6.8.2 节中所定义;

  • flags.segmentation_enabled 的解释如 AV1 规范的 6.8.13 节中所定义;

  • RefFrameId 被解释为 AV1 规范第 6.8.2 节中定义的 RefFrameId 数组的元素,对应于参考帧;

  • frame_type 的解释如 AV1 规范的 6.8.2 节中所定义;

  • OrderHint 的解释如 AV1 规范的 6.8.2 节中所定义;

  • pExtensionHeaderNULL 或指向 StdVideoEncodeAV1ExtensionHeader 结构的指针,该结构的 temporal_idspatial_id 成员分别指定参考帧的时间和空间层 ID。

有效用法(隐式)
  • VUID-VkVideoEncodeAV1DpbSlotInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_DPB_SLOT_INFO_KHR

  • VUID-VkVideoEncodeAV1DpbSlotInfoKHR-pStdReferenceInfo-parameter
    pStdReferenceInfo 必须是指向有效 StdVideoEncodeAV1ReferenceInfo 值的有效指针。

AV1 编码码率控制

图像组

在 AV1 编码的情况下,通常的做法是在编码后续帧时,按照显示顺序遵循帧类型和预测方向的规则模式。此模式称为图像组 (GOP)。

与某些其他视频压缩标准不同,AV1 规范不限制基于所使用的帧类型或 AV1 预测模式的参考帧的显示顺序方向。因此,本规范引入了码率控制组的概念,应用程序可以为其指定单独的码率控制配置参数。在编码帧时,应用程序通过 VkVideoEncodeAV1PictureInfoKHR::rateControlGroup 中的 VkVideoEncodeAV1RateControlGroupKHR 值指定编码帧所属的码率控制组。然后,实现方的码率控制算法使用此值来确定哪些码率控制配置参数适用于它。

可能的 AV1 编码码率控制组如下:

// Provided by VK_KHR_video_encode_av1
typedef enum VkVideoEncodeAV1RateControlGroupKHR {
    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR = 0,
    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR = 1,
    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR = 2,
} VkVideoEncodeAV1RateControlGroupKHR;
  • 当编码仅使用帧内预测的 AV1 帧时(例如,当编码 STD_VIDEO_AV1_FRAME_TYPE_KEYSTD_VIDEO_AV1_FRAME_TYPE_INTRA_ONLY 类型的 AV1 帧时),指定 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR

  • 当编码在显示顺序中只有前向参考的 AV1 帧时,指定 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR

  • 当编码在显示顺序中具有后向参考的 AV1 帧时,指定 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR

虽然应用程序可以为任何帧指定任何速率控制组,而无需考虑帧类型、预测模式或预测方向,但是,指定与编码帧使用的预测方向不符的速率控制组可能会导致实现速率控制算法时出现意外行为。

常规 GOP 由以下参数定义

  • GOP 中的帧数;

  • 在显示顺序中,使用其他速率控制组编码的帧之间,连续使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧的数量。

GOP 进一步分类为开放 GOP 和闭合 GOP。

开放 GOP 中的帧类型在显示顺序中按照以下算法相互跟随

  1. 第一帧始终是使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR 编码的帧。

  2. 接下来是一定数量的连续帧,使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码。

  3. 如果尚未达到 GOP 中的帧数,则下一帧是使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR 编码的帧,算法从步骤 2 继续。

av1 open gop
图 11. AV1 开放式 GOP

对于封闭式 GOP,在特定周期使用 AV1 帧类型 STD_VIDEO_AV1_FRAME_TYPE_KEY 的帧。

av1 closed gop
图 12. AV1 封闭式 GOP

AV1 编码的典型做法是在 GOP 的帧中使用特定的参考图像使用模式。最常用的两种参考模式如下所示

平面参考模式
  • 每个使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR 编码的帧都将其显示顺序中最后一个未使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧作为其前向参考。

  • 每个使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧都将其显示顺序中最后一个未使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧作为其前向参考,并将其显示顺序中下一个未使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧作为其后向参考。

av1 ref pattern flat
图 13. AV1 平坦参考模式
二元参考模式
  • 每个使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR 编码的帧都将其显示顺序中最后一个未使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧作为其前向参考。

  • 以下算法应用于显示顺序中,在使用其他速率控制组的帧之间,连续使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧序列

    1. 此序列中间的帧使用该序列之前的帧作为其前向参考,并使用该序列之后的帧作为其后向参考。

    2. 对于以下帧序列,递归执行该算法

      • 如果存在,则为原始序列中位于中间帧之前的帧。

      • 如果存在,则为原始序列中位于中间帧之后的帧。

av1 ref pattern dyadic
图 14. AV1 二分参考模式

应用程序可以向实现的速率控制算法提供有关应用程序所使用的 GOP 结构的指导。任何关于 GOP 及其结构的指导并不强制应用程序使用特定的 GOP 结构,因为帧类型和选择的速率控制组仍然由应用程序控制,但是,任何偏离所提供指导的行为可能会导致不希望的速率控制行为,包括但不限于,实现无法符合应用程序指定的预期平均或目标比特率,或其他速率控制参数。

当使用 AV1 编码会话对多个时间层进行编码时,在对后续帧进行编码时,通常也遵循显示顺序中编码帧的 AV1 时间 ID 的常规模式。此模式称为时间 GOP。最常用的时间层模式如下

二元时间层模式
  • 时间 GOP 中的帧数为 2n-1,其中 n 是时间层的数量。

  • 当且仅当 i 中设置的最低有效位的索引等于 n-t-1 时,时间 GOP 中的第 i 帧才使用时间 ID t,但第一帧除外,第一帧是时间 GOP 中唯一使用时间 ID 零的帧。

  • 时间 GOP 中的第 ith 帧使用第 rth 帧作为参考,其中 r 是通过清除 i 中设置的最低有效位来计算的,但时间 GOP 中的第一帧除外,如果存在,它使用前一个时间 GOP 的第一帧作为参考。

av1 layer pattern dyadic
图 15. AV1 二分时间层模式

多层速率控制和多层编码通常用于需要低延迟的流媒体情况,因此帧通常不使用显示顺序中的后向参考。

VkVideoEncodeAV1RateControlInfoKHR 结构定义如下

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1RateControlInfoKHR {
    VkStructureType                        sType;
    const void*                            pNext;
    VkVideoEncodeAV1RateControlFlagsKHR    flags;
    uint32_t                               gopFrameCount;
    uint32_t                               keyFramePeriod;
    uint32_t                               consecutiveBipredictiveFrameCount;
    uint32_t                               temporalLayerCount;
} VkVideoEncodeAV1RateControlInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flagsVkVideoEncodeAV1RateControlFlagBitsKHR 的位掩码,用于指定 AV1 速率控制标志。

  • gopFrameCount 是应用程序打算使用的图像组 (GOP)中的帧数。如果设置为 0,则速率控制算法可能会假设一个与实现相关的 GOP 长度。如果设置为 UINT32_MAX,则 GOP 长度被视为无限。

  • keyFramePeriod 是两个 AV1 帧类型为 STD_VIDEO_AV1_FRAME_TYPE_KEY 的帧之间的间隔,以帧数为单位(请参阅关键帧周期)。如果设置为 0,则速率控制算法可能会假设一个与实现相关的关键帧周期。如果设置为 UINT32_MAX,则关键帧周期被视为无限。

  • consecutiveBipredictiveFrameCount 是在 GOP 中使用其他速率控制组编码的帧之间,连续使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧的数量。

  • temporalLayerCount 指定应用程序打算使用的 AV1 时间层的数量。

当此结构的实例包含在传递给 vkCmdControlVideoCodingKHR 命令的 VkVideoCodingControlInfoKHR 结构的 pNext 链中,并且 VkVideoCodingControlInfoKHR::flags 包含 VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR 时,此结构中的参数将用作实现速率控制算法的指导(请参阅 视频编码控制)。

有效用法
  • VUID-VkVideoEncodeAV1RateControlInfoKHR-flags-10294
    如果 flags 包含 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHRVK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR,则它必须也包含 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REGULAR_GOP_BIT_KHR

  • VUID-VkVideoEncodeAV1RateControlInfoKHR-flags-10295
    如果 flags 包含 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR,则它必须也不能包含 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR

  • VUID-VkVideoEncodeAV1RateControlInfoKHR-flags-10296
    如果 flags 包含 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REGULAR_GOP_BIT_KHR,则 gopFrameCount必须大于 0

  • VUID-VkVideoEncodeAV1RateControlInfoKHR-keyFramePeriod-10297
    如果 keyFramePeriod 不为 0,则它必须大于或等于 gopFrameCount

  • VUID-VkVideoEncodeAV1RateControlInfoKHR-consecutiveBipredictiveFrameCount-10298
    如果 consecutiveBipredictiveFrameCount 不为 0,则它必须小于 gopFrameCount

  • VUID-VkVideoEncodeAV1RateControlInfoKHR-temporalLayerCount-10299
    temporalLayerCount必须小于或等于 VkVideoEncodeAV1CapabilitiesKHR::maxTemporalLayerCount,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为使用的视频配置文件返回

有效用法(隐式)
  • VUID-VkVideoEncodeAV1RateControlInfoKHR-sType-sType
    sType必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_INFO_KHR

  • VUID-VkVideoEncodeAV1RateControlInfoKHR-flags-parameter
    flags必须VkVideoEncodeAV1RateControlFlagBitsKHR 值的有效组合

可在 VkVideoEncodeAV1RateControlInfoKHR::flags 中设置的位,用于指定 AV1 速率控制标志,为

// Provided by VK_KHR_video_encode_av1
typedef enum VkVideoEncodeAV1RateControlFlagBitsKHR {
    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REGULAR_GOP_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_TEMPORAL_LAYER_PATTERN_DYADIC_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR = 0x00000004,
    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR = 0x00000008,
} VkVideoEncodeAV1RateControlFlagBitsKHR;
  • VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REGULAR_GOP_BIT_KHR 指定应用程序打算根据 VkVideoEncodeAV1RateControlInfoKHR 结构的 gopFrameCountkeyFramePeriod 成员中指定的参数使用常规 GOP 结构

  • VK_VIDEO_ENCODE_AV1_RATE_CONTROL_TEMPORAL_LAYER_PATTERN_DYADIC_BIT_KHR 指定应用程序打算遵循二分时间层模式

  • VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR 指定应用程序打算在 GOP 中遵循平坦参考模式

  • VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR 指定应用程序打算在 GOP 中遵循双元参考模式

// Provided by VK_KHR_video_encode_av1
typedef VkFlags VkVideoEncodeAV1RateControlFlagsKHR;

VkVideoEncodeAV1RateControlFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkVideoEncodeAV1RateControlFlagBitsKHR 的掩码。

码率控制层

VkVideoEncodeAV1RateControlLayerInfoKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1RateControlLayerInfoKHR {
    VkStructureType                 sType;
    const void*                     pNext;
    VkBool32                        useMinQIndex;
    VkVideoEncodeAV1QIndexKHR       minQIndex;
    VkBool32                        useMaxQIndex;
    VkVideoEncodeAV1QIndexKHR       maxQIndex;
    VkBool32                        useMaxFrameSize;
    VkVideoEncodeAV1FrameSizeKHR    maxFrameSize;
} VkVideoEncodeAV1RateControlLayerInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • useMinQIndex 指示码率控制确定的量化器索引值是否会钳制到 minQIndex 中指定的量化器索引值的下限。

  • minQIndex 指定量化器索引值的下限,对于每个码率控制组,当 useMinQIndex 设置为 VK_TRUE 时,实现方案的码率控制算法将使用这些下限。

  • useMaxQIndex 指示码率控制确定的量化器索引值是否会钳制到 maxQIndex 中指定的量化器索引值的上限。

  • maxQIndex 指定量化器索引值的上限,对于每个码率控制组,当 useMaxQIndex 设置为 VK_TRUE 时,实现方案的码率控制算法将使用这些上限。

  • useMaxFrameSize 指示实现方案的码率控制算法是否应使用 maxFrameSize 中指定的值作为每个码率控制组的编码帧大小的上限。

  • maxFrameSize 指定每个码率控制组的编码帧大小的上限,当 useMaxFrameSize 设置为 VK_TRUE 时使用。

当使用时,minQIndexmaxQIndex 中的值保证实现方案使用的有效量化器索引值将分别遵守这些下限和上限。但是,限制实现方案能够使用的量化器索引值范围也将限制实现方案的码率控制算法遵守其他约束的能力。特别是,实现方案可能无法遵守以下内容:

通常,应用程序需要适当地配置速率控制参数,以便获得所需的速率控制行为,如视频编码速率控制部分所述。

当此结构的实例包含在传递给 vkCmdControlVideoCodingKHR 命令的 VkVideoEncodeRateControlInfoKHR 结构的 pLayers 数组成员的元素之一中指定的 VkVideoEncodeRateControlLayerInfoKHR 结构的 pNext 链中时,VkVideoCodingControlInfoKHR::flags 包含 VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR,并且绑定的视频会话是使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 创建的,它指定了 pLayers 的该元素对应的码率控制层的 AV1 特定码率控制参数。

有效用法
  • VUID-VkVideoEncodeAV1RateControlLayerInfoKHR-useMinQIndex-10300
    如果 useMinQIndexVK_TRUE,则 minQIndexintraQIndexpredictiveQIndexbipredictiveQIndex 成员必须全部介于 VkVideoEncodeAV1CapabilitiesKHR::minQIndexVkVideoEncodeAV1CapabilitiesKHR::maxQIndex 之间,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为使用的视频配置文件返回的值。

  • VUID-VkVideoEncodeAV1RateControlLayerInfoKHR-useMinQIndex-10301
    如果 useMinQIndexVK_TRUE,并且 VkVideoEncodeAV1CapabilitiesKHR::flags (如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为使用的视频配置文件返回的值) 不包含 VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR,则 minQIndexintraQIndexpredictiveQIndexbipredictiveQIndex 成员必须全部指定相同的值。

  • VUID-VkVideoEncodeAV1RateControlLayerInfoKHR-useMaxQIndex-10302
    如果 useMaxQIndexVK_TRUE,则 maxQIndexintraQIndexpredictiveQIndexbipredictiveQIndex 成员必须全部介于 VkVideoEncodeAV1CapabilitiesKHR::minQIndexVkVideoEncodeAV1CapabilitiesKHR::maxQIndex 之间,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为使用的视频配置文件返回的值。

  • VUID-VkVideoEncodeAV1RateControlLayerInfoKHR-useMaxQIndex-10303
    如果 useMaxQIndexVK_TRUE,并且 VkVideoEncodeAV1CapabilitiesKHR::flags (如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为使用的视频配置文件返回的值) 不包含 VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR,则 maxQIndexintraQIndexpredictiveQIndexbipredictiveQIndex 成员必须全部指定相同的值。

  • VUID-VkVideoEncodeAV1RateControlLayerInfoKHR-useMinQIndex-10304
    如果 useMinQIndexuseMaxQIndex 均为 VK_TRUE,则 minQIndexintraQIndexpredictiveQIndexbipredictiveQIndex 成员必须全部小于或等于 maxQIndex 的相应成员。

有效用法(隐式)
  • VUID-VkVideoEncodeAV1RateControlLayerInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_LAYER_INFO_KHR

  • VUID-VkVideoEncodeAV1RateControlLayerInfoKHR-minQIndex-parameter
    minQIndex 必须是有效的 VkVideoEncodeAV1QIndexKHR 结构。

  • VUID-VkVideoEncodeAV1RateControlLayerInfoKHR-maxQIndex-parameter
    maxQIndex 必须是有效的 VkVideoEncodeAV1QIndexKHR 结构。

  • VUID-VkVideoEncodeAV1RateControlLayerInfoKHR-maxFrameSize-parameter
    maxFrameSize 必须是有效的 VkVideoEncodeAV1FrameSizeKHR 结构。

VkVideoEncodeAV1QIndexKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1QIndexKHR {
    uint32_t    intraQIndex;
    uint32_t    predictiveQIndex;
    uint32_t    bipredictiveQIndex;
} VkVideoEncodeAV1QIndexKHR;
  • intraQIndex 是用于以 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR 编码的帧的量化器索引。

  • predictiveQIndex 是用于以 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR 编码的帧的量化器索引。

  • bipredictiveQIndex 是用于以 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧的量化器索引。

VkVideoEncodeAV1FrameSizeKHR 结构的定义如下:

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1FrameSizeKHR {
    uint32_t    intraFrameSize;
    uint32_t    predictiveFrameSize;
    uint32_t    bipredictiveFrameSize;
} VkVideoEncodeAV1FrameSizeKHR;
  • intraFrameSize 是用于以 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR 编码的帧的大小(以字节为单位)。

  • predictiveFrameSize 是用于使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR 编码的帧的大小(以字节为单位)。

  • bipredictiveFrameSize 是用于使用 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧的大小(以字节为单位)。

GOP 剩余帧

除了会话级别的码率控制配置之外,应用程序可以指定图像组 (GOP) 中每种帧类型的剩余帧数。

VkVideoEncodeAV1GopRemainingFrameInfoKHR 结构定义如下:

// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1GopRemainingFrameInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkBool32           useGopRemainingFrames;
    uint32_t           gopRemainingIntra;
    uint32_t           gopRemainingPredictive;
    uint32_t           gopRemainingBipredictive;
} VkVideoEncodeAV1GopRemainingFrameInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • useGopRemainingFrames 指示实现中的码率控制算法是否应该使用 gopRemainingIntragopRemainingPredictivegopRemainingBipredictive 中指定的值。如果 useGopRemainingFramesVK_FALSE,则 gopRemainingIntragopRemainingPredictivegopRemainingBipredictive 的值将被忽略。

  • gopRemainingIntra 指定在执行下一个视频编码操作之前,实现中的码率控制算法应该假定在 GOP 中剩余的以 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR 编码的帧的数量。

  • gopRemainingPredictive 指定在执行下一个视频编码操作之前,实现中的码率控制算法应该假定在 GOP 中剩余的以 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR 编码的帧的数量。

  • gopRemainingBipredictive 指定在执行下一个视频编码操作之前,实现中的码率控制算法应该假定在 GOP 中剩余的以 VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR 编码的帧的数量。

只有当 VkVideoEncodeAV1CapabilitiesKHR::requiresGopRemainingFrames 为所使用的 视频配置文件 报告为 VK_TRUE 时,才强制将 useGopRemainingFrames 设置为 VK_TRUE 并将此结构包含在 VkVideoBeginCodingInfoKHRpNext 链中。但是,即使不需要,实现也可以使用这些剩余的帧计数(如果指定)。特别是,当应用程序不使用规则 GOP 结构时,这些值可以为实现的码率控制算法提供额外的指导。

VkVideoEncodeAV1CapabilitiesKHR::prefersGopRemainingFrames 功能也用于指示如果应用程序使用此结构指定剩余的帧计数,则实现的码率控制算法可能会更准确地运行。

与其他速率控制指导值一样,如果应用程序编码的帧的有效顺序和数量与在任何给定点在此结构中指定的剩余帧计数不一致,则实现中的速率控制算法的行为可能会偏离应用程序预期的行为。

有效用法(隐式)
  • VUID-VkVideoEncodeAV1GopRemainingFrameInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_GOP_REMAINING_FRAME_INFO_KHR

AV1 量化器索引增量图

AV1 编码配置文件一起使用的量化增量图被称为量化器索引增量图,它们的纹素包含表示量化器索引增量值的整数值,这些值在确定编码图片的量化器索引的过程中应用。

因此,AV1 量化器索引增量图始终具有单通道整数格式,如 VkVideoFormatPropertiesKHR::format 中报告的那样。

码率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR 时,量化器索引增量值将添加到恒定的量化器索引值,实际上,这使应用程序能够在使用量化图纹素大小的粒度上显式控制使用的量化器索引值。

对于所有其他码率控制模式,量化器索引增量值可以用于偏移码率控制算法原本会产生的量化器索引值。

AV1 编码量化

执行 AV1 编码操作涉及为单个 AV1 模式信息块分配量化器索引值的过程。此过程取决于使用的码率控制模式以及其他编码和码率控制参数,如下所述:

  • 如果配置的码率控制模式为 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR,则量化器索引值由特定于实现的默认码率控制算法初始化。

    • 如果视频编码操作是使用量化增量图发出的,则与模式信息块对应的量化器索引增量值,如从量化图中获取,将被添加到先前确定的量化器索引值。如果获取的量化器索引增量值超出 VkVideoEncodeAV1QuantizationMapCapabilitiesKHRminQIndexDeltamaxQIndexDelta 成员中报告的受支持的量化器索引增量值范围,则用于模式信息块的量化器索引值将变为未定义

  • 如果配置的码率控制模式为 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则量化器索引值将从为编码帧指定的恒定量化器索引值初始化。

    • 如果视频编码操作是使用量化增量图发出的,则与模式信息块对应的量化器索引增量值,如从量化图中获取,将被添加到先前确定的量化器索引值。如果获取的量化器索引增量值超出 VkVideoEncodeAV1QuantizationMapCapabilitiesKHRminQIndexDeltamaxQIndexDelta 成员中报告的受支持的量化器索引增量值范围,则用于模式信息块的量化器索引值将变为未定义

  • 如果配置的码率控制模式不是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHRVK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,则量化器索引值将由相应的码率控制算法初始化。

    • 如果视频编码操作是使用量化增量图发出的,则与模式信息块对应的量化器索引增量值,如从量化图中获取,将被添加到先前确定的量化器索引值。如果获取的量化器索引增量值超出 VkVideoEncodeAV1QuantizationMapCapabilitiesKHRminQIndexDeltamaxQIndexDelta 成员中报告的受支持的量化器索引增量值范围,则用于模式信息块的量化器索引值将变为未定义

    • 如果视频编码操作是使用强调图发出的,则码率控制将根据模式信息块对应的强调值,如从量化图中获取,根据以下公式调整量化器索引值:

      QIndexnew = f(QIndexprev,e)

      其中 QIndexnew 是结果量化器索引值,QIndexprev 是先前确定的量化器索引值,e 是与宏块对应的强调值,f 是实现定义的函数,对于该函数,以下含义为真:

      e1 < e2 ⇒ f(QIndex,e1) ≥ f(QIndex,e2)

      这意味着较低的强调值将导致较高的量化器索引值,而较高的强调值将导致较低的量化器索引值,但对于给定的输入量化器索引值,该函数不会相对于输入强调值严格递减。

    • 如果在应用的码率控制层中启用了钳位到最小量化器索引值,则量化器索引值将被钳位到相应的最小量化器索引值。

    • 如果在应用的码率控制层中启用了钳位到最大量化器索引值,则量化器索引值将被钳位到相应的最大量化器索引值。

  • 在所有情况下,最终的量化器索引值都将被钳位到视频配置文件支持的最小和最大量化器索引值。

AV1 编码要求

本节描述了对于至少有一个队列族支持 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR 视频编解码器操作的物理设备(如 vkGetPhysicalDeviceQueueFamilyProperties2VkQueueFamilyVideoPropertiesKHR::videoCodecOperations 中返回)的必需 AV1 编码功能。

表 11. 必需的视频标准标头版本
视频标准头名称 版本

vulkan_video_codec_av1std_encode

1.0.0

表 12. 必需的视频功能
视频功能 要求 要求类型1

VkVideoCapabilitiesKHR

flags

-

min

minBitstreamBufferOffsetAlignment

4096

max

minBitstreamBufferSizeAlignment

4096

max

pictureAccessGranularity

(64,64)

max

minCodedExtent

-

max

maxCodedExtent

-

min

maxDpbSlots

0

min

maxActiveReferencePictures

0

min

VkVideoEncodeCapabilitiesKHR

flags

-

min

rateControlModes

-

min

maxBitrate

5529600

min

maxQualityLevels

1

min

encodeInputPictureGranularity

(64,64)

max

supportedEncodeFeedbackFlags

VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR

min

VkVideoEncodeAV1CapabilitiesKHR

flags

-

min

codedPictureAlignment

(8,8)

min

maxTiles

1

min

minTileSize

-

max

maxTileSize

-

min

maxLevel

STD_VIDEO_AV1_LEVEL_2_0

min

superblockSizes

至少设置一位

实现相关

maxSingleReferenceCount

0

min

singleReferenceNameMask

- 2

min

maxUnidirectionalCompoundReferenceCount

0 3

min

maxUnidirectionalCompoundGroup1ReferenceCount

0 3,4

min

unidirectionalCompoundReferenceNameMask

- 2

min

maxBidirectionalCompoundReferenceCount

0 3

min

maxBidirectionalCompoundGroup1ReferenceCount

0 3,5

min

maxBidirectionalCompoundGroup2ReferenceCount

0 3,5

min

双向复合参考名称掩码

- 2

min

maxTemporalLayerCount

1

min

最大空间层数

1

min

最大操作点数

0

min

最小量化索引

-

max

最大量化索引

-

min

prefersGopRemainingFrames

-

实现相关

requiresGopRemainingFrames

-

实现相关

stdSyntaxFlags

-

min

VkVideoEncodeQuantizationMapCapabilitiesKHR

maxQuantizationMapExtent

- 6

min

VkVideoEncodeAV1QuantizationMapCapabilitiesKHR

最小量化索引差值

- 7

max

最大量化索引差值

- 7

min

1

要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。

2

这些掩码必须仅在最低有效VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR位(位索引i表示当使用相应的 AV1预测模式时,支持 AV1参考名称 STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME + i)中设置位,并且必须在任何 *ReferenceNameMask 功能中至少设置与相应的 max*ReferenceCount 功能值一样多的位。

3

如果大于零,则必须至少为2

4

maxUnidirectionalCompoundGroup1ReferenceCount 必须小于或等于 maxUnidirectionalCompoundReferenceCount

5

maxBidirectionalCompoundGroup1ReferenceCountmaxBidirectionalCompoundGroup2ReferenceCount 的总和必须大于或等于 maxBidirectionalCompoundReferenceCount

6

如果 VkVideoCapabilitiesKHR::flags 包括 VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHRVK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR,则 maxQuantizationMapExtentwidthheight 成员必须大于零。

7

如果 VkVideoCapabilitiesKHR::flags 包含 VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR,那么 maxQIndexDelta 必须大于 minQIndexDelta