1 /*
2 * Copyright © Microsoft Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #include "d3d12_video_encoder_bitstream_builder_h264.h"
25
26 #include <cmath>
27 #include "util/u_video.h"
28
d3d12_video_bitstream_builder_h264(bool insert_aud_nalu)29 d3d12_video_bitstream_builder_h264::d3d12_video_bitstream_builder_h264(bool insert_aud_nalu)
30 : m_insert_aud_nalu(insert_aud_nalu)
31 { }
32
33 inline H264_SPEC_PROFILES
Convert12ToSpecH264Profiles(D3D12_VIDEO_ENCODER_PROFILE_H264 profile12)34 Convert12ToSpecH264Profiles(D3D12_VIDEO_ENCODER_PROFILE_H264 profile12)
35 {
36 switch (profile12) {
37 case D3D12_VIDEO_ENCODER_PROFILE_H264_MAIN:
38 {
39 return H264_PROFILE_MAIN;
40 } break;
41 case D3D12_VIDEO_ENCODER_PROFILE_H264_HIGH:
42 {
43 return H264_PROFILE_HIGH;
44 } break;
45 case D3D12_VIDEO_ENCODER_PROFILE_H264_HIGH_10:
46 {
47 return H264_PROFILE_HIGH10;
48 } break;
49 default:
50 {
51 unreachable("Unsupported D3D12_VIDEO_ENCODER_PROFILE_H264");
52 } break;
53 }
54 }
55
56 void
build_sps(const struct pipe_h264_enc_seq_param & seqData,const enum pipe_video_profile & profile,const D3D12_VIDEO_ENCODER_LEVELS_H264 & level,const DXGI_FORMAT & inputFmt,const D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264 & codecConfig,const D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_H264 & gopConfig,uint32_t seq_parameter_set_id,uint32_t max_num_ref_frames,D3D12_VIDEO_ENCODER_PICTURE_RESOLUTION_DESC sequenceTargetResolution,D3D12_BOX frame_cropping_codec_config,std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)57 d3d12_video_bitstream_builder_h264::build_sps(const struct pipe_h264_enc_seq_param & seqData,
58 const enum pipe_video_profile & profile,
59 const D3D12_VIDEO_ENCODER_LEVELS_H264 & level,
60 const DXGI_FORMAT & inputFmt,
61 const D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264 & codecConfig,
62 const D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_H264 &gopConfig,
63 uint32_t seq_parameter_set_id,
64 uint32_t max_num_ref_frames,
65 D3D12_VIDEO_ENCODER_PICTURE_RESOLUTION_DESC sequenceTargetResolution,
66 D3D12_BOX frame_cropping_codec_config,
67 std::vector<uint8_t> & headerBitstream,
68 std::vector<uint8_t>::iterator placingPositionStart,
69 size_t & writtenBytes)
70 {
71 H264_SPEC_PROFILES profile_idc = (H264_SPEC_PROFILES) u_get_h264_profile_idc(profile);
72 uint32_t level_idc = 0;
73 d3d12_video_encoder_convert_from_d3d12_level_h264(
74 level,
75 level_idc);
76
77 assert((inputFmt == DXGI_FORMAT_NV12) || (inputFmt == DXGI_FORMAT_P010));
78
79 // Assume NV12 YUV 420 8 bits
80 uint32_t bit_depth_luma_minus8 = 0;
81 uint32_t bit_depth_chroma_minus8 = 0;
82
83 // In case is 420 10 bits fix it
84 if (inputFmt == DXGI_FORMAT_P010) {
85 bit_depth_luma_minus8 = 2;
86 bit_depth_chroma_minus8 = 2;
87 }
88
89 // Calculate sequence resolution sizes in MBs
90 // Always in MBs since we don't support interlace in D3D12 Encode
91 uint32_t pic_width_in_mbs_minus1 = static_cast<uint32_t>(std::ceil(sequenceTargetResolution.Width / 16.0)) - 1;
92 uint32_t pic_height_in_map_units_minus1 =
93 static_cast<uint32_t>(std::ceil(sequenceTargetResolution.Height / 16.0)) - 1;
94
95 uint32_t frame_cropping_flag = 0;
96 if (frame_cropping_codec_config.left
97 || frame_cropping_codec_config.right
98 || frame_cropping_codec_config.top
99 || frame_cropping_codec_config.bottom
100 ) {
101 frame_cropping_flag = 1;
102 }
103
104 H264_SPS spsStructure = { static_cast<uint32_t>(profile_idc),
105 seqData.enc_constraint_set_flags,
106 level_idc,
107 seq_parameter_set_id,
108 bit_depth_luma_minus8,
109 bit_depth_chroma_minus8,
110 gopConfig.log2_max_frame_num_minus4,
111 gopConfig.pic_order_cnt_type,
112 gopConfig.log2_max_pic_order_cnt_lsb_minus4,
113 max_num_ref_frames,
114 0, // gaps_in_frame_num_value_allowed_flag
115 pic_width_in_mbs_minus1,
116 pic_height_in_map_units_minus1,
117 ((codecConfig.ConfigurationFlags &
118 D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_FLAG_USE_ADAPTIVE_8x8_TRANSFORM) != 0) ?
119 1u :
120 0u, // direct_8x8_inference_flag
121 frame_cropping_flag,
122 frame_cropping_codec_config.left,
123 frame_cropping_codec_config.right,
124 frame_cropping_codec_config.top,
125 frame_cropping_codec_config.bottom };
126
127 // Copy VUI params from seqData
128 spsStructure.vui_parameters_present_flag = seqData.vui_parameters_present_flag;
129 spsStructure.vui.aspect_ratio_info_present_flag = seqData.vui_flags.aspect_ratio_info_present_flag;
130 spsStructure.vui.timing_info_present_flag = seqData.vui_flags.timing_info_present_flag;
131 spsStructure.vui.video_signal_type_present_flag = seqData.vui_flags.video_signal_type_present_flag;
132 spsStructure.vui.colour_description_present_flag = seqData.vui_flags.colour_description_present_flag;
133 spsStructure.vui.chroma_loc_info_present_flag = seqData.vui_flags.chroma_loc_info_present_flag;
134 spsStructure.vui.overscan_info_present_flag = seqData.vui_flags.overscan_info_present_flag;
135 spsStructure.vui.overscan_appropriate_flag = seqData.vui_flags.overscan_appropriate_flag;
136 spsStructure.vui.fixed_frame_rate_flag = seqData.vui_flags.fixed_frame_rate_flag;
137 spsStructure.vui.nal_hrd_parameters_present_flag = seqData.vui_flags.nal_hrd_parameters_present_flag;
138 spsStructure.vui.vcl_hrd_parameters_present_flag = seqData.vui_flags.vcl_hrd_parameters_present_flag;
139 spsStructure.vui.low_delay_hrd_flag = seqData.vui_flags.low_delay_hrd_flag;
140 spsStructure.vui.pic_struct_present_flag = seqData.vui_flags.pic_struct_present_flag;
141 spsStructure.vui.bitstream_restriction_flag = seqData.vui_flags.bitstream_restriction_flag;
142 spsStructure.vui.motion_vectors_over_pic_boundaries_flag = seqData.vui_flags.motion_vectors_over_pic_boundaries_flag;
143 spsStructure.vui.aspect_ratio_idc = seqData.aspect_ratio_idc;
144 spsStructure.vui.sar_width = seqData.sar_width;
145 spsStructure.vui.sar_height = seqData.sar_height;
146 spsStructure.vui.video_format = seqData.video_format;
147 spsStructure.vui.video_full_range_flag = seqData.video_full_range_flag;
148 spsStructure.vui.colour_primaries = seqData.colour_primaries;
149 spsStructure.vui.transfer_characteristics = seqData.transfer_characteristics;
150 spsStructure.vui.matrix_coefficients = seqData.matrix_coefficients;
151 spsStructure.vui.chroma_sample_loc_type_top_field = seqData.chroma_sample_loc_type_top_field;
152 spsStructure.vui.chroma_sample_loc_type_bottom_field = seqData.chroma_sample_loc_type_bottom_field;
153 spsStructure.vui.time_scale = seqData.time_scale;
154 spsStructure.vui.num_units_in_tick = seqData.num_units_in_tick;
155 memset(&spsStructure.vui.nal_hrd_parameters, 0, sizeof(H264_HRD_PARAMS));
156 memset(&spsStructure.vui.vcl_hrd_parameters, 0, sizeof(H264_HRD_PARAMS));
157 spsStructure.vui.max_bytes_per_pic_denom = seqData.max_bytes_per_pic_denom;
158 spsStructure.vui.max_bits_per_mb_denom = seqData.max_bits_per_mb_denom;
159 spsStructure.vui.log2_max_mv_length_vertical = seqData.log2_max_mv_length_vertical;
160 spsStructure.vui.log2_max_mv_length_horizontal = seqData.log2_max_mv_length_horizontal;
161 spsStructure.vui.num_reorder_frames = seqData.max_num_reorder_frames;
162 spsStructure.vui.max_dec_frame_buffering = seqData.max_dec_frame_buffering;
163
164 // Print built SPS structure
165 debug_printf(
166 "[D3D12 d3d12_video_bitstream_builder_h264] H264_SPS Structure generated before writing to bitstream:\n");
167 print_sps(spsStructure);
168
169 // Convert the H264 SPS structure into bytes
170 m_h264Encoder.sps_to_nalu_bytes(&spsStructure, headerBitstream, placingPositionStart, writtenBytes);
171 }
172
173 void
write_end_of_stream_nalu(std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)174 d3d12_video_bitstream_builder_h264::write_end_of_stream_nalu(std::vector<uint8_t> & headerBitstream,
175 std::vector<uint8_t>::iterator placingPositionStart,
176 size_t & writtenBytes)
177 {
178 m_h264Encoder.write_end_of_stream_nalu(headerBitstream, placingPositionStart, writtenBytes);
179 }
180
181 void
write_end_of_sequence_nalu(std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)182 d3d12_video_bitstream_builder_h264::write_end_of_sequence_nalu(std::vector<uint8_t> & headerBitstream,
183 std::vector<uint8_t>::iterator placingPositionStart,
184 size_t & writtenBytes)
185 {
186 m_h264Encoder.write_end_of_sequence_nalu(headerBitstream, placingPositionStart, writtenBytes);
187 }
188
189 void
write_aud(std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)190 d3d12_video_bitstream_builder_h264::write_aud(std::vector<uint8_t> & headerBitstream,
191 std::vector<uint8_t>::iterator placingPositionStart,
192 size_t & writtenBytes)
193 {
194 m_h264Encoder.write_access_unit_delimiter_nalu(headerBitstream, placingPositionStart, writtenBytes);
195 }
196
197 void
build_pps(const enum pipe_video_profile & profile,const D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264 & codecConfig,const D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_H264 & pictureControl,uint32_t pic_parameter_set_id,uint32_t seq_parameter_set_id,std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)198 d3d12_video_bitstream_builder_h264::build_pps(const enum pipe_video_profile & profile,
199 const D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264 & codecConfig,
200 const D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_H264 &pictureControl,
201 uint32_t pic_parameter_set_id,
202 uint32_t seq_parameter_set_id,
203 std::vector<uint8_t> & headerBitstream,
204 std::vector<uint8_t>::iterator placingPositionStart,
205 size_t & writtenBytes)
206 {
207 BOOL bIsHighProfile =
208 ((profile == PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH) || (profile == PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10));
209
210 H264_PPS ppsStructure = {
211 pic_parameter_set_id,
212 seq_parameter_set_id,
213 ((codecConfig.ConfigurationFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_FLAG_ENABLE_CABAC_ENCODING) != 0) ?
214 1u :
215 0u, // entropy_coding_mode_flag
216 0, // pic_order_present_flag (bottom_field_pic_order_in_frame_present_flag) - will use pic_cnt 0 or 2, always
217 // off ; used with pic_cnt_type 1 and deltas.
218 static_cast<uint32_t>(std::max(static_cast<int32_t>(pictureControl.List0ReferenceFramesCount) - 1,
219 0)), // num_ref_idx_l0_active_minus1
220 static_cast<uint32_t>(std::max(static_cast<int32_t>(pictureControl.List1ReferenceFramesCount) - 1,
221 0)), // num_ref_idx_l1_active_minus1
222 ((codecConfig.ConfigurationFlags &
223 D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_FLAG_USE_CONSTRAINED_INTRAPREDICTION) != 0) ?
224 1u :
225 0u, // constrained_intra_pred_flag
226 ((codecConfig.ConfigurationFlags &
227 D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_FLAG_USE_ADAPTIVE_8x8_TRANSFORM) != 0) ?
228 1u :
229 0u // transform_8x8_mode_flag
230 };
231
232 // Print built PPS structure
233 debug_printf(
234 "[D3D12 d3d12_video_bitstream_builder_h264] H264_PPS Structure generated before writing to bitstream:\n");
235 print_pps(ppsStructure);
236
237 // Convert the H264 SPS structure into bytes
238 m_h264Encoder.pps_to_nalu_bytes(&ppsStructure, headerBitstream, bIsHighProfile, placingPositionStart, writtenBytes);
239 }
240
241 void
print_pps(const H264_PPS & pps)242 d3d12_video_bitstream_builder_h264::print_pps(const H264_PPS &pps)
243 {
244 // Be careful that build_pps also wraps some other NALU bytes in pps_to_nalu_bytes so bitstream returned by build_pps
245 // won't be exactly the bytes from the H264_PPS struct
246
247 static_assert(sizeof(H264_PPS) ==
248 (sizeof(uint32_t) *
249 8), "Update the number of uint32_t in struct in assert and add case below if structure changes");
250
251 // Declared fields from definition in d3d12_video_encoder_bitstream_builder_h264.h
252
253 debug_printf("[D3D12 d3d12_video_bitstream_builder_h264] H264_PPS values below:\n");
254 debug_printf("pic_parameter_set_id: %d\n", pps.pic_parameter_set_id);
255 debug_printf("seq_parameter_set_id: %d\n", pps.seq_parameter_set_id);
256 debug_printf("entropy_coding_mode_flag: %d\n", pps.entropy_coding_mode_flag);
257 debug_printf("pic_order_present_flag: %d\n", pps.pic_order_present_flag);
258 debug_printf("num_ref_idx_l0_active_minus1: %d\n", pps.num_ref_idx_l0_active_minus1);
259 debug_printf("num_ref_idx_l1_active_minus1: %d\n", pps.num_ref_idx_l1_active_minus1);
260 debug_printf("constrained_intra_pred_flag: %d\n", pps.constrained_intra_pred_flag);
261 debug_printf("transform_8x8_mode_flag: %d\n", pps.transform_8x8_mode_flag);
262 debug_printf(
263 "[D3D12 d3d12_video_bitstream_builder_h264] H264_PPS values end\n--------------------------------------\n");
264 }
265
266 static void
print_hrd(const H264_HRD_PARAMS * pHrd)267 print_hrd(const H264_HRD_PARAMS *pHrd)
268 {
269 debug_printf("cpb_cnt_minus1: %d\n", pHrd->cpb_cnt_minus1);
270 debug_printf("bit_rate_scale: %d\n", pHrd->bit_rate_scale);
271 debug_printf("cpb_size_scale: %d\n", pHrd->cpb_size_scale);
272 for (uint32_t i = 0; i <= pHrd->cpb_cnt_minus1; i++)
273 {
274 debug_printf("bit_rate_value_minus1[%d]: %d\n", i, pHrd->bit_rate_value_minus1[i]);
275 debug_printf("cpb_size_value_minus1[%d]: %d\n", i, pHrd->cpb_size_value_minus1[i]);
276 debug_printf("cbr_flag[%d]: %d\n", i, pHrd->cbr_flag[i]);
277 }
278 debug_printf("initial_cpb_removal_delay_length_minus1: %d\n", pHrd->initial_cpb_removal_delay_length_minus1);
279 debug_printf("cpb_removal_delay_length_minus1: %d\n", pHrd->cpb_removal_delay_length_minus1);
280 debug_printf("dpb_output_delay_length_minus1: %d\n", pHrd->dpb_output_delay_length_minus1);
281 debug_printf("time_offset_length: %d\n", pHrd->time_offset_length);
282 }
283
284 void
print_sps(const H264_SPS & sps)285 d3d12_video_bitstream_builder_h264::print_sps(const H264_SPS &sps)
286 {
287 // Be careful when calling this method that build_sps also wraps some other NALU bytes in sps_to_nalu_bytes so
288 // bitstream returned by build_sps won't be exactly the bytes from the H264_SPS struct From definition in
289 // d3d12_video_encoder_bitstream_builder_h264.h
290
291 static_assert(sizeof(H264_SPS) ==
292 (sizeof(uint32_t) * 20 + sizeof(H264_VUI_PARAMS)), "Update the print function if structure changes");
293
294 static_assert(sizeof(H264_VUI_PARAMS) ==
295 (sizeof(uint32_t) * 32 + 2*sizeof(H264_HRD_PARAMS)), "Update the print function if structure changes");
296
297 static_assert(sizeof(H264_HRD_PARAMS) ==
298 (sizeof(uint32_t) * 7 + 3*32*sizeof(uint32_t)), "Update the print function if structure changes");
299
300 // Declared fields from definition in d3d12_video_encoder_bitstream_builder_h264.h
301 debug_printf("[D3D12 d3d12_video_bitstream_builder_h264] H264_SPS values below:\n");
302 debug_printf("profile_idc: %d\n", sps.profile_idc);
303 debug_printf("constraint_set_flags: %x\n", sps.constraint_set_flags);
304 debug_printf("level_idc: %d\n", sps.level_idc);
305 debug_printf("seq_parameter_set_id: %d\n", sps.seq_parameter_set_id);
306 debug_printf("bit_depth_luma_minus8: %d\n", sps.bit_depth_luma_minus8);
307 debug_printf("bit_depth_chroma_minus8: %d\n", sps.bit_depth_chroma_minus8);
308 debug_printf("log2_max_frame_num_minus4: %d\n", sps.log2_max_frame_num_minus4);
309 debug_printf("pic_order_cnt_type: %d\n", sps.pic_order_cnt_type);
310 debug_printf("log2_max_pic_order_cnt_lsb_minus4: %d\n", sps.log2_max_pic_order_cnt_lsb_minus4);
311 debug_printf("max_num_ref_frames: %d\n", sps.max_num_ref_frames);
312 debug_printf("gaps_in_frame_num_value_allowed_flag: %d\n", sps.gaps_in_frame_num_value_allowed_flag);
313 debug_printf("pic_width_in_mbs_minus1: %d\n", sps.pic_width_in_mbs_minus1);
314 debug_printf("pic_height_in_map_units_minus1: %d\n", sps.pic_height_in_map_units_minus1);
315 debug_printf("direct_8x8_inference_flag: %d\n", sps.direct_8x8_inference_flag);
316 debug_printf("frame_cropping_flag: %d\n", sps.frame_cropping_flag);
317 debug_printf("frame_cropping_rect_left_offset: %d\n", sps.frame_cropping_rect_left_offset);
318 debug_printf("frame_cropping_rect_right_offset: %d\n", sps.frame_cropping_rect_right_offset);
319 debug_printf("frame_cropping_rect_top_offset: %d\n", sps.frame_cropping_rect_top_offset);
320 debug_printf("frame_cropping_rect_bottom_offset: %d\n", sps.frame_cropping_rect_bottom_offset);
321 debug_printf("VUI.vui_parameters_present_flag: %d\n", sps.vui_parameters_present_flag);
322 debug_printf("VUI.aspect_ratio_info_present_flag: %d\n", sps.vui.aspect_ratio_info_present_flag);
323 debug_printf("VUI.aspect_ratio_idc: %d\n", sps.vui.aspect_ratio_idc);
324 debug_printf("VUI.sar_width: %d\n", sps.vui.sar_width);
325 debug_printf("VUI.sar_height: %d\n", sps.vui.sar_height);
326 debug_printf("VUI.overscan_info_present_flag: %d\n", sps.vui.overscan_info_present_flag);
327 debug_printf("VUI.overscan_appropriate_flag: %d\n", sps.vui.overscan_appropriate_flag);
328 debug_printf("VUI.video_signal_type_present_flag: %d\n", sps.vui.video_signal_type_present_flag);
329 debug_printf("VUI.video_format: %d\n", sps.vui.video_format);
330 debug_printf("VUI.video_full_range_flag: %d\n", sps.vui.video_full_range_flag);
331 debug_printf("VUI.colour_description_present_flag: %d\n", sps.vui.colour_description_present_flag);
332 debug_printf("VUI.colour_primaries: %d\n", sps.vui.colour_primaries);
333 debug_printf("VUI.transfer_characteristics: %d\n", sps.vui.transfer_characteristics);
334 debug_printf("VUI.matrix_coefficients: %d\n", sps.vui.matrix_coefficients);
335 debug_printf("VUI.chroma_loc_info_present_flag: %d\n", sps.vui.chroma_loc_info_present_flag);
336 debug_printf("VUI.chroma_sample_loc_type_top_field: %d\n", sps.vui.chroma_sample_loc_type_top_field);
337 debug_printf("VUI.chroma_sample_loc_type_bottom_field: %d\n", sps.vui.chroma_sample_loc_type_bottom_field);
338 debug_printf("VUI.timing_info_present_flag: %d\n", sps.vui.timing_info_present_flag);
339 debug_printf("VUI.time_scale: %d\n", sps.vui.time_scale);
340 debug_printf("VUI.num_units_in_tick: %d\n", sps.vui.num_units_in_tick);
341 debug_printf("VUI.fixed_frame_rate_flag: %d\n", sps.vui.fixed_frame_rate_flag);
342 debug_printf("VUI.nal_hrd_parameters_present_flag: %d\n", sps.vui.nal_hrd_parameters_present_flag);
343 debug_printf("VUI.sps.vui.nal_hrd_parameters\n");
344 print_hrd(&sps.vui.nal_hrd_parameters);
345 debug_printf("VUI.vcl_hrd_parameters_present_flag: %d\n", sps.vui.vcl_hrd_parameters_present_flag);
346 debug_printf("VUI.sps.vui.vcl_hrd_parameters\n");
347 print_hrd(&sps.vui.vcl_hrd_parameters);
348 debug_printf("VUI.low_delay_hrd_flag: %d\n", sps.vui.low_delay_hrd_flag);
349 debug_printf("VUI.pic_struct_present_flag: %d\n", sps.vui.pic_struct_present_flag);
350 debug_printf("VUI.bitstream_restriction_flag: %d\n", sps.vui.bitstream_restriction_flag);
351 debug_printf("VUI.motion_vectors_over_pic_boundaries_flag: %d\n", sps.vui.motion_vectors_over_pic_boundaries_flag);
352 debug_printf("VUI.max_bytes_per_pic_denom: %d\n", sps.vui.max_bytes_per_pic_denom);
353 debug_printf("VUI.max_bits_per_mb_denom: %d\n", sps.vui.max_bits_per_mb_denom);
354 debug_printf("VUI.log2_max_mv_length_vertical: %d\n", sps.vui.log2_max_mv_length_vertical);
355 debug_printf("VUI.log2_max_mv_length_horizontal: %d\n", sps.vui.log2_max_mv_length_horizontal);
356 debug_printf("VUI.num_reorder_frames: %d\n", sps.vui.num_reorder_frames);
357 debug_printf("VUI.max_dec_frame_buffering: %d\n", sps.vui.max_dec_frame_buffering);
358
359 debug_printf(
360 "[D3D12 d3d12_video_bitstream_builder_h264] H264_SPS values end\n--------------------------------------\n");
361 }
362