12
13
using MonoMac.ObjCRuntime;
14
15
namespace MonoMac.CoreMedia {
16
[StructLayout(LayoutKind.Sequential)]
17
public struct CMTime {
25
ImpliedValueFlagsMask = 28
28
public static CMTime Invalid = new CMTime (0);
29
const Flags kIndefinite = Flags.Valid | Flags.Indefinite;
30
public static CMTime Indefinite = new CMTime (kIndefinite);
31
const Flags kPositive = Flags.Valid | Flags.PositiveInfinity;
32
public static CMTime PositiveInfinity = new CMTime (kPositive);
33
const Flags kNegative = Flags.Valid | Flags.NegativeInfinity;
34
public static CMTime NegativeInfinity = new CMTime (kNegative);
35
public static CMTime Zero = new CMTime (Flags.Valid, 1);
37
public const int MaxTimeScale = 0x7fffffff;
40
public Flags TimeFlags;
41
public long TimeEpoch;
51
CMTime (Flags f, int timescale)
54
TimeScale = timescale;
59
public CMTime (long value, int timescale)
62
TimeScale = timescale;
63
TimeFlags = Flags.Valid;
67
public CMTime (long value, int timescale, long epoch)
70
TimeScale = timescale;
71
TimeFlags = Flags.Valid;
75
public bool IsInvalid {
77
return (TimeFlags & Flags.Valid) == 0;
81
public bool IsIndefinite {
83
return (TimeFlags & kIndefinite) == kIndefinite;
87
public bool IsPositiveInfinity {
89
return (TimeFlags & kPositive) == kPositive;
93
public bool IsNegativeInfinity {
95
return (TimeFlags & kNegative) == kNegative;
99
[DllImport(Constants.CoreMediaLibrary)]
100
extern static CMTime CMTimeAbsoluteValue (CMTime time);
102
public CMTime AbsoluteValue {
104
return CMTimeAbsoluteValue (this);
108
[DllImport(Constants.CoreMediaLibrary)]
109
extern static int CMTimeCompare (CMTime time1, CMTime time2);
110
public static int Compare (CMTime time1, CMTime time2)
112
return CMTimeCompare (time1, time2);
115
public static bool operator == (CMTime time1, CMTime time2)
117
return Compare (time1, time2) == 0;
120
public static bool operator != (CMTime time1, CMTime time2)
122
return !(time1 == time2);
125
public override bool Equals (object obj)
127
if (!(obj is CMTime))
130
CMTime other = (CMTime) obj;
131
return other == this;
134
public override int GetHashCode ()
136
return Value.GetHashCode () ^ TimeScale.GetHashCode () ^ TimeFlags.GetHashCode () ^ TimeEpoch.GetHashCode ();
139
[DllImport(Constants.CoreMediaLibrary)]
140
extern static CMTime CMTimeAdd (CMTime addend1, CMTime addend2);
141
public static CMTime Add (CMTime time1, CMTime time2)
143
return CMTimeAdd (time1, time2);
146
[DllImport(Constants.CoreMediaLibrary)]
147
extern static CMTime CMTimeSubtract (CMTime minuend, CMTime subtraend);
148
public static CMTime Subtract (CMTime minuend, CMTime subtraend)
150
return CMTimeSubtract (minuend, subtraend);
153
[DllImport(Constants.CoreMediaLibrary)]
154
extern static CMTime CMTimeMultiply (CMTime time, int multiplier);
155
public static CMTime Multiply (CMTime time, int multiplier)
157
return CMTimeMultiply (time, multiplier);
160
[DllImport(Constants.CoreMediaLibrary)]
161
extern static CMTime CMTimeMultiplyByFloat64 (CMTime time, double multiplier);
162
public static CMTime Multiply (CMTime time, double multiplier)
164
return CMTimeMultiplyByFloat64 (time, multiplier);
167
public static CMTime operator + (CMTime time1, CMTime time2)
169
return Add (time1, time2);
172
public static CMTime operator - (CMTime minuend, CMTime subtraend)
174
return Subtract (minuend, subtraend);
177
public static CMTime operator * (CMTime time, int multiplier)
179
return Multiply (time, multiplier);
182
public static CMTime operator * (CMTime time, double multiplier)
184
return Multiply (time, multiplier);
187
[DllImport(Constants.CoreMediaLibrary)]
188
extern static CMTime CMTimeConvertScale (CMTime time, int newScale, CMTimeRoundingMethod method);
189
public CMTime ConvertScale (int newScale, CMTimeRoundingMethod method)
191
return CMTimeConvertScale (this, newScale, method);
194
[DllImport(Constants.CoreMediaLibrary)]
195
extern static double CMTimeGetSeconds (CMTime time);
196
public double Seconds {
198
return CMTimeGetSeconds (this);
202
[DllImport(Constants.CoreMediaLibrary)]
203
extern static CMTime CMTimeMakeWithSeconds (double seconds, int preferredTimeScale);
204
public static CMTime FromSeconds (double seconds, int preferredTimeScale)
206
return CMTimeMakeWithSeconds (seconds, preferredTimeScale);
209
[DllImport(Constants.CoreMediaLibrary)]
210
extern static CMTime CMTimeMaximum (CMTime time1, CMTime time2);
211
public static CMTime GetMaximum (CMTime time1, CMTime time2)
213
return CMTimeMaximum (time1, time2);
216
[DllImport(Constants.CoreMediaLibrary)]
217
extern static CMTime CMTimeMinimum (CMTime time1, CMTime time2);
218
public static CMTime GetMinimum (CMTime time1, CMTime time2)
220
return CMTimeMinimum (time1, time2);
223
public readonly static NSString ValueKey;
224
public readonly static NSString ScaleKey;
225
public readonly static NSString EpochKey;
226
public readonly static NSString FlagsKey;
230
var lib = Dlfcn.dlopen (Constants.CoreMediaLibrary, 0);
231
if (lib != IntPtr.Zero) {
233
ValueKey = Dlfcn.GetStringConstant (lib, "kCMTimeValueKey");
234
ScaleKey = Dlfcn.GetStringConstant (lib, "kCMTimeScaleKey");
235
EpochKey = Dlfcn.GetStringConstant (lib, "kCMTimeEpochKey");
236
FlagsKey = Dlfcn.GetStringConstant (lib, "kCMTimeFlagsKey");
243
[DllImport(Constants.CoreMediaLibrary)]
244
extern static IntPtr CMTimeCopyAsDictionary (CMTime time, IntPtr allocator);
245
public IntPtr AsDictionary {
247
return CMTimeCopyAsDictionary (this, IntPtr.Zero);
251
[DllImport(Constants.CoreMediaLibrary)]
252
extern static IntPtr CMTimeCopyDescription (IntPtr allocator, CMTime time);
253
public string Description {
255
return NSString.FromHandle (CMTimeCopyDescription (IntPtr.Zero, this)).ToString ();
259
public override string ToString ()
264
[DllImport(Constants.CoreMediaLibrary)]
265
extern static CMTime CMTimeMakeFromDictionary (IntPtr dict);
266
public static CMTime FromDictionary (IntPtr dict)
268
return CMTimeMakeFromDictionary (dict);
271
// Should we also bind CMTimeShow?
274
17
public enum CMMediaType : uint
280
23
ClosedCaption = 1668047728, // 'clcp'
281
24
Subtitle = 1935832172, // 'sbtl'
282
25
TimeCode = 1953325924, // 'tmcd'
26
// [Obsolete ("Use Metadata instead")]
283
27
TimedMetadata = 1953326452, // 'tmet'
28
Metadata = TimedMetadata,
31
public enum CMClosedCaptionFormatType : uint
33
CEA608 = 0x63363038, // 'c608',
34
CEA708 = 0x63373038, // 'c708',
35
ATSC = 0x61746363, // 'atcc'
38
public enum CMMuxedStreamType : uint
40
MPEG1System = 0x6D703173, // 'mp1s',
41
MPEG2Transport = 0x6D703274, // 'mp2t',
42
MPEG2Program = 0x6D703270, // 'mp2p',
43
DV = 0x64762020, // 'dv '
46
public enum CMSubtitleFormatType : uint
48
Text3G = 0x74783367, // 'tx3g'
49
WebVTT = 0x77767474, // 'wvtt'
52
public enum CMMetadataFormatType : uint
54
ICY = 0x69637920, // 'icy '
55
ID3 = 0x69643320, // 'id3 '
56
Boxed = 0x6d656278, // 'mebx'
59
public enum CMTimeCodeFormatType : uint
61
TimeCode32 = 0x746D6364, // 'tmcd',
62
TimeCode64 = 0x74633634, // 'tc64',
63
Counter32 = 0x636E3332, // 'cn32',
64
Counter64 = 0x636E3634, // 'cn64'
286
67
public enum CMTimeRoundingMethod
288
69
RoundHalfAwayFromZero = 1,