Update to 2.0.0 tree from current Fremantle build
[opencv] / 3rdparty / include / OpenEXR / ImfTimeCode.h
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