• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
4 // Digital Ltd. LLC
5 //
6 // All rights reserved.
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are
10 // met:
11 // *       Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // *       Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 // *       Neither the name of Industrial Light & Magic nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 ///////////////////////////////////////////////////////////////////////////
34 
35 
36 #ifndef INCLUDED_IMF_TIME_CODE_H
37 #define INCLUDED_IMF_TIME_CODE_H
38 
39 //-----------------------------------------------------------------------------
40 //
41 //	class TimeCode
42 //
43 // 	A TimeCode object stores time and control codes as described
44 // 	in SMPTE standard 12M-1999.  A TimeCode object contains the
45 // 	following fields:
46 //
47 // 	    Time Address:
48 //
49 //		hours			integer, range 0 - 23
50 //		minutes			integer, range 0 - 59
51 //		seconds			integer, range 0 - 59
52 //		frame 			integer, range 0 - 29
53 //
54 // 	    Flags:
55 //
56 // 		drop frame flag		boolean
57 //		color frame flag	boolean
58 //		field/phase flag	boolean
59 //		bgf0			boolean
60 //		bgf1			boolean
61 //		bgf2			boolean
62 //
63 // 	    Binary groups for user-defined data and control codes:
64 //
65 //		binary group 1		integer, range 0 - 15
66 //		binary group 2		integer, range 0 - 15
67 //		...
68 //		binary group 8		integer, range 0 - 15
69 //
70 //	Class TimeCode contains methods to convert between the fields
71 //	listed above and a more compact representation where the fields
72 //	are packed into two unsigned 32-bit integers.  In the packed
73 //	integer representations, bit 0 is the least significant bit,
74 //	and bit 31 is the most significant bit of the integer value.
75 //
76 //	The time address and flags fields can be packed in three
77 //	different ways:
78 //
79 //	      bits	packing for	  packing for	    packing for
80 //	    		24-frame 	  60-field 	    50-field
81 //	    		film		  television	    television
82 //
83 //	     0 -  3	frame units	  frame units	    frame units
84 //	     4 -  5	frame tens	  frame tens	    frame tens
85 //	     6		unused, set to 0  drop frame flag   unused, set to 0
86 //	     7		unused, set to 0  color frame flag  color frame flag
87 //	     8 - 11	seconds units	  seconds units	    seconds units
88 //	    12 - 14	seconds tens	  seconds tens	    seconds tens
89 //	    15		phase flag	  field/phase flag  bgf0
90 //	    16 - 19	minutes units	  minutes units	    minutes units
91 //	    20 - 22	minutes tens	  minutes tens	    minutes tens
92 //	    23		bgf0		  bgf0		    bgf2
93 //	    24 - 27	hours units	  hours units	    hours units
94 //	    28 - 29	hours tens	  hours tens	    hours tens
95 //	    30		bgf1		  bgf1		    bgf1
96 //	    31		bgf2		  bgf2		    field/phase flag
97 //
98 //	User-defined data and control codes are packed as follows:
99 //
100 //	      bits	field
101 //
102 //	     0 -  3	binary group 1
103 //	     4 -  7	binary group 2
104 //	     8 - 11	binary group 3
105 //	    12 - 15	binary group 4
106 //	    16 - 19	binary group 5
107 //	    20 - 23	binary group 6
108 //	    24 - 27	binary group 7
109 //	    28 - 31	binary group 8
110 //
111 //-----------------------------------------------------------------------------
112 
113 namespace Imf {
114 
115 
116 class TimeCode
117 {
118   public:
119 
120     //---------------------
121     // Bit packing variants
122     //---------------------
123 
124     enum Packing
125     {
126     TV60_PACKING,		// packing for 60-field television
127     TV50_PACKING,		// packing for 50-field television
128     FILM24_PACKING		// packing for 24-frame film
129     };
130 
131 
132     //-------------------------------------
133     // Constructors and assignment operator
134     //-------------------------------------
135 
136     TimeCode ();  // all fields set to 0 or false
137 
138     TimeCode (int hours,
139           int minutes,
140           int seconds,
141           int frame,
142           bool dropFrame = false,
143           bool colorFrame = false,
144           bool fieldPhase = false,
145           bool bgf0 = false,
146           bool bgf1 = false,
147           bool bgf2 = false,
148           int binaryGroup1 = 0,
149           int binaryGroup2 = 0,
150           int binaryGroup3 = 0,
151           int binaryGroup4 = 0,
152           int binaryGroup5 = 0,
153           int binaryGroup6 = 0,
154           int binaryGroup7 = 0,
155           int binaryGroup8 = 0);
156 
157     TimeCode (unsigned int timeAndFlags,
158           unsigned int userData = 0,
159           Packing packing = TV60_PACKING);
160 
161     TimeCode (const TimeCode &other);
162 
163     TimeCode & operator = (const TimeCode &other);
164 
165 
166     //----------------------------
167     // Access to individual fields
168     //----------------------------
169 
170     int		hours () const;
171     void	setHours (int value);
172 
173     int		minutes () const;
174     void	setMinutes (int value);
175 
176     int		seconds () const;
177     void	setSeconds (int value);
178 
179     int		frame () const;
180     void	setFrame (int value);
181 
182     bool	dropFrame () const;
183     void	setDropFrame (bool value);
184 
185     bool	colorFrame () const;
186     void	setColorFrame (bool value);
187 
188     bool	fieldPhase () const;
189     void	setFieldPhase (bool value);
190 
191     bool	bgf0 () const;
192     void	setBgf0 (bool value);
193 
194     bool	bgf1 () const;
195     void	setBgf1 (bool value);
196 
197     bool	bgf2 () const;
198     void	setBgf2 (bool value);
199 
200     int		binaryGroup (int group) const; // group must be between 1 and 8
201     void	setBinaryGroup (int group, int value);
202 
203 
204     //---------------------------------
205     // Access to packed representations
206     //---------------------------------
207 
208     unsigned int	timeAndFlags (Packing packing = TV60_PACKING) const;
209 
210     void		setTimeAndFlags (unsigned int value,
211                      Packing packing = TV60_PACKING);
212 
213     unsigned int	userData () const;
214 
215     void		setUserData (unsigned int value);
216 
217   private:
218 
219     unsigned int	_time;
220     unsigned int	_user;
221 };
222 
223 
224 } // namespace Imf
225 
226 #endif
227