• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ** Copyright (c) 2019-2021 The Khronos Group Inc.
3 **
4 ** SPDX-License-Identifier: Apache-2.0
5 */
6 
7 #ifndef VULKAN_VIDEO_CODEC_H264STD_H_
8 #define VULKAN_VIDEO_CODEC_H264STD_H_ 1
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 #include "vk_video/vulkan_video_codecs_common.h"
15 
16 // Vulkan 0.9 provisional Vulkan video H.264 encode and decode std specification version number
17 #define VK_STD_VULKAN_VIDEO_CODEC_H264_API_VERSION_0_9_5 VK_MAKE_VIDEO_STD_VERSION(0, 9, 5) // Patch version should always be set to 0
18 
19 // Format must be in the form XX.XX where the first two digits are the major and the second two, the minor.
20 #define VK_STD_VULKAN_VIDEO_CODEC_H264_SPEC_VERSION   VK_STD_VULKAN_VIDEO_CODEC_H264_API_VERSION_0_9_5
21 #define VK_STD_VULKAN_VIDEO_CODEC_H264_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264"
22 
23 // *************************************************
24 // Video H.264 common definitions:
25 // *************************************************
26 
27 #define STD_VIDEO_H264_CPB_CNT_LIST_SIZE 32
28 #define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS 6
29 #define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS 16
30 #define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS 2
31 #define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS 64
32 
33 typedef enum StdVideoH264ChromaFormatIdc {
34     STD_VIDEO_H264_CHROMA_FORMAT_IDC_MONOCHROME  = 0,
35     STD_VIDEO_H264_CHROMA_FORMAT_IDC_420         = 1,
36     STD_VIDEO_H264_CHROMA_FORMAT_IDC_422         = 2,
37     STD_VIDEO_H264_CHROMA_FORMAT_IDC_444         = 3,
38     STD_VIDEO_H264_CHROMA_FORMAT_IDC_INVALID     = 0x7FFFFFFF
39 } StdVideoH264ChromaFormatIdc;
40 
41 typedef enum StdVideoH264ProfileIdc {
42     STD_VIDEO_H264_PROFILE_IDC_BASELINE             = 66, /* Only constrained baseline is supported */
43     STD_VIDEO_H264_PROFILE_IDC_MAIN                 = 77,
44     STD_VIDEO_H264_PROFILE_IDC_HIGH                 = 100,
45     STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE  = 244,
46     STD_VIDEO_H264_PROFILE_IDC_INVALID              = 0x7FFFFFFF
47 } StdVideoH264ProfileIdc;
48 
49 typedef enum StdVideoH264Level {
50     STD_VIDEO_H264_LEVEL_1_0 = 0,
51     STD_VIDEO_H264_LEVEL_1_1 = 1,
52     STD_VIDEO_H264_LEVEL_1_2 = 2,
53     STD_VIDEO_H264_LEVEL_1_3 = 3,
54     STD_VIDEO_H264_LEVEL_2_0 = 4,
55     STD_VIDEO_H264_LEVEL_2_1 = 5,
56     STD_VIDEO_H264_LEVEL_2_2 = 6,
57     STD_VIDEO_H264_LEVEL_3_0 = 7,
58     STD_VIDEO_H264_LEVEL_3_1 = 8,
59     STD_VIDEO_H264_LEVEL_3_2 = 9,
60     STD_VIDEO_H264_LEVEL_4_0 = 10,
61     STD_VIDEO_H264_LEVEL_4_1 = 11,
62     STD_VIDEO_H264_LEVEL_4_2 = 12,
63     STD_VIDEO_H264_LEVEL_5_0 = 13,
64     STD_VIDEO_H264_LEVEL_5_1 = 14,
65     STD_VIDEO_H264_LEVEL_5_2 = 15,
66     STD_VIDEO_H264_LEVEL_6_0 = 16,
67     STD_VIDEO_H264_LEVEL_6_1 = 17,
68     STD_VIDEO_H264_LEVEL_6_2 = 18,
69     STD_VIDEO_H264_LEVEL_INVALID = 0x7FFFFFFF
70 } StdVideoH264Level;
71 
72 typedef enum StdVideoH264PocType {
73     STD_VIDEO_H264_POC_TYPE_0 = 0,
74     STD_VIDEO_H264_POC_TYPE_1 = 1,
75     STD_VIDEO_H264_POC_TYPE_2 = 2,
76     STD_VIDEO_H264_POC_TYPE_INVALID = 0x7FFFFFFF
77 } StdVideoH264PocType;
78 
79 typedef enum StdVideoH264AspectRatioIdc {
80     STD_VIDEO_H264_ASPECT_RATIO_IDC_UNSPECIFIED = 0,
81     STD_VIDEO_H264_ASPECT_RATIO_IDC_SQUARE = 1,
82     STD_VIDEO_H264_ASPECT_RATIO_IDC_12_11 = 2,
83     STD_VIDEO_H264_ASPECT_RATIO_IDC_10_11 = 3,
84     STD_VIDEO_H264_ASPECT_RATIO_IDC_16_11 = 4,
85     STD_VIDEO_H264_ASPECT_RATIO_IDC_40_33 = 5,
86     STD_VIDEO_H264_ASPECT_RATIO_IDC_24_11 = 6,
87     STD_VIDEO_H264_ASPECT_RATIO_IDC_20_11 = 7,
88     STD_VIDEO_H264_ASPECT_RATIO_IDC_32_11 = 8,
89     STD_VIDEO_H264_ASPECT_RATIO_IDC_80_33 = 9,
90     STD_VIDEO_H264_ASPECT_RATIO_IDC_18_11 = 10,
91     STD_VIDEO_H264_ASPECT_RATIO_IDC_15_11 = 11,
92     STD_VIDEO_H264_ASPECT_RATIO_IDC_64_33 = 12,
93     STD_VIDEO_H264_ASPECT_RATIO_IDC_160_99 = 13,
94     STD_VIDEO_H264_ASPECT_RATIO_IDC_4_3 = 14,
95     STD_VIDEO_H264_ASPECT_RATIO_IDC_3_2 = 15,
96     STD_VIDEO_H264_ASPECT_RATIO_IDC_2_1 = 16,
97     STD_VIDEO_H264_ASPECT_RATIO_IDC_EXTENDED_SAR = 255,
98     STD_VIDEO_H264_ASPECT_RATIO_IDC_INVALID = 0x7FFFFFFF
99 } StdVideoH264AspectRatioIdc;
100 
101 typedef enum StdVideoH264WeightedBipredIdc {
102     STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_DEFAULT  = 0,
103     STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_EXPLICIT = 1,
104     STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_IMPLICIT = 2,
105     STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_INVALID = 0x7FFFFFFF
106 } StdVideoH264WeightedBipredIdc;
107 
108 typedef enum StdVideoH264ModificationOfPicNumsIdc {
109     STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_SUBTRACT = 0,
110     STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_ADD = 1,
111     STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_LONG_TERM = 2,
112     STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_END = 3,
113     STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_INVALID = 0x7FFFFFFF
114 } StdVideoH264ModificationOfPicNumsIdc;
115 
116 typedef enum StdVideoH264MemMgmtControlOp {
117     STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_END = 0,
118     STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_SHORT_TERM = 1,
119     STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_LONG_TERM = 2,
120     STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_LONG_TERM = 3,
121     STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_SET_MAX_LONG_TERM_INDEX = 4,
122     STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_ALL = 5,
123     STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_CURRENT_AS_LONG_TERM = 6,
124     STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_INVALID = 0x7FFFFFFF
125 } StdVideoH264MemMgmtControlOp;
126 
127 typedef enum StdVideoH264CabacInitIdc {
128     STD_VIDEO_H264_CABAC_INIT_IDC_0 = 0,
129     STD_VIDEO_H264_CABAC_INIT_IDC_1 = 1,
130     STD_VIDEO_H264_CABAC_INIT_IDC_2 = 2,
131     STD_VIDEO_H264_CABAC_INIT_IDC_INVALID = 0x7FFFFFFF
132 } StdVideoH264CabacInitIdc;
133 
134 typedef enum StdVideoH264DisableDeblockingFilterIdc {
135     STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_DISABLED = 0,
136     STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_ENABLED = 1,
137     STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_PARTIAL = 2,
138     STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_INVALID = 0x7FFFFFFF
139 } StdVideoH264DisableDeblockingFilterIdc;
140 
141 typedef enum StdVideoH264SliceType {
142     STD_VIDEO_H264_SLICE_TYPE_P  = 0,
143     STD_VIDEO_H264_SLICE_TYPE_B  = 1,
144     STD_VIDEO_H264_SLICE_TYPE_I  = 2,
145     // reserved STD_VIDEO_H264_SLICE_TYPE_SP = 3,
146     // reserved STD_VIDEO_H264_SLICE_TYPE_SI = 4,
147     STD_VIDEO_H264_SLICE_TYPE_INVALID = 0x7FFFFFFF
148 } StdVideoH264SliceType;
149 
150 typedef enum StdVideoH264PictureType {
151     STD_VIDEO_H264_PICTURE_TYPE_P   = 0,
152     STD_VIDEO_H264_PICTURE_TYPE_B   = 1,
153     STD_VIDEO_H264_PICTURE_TYPE_I   = 2,
154     // reserved STD_VIDEO_H264_PICTURE_TYPE_SP  = 3,
155     // reserved STD_VIDEO_H264_PICTURE_TYPE_SI  = 4,
156     STD_VIDEO_H264_PICTURE_TYPE_IDR = 5,
157     STD_VIDEO_H264_PICTURE_TYPE_INVALID = 0x7FFFFFFF
158 } StdVideoH264PictureType;
159 
160 typedef enum StdVideoH264NonVclNaluType {
161     STD_VIDEO_H264_NON_VCL_NALU_TYPE_SPS = 0,
162     STD_VIDEO_H264_NON_VCL_NALU_TYPE_PPS = 1,
163     STD_VIDEO_H264_NON_VCL_NALU_TYPE_AUD = 2,
164     STD_VIDEO_H264_NON_VCL_NALU_TYPE_PREFIX = 3,
165     STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_SEQUENCE = 4,
166     STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_STREAM = 5,
167     STD_VIDEO_H264_NON_VCL_NALU_TYPE_PRECODED = 6,
168     STD_VIDEO_H264_NON_VCL_NALU_TYPE_INVALID = 0x7FFFFFFF
169 } StdVideoH264NonVclNaluType;
170 
171 typedef struct StdVideoH264SpsVuiFlags {
172     uint32_t aspect_ratio_info_present_flag : 1;
173     uint32_t overscan_info_present_flag : 1;
174     uint32_t overscan_appropriate_flag : 1;
175     uint32_t video_signal_type_present_flag : 1;
176     uint32_t video_full_range_flag : 1;
177     uint32_t color_description_present_flag : 1;
178     uint32_t chroma_loc_info_present_flag : 1;
179     uint32_t timing_info_present_flag : 1;
180     uint32_t fixed_frame_rate_flag : 1;
181     uint32_t bitstream_restriction_flag : 1;
182     uint32_t nal_hrd_parameters_present_flag : 1;
183     uint32_t vcl_hrd_parameters_present_flag : 1;
184 } StdVideoH264SpsVuiFlags;
185 
186 typedef struct StdVideoH264HrdParameters { // hrd_parameters
187     uint8_t                    cpb_cnt_minus1;
188     uint8_t                    bit_rate_scale;
189     uint8_t                    cpb_size_scale;
190     uint32_t                   bit_rate_value_minus1[STD_VIDEO_H264_CPB_CNT_LIST_SIZE]; // cpb_cnt_minus1 number of valid elements
191     uint32_t                   cpb_size_value_minus1[STD_VIDEO_H264_CPB_CNT_LIST_SIZE]; // cpb_cnt_minus1 number of valid elements
192     uint8_t                    cbr_flag[STD_VIDEO_H264_CPB_CNT_LIST_SIZE];              // cpb_cnt_minus1 number of valid elements
193     uint32_t                   initial_cpb_removal_delay_length_minus1;
194     uint32_t                   cpb_removal_delay_length_minus1;
195     uint32_t                   dpb_output_delay_length_minus1;
196     uint32_t                   time_offset_length;
197 } StdVideoH264HrdParameters;
198 
199 typedef struct StdVideoH264SequenceParameterSetVui {
200     StdVideoH264AspectRatioIdc  aspect_ratio_idc;
201     uint16_t                    sar_width;
202     uint16_t                    sar_height;
203     uint8_t                     video_format;
204     uint8_t                     color_primaries;
205     uint8_t                     transfer_characteristics;
206     uint8_t                     matrix_coefficients;
207     uint32_t                    num_units_in_tick;
208     uint32_t                    time_scale;
209     StdVideoH264HrdParameters*  pHrdParameters;    // must be a valid ptr to hrd_parameters, if nal_hrd_parameters_present_flag or vcl_hrd_parameters_present_flag are set
210     uint8_t                     max_num_reorder_frames;
211     uint8_t                     max_dec_frame_buffering;
212     StdVideoH264SpsVuiFlags     flags;
213 } StdVideoH264SequenceParameterSetVui;
214 
215 typedef struct StdVideoH264SpsFlags {
216     uint32_t constraint_set0_flag : 1;
217     uint32_t constraint_set1_flag : 1;
218     uint32_t constraint_set2_flag : 1;
219     uint32_t constraint_set3_flag : 1;
220     uint32_t constraint_set4_flag : 1;
221     uint32_t constraint_set5_flag : 1;
222     uint32_t direct_8x8_inference_flag : 1;
223     uint32_t mb_adaptive_frame_field_flag : 1;
224     uint32_t frame_mbs_only_flag : 1;
225     uint32_t delta_pic_order_always_zero_flag : 1;
226     uint32_t separate_colour_plane_flag : 1;
227     uint32_t gaps_in_frame_num_value_allowed_flag : 1;
228     uint32_t qpprime_y_zero_transform_bypass_flag : 1;
229     uint32_t frame_cropping_flag : 1;
230     uint32_t seq_scaling_matrix_present_flag : 1;
231     uint32_t vui_parameters_present_flag : 1;
232 } StdVideoH264SpsFlags;
233 
234 typedef struct StdVideoH264ScalingLists
235 {
236     // scaling_list_present_mask has one bit for each
237     // seq_scaling_list_present_flag[i] for SPS OR
238     // pic_scaling_list_present_flag[i] for PPS,
239     // bit 0 - 5 are for each entry of ScalingList4x4
240     // bit 6 - 7 are for each entry plus 6 for ScalingList8x8
241     uint8_t scaling_list_present_mask;
242     // use_default_scaling_matrix_mask has one bit for each
243     // UseDefaultScalingMatrix4x4Flag[ i ] and
244     // UseDefaultScalingMatrix8x8Flag[ i - 6 ] for SPS OR PPS
245     // bit 0 - 5 are for each entry of ScalingList4x4
246     // bit 6 - 7 are for each entry plus 6 for ScalingList8x8
247     uint8_t use_default_scaling_matrix_mask;
248     uint8_t ScalingList4x4[STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS][STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS];
249     uint8_t ScalingList8x8[STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS][STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS];
250 } StdVideoH264ScalingLists;
251 
252 typedef struct StdVideoH264SequenceParameterSet
253 {
254     StdVideoH264ProfileIdc               profile_idc;
255     StdVideoH264Level                    level_idc;
256     uint8_t                              seq_parameter_set_id;
257     StdVideoH264ChromaFormatIdc          chroma_format_idc;
258     uint8_t                              bit_depth_luma_minus8;
259     uint8_t                              bit_depth_chroma_minus8;
260     uint8_t                              log2_max_frame_num_minus4;
261     StdVideoH264PocType                  pic_order_cnt_type;
262     uint8_t                              log2_max_pic_order_cnt_lsb_minus4;
263     int32_t                              offset_for_non_ref_pic;
264     int32_t                              offset_for_top_to_bottom_field;
265     uint8_t                              num_ref_frames_in_pic_order_cnt_cycle;
266     uint8_t                              max_num_ref_frames;
267     uint32_t                             pic_width_in_mbs_minus1;
268     uint32_t                             pic_height_in_map_units_minus1;
269     uint32_t                             frame_crop_left_offset;
270     uint32_t                             frame_crop_right_offset;
271     uint32_t                             frame_crop_top_offset;
272     uint32_t                             frame_crop_bottom_offset;
273     StdVideoH264SpsFlags                 flags;
274     // pOffsetForRefFrame is a pointer representing the offset_for_ref_frame array with num_ref_frames_in_pic_order_cnt_cycle number of elements
275     // If pOffsetForRefFrame has nullptr value, then num_ref_frames_in_pic_order_cnt_cycle must also be "0".
276     int32_t*                             pOffsetForRefFrame;
277     StdVideoH264ScalingLists*            pScalingLists;             // Must be a valid pointer if seq_scaling_matrix_present_flag is set
278     StdVideoH264SequenceParameterSetVui* pSequenceParameterSetVui;  // Must be a valid pointer if StdVideoH264SpsFlags:vui_parameters_present_flag is set
279 } StdVideoH264SequenceParameterSet;
280 
281 typedef struct StdVideoH264PpsFlags {
282     uint32_t transform_8x8_mode_flag : 1;
283     uint32_t redundant_pic_cnt_present_flag : 1;
284     uint32_t constrained_intra_pred_flag : 1;
285     uint32_t deblocking_filter_control_present_flag : 1;
286     uint32_t weighted_bipred_idc_flag : 1;
287     uint32_t weighted_pred_flag : 1;
288     uint32_t pic_order_present_flag : 1;
289     uint32_t entropy_coding_mode_flag : 1;
290     uint32_t pic_scaling_matrix_present_flag : 1;
291 } StdVideoH264PpsFlags;
292 
293 typedef struct StdVideoH264PictureParameterSet
294 {
295     uint8_t                       seq_parameter_set_id;
296     uint8_t                       pic_parameter_set_id;
297     uint8_t                       num_ref_idx_l0_default_active_minus1;
298     uint8_t                       num_ref_idx_l1_default_active_minus1;
299     StdVideoH264WeightedBipredIdc weighted_bipred_idc;
300     int8_t                        pic_init_qp_minus26;
301     int8_t                        pic_init_qs_minus26;
302     int8_t                        chroma_qp_index_offset;
303     int8_t                        second_chroma_qp_index_offset;
304     StdVideoH264PpsFlags          flags;
305     StdVideoH264ScalingLists*     pScalingLists; // Must be a valid pointer if  StdVideoH264PpsFlags::pic_scaling_matrix_present_flag is set.
306 } StdVideoH264PictureParameterSet;
307 
308 #ifdef __cplusplus
309 }
310 #endif
311 
312 #endif // VULKAN_VIDEO_CODEC_H264STD_H_
313