core_media/
time_range.rs

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}