• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2021-2024 The Khronos Group Inc.
2//
3// SPDX-License-Identifier: CC-BY-4.0
4
5= VK_KHR_video_decode_h265
6:toc: left
7:refpage: https://registry.khronos.org/vulkan/specs/1.2-extensions/man/html/
8:sectnums:
9
10This document outlines a proposal to enable performing H.265/HEVC video decode operations in Vulkan.
11
12== Problem Statement
13
14The `VK_KHR_video_queue` extension introduces support for video coding operations and the `VK_KHR_video_decode_queue` extension further extends this with APIs specific to video decoding.
15
16The goal of this proposal is to build upon this infrastructure to introduce support for decoding elementary video stream sequences compliant with the H.265/HEVC video compression standard.
17
18
19== Solution Space
20
21As the `VK_KHR_video_queue` and `VK_KHR_video_decode_queue` extensions already laid down the architecture for how codec-specific video decode extensions need to be designed, this extension only needs to define the APIs to provide the necessary codec-specific parameters at various points during the use of the codec-independent APIs. In particular:
22
23  * APIs allowing to specify H.265 video, sequence, and picture parameter sets (VPS, SPS, PPS) to be stored in video session parameters objects
24  * APIs allowing to specify H.265 information specific to the decoded picture, including references to previously stored VPS, SPS, and PPS entries
25  * APIs allowing to specify H.265 reference picture information specific to the active reference pictures and optional reconstructed picture used in video decode operations
26
27The following options have been considered to choose the structure of these definitions:
28
29  1. Allow specifying packed codec-specific data to the APIs in the form they appear in bitstreams
30  2. Specify codec-specific parameters through custom type definitions that the application can populate after parsing the corresponding data elements in the bitstreams
31
32Option (1) would allow for a simpler API, but it requires implementations to include an appropriate parser for these data elements. As decoding applications typically parse these data elements for other reasons anyway, this proposal choses option (2) to enable the application to provide the needed parameters through custom definitions provided by a video std header dedicated to H.265 video decoding.
33
34The following additional options have been considered to choose the way this video std header is defined:
35
36  1. Include all definitions in this H.265 video decode std header
37  2. Add a separate video std header that includes H.265 parameter definitions that can be shared across video decoding and video encoding use cases that the H.265 video decode std header depends on, and only include decode-specific definitions in the H.265 video decode std header
38
39Both options are reasonable, however, as the H.265 video decoding and H.265 video encoding functionalities were designed in parallel, this extension uses option (2) and introduces the following new video std headers:
40
41  * `vulkan_video_codec_h265std` - containing common definitions for all H.265 video coding operations
42  * `vulkan_video_codec_h265std_decode` - containing definitions specific to H.265 video decoding operations
43
44These headers can be included as follows:
45
46[source,c]
47----
48#include <vk_video/vulkan_video_codec_h265std.h>
49#include <vk_video/vulkan_video_codec_h265std_decode.h>
50----
51
52
53== Proposal
54
55=== Video Std Headers
56
57This extension uses the new `vulkan_video_codec_h265std_decode` video std header. Implementations must always support at least version 1.0.0 of this video std header.
58
59
60=== H.265 Decode Profiles
61
62This extension introduces the new video codec operation `VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR`. This flag can be used to check whether a particular queue family supports decoding H.265/HEVC content, as returned in `VkQueueFamilyVideoPropertiesKHR`.
63
64An H.265 decode profile can be defined through a `VkVideoProfileInfoKHR` structure using this new video codec operation and by including the following new codec-specific profile information structure in the `pNext` chain:
65
66[source,c]
67----
68typedef struct VkVideoDecodeH265ProfileInfoKHR {
69    VkStructureType           sType;
70    const void*               pNext;
71    StdVideoH265ProfileIdc    stdProfileIdc;
72} VkVideoDecodeH265ProfileInfoKHR;
73----
74
75`stdProfileIdc` specifies the H.265 profile indicator.
76
77
78=== H.265 Decode Capabilities
79
80Applications need to include the following new structure in the `pNext` chain of `VkVideoCapabilitiesKHR` when calling the `vkGetPhysicalDeviceVideoCapabilitiesKHR` command to retrieve the capabilities specific to H.265 video decoding:
81
82[source,c]
83----
84typedef struct VkVideoDecodeH265CapabilitiesKHR {
85    VkStructureType         sType;
86    void*                   pNext;
87    StdVideoH265LevelIdc    maxLevelIdc;
88} VkVideoDecodeH265CapabilitiesKHR;
89----
90
91`maxLevelIdc` indicates the maximum supported H.265 level indicator.
92
93
94=== H.265 Decode Parameter Sets
95
96The use of video session parameters objects is mandatory when decoding H.265 video streams. Applications need to include the following new structure in the `pNext` chain of `VkVideoSessionParametersCreateInfoKHR` when creating video session parameters objects for H.265 decode use, to specify the parameter set capacity of the created objects:
97
98[source,c]
99----
100typedef struct VkVideoDecodeH265SessionParametersCreateInfoKHR {
101    VkStructureType                                        sType;
102    const void*                                            pNext;
103    uint32_t                                               maxStdVPSCount;
104    uint32_t                                               maxStdSPSCount;
105    uint32_t                                               maxStdPPSCount;
106    const VkVideoDecodeH265SessionParametersAddInfoKHR*    pParametersAddInfo;
107} VkVideoDecodeH265SessionParametersCreateInfoKHR;
108----
109
110The optional `pParametersAddInfo` member also allows specifying an initial set of parameter sets to add to the created object:
111
112[source,c]
113----
114typedef struct VkVideoDecodeH265SessionParametersAddInfoKHR {
115    VkStructureType                            sType;
116    const void*                                pNext;
117    uint32_t                                   stdVPSCount;
118    const StdVideoH265VideoParameterSet*       pStdVPSs;
119    uint32_t                                   stdSPSCount;
120    const StdVideoH265SequenceParameterSet*    pStdSPSs;
121    uint32_t                                   stdPPSCount;
122    const StdVideoH265PictureParameterSet*     pStdPPSs;
123} VkVideoDecodeH265SessionParametersAddInfoKHR;
124----
125
126This structure can also be included in the `pNext` chain of `VkVideoSessionParametersUpdateInfoKHR` used in video session parameters update operations to add further parameter sets to an object after its creation.
127
128Individual parameter sets are stored using parameter set IDs as their keys, specifically:
129
130  * H.265 VPS entries are identified using a `vps_video_parameter_set_id` value
131  * H.265 SPS entries are identified using a pair of `sps_video_parameter_set_id` and `sps_seq_parameter_set_id` values
132  * H.265 PPS entries are identified using a triplet of `sps_video_parameter_set_id`, `pps_seq_parameter_set_id`, and `pps_pic_parameter_set_id` values
133
134Please note the inclusion of the VPS ID in the PPS key. This is needed because a PPS is not uniquely identified by its ID and the ID of the parent SPS, as multiple SPS entries may exist with the same ID that have different parent VPS IDs. In order to ensure the uniqueness of keys, all APIs referring to a PPS in this proposal also take the parent VPS ID of the SPS the PPS in question belongs to, to specify the full hierarchy of IDs.
135
136The H.265/HEVC video compression standard always requires a VPS, SPS, and PPS, hence the application has to add an instance of each parameter set to the used parameters object before being able to record video decode operations.
137
138Furthermore, the H.265/HEVC video compression standard also allows modifying existing parameter sets, but as parameters already stored in video session parameters objects cannot be changed in Vulkan, the application has to create new parameters objects in such cases, as described in the proposal for `VK_KHR_video_queue`.
139
140
141=== H.265 Decoding Parameters
142
143Decode parameters specific to H.265 need to be provided by the application through the `pNext` chain of `VkVideoDecodeInfoKHR`, using the following new structure:
144
145[source,c]
146----
147typedef struct VkVideoDecodeH265PictureInfoKHR {
148    VkStructureType                         sType;
149    const void*                             pNext;
150    const StdVideoDecodeH265PictureInfo*    pStdPictureInfo;
151    uint32_t                                sliceSegmentCount;
152    const uint32_t*                         pSliceSegmentOffsets;
153} VkVideoDecodeH265PictureInfoKHR;
154----
155
156`pStdPictureInfo` points to the codec-specific decode parameters defined in the `vulkan_video_codec_h265std_decode` video std header, while the `pSliceSegmentOffsets` array contains the relative offset of individual slice segments of the picture within the video bitstream range used by the video decode operation.
157
158The active VPS, SPS, and PPS (sourced from the bound video session parameters object) are identified by the `sps_video_parameter_set_id`, `pps_seq_parameter_set_id`, and `pps_pic_parameter_set_id` parameters.
159
160Picture information specific to H.265 for the active reference pictures and the optional reconstructed picture need to be provided by the application through the `pNext` chain of corresponding elements of `VkVideoDecodeInfoKHR::pReferenceSlots` and the `pNext` chain of `VkVideoDecodeInfoKHR::pSetupReferenceSlot`, respectively, using the following new structure:
161
162[source,c]
163----
164typedef struct VkVideoDecodeH265DpbSlotInfoKHR {
165    VkStructureType                           sType;
166    const void*                               pNext;
167    const StdVideoDecodeH265ReferenceInfo*    pStdReferenceInfo;
168} VkVideoDecodeH265DpbSlotInfoKHR;
169----
170
171`pStdReferenceInfo` points to the codec-specific reference picture parameters defined in the `vulkan_video_codec_h265std_decode` video std header.
172
173It is the application's responsibility to specify video bitstream buffer data and codec-specific parameters that are compliant to the rules defined by the H.265/HEVC video compression standard. While it is not illegal, from the API usage's point of view, to specify non-compliant inputs, they may cause the video decode operation to complete unsuccessfully and will cause the output pictures (decode output and reconstructed pictures) to have undefined contents after the execution of the operation.
174
175For more information about how to parse individual H.265 bitstream syntax elements, calculate derived values, and, in general, how to interpret these parameters, please refer to the corresponding sections of the https://www.itu.int/rec/T-REC-H.265-202108-S/[ITU-T H.265 Specification].
176
177
178== Examples
179
180=== Select queue family with H.265 decode support
181
182[source,c]
183----
184uint32_t queueFamilyIndex;
185uint32_t queueFamilyCount;
186
187vkGetPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyCount, NULL);
188
189VkQueueFamilyProperties2* props = calloc(queueFamilyCount,
190    sizeof(VkQueueFamilyProperties2));
191VkQueueFamilyVideoPropertiesKHR* videoProps = calloc(queueFamilyCount,
192    sizeof(VkQueueFamilyVideoPropertiesKHR));
193
194for (queueFamilyIndex = 0; queueFamilyIndex < queueFamilyCount; ++queueFamilyIndex) {
195    props[queueFamilyIndex].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
196    props[queueFamilyIndex].pNext = &videoProps[queueFamilyIndex];
197
198    videoProps[queueFamilyIndex].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR;
199}
200
201vkGetPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyCount, props);
202
203for (queueFamilyIndex = 0; queueFamilyIndex < queueFamilyCount; ++queueFamilyIndex) {
204    if ((props[queueFamilyIndex].queueFamilyProperties.queueFlags & VK_QUEUE_VIDEO_DECODE_BIT_KHR) != 0 &&
205        (videoProps[queueFamilyIndex].videoCodecOperations & VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR) != 0) {
206        break;
207    }
208}
209
210if (queueFamilyIndex < queueFamilyCount) {
211    // Found appropriate queue family
212    ...
213} else {
214    // Did not find a queue family with the needed capabilities
215    ...
216}
217----
218
219
220=== Check support and query the capabilities for an H.265 decode profile
221
222[source,c]
223----
224VkResult result;
225
226VkVideoDecodeH265ProfileInfoKHR decodeH265ProfileInfo = {
227    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR,
228    .pNext = NULL,
229    .stdProfileIdc = STD_VIDEO_H265_PROFILE_IDC_MAIN
230};
231
232VkVideoProfileInfoKHR profileInfo = {
233    .sType = VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR,
234    .pNext = &decodeH265ProfileInfo,
235    .videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR,
236    .chromaSubsampling = VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR,
237    .lumaBitDepth = VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,
238    .chromaBitDepth = VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR
239};
240
241VkVideoDecodeH265CapabilitiesKHR decodeH265Capabilities = {
242    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR,
243    .pNext = NULL,
244};
245
246VkVideoDecodeCapabilitiesKHR decodeCapabilities = {
247    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR,
248    .pNext = &decodeH265Capabilities
249}
250
251VkVideoCapabilitiesKHR capabilities = {
252    .sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR,
253    .pNext = &decodeCapabilities
254};
255
256result = vkGetPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, &profileInfo, &capabilities);
257
258if (result == VK_SUCCESS) {
259    // Profile is supported, check additional capabilities
260    ...
261} else {
262    // Profile is not supported, result provides additional information about why
263    ...
264}
265----
266
267=== Create and update H.265 video session parameters objects
268
269[source,c]
270----
271VkVideoSessionParametersKHR videoSessionParams = VK_NULL_HANDLE;
272
273VkVideoDecodeH265SessionParametersCreateInfoKHR decodeH265CreateInfo = {
274    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR,
275    .pNext = NULL,
276    .maxStdVPSCount = ... // VPS capacity
277    .maxStdSPSCount = ... // SPS capacity
278    .maxStdPPSCount = ... // PPS capacity
279    .pParametersAddInfo = ... // parameters to add at creation time or NULL
280};
281
282VkVideoSessionParametersCreateInfoKHR createInfo = {
283    .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
284    .pNext = &decodeH265CreateInfo,
285    .flags = 0,
286    .videoSessionParametersTemplate = ... // template to use or VK_NULL_HANDLE
287    .videoSession = videoSession
288};
289
290vkCreateVideoSessionParametersKHR(device, &createInfo, NULL, &videoSessionParams);
291
292...
293
294StdVideoH265VideoParameterSet vps = {};
295// parse and populate VPS parameters
296...
297
298StdVideoH265SequenceParameterSet sps = {};
299// parse and populate SPS parameters
300...
301
302StdVideoH265PictureParameterSet pps = {};
303// parse and populate PPS parameters
304...
305
306VkVideoDecodeH265SessionParametersAddInfoKHR decodeH265AddInfo = {
307    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR,
308    .pNext = NULL,
309    .stdVPSCount = 1,
310    .pStdVPSs = &vps,
311    .stdSPSCount = 1,
312    .pStdSPSs = &sps,
313    .stdPPSCount = 1,
314    .pStdPPSs = &pps
315};
316
317VkVideoSessionParametersUpdateInfoKHR updateInfo = {
318    .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR,
319    .pNext = &decodeH265AddInfo,
320    .updateSequenceCount = 1 // incremented for each subsequent update
321};
322
323vkUpdateVideoSessionParametersKHR(device, &videoSessionParams, &updateInfo);
324----
325
326
327=== Record H.265 decode operation (video session without DPB slots)
328
329[source,c]
330----
331vkCmdBeginVideoCodingKHR(commandBuffer, ...);
332
333StdVideoDecodeH265PictureInfo stdPictureInfo = {};
334// parse and populate picture info from slice segment header data
335...
336
337VkVideoDecodeH265PictureInfoKHR decodeH265PictureInfo = {
338    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR,
339    .pNext = NULL,
340    .pStdPictureInfo = &stdPictureInfo,
341    .sliceSegmentCount = ... // number of slice segments
342    .pSliceSegmentOffsets = ... // array of slice segment offsets relative to the bitstream buffer range
343};
344
345VkVideoDecodeInfoKHR decodeInfo = {
346    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR,
347    .pNext = &decodeH265PictureInfo,
348    ...
349    // reconstructed picture is not needed if video session was created without DPB slots
350    .pSetupReferenceSlot = NULL,
351    .referenceSlotCount = 0,
352    .pReferenceSlots = NULL
353};
354
355vkCmdDecodeVideoKHR(commandBuffer, &decodeInfo);
356
357vkCmdEndVideoCodingKHR(commandBuffer, ...);
358----
359
360
361=== Record H.265 decode operation with optional reference picture setup
362
363[source,c]
364----
365vkCmdBeginVideoCodingKHR(commandBuffer, ...);
366
367StdVideoDecodeH265ReferenceInfo stdReferenceInfo = {};
368// parse and populate reconstructed reference picture info from slice segment header data
369...
370
371VkVideoDecodeH265DpbSlotInfoKHR decodeH265DpbSlotInfo = {
372    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR,
373    .pNext = NULL,
374    .pStdReferenceInfo = &stdReferenceInfo
375};
376
377VkVideoReferenceSlotInfoKHR setupSlotInfo = {
378    .sType = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR,
379    .pNext = &decodeH265DpbSlotInfo
380    ...
381};
382
383
384StdVideoDecodeH265PictureInfo stdPictureInfo = {};
385// parse and populate picture info from frame header data
386...
387if (stdPictureInfo.flags.IsReference) {
388    // reconstructed picture will be used for reference picture setup and DPB slot activation
389} else {
390    // reconstructed picture and slot may only be used by implementations as transient resource
391}
392
393VkVideoDecodeH265PictureInfoKHR decodeH265PictureInfo = {
394    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR,
395    .pNext = NULL,
396    .pStdPictureInfo = &stdPictureInfo,
397    .sliceSegmentCount = ... // number of slice segments
398    .pSliceSegmentOffsets = ... // array of slice segment offsets relative to the bitstream buffer range
399};
400
401VkVideoDecodeInfoKHR decodeInfo = {
402    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR,
403    .pNext = &decodeH265PictureInfo,
404    ...
405    .pSetupReferenceSlot = &setupSlotInfo,
406    ...
407};
408
409vkCmdDecodeVideoKHR(commandBuffer, &decodeInfo);
410
411vkCmdEndVideoCodingKHR(commandBuffer, ...);
412----
413
414
415=== Record H.265 decode operation with reference picture list
416
417[source,c]
418----
419vkCmdBeginVideoCodingKHR(commandBuffer, ...);
420
421StdVideoDecodeH265ReferenceInfo stdReferenceInfo[] = {};
422// populate reference picture info for each active reference picture
423...
424
425VkVideoDecodeH265DpbSlotInfoKHR decodeH265DpbSlotInfo[] = {
426    {
427        .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR,
428        .pNext = NULL,
429        .pStdReferenceInfo = &stdReferenceInfo[0]
430    },
431    {
432        .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR,
433        .pNext = NULL,
434        .pStdReferenceInfo = &stdReferenceInfo[1]
435    },
436    ...
437};
438
439
440VkVideoReferenceSlotInfoKHR referenceSlotInfo[] = {
441    {
442        .sType = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR,
443        .pNext = &decodeH265DpbSlotInfo[0],
444        ...
445    },
446    {
447        .sType = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR,
448        .pNext = &decodeH265DpbSlotInfo[1],
449        ...
450    },
451    ...
452};
453
454
455StdVideoDecodeH265PictureInfo stdPictureInfo = {};
456// parse and populate picture info from frame header data
457...
458if (stdPictureInfo.flags.IsReference) {
459    // reconstructed picture will be used for reference picture setup and DPB slot activation
460} else {
461    // reconstructed picture and slot may only be used by implementations as transient resource
462}
463
464VkVideoDecodeH265PictureInfoKHR decodeH265PictureInfo = {
465    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR,
466    .pNext = NULL,
467    .pStdPictureInfo = &stdPictureInfo,
468    .sliceSegmentCount = ... // number of slice segments
469    .pSliceSegmentOffsets = ... // array of slice segment offsets relative to the bitstream buffer range
470};
471
472VkVideoDecodeInfoKHR decodeInfo = {
473    .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR,
474    .pNext = &decodeH265PictureInfo,
475    ...
476    .referenceSlotCount = sizeof(referenceSlotInfo) / sizeof(referenceSlotInfo[0]),
477    .pReferenceSlots = &referenceSlotInfo[0]
478};
479
480vkCmdDecodeVideoKHR(commandBuffer, &decodeInfo);
481
482vkCmdEndVideoCodingKHR(commandBuffer, ...);
483----
484
485
486== Issues
487
488=== RESOLVED: In what form should codec-specific parameters be provided?
489
490In the form of structures defined by the `vulkan_video_codec_h265std_decode` and `vulkan_video_codec_h265std` video std headers. Applications are responsible to parse parameter sets and slice segment header data and use the parsed data to populate the structures defined by the video std headers. It is also the application's responsibility to maintain and manage these data structures, as needed, to be able to provide them as inputs to video decode operations where needed.
491
492
493=== RESOLVED: Why the `vulkan_video_codec_h265std` video std header does not have a version number?
494
495The `vulkan_video_codec_h265std` video std header was introduced to share common definitions used in both H.265/HEVC video decoding and video encoding, as the two functionalities were designed in parallel. However, as no video coding extension uses this video std header directly, only as a dependency of the video std header specific to the particular video coding operation, no separate versioning scheme was deemed necessary.
496
497
498=== RESOLVED: What are the requirements for the codec-specific input parameters and bitstream data?
499
500It is legal from an API usage perspective for the application to provide any values for the codec-specific input parameters (parameter sets, picture information, etc.) or video bitstream data. However, if the input data does not conform to the requirements of the H.265/HEVC video compression standard, then video decode operations may complete unsuccessfully and, in general, the outputs produced by the video decode operation will have undefined contents.
501
502
503=== RESOLVED: How should PPS entries be identified?
504
505The H.265 picture parameter set syntax only includes the PPS ID (`pps_pic_parameter_set_id`) and the parent SPS ID (`pps_seq_parameter_set_id`). However, the SPS IDs are not globally unique, as multiple sequence parameter sets can have the same ID as long as they have different parent VPS IDs.
506
507In order to be able to uniquely identify (and thus key) parameter sets, the video std header structures providing the contents of a PPS to store in a video session parameters objects, and the parameters indicating the active PPS to use in a video decode operation both include an additional `sps_video_parameter_set_id` member that is not part of the PPS syntax nor the slice segment header syntax, but enable the implementation to uniquely identify PPS entries stored and referenced in a video session parameters object.
508
509
510=== RESOLVED: Why is there a need for the application to specify the offset of individual slice segments of the decoded pictures?
511
512Implementations can take advantage of having access to the offsets of individual slice segments within the video bitstream buffer range provided to the video decode operations, hence this extension requires the application provide these offsets as input.
513
514
515=== RESOLVED: Is H.265 Multiview content supported?
516
517Not as part of this extension, but future extensions can add support for that.
518
519
520=== RESOLVED: Is the worst case size of all input structures for H.265 VPS and SPS entries prohibitively large for embedded devices?
521
522While the maximum possible size of all input structures for H.265 VPS and SPS entries may be quite large, in practice they are not expected to be all specified as most content will not need them. Nested arrays are usually specified through pointers to arrays in the video std headers which enable applications to only specify the elements required by the content at hand.
523
524It is thus not recommended for applications to statically allocate for the worst case size of H.265 VPS and SPS entries. As these are out-of-band data entries anyway, applications should prefer to dynamically allocate sufficient space if atypical content may require larger input data entries.
525
526
527=== RESOLVED: Why are H.265 level indicator values specified differently than the way they are defined in the codec specification?
528
529For historical reasons, the `StdVideoH265Level` type is defined with ordinal enum constant values, which does not match the decimal encoding used by the H.265/HEVC video compression standard specification. All APIs defined by this extension and the used video std headers accept and report H.265 levels using the enum constants `STD_VIDEO_H265_LEVEL_<major>.<minor>`, not the decimal encoding used within raw H.265/HEVC bitstreams.
530
531
532=== RESOLVED: How is reference picture setup requested for H.265 decode operations?
533
534As specifying a reconstructed picture DPB slot and resource is always required per the latest revision of the video extensions, additional codec syntax controls whether reference picture setup is requested and, in response, the DPB slot is activated with the reconstructed picture.
535
536For H.265 decode, reference picture setup is requested and the DPB slot specified for the reconstructed picture is activated with the picture if and only if the `StdVideoDecodeH265PictureInfo::flags.IsReference` flag is set.
537
538
539== Further Functionality
540
541Future extensions can further extend the capabilities provided here, e.g. exposing support to decode H.265 Multiview content.
542