void ReadPicTiming(H264Bitstream r, uint length) { // Rec. ITU-T H.264 (04/2013) Section D.2.2 var CpbDpbDelaysPresentFlag = (_nalHrdParametersPresentFlag.HasValue && _nalHrdParametersPresentFlag.Value) || (_vclHrdParametersPresentFlag.HasValue && _vclHrdParametersPresentFlag.Value); if (CpbDpbDelaysPresentFlag) { if (!_cpbRemovalDelayLengthMinus1.HasValue) return; var cpb_removal_delay = r.ReadBits((int)_cpbRemovalDelayLengthMinus1.Value + 1); if (!_dpbOutputDelayLengthMinus1.HasValue) return; var dpb_output_delay = r.ReadBits((int)_dpbOutputDelayLengthMinus1.Value + 1); } if (_picStructPresentFlag.HasValue && _picStructPresentFlag.Value) { var pic_struct = r.ReadBits(4); _picStruct = pic_struct; var nct = GetNumClockTs(); if (!nct.HasValue) return; var NumClockTS = nct.Value; for (var i = 0; i < NumClockTS; i++) { var clock_timestamp_flag_i = r.ReadBits(1); if (0 != clock_timestamp_flag_i) { var ct_type = r.ReadBits(2); var nuit_field_based_flag = r.ReadBits(1); var counting_type = r.ReadBits(5); var full_timestamp_flag = r.ReadBits(1); var discontinuity_flag = r.ReadBits(1); var cnt_dropped_flag = r.ReadBits(1); var n_frames = r.ReadBits(8); if (0 != full_timestamp_flag) { var seconds_value /* 0..59 */ = r.ReadBits(6); var minutes_value /* 0..59 */ = r.ReadBits(6); var hours_value /* 0..23 */ = r.ReadBits(5); } else { var seconds_flag = r.ReadBits(1); if (0 != seconds_flag) { var seconds_value /* range 0..59 */ = r.ReadBits(6); var minutes_flag = r.ReadBits(1); if (0 != minutes_flag) { var minutes_value /* 0..59 */ = r.ReadBits(6); var hours_flag = r.ReadBits(1); if (0 != hours_flag) { var hours_value /* 0..23 */ = r.ReadBits(5); } } } } var time_offset_length = _timeOffsetLength ?? 24; if (time_offset_length > 0) { var time_offset = r.ReadSignedBits((int)time_offset_length); } } } } }