视频编码
Vulkan 实现可能会公开一个或多个支持视频编码操作的队列族。这些操作通过将它们记录到视频编码范围内的命令缓冲区中,并将它们提交到具有兼容视频编码功能的队列来执行。
Vulkan 视频功能旨在通过一组相互构建的 API 提供,包括
-
提供通用视频编码功能的核心 API,
-
分别提供与编解码器无关的视频解码和视频编码相关功能的 API,
-
构建在这些 API 之上的其他特定于编解码器的 API。
本章详细介绍了这些 API 的基本组件和操作。
视频图像资源
在视频编码的上下文中,可以用作视频编码操作的源或目标的多维图像数据数组被称为视频图像资源。它们可能存储额外的元数据,其中包括在执行视频编码操作期间使用的实现私有信息,如稍后所述。
视频图像资源的参数使用 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
codedOffset
是要使用的图像子区域的纹素偏移量。 -
codedExtent
是编码图像数据的大小(以像素为单位)。 -
baseArrayLayer
是imageViewBinding
中指定的图像视图的数组层,用作视频图像资源。 -
imageViewBinding
是表示视频图像资源的图像视图。
此类结构引用的图像子资源定义为 baseArrayLayer
中指定的图像数组层索引,相对于创建 imageViewBinding
中指定的图像视图时使用的图像子资源范围。
codedOffset
和 codedExtent
的含义取决于使用视频图像资源的命令和上下文,以及所使用的视频配置文件和相应的编解码器特定语义,如稍后所述。
视频图像资源由该结构的实例引用的图像子资源以及 codedOffset
和 codedExtent
成员唯一定义,这些成员根据特定的编解码器语义标识引用的图像子资源内对应于视频图像资源的图像子区域。
对视频图像资源中的图像数据的访问发生在 VkVideoCapabilitiesKHR::pictureAccessGranularity
指示的粒度上,该粒度由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为所使用的视频配置文件返回。因此,给定与视频图像资源对应的有效图像子区域,实际访问的图像子区域可能大于该子区域,因为它可能包含由于图像访问粒度而产生的额外填充纹素。视频编码操作对这些填充纹素执行的任何写入都会导致未定义的纹素值。
如果两个视频图像资源引用相同的图像子资源,并且它们指定相同的 codedOffset
和 codedExtent
值,则它们匹配。
解码图像缓冲区
视频编码管道的一个组成部分是从压缩的视频比特流中重建图像。重建图像 是此过程产生的 视频图像资源。
这些重建图像可以在后续的视频编码操作中用作参考图像,以提供对后续解码或编码图像的样本值的预测。正确使用此类重建图像作为参考图像取决于视频压缩标准、实现以及特定于应用程序的用例。
在单个视频编码操作中用于提供此类预测的参考图像列表称为活动参考图像列表。
解码图像缓冲区 (DPB) 是一个索引数据结构,它维护可用于视频编码操作的参考图像集。 DPB 的各个索引条目称为解码图像缓冲区 (DPB) 插槽。 有效 DPB 插槽索引的范围在零到 N-1
之间,其中 N
是 DPB 的容量。每个 DPB 插槽可以引用包含视频帧的参考图像,或者可以引用最多两个包含顶部和/或底部场的参考图像,当两者都存在时,它们共同表示一个完整的视频帧。
在 Vulkan 中,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槽使用新的底场图像激活,则该关联将被替换为与用于激活它的重建场图像的关联,而不影响其他场图像关联(如果有)。
视频配置文件
VkVideoProfileInfoKHR
结构定义如下:
// Provided by VK_KHR_video_queue
typedef struct VkVideoProfileInfoKHR {
VkStructureType sType;
const void* pNext;
VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
} VkVideoProfileInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
videoCodecOperation
是一个 VkVideoCodecOperationFlagBitsKHR 值,指定视频编解码器操作。 -
chromaSubsampling
是一个 VkVideoChromaSubsamplingFlagBitsKHR 的位掩码,指定视频色度子采样信息。 -
lumaBitDepth
是一个 VkVideoComponentBitDepthFlagBitsKHR 的位掩码,指定视频亮度位深度信息。 -
chromaBitDepth
是一个 VkVideoComponentBitDepthFlagBitsKHR 的位掩码,指定视频色度位深度信息。
视频配置文件作为输入提供给视频功能查询,例如 vkGetPhysicalDeviceVideoCapabilitiesKHR 或 vkGetPhysicalDeviceVideoFormatPropertiesKHR,以及在创建用于视频编码操作的资源(如图像、缓冲区、查询池和视频会话)时使用。
视频配置文件的完整描述由该结构的实例以及其 pNext
链中提供的编解码器特定和辅助结构指定。
当此结构被指定为 vkGetPhysicalDeviceVideoCapabilitiesKHR 的输入参数,或者通过 VkVideoProfileListInfoKHR 结构的 pProfiles
成员(在查询命令的输入参数的 pNext
链中,例如 vkGetPhysicalDeviceVideoFormatPropertiesKHR 或 vkGetPhysicalDeviceImageFormatProperties2)时,以下错误代码指示查询操作失败的特定原因:
-
VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR
指定请求的视频图像布局(例如,通过包含在VkVideoProfileInfoKHR
的pNext
链中的 VkVideoDecodeH264ProfileInfoKHR 结构的pictureLayout
成员)不受支持。 -
VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR
指定videoCodecOperation
指定的视频配置文件操作不受支持。 -
VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR
指定chromaSubsampling
、lumaBitDepth
或chromaBitDepth
指定的视频格式参数不受支持。 -
VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR
指定与视频编解码器操作对应的编解码器特定参数不受支持。
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
结构添加到 VkVideoProfileInfoKHR 的 pNext
链中,可以提供有关视频解码用例的更多信息。
VkVideoDecodeUsageInfoKHR
结构定义如下:
// Provided by VK_KHR_video_decode_queue
typedef struct VkVideoDecodeUsageInfoKHR {
VkStructureType sType;
const void* pNext;
VkVideoDecodeUsageFlagsKHR videoUsageHints;
} VkVideoDecodeUsageInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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
结构添加到 VkVideoProfileInfoKHR 的 pNext
链中,可以提供有关视频编码用例的更多信息。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
videoUsageHints
是 VkVideoEncodeUsageFlagBitsKHR 的位掩码,指定有关视频编码配置文件预期用途的提示。 -
videoContentHints
是 VkVideoEncodeContentFlagBitsKHR 的位掩码,指定有关要使用视频编码配置文件编码的内容的提示。 -
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
profileCount
是pProfiles
数组中的元素数量。 -
pProfiles
是指向 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
将填充指定视频配置文件支持的能力。否则,返回视频配置文件特定错误代码之一。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是一个 VkVideoCapabilityFlagBitsKHR 的位掩码,指定功能标志。 -
minBitstreamBufferOffsetAlignment
是码流缓冲区偏移的最小对齐值。 -
minBitstreamBufferSizeAlignment
是码流缓冲区范围大小的最小对齐值。 -
pictureAccessGranularity
是对视频图像资源进行图像访问的粒度。 -
minCodedExtent
是编码帧的最小宽度和高度。 -
maxCodedExtent
是编码帧的最大宽度和高度。 -
maxDpbSlots
是单个视频会话支持的 DPB 插槽的最大数量。 -
maxActiveReferencePictures
是单个视频编码操作可以使用的活动参考图像的最大数量。 -
stdHeaderVersion
是一个 VkExtensionProperties 结构,报告视频配置文件支持的 Video Std 头名称和版本。
视频压缩标准通常允许将与活动 DPB 插槽关联的所有参考图像用作活动参考图像,因此对于视频解码配置文件, |
可以在 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;
// 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 结构数组的指针,其中返回支持的图像格式和功能。
如果 pVideoFormatProperties
为 NULL
,则在 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
, 这针对在 pVideoFormatInfo
的 pNext
链中提供的 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_KHR
和 VK_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
成员但具有不同 componentMapping
、imageType
或 imageTiling
值的 VkVideoFormatPropertiesKHR
条目,如下所述。
如果 VkPhysicalDeviceVideoFormatInfoKHR::imageUsageFlags
包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR
或 VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR
,则当查询的量化映射类型支持多个不同的 量化映射纹素大小 时,可以返回多个具有相同 format
、componentMapping
、imageType
和 imageTiling
成员值,但在 VkVideoFormatQuantizationMapPropertiesKHR 结构(如果包含在 VkVideoFormatPropertiesKHR::pNext
链中)中返回不同 quantizationMapTexelSize
的 VkVideoFormatPropertiesKHR
条目。
此外,根据 VkPhysicalDeviceVideoFormatInfoKHR
结构的 imageUsage
成员,即使对于同一组视频配置文件,也可以返回不同的 VkVideoFormatPropertiesKHR
条目集,例如,基于请求编码输入、编码 DPB、解码输出和/或解码 DPB 用途。
应用程序可以选择 VkVideoFormatPropertiesKHR
条目中返回的参数,并在创建输入、输出和 DPB 图像时使用兼容的参数。实现将报告所有用于所请求视频配置文件的图像的有效图像创建和用途标志,但应用程序应该仅使用那些特定用例所必需的标志创建图像。
在创建图像之前,应用程序可以通过调用 vkGetPhysicalDeviceImageFormatProperties2 并使用从报告的 VkVideoFormatPropertiesKHR
条目之一的成员派生的参数,以及将相同的 VkVideoProfileListInfoKHR 结构添加到 VkPhysicalDeviceImageFormatInfo2 的 pNext
链中,来获取支持的完整图像格式特性集。
以下内容适用于 vkGetPhysicalDeviceVideoFormatPropertiesKHR
返回的所有 VkVideoFormatPropertiesKHR
条目
-
当使用
VkVideoFormatPropertiesKHR
::format
调用时,vkGetPhysicalDeviceFormatProperties2 必须成功。 -
如果
VkVideoFormatPropertiesKHR
::imageTiling
为VK_IMAGE_TILING_OPTIMAL
,则 vkGetPhysicalDeviceFormatProperties2 返回的optimalTilingFeatures
必须包含该格式在VkVideoFormatPropertiesKHR
::imageUsageFlags
中报告的图像用途标志所需的所有格式特性,如格式特性依赖的用途标志部分所示。 -
如果
VkVideoFormatPropertiesKHR
::imageTiling
为VK_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
的值。
-
VkVideoFormatPropertiesKHR
的 componentMapping
成员定义了从 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
VkPhysicalDeviceVideoFormatInfoKHR
结构定义为
// Provided by VK_KHR_video_queue
typedef struct VkPhysicalDeviceVideoFormatInfoKHR {
VkStructureType sType;
const void* pNext;
VkImageUsageFlags imageUsage;
} VkPhysicalDeviceVideoFormatInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
imageUsage
是一个 VkImageUsageFlagBits 的位掩码,指定视频图像的预期用途。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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 结构链的单个数组元素,用于描述有问题的视频配置文件。
视频会话
创建视频会话
要创建视频会话对象,请调用
// 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
。
此外,如果 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
中导出,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 为 pCreateInfo->pVideoProfile
指定的视频配置文件返回。因此,创建的视频会话被称为使用等于该值的 minCodedExtent
创建的。
如果视频会话对象是通过视频编码操作创建的,如果任何指定的视频标准参数不符合所用视频压缩标准的语法或语义要求,或者如果根据所用视频压缩标准定义的规则从参数导出的值不符合视频压缩标准或实现的能力,则实现可能返回 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
queueFamilyIndex
是将要使用创建的视频会话的队列族的索引。 -
flags
是一个 VkVideoSessionCreateFlagBitsKHR 的位掩码,用于指定创建标志。 -
pVideoProfile
是一个指向 VkVideoProfileInfoKHR 结构的指针,用于指定将要使用创建的视频会话的视频配置文件。 -
pictureFormat
是将要使用创建的视频会话的图像格式。如果pVideoProfile->videoCodecOperation
指定了解码操作,则pictureFormat
是可与创建的视频会话一起使用的解码输出图像的图像格式。如果pVideoProfile->videoCodecOperation
指定了编码操作,则pictureFormat
是可与创建的视频会话一起使用的编码输入图像的图像格式。 -
maxCodedExtent
是将要使用创建的视频会话的编码帧的最大宽度和高度。 -
maxDpbSlots
是可以与创建的视频会话一起使用的DPB 插槽的最大数量。 -
maxActiveReferencePictures
是在单个视频编码操作中使用创建的视频会话时可以使用的活动参考图像的最大数量。 -
pStdHeaderVersion
是一个指向 VkExtensionProperties 结构的指针,用于请求为pVideoProfile
中指定的videoCodecOperation
使用的视频标准头版本。
在 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
控制主机内存分配,如内存分配章节中所述。
视频会话内存关联
在创建视频会话对象之后,并且在可以使用该对象将视频编码操作记录到使用它的命令缓冲区之前,应用程序必须分配设备内存并将设备内存绑定到视频会话。 设备内存是单独分配的(请参见设备内存),然后与视频会话关联。
视频会话可能具有由唯一无符号整数值标识的多个内存绑定。 在使用视频会话记录使用它的命令缓冲命令之前,必须将适当的设备内存绑定到每个此类内存绑定。
要确定视频会话对象的内存需求,请调用
// Provided by VK_KHR_video_queue
VkResult vkGetVideoSessionMemoryRequirementsKHR(
VkDevice device,
VkVideoSessionKHR videoSession,
uint32_t* pMemoryRequirementsCount,
VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements);
-
device
是拥有视频会话的逻辑设备。 -
videoSession
是要查询的视频会话。 -
pMemoryRequirementsCount
是一个指向整数的指针,该整数与可用或查询的内存绑定需求数量相关,如下所述。 -
pMemoryRequirements
为NULL
或指向 VkVideoSessionMemoryRequirementsKHR 结构数组的指针,其中返回视频会话的内存绑定需求。
如果 pMemoryRequirements
为 NULL
,则视频会话所需的内存绑定数量将在 pMemoryRequirementsCount
中返回。否则,pMemoryRequirementsCount
必须指向由应用程序设置为 pMemoryRequirements
数组中元素数量的变量,并且在返回时,该变量将被实际写入 pMemoryRequirements
的内存绑定需求的数量覆盖。如果 pMemoryRequirementsCount
小于视频会话所需的内存绑定数量,则最多将 pMemoryRequirementsCount
个元素写入 pMemoryRequirements
,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示并非所有所需的内存绑定需求都已返回。
VkVideoSessionMemoryRequirementsKHR
结构的定义如下:
// Provided by VK_KHR_video_queue
typedef struct VkVideoSessionMemoryRequirementsKHR {
VkStructureType sType;
void* pNext;
uint32_t memoryBindIndex;
VkMemoryRequirements memoryRequirements;
} VkVideoSessionMemoryRequirementsKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
memoryBindIndex
是内存绑定的索引。 -
memoryRequirements
是一个 VkMemoryRequirements 结构,其中返回了由memoryBindIndex
指定的绑定索引所请求的内存绑定要求。
要将内存附加到视频会话对象,请调用:
// Provided by VK_KHR_video_queue
VkResult vkBindVideoSessionMemoryKHR(
VkDevice device,
VkVideoSessionKHR videoSession,
uint32_t bindSessionMemoryInfoCount,
const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos);
-
device
是拥有视频会话的逻辑设备。 -
videoSession
是要与设备内存绑定的视频会话。 -
bindSessionMemoryInfoCount
是pBindSessionMemoryInfos
中的元素数量。 -
pBindSessionMemoryInfos
是指向bindSessionMemoryInfoCount
个 VkBindVideoSessionMemoryInfoKHR 结构数组的指针,这些结构指定要绑定到视频会话特定内存绑定的内存区域。
以下有效使用语句指的是与 pBindSessionMemoryInfos
的特定元素对应的 VkMemoryRequirements 结构,其定义如下:
-
如果
pBindSessionMemoryInfos
的元素的memoryBindIndex
成员与使用相同的videoSession
且pMemoryRequirementsCount
等于bindSessionMemoryInfoCount
调用 vkGetVideoSessionMemoryRequirementsKHR 时,pMemoryRequirements
中返回的元素之一的memoryBindIndex
成员匹配,则pMemoryRequirements
的该元素的memoryRequirements
成员是与pBindSessionMemoryInfos
的元素对应的 VkMemoryRequirements 结构。 -
否则,据说
pBindSessionMemoryInfos
的相关元素没有相应的 VkMemoryRequirements 结构。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
memoryBindIndex
是要将内存绑定到的内存绑定索引。 -
memory
是要绑定到视频会话的内存绑定(索引为memoryBindIndex
)的已分配的设备内存。 -
memoryOffset
是要绑定的memory
区域的起始偏移量。 -
memorySize
是从memoryOffset
字节开始,要绑定的memory
区域的大小(以字节为单位)。
视频配置文件兼容性
与特定视频会话一起使用的资源和查询池必须与创建该视频会话的 视频配置文件兼容。
如果 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 也与视频配置文件兼容:
-
VkImageCreateInfo::
flags
包含VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR
。 -
通过调用 vkGetPhysicalDeviceVideoFormatPropertiesKHR 获取的 VkVideoFormatPropertiesKHR 结构列表,其中 VkPhysicalDeviceVideoFormatInfoKHR::
imageUsage
等于创建图像时使用的 VkImageCreateInfo::usage
,并且 VkPhysicalDeviceVideoFormatInfoKHR::pNext
链包含一个 VkVideoProfileListInfoKHR 结构,其pProfiles
成员包含一个指定所讨论的视频配置文件的 VkVideoProfileInfoKHR 结构链的单个数组元素,该列表包含一个元素,该元素对于创建图像时使用的 VkImageCreateInfo 结构满足以下所有条件:-
VkImageCreateInfo::
format
等于 VkVideoFormatPropertiesKHR::format
。 -
VkImageCreateInfo::
flags
仅包含VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR
和/或 VkVideoFormatPropertiesKHR::imageCreateFlags
中也设置的位。当启用 videoMaintenance1 功能时,在创建解码输出图片或编码输入图片时始终支持指定
VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR
,而无需考虑 VkVideoFormatPropertiesKHR::imageCreateFlags
中报告的受支持的 VkImageCreateFlags。因此,对于任何视频格式,实现不应在 VkVideoFormatPropertiesKHR::imageCreateFlags
中报告VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR
。 -
VkImageCreateInfo::
imageType
等于 VkVideoFormatPropertiesKHR::imageType
。 -
VkImageCreateInfo::
tiling
等于 VkVideoFormatPropertiesKHR::imageTiling
。 -
VkImageCreateInfo::
usage
仅包含 VkVideoFormatPropertiesKHR::imageUsageFlags
中也设置的位,或者 VkImageCreateInfo::flags
包含VK_IMAGE_CREATE_EXTENDED_USAGE_BIT
。
-
虽然其中一些规则允许创建可能与任何视频配置文件兼容的缓冲区或图像资源,但应用程序仍然应该首选包含预期将使用该缓冲区或图像资源的特定视频配置文件(通过相应的创建信息结构的 |
如果 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_KHR
或VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR
创建的视频会话对象创建的视频会话参数对象,会使用VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR结构中quantizationMapTexelSize
成员指定的特定兼容的量化映射纹素大小创建,该结构包含在pCreateInfo
的pNext
链中。
这意味着这种视频会话参数对象兼容的量化映射纹素大小在该对象的生命周期内是固定的。应用程序必须创建单独的视频会话参数对象,以便在单个视频会话对象中使用不同的量化映射纹素大小。这是必要的,因为所使用的量化映射纹素大小可能会影响实现必须执行的参数覆盖,从而影响所使用的编解码器特定参数的最终值。 |
对于使用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_id
和pic_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_id
和sps_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_id
、pps_seq_parameter_set_id
和pps_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_id
和pic_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_id
和sps_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_id
、pps_seq_parameter_set_id
和pps_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
错误。
应用程序不应依赖任何命令返回 |
VkVideoSessionParametersCreateInfoKHR
结构的定义如下
// Provided by VK_KHR_video_queue
typedef struct VkVideoSessionParametersCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkVideoSessionParametersCreateFlagsKHR flags;
VkVideoSessionParametersKHR videoSessionParametersTemplate;
VkVideoSessionKHR videoSession;
} VkVideoSessionParametersCreateInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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_id
与spsAddList
中已有的任何条目都不匹配的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_id
或pic_parameter_set_id
与ppsAddList
中已有的任何条目都不匹配的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_id
与vpsAddList
中已有的任何条目都不匹配的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_id
或sps_seq_parameter_set_id
与spsAddList
中已有的任何条目都不匹配的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_id
、pps_seq_parameter_set_id
或pps_pic_parameter_set_id
与ppsAddList
中已有的任何条目都不匹配的StdVideoH265PictureParameterSet
条目添加到ppsAddList
中。
-
-
如果
videoSession
是使用编码操作创建的,则让uint32_t qualityLevel
作为创建的视频会话参数对象的视频编码质量级别,定义如下-
如果此结构的
pNext
链包含 VkVideoEncodeQualityLevelInfoKHR 结构,则qualityLevel
等于 VkVideoEncodeQualityLevelInfoKHR::qualityLevel
。 -
否则
qualityLevel
为0
-
-
如果
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_id
与spsAddList
中已有的任何条目都不匹配的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_id
或pic_parameter_set_id
与ppsAddList
中已有的任何条目都不匹配的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_id
与vpsAddList
中已有的任何条目都不匹配的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_id
或sps_seq_parameter_set_id
与spsAddList
中已有的任何条目都不匹配的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_id
、pps_seq_parameter_set_id
或pps_pic_parameter_set_id
与ppsAddList
中已有的任何条目都不匹配的StdVideoH265PictureParameterSet
条目添加到ppsAddList
中。
-
可以在 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
quantizationMapTexelSize
指定与使用VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR
创建的视频会话参数对象兼容的量化映射纹素大小。
销毁视频会话参数
要销毁视频会话参数对象,请调用
// Provided by VK_KHR_video_queue
void vkDestroyVideoSessionParametersKHR(
VkDevice device,
VkVideoSessionParametersKHR videoSessionParameters,
const VkAllocationCallbacks* pAllocator);
-
device
是销毁视频会话参数对象的逻辑设备。 -
videoSessionParameters
是要销毁的视频会话参数对象。 -
pAllocator
控制主机内存分配,如内存分配章节中所述。
更新视频会话参数
要使用新参数更新视频会话参数对象,请调用
// 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
-
H.264 SPS 条目在 VkVideoDecodeH264SessionParametersAddInfoKHR::
pStdSPSs
中指定。 -
H.264 PPS 条目在 VkVideoDecodeH264SessionParametersAddInfoKHR::
pStdPPSs
中指定。
如果 videoSessionParameters
是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR
创建的,并且 pUpdateInfo->pNext
链包含 VkVideoDecodeH265SessionParametersAddInfoKHR 结构,则此命令会将以下参数条目添加到 videoSessionParameters
-
H.265 VPS 条目在 VkVideoDecodeH265SessionParametersAddInfoKHR::
pStdVPSs
中指定。 -
H.265 SPS 条目在 VkVideoDecodeH265SessionParametersAddInfoKHR::
pStdSPSs
中指定。 -
H.265 PPS 条目在 VkVideoDecodeH265SessionParametersAddInfoKHR::
pStdPPSs
中指定。
如果 videoSessionParameters
是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR
创建的,并且 pUpdateInfo->pNext
链包含 VkVideoEncodeH264SessionParametersAddInfoKHR 结构,则此命令会将以下参数条目添加到 videoSessionParameters
-
H.264 SPS 条目在 VkVideoEncodeH264SessionParametersAddInfoKHR::
pStdSPSs
中指定。 -
H.264 PPS 条目在 VkVideoEncodeH264SessionParametersAddInfoKHR::
pStdPPSs
中指定。
如果 videoSessionParameters
是使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR
创建的,并且 pUpdateInfo->pNext
链包含 VkVideoEncodeH265SessionParametersAddInfoKHR 结构,则此命令会将以下参数条目添加到 videoSessionParameters
-
H.265 VPS 条目在 VkVideoEncodeH265SessionParametersAddInfoKHR::
pStdVPSs
中指定。 -
在 VkVideoEncodeH265SessionParametersAddInfoKHR::
pStdSPSs
中指定的 H.265 SPS 条目。 -
在 VkVideoEncodeH265SessionParametersAddInfoKHR::
pStdPPSs
中指定的 H.265 PPS 条目。
在通过视频编码操作创建的视频会话参数对象的情况下,如果任何指定的视频标准参数不符合所用视频压缩标准的语法或语义要求,或者如果根据所用视频压缩标准定义的规则从参数派生的值不符合视频压缩标准或实现的功能,则实现可能返回 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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槽索引都 可以在视频编码范围内响应视频编码操作而更改。
作为 pBeginInfo->pReferenceSlots
元素提供的 VkVideoReferenceSlotInfoKHR 结构由此命令解释如下:
-
如果
slotIndex
为非负数且pPictureResource
不为NULL
,则由pPictureResource
指向的 VkVideoPictureResourceInfoKHR 结构定义的视频图片资源将添加到绑定参考图片资源集中,并与slotIndex
中指定的DPB槽索引关联。 -
如果
slotIndex
为非负数且pPictureResource
为NULL
,则此命令将停用索引为slotIndex
的DPB槽。 -
如果
slotIndex
为负数且pPictureResource
不为NULL
,则由pPictureResource
指向的 VkVideoPictureResourceInfoKHR 结构定义的视频图片资源将添加到绑定参考图片资源集中,而不与DPB槽关联。这样的图片资源 可以随后用作重建图片,以将其与DPB槽关联。 -
如果
slotIndex
为负数且pPictureResource
为NULL
,则忽略该元素。
多个绑定参考图片资源可能与同一DPB槽索引关联,或者单个绑定参考图片可能引用多个单独的参考图片。例如,在支持隔行帧的H.264解码配置文件的情况下,单个DPB槽可以引用顶部和底部字段的两个单独的图片。根据H.264解码配置文件使用的图片布局,可能会出现以下特殊情况:
|
pBeginInfo->pReferenceSlots
的元素中指定的所有非负 slotIndex
值 必须标识在设备上执行此命令时处于活动状态的视频会话的DPB槽。
应用程序不必在 |
对于视频编码会话,应用程序还负责通过在 pBeginInfo
的 pNext
链中包含 VkVideoEncodeRateControlInfoKHR 结构的实例,来提供有关为视频会话配置的当前速率控制状态的信息。 如果未包含 VkVideoEncodeRateControlInfoKHR,则表示存在一个空的 VkVideoEncodeRateControlInfoKHR 结构,这表明当前的速率控制模式是 VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR
。 指定的状态必须与在设备上执行记录的命令时为视频会话配置的有效速率控制状态匹配。
在 |
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
保留供将来使用。 -
videoSession
是将绑定用于处理视频命令的视频会话对象。 -
videoSessionParameters
是VK_NULL_HANDLE
或用于处理视频命令的 VkVideoSessionParametersKHR 对象的句柄。如果为VK_NULL_HANDLE
,则在视频编码范围的持续时间内不绑定视频会话参数对象。 -
referenceSlotCount
是pReferenceSlots
数组中的元素数量。 -
pReferenceSlots
是指向 VkVideoReferenceSlotInfoKHR 结构数组的指针,指定用于确定视频编码范围的绑定参考图像资源集及其与 DPB 插槽索引的初始关联的信息。
以下定义了此结构的相关有效用法语句所引用的限制值。
-
令
VkOffset2D codedOffsetGranularity
为视频图像资源的编码偏移的最小对齐要求。除非另有定义,否则codedOffsetGranularity
的x
和y
成员的值均为0
。-
如果使用 H.264 解码配置文件创建
videoSession
,且 VkVideoDecodeH264ProfileInfoKHR::pictureLayout
为VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR
,则codedOffsetGranularity
等于 VkVideoDecodeH264CapabilitiesKHR::fieldOffsetGranularity
,如 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对该视频配置文件返回的值。
-
// 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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
slotIndex
是 DPB 插槽的索引或负整数值。 -
pPictureResource
是NULL
或指向 VkVideoPictureResourceInfoKHR 结构体的指针,该结构体描述与slotIndex
指定的 DPB 插槽索引关联的 视频图像资源。
要结束视频编码范围,请调用:
// Provided by VK_KHR_video_queue
void vkCmdEndVideoCodingKHR(
VkCommandBuffer commandBuffer,
const VkVideoEndCodingInfoKHR* pEndCodingInfo);
-
commandBuffer
是要在其中记录命令的命令缓冲区。 -
pEndCodingInfo
是指向 VkVideoEndCodingInfoKHR 结构体的指针,该结构体指定用于结束视频编码范围的参数。
结束视频编码范围后,视频会话对象、可选的视频会话参数对象以及先前由对应的 vkCmdBeginVideoCodingKHR 命令绑定的所有参考图像资源都将解除绑定。
VkVideoEndCodingInfoKHR
结构定义如下:
// Provided by VK_KHR_video_queue
typedef struct VkVideoEndCodingInfoKHR {
VkStructureType sType;
const void* pNext;
VkVideoEndCodingFlagsKHR flags;
} VkVideoEndCodingInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
保留供将来使用。
// 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
链中。
VkVideoCodingControlInfoKHR
结构定义如下:
// Provided by VK_KHR_video_queue
typedef struct VkVideoCodingControlInfoKHR {
VkStructureType sType;
const void* pNext;
VkVideoCodingControlFlagsKHR flags;
} VkVideoCodingControlInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是 VkVideoCodingControlFlagsKHR 的位掩码,指定控制标志。
可以在 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
queryPool
是VK_NULL_HANDLE
或指向 VkQueryPool 对象的有效句柄,该对象将管理查询的结果。 -
firstQuery
是查询池内的查询索引,它将包含第一个视频编码操作的查询结果。后续视频编码操作的查询结果将包含在后续的查询索引中。 -
queryCount
是要执行的查询数量。实际上,如果
queryPool
不是VK_NULL_HANDLE
,则queryCount
始终必须与此结构指定的视频编码命令发出的视频编码操作的数量相匹配,这意味着在视频编码命令中使用内联查询将始终为每个发出的视频编码操作执行查询。
此结构可以包含在视频编码命令的输入参数结构的 pNext
链中。
-
在 vkCmdDecodeVideoKHR 命令的
pDecodeInfo
参数的pNext
链中,以执行该命令发出的每个视频解码操作的查询。 -
在 vkCmdEncodeVideoKHR 命令的
pEncodeInfo
参数的pNext
链中,以执行该命令发出的每个视频编码操作的查询。
视频解码操作
视频解码操作从视频码流缓冲区和零个或多个参考图像中消耗压缩的视频数据,并生成一个解码输出图像和一个可选的重建图像。
视频解码操作可能在 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR
阶段访问以下资源:
视频解码操作访问的每个视频图像资源的图像子资源使用相应的 VkVideoPictureResourceInfoKHR 结构指定。每个这样的图像子资源必须处于适当的图像布局,如下所示:
编解码器特定语义
视频解码操作的以下方面是编解码器特定的:
这些编解码器特定的行为是为每个视频编解码器操作单独定义的。
-
如果使用的视频编解码器操作是
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 解码操作 部分的定义执行。
能力
当使用 pVideoProfile->videoCodecOperation
指定解码操作调用 vkGetPhysicalDeviceVideoCapabilitiesKHR 时,VkVideoCapabilitiesKHR 结构的 pNext
链中必须包含 VkVideoDecodeCapabilitiesKHR
结构,以检索特定于视频解码的功能。
VkVideoDecodeCapabilitiesKHR
结构定义如下
// Provided by VK_KHR_video_decode_queue
typedef struct VkVideoDecodeCapabilitiesKHR {
VkStructureType sType;
void* pNext;
VkVideoDecodeCapabilityFlagsKHR flags;
} VkVideoDecodeCapabilitiesKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是 VkVideoDecodeCapabilityFlagBitsKHR 的位掩码,描述了支持的视频解码功能。
在 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_KHR
和 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR
中的一个。因此,应用程序应该处理这两种情况,以最大限度地提高可移植性。
如果同时支持 |
// 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 结构的指针,该结构指定视频解码操作的参数。
目前,每次调用此命令都会导致发出单个视频解码操作。
如果使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR
创建了绑定的视频会话,并且 pDecodeInfo
的 pNext
链包含一个 VkVideoInlineQueryInfoKHR 结构,其 queryPool
成员指定了一个有效的 VkQueryPool
句柄,则此命令将为发出的每个视频解码操作执行查询。
- 活动参考图像信息
-
视频解码操作使用的 活动参考图像 列表是作为 参考图像 数据源使用的图像子区域以及相关参数的列表,并且是从作为
pDecodeInfo->pReferenceSlots
数组元素提供的 VkVideoReferenceSlotInfoKHR 结构派生的。对于pDecodeInfo->pReferenceSlots
的每个元素,都会根据 编解码器特定语义 的定义,将一个或多个元素添加到活动参考图像列表中。此列表的每个元素都包含以下信息
- 重建图像信息
-
与视频解码操作使用的可选 重建图像 相关的信息是从
pDecodeInfo->pSetupReferenceSlot
指向的 VkVideoReferenceSlotInfoKHR 结构派生的(如果不是NULL
),根据 编解码器特定语义 的定义,并包含以下内容
除非视频会话创建时,VkVideoSessionCreateInfoKHR::maxDpbSlot
等于零,否则始终需要在pDecodeInfo->pSetupReferenceSlot
中指定一个有效的VkVideoReferenceSlotInfoKHR结构。但是,只有根据编解码器特定语义请求参考图像设置时,pDecodeInfo->pSetupReferenceSlot→slotIndex
标识的DPB槽才会被激活,并使用pDecodeInfo->pSetupReferenceSlot→pPictureResource
中指定的重建图像。
如果指定了重建图像信息,并且pDecodeInfo->pSetupReferenceSlot→pPictureResource
引用的视频图像资源与解码输出图像的不同,但未请求参考图像设置,则视频解码操作后,对应于重建图像的视频图像资源的内容将是未定义的。
即使重建图像未标记为将来参考,一些实现也可能始终输出重建图像或在视频解码操作期间将其用作临时存储。 |
下面定义了一些限制值,这些值被此命令的相关有效使用语句引用。
-
令
uint32_t activeReferencePictureCount
为视频解码操作使用的活动参考图像列表的大小。除非另有定义,否则activeReferencePictureCount
设置为pDecodeInfo->referenceSlotCount
的值。-
如果绑定的视频会话是使用H.264解码配置文件创建的,那么令
activeReferencePictureCount
为pDecodeInfo->referenceSlotCount
的值,加上pDecodeInfo->pReferenceSlots
数组中包含VkVideoDecodeH264DpbSlotInfoKHR结构的元素的数量,其中pNext
链中同时设置了pStdReferenceInfo->flags.top_field_flag
和pStdReferenceInfo->flags.bottom_field_flag
。这意味着,根据H.264解码操作的活动参考图像列表构造规则,
pDecodeInfo->pReferenceSlots
中既包含顶部场参考又包含底部场参考的元素被视为两个单独的活动参考图像。
-
-
令
VkOffset2D codedOffsetGranularity
为视频图像资源的编码偏移的最小对齐要求。除非另有定义,否则codedOffsetGranularity
的x
和y
成员的值均为0
。-
如果绑定的视频会话是使用H.264解码配置文件创建的,且VkVideoDecodeH264ProfileInfoKHR::
pictureLayout
为VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR
,那么codedOffsetGranularity
等于VkVideoDecodeH264CapabilitiesKHR::fieldOffsetGranularity
,该值由vkGetPhysicalDeviceVideoCapabilitiesKHR针对该视频配置文件返回。
-
-
令
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_flag
或pStdReferenceInfo->flags.bottom_field_flag
,则dpbFrameUseCount[i]
减1。 -
对于
pDecodeInfo->pReferenceSlots
的每个元素,dpbFrameUseCount[i]
增加1,其中i
等于相应元素的slotIndex
成员。如果绑定的视频会话对象是使用H.264解码配置文件创建的,那么如果pDecodeInfo->pReferenceSlots
的相应元素的pNext
链中的VkVideoDecodeH264DpbSlotInfoKHR结构中设置了pStdReferenceInfo->flags.top_field_flag
或pStdReferenceInfo->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
成员。
-
-
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
保留供将来使用。 -
srcBuffer
是读取编码码流的源视频码流缓冲区。 -
srcBufferOffset
是从srcBuffer
的起始位置到读取编码码流的起始字节偏移量。 -
srcBufferRange
是从srcBufferOffset
开始,从srcBuffer
解码的编码码流的字节大小。 -
dstPictureResource
是用作解码输出图像的视频图像资源。 -
pSetupReferenceSlot
是NULL
或指向 VkVideoReferenceSlotInfoKHR 结构的指针,该结构指定重建图像信息。 -
referenceSlotCount
是pReferenceSlots
数组中的元素数量。 -
pReferenceSlots
是NULL
或指向 VkVideoReferenceSlotInfoKHR 结构数组的指针,该数组描述了 DPB 插槽以及在此视频解码操作中使用的相应参考图像资源(活动参考图像的集合)。
// 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 节中,如下所示:
-
语法元素、派生值和其他参数从以下结构应用:
-
与指定H.264 序列参数集的活动 SPS 相对应的
StdVideoH264SequenceParameterSet
结构。 -
与指定H.264 图像参数集的活动 PPS 相对应的
StdVideoH264PictureParameterSet
结构。 -
指定H.264 图像信息的
StdVideoDecodeH264PictureInfo
结构。 -
指定与可选的重建图像和任何活动参考图像相对应的H.264 参考信息的
StdVideoDecodeH264ReferenceInfo
结构。
-
-
提供的视频码流缓冲区范围的内容按照H.264 解码码流数据访问部分中的定义进行解释。
-
在与使用的活动参考图像、解码输出图像和可选的重建图像相对应的视频图像资源中的图像数据按照 H.264 解码图像数据访问部分中的定义进行访问。
-
根据 H.264 图像信息中指定的参数做出参考图像设置的决定。
如果参数和比特流符合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 解码配置文件的视频解码操作中使用的解码输出图像、参考图像或重建图像对应的有效 imageOffset
和 imageExtent
定义如下:
-
如果图像表示一个帧,则
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)。
其中 codedOffset
和 codedExtent
是与该图像对应的 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdProfileIdc
是一个StdVideoH264ProfileIdc
值,指定 H.264 编解码器配置文件 IDC,如ITU-T H.264 规范的 A.2 节定义。 -
pictureLayout
是一个 VkVideoDecodeH264PictureLayoutFlagBitsKHR 值,指定要解码的 H.264 视频序列使用的图像布局。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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
指定的 视频图像资源 的最小对齐方式。
H.264 解码参数集
使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR
创建的 视频会话参数 对象可以包含以下类型的参数
- H.264 序列参数集 (SPS)
-
由
StdVideoH264SequenceParameterSet
结构表示,并解释如下-
reserved1
和reserved2
仅用于填充目的,否则将被忽略; -
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 节中所定义; -
ScalingList4x4
和ScalingList8x8
对应于 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_flag
或flags.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_id
和pic_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 节中所定义; -
ScalingList4x4
和ScalingList8x8
对应于 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
maxStdSPSCount
是创建的VkVideoSessionParametersKHR
可以包含的 H.264 SPS 条目的最大数量。 -
maxStdPPSCount
是创建的VkVideoSessionParametersKHR
可以包含的 H.264 PPS 条目的最大数量。 -
pParametersAddInfo
可以是NULL
,也可以是指向 VkVideoDecodeH264SessionParametersAddInfoKHR 结构的指针,该结构指定在对象创建时要添加的 H.264 参数。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdSPSCount
是pStdSPSs
数组中的元素数量。 -
pStdSPSs
是指向StdVideoH264SequenceParameterSet
结构数组的指针,这些结构描述要添加的 H.264 SPS 条目。 -
stdPPSCount
是pStdPPSs
数组中的元素数量。 -
pStdPPSs
是指向StdVideoH264PictureParameterSet
结构数组的指针,这些结构描述要添加的 H.264 PPS 条目。
此结构可以在以下位置指定:
-
在用于创建 视频会话参数 对象的 VkVideoSessionParametersCreateInfoKHR 的
pNext
链中指定的 VkVideoDecodeH264SessionParametersCreateInfoKHR 结构的pParametersAddInfo
成员中。在这种情况下,如果创建视频会话参数对象时使用的视频编解码操作是VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR
,则它定义要添加到创建的对象的初始参数集(请参阅 创建视频会话参数)。 -
在 VkVideoSessionParametersUpdateInfoKHR 的
pNext
链中。在这种情况下,如果要更新的 视频会话参数 对象是使用VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR
创建的,则它定义要添加到其中的参数集(请参阅 更新视频会话参数)。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdPictureInfo
是指向StdVideoDecodeH264PictureInfo
结构的指针,该结构指定 H.264 图像信息。 -
sliceCount
是pSliceOffsets
中的元素数量。 -
pSliceOffsets
是指向sliceCount
个偏移量的数组的指针,这些偏移量指定 VkVideoDecodeInfoKHR 中指定的视频码流缓冲区范围内图像切片的起始偏移量。
此结构在传递给 vkCmdDecodeVideoKHR 的 VkVideoDecodeInfoKHR 结构的 pNext
链中指定,以指定 H.264 解码操作的编解码器特定图像信息。
- 解码输出图像信息
-
当此结构在传递给 vkCmdDecodeVideoKHR 的 VkVideoDecodeInfoKHR 结构的
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
结构的成员解释如下:-
reserved1
和reserved2
仅用于填充目的,否则将被忽略; -
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_id
和pic_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
结构的成员用于从绑定的视频会话参数对象中选择要使用的活动参数集,如下所示
VkVideoDecodeH264DpbSlotInfoKHR
结构的定义如下
// Provided by VK_KHR_video_decode_h264
typedef struct VkVideoDecodeH264DpbSlotInfoKHR {
VkStructureType sType;
const void* pNext;
const StdVideoDecodeH264ReferenceInfo* pStdReferenceInfo;
} VkVideoDecodeH264DpbSlotInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdReferenceInfo
是指向StdVideoDecodeH264ReferenceInfo
结构的指针,该结构指定了 H.264 参考信息。
如果 pSetupReferenceSlot
不为 NULL
,则此结构在 VkVideoDecodeInfoKHR 的 pNext
链中指定,并且在 VkVideoDecodeInfoKHR::pReferenceSlots
的元素的 pNext
链中指定,以指定 H.264 解码操作的编解码器特定参考图像信息。
- 活动参考图像信息
-
当此结构在 VkVideoDecodeInfoKHR::
pReferenceSlots
的元素的pNext
链中指定时,对于 VkVideoDecodeInfoKHR::pReferenceSlots
的每个元素,会向视频解码操作使用的活动参考图像列表中添加一个或两个元素,如下所示-
如果
pStdReferenceInfo->flags.top_field_flag
和pStdReferenceInfo->flags.bottom_field_flag
都未设置,则该图像将作为帧参考添加到活动参考图像列表中。 -
如果设置了
pStdReferenceInfo->flags.top_field_flag
,则该图像将作为顶场参考添加到活动参考图像列表中。 -
如果设置了
pStdReferenceInfo->flags.bottom_field_flag
,则该图像将作为底场参考添加到活动参考图像列表中。 -
对于每个添加的参考图像,根据H.264 解码图像数据访问部分确定使用的相应图像子区域。
-
每个添加的参考图像都与 VkVideoDecodeInfoKHR::
pReferenceSlots
的相应元素的slotIndex
成员中指定的 DPB 插槽索引关联。 -
每个添加的参考图像都与
pStdReferenceInfo
中提供的 H.264 参考信息关联。
-
当当前与 DPB 插槽关联的隔行扫描帧的顶场和底场都打算用作活动参考图像,并且两个场都存储在同一图像子区域中时(在使用 |
- 重建图像信息
-
当此结构在 VkVideoDecodeInfoKHR::
pSetupReferenceSlot
的pNext
链中指定时,与重建图像相关的信息定义如下-
如果
pStdReferenceInfo->flags.top_field_flag
和pStdReferenceInfo->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 节中的定义。
-
H.264 解码要求
本节描述了对于至少有一个队列族支持 VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR
视频编解码操作的物理设备,其必需的 H.264 解码能力,该操作由 vkGetPhysicalDeviceQueueFamilyProperties2 在 VkQueueFamilyVideoPropertiesKHR::videoCodecOperations
中返回。
视频标准头名称 | 版本 |
---|---|
|
1.0.0 |
视频功能 | 要求 | 要求类型1 |
---|---|---|
|
- |
min |
|
4096 |
max |
|
4096 |
max |
|
(64,64) |
max |
|
- |
max |
|
- |
min |
|
0 |
min |
|
0 |
min |
|
|
min |
|
|
min |
|
(0,0) 除了使用 |
实现相关 |
- 1
-
“要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。
H.265 解码操作
使用 H.265 解码配置文件的视频解码操作可以用于解码符合 ITU-T H.265 规范的原始视频流序列。
有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言。 |
此过程按照视频解码操作步骤执行,编解码器特定的语义在ITU-T H.265 规范的第 8 节中定义。
-
语法元素、派生值和其他参数从以下结构应用:
-
对应于活动 VPS 的
StdVideoH265VideoParameterSet
结构,指定了H.265 视频参数集。 -
对应于活动 SPS 的
StdVideoH265SequenceParameterSet
结构,指定了H.265 序列参数集。 -
对应于活动 PPS 的
StdVideoH265PictureParameterSet
结构,指定了H.265 图像参数集。 -
指定H.265 图像信息的
StdVideoDecodeH265PictureInfo
结构。 -
指定与可选的重建图像和任何活动参考图像相对应的 H.265 参考信息的
StdVideoDecodeH265ReferenceInfo
结构。
-
-
提供的视频码流缓冲区范围的内容按照H.265 解码码流数据访问部分中的定义进行解释。
-
在与使用的活动参考图像、解码输出图像和可选的重建图像对应的视频图像资源中的图像数据按照H.265 解码图像数据访问部分中的定义进行访问。
-
关于参考图像设置的决定是根据H.265 图像信息中指定的参数做出的。
如果参数和码流符合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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdProfileIdc
是一个StdVideoH265ProfileIdc
值,指定 H.265 编解码器配置文件 IDC,如 ITU-T H.265 规范 的 A.3 节中所定义。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
maxLevelIdc
是一个StdVideoH265LevelIdc
值,表示配置文件支持的最大 H.265 级别,其中枚举常量STD_VIDEO_H265_LEVEL_IDC_<major>_<minor>
标识 H.265 级别<major>.<minor>
,如 ITU-T H.265 规范 的 A.4 节中所定义。
H.265 解码参数集
使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR
创建的视频会话参数对象可以包含以下类型的参数:
- H.265 视频参数集 (VPS)
-
由
StdVideoH265VideoParameterSet
结构表示,并按如下方式解释:-
reserved1
、reserved2
和reserved3
仅用于填充目的,否则将被忽略; -
vps_video_parameter_set_id
用作 VPS 条目的键; -
pDecPicBufMgr
指向的StdVideoH265DecPicBufMgr
结构的max_latency_increase_plus1
、max_dec_pic_buffering_minus1
和max_num_reorder_pics
成员分别对应于vps_max_latency_increase_plus1
、vps_max_dec_pic_buffering_minus1
和vps_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
+ 1 个StdVideoH265SubLayerHrdParameters
结构数组的指针,其中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
+ 1 个StdVideoH265SubLayerHrdParameters
结构数组的指针,其中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
结构表示,并按如下方式解释:-
reserved1
和reserved2
仅用于填充目的,否则将被忽略; -
由
sps_video_parameter_set_id
和sps_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_plus1
、max_dec_pic_buffering_minus1
和max_num_reorder_pics
成员分别对应于sps_max_latency_increase_plus1
、sps_max_dec_pic_buffering_minus1
和sps_max_num_reorder_pics
,如 ITU-T H.265 规范 的 7.4.3.2 节中所定义; -
如果设置了
flags.sps_scaling_list_data_present_flag
,则pScalingLists
指向的StdVideoH265ScalingLists
结构按如下方式解释:-
ScalingList4x4
、ScalingList8x8
、ScalingList16x16
和ScalingList32x32
分别对应于ScalingList[0]
、ScalingList[1]
、ScalingList[2]
和ScalingList[3]
,如 ITU-T H.265 规范 的 7.3.4 节中所定义; -
ScalingListDCCoef16x16
和ScalingListDCCoef32x32
分别对应于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_sets
个StdVideoH265ShortTermRefPicSet
结构数组的指针,其中每个元素按如下方式解释:-
reserved1
、reserved2
和reserved3
仅用于填充目的,否则将被忽略; -
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
结构的解释如下-
reserved1
、reserved2
和reserved3
仅用于填充目的,否则将被忽略; -
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
+ 1 个StdVideoH265SubLayerHrdParameters
结构数组的指针,其中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
+ 1 个StdVideoH265SubLayerHrdParameters
结构数组的指针,其中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
结构表示,并解释如下-
reserved1
、reserved2
和reserved3
仅用于填充目的,否则将被忽略; -
由
sps_video_parameter_set_id
、pps_seq_parameter_set_id
和pps_pic_parameter_set_id
构成的三元组用作 PPS 条目的键; -
如果设置了
flags.pps_scaling_list_data_present_flag
,则由pScalingLists
指向的StdVideoH265ScalingLists
结构的解释如下-
ScalingList4x4
、ScalingList8x8
、ScalingList16x16
和ScalingList32x32
分别对应于ScalingList[0]
、ScalingList[1]
、ScalingList[2]
和ScalingList[3]
,如 ITU-T H.265 规范 的 7.3.4 节中所定义; -
ScalingListDCCoef16x16
和ScalingListDCCoef32x32
分别对应于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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
maxStdVPSCount
是创建的VkVideoSessionParametersKHR
**可以** 包含的最大 H.265 VPS 条目数。 -
maxStdSPSCount
是创建的VkVideoSessionParametersKHR
**可以** 包含的最大 H.265 SPS 条目数。 -
maxStdPPSCount
是创建的VkVideoSessionParametersKHR
**可以** 包含的最大 H.265 PPS 条目数。 -
pParametersAddInfo
是NULL
或指向 VkVideoDecodeH265SessionParametersAddInfoKHR 结构的指针,该结构指定在创建对象时要添加的 H.265 参数。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdVPSCount
是pStdVPSs
数组中的元素数量。 -
pStdVPSs
是指向描述要添加的 H.265 VPS 条目的StdVideoH265VideoParameterSet
结构数组的指针。 -
stdSPSCount
是pStdSPSs
数组中的元素数量。 -
pStdSPSs
是指向描述要添加的 H.265 SPS 条目的StdVideoH265SequenceParameterSet
结构数组的指针。 -
stdPPSCount
是pStdPPSs
数组中的元素数量。 -
pStdPPSs
是指向描述要添加的 H.265 PPS 条目的StdVideoH265PictureParameterSet
结构数组的指针。
此结构可以在以下位置指定:
-
在用于创建 视频会话参数 对象的 VkVideoSessionParametersCreateInfoKHR 的
pNext
链中指定的 VkVideoDecodeH265SessionParametersCreateInfoKHR 结构的pParametersAddInfo
成员中。在这种情况下,如果创建视频会话参数对象时使用的视频编解码器操作是VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR
,则它定义要添加到创建的对象的初始参数集(请参见 创建视频会话参数)。 -
在 VkVideoSessionParametersUpdateInfoKHR 的
pNext
链中。在这种情况下,如果要更新的 视频会话参数 对象使用VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR
创建,则它定义要添加到它的参数集(请参见 更新视频会话参数)。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdPictureInfo
是指向StdVideoDecodeH265PictureInfo
结构的指针,该结构指定 H.265 图像信息。 -
sliceSegmentCount
是pSliceSegmentOffsets
中的元素数量。 -
pSliceSegmentOffsets
是指向包含sliceSegmentCount
个偏移量的数组的指针,这些偏移量指定图像的切片段在 VkVideoDecodeInfoKHR 中指定的视频比特流缓冲区范围内的起始偏移量。
此结构在传递给 vkCmdDecodeVideoKHR 的 VkVideoDecodeInfoKHR 结构的 pNext
链中指定,以指定 H.265 解码操作 的编解码器特定图像信息。
- 解码输出图像信息
-
当此结构在传递给 vkCmdDecodeVideoKHR 的 VkVideoDecodeInfoKHR 结构的
pNext
链中指定时,与 解码输出图像 相关的信息定义如下:-
所使用的图像子区域根据 H.265 解码图像数据访问 部分确定。
-
解码输出图像与
pStdPictureInfo
中提供的 H.265 图像信息 相关联。
-
- 标准图像信息
-
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_id
、pps_seq_parameter_set_id
和pps_pic_parameter_set_id
用于标识活动参数集,如下所述; -
PicOrderCntVal
,如 ITU-T H.265 规范 的第 8.3.1 节中定义; -
NumBitsForSTRefPicSetInSlice
是当short_term_ref_pic_set_sps_flag
为0
时在st_ref_pic_set
中使用的位数,否则为0
,如 ITU-T H.265 规范 的第 7.4.7 和 7.4.8 节中定义; -
NumDeltaPocsOfRefRpsIdx
是当short_term_ref_pic_set_sps_flag
为1
时NumDeltaPocs[RefRpsIdx]
的值,否则为0
,如 ITU-T H.265 规范 的第 7.4.7 和 7.4.8 节中定义; -
RefPicSetStCurrBefore
、RefPicSetStCurrAfter
和RefPicSetLtCurr
的解释如 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_id
和StdVideoDecodeH265PictureInfo
::pps_seq_parameter_set_id
构造的对指定的键标识的 SPS。 -
活动 PPS 是由从
StdVideoDecodeH265PictureInfo
::sps_video_parameter_set_id
、StdVideoDecodeH265PictureInfo
::pps_seq_parameter_set_id
和StdVideoDecodeH265PictureInfo
::pps_pic_parameter_set_id
构造的三元组指定的键标识的 PPS。
-
VkVideoDecodeH265DpbSlotInfoKHR
结构定义如下:
// Provided by VK_KHR_video_decode_h265
typedef struct VkVideoDecodeH265DpbSlotInfoKHR {
VkStructureType sType;
const void* pNext;
const StdVideoDecodeH265ReferenceInfo* pStdReferenceInfo;
} VkVideoDecodeH265DpbSlotInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdReferenceInfo
是指向StdVideoDecodeH265ReferenceInfo
结构的指针,该结构指定 ITU-T H.265 规范 第 8.3 节中描述的参考图像信息。
此结构在 VkVideoDecodeInfoKHR::pSetupReferenceSlot
(如果不是 NULL
)的 pNext
链和 VkVideoDecodeInfoKHR::pReferenceSlots
元素的 pNext
链中指定,以指定 H.265 解码操作的编解码器特定参考图像信息。
- 活动参考图像信息
-
当此结构在 VkVideoDecodeInfoKHR::
pReferenceSlots
元素的pNext
链中指定时,会将一个元素添加到 活动参考图像 列表中,该列表由视频解码操作用于 VkVideoDecodeInfoKHR::pReferenceSlots
的每个元素,如下所示:-
所使用的图像子区域根据 H.265 解码图像数据访问 部分确定。
-
参考图像与 DPB 插槽 索引相关联,该索引在 VkVideoDecodeInfoKHR::
pReferenceSlots
的相应元素的slotIndex
成员中指定。 -
参考图像与
pStdReferenceInfo
中提供的 H.265 参考信息 相关联。
-
- 重建图像信息
-
当此结构在 VkVideoDecodeInfoKHR::
pSetupReferenceSlot
的pNext
链中指定时,与重建图像相关的信息定义如下-
所使用的图像子区域根据 H.265 解码图像数据访问 部分确定。
-
如果请求 参考图像设置,则使用重建的图像来激活 DPB 插槽,其索引在 VkVideoDecodeInfoKHR::
pSetupReferenceSlot->slotIndex
中指定。 -
重建的图像与
pStdReferenceInfo
中提供的 H.265 参考信息 相关联。
-
- 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 节中所定义。
-
H.265 解码要求
本节描述了对于至少有一个队列族支持视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR
的物理设备,**必需** 的 H.265 解码能力,该操作由 vkGetPhysicalDeviceQueueFamilyProperties2 在 VkQueueFamilyVideoPropertiesKHR::videoCodecOperations
中返回。
视频标准头名称 | 版本 |
---|---|
|
1.0.0 |
视频功能 | 要求 | 要求类型1 |
---|---|---|
|
- |
min |
|
4096 |
max |
|
4096 |
max |
|
(64,64) |
max |
|
- |
max |
|
- |
min |
|
0 |
min |
|
0 |
min |
|
|
min |
|
|
min |
- 1
-
“要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。
AV1 解码操作
使用 AV1 解码配置文件 的视频解码操作**可以**用于解码符合 AV1 规范的基本视频流序列。
有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言。 |
-
语法元素、派生值和其他参数从以下结构应用:
-
提供的视频码流缓冲区范围的内容根据AV1 解码码流数据访问部分中定义的方式进行解释。
-
在视频图像资源中,对应于所使用的活动参考图像、解码输出图像和可选的重建图像的图像数据,根据AV1解码图像数据访问部分中定义的方式进行访问。
如果参数和码流符合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 规范的要求,它们的内容应匹配。因此,当存在多个瓦片组时, |
在 VkVideoDecodeAV1PictureInfoKHR::pTileOffsets
和 VkVideoDecodeAV1PictureInfoKHR::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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdProfile
是一个StdVideoAV1Profile
值,指定 AV1 编解码器配置文件,如 AV1 规范 的 A.2 节中所定义。 -
filmGrainSupport
指定是否可以在视频配置文件中使用 AV1 胶片颗粒,如 AV1 规范 的 7.8.3 节中所定义。当此成员为VK_TRUE
时,针对视频配置文件创建的视频会话对象将能够解码启用胶片颗粒的图像。
启用 |
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
maxLevel
是一个StdVideoAV1Level
值,指定配置文件支持的最大 AV1 级别,如 AV1 规范 的 A.3 节中所定义。
AV1 解码参数集
使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR
创建的视频会话参数对象包含以下参数集的单个实例:
- AV1 序列头
-
由
StdVideoAV1SequenceHeader
结构表示,并按如下方式解释:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
pColorConfig
指向的StdVideoAV1ColorConfig
结构按如下方式解释:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdSequenceHeader
是指向一个StdVideoAV1SequenceHeader
结构的指针,该结构描述要存储在创建的对象中的AV1 序列头条目。
由于 AV1 视频会话参数对象将始终只包含一个 AV1 序列头,因此必须在对象创建时指定此头,并且无法使用 vkUpdateVideoSessionParametersKHR 命令更新此类视频会话参数对象。当从输入视频码流解码新的 AV1 序列头时,应用程序需要创建一个新的视频会话参数对象来存储它。 |
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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 中指定的视频码流缓冲区范围内。 -
tileCount
是pTileOffsets
和pTileSizes
中元素的数量。 -
pTileOffsets
是指向一个包含tileCount
个整数的数组的指针,这些整数指定图像的瓦片在 VkVideoDecodeInfoKHR 中指定的视频码流缓冲区范围内的字节偏移量。 -
pTileSizes
是指向一个包含tileCount
个整数的数组的指针,这些整数指定图像的瓦片在 VkVideoDecodeInfoKHR 中指定的视频码流缓冲区范围内的字节大小。
此结构在传递给 vkCmdDecodeVideoKHR 的 VkVideoDecodeInfoKHR 结构的 pNext
链中指定,以指定 AV1 解码操作的编解码器特定图像信息。
- 解码输出图像信息
-
当此结构在传递给 vkCmdDecodeVideoKHR 的 VkVideoDecodeInfoKHR 结构的
pNext
链中指定时,与 解码输出图像 相关的信息定义如下:-
使用的图像子区域根据 AV1 解码图像数据访问部分确定。
-
解码输出图像与
pStdPictureInfo
中提供的AV1 图像信息关联。
-
- 标准图像信息
-
pStdPictureInfo
指向的StdVideoDecodeAV1PictureInfo
结构的成员按如下方式解释:-
flags.reserved
、reserved1
和reserved2
仅用于填充目的,否则将被忽略; -
flags.apply_grain
指示已解码的图像启用了胶片颗粒,如 AV1 规范 的 6.8.20 节中所定义; -
OrderHint
、OrderHints
和expectedFrameId
按照AV1 规范 的 6.8.2 节中的定义进行解释; -
pTileInfo
指向的StdVideoAV1TileInfo
结构按如下方式解释:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
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
结构按如下方式解释 -
由
pLoopFilter
指向的StdVideoAV1LoopFilter
结构按如下方式解释-
flags.reserved
仅用于填充目的,否则将被忽略; -
update_ref_delta
是一个位掩码,其中位索引 i 被解释为对应于loop_filter_ref_deltas
的元素 i 的update_ref_delta
的值,如 AV1 规范的 6.8.10 节中所定义; -
update_mode_delta
是一个位掩码,其中位索引 i 被解释为对应于loop_filter_mode_deltas
的元素 i 的update_mode_delta
的值,如 AV1 规范的 6.8.10 节中所定义; -
StdVideoAV1LoopFilter
的所有其他成员都按照 AV1 规范的 6.8.10 节中的定义进行解释;
-
-
如果在活动序列头中设置了
flags.enable_cdef
,则由pCDEF
指向的StdVideoAV1CDEF
结构的成员按如下方式解释 -
由
pLoopRestoration
指向的StdVideoAV1LoopRestoration
结构按如下方式解释 -
在
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_grain
和 film_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 序列头。
VkVideoDecodeAV1DpbSlotInfoKHR
结构的定义如下
// Provided by VK_KHR_video_decode_av1
typedef struct VkVideoDecodeAV1DpbSlotInfoKHR {
VkStructureType sType;
const void* pNext;
const StdVideoDecodeAV1ReferenceInfo* pStdReferenceInfo;
} VkVideoDecodeAV1DpbSlotInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdReferenceInfo
是指向StdVideoDecodeAV1ReferenceInfo
结构的指针,指定 AV1 参考信息。
如果非 NULL
,此结构在 VkVideoDecodeInfoKHR::pSetupReferenceSlot
的 pNext
链中指定,并在 VkVideoDecodeInfoKHR::pReferenceSlots
的元素的 pNext
链中指定,用于为 AV1 解码操作指定编解码器特定的参考图像信息。
- 活动参考图像信息
-
当此结构在 VkVideoDecodeInfoKHR::
pReferenceSlots
元素的pNext
链中指定时,会将一个元素添加到 活动参考图像 列表中,该列表由视频解码操作用于 VkVideoDecodeInfoKHR::pReferenceSlots
的每个元素,如下所示:-
使用的图像子区域根据 AV1 解码图像数据访问部分确定。
-
参考图像与 DPB 插槽 索引相关联,该索引在 VkVideoDecodeInfoKHR::
pReferenceSlots
的相应元素的slotIndex
成员中指定。 -
参考图像与
pStdReferenceInfo
中提供的 AV1 参考信息相关联。
-
- 重建图像信息
-
当此结构在 VkVideoDecodeInfoKHR::
pSetupReferenceSlot
的pNext
链中指定时,与重建图像相关的信息定义如下-
使用的图像子区域根据 AV1 解码图像数据访问部分确定。
-
如果请求 参考图像设置,则重建的图像用于激活 DPB 插槽,其索引在 VkVideoDecodeInfoKHR::
pSetupReferenceSlot->slotIndex
中指定。 -
重建的图像与
pStdReferenceInfo
中提供的 AV1 参考信息相关联。
-
- Std 参考信息
-
由
pStdReferenceInfo
指向的StdVideoDecodeAV1ReferenceInfo
结构的成员解释如下-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
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 解码要求
本节描述了对于至少有一个队列族支持视频编解码器操作 VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR
的物理设备,必需的 AV1 解码能力,由 vkGetPhysicalDeviceQueueFamilyProperties2 在 VkQueueFamilyVideoPropertiesKHR::videoCodecOperations
中返回。
视频标准头名称 | 版本 |
---|---|
|
1.0.0 |
视频功能 | 要求 | 要求类型1 |
---|---|---|
|
- |
min |
|
4096 |
max |
|
4096 |
max |
|
(64,64) |
max |
|
- |
max |
|
- |
min |
|
0 |
min |
|
0 |
min |
|
|
min |
|
|
min |
- 1
-
“要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。
视频编码操作
视频编码操作消耗一个编码输入图像和零个或多个参考图像,并将压缩的视频数据生成到视频比特流缓冲区和可选的重建图像。
视频编码操作可能在 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR
阶段访问以下资源
视频编码操作访问的每个视频图像资源的图像子资源使用相应的VkVideoPictureResourceInfoKHR 结构指定。每个此类图像子资源必须采用适当的图像布局,如下所示
如果视频编码操作成功完成,并且应用程序提供的编解码器特定参数符合相应视频压缩标准中定义的语法和语义要求,则目标视频码流缓冲区在执行视频编码操作后将包含压缩的视频数据,具体根据相应的编解码器特定语义。
编解码器特定语义
视频编码操作的以下方面是编解码器特定的:
这些编解码器特定的行为是为每个视频编解码器操作单独定义的。
-
如果使用的视频编解码器操作是
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命令),但必须仍然符合为该视频编解码器操作定义的编解码器特定语义,包括但不限于编码的编解码器特定码流元素的数量、类型和顺序。
除了为实现相关原因执行的编解码器特定参数覆盖之外,应用程序可以使实现应用额外的优化覆盖,这可能会提高视频编码操作的效率或性能。但是,即使在进行此类优化覆盖的情况下,实现必须满足上面列出的条件。
除非应用程序选择使用优化覆盖,否则不期望实现覆盖任何编解码器特定的参数,除非由于该实现上可用编码工具的限制而需要此类覆盖才能正确操作视频编码器实现。 |
功能
当使用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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是一个VkVideoEncodeCapabilityFlagBitsKHR的位掩码,描述了支持的编码功能。 -
rateControlModes
是一个VkVideoEncodeRateControlModeFlagBitsKHR的位掩码,指示了支持的码率控制模式。 -
maxRateControlLayers
指示支持的码率控制层的最大数量。 -
maxBitrate
指示支持的最大比特率。 -
maxQualityLevels
指示支持的离散视频编码质量等级的数量。实现必须至少支持一个质量等级。 -
encodeInputPictureGranularity
指示 编码输入图像 数据被编码的粒度,并且可能指示一个纹素粒度,其大小可达最大支持的编解码器特定编码块的大小。此功能不对应用程序施加任何有效的用法约束,但是,根据编码输入图像的内容,它可能会对编码的比特流产生影响,如下文更详细的描述。 -
supportedEncodeFeedbackFlags
是 VkVideoEncodeFeedbackFlagBitsKHR 值的位掩码,指定 视频编码反馈查询 支持的标志。
实现必须在 supportedEncodeFeedbackFlags
中至少包含对 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
和 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR
的支持。
encodeInputPictureGranularity
提供有关 编码输入图像 数据如何用作视频编码操作的输入的信息。特别是,某些实现可能无法将用于编码输出视频比特流的纹素集限制为 VkVideoPictureResourceInfoKHR 结构中指定的与编码输入图像相对应的图像子区域(即,其 codedExtent
成员中指定的要编码的图像数据分辨率)。
例如,应用程序请求编码范围为 1920x1080,但实现只能以编解码器特定的编码块大小(即 16x16 像素)的粒度(或如 |
如果 codedExtent
四舍五入到 encodeInputPictureGranularity
的下一个整数倍大于为 编码输入图像 指定的图像子资源的范围,则与图像子资源边界之外的纹素坐标对应的纹素值可能是未定义的。但是,为了最大限度地提高最后编码块行/列的编码效率,以及/或者为了确保对相同输入内容重复编码时获得一致的编码结果,实现应该为此类纹素使用明确定义的默认值。尽管如此,用于此类纹素的值必须不影响视频编码操作是否生成兼容的比特流,并且必须对编码的图像数据没有其他影响,超出将这些纹素值用作任何压缩算法的输入(如使用的视频压缩标准中所定义)可能产生的其他影响。
尽管不是必需的,但通常情况下,应用程序最好确保用于编码输入图像的图像子资源的范围是编解码器特定的编码块大小(或至少是 |
在 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
。但是,除非支持此编码能力标志,否则应用程序必须不能假设指示视频编码操作未成功完成的不同负查询结果状态代码不是比特流缓冲区条件不足的结果。
// 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);
-
physicalDevice
是要查询其视频编码质量级别属性的物理设备。 -
pQualityLevelInfo
是指向 VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR 结构的指针,该结构指定要查询属性的视频编码配置文件和质量级别。 -
pQualityLevelProperties
是指向 VkVideoEncodeQualityLevelPropertiesKHR 结构的指针,其中返回属性。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pVideoProfile
是指向 VkVideoProfileInfoKHR 结构体的指针,用于指定要查询视频编码质量级别属性的视频配置文件。 -
qualityLevel
是要查询属性的视频编码质量级别。
VkVideoEncodeQualityLevelPropertiesKHR
结构体的定义如下:
// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeQualityLevelPropertiesKHR {
VkStructureType sType;
void* pNext;
VkVideoEncodeRateControlModeFlagBitsKHR preferredRateControlMode;
uint32_t preferredRateControlLayerCount;
} VkVideoEncodeQualityLevelPropertiesKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
preferredRateControlMode
是一个 VkVideoEncodeRateControlModeFlagBitsKHR 值,表示与视频编码质量级别一起使用的首选速率控制模式。 -
preferredRateControlLayerCount
表示与视频编码质量级别一起使用的首选速率控制层的数量。
VkVideoEncodeQualityLevelInfoKHR
结构体的定义如下:
// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeQualityLevelInfoKHR {
VkStructureType sType;
const void* pNext;
uint32_t qualityLevel;
} VkVideoEncodeQualityLevelInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
qualityLevel
是使用的视频编码质量级别。
此结构可以在以下位置指定:
-
在 VkVideoSessionParametersCreateInfoKHR 的
pNext
链中,指定要用于为视频编码会话创建的视频会话参数对象的视频编码质量级别。如果 VkVideoSessionParametersCreateInfoKHR 的pNext
链中未包含此结构的实例,则创建的视频会话参数对象的视频编码质量级别为零。 -
在 VkVideoCodingControlInfoKHR 的
pNext
链中,更改绑定视频会话的视频编码质量级别状态。
检索编码的会话参数
存储在视频会话参数对象中的任何编解码器特定参数,根据所使用的视频压缩标准,可能需要单独编码并包含在最终的视频码流数据中。在这种情况下,应用程序必须调用 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
,也可以是指向用于写入编码参数数据的缓冲区的指针。
如果 pData
为 NULL
,则在 pDataSize
中返回可以检索的编码参数数据的大小(以字节为单位)。否则,pDataSize
必须指向一个由应用程序设置为 pData
指向的缓冲区大小(以字节为单位)的变量,并且在返回时,该变量将被实际写入 pData
的字节数覆盖。如果 pDataSize
小于可以检索的编码参数数据的大小,则不会将数据写入 pData
,pDataSize
将被写入零,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示没有返回编码的参数数据。
如果 pFeedbackInfo
不为 NULL
,则 VkVideoEncodeSessionParametersFeedbackInfoKHR 结构的成员,以及其 pNext
链中包含的任何适用于 pVideoSessionParametersInfo->videoSessionParameters
中指定的视频会话参数对象的其他结构,将在所有成功调用此命令时,填充有关请求的参数数据的反馈信息。
这包括 |
VkVideoEncodeSessionParametersGetInfoKHR
结构定义如下
// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeSessionParametersGetInfoKHR {
VkStructureType sType;
const void* pNext;
VkVideoSessionParametersKHR videoSessionParameters;
} VkVideoEncodeSessionParametersGetInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
videoSessionParameters
是要从中检索编码参数数据的 VkVideoSessionParametersKHR 对象。
根据所使用的视频编码操作,可能需要在该结构的 pNext
链中包含额外的编解码器特定结构,以识别要从中检索编码参数数据的特定视频会话参数,如相应章节中所述。
VkVideoEncodeSessionParametersFeedbackInfoKHR
结构定义如下
// Provided by VK_KHR_video_encode_queue
typedef struct VkVideoEncodeSessionParametersFeedbackInfoKHR {
VkStructureType sType;
void* pNext;
VkBool32 hasOverrides;
} VkVideoEncodeSessionParametersFeedbackInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
hasOverrides
指示所请求的任何参数数据是否被实现覆盖。
根据所使用的视频编码操作,可以在此结构的 pNext
链中包含额外的编解码器特定结构,以捕获有关所请求参数数据的编解码器特定反馈信息,如相应章节中所述。
视频编码命令
要启动视频编码操作,请调用
// Provided by VK_KHR_video_encode_queue
void vkCmdEncodeVideoKHR(
VkCommandBuffer commandBuffer,
const VkVideoEncodeInfoKHR* pEncodeInfo);
-
commandBuffer
是要在其中记录命令的命令缓冲区。 -
pEncodeInfo
是指向 VkVideoEncodeInfoKHR 结构的指针,指定视频编码操作的参数。
目前,每次调用此命令都会导致发出单个视频编码操作。
如果绑定的视频会话是使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR
创建的,并且 pEncodeInfo
的 pNext
链包含一个 VkVideoInlineQueryInfoKHR 结构,其 queryPool
成员指定有效的 VkQueryPool
句柄,那么此命令将为它发出的每个视频编码操作执行一个查询。
- 活动参考图像信息
-
视频编码操作使用的活动参考图片列表是用作 参考图片数据源和相关参数的图像子区域列表,并且是从作为
pEncodeInfo->pReferenceSlots
数组的元素的 VkVideoReferenceSlotInfoKHR 结构派生的。对于pEncodeInfo->pReferenceSlots
的每个元素,根据编解码器特定语义的定义,将一个或多个元素添加到活动参考图片列表。此列表的每个元素都包含以下信息
- 重建图像信息
-
与视频编码操作使用的可选 重建图片相关的信息来自
pEncodeInfo->pSetupReferenceSlot
指向的 VkVideoReferenceSlotInfoKHR 结构(如果不是NULL
),如编解码器特定语义所定义,并且包含以下内容
始终需要在 pEncodeInfo->pSetupReferenceSlot
中指定有效的 VkVideoReferenceSlotInfoKHR 结构,除非视频会话是使用 VkVideoSessionCreateInfoKHR::maxDpbSlot
等于零创建的。但是,只有在根据编解码器特定语义请求参考图片设置时,由 pEncodeInfo->pSetupReferenceSlot→slotIndex
标识的 DPB 插槽才会被使用 pEncodeInfo->pSetupReferenceSlot→pPictureResource
中指定的 重建图片激活。
如果指定了重建图片信息,但根据编解码器特定语义未请求参考图片设置,则与重建图片对应的视频图片资源的内容在视频编码操作后将是未定义的。
某些实现可能总是输出重建图片或在视频编码操作期间将其用作临时存储,即使重建图片未标记为供将来参考。 |
下面定义了一些限制值,这些值被此命令的相关有效使用语句引用。
-
令
uint32_t activeReferencePictureCount
为视频编码操作使用的活动参考图片列表的大小。除非另有定义,否则activeReferencePictureCount
设置为pEncodeInfo->referenceSlotCount
的值。 -
令
VkOffset2D codedOffsetGranularity
为视频图像资源的编码偏移的最小对齐要求。除非另有定义,否则codedOffsetGranularity
的x
和y
成员的值均为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
为视频编码操作可能使用的最大编解码器特定的编码块大小。-
如果绑定的视频会话对象是使用 H.264 编码配置文件创建的,则令
maxCodingBlockSize
等于 H.264 宏块的大小,即{16,16}
。 -
如果绑定的视频会话对象是使用 H.265 编码配置文件创建的,则令
maxCodingBlockSize
等于视频编码操作可能使用的最大 H.265 编码块大小,该大小从 VkVideoEncodeH265CapabilitiesKHR::ctbSizes
中设置的 VkVideoEncodeH265CtbSizeFlagBitsKHR 位对应的 CTB 大小的最大值推导得出,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话时使用的视频配置文件返回。 -
如果绑定的视频会话对象是使用 AV1 编码配置文件创建的,则令
maxCodingBlockSize
等于视频编码操作可能使用的最大 AV1 超级块大小,该大小从 VkVideoEncodeAV1CapabilitiesKHR::superblockSizes
中设置的 VkVideoEncodeAV1SuperblockSizeFlagBitsKHR 位对应的超级块大小的最大值推导得出,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为创建绑定视频会话时使用的视频配置文件返回。 -
否则,
maxCodingBlockSize
是未定义的。
-
-
如果定义了
maxCodingBlockSize
,则令VkExtent2D minCodingBlockExtent
为编码输入图片的编码范围,以编解码器特定的编码块表示,假设此类编码块的最大大小由maxCodingBlockSize
定义,从pEncodeInfo->srcPictureResource
的codedExtent
成员的值计算得出,如下所示:-
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→RefPicList0
和pStdPictureInfo->pRefLists→RefPicList1
数组元素中指定的每个参考索引,如果参考索引不为STD_VIDEO_H264_NO_REFERENCE_PICTURE
,则将pStdReferenceInfo->primary_pic_type
分别添加到h264L0PictureTypes
或h264L1PictureTypes
中,其中pStdReferenceInfo
是pEncodeInfo->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→RefPicList0
和pStdPictureInfo->pRefLists→RefPicList1
数组元素中指定的每个参考索引,如果参考索引不为STD_VIDEO_H265_NO_REFERENCE_PICTURE
,则将pStdReferenceInfo->pic_type
分别添加到h265L0PictureTypes
或h265L1PictureTypes
中,其中pStdReferenceInfo
是pEncodeInfo->pReferenceSlots
的元素的pNext
链中包含的 VkVideoEncodeH265DpbSlotInfoKHR 结构的成员,对于该元素,slotIndex
等于有问题的参考索引。
-
-
如果绑定的视频会话对象是使用 AV1 编码配置文件创建的,则
-
如果
pEncodeInfo->pNext
链中包含的 VkVideoEncodeAV1PictureInfoKHR 结构的primaryReferenceCdfOnly
成员设置为VK_TRUE
,则令int32_t cdfOnlyReferenceIndex
为 VkVideoEncodeAV1PictureInfoKHR::pStdPictureInfo->primary_ref_frame
的值。 -
否则,令
int32_t cdfOnlyReferenceIndex
为-1
。
-
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
是用作 编码输入图像 的视频图像资源。 -
pSetupReferenceSlot
是NULL
或指向 VkVideoReferenceSlotInfoKHR 结构的指针,该结构指定重构图像信息。 -
referenceSlotCount
是pReferenceSlots
数组中的元素数量。 -
pReferenceSlots
是NULL
或指向 VkVideoReferenceSlotInfoKHR 结构数组的指针,该数组描述了 DPB 插槽和对应的参考图像资源,用于此视频编码操作(活动参考图像的集合)。 -
precedingExternallyEncodedBytes
是应用程序外部编码到视频比特流的字节数,用于更新实现 速率控制 算法的内部状态,以说明这些外部编码字节消耗的比特率预算。
可以在 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 的掩码。
视频编码速率控制
视频编码操作产生的编码比特流数据的大小是以下一系列约束的函数
这些还固有地定义了解码器重建和处理编码比特流中图像数据所需的解码器功能集。
视频编码使用比特率作为与编码比特流数据大小相关的定量指标,该指标表示视频比特流数据可以传输或处理的速率,以每秒比特数衡量。该比特率既是编码图像的编码比特流数据大小的函数,也是视频序列使用的帧速率的函数。
视频编码操作使用码率控制算法来调整编码参数,以达到目标比特率,或者直接或间接地控制生成的视频比特流数据的比特率。这些算法通常不由所使用的视频压缩标准定义,尽管一些视频压缩标准确实为实现提供了非规范性指南。
因此,本规范不强制要求实现针对视频编码操作产生相同的编码比特流数据输出,但是,它确实定义了一组编解码器无关和编解码器特定的参数,使应用程序能够控制实现所支持的码率控制算法的行为。其中一些参数保证了某些实现行为,而另一些参数则为实现提供了应用各种码率控制启发法的指导。
应用程序需要确保它们正确配置码率控制参数,并且遵循通过为实现的码率控制算法和启发法提供指导的参数向实现做出的承诺,以便能够获得所需的码率控制行为并达到设定的比特率目标。此外,即使所使用的视频配置文件的功能在这些实现之间匹配,码率控制的行为也可能因实现而异。这可能是由于实现内部应用了不同的码率控制算法或启发法,因此即使同一组指导参数值也可能对不同实现的码率控制行为产生不同的影响。 |
码率控制模式
在视频会话重置为初始状态后,视频编码码率控制的默认行为和参数完全取决于实现,并且除非应用程序更改视频会话的码率控制配置,否则应用程序不能影响视频编码操作产生的编码比特流数据的比特率或质量参数,如视频编码控制部分所述。
对于每个支持的视频配置文件,实现可以公开一组码率控制模式,供应用程序在编码目标为该视频配置文件的比特流时使用。这些模式允许使用不同的码率控制算法,这些算法属于以下两个类别之一
-
按操作码率控制
-
流级码率控制
在按操作码率控制的情况下,生成的视频比特流数据的比特率由应用程序为每个单独的视频编码操作指定的质量、大小或其他编码参数间接控制。
在流级码率控制的情况下,除了其他编码参数外,应用程序可以直接指定目标比特率,以控制实现所使用的跨多个视频编码操作的码率控制算法的行为。
码率控制模式由以下枚举定义
// 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
指定禁用码率控制,并且应用程序将指定控制编码质量的按操作码率控制参数。在此模式下,实现将独立于先前视频编码操作的输出比特率对图片进行编码。-
当使用H.264编码配置文件时,实现将使用VkVideoEncodeH264NaluSliceInfoKHR::
constantQp
中指定的QP值来控制编码图片的质量。 -
当使用H.265编码配置文件时,实现将使用VkVideoEncodeH265NaluSliceSegmentInfoKHR::
constantQp
中指定的QP值来控制编码图片的质量。 -
当使用AV1编码配置文件时,实现将使用VkVideoEncodeAV1PictureInfoKHR::
constantQIndex
中指定的量化器索引值来控制编码图片的质量。
-
-
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结构的成员的值。
-
在VkVideoEncodeRateControlInfoKHR::
pLayers
中指定的任何VkVideoEncodeRateControlLayerInfoKHR结构的成员的值,这些值用于配置各个码率控制层的状态。 -
如果视频会话是使用H.264编码配置文件创建的
-
VkVideoEncodeH264RateControlInfoKHR结构的成员的值(如果在用于配置码率控制状态的VkVideoEncodeRateControlInfoKHR的
pNext
链中指定了该结构)。 -
包含在用于配置码率控制层状态的VkVideoEncodeRateControlLayerInfoKHR结构的
pNext
链中的任何VkVideoEncodeH264RateControlLayerInfoKHR结构的成员的值。
-
-
如果视频会话是使用H.265编码配置文件创建的
-
VkVideoEncodeH265RateControlInfoKHR结构的成员的值(如果在用于配置码率控制状态的VkVideoEncodeRateControlInfoKHR的
pNext
链中指定了该结构)。 -
包含在用于配置码率控制层状态的VkVideoEncodeRateControlLayerInfoKHR结构的
pNext
链中的任何VkVideoEncodeH265RateControlLayerInfoKHR结构的成员的值。
-
-
如果视频会话是使用AV1编码配置文件创建的
-
VkVideoEncodeAV1RateControlInfoKHR结构的成员的值(如果在用于配置码率控制状态的VkVideoEncodeRateControlInfoKHR的
pNext
链中指定了该结构)。 -
包含在用于配置码率控制层状态的VkVideoEncodeRateControlLayerInfoKHR结构的
pNext
链中的任何VkVideoEncodeAV1RateControlLayerInfoKHR结构的成员的值。
-
如果上述列出的所有参数都匹配,则两个码率控制状态匹配。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
保留供将来使用。 -
rateControlMode
是一个 VkVideoEncodeRateControlModeFlagBitsKHR 值,指定码率控制模式。 -
layerCount
指定要使用的码率控制层的数量。 -
pLayers
是指向layerCount
个VkVideoEncodeRateControlLayerInfoKHR结构数组的指针,每个结构指定相应码率控制层的码率控制配置。 -
virtualBufferSizeInMs
是实现码率控制算法用于漏桶模型的虚拟缓冲区的大小(以毫秒为单位),相对于通过对pLayers
数组的元素的averageBitrate
成员的值求和计算的流的平均比特率。 -
initialVirtualBufferSizeInMs
是实现码率控制算法用于漏桶模型的虚拟缓冲区的初始占用量(以毫秒为单位)。
如果 layerCount
为零,则忽略 virtualBufferSizeInMs
和 initialVirtualBufferSizeInMs
的值。
此结构可以在以下位置指定:
-
在VkVideoBeginCodingInfoKHR的
pNext
链中,指定在开始视频编码范围时预期配置的当前码率控制状态。 -
在VkVideoCodingControlInfoKHR的
pNext
链中,更改绑定视频会话的码率控制配置。
在VkVideoCodingControlInfoKHR的pNext
链中包含此结构,并在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。
根据绑定视频会话创建时使用的视频配置文件,VkVideoCodingControlInfoKHR
的 pNext
链中可以包含提供编解码器特定速率控制参数的其他结构。 更多细节请参考
新的速率控制配置在设备上执行相应的 vkCmdControlVideoCodingKHR 时生效,并且只影响执行顺序中后续的视频编码操作。
// 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
是实现速率控制算法所假定的帧率的分母。
实现速率控制算法匹配请求的平均和/或峰值比特率的能力可能会受到应用程序指定的其他编解码器无关和编解码器特定的速率控制参数、输入内容以及应用程序是否符合提供给实现的速率控制指导的限制,如先前所述。 |
根据绑定视频会话创建时使用的视频配置文件,可以在 VkVideoEncodeRateControlLayerInfoKHR
的 pNext
链中包含提供编解码器特定速率控制参数的其他结构。 详细信息请参见
视频编码量化映射
每个量化映射纹素覆盖的矩形纹素块的大小称为量化映射纹素大小。
因此,当编码编码范围为 (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
。
由于它们的编解码器特定性质,它们将在支持它们的视频编码操作的相应编解码器特定部分中进行更详细的描述。 特别是:
-
与H.264编码配置文件一起使用的量化增量映射的行为在H.264编码量化和H.264 QP增量映射部分中描述。
-
与H.265编码配置文件一起使用的量化增量映射的行为在H.265编码量化和H.265 QP增量映射部分中描述。
-
与AV1编码配置文件一起使用的量化增量映射的行为在AV1编码量化和AV1量化器索引增量映射部分中描述。
本规范不支持任何其他视频编码操作的量化增量映射。
强调映射
强调映射包含的值间接影响用于编码编码输入图像的相应块的编解码器特定的量化参数值。
强调映射的纹素包含向编码器实现提供关于编码图像区域相对重要性(强调)的输入值,以便使实现的码率控制算法能够为具有较高强调值的编码图像区域分配比具有较低强调值的区域更多的比特率预算。
只有当为视频会话配置的当前码率控制模式不是VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR
或VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
时,才能使用强调映射。
由于这些强调值仅控制所使用的码率控制算法的特定于实现的其它行为,因此除了描述量化行为的相应编解码器特定章节中概述的限制之外,本规范不对实现施加其他限制。
-
在H.264 编码量化章节中描述了与H.264 编码配置文件一起使用的强调映射的行为。
-
在H.265 编码量化章节中描述了与H.265 编码配置文件一起使用的强调映射的行为。
-
在AV1 编码量化章节中描述了与AV1 编码配置文件一起使用的强调映射的行为。
本规范不支持任何其他视频编码操作的强调映射。
强调映射始终具有单通道无符号归一化整数格式,并且当视频编码配置文件支持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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
maxQuantizationMapExtent
指示量化映射支持的最大宽度和高度。
当调用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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
minQpDelta
指示H.264 QP delta 映射支持的最小 QP delta 值。 -
maxQpDelta
指示H.264 QP delta 映射支持的最大 QP delta 值。
当调用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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
minQpDelta
指示H.265 QP delta 映射支持的最小 QP delta 值。 -
maxQpDelta
指示H.265 QP delta 映射支持的最大 QP delta 值。
当调用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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
minQIndexDelta
指示AV1 量化器索引 delta 映射支持的最小量化器索引 delta 值。 -
maxQIndexDelta
指示AV1 量化器索引 delta 映射支持的最大量化器索引 delta 值。
量化映射格式属性
当调用 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
quantizationMapTexelSize
指示视频格式的量化映射纹素大小,即每个量化映射纹素对应的像素数。
只有当此视频格式的 VkVideoFormatPropertiesKHR::imageUsageFlags
中返回的允许图像使用标志包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR
或 VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR
时,才定义此结构中返回的值。
对于特定的视频格式,实现可以支持多个量化映射纹素大小,这通过 vkGetPhysicalDeviceVideoFormatPropertiesKHR 返回具有不同 quantizationMapTexelSize
值的多个条目来指示。
当调用 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
compatibleCtbSizes
是一个 VkVideoEncodeH265CtbSizeFlagBitsKHR 的位掩码,指示使用此视频格式的量化映射兼容的 CTB 大小。compatibleCtbSizes
的值不会限制特定量化映射格式的使用,但会限制实现无法编码具有compatibleCtbSizes
中未包含但使用的视频配置文件(如 VkVideoEncodeH265CapabilitiesKHR::ctbSizes
所指示)支持的其他 CTB 大小的图片。特别是,使用较小的量化映射纹素大小可能会阻止实现使用较大的 CTB 大小进行编码,这可能会对编码器的效率产生负面影响。
只有当此视频格式的 VkVideoFormatPropertiesKHR::imageUsageFlags
中返回的允许图像使用标志包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR
或 VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
compatibleSuperblockSizes
是一个 VkVideoEncodeAV1SuperblockSizeFlagBitsKHR 的位掩码,指示使用此视频格式的量化映射兼容的 AV1 超级块大小。compatibleSuperblockSizes
的值不限制特定量化映射格式的使用,但限制了实现无法使用未包含在compatibleSuperblockSizes
中但受所使用的视频配置文件支持的超级块大小来编码图像,如 VkVideoEncodeAV1CapabilitiesKHR::superblockSizes
所指示。特别是,使用较小的 量化映射纹素大小 可能会阻止实现使用较大的超级块大小进行编码,这可能会对编码器的效率产生负面影响。
只有当此视频格式的 VkVideoFormatPropertiesKHR::imageUsageFlags
中返回的允许图像使用标志包含 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR
或 VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
quantizationMap
指定要用作量化映射的图像视图。 -
quantizationMapExtent
指定要用作量化映射的quantizationMap
的图像子区域的范围,从偏移量 (0,0) 开始。
H.264 编码操作
使用 H.264 编码配置文件 的视频编码操作 可以 用于编码符合 ITU-T H.264 规范 的基本视频流序列。
有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言。 |
此过程按照 视频编码操作步骤 执行,并根据 ITU-T H.264 规范 第 8 节中定义的编解码器特定语义执行,如下所示:
-
语法元素、派生值和其他参数从以下结构应用:
-
与 活动 SPS 对应的
StdVideoH264SequenceParameterSet
结构体,指定 H.264 序列参数集。 -
与 活动 PPS 对应的
StdVideoH264PictureParameterSet
结构体,指定 H.264 图像参数集。 -
指定 H.264 图像信息 的
StdVideoEncodeH264PictureInfo
结构体。 -
为每个编码的 H.264 片指定 H.264 片头参数 的
StdVideoEncodeH264SliceHeader
结构体。 -
指定与可选的 重建图像 和任何 活动参考图像 对应的 H.264 参考信息 的
StdVideoEncodeH264ReferenceInfo
结构体。
-
-
编码的比特流数据被写入到 H.264 编码比特流数据访问 部分中定义的指定目标视频比特流缓冲区范围。
-
在 视频图像资源 中,对应于所使用的 编码输入图像、活动参考图像 和可选的 重建图像 的图像数据按照 H.264 编码图像数据访问 部分中定义的方式访问。
-
参考图像设置 的决定根据 H.264 图像信息 中指定的参数进行。
如果参数符合 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_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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdProfileIdc
是一个StdVideoH264ProfileIdc
值,指定 H.264 编解码器配置文件 IDC,如ITU-T H.264 规范的 A.2 节定义。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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 中的最大参考图像数。由于实现可能 覆盖参考列表,
maxBPictureL0ReferenceCount
和maxL1ReferenceCount
不限制应用程序可以为 B 图像在 L0 和 L1 参考列表中指定元素的数量。但是,如果maxBPictureL0ReferenceCount
和maxL1ReferenceCount
均为零,则不允许使用 B 图像。 -
maxTemporalLayerCount
指示实现支持的最大 H.264 时间层数。 -
expectDyadicTemporalLayerPattern
指示当编码多个时间层时,实现的速率控制算法期望应用程序使用双时间层模式。 -
minQp
指示支持的最小 QP 值。 -
maxQp
指示支持的最大 QP 值。 -
prefersGopRemainingFrames
表示当开始一个视频编码范围时,该实现的速率控制算法倾向于应用程序指定当前图像组中每种类型剩余的帧数。 -
requiresGopRemainingFrames
表示当开始一个视频编码范围时,该实现的速率控制算法要求应用程序指定当前图像组中每种类型剩余的帧数。 -
stdSyntaxFlags
是一个VkVideoEncodeH264StdFlagBitsKHR的位掩码,指示与 H.264 语法元素相关的能力。
在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_flag
或vcl_hrd_parameters_present_flag
被设置为1
,该实现可能能够生成符合 HRD 标准的码流。 -
VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR
指定如果在编码P 帧或B 帧时,激活的 PPS中StdVideoH264PpsFlags
::weighted_pred_flag
被设置为1
或StdVideoH264PictureParameterSet
::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_flag
和PPS中的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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
preferredRateControlFlags
是 VkVideoEncodeH264RateControlFlagBitsKHR 值的位掩码,指示用于 VkVideoEncodeH264RateControlInfoKHR::flags
的首选标志。 -
preferredGopFrameCount
指示用于 VkVideoEncodeH264RateControlInfoKHR::gopFrameCount
的首选值。 -
preferredIdrPeriod
指示用于 VkVideoEncodeH264RateControlInfoKHR::idrPeriod
的首选值。 -
preferredConsecutiveBFrameCount
指示用于 VkVideoEncodeH264RateControlInfoKHR::consecutiveBFrameCount
的首选值。 -
preferredTemporalLayerCount
指示用于 VkVideoEncodeH264RateControlInfoKHR::temporalLayerCount
的首选值。 -
preferredConstantQp
指示当使用速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
时,用于每种图像类型的 VkVideoEncodeH264NaluSliceInfoKHR::constantQp
的首选值。 -
preferredMaxL0ReferenceCount
指示要在参考列表 L0 中使用的首选最大参考图片数量。 -
preferredMaxL1ReferenceCount
指示要在参考列表 L1 中使用的首选最大参考图片数量。 -
preferredStdEntropyCodingModeFlag
指示在StdVideoH264PpsFlags
中用于entropy_coding_mode_flag
的首选值。
H.264 编码会话
当使用 H.264 编码配置文件创建视频会话时,可以通过在 VkVideoSessionCreateInfoKHR 的 pNext
链中包含 VkVideoEncodeH264SessionCreateInfoKHR 结构的实例来指定其他参数。
VkVideoEncodeH264SessionCreateInfoKHR
结构的定义如下:
// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264SessionCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkBool32 useMaxLevelIdc;
StdVideoH264LevelIdc maxLevelIdc;
} VkVideoEncodeH264SessionCreateInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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>
。
H.264 编码参数集
使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR
创建的视频会话参数对象可以包含以下类型的参数:
- H.264 序列参数集 (SPS)
-
由
StdVideoH264SequenceParameterSet
结构表示,并解释如下-
reserved1
和reserved2
仅用于填充目的,否则将被忽略; -
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 节中所定义; -
ScalingList4x4
和ScalingList8x8
对应于 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_flag
或flags.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_id
和pic_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 节中所定义; -
ScalingList4x4
和ScalingList8x8
对应于 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
maxStdSPSCount
是创建的VkVideoSessionParametersKHR
可以包含的 H.264 SPS 条目的最大数量。 -
maxStdPPSCount
是创建的VkVideoSessionParametersKHR
可以包含的 H.264 PPS 条目的最大数量。 -
pParametersAddInfo
是NULL
或指向 VkVideoEncodeH264SessionParametersAddInfoKHR 结构的指针,该结构指定在对象创建时要添加的 H.264 参数。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdSPSCount
是pStdSPSs
数组中的元素数量。 -
pStdSPSs
是指向StdVideoH264SequenceParameterSet
结构数组的指针,该数组描述要添加的 H.264 SPS 条目。 -
stdPPSCount
是pStdPPSs
数组中的元素数量。 -
pStdPPSs
是指向StdVideoH264PictureParameterSet
结构数组的指针,该数组描述要添加的 H.264 PPS 条目。
此结构可以在以下位置指定:
-
在用于创建视频会话参数对象的 VkVideoSessionParametersCreateInfoKHR 的
pNext
链中指定的 VkVideoEncodeH264SessionParametersCreateInfoKHR 结构的pParametersAddInfo
成员中。在这种情况下,如果用于创建视频会话参数对象的视频编解码器操作为VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR
,则它定义要添加到创建对象的初始参数集(请参阅创建视频会话参数)。 -
在 VkVideoSessionParametersUpdateInfoKHR 的
pNext
链中。在这种情况下,如果要更新的视频会话参数对象是通过VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR
创建的,则它定义要添加到其中的参数集(请参阅更新视频会话参数)。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
writeStdSPS
指示是否请求检索由stdSPSId
标识的编码 H.264 序列参数集。 -
writeStdPPS
指示是否请求检索由stdSPSId
和stdPPSId
构造的对标识的编码 H.264 图片参数集。 -
stdSPSId
指定用于标识检索到的 H.264 序列和/或图片参数集的 H.264 序列参数集 ID。 -
当
writeStdPPS
为VK_TRUE
时,stdPPSId
指定用于标识检索到的 H.264 图片参数集的 H.264 图片参数集 ID。
当此结构在传递给 vkGetEncodedVideoSessionParametersKHR 的 VkVideoEncodeSessionParametersGetInfoKHR 结构的 pNext
链中指定时,该命令将按以下顺序将编码的参数数据写入输出缓冲区
-
如果
writeStdSPS
为VK_TRUE
,则为由stdSPSId
标识的 H.264 序列参数集。 -
如果
writeStdPPS
为VK_TRUE
,则为由stdSPSId
和stdPPSId
构造的对标识的 H.264 图片参数集。
VkVideoEncodeH264SessionParametersFeedbackInfoKHR
结构的定义如下:
// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264SessionParametersFeedbackInfoKHR {
VkStructureType sType;
void* pNext;
VkBool32 hasStdSPSOverrides;
VkBool32 hasStdPPSOverrides;
} VkVideoEncodeH264SessionParametersFeedbackInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
hasStdSPSOverrides
指示是否通过 VkVideoEncodeH264SessionParametersGetInfoKHR::writeStdSPS
请求的H.264 序列参数集的任何参数是否被实现覆盖。 -
hasStdPPSOverrides
指示是否通过 VkVideoEncodeH264SessionParametersGetInfoKHR::writeStdPPS
请求的H.264 图片参数集的任何参数是否被实现覆盖。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
naluSliceEntryCount
是pNaluSliceEntries
中的元素数。 -
pNaluSliceEntries
是指向naluSliceEntryCount
个 VkVideoEncodeH264NaluSliceInfoKHR 结构数组的指针,该数组指定要为输入图片编码的各个 H.264 片段的参数。 -
pStdPictureInfo
是指向StdVideoEncodeH264PictureInfo
结构的指针,该结构指定H.264 图片信息。 -
generatePrefixNalu
控制是否在目标码流中将前缀 NALU 生成到片段 NALU 之前,如 ITU-T H.264 规范的 7.3.2.12 和 7.4.2.12 节中所定义。
此结构在传递给 vkCmdEncodeVideoKHR 的 VkVideoEncodeInfoKHR 结构的 pNext
链中指定,以指定 H.264 编码操作的特定于编解码器的图片信息。
- 编码输入图片信息
-
当此结构在传递给 vkCmdEncodeVideoKHR 的 VkVideoEncodeInfoKHR 结构的
pNext
链中指定时,与编码输入图像相关的信息定义如下-
所使用的图像子区域根据H.264 编码图像数据访问部分确定。
-
编码输入图像与
pStdPictureInfo
中提供的 H.264 图像信息相关联。
-
- 标准图像信息
-
pStdPictureInfo
指向的StdVideoEncodeH264PictureInfo
结构的成员解释如下-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
flags.IdrPicFlag
,如ITU-T H.264 规范的 7.4.1 节中所定义; -
flags.is_reference
,如 ITU-T H.264 规范的第 3.136 节中所定义; -
seq_parameter_set_id
和pic_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_l0
和ref_pic_list_modification_flag_l1
,如ITU-T H.264 规范的 7.4.3.1 节中所定义; -
num_ref_idx_l0_active_minus1
和num_ref_idx_l1_active_minus1
,如ITU-T H.264 规范的 7.4.3 节中所定义; -
RefPicList0
和RefPicList1
,如ITU-T H.264 规范的 8.2.4 节中所定义,其中这些数组的每个元素使用其 DPB槽 索引标识一个活动参考图像,或者包含值STD_VIDEO_H264_NO_REFERENCE_PICTURE
以指示“无参考图像”; -
如果
refList0ModOpCount
不为零,则pRefList0ModOperations
是一个指向refList0ModOpCount
个StdVideoEncodeH264RefListModEntry
结构的数组的指针,该结构指定参考列表 L0 的修改参数,如ITU-T H.264 规范的 7.4.3.1 节中所定义; -
如果
refList1ModOpCount
不为零,则pRefList1ModOperations
是一个指向refList1ModOpCount
个StdVideoEncodeH264RefListModEntry
结构的数组的指针,该结构指定参考列表 L1 的修改参数,如ITU-T H.264 规范的 7.4.3.1 节中所定义; -
如果
refPicMarkingOpCount
不为零,则refPicMarkingOperations
是一个指向refPicMarkingOpCount
个StdVideoEncodeH264RefPicMarkingEntry
结构的数组的指针,该结构指定参考图像标记参数,如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
结构的成员用于从绑定的视频会话参数对象中选择要使用的活动参数集,如下所示
如果对于活动的 PPS 和 pNaluSliceEntries
相应元素的 pStdSliceHeader
成员,以下任何条件为真,则 H.264 编码将对切片使用显式加权样本预测,如ITU-T H.264 规范的 8.4.2.3 节中所定义。
-
pStdSliceHeader->slice_type
是STD_VIDEO_H264_SLICE_TYPE_P
并且在活动 PPS 中启用了weighted_pred_flag
。 -
pStdSliceHeader->slice_type
是STD_VIDEO_H264_SLICE_TYPE_B
并且活动 PPS 中的weighted_bipred_idc
等于STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_EXPLICIT
。
// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264NaluSliceInfoKHR {
VkStructureType sType;
const void* pNext;
int32_t constantQp;
const StdVideoEncodeH264SliceHeader* pStdSliceHeader;
} VkVideoEncodeH264NaluSliceInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
如果为视频会话配置的当前速率控制模式是
VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
,则constantQp
是用于切片的 QP。 -
pStdSliceHeader
是指向StdVideoEncodeH264SliceHeader
结构的指针,该结构指定切片的H.264 切片头参数。
- Std 切片头参数
-
pStdSliceHeader
指向的StdVideoEncodeH264SliceHeader
结构的成员解释如下-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
如果
pWeightTable
不是NULL
,则它是指向StdVideoEncodeH264WeightTable
的指针,其解释如下-
flags.reserved
仅用于填充目的,否则将被忽略; -
StdVideoEncodeH264WeightTable
的所有其他成员的解释均按照ITU-T H.264 规范第 7.4.3.2 节中的定义;
-
-
所有其他成员的解释均按照 ITU-T H.264 规范 的 7.4.3 节中的定义。
-
// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264DpbSlotInfoKHR {
VkStructureType sType;
const void* pNext;
const StdVideoEncodeH264ReferenceInfo* pStdReferenceInfo;
} VkVideoEncodeH264DpbSlotInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdReferenceInfo
是指向StdVideoEncodeH264ReferenceInfo
结构的指针,该结构指定H.264 参考信息。
如果不是 NULL
,则此结构在 VkVideoEncodeInfoKHR::pSetupReferenceSlot
的 pNext
链中指定,并且在 VkVideoEncodeInfoKHR::pReferenceSlots
元素的 pNext
链中指定,以指定H.264 编码操作的编解码器特定参考图片信息。
- 活动参考图像信息
-
当此结构在 VkVideoEncodeInfoKHR::
pReferenceSlots
的元素的pNext
链中指定时,对于 VkVideoEncodeInfoKHR::pReferenceSlots
的每个元素,会将一个元素添加到视频编码操作使用的活动参考图片列表中,如下所示-
所使用的图像子区域根据H.264 编码图像数据访问部分确定。
-
参考图片与 VkVideoEncodeInfoKHR::
pReferenceSlots
的相应元素的slotIndex
成员中指定的DPB 插槽索引相关联。 -
参考图片与
pStdReferenceInfo
中提供的H.264 参考信息相关联。
-
- 重建图像信息
-
当此结构在 VkVideoEncodeInfoKHR::
pSetupReferenceSlot
的pNext
链中指定时,与重建图片相关的信息定义如下-
所使用的图像子区域根据H.264 编码图像数据访问部分确定。
-
如果请求参考图片设置,则重建的图片用于激活 DPB 插槽,其索引在 VkVideoEncodeInfoKHR::
pSetupReferenceSlot->slotIndex
中指定。 -
重建的图片与
pStdReferenceInfo
中提供的H.264 参考信息相关联。
-
- 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_num
和long_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 节中的定义。
-
H.264 编码速率控制
图像组
在 H.264 编码的情况下,通常的做法是在编码后续帧时,在显示顺序中遵循不同图片类型的规则模式。此模式称为图像组 (GOP)。
常规 GOP 由以下参数定义
-
GOP 中的帧数;
-
在显示顺序中,I 帧和/或 P 帧之间连续 B 帧的数量。
GOP 进一步分类为开放 GOP 和闭合 GOP。
开放 GOP 中的帧类型在显示顺序中按照以下算法相互跟随
-
第一帧始终是 I 帧。
-
接下来是若干个连续的 B 帧,如上所述。
-
如果尚未达到 GOP 中的帧数,则下一帧是 P 帧,并且该算法从步骤 2 继续。
在闭合 GOP 的情况下,在某个周期使用 IDR 帧。
H.264 编码的另一个典型做法是在 GOP 的帧中使用特定的参考图片使用模式。使用最常见的两个参考模式如下所示
- 平面参考模式
-
-
每个 P 帧在显示顺序中使用最后一个非 B 帧作为参考。
-
每个 B 帧在显示顺序中使用最后一个非 B 帧作为其前向参考,并在显示顺序中使用下一个非 B 帧作为其后向参考。
-
- 二元参考模式
-
-
每个 P 帧在显示顺序中使用最后一个非 B 帧作为参考。
-
以下算法应用于显示顺序中 I 帧和/或 P 帧之间连续 B 帧的序列
-
此序列中间的 B 帧使用该序列之前的帧作为其前向参考,并使用该序列之后的帧作为其后向参考。
-
对于以下帧序列,递归执行该算法
-
原始序列中位于中间帧之前的 B 帧(如果有)。
-
原始序列中位于中间帧之后的 B 帧(如果有)。
-
-
-
应用程序可以向实现 的速率控制算法提供有关应用程序使用的 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 的第一帧作为参考。
-
多层速率控制和多层编码通常用于期望低延迟的流媒体情况,因此通常不使用具有后向预测的 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是 VkVideoEncodeH264RateControlFlagBitsKHR 的位掩码,用于指定 H.264 速率控制标志。 -
gopFrameCount
是应用程序打算使用的 图像组 (GOP) 中的帧数。如果为 0,则速率控制算法可能假设一个与实现相关的 GOP 长度。如果为UINT32_MAX
,则将 GOP 长度视为无限。 -
idrPeriod
是两个 IDR 帧之间(请参阅 IDR 周期)的帧数间隔。如果为 0,则速率控制算法可能假设一个与实现相关的 IDR 周期。如果为UINT32_MAX
,则将 IDR 周期视为无限。 -
consecutiveBFrameCount
是 GOP 内 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 合规性要求。否则,新的速率控制状态可能在不重置的情况下应用,具体取决于实现和指定的速率控制参数。
根据为 |
可以在 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 结构的gopFrameCount
、idrPeriod
和consecutiveBFrameCount
成员中指定的参数使用常规 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
useMinQp
指示是否将速率控制确定的 QP 值钳制到minQp
中指定的 QP 值下限。 -
minQp
指定当useMinQp
为VK_TRUE
时,实现速率控制算法将使用的每个图像类型的 QP 值下限。 -
useMaxQp
指示是否将速率控制确定的 QP 值钳制到maxQp
中指定的 QP 值上限。 -
maxQp
指定当useMaxQp
为VK_TRUE
时,实现速率控制算法将使用的每个图像类型的 QP 值上限。 -
useMaxFrameSize
指示实现速率控制算法应该是否使用maxFrameSize
中指定的值作为每个图像类型的编码帧大小的上限。 -
maxFrameSize
指定当useMaxFrameSize
为VK_TRUE
时,每个图像类型的编码帧大小的上限。
使用时,minQp
和 maxQp
中的值保证实现使用的有效 QP 值将分别遵守这些下限和上限。但是,限制实现能够使用的 QP 值范围也会限制实现速率控制算法符合其他约束的能力。特别是,实现可能无法符合以下要求:
-
要在编码比特流中使用的平均和/或峰值比特率值,在 VkVideoEncodeRateControlLayerInfoKHR 结构的
averageBitrate
和maxBitrate
成员中指定。 -
在
VkVideoEncodeH264RateControlLayerInfoKHR
的maxFrameSize
成员中指定的每个图像类型的编码帧大小的上限。
通常,应用程序需要适当地配置速率控制参数,以便获得所需的速率控制行为,如视频编码速率控制部分所述。 |
当此结构的实例包含在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 特定速率控制参数。
VkVideoEncodeH264FrameSizeKHR
结构的定义如下:
// Provided by VK_KHR_video_encode_h264
typedef struct VkVideoEncodeH264FrameSizeKHR {
uint32_t frameISize;
uint32_t framePSize;
uint32_t frameBSize;
} VkVideoEncodeH264FrameSizeKHR;
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
useGopRemainingFrames
指示实现中的速率控制算法是否应该使用gopRemainingI
、gopRemainingP
和gopRemainingB
中指定的值。如果useGopRemainingFrames
为VK_FALSE
,则gopRemainingI
、gopRemainingP
和gopRemainingB
的值将被忽略。
仅当用于视频配置文件的VkVideoEncodeH264CapabilitiesKHR::requiresGopRemainingFrames
报告为 VK_TRUE
时,才必须将 useGopRemainingFrames
设置为 VK_TRUE
并将此结构包含在VkVideoBeginCodingInfoKHR的 pNext
链中。但是,即使不是必需的,实现可以使用这些剩余的帧计数(如果指定了)。特别是当应用程序不使用常规 GOP 结构时,这些值可以为实现中的速率控制算法提供额外的指导。
VkVideoEncodeH264CapabilitiesKHR::prefersGopRemainingFrames
功能还用于指示如果应用程序使用此结构指定剩余的帧计数,则实现中的速率控制算法可能会更准确地运行。
与其他速率控制指导值一样,如果应用程序编码的帧的有效顺序和数量与在任何给定点在此结构中指定的剩余帧计数不一致,则实现中的速率控制算法的行为可能会偏离应用程序预期的行为。
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 值由特定于实现的默认码率控制算法初始化。-
如果视频编码操作是使用量化 delta 映射发出的,则从量化映射中获取的与宏块对应的 QP delta 值会添加到先前确定的 QP 值中。 如果获取的 QP delta 值超出 VkVideoEncodeH264QuantizationMapCapabilitiesKHR 的
minQpDelta
和maxQpDelta
成员中报告的受支持的 QP delta 值范围,则宏块使用的 QP 值将变为未定义。
-
-
如果配置的码率控制模式为
VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
,则 QP 值从为宏块所属的H.264 切片指定的恒定 QP 值初始化。-
如果视频编码操作是使用量化 delta 映射发出的,则从量化映射中获取的与宏块对应的 QP delta 值会添加到先前确定的 QP 值中。 如果获取的 QP delta 值超出 VkVideoEncodeH264QuantizationMapCapabilitiesKHR 的
minQpDelta
和maxQpDelta
成员中报告的受支持的 QP delta 值范围,则宏块使用的 QP 值将变为未定义。
-
-
如果配置的码率控制模式不是
VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR
或VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
,则 QP 值由相应的码率控制算法初始化。-
如果视频编码操作是使用量化 delta 映射发出的,则从量化映射中获取的与宏块对应的 QP delta 值会添加到先前确定的 QP 值中。 如果获取的 QP delta 值超出 VkVideoEncodeH264QuantizationMapCapabilitiesKHR 的
minQpDelta
和maxQpDelta
成员中报告的受支持的 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 值范围,如 VkVideoEncodeH264CapabilitiesKHR 的
minQp
和maxQp
成员中报告的那样。
H.264 编码要求
本节描述了对于至少有一个队列族支持视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR
的物理设备来说,必需的 H.264 编码功能,该操作由 vkGetPhysicalDeviceQueueFamilyProperties2 在 VkQueueFamilyVideoPropertiesKHR::videoCodecOperations
中返回。
视频标准头名称 | 版本 |
---|---|
|
1.0.0 |
视频功能 | 要求 | 要求类型1 |
---|---|---|
|
- |
min |
|
4096 |
max |
|
4096 |
max |
|
(64,64) |
max |
|
- |
max |
|
- |
min |
|
0 |
min |
|
0 |
min |
|
- |
min |
|
- |
min |
|
64000 |
min |
|
1 |
min |
|
(64,64) |
max |
|
|
min |
|
- |
min |
|
|
min |
|
1 |
min |
|
0 |
min |
|
0 |
min |
|
0 |
min |
|
1 |
min |
|
- |
实现相关 |
|
- |
max |
|
- |
min |
|
- |
实现相关 |
|
- |
实现相关 |
|
- |
min |
|
- 2 |
min |
|
- 3 |
max |
|
- 3 |
min |
- 1
-
“要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。
- 2
-
如果 VkVideoCapabilitiesKHR::
flags
包括VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR
或VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR
,则maxQuantizationMapExtent
的width
和height
成员必须大于零。 - 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 节中定义,如下所示:
-
语法元素、派生值和其他参数从以下结构应用:
-
与指定 H.265 视频参数集的活动 VPS 对应的
StdVideoH265VideoParameterSet
结构。 -
与指定H.265 序列参数集的活动 SPS 对应的
StdVideoH265SequenceParameterSet
结构。 -
与指定H.265 图片参数集的活动 PPS 对应的
StdVideoH265PictureParameterSet
结构。 -
指定H.265 图片信息的
StdVideoEncodeH265PictureInfo
结构。 -
为每个编码的 H.265 片段指定H.265 片段头参数的
StdVideoEncodeH265SliceSegmentHeader
结构。 -
StdVideoEncodeH265ReferenceInfo
结构指定与可选的重建图像和任何活动参考图像对应的H.265 参考信息。
-
-
编码的比特流数据写入目标视频比特流缓冲区范围,如H.265 编码比特流数据访问部分所定义。
-
在视频图像资源中,与使用的编码输入图像、活动参考图像和可选的重建图像对应的图像数据,按照H.265 编码图像数据访问部分所定义的方式进行访问。
-
参考图像设置的决策是根据H.265 图像信息中指定的参数做出的。
如果参数符合上述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 SPS 和PPS 参数可能会被实现根据创建视频会话参数对象的量化映射纹素大小覆盖。
-
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 节中所定义,方法是在来自视频标准枚举类型 StdVideoH265SliceType
的H.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_IDR
表示该图像为一种特殊的I帧,称为IDR帧,如ITU-T H.265规范的3.67节所定义。一个由IDR帧组成的帧也称为IDR帧。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdProfileIdc
是一个StdVideoH265ProfileIdc
值,指定 H.265 编解码器配置文件 IDC,如 ITU-T H.265 规范 的 A.3 节中所定义。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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中支持的最大参考帧数量。由于实现可能 覆盖参考列表,
maxBPictureL0ReferenceCount
和maxL1ReferenceCount
不限制应用程序可以为 B 图像在 L0 和 L1 参考列表中指定元素的数量。但是,如果maxBPictureL0ReferenceCount
和maxL1ReferenceCount
均为零,则不允许使用 B 图像。 -
maxSubLayerCount
指示实现支持的最大H.265子层数。 -
expectDyadicTemporalSubLayerPattern
指示实现的速率控制算法希望应用程序在编码多个时间子层时使用二元时间子层模式。 -
minQp
指示支持的最小 QP 值。 -
maxQp
指示支持的最大 QP 值。 -
prefersGopRemainingFrames
指示实现的速率控制算法希望应用程序在开始视频编码范围时指定当前图像组中每种类型剩余的帧数。 -
requiresGopRemainingFrames
指示实现的速率控制算法要求应用程序在开始视频编码范围时指定当前图像组中每种类型剩余的帧数。 -
stdSyntaxFlags
是一个VkVideoEncodeH265StdFlagBitsKHR的位掩码,指示与H.265语法元素相关的能力。
可以在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_flag
、vcl_hrd_parameters_present_flag
或sub_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
指定,如果 活动 PPS 中StdVideoH265PpsFlags
的weighted_pred_flag
或weighted_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_flag
在 SPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR
指定当StdVideoH265SpsFlags
::sample_adaptive_offset_enabled_flag
在 SPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_SCALING_LIST_DATA_PRESENT_FLAG_SET_BIT_KHR
指定当 SPS 中StdVideoH265SpsFlags
的scaling_list_enabled_flag
和sps_scaling_list_data_present_flag
成员以及 PPS 中StdVideoH265PpsFlags
::pps_scaling_list_data_present_flag
成员的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_PCM_ENABLED_FLAG_SET_BIT_KHR
指定当StdVideoH265SpsFlags
::pcm_enable_flag
在 SPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_SPS_TEMPORAL_MVP_ENABLED_FLAG_SET_BIT_KHR
指定当StdVideoH265SpsFlags
::sps_temporal_mvp_enabled_flag
在 SPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_INIT_QP_MINUS26_BIT_KHR
指定当 PPS 中StdVideoH265PictureParameterSet
::init_qp_minus26
的值为非零值时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR
指定当StdVideoH265PpsFlags
::weighted_pred_flag
在 PPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_WEIGHTED_BIPRED_FLAG_SET_BIT_KHR
指定当StdVideoH265PpsFlags
::weighted_bipred_flag
在 PPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_LOG2_PARALLEL_MERGE_LEVEL_MINUS2_BIT_KHR
指定当 PPS 中StdVideoH265PictureParameterSet
::log2_parallel_merge_level_minus2
的值为非零值时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_SIGN_DATA_HIDING_ENABLED_FLAG_SET_BIT_KHR
指定当StdVideoH265PpsFlags
::sign_data_hiding_enabled_flag
在 PPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR
指定当StdVideoH265PpsFlags
::transform_skip_enabled_flag
在 PPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_UNSET_BIT_KHR
指定当StdVideoH265PpsFlags
::transform_skip_enabled_flag
在 PPS 中的值为0
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG_SET_BIT_KHR
指定当StdVideoH265PpsFlags
::pps_slice_chroma_qp_offsets_present_flag
在 PPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_TRANSQUANT_BYPASS_ENABLED_FLAG_SET_BIT_KHR
指定当StdVideoH265PpsFlags
::transquant_bypass_enabled_flag
在 PPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR
指定当StdVideoH265PpsFlags
::constrained_intra_pred_flag
在 PPS 中的值为1
时,实现是否支持使用应用程序提供的值。 -
VK_VIDEO_ENCODE_H265_STD_ENTROPY_CODING_SYNC_ENABLED_FLAG_SET_BIT_KHR
指定当StdVideoH265PpsFlags
::entropy_coding_sync_enabled_flag
在 PPS 中的值为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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
preferredRateControlFlags
是 VkVideoEncodeH265RateControlFlagBitsKHR 值的位掩码,指示用于 VkVideoEncodeH265RateControlInfoKHR::flags
的首选标志。 -
preferredGopFrameCount
指示用于 VkVideoEncodeH265RateControlInfoKHR::gopFrameCount
的首选值。 -
preferredIdrPeriod
指示用于 VkVideoEncodeH265RateControlInfoKHR::idrPeriod
的首选值。 -
preferredConsecutiveBFrameCount
指示用于 VkVideoEncodeH265RateControlInfoKHR::consecutiveBFrameCount
的首选值。 -
preferredSubLayerCount
指示用于 VkVideoEncodeH265RateControlInfoKHR::subLayerCount
的首选值。 -
preferredConstantQp
指示在使用 速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
时,用于每个图像类型的 VkVideoEncodeH265NaluSliceSegmentInfoKHR::constantQp
的首选值。 -
preferredMaxL0ReferenceCount
指示要在参考列表 L0 中使用的首选最大参考图片数量。 -
preferredMaxL1ReferenceCount
指示要在参考列表 L1 中使用的首选最大参考图片数量。
H.265 编码会话
在创建具有 H.265 编码配置文件的视频会话时,可以通过在 VkVideoSessionCreateInfoKHR 的 pNext
链中包含 VkVideoEncodeH265SessionCreateInfoKHR 结构的实例来指定其他参数。
VkVideoEncodeH265SessionCreateInfoKHR
结构定义如下
// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265SessionCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkBool32 useMaxLevelIdc;
StdVideoH265LevelIdc maxLevelIdc;
} VkVideoEncodeH265SessionCreateInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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>
。
H.265 编码参数集
使用视频编解码器操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR
创建的视频会话参数对象可以包含以下类型的参数
- H.265 视频参数集 (VPS)
-
由
StdVideoH265VideoParameterSet
结构表示,并按如下方式解释:-
reserved1
、reserved2
和reserved3
仅用于填充目的,否则将被忽略; -
vps_video_parameter_set_id
用作 VPS 条目的键; -
pDecPicBufMgr
指向的StdVideoH265DecPicBufMgr
结构的max_latency_increase_plus1
、max_dec_pic_buffering_minus1
和max_num_reorder_pics
成员分别对应于vps_max_latency_increase_plus1
、vps_max_dec_pic_buffering_minus1
和vps_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
+ 1 个StdVideoH265SubLayerHrdParameters
结构数组的指针,其中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
+ 1 个StdVideoH265SubLayerHrdParameters
结构数组的指针,其中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
结构表示,并按如下方式解释:-
reserved1
和reserved2
仅用于填充目的,否则将被忽略; -
由
sps_video_parameter_set_id
和sps_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_plus1
、max_dec_pic_buffering_minus1
和max_num_reorder_pics
成员分别对应于sps_max_latency_increase_plus1
、sps_max_dec_pic_buffering_minus1
和sps_max_num_reorder_pics
,如 ITU-T H.265 规范 的 7.4.3.2 节中所定义; -
如果设置了
flags.sps_scaling_list_data_present_flag
,则pScalingLists
指向的StdVideoH265ScalingLists
结构按如下方式解释:-
ScalingList4x4
、ScalingList8x8
、ScalingList16x16
和ScalingList32x32
分别对应于ScalingList[0]
、ScalingList[1]
、ScalingList[2]
和ScalingList[3]
,如 ITU-T H.265 规范 的 7.3.4 节中所定义; -
ScalingListDCCoef16x16
和ScalingListDCCoef32x32
分别对应于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_sets
个StdVideoH265ShortTermRefPicSet
结构数组的指针,其中每个元素按如下方式解释:-
reserved1
、reserved2
和reserved3
仅用于填充目的,否则将被忽略; -
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
结构的解释如下-
reserved1
、reserved2
和reserved3
仅用于填充目的,否则将被忽略; -
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
+ 1 个StdVideoH265SubLayerHrdParameters
结构数组的指针,其中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
+ 1 个StdVideoH265SubLayerHrdParameters
结构数组的指针,其中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
结构表示,并解释如下-
reserved1
、reserved2
和reserved3
仅用于填充目的,否则将被忽略; -
由
sps_video_parameter_set_id
、pps_seq_parameter_set_id
和pps_pic_parameter_set_id
构成的三元组用作 PPS 条目的键; -
如果设置了
flags.pps_scaling_list_data_present_flag
,则由pScalingLists
指向的StdVideoH265ScalingLists
结构的解释如下-
ScalingList4x4
、ScalingList8x8
、ScalingList16x16
和ScalingList32x32
分别对应于ScalingList[0]
、ScalingList[1]
、ScalingList[2]
和ScalingList[3]
,如 ITU-T H.265 规范 的 7.3.4 节中所定义; -
ScalingListDCCoef16x16
和ScalingListDCCoef32x32
分别对应于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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
maxStdVPSCount
是创建的VkVideoSessionParametersKHR
可以包含的最大 H.265 VPS 条目数。 -
maxStdSPSCount
是创建的VkVideoSessionParametersKHR
可以包含的最大 H.265 SPS 条目数。 -
maxStdPPSCount
是创建的VkVideoSessionParametersKHR
可以包含的最大 H.265 PPS 条目数。 -
pParametersAddInfo
为NULL
或者指向 VkVideoEncodeH265SessionParametersAddInfoKHR 结构体的指针,该结构体指定在对象创建时要添加的 H.265 参数。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdVPSCount
是pStdVPSs
数组中的元素数量。 -
pStdVPSs
是一个指向StdVideoH265VideoParameterSet
结构体数组的指针,该数组描述要添加的 H.265 VPS 条目。 -
stdSPSCount
是pStdSPSs
数组中的元素数量。 -
pStdSPSs
是一个指向StdVideoH265SequenceParameterSet
结构体数组的指针,该数组描述要添加的 H.265 SPS 条目。 -
stdPPSCount
是pStdPPSs
数组中的元素数量。 -
pStdPPSs
是一个指向StdVideoH265PictureParameterSet
结构体数组的指针,该数组描述要添加的 H.265 PPS 条目。
此结构可以在以下位置指定:
-
在用于创建视频会话参数对象的 VkVideoSessionParametersCreateInfoKHR 的
pNext
链中指定的 VkVideoEncodeH265SessionParametersCreateInfoKHR 结构的pParametersAddInfo
成员中。在这种情况下,如果创建视频会话参数对象的视频编解码器操作是VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR
,则它定义要添加到创建对象的初始参数集(请参阅创建视频会话参数)。 -
在 VkVideoSessionParametersUpdateInfoKHR 的
pNext
链中。在这种情况下,如果要更新的视频会话参数对象是使用VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR
创建的,则它定义要添加到该对象的参数集(请参阅更新视频会话参数)。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
writeStdVPS
指示是否请求检索由stdVPSId
标识的编码后的 H.265 视频参数集。 -
writeStdSPS
指示是否请求检索由stdVPSId
和stdSPSId
组成的对标识的编码后的 H.265 序列参数集。 -
writeStdPPS
指示是否请求检索由stdVPSId
、stdSPSId
和stdPPSId
组成的元组标识的编码后的 H.265 图片参数集。 -
stdVPSId
指定用于标识检索到的 H.265 视频、序列和/或图片参数集的 H.265 视频参数集 ID。 -
stdSPSId
指定当writeStdSPS
和/或writeStdPPS
为VK_TRUE
时,用于标识检索到的 H.265 序列和/或图片参数集的 H.265 序列参数集 ID。 -
stdPPSId
指定当writeStdPPS
为VK_TRUE
时,用于标识检索到的 H.265 图片参数集的 H.265 图片参数集 ID。
当此结构在传递给 vkGetEncodedVideoSessionParametersKHR 的 VkVideoEncodeSessionParametersGetInfoKHR 结构的 pNext
链中指定时,该命令将按以下顺序将编码的参数数据写入输出缓冲区
-
由
stdVPSId
标识的 H.265 视频参数集,如果writeStdVPS
为VK_TRUE
。 -
由
stdVPSId
和stdSPSId
组成的对标识的 H.265 序列参数集,如果writeStdSPS
为VK_TRUE
。 -
由
stdVPSId
、stdSPSId
和stdPPSId
组成的元组标识的 H.265 图片参数集,如果writeStdPPS
为VK_TRUE
。
VkVideoEncodeH265SessionParametersFeedbackInfoKHR
结构体的定义如下:
// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265SessionParametersFeedbackInfoKHR {
VkStructureType sType;
void* pNext;
VkBool32 hasStdVPSOverrides;
VkBool32 hasStdSPSOverrides;
VkBool32 hasStdPPSOverrides;
} VkVideoEncodeH265SessionParametersFeedbackInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
hasStdVPSOverrides
指示是否通过 VkVideoEncodeH265SessionParametersGetInfoKHR::writeStdVPS
请求的 H.265 视频参数集 的任何参数被实现覆盖。 -
hasStdSPSOverrides
指示是否通过 VkVideoEncodeH265SessionParametersGetInfoKHR::writeStdSPS
请求的 H.265 序列参数集 的任何参数被实现覆盖。 -
hasStdPPSOverrides
指示是否通过 VkVideoEncodeH265SessionParametersGetInfoKHR::writeStdPPS
请求的 H.265 图片参数集 的任何参数被实现覆盖。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
naluSliceSegmentEntryCount
是pNaluSliceSegmentEntries
中的元素数量。 -
pNaluSliceSegmentEntries
是一个指向naluSliceSegmentEntryCount
个 VkVideoEncodeH265NaluSliceSegmentInfoKHR 结构体数组的指针,该数组指定了要为输入图像编码的各个 H.265 片段的参数。 -
pStdPictureInfo
是一个指向StdVideoEncodeH265PictureInfo
结构的指针,该结构指定了 H.265 图像信息。
此结构在传递给 vkCmdEncodeVideoKHR 的 VkVideoEncodeInfoKHR 结构的 pNext
链中指定,用于为 H.265 编码操作 指定编解码器特定的图像信息。
- 编码输入图片信息
-
当此结构在传递给 vkCmdEncodeVideoKHR 的 VkVideoEncodeInfoKHR 结构的
pNext
链中指定时,与编码输入图像相关的信息定义如下-
使用的图像子区域根据 H.265 编码图像数据访问 部分确定。
-
编码输入图像与
pStdPictureInfo
中提供的 H.265 图像信息 相关联。
-
- 标准图像信息
-
pStdPictureInfo
指向的StdVideoEncodeH265PictureInfo
结构的成员解释如下:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
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_flag
和cross_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_id
、pps_seq_parameter_set_id
和pps_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_l0
和ref_pic_list_modification_flag_l1
的定义见 ITU-T H.265 规范 的 7.4.7.2 节; -
num_ref_idx_l0_active_minus1
和num_ref_idx_l1_active_minus1
的定义见 ITU-T H.265 规范 的 7.4.7.1 节; -
RefPicList0
和RefPicList1
的定义见 ITU-T H.265 规范 的 8.3.4 节,其中这些数组的每个元素使用其 DPB 插槽 索引来标识一个 活动参考图像,或者包含值STD_VIDEO_H265_NO_REFERENCE_PICTURE
以表示“无参考图像”; -
list_entry_l0
和list_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_id
和StdVideoEncodeH265PictureInfo
::pps_seq_parameter_set_id
组成的键对标识的 SPS。 -
*活动 PPS* 是由
StdVideoEncodeH265PictureInfo
::sps_video_parameter_set_id
、StdVideoEncodeH265PictureInfo
::pps_seq_parameter_set_id
和StdVideoEncodeH265PictureInfo
::pps_pic_parameter_set_id
组成的键三元组标识的 PPS。
-
如果活动 PPS 和 pNaluSliceSegmentEntries
的相应元素的 pStdSliceSegmentHeader
成员满足以下任一条件,则 H.265 编码将对片段使用 *显式加权样本预测*,如 ITU-T H.265 规范 的 8.5.3.3.4 节中定义:
-
pStdSliceSegmentHeader->slice_type
为STD_VIDEO_H265_SLICE_TYPE_P
,并且在活动 PPS 中启用了weighted_pred_flag
。 -
pStdSliceSegmentHeader->slice_type
为STD_VIDEO_H265_SLICE_TYPE_B
,并且在活动 PPS 中启用了weighted_bipred_flag
。
H.265 片(如 ITU-T H.265 规范 的 3.174 节中所定义)的数量由活动 PPS 的 num_tile_columns_minus1
和 num_tile_rows_minus1
成员得出,如下所示:
-
(
num_tile_columns_minus1
+ 1) × (num_tile_rows_minus1
+ 1)
// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265NaluSliceSegmentInfoKHR {
VkStructureType sType;
const void* pNext;
int32_t constantQp;
const StdVideoEncodeH265SliceSegmentHeader* pStdSliceSegmentHeader;
} VkVideoEncodeH265NaluSliceSegmentInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
如果为视频会话配置的当前速率控制模式是
VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
,则constantQp
是用于切片片段的 QP。 -
pStdSliceSegmentHeader
是指向StdVideoEncodeH265SliceSegmentHeader
结构的指针,该结构指定切片片段的H.265 切片片段头参数。
- 标准切片片段头参数
-
pStdSliceSegmentHeader
所指向的StdVideoEncodeH265SliceSegmentHeader
结构的成员解释如下:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
如果
pWeightTable
不为NULL
,则它是指向StdVideoEncodeH265WeightTable
的指针,其解释如下:-
flags.luma_weight_l0_flag
、flags.chroma_weight_l0_flag
、flags.luma_weight_l1_flag
和flags.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 节中的定义相同。
-
VkVideoEncodeH265DpbSlotInfoKHR 结构的定义如下:
// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265DpbSlotInfoKHR {
VkStructureType sType;
const void* pNext;
const StdVideoEncodeH265ReferenceInfo* pStdReferenceInfo;
} VkVideoEncodeH265DpbSlotInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdReferenceInfo
是指向StdVideoEncodeH265ReferenceInfo
结构的指针,该结构指定H.265 参考信息。
如果 pSetupReferenceSlot
不为 NULL
,则此结构在 VkVideoEncodeInfoKHR::pSetupReferenceSlot
的 pNext
链中指定,并且在 VkVideoEncodeInfoKHR::pReferenceSlots
的元素的 pNext
链中指定,以指定 H.265 编码操作的编解码器特定参考图片信息。
- 活动参考图像信息
-
当此结构在 VkVideoEncodeInfoKHR::
pReferenceSlots
的元素的pNext
链中指定时,对于 VkVideoEncodeInfoKHR::pReferenceSlots
的每个元素,会将一个元素添加到视频编码操作使用的活动参考图片列表中,如下所示-
使用的图像子区域根据 H.265 编码图像数据访问 部分确定。
-
参考图片与 VkVideoEncodeInfoKHR::
pReferenceSlots
的相应元素的slotIndex
成员中指定的DPB 插槽索引相关联。 -
参考图片与
pStdReferenceInfo
中提供的H.265 参考信息相关联。
-
- 重建图像信息
-
当此结构在 VkVideoEncodeInfoKHR::
pSetupReferenceSlot
的pNext
链中指定时,与重建图片相关的信息定义如下-
使用的图像子区域根据 H.265 编码图像数据访问 部分确定。
-
如果请求参考图片设置,则重建的图片用于激活 DPB 插槽,其索引在 VkVideoEncodeInfoKHR::
pSetupReferenceSlot->slotIndex
中指定。 -
重建的图片与
pStdReferenceInfo
中提供的H.265 参考信息相关联。
-
- 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
。
-
H.265 编码速率控制
图片组
在 H.265 编码中,常见的做法是在编码后续帧时,按照显示顺序遵循不同图片类型的规则模式。此模式称为图片组 (GOP)。
常规 GOP 由以下参数定义
-
GOP 中的帧数;
-
在显示顺序中,I 帧和/或 P 帧之间连续 B 帧的数量。
GOP 进一步分类为开放 GOP 和闭合 GOP。
开放 GOP 中的帧类型在显示顺序中按照以下算法相互跟随
-
第一帧始终是 I 帧。
-
接下来是若干个连续的 B 帧,如上所述。
-
如果尚未达到 GOP 中的帧数,则下一帧是 P 帧,并且该算法从步骤 2 继续。
在闭合 GOP 的情况下,在某个周期使用 IDR 帧。
H.265 编码的典型做法是在 GOP 的帧中使用特定的参考图片使用模式。最常用的两种参考模式如下:
- 平面参考模式
-
-
每个 P 帧在显示顺序中使用最后一个非 B 帧作为参考。
-
每个 B 帧在显示顺序中使用最后一个非 B 帧作为其前向参考,并在显示顺序中使用下一个非 B 帧作为其后向参考。
-
- 二元参考模式
-
-
每个 P 帧在显示顺序中使用最后一个非 B 帧作为参考。
-
以下算法应用于显示顺序中 I 帧和/或 P 帧之间连续 B 帧的序列
-
此序列中间的 B 帧使用该序列之前的帧作为其前向参考,并使用该序列之后的帧作为其后向参考。
-
对于以下帧序列,递归执行该算法
-
原始序列中位于中间帧之前的 B 帧(如果有)。
-
原始序列中位于中间帧之后的 B 帧(如果有)。
-
-
-
应用程序可以向实现 的速率控制算法提供有关应用程序使用的 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 的第一帧作为参考。
-
多层速率控制和多层编码通常用于期望低延迟的流媒体情况,因此通常不使用具有后向预测的 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是一个 VkVideoEncodeH265RateControlFlagBitsKHR 位掩码,用于指定 H.265 速率控制标志。 -
gopFrameCount
是应用程序打算使用的图片组 (GOP) 中的帧数。如果为 0,则速率控制算法可以假定一个与实现相关的 GOP 长度。如果为UINT32_MAX
,则将 GOP 长度视为无限。 -
idrPeriod
是两个 IDR 帧之间的间隔,以帧数为单位(请参阅 IDR 周期)。如果为 0,则速率控制算法可能会采用一个与实现相关的 IDR 周期。如果为UINT32_MAX
,则 IDR 周期被视为无限大。 -
consecutiveBFrameCount
是 GOP 内 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 合规性要求。否则,新的速率控制状态可能会在不重置的情况下应用,具体取决于实现和指定的速率控制参数。
根据为 |
可以在 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 结构的gopFrameCount
、idrPeriod
和consecutiveBFrameCount
成员中指定的参数,使用规则 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
useMinQp
指示是否将速率控制确定的 QP 值钳制到minQp
中指定的 QP 值下限。 -
minQp
指定当useMinQp
为VK_TRUE
时,实现速率控制算法将使用的每个图像类型的 QP 值下限。 -
useMaxQp
指示是否将速率控制确定的 QP 值钳制到maxQp
中指定的 QP 值上限。 -
maxQp
指定当useMaxQp
为VK_TRUE
时,实现速率控制算法将使用的每个图像类型的 QP 值上限。 -
useMaxFrameSize
指示实现速率控制算法应该是否使用maxFrameSize
中指定的值作为每个图像类型的编码帧大小的上限。 -
maxFrameSize
指定当useMaxFrameSize
为VK_TRUE
时,每个图像类型的编码帧大小的上限。
使用时,minQp
和 maxQp
中的值保证实现使用的有效 QP 值将分别遵守这些下限和上限。但是,限制实现能够使用的 QP 值范围也会限制实现速率控制算法符合其他约束的能力。特别是,实现可能无法符合以下要求:
-
要在编码比特流中使用的平均和/或峰值比特率值,在 VkVideoEncodeRateControlLayerInfoKHR 结构的
averageBitrate
和maxBitrate
成员中指定。 -
在
VkVideoEncodeH265RateControlLayerInfoKHR
的maxFrameSize
成员中,为每种图片类型指定的编码帧大小的上限。
通常,应用程序需要适当地配置速率控制参数,以便获得所需的速率控制行为,如视频编码速率控制部分所述。 |
当此结构的实例包含在 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 特定速率控制参数。
VkVideoEncodeH265FrameSizeKHR
结构定义如下:
// Provided by VK_KHR_video_encode_h265
typedef struct VkVideoEncodeH265FrameSizeKHR {
uint32_t frameISize;
uint32_t framePSize;
uint32_t frameBSize;
} VkVideoEncodeH265FrameSizeKHR;
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
useGopRemainingFrames
指示实现中的速率控制算法是否应该使用gopRemainingI
、gopRemainingP
和gopRemainingB
中指定的值。如果useGopRemainingFrames
为VK_FALSE
,则gopRemainingI
、gopRemainingP
和gopRemainingB
的值将被忽略。
只有当为所使用的 视频配置文件报告的 VkVideoEncodeH265CapabilitiesKHR::requiresGopRemainingFrames
为 VK_TRUE
时,才强制要求将 useGopRemainingFrames
设置为 VK_TRUE
,并将此结构包含在 VkVideoBeginCodingInfoKHR 的 pNext
链中。但是,实现可以使用这些剩余帧计数(如果指定),即使不是必需的。特别是,当应用程序不使用规则的 GOP 结构时,这些值可以为实现的码率控制算法提供额外的指导。
VkVideoEncodeH265CapabilitiesKHR::prefersGopRemainingFrames
功能也用于指示如果应用程序使用此结构指定剩余帧计数,则实现的码率控制算法可能会更准确地运行。
与其他速率控制指导值一样,如果应用程序编码的帧的有效顺序和数量与在任何给定点在此结构中指定的剩余帧计数不一致,则实现中的速率控制算法的行为可能会偏离应用程序预期的行为。
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 增量值超出 VkVideoEncodeH265QuantizationMapCapabilitiesKHR 的
minQpDelta
和maxQpDelta
成员中报告的支持的 QP 增量值范围,则用于编码单元的 QP 值将变为未定义。
-
-
如果配置的码率控制模式为
VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
,则 QP 值将从为编码单元所属的 H.265 切片段指定的恒定 QP 值进行初始化。-
如果视频编码操作是使用量化增量映射发出的,则从量化映射中提取的、与编码单元对应的 QP 增量值将添加到先前确定的 QP 值中。如果提取的 QP 增量值超出 VkVideoEncodeH265QuantizationMapCapabilitiesKHR 的
minQpDelta
和maxQpDelta
成员中报告的支持的 QP 增量值范围,则用于编码单元的 QP 值将变为未定义。
-
-
如果配置的码率控制模式不是
VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR
或VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
,则 QP 值由相应的码率控制算法初始化。-
如果视频编码操作是使用量化增量映射发出的,则从量化映射中提取的、与编码单元对应的 QP 增量值将添加到先前确定的 QP 值中。如果提取的 QP 增量值超出 VkVideoEncodeH265QuantizationMapCapabilitiesKHR 的
minQpDelta
和maxQpDelta
成员中报告的支持的 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 值范围内,如 VkVideoEncodeH265CapabilitiesKHR 的
minQp
和maxQp
成员中报告的那样。
H.265 编码要求
本节描述了对于至少有一个队列族支持视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR
的物理设备来说,必需 的 H.265 编码能力,该操作由 vkGetPhysicalDeviceQueueFamilyProperties2 在 VkQueueFamilyVideoPropertiesKHR::videoCodecOperations
中返回。
视频标准头名称 | 版本 |
---|---|
|
1.0.0 |
视频功能 | 要求 | 要求类型1 |
---|---|---|
|
- |
min |
|
4096 |
max |
|
4096 |
max |
|
(64,64) |
max |
|
- |
max |
|
- |
min |
|
0 |
min |
|
0 |
min |
|
- |
min |
|
- |
min |
|
128000 |
min |
|
1 |
min |
|
(64,64) |
max |
|
|
min |
|
- |
min |
|
|
min |
|
1 |
min |
|
(1,1) |
min |
|
至少设置一位 |
实现相关 |
|
至少设置一位 |
实现相关 |
|
0 |
min |
|
0 |
min |
|
0 |
min |
|
1 |
min |
|
- |
实现相关 |
|
- |
max |
|
- |
min |
|
- |
实现相关 |
|
- |
实现相关 |
|
- |
min |
|
- 2 |
min |
|
- 3 |
max |
|
- 3 |
min |
- 1
-
“要求类型”列指定要求是所有实现必须支持的最小值、所有实现必须支持的最大值,或者所有实现必须支持的确切值。对于位掩码,最小值是所有实现必须设置的最小位,但它们可能会设置超出此最小值的额外位。
- 2
-
如果 VkVideoCapabilitiesKHR::
flags
包括VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR
或VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR
,则maxQuantizationMapExtent
的width
和height
成员必须大于零。 - 3
-
如果 VkVideoCapabilitiesKHR::
flags
包括VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR
,则maxQpDelta
必须大于minQpDelta
。
AV1 编码操作
有关 Khronos 知识产权政策如何与对非 Khronos 创建的外部材料的规范性引用相关的信息,请参阅前言。 |
-
语法元素、派生值和其他参数从以下结构应用:
-
StdVideoAV1SequenceHeader
结构、可选的StdVideoEncodeAV1DecoderModelInfo
结构以及存储在绑定的视频会话参数对象中的可选的StdVideoEncodeAV1OperatingPointInfo
结构数组,指定了 活动序列头。 -
StdVideoEncodeAV1PictureInfo
结构指定了 AV1 图像信息。 -
StdVideoEncodeAV1ReferenceInfo
结构指定了与可选的 重建图像 和任何 活动参考图像 对应的 AV1 参考信息。 -
编码后的比特流数据将写入目标视频比特流缓冲区范围,如 AV1 编码比特流数据访问 部分所定义。
-
将按照 AV1 编码图像数据访问 部分的定义,访问与使用的 编码输入图像、活动参考图像 和可选的 重建图像 相对应的视频图像资源中的图像数据。
-
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:: |
如果对于使用的视频配置文件,VkVideoEncodeAV1CapabilitiesKHR::codedPictureAlignment
不等于 {8,8}
,则实现将按以下方式覆盖编码图像的分辨率以及与宽度和高度相关的参数
-
令
w
和h
为与编码输入图像对应的 VkVideoPictureResourceInfoKHR 结构的codedExtent.width
和codedExtent.height
,向上舍入到 8 的最接近的整数倍。 -
令
aW
和aH
分别为w
和h
,向上舍入到codedPictureAlignment.width
和codedPictureAlignment.height
的最接近的整数倍。 -
如果
w
等于aW
,则不会发生覆盖。否则,编码宽度将为aW
。 -
如果
h
等于aH
,则不会发生覆盖。否则,编码高度将为aH
。
AV1 规范将所有分辨率编码为 8x8 对齐,但通过隐式裁剪支持未对齐的分辨率。因此,如果原始编码范围(与 8x8 对齐)满足实现所需的对齐要求,则无需进行任何覆盖。否则,实现无法编码请求的编码范围,因此比特流中的最终分辨率将被覆盖为与实现所需的对齐方式对齐。 例如,考虑一个只能输出 16x16 对齐比特流的实现(如 VkVideoEncodeAV1CapabilitiesKHR:: |
如果使用 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::generateObuExtensionHeader
为 VK_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_KEY
或STD_VIDEO_AV1_FRAME_TYPE_INTRA_ONLY
的 AV1 帧。 -
VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR
指定使用单参考预测模式,用于编码类型为STD_VIDEO_AV1_FRAME_TYPE_INTER
或STD_VIDEO_AV1_FRAME_TYPE_SWITCH
且reference_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_INTER
或STD_VIDEO_AV1_FRAME_TYPE_SWITCH
且reference_select
(如AV1 规范的 6.8.23 节中所定义)等于 1,并且用于预测的两个参考名称都来自同一参考帧组(如AV1 规范的 6.10.24 节中所定义)的 AV1 帧。当使用此预测模式时,应用程序必须为 VkVideoEncodeAV1PictureInfoKHR::referenceNameSlotIndices
中至少两个实现支持的AV1 参考名称指定参考图像,如 VkVideoEncodeAV1CapabilitiesKHR::unidirectionalCompoundReferenceNameMask
中报告的那样。其中这两个参考名称是AV1 规范的 5.11.25 节中定义的允许参考名称对之一,如下所示:-
LAST_FRAME
和LAST2_FRAME
, -
LAST_FRAME
和LAST3_FRAME
, -
LAST_FRAME
和GOLDEN_FRAME
,或者 -
BWDREF_FRAME
和ALTREF_FRAME
。
-
-
VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR
指定使用双向复合预测模式,当编码STD_VIDEO_AV1_FRAME_TYPE_INTER
或STD_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 视频编码操作的视频配置文件通过将 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
stdProfile
是一个StdVideoAV1Profile
值,指定 AV1 编解码器配置文件,如 AV1 规范 的 A.2 节中所定义。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是一个 VkVideoEncodeAV1CapabilityFlagBitsKHR 的位掩码,指示支持的 AV1 编码能力。 -
maxLevel
是一个StdVideoAV1Level
值,指示配置文件支持的最大 AV1 级别,如 AV1 规范 A.3 节所定义。 -
codedPictureAlignment
指示实现将编码图像的对齐方式。此功能不会对应用程序施加任何有效的用法约束。但是,根据编码输入图像资源的codedExtent
,此功能可能导致编码图像的分辨率发生变化,如下文更详细的描述。 -
maxTiles
指示实现支持的最大 AV1 瓦片列数和行数。 -
minTileSize
指示实现支持的单个 AV1 瓦片的最小范围。 -
maxTileSize
指示实现支持的单个 AV1 瓦片的最大范围。 -
superblockSizes
是一个 VkVideoEncodeAV1SuperblockSizeFlagBitsKHR 值的位掩码,指示支持的 AV1 超块大小。 -
maxSingleReferenceCount
指示在使用单参考预测模式时,实现支持的最大参考图像数量。 -
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 速率控制组 剩余的帧数。 -
stdSyntaxFlags
是 VkVideoEncodeAV1StdFlagBitsKHR 的位掩码,指示与 AV1 语法元素相关的能力。
singleReferenceNameMask
,unidirectionalCompoundReferenceNameMask
和 bidirectionalCompoundReferenceNameMask
的编码方式是,当位索引 i 被设置时,它指示支持 AV1 参考名称 STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME
+ i。
这些掩码指示 VkVideoEncodeAV1PictureInfoKHR 的 |
codedPictureAlignment
提供关于实现编码任意分辨率的限制信息。特别是,某些实现可能无法生成符合 AV1 规范 (8x8) 要求的比特流。在这种情况下,实现可能会覆盖比特流的宽度和高度,以便生成符合AV1 规范的比特流。如果发生这种覆盖,编码图像的编码分辨率将会扩大,超出编码输入图像资源的 codedExtent
范围的纹素值将首先受关于编码输入图像粒度的规则约束。超出编码输入图像粒度所描述区域的任何纹素值都由实现定义。为了最大限度地减少对生成的编码内容的影响,实现应该使用定义良好的值。
此功能不施加额外的应用程序要求。但是,这些覆盖会更改比特流的有效分辨率并添加填充像素。对这种覆盖敏感的应用程序可以使用此功能和相应的覆盖行为来计算重现原始编码输入的裁剪量,并在侧通道中传输(例如,通过使用容器中可用的裁剪字段)。此外,应用程序可以在其编码范围中显式考虑这种对齐方式,以避免将实现定义的纹素值包含在编码内容中。 |
在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
时,无论编码输入图像的编码范围以及StdVideoAV1TileInfo
的TileCols
和TileRows
成员中请求的分块列数和行数如何,实现都支持使用该值。 -
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
指定实现是否支持使用StdVideoAV1Quantization
的DeltaQYDc
、DeltaQUDc
、DeltaQUAc
、DeltaQVDc
和DeltaQVAc
成员的应用程序提供的值。
这些功能标志为应用程序提供有关特定 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_KHR
的 pVideoProfile->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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
preferredRateControlFlags
是 VkVideoEncodeAV1RateControlFlagBitsKHR 值的位掩码,指示用于 VkVideoEncodeAV1RateControlInfoKHR::flags
的首选标志。 -
preferredGopFrameCount
指示用于 VkVideoEncodeAV1RateControlInfoKHR::gopFrameCount
的首选值。 -
preferredKeyFramePeriod
指示用于 VkVideoEncodeAV1RateControlInfoKHR::keyFramePeriod
的首选值。 -
preferredConsecutiveBipredictiveFrameCount
指示用于 VkVideoEncodeAV1RateControlInfoKHR::consecutiveBipredictiveFrameCount
的首选值。 -
preferredTemporalLayerCount
指示用于 VkVideoEncodeAV1RateControlInfoKHR::temporalLayerCount
的首选值。 -
preferredConstantQIndex
指示当使用速率控制模式VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
时用于 VkVideoEncodeAV1PictureInfoKHR::constantQIndex
的首选值。 -
preferredMaxSingleReferenceCount
指示与单参考预测模式一起使用的首选最大参考图像数量。 -
preferredSingleReferenceNameMask
是当使用单参考预测模式时首选的AV1 参考名称的位掩码。 -
preferredMaxUnidirectionalCompoundReferenceCount
指示使用单向复合预测模式时首选的最大参考帧数量。 -
preferredMaxUnidirectionalCompoundGroup1ReferenceCount
指示使用来自参考帧组 1 的单向复合预测模式时首选的最大参考帧数量,如 AV1 规范的 6.10.24 节中所定义。 -
preferredUnidirectionalCompoundReferenceNameMask
是使用单向复合预测模式时首选的AV1 参考名称的位掩码。 -
preferredMaxBidirectionalCompoundReferenceCount
指示使用双向复合预测模式时首选的最大参考帧数量。 -
preferredMaxBidirectionalCompoundGroup1ReferenceCount
指示使用来自参考帧组 1 的双向复合预测模式时首选的最大参考帧数量,如 AV1 规范的 6.10.24 节中所定义。 -
preferredMaxBidirectionalCompoundGroup2ReferenceCount
指示使用来自参考帧组 2 的双向复合预测模式时首选的最大参考帧数量,如 AV1 规范的 6.10.24 节中所定义。 -
preferredBidirectionalCompoundReferenceNameMask
是使用双向复合预测模式时首选的AV1 参考名称的位掩码。
preferredSingleReferenceNameMask
、preferredUnidirectionalCompoundReferenceNameMask
和 preferredBidirectionalCompoundReferenceNameMask
的编码方式是:当位索引 i 被设置时,表示首选使用 AV1 参考名称 STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME
+ i。
AV1 编码会话
当使用 AV1 编码配置文件创建视频会话时,可以通过在 VkVideoSessionCreateInfoKHR 的 pNext
链中包含 VkVideoEncodeAV1SessionCreateInfoKHR 结构的实例来指定其他参数。
VkVideoEncodeAV1SessionCreateInfoKHR
结构定义如下
// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1SessionCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkBool32 useMaxLevel;
StdVideoAV1Level maxLevel;
} VkVideoEncodeAV1SessionCreateInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
useMaxLevel
指示实现是否应使用maxLevel
的值。当设置为VK_FALSE
时,实现会忽略maxLevel
的值,并使用 VkVideoEncodeAV1CapabilitiesKHR::maxLevel
的值,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 为视频配置文件报告。 -
maxLevel
是一个StdVideoAV1Level
值,用于指定创建的视频会话生成的视频比特流的 AV1 级别的上限。
AV1 编码参数集
使用视频编解码操作 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR
创建的视频会话参数对象包含以下参数集的单个实例
- AV1 序列头
-
由
StdVideoAV1SequenceHeader
结构表示,并按如下方式解释:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
pColorConfig
指向的StdVideoAV1ColorConfig
结构按如下方式解释:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdSequenceHeader
是指向StdVideoAV1SequenceHeader
结构的指针,该结构描述了要存储在创建的对象中的AV1 序列头条目的参数。 -
pStdDecoderModelInfo
是NULL
或指向StdVideoEncodeAV1DecoderModelInfo
结构的指针,该结构指定要存储在创建的对象中的AV1 解码器模型信息。 -
stdOperatingPointCount
是pStdOperatingPoints
数组中的元素数量。 -
pStdOperatingPoints
是NULL
或指向stdOperatingPointCount
个StdVideoEncodeAV1OperatingPointInfo
结构组成的数组的指针,该结构指定要存储在创建的对象中的AV1 操作点信息。每个元素 i 指定与 AV1 规范的 6.4 节中定义的语法元素的元素 i 对应的参数值。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
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 节中所定义。
此结构在传递给 vkCmdEncodeVideoKHR 的 VkVideoEncodeInfoKHR 结构的 pNext
链中指定,以指定AV1 编码操作的编解码器特定图像信息。
- 编码输入图片信息
-
当此结构在传递给 vkCmdEncodeVideoKHR 的 VkVideoEncodeInfoKHR 结构的
pNext
链中指定时,与编码输入图像相关的信息定义如下-
所使用的图像子区域根据 AV1 编码图像数据访问部分确定。
-
编码输入图像与
pStdPictureInfo
中提供的 AV1 图像信息相关联。
-
- 标准图像信息
-
由
pStdPictureInfo
指向的StdVideoEncodeAV1PictureInfo
结构的成员解释如下:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
pSegmentation
必须为NULL
。视频编码操作当前不支持 AV1 分割。 因此,应用程序需要将
flags.segmentation_enabled
设置为0
,并将pSegmentation
设置为NULL
。 -
pTileInfo
为NULL
或指向StdVideoAV1TileInfo
结构的指针,该结构指定 AV1 瓦片参数。 -
由
pQuantization
指向的StdVideoAV1Quantization
结构按如下方式解释-
flags.reserved
仅用于填充目的,否则将被忽略; -
StdVideoAV1Quantization
的所有其他成员都按照 AV1 规范的 6.8.11 节中的定义进行解释;
-
-
由
pLoopFilter
指向的StdVideoAV1LoopFilter
结构按如下方式解释-
flags.reserved
仅用于填充目的,否则将被忽略; -
update_ref_delta
是一个位掩码,其中位索引 i 被解释为对应于loop_filter_ref_deltas
的元素 i 的update_ref_delta
的值,如 AV1 规范的 6.8.10 节中所定义; -
update_mode_delta
是一个位掩码,其中位索引 i 被解释为对应于loop_filter_mode_deltas
的元素 i 的update_mode_delta
的值,如 AV1 规范的 6.8.10 节中所定义; -
StdVideoAV1LoopFilter
的所有其他成员都按照 AV1 规范的 6.8.10 节中的定义进行解释;
-
-
如果在活动序列头中设置了
flags.enable_cdef
,则由pCDEF
指向的StdVideoAV1CDEF
结构的成员解释如下: -
如果在活动序列头中设置了
flags.UsesLr
,则由pLoopRestoration
指向的StdVideoAV1LoopRestoration
结构解释如下: -
在
global_motion
中提供的StdVideoAV1GlobalMotion
结构的成员按 AV1 规范的 7.10 节中的定义进行解释; -
pExtensionHeader
为NULL
或指向StdVideoEncodeAV1ExtensionHeader
结构的指针,该结构的temporal_id
和spatial_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
::pTileInfo
为NULL
,则实现以实现相关的方式确定 AV1 规范 6.8.14 节中定义的 AV1 瓦片参数的值。 如果StdVideoEncodeAV1PictureInfo
::pTileInfo
不为NULL
,则由StdVideoEncodeAV1PictureInfo
::pTileInfo
指向的StdVideoAV1TileInfo
结构的成员解释如下:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
TileCols
和TileRows
指定瓦片列数和瓦片行数,如 AV1 规范 6.8.14 节中所定义。 -
tile_size_bytes_minus_1
被忽略,因为它的值,如 AV1 规范 6.8.14 节中所定义,是编码过程的结果所确定的。 -
pMiColStarts
和pMiRowStarts
被忽略,因为 AV1 规范 6.8.14 节中定义的MiColStarts
和MiRowStarts
数组的元素由实现根据实现确定的或通过pWidthInSbsMinus1
和pHeightInSbsMinus1
数组分别指定的瓦片宽度和高度来确定。 -
pWidthInSbsMinus1
为NULL
或指向一个包含TileCols
个无符号整数的数组的指针,该数组对应于 AV1 规范 6.8.14 节中定义的width_in_sbs_minus_1
。 -
pHeightInSbsMinus1
为NULL
或指向一个包含TileRows
个无符号整数的数组的指针,该数组对应于 AV1 规范 6.8.14 节中定义的height_in_sbs_minus_1
。 -
StdVideoAV1TileInfo
的所有其他成员的解释如 AV1 规范 6.8.14 节中所定义。
-
如果设置了 flags.uniform_tile_spacing_flag
,则 pWidthInSbsMinus1
和 pHeightInSbsMinus1
将被忽略。
如果未设置 flags.uniform_tile_spacing_flag
并且 pWidthInSbsMinus1
为 NULL
,则单个瓦片列的宽度将以实现相关的方式确定。
如果未设置 flags.uniform_tile_spacing_flag
并且 pHeightInSbsMinus1
为 NULL
,则单个瓦片行的高度将以实现相关的方式确定。
- 活动参数集
-
活动序列头是存储在绑定视频会话参数对象中的 AV1 序列头。
VkVideoEncodeAV1DpbSlotInfoKHR 结构定义如下:
// Provided by VK_KHR_video_encode_av1
typedef struct VkVideoEncodeAV1DpbSlotInfoKHR {
VkStructureType sType;
const void* pNext;
const StdVideoEncodeAV1ReferenceInfo* pStdReferenceInfo;
} VkVideoEncodeAV1DpbSlotInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pStdReferenceInfo
是指向StdVideoEncodeAV1ReferenceInfo
结构的指针,该结构指定 AV1 参考信息。
如果 pSetupReferenceSlot
不为 NULL
,则此结构在 VkVideoEncodeInfoKHR::pNext
链中指定,并在 VkVideoEncodeInfoKHR::pReferenceSlots
的元素的 pNext
链中指定,以指定 AV1 编码操作的特定于编解码器的参考图像信息。
- 活动参考图像信息
-
当此结构在 VkVideoEncodeInfoKHR::
pReferenceSlots
的元素的pNext
链中指定时,对于 VkVideoEncodeInfoKHR::pReferenceSlots
的每个元素,会将一个元素添加到视频编码操作使用的活动参考图片列表中,如下所示-
所使用的图像子区域根据 AV1 编码图像数据访问部分确定。
-
参考图片与 VkVideoEncodeInfoKHR::
pReferenceSlots
的相应元素的slotIndex
成员中指定的DPB 插槽索引相关联。 -
参考图像与
pStdReferenceInfo
中提供的 AV1 参考信息相关联。
-
- 重建图像信息
-
当此结构在 VkVideoEncodeInfoKHR::
pSetupReferenceSlot
的pNext
链中指定时,与重建图片相关的信息定义如下-
所使用的图像子区域根据 AV1 编码图像数据访问部分确定。
-
如果请求了参考图像设置,则使用重建的图像来激活 DPB 插槽,其索引在 VkVideoEncodeInfoKHR::
pSetupReferenceSlot->slotIndex
中指定。 -
重建的图像与
pStdReferenceInfo
中提供的 AV1 参考信息相关联。
-
- Std 参考信息
-
pStdReferenceInfo
指向的StdVideoEncodeAV1ReferenceInfo
结构的成员解释如下:-
flags.reserved
和reserved1
仅用于填充目的,否则将被忽略; -
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 节中所定义; -
pExtensionHeader
为NULL
或指向StdVideoEncodeAV1ExtensionHeader
结构的指针,该结构的temporal_id
和spatial_id
成员分别指定参考帧的时间和空间层 ID。
-
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_KEY
或STD_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 中的帧类型在显示顺序中按照以下算法相互跟随
-
第一帧始终是使用
VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR
编码的帧。 -
接下来是一定数量的连续帧,使用
VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR
编码。 -
如果尚未达到 GOP 中的帧数,则下一帧是使用
VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR
编码的帧,算法从步骤 2 继续。
对于封闭式 GOP,在特定周期使用 AV1 帧类型 STD_VIDEO_AV1_FRAME_TYPE_KEY
的帧。
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
编码的帧作为其后向参考。
-
- 二元参考模式
-
-
每个使用
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
编码的帧序列-
此序列中间的帧使用该序列之前的帧作为其前向参考,并使用该序列之后的帧作为其后向参考。
-
对于以下帧序列,递归执行该算法
-
如果存在,则为原始序列中位于中间帧之前的帧。
-
如果存在,则为原始序列中位于中间帧之后的帧。
-
-
-
应用程序可以向实现的速率控制算法提供有关应用程序所使用的 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 的第一帧作为参考。
-
多层速率控制和多层编码通常用于需要低延迟的流媒体情况,因此帧通常不使用显示顺序中的后向参考。 |
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是 VkVideoEncodeAV1RateControlFlagBitsKHR 的位掩码,用于指定 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
时,此结构中的参数将用作实现速率控制算法的指导(请参阅 视频编码控制)。
可在 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 结构的gopFrameCount
和keyFramePeriod
成员中指定的参数使用常规 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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
useMinQIndex
指示码率控制确定的量化器索引值是否会钳制到minQIndex
中指定的量化器索引值的下限。 -
minQIndex
指定量化器索引值的下限,对于每个码率控制组,当useMinQIndex
设置为VK_TRUE
时,实现方案的码率控制算法将使用这些下限。 -
useMaxQIndex
指示码率控制确定的量化器索引值是否会钳制到maxQIndex
中指定的量化器索引值的上限。 -
maxQIndex
指定量化器索引值的上限,对于每个码率控制组,当useMaxQIndex
设置为VK_TRUE
时,实现方案的码率控制算法将使用这些上限。 -
useMaxFrameSize
指示实现方案的码率控制算法是否应使用maxFrameSize
中指定的值作为每个码率控制组的编码帧大小的上限。 -
maxFrameSize
指定每个码率控制组的编码帧大小的上限,当useMaxFrameSize
设置为VK_TRUE
时使用。
当使用时,minQIndex
和 maxQIndex
中的值保证实现方案使用的有效量化器索引值将分别遵守这些下限和上限。但是,限制实现方案能够使用的量化器索引值范围也将限制实现方案的码率控制算法遵守其他约束的能力。特别是,实现方案可能无法遵守以下内容:
-
要在编码比特流中使用的平均和/或峰值比特率值,在 VkVideoEncodeRateControlLayerInfoKHR 结构的
averageBitrate
和maxBitrate
成员中指定。 -
在
VkVideoEncodeAV1RateControlLayerInfoKHR
的maxFrameSize
成员中指定的每个码率控制组的编码帧大小的上限。
通常,应用程序需要适当地配置速率控制参数,以便获得所需的速率控制行为,如视频编码速率控制部分所述。 |
当此结构的实例包含在传递给 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 特定码率控制参数。
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 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
useGopRemainingFrames
指示实现中的码率控制算法是否应该使用gopRemainingIntra
、gopRemainingPredictive
和gopRemainingBipredictive
中指定的值。如果useGopRemainingFrames
为VK_FALSE
,则gopRemainingIntra
、gopRemainingPredictive
和gopRemainingBipredictive
的值将被忽略。 -
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
并将此结构包含在 VkVideoBeginCodingInfoKHR 的 pNext
链中。但是,即使不需要,实现也可以使用这些剩余的帧计数(如果指定)。特别是,当应用程序不使用规则 GOP 结构时,这些值可以为实现的码率控制算法提供额外的指导。
VkVideoEncodeAV1CapabilitiesKHR::prefersGopRemainingFrames
功能也用于指示如果应用程序使用此结构指定剩余的帧计数,则实现的码率控制算法可能会更准确地运行。
与其他速率控制指导值一样,如果应用程序编码的帧的有效顺序和数量与在任何给定点在此结构中指定的剩余帧计数不一致,则实现中的速率控制算法的行为可能会偏离应用程序预期的行为。
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
,则量化器索引值由特定于实现的默认码率控制算法初始化。-
如果视频编码操作是使用量化增量图发出的,则与模式信息块对应的量化器索引增量值,如从量化图中获取,将被添加到先前确定的量化器索引值。如果获取的量化器索引增量值超出 VkVideoEncodeAV1QuantizationMapCapabilitiesKHR 的
minQIndexDelta
和maxQIndexDelta
成员中报告的受支持的量化器索引增量值范围,则用于模式信息块的量化器索引值将变为未定义。
-
-
如果配置的码率控制模式为
VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
,则量化器索引值将从为编码帧指定的恒定量化器索引值初始化。-
如果视频编码操作是使用量化增量图发出的,则与模式信息块对应的量化器索引增量值,如从量化图中获取,将被添加到先前确定的量化器索引值。如果获取的量化器索引增量值超出 VkVideoEncodeAV1QuantizationMapCapabilitiesKHR 的
minQIndexDelta
和maxQIndexDelta
成员中报告的受支持的量化器索引增量值范围,则用于模式信息块的量化器索引值将变为未定义。
-
-
如果配置的码率控制模式不是
VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR
或VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
,则量化器索引值将由相应的码率控制算法初始化。-
如果视频编码操作是使用量化增量图发出的,则与模式信息块对应的量化器索引增量值,如从量化图中获取,将被添加到先前确定的量化器索引值。如果获取的量化器索引增量值超出 VkVideoEncodeAV1QuantizationMapCapabilitiesKHR 的
minQIndexDelta
和maxQIndexDelta
成员中报告的受支持的量化器索引增量值范围,则用于模式信息块的量化器索引值将变为未定义。 -
如果视频编码操作是使用强调图发出的,则码率控制将根据模式信息块对应的强调值,如从量化图中获取,根据以下公式调整量化器索引值:
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
视频编解码器操作的物理设备(如 vkGetPhysicalDeviceQueueFamilyProperties2 在 VkQueueFamilyVideoPropertiesKHR::videoCodecOperations
中返回)的必需 AV1 编码功能。
视频标准头名称 | 版本 |
---|---|
|
1.0.0 |
视频功能 | 要求 | 要求类型1 |
---|---|---|
|
- |
min |
|
4096 |
max |
|
4096 |
max |
|
(64,64) |
max |
|
- |
max |
|
- |
min |
|
0 |
min |
|
0 |
min |
|
- |
min |
|
- |
min |
|
5529600 |
min |
|
1 |
min |
|
(64,64) |
max |
|
|
min |
|
- |
min |
|
(8,8) |
min |
|
1 |
min |
|
- |
max |
|
- |
min |
|
|
min |
|
至少设置一位 |
实现相关 |
|
0 |
min |
|
- 2 |
min |
|
0 3 |
min |
|
0 3,4 |
min |
|
- 2 |
min |
|
0 3 |
min |
|
0 3,5 |
min |
|
0 3,5 |
min |
|
- 2 |
min |
|
1 |
min |
|
1 |
min |
|
0 |
min |
|
- |
max |
|
- |
min |
|
- |
实现相关 |
|
- |
实现相关 |
|
- |
min |
|
- 6 |
min |
|
- 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
-
maxBidirectionalCompoundGroup1ReferenceCount
和maxBidirectionalCompoundGroup2ReferenceCount
的总和必须大于或等于maxBidirectionalCompoundReferenceCount
。 - 6
-
如果 VkVideoCapabilitiesKHR::
flags
包括VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR
或VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR
,则maxQuantizationMapExtent
的width
和height
成员必须大于零。 - 7
-
如果 VkVideoCapabilitiesKHR::
flags
包含VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR
,那么maxQIndexDelta
必须大于minQIndexDelta
。