1use core_foundation::{
2 base::{kCFAllocatorDefault, Boolean, CFAllocatorRef, TCFType},
3 dictionary::{CFDictionary, CFDictionaryRef},
4 number::CFNumber,
5 string::{CFString, CFStringRef},
6};
7
8use crate::time::CMTime;
9
10#[repr(C, align(4))]
11#[derive(Clone, Copy, Debug, Default)]
12pub struct CMTimeRange {
13 pub start: CMTime,
14 pub duration: CMTime,
15}
16
17extern "C" {
18 pub static kCMTimeRangeZero: CMTimeRange;
19 pub static kCMTimeRangeInvalid: CMTimeRange;
20
21 pub fn CMTimeRangeMake(start: CMTime, duration: CMTime) -> CMTimeRange;
22 pub fn CMTimeRangeGetUnion(range: CMTimeRange, otherRange: CMTimeRange) -> CMTimeRange;
23 pub fn CMTimeRangeGetIntersection(range: CMTimeRange, otherRange: CMTimeRange) -> CMTimeRange;
24 pub fn CMTimeRangeEqual(range1: CMTimeRange, range2: CMTimeRange) -> Boolean;
25 pub fn CMTimeRangeContainsTime(range: CMTimeRange, time: CMTime) -> Boolean;
26 pub fn CMTimeRangeContainsTimeRange(range: CMTimeRange, otherRange: CMTimeRange) -> Boolean;
27 pub fn CMTimeRangeGetEnd(range: CMTimeRange) -> CMTime;
28 pub fn CMTimeRangeFromRangeToRange(t: CMTime, fromRange: CMTimeRange, toRange: CMTimeRange) -> CMTime;
29 pub fn CMTimeClampToRange(time: CMTime, range: CMTimeRange) -> CMTime;
30 pub fn CMTimeMapDurationFromRangeToRange(dur: CMTime, fromRange: CMTimeRange, toRange: CMTimeRange) -> CMTime;
31 pub fn CMTimeFoldIntoRange(time: CMTime, foldRange: CMTimeRange) -> CMTime;
32 pub fn CMTimeRangeFromTimeToTime(start: CMTime, end: CMTime) -> CMTimeRange;
33 pub fn CMTimeRangeCopyAsDictionary(range: CMTimeRange, allocator: CFAllocatorRef) -> CFDictionaryRef;
34 pub fn CMTimeRangeMakeFromDictionary(dict: CFDictionaryRef) -> CMTimeRange;
35
36 pub static kCMTimeRangeStartKey: CFStringRef;
37 pub static kCMTimeRangeDurationKey: CFStringRef;
38
39 pub fn CMTimeRangeCopyDescription(allocator: CFAllocatorRef, range: CMTimeRange) -> CFStringRef;
40 pub fn CMTimeRangeShow(range: CMTimeRange);
41}
42
43#[repr(C, align(4))]
44#[derive(Clone, Copy, Debug, Default, PartialEq)]
45pub struct CMTimeMapping {
46 pub source: CMTimeRange,
47 pub target: CMTimeRange,
48}
49
50extern "C" {
51 pub static kCMTimeMappingInvalid: CMTimeMapping;
52
53 pub fn CMTimeMappingMake(source: CMTimeRange, target: CMTimeRange) -> CMTimeMapping;
54 pub fn CMTimeMappingMakeEmpty(target: CMTimeRange) -> CMTimeMapping;
55 pub fn CMTimeMappingCopyAsDictionary(mapping: CMTimeMapping, allocator: CFAllocatorRef) -> CFDictionaryRef;
56 pub fn CMTimeMappingMakeFromDictionary(dictionaryRepresentation: CFDictionaryRef) -> CMTimeMapping;
57
58 pub static kCMTimeMappingSourceKey: CFStringRef;
59 pub static kCMTimeMappingTargetKey: CFStringRef;
60
61 pub fn CMTimeMappingCopyDescription(allocator: CFAllocatorRef, mapping: CMTimeMapping) -> CFStringRef;
62 pub fn CMTimeMappingShow(mapping: CMTimeMapping);
63}
64
65impl PartialEq for CMTimeRange {
66 #[inline]
67 fn eq(&self, other: &Self) -> bool {
68 unsafe { CMTimeRangeEqual(*self, *other) != 0 }
69 }
70}
71
72impl CMTimeRange {
73 #[inline]
74 pub fn make(start: CMTime, duration: CMTime) -> Self {
75 unsafe { CMTimeRangeMake(start, duration) }
76 }
77
78 #[inline]
79 pub fn get_union(&self, other: CMTimeRange) -> CMTimeRange {
80 unsafe { CMTimeRangeGetUnion(*self, other) }
81 }
82
83 #[inline]
84 pub fn get_intersection(&self, other: CMTimeRange) -> CMTimeRange {
85 unsafe { CMTimeRangeGetIntersection(*self, other) }
86 }
87
88 #[inline]
89 pub fn equal(&self, other: CMTimeRange) -> bool {
90 unsafe { CMTimeRangeEqual(*self, other) != 0 }
91 }
92
93 #[inline]
94 pub fn contains_time(&self, time: CMTime) -> bool {
95 unsafe { CMTimeRangeContainsTime(*self, time) != 0 }
96 }
97
98 #[inline]
99 pub fn contains_time_range(&self, other: CMTimeRange) -> bool {
100 unsafe { CMTimeRangeContainsTimeRange(*self, other) != 0 }
101 }
102
103 #[inline]
104 pub fn get_end(&self) -> CMTime {
105 unsafe { CMTimeRangeGetEnd(*self) }
106 }
107
108 #[inline]
109 pub fn copy_as_dictionary(&self) -> Option<CFDictionary<CFString, CFDictionary<CFString, CFNumber>>> {
110 unsafe {
111 let dict = CMTimeRangeCopyAsDictionary(*self, kCFAllocatorDefault);
112 if dict.is_null() {
113 None
114 } else {
115 Some(TCFType::wrap_under_create_rule(dict))
116 }
117 }
118 }
119
120 #[inline]
121 pub fn make_from_dictionary(dict: &CFDictionary<CFString, CFDictionary<CFString, CFNumber>>) -> Self {
122 unsafe { CMTimeRangeMakeFromDictionary(dict.as_concrete_TypeRef()) }
123 }
124
125 #[inline]
126 pub fn copy_description(&self) -> Option<CFString> {
127 unsafe {
128 let description = CMTimeRangeCopyDescription(kCFAllocatorDefault, *self);
129 if description.is_null() {
130 None
131 } else {
132 Some(TCFType::wrap_under_create_rule(description))
133 }
134 }
135 }
136
137 #[inline]
138 pub fn show(&self) {
139 unsafe { CMTimeRangeShow(*self) }
140 }
141}
142
143impl CMTimeMapping {
144 #[inline]
145 pub fn make(source: CMTimeRange, target: CMTimeRange) -> Self {
146 unsafe { CMTimeMappingMake(source, target) }
147 }
148
149 #[inline]
150 pub fn make_empty(target: CMTimeRange) -> Self {
151 unsafe { CMTimeMappingMakeEmpty(target) }
152 }
153
154 #[inline]
155 pub fn copy_as_dictionary(&self) -> Option<CFDictionary<CFString, CFDictionary<CFString, CFDictionary<CFString, CFNumber>>>> {
156 unsafe {
157 let dict = CMTimeMappingCopyAsDictionary(*self, kCFAllocatorDefault);
158 if dict.is_null() {
159 None
160 } else {
161 Some(TCFType::wrap_under_create_rule(dict))
162 }
163 }
164 }
165
166 #[inline]
167 pub fn make_from_dictionary(dict: &CFDictionary<CFString, CFDictionary<CFString, CFDictionary<CFString, CFNumber>>>) -> Self {
168 unsafe { CMTimeMappingMakeFromDictionary(dict.as_concrete_TypeRef()) }
169 }
170
171 #[inline]
172 pub fn copy_description(&self) -> Option<CFString> {
173 unsafe {
174 let description = CMTimeMappingCopyDescription(kCFAllocatorDefault, *self);
175 if description.is_null() {
176 None
177 } else {
178 Some(TCFType::wrap_under_create_rule(description))
179 }
180 }
181 }
182
183 #[inline]
184 pub fn show(&self) {
185 unsafe { CMTimeMappingShow(*self) }
186 }
187}