dash_runtime/timing/
availability.rs1const MICROS_PER_SECOND: i128 = 1_000_000;
12const MICROS_PER_SECOND_F64: f64 = 1_000_000.0;
13const ATO_CLAMP_US: i128 = 1 << 80;
14
15#[must_use]
18pub fn ato_seconds_to_us(seconds: f64) -> i128 {
19 let us = seconds * MICROS_PER_SECOND_F64;
20 (us as i128).clamp(-ATO_CLAMP_US, ATO_CLAMP_US)
21}
22
23#[must_use]
25pub fn ticks_to_us(ticks: i128, timescale: u64) -> i128 {
26 ticks
27 .saturating_mul(MICROS_PER_SECOND)
28 .div_euclid(i128::from(timescale.max(1)))
29}
30
31#[must_use]
35pub fn segment_available_from_ticks(
36 ast_us: i128,
37 period_start_us: i128,
38 start_ticks: i128,
39 duration_ticks: i128,
40 timescale: u64,
41 ato_us: i128,
42) -> i128 {
43 segment_available_from(
44 ast_us,
45 period_start_us,
46 ticks_to_us(start_ticks.saturating_add(duration_ticks), timescale),
47 0,
48 ato_us,
49 )
50}
51
52#[must_use]
54pub fn segment_available_until_ticks(
55 ast_us: i128,
56 period_start_us: i128,
57 start_ticks: i128,
58 duration_ticks: i128,
59 timescale: u64,
60 tsb_us: Option<i128>,
61) -> Option<i128> {
62 let end2 = start_ticks.saturating_add(duration_ticks.saturating_mul(2));
63 segment_available_until(
64 ast_us,
65 period_start_us,
66 ticks_to_us(end2, timescale),
67 0,
68 tsb_us,
69 )
70}
71
72#[must_use]
74pub fn segment_available_from(
75 ast_us: i128,
76 period_start_us: i128,
77 mpd_start_us: i128,
78 mpd_duration_us: i128,
79 ato_us: i128,
80) -> i128 {
81 ast_us
82 .saturating_add(period_start_us)
83 .saturating_add(mpd_start_us)
84 .saturating_add(mpd_duration_us)
85 .saturating_sub(ato_us)
86}
87
88#[must_use]
91pub fn segment_available_until(
92 ast_us: i128,
93 period_start_us: i128,
94 mpd_start_us: i128,
95 mpd_duration_us: i128,
96 tsb_us: Option<i128>,
97) -> Option<i128> {
98 tsb_us.map(|tsb| {
99 ast_us
100 .saturating_add(period_start_us)
101 .saturating_add(mpd_start_us)
102 .saturating_add(mpd_duration_us.saturating_mul(2))
103 .saturating_add(tsb)
104 })
105}
106
107#[must_use]
109pub fn init_available_from(ast_us: i128, period_start_us: i128) -> i128 {
110 ast_us.saturating_add(period_start_us)
111}
112
113#[must_use]
118pub fn complete_count_constant(
119 utc_us: i128,
120 ast_us: i128,
121 period_start_us: i128,
122 ato_us: i128,
123 duration_ticks: u64,
124 timescale: u64,
125) -> u64 {
126 if duration_ticks == 0 || timescale == 0 {
127 return 0;
128 }
129 let x = utc_us
130 .saturating_sub(ast_us)
131 .saturating_sub(period_start_us)
132 .saturating_add(ato_us);
133 let x1 = x.saturating_add(1);
134 if x1 <= 0 {
135 return 0;
136 }
137 let numerator = x1.saturating_mul(i128::from(timescale)).saturating_sub(1);
138 let denominator = i128::from(duration_ticks).saturating_mul(MICROS_PER_SECOND);
139 let n = numerator / denominator;
140 u64::try_from(n.max(0)).unwrap_or(u64::MAX)
141}