• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()29 d3d12_video_bitstream_builder_h264::d3d12_video_bitstream_builder_h264()
30 { }
31 
32 inline H264_SPEC_PROFILES
Convert12ToSpecH264Profiles(D3D12_VIDEO_ENCODER_PROFILE_H264 profile12)33 Convert12ToSpecH264Profiles(D3D12_VIDEO_ENCODER_PROFILE_H264 profile12)
34 {
35    switch (profile12) {
36       case D3D12_VIDEO_ENCODER_PROFILE_H264_MAIN:
37       {
38          return H264_PROFILE_MAIN;
39       } break;
40       case D3D12_VIDEO_ENCODER_PROFILE_H264_HIGH:
41       {
42          return H264_PROFILE_HIGH;
43       } break;
44       case D3D12_VIDEO_ENCODER_PROFILE_H264_HIGH_10:
45       {
46          return H264_PROFILE_HIGH10;
47       } break;
48       default:
49       {
50          unreachable("Unsupported D3D12_VIDEO_ENCODER_PROFILE_H264");
51       } break;
52    }
53 }
54 
55 H264_SPS
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,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)56 d3d12_video_bitstream_builder_h264::build_sps(const struct pipe_h264_enc_seq_param &                 seqData,
57                                               const enum pipe_video_profile &                        profile,
58                                               const D3D12_VIDEO_ENCODER_LEVELS_H264 &                level,
59                                               const DXGI_FORMAT &                                    inputFmt,
60                                               const D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264 &   codecConfig,
61                                               const D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_H264 &gopConfig,
62                                               uint32_t                                    seq_parameter_set_id,
63                                               D3D12_VIDEO_ENCODER_PICTURE_RESOLUTION_DESC sequenceTargetResolution,
64                                               D3D12_BOX                                   frame_cropping_codec_config,
65                                               std::vector<uint8_t> &                      headerBitstream,
66                                               std::vector<uint8_t>::iterator              placingPositionStart,
67                                               size_t &                                    writtenBytes)
68 {
69    H264_SPEC_PROFILES profile_idc          = (H264_SPEC_PROFILES) u_get_h264_profile_idc(profile);
70    uint32_t           level_idc            = 0;
71    d3d12_video_encoder_convert_from_d3d12_level_h264(
72       level,
73       level_idc);
74 
75    assert((inputFmt == DXGI_FORMAT_NV12) || (inputFmt == DXGI_FORMAT_P010));
76 
77    // Assume NV12 YUV 420 8 bits
78    uint32_t bit_depth_luma_minus8   = 0;
79    uint32_t bit_depth_chroma_minus8 = 0;
80 
81    // In case is 420 10 bits fix it
82    if (inputFmt == DXGI_FORMAT_P010) {
83       bit_depth_luma_minus8   = 2;
84       bit_depth_chroma_minus8 = 2;
85    }
86 
87    // Calculate sequence resolution sizes in MBs
88    // Always in MBs since we don't support interlace in D3D12 Encode
89    uint32_t pic_width_in_mbs_minus1 = static_cast<uint32_t>(std::ceil(sequenceTargetResolution.Width / 16.0)) - 1;
90    uint32_t pic_height_in_map_units_minus1 =
91       static_cast<uint32_t>(std::ceil(sequenceTargetResolution.Height / 16.0)) - 1;
92 
93    uint32_t frame_cropping_flag               = 0;
94    if (frame_cropping_codec_config.left
95       || frame_cropping_codec_config.right
96       || frame_cropping_codec_config.top
97       || frame_cropping_codec_config.bottom
98    ) {
99       frame_cropping_flag               = 1;
100    }
101 
102    uint32_t gaps_in_frame_num_value_allowed_flag = (seqData.num_temporal_layers > 1) ? 1 : 0;
103    H264_SPS spsStructure = { static_cast<uint32_t>(profile_idc),
104                              seqData.enc_constraint_set_flags,
105                              level_idc,
106                              seq_parameter_set_id,
107                              bit_depth_luma_minus8,
108                              bit_depth_chroma_minus8,
109                              gopConfig.log2_max_frame_num_minus4,
110                              gopConfig.pic_order_cnt_type,
111                              gopConfig.log2_max_pic_order_cnt_lsb_minus4,
112                              seqData.max_num_ref_frames,
113                              gaps_in_frame_num_value_allowed_flag,
114                              pic_width_in_mbs_minus1,
115                              pic_height_in_map_units_minus1,
116                              1u, // direct_8x8_inference_flag as per DX12 spec
117                              frame_cropping_flag,
118                              frame_cropping_codec_config.left,
119                              frame_cropping_codec_config.right,
120                              frame_cropping_codec_config.top,
121                              frame_cropping_codec_config.bottom };
122 
123    // Copy VUI params from seqData
124    spsStructure.vui_parameters_present_flag = seqData.vui_parameters_present_flag;
125    spsStructure.vui.aspect_ratio_info_present_flag = seqData.vui_flags.aspect_ratio_info_present_flag;
126    spsStructure.vui.timing_info_present_flag = seqData.vui_flags.timing_info_present_flag;
127    spsStructure.vui.video_signal_type_present_flag = seqData.vui_flags.video_signal_type_present_flag;
128    spsStructure.vui.colour_description_present_flag = seqData.vui_flags.colour_description_present_flag;
129    spsStructure.vui.chroma_loc_info_present_flag = seqData.vui_flags.chroma_loc_info_present_flag;
130    spsStructure.vui.overscan_info_present_flag = seqData.vui_flags.overscan_info_present_flag;
131    spsStructure.vui.overscan_appropriate_flag = seqData.vui_flags.overscan_appropriate_flag;
132    spsStructure.vui.fixed_frame_rate_flag = seqData.vui_flags.fixed_frame_rate_flag;
133    spsStructure.vui.nal_hrd_parameters_present_flag = seqData.vui_flags.nal_hrd_parameters_present_flag;
134    spsStructure.vui.vcl_hrd_parameters_present_flag = seqData.vui_flags.vcl_hrd_parameters_present_flag;
135    spsStructure.vui.low_delay_hrd_flag = seqData.vui_flags.low_delay_hrd_flag;
136    spsStructure.vui.pic_struct_present_flag = seqData.vui_flags.pic_struct_present_flag;
137    spsStructure.vui.bitstream_restriction_flag = seqData.vui_flags.bitstream_restriction_flag;
138    spsStructure.vui.motion_vectors_over_pic_boundaries_flag = seqData.vui_flags.motion_vectors_over_pic_boundaries_flag;
139    spsStructure.vui.aspect_ratio_idc = seqData.aspect_ratio_idc;
140    spsStructure.vui.sar_width = seqData.sar_width;
141    spsStructure.vui.sar_height = seqData.sar_height;
142    spsStructure.vui.video_format = seqData.video_format;
143    spsStructure.vui.video_full_range_flag = seqData.video_full_range_flag;
144    spsStructure.vui.colour_primaries = seqData.colour_primaries;
145    spsStructure.vui.transfer_characteristics = seqData.transfer_characteristics;
146    spsStructure.vui.matrix_coefficients = seqData.matrix_coefficients;
147    spsStructure.vui.chroma_sample_loc_type_top_field = seqData.chroma_sample_loc_type_top_field;
148    spsStructure.vui.chroma_sample_loc_type_bottom_field = seqData.chroma_sample_loc_type_bottom_field;
149    spsStructure.vui.time_scale = seqData.time_scale;
150    spsStructure.vui.num_units_in_tick = seqData.num_units_in_tick;
151    memset(&spsStructure.vui.nal_hrd_parameters, 0, sizeof(H264_HRD_PARAMS));
152    memset(&spsStructure.vui.vcl_hrd_parameters, 0, sizeof(H264_HRD_PARAMS));
153    spsStructure.vui.max_bytes_per_pic_denom = seqData.max_bytes_per_pic_denom;
154    spsStructure.vui.max_bits_per_mb_denom = seqData.max_bits_per_mb_denom;
155    spsStructure.vui.log2_max_mv_length_vertical = seqData.log2_max_mv_length_vertical;
156    spsStructure.vui.log2_max_mv_length_horizontal = seqData.log2_max_mv_length_horizontal;
157    spsStructure.vui.num_reorder_frames = seqData.max_num_reorder_frames;
158    spsStructure.vui.max_dec_frame_buffering = seqData.max_dec_frame_buffering;
159 
160    // Print built SPS structure
161    debug_printf(
162       "[D3D12 d3d12_video_bitstream_builder_h264] H264_SPS Structure generated before writing to bitstream:\n");
163    print_sps(spsStructure);
164 
165    // Convert the H264 SPS structure into bytes
166    m_h264Encoder.sps_to_nalu_bytes(&spsStructure, headerBitstream, placingPositionStart, writtenBytes);
167 
168    return spsStructure;
169 }
170 
171 void
write_end_of_stream_nalu(std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)172 d3d12_video_bitstream_builder_h264::write_end_of_stream_nalu(std::vector<uint8_t> &         headerBitstream,
173                                                              std::vector<uint8_t>::iterator placingPositionStart,
174                                                              size_t &                       writtenBytes)
175 {
176    m_h264Encoder.write_end_of_stream_nalu(headerBitstream, placingPositionStart, writtenBytes);
177 }
178 
179 void
write_end_of_sequence_nalu(std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)180 d3d12_video_bitstream_builder_h264::write_end_of_sequence_nalu(std::vector<uint8_t> &         headerBitstream,
181                                                                std::vector<uint8_t>::iterator placingPositionStart,
182                                                                size_t &                       writtenBytes)
183 {
184    m_h264Encoder.write_end_of_sequence_nalu(headerBitstream, placingPositionStart, writtenBytes);
185 }
186 
187 void
write_aud(std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)188 d3d12_video_bitstream_builder_h264::write_aud(std::vector<uint8_t> &         headerBitstream,
189                                               std::vector<uint8_t>::iterator placingPositionStart,
190                                               size_t &                       writtenBytes)
191 {
192    m_h264Encoder.write_access_unit_delimiter_nalu(headerBitstream, placingPositionStart, writtenBytes);
193 }
194 
195 void
write_sei_messages(const std::vector<H264_SEI_MESSAGE> & sei_messages,std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)196 d3d12_video_bitstream_builder_h264::write_sei_messages(const std::vector<H264_SEI_MESSAGE>&  sei_messages,
197                                                        std::vector<uint8_t> &                headerBitstream,
198                                                        std::vector<uint8_t>::iterator        placingPositionStart,
199                                                        size_t &                              writtenBytes)
200 {
201    size_t byte_offset_placing_start = std::distance(headerBitstream.begin(), placingPositionStart);
202    writtenBytes = 0;
203 
204    for (auto& message : sei_messages)
205    {
206       size_t WrittenBytesCurrentSei = 0;
207       m_h264Encoder.write_sei_nalu(message, headerBitstream, headerBitstream.begin() + byte_offset_placing_start, WrittenBytesCurrentSei);
208       byte_offset_placing_start += WrittenBytesCurrentSei;
209       writtenBytes += WrittenBytesCurrentSei;
210    }
211 }
212 
213 void
write_slice_svc_prefix(const H264_SLICE_PREFIX_SVC & nal_svc_prefix,std::vector<uint8_t> & headerBitstream,std::vector<uint8_t>::iterator placingPositionStart,size_t & writtenBytes)214 d3d12_video_bitstream_builder_h264::write_slice_svc_prefix(const H264_SLICE_PREFIX_SVC &         nal_svc_prefix,
215                                                            std::vector<uint8_t> &                headerBitstream,
216                                                            std::vector<uint8_t>::iterator        placingPositionStart,
217                                                            size_t &                              writtenBytes)
218 {
219    m_h264Encoder.write_slice_svc_prefix(nal_svc_prefix, headerBitstream, placingPositionStart, writtenBytes);
220 }
221 
222 H264_PPS
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)223 d3d12_video_bitstream_builder_h264::build_pps(const enum pipe_video_profile &                            profile,
224                                               const D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264 &       codecConfig,
225                                               const D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_H264 &pictureControl,
226                                               uint32_t                       pic_parameter_set_id,
227                                               uint32_t                       seq_parameter_set_id,
228                                               std::vector<uint8_t> &         headerBitstream,
229                                               std::vector<uint8_t>::iterator placingPositionStart,
230                                               size_t &                       writtenBytes)
231 {
232    BOOL bIsHighProfile =
233       ((profile == PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH) || (profile == PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10));
234 
235    H264_PPS ppsStructure = {
236       pic_parameter_set_id,
237       seq_parameter_set_id,
238       ((codecConfig.ConfigurationFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_FLAG_ENABLE_CABAC_ENCODING) != 0) ?
239          1u :
240          0u,   // entropy_coding_mode_flag
241       0,   // pic_order_present_flag (bottom_field_pic_order_in_frame_present_flag) - will use pic_cnt 0 or 2, always
242            // off ; used with pic_cnt_type 1 and deltas.
243       static_cast<uint32_t>(std::max(static_cast<int32_t>(pictureControl.List0ReferenceFramesCount) - 1,
244                                      0)),   // num_ref_idx_l0_active_minus1
245       static_cast<uint32_t>(std::max(static_cast<int32_t>(pictureControl.List1ReferenceFramesCount) - 1,
246                                      0)),   // num_ref_idx_l1_active_minus1
247       ((codecConfig.ConfigurationFlags &
248         D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_FLAG_USE_CONSTRAINED_INTRAPREDICTION) != 0) ?
249          1u :
250          0u,   // constrained_intra_pred_flag
251       ((codecConfig.ConfigurationFlags &
252         D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_FLAG_USE_ADAPTIVE_8x8_TRANSFORM) != 0) ?
253          1u :
254          0u   // transform_8x8_mode_flag
255    };
256 
257    // Print built PPS structure
258    debug_printf(
259       "[D3D12 d3d12_video_bitstream_builder_h264] H264_PPS Structure generated before writing to bitstream:\n");
260    print_pps(ppsStructure);
261 
262    // Convert the H264 SPS structure into bytes
263    m_h264Encoder.pps_to_nalu_bytes(&ppsStructure, headerBitstream, bIsHighProfile, placingPositionStart, writtenBytes);
264 
265    return ppsStructure;
266 }
267 
268 void
print_pps(const H264_PPS & pps)269 d3d12_video_bitstream_builder_h264::print_pps(const H264_PPS &pps)
270 {
271    // Be careful that build_pps also wraps some other NALU bytes in pps_to_nalu_bytes so bitstream returned by build_pps
272    // won't be exactly the bytes from the H264_PPS struct
273 
274    static_assert(sizeof(H264_PPS) ==
275                  (sizeof(uint32_t) *
276                   8), "Update the number of uint32_t in struct in assert and add case below if structure changes");
277 
278    // Declared fields from definition in d3d12_video_encoder_bitstream_builder_h264.h
279 
280    debug_printf("[D3D12 d3d12_video_bitstream_builder_h264] H264_PPS values below:\n");
281    debug_printf("pic_parameter_set_id: %d\n", pps.pic_parameter_set_id);
282    debug_printf("seq_parameter_set_id: %d\n", pps.seq_parameter_set_id);
283    debug_printf("entropy_coding_mode_flag: %d\n", pps.entropy_coding_mode_flag);
284    debug_printf("pic_order_present_flag: %d\n", pps.pic_order_present_flag);
285    debug_printf("num_ref_idx_l0_active_minus1: %d\n", pps.num_ref_idx_l0_active_minus1);
286    debug_printf("num_ref_idx_l1_active_minus1: %d\n", pps.num_ref_idx_l1_active_minus1);
287    debug_printf("constrained_intra_pred_flag: %d\n", pps.constrained_intra_pred_flag);
288    debug_printf("transform_8x8_mode_flag: %d\n", pps.transform_8x8_mode_flag);
289    debug_printf(
290       "[D3D12 d3d12_video_bitstream_builder_h264] H264_PPS values end\n--------------------------------------\n");
291 }
292 
293 static void
print_hrd(const H264_HRD_PARAMS * pHrd)294 print_hrd(const H264_HRD_PARAMS *pHrd)
295 {
296    debug_printf("cpb_cnt_minus1: %d\n", pHrd->cpb_cnt_minus1);
297    debug_printf("bit_rate_scale: %d\n", pHrd->bit_rate_scale);
298    debug_printf("cpb_size_scale: %d\n", pHrd->cpb_size_scale);
299    for (uint32_t i = 0; i <= pHrd->cpb_cnt_minus1; i++)
300    {
301       debug_printf("bit_rate_value_minus1[%d]: %d\n", i, pHrd->bit_rate_value_minus1[i]);
302       debug_printf("cpb_size_value_minus1[%d]: %d\n", i, pHrd->cpb_size_value_minus1[i]);
303       debug_printf("cbr_flag[%d]: %d\n", i, pHrd->cbr_flag[i]);
304    }
305    debug_printf("initial_cpb_removal_delay_length_minus1: %d\n", pHrd->initial_cpb_removal_delay_length_minus1);
306    debug_printf("cpb_removal_delay_length_minus1: %d\n", pHrd->cpb_removal_delay_length_minus1);
307    debug_printf("dpb_output_delay_length_minus1: %d\n", pHrd->dpb_output_delay_length_minus1);
308    debug_printf("time_offset_length: %d\n", pHrd->time_offset_length);
309 }
310 
311 void
print_sps(const H264_SPS & sps)312 d3d12_video_bitstream_builder_h264::print_sps(const H264_SPS &sps)
313 {
314    // Be careful when calling this method that build_sps also wraps some other NALU bytes in sps_to_nalu_bytes so
315    // bitstream returned by build_sps won't be exactly the bytes from the H264_SPS struct From definition in
316    // d3d12_video_encoder_bitstream_builder_h264.h
317 
318    static_assert(sizeof(H264_SPS) ==
319                 (sizeof(uint32_t) * 20 + sizeof(H264_VUI_PARAMS)), "Update the print function if structure changes");
320 
321    static_assert(sizeof(H264_VUI_PARAMS) ==
322                  (sizeof(uint32_t) * 32 + 2*sizeof(H264_HRD_PARAMS)), "Update the print function if structure changes");
323 
324    static_assert(sizeof(H264_HRD_PARAMS) ==
325                  (sizeof(uint32_t) * 7 + 3*32*sizeof(uint32_t)), "Update the print function if structure changes");
326 
327    // Declared fields from definition in d3d12_video_encoder_bitstream_builder_h264.h
328    debug_printf("[D3D12 d3d12_video_bitstream_builder_h264] H264_SPS values below:\n");
329    debug_printf("profile_idc: %d\n", sps.profile_idc);
330    debug_printf("constraint_set_flags: %x\n", sps.constraint_set_flags);
331    debug_printf("level_idc: %d\n", sps.level_idc);
332    debug_printf("seq_parameter_set_id: %d\n", sps.seq_parameter_set_id);
333    debug_printf("bit_depth_luma_minus8: %d\n", sps.bit_depth_luma_minus8);
334    debug_printf("bit_depth_chroma_minus8: %d\n", sps.bit_depth_chroma_minus8);
335    debug_printf("log2_max_frame_num_minus4: %d\n", sps.log2_max_frame_num_minus4);
336    debug_printf("pic_order_cnt_type: %d\n", sps.pic_order_cnt_type);
337    debug_printf("log2_max_pic_order_cnt_lsb_minus4: %d\n", sps.log2_max_pic_order_cnt_lsb_minus4);
338    debug_printf("max_num_ref_frames: %d\n", sps.max_num_ref_frames);
339    debug_printf("gaps_in_frame_num_value_allowed_flag: %d\n", sps.gaps_in_frame_num_value_allowed_flag);
340    debug_printf("pic_width_in_mbs_minus1: %d\n", sps.pic_width_in_mbs_minus1);
341    debug_printf("pic_height_in_map_units_minus1: %d\n", sps.pic_height_in_map_units_minus1);
342    debug_printf("direct_8x8_inference_flag: %d\n", sps.direct_8x8_inference_flag);
343    debug_printf("frame_cropping_flag: %d\n", sps.frame_cropping_flag);
344    debug_printf("frame_cropping_rect_left_offset: %d\n", sps.frame_cropping_rect_left_offset);
345    debug_printf("frame_cropping_rect_right_offset: %d\n", sps.frame_cropping_rect_right_offset);
346    debug_printf("frame_cropping_rect_top_offset: %d\n", sps.frame_cropping_rect_top_offset);
347    debug_printf("frame_cropping_rect_bottom_offset: %d\n", sps.frame_cropping_rect_bottom_offset);
348    debug_printf("VUI.vui_parameters_present_flag: %d\n", sps.vui_parameters_present_flag);
349    debug_printf("VUI.aspect_ratio_info_present_flag: %d\n", sps.vui.aspect_ratio_info_present_flag);
350    debug_printf("VUI.aspect_ratio_idc: %d\n", sps.vui.aspect_ratio_idc);
351    debug_printf("VUI.sar_width: %d\n", sps.vui.sar_width);
352    debug_printf("VUI.sar_height: %d\n", sps.vui.sar_height);
353    debug_printf("VUI.overscan_info_present_flag: %d\n", sps.vui.overscan_info_present_flag);
354    debug_printf("VUI.overscan_appropriate_flag: %d\n", sps.vui.overscan_appropriate_flag);
355    debug_printf("VUI.video_signal_type_present_flag: %d\n", sps.vui.video_signal_type_present_flag);
356    debug_printf("VUI.video_format: %d\n", sps.vui.video_format);
357    debug_printf("VUI.video_full_range_flag: %d\n", sps.vui.video_full_range_flag);
358    debug_printf("VUI.colour_description_present_flag: %d\n", sps.vui.colour_description_present_flag);
359    debug_printf("VUI.colour_primaries: %d\n", sps.vui.colour_primaries);
360    debug_printf("VUI.transfer_characteristics: %d\n", sps.vui.transfer_characteristics);
361    debug_printf("VUI.matrix_coefficients: %d\n", sps.vui.matrix_coefficients);
362    debug_printf("VUI.chroma_loc_info_present_flag: %d\n", sps.vui.chroma_loc_info_present_flag);
363    debug_printf("VUI.chroma_sample_loc_type_top_field: %d\n", sps.vui.chroma_sample_loc_type_top_field);
364    debug_printf("VUI.chroma_sample_loc_type_bottom_field: %d\n", sps.vui.chroma_sample_loc_type_bottom_field);
365    debug_printf("VUI.timing_info_present_flag: %d\n", sps.vui.timing_info_present_flag);
366    debug_printf("VUI.time_scale: %d\n", sps.vui.time_scale);
367    debug_printf("VUI.num_units_in_tick: %d\n", sps.vui.num_units_in_tick);
368    debug_printf("VUI.fixed_frame_rate_flag: %d\n", sps.vui.fixed_frame_rate_flag);
369    debug_printf("VUI.nal_hrd_parameters_present_flag: %d\n", sps.vui.nal_hrd_parameters_present_flag);
370    debug_printf("VUI.sps.vui.nal_hrd_parameters\n");
371    print_hrd(&sps.vui.nal_hrd_parameters);
372    debug_printf("VUI.vcl_hrd_parameters_present_flag: %d\n", sps.vui.vcl_hrd_parameters_present_flag);
373    debug_printf("VUI.sps.vui.vcl_hrd_parameters\n");
374    print_hrd(&sps.vui.vcl_hrd_parameters);
375    debug_printf("VUI.low_delay_hrd_flag: %d\n", sps.vui.low_delay_hrd_flag);
376    debug_printf("VUI.pic_struct_present_flag: %d\n", sps.vui.pic_struct_present_flag);
377    debug_printf("VUI.bitstream_restriction_flag: %d\n", sps.vui.bitstream_restriction_flag);
378    debug_printf("VUI.motion_vectors_over_pic_boundaries_flag: %d\n", sps.vui.motion_vectors_over_pic_boundaries_flag);
379    debug_printf("VUI.max_bytes_per_pic_denom: %d\n", sps.vui.max_bytes_per_pic_denom);
380    debug_printf("VUI.max_bits_per_mb_denom: %d\n", sps.vui.max_bits_per_mb_denom);
381    debug_printf("VUI.log2_max_mv_length_vertical: %d\n", sps.vui.log2_max_mv_length_vertical);
382    debug_printf("VUI.log2_max_mv_length_horizontal: %d\n", sps.vui.log2_max_mv_length_horizontal);
383    debug_printf("VUI.num_reorder_frames: %d\n", sps.vui.num_reorder_frames);
384    debug_printf("VUI.max_dec_frame_buffering: %d\n", sps.vui.max_dec_frame_buffering);
385 
386    debug_printf(
387       "[D3D12 d3d12_video_bitstream_builder_h264] H264_SPS values end\n--------------------------------------\n");
388 }
389