Logo Search packages:      
Sourcecode: openexr version File versions  Download package

ImfTimeCode.h

///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
// Digital Ltd. LLC
// 
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
// *       Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// *       Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// *       Neither the name of Industrial Light & Magic nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission. 
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////


#ifndef INCLUDED_IMF_TIME_CODE_H
#define INCLUDED_IMF_TIME_CODE_H

//-----------------------------------------------------------------------------
//
//    class TimeCode
//    
//    A TimeCode object stores time and control codes as described
//    in SMPTE standard 12M-1999.  A TimeCode object contains the
//    following fields:
//
//        Time Address:
//
//          hours             integer, range 0 - 23
//          minutes                 integer, range 0 - 59
//          seconds                 integer, range 0 - 59
//          frame                   integer, range 0 - 29
//
//        Flags:
//
//          drop frame flag         boolean
//          color frame flag  boolean
//          field/phase flag  boolean
//          bgf0              boolean
//          bgf1              boolean
//          bgf2              boolean
//
//        Binary groups for user-defined data and control codes:
//
//          binary group 1          integer, range 0 - 15
//          binary group 2          integer, range 0 - 15
//          ...
//          binary group 8          integer, range 0 - 15
//
//    Class TimeCode contains methods to convert between the fields
//    listed above and a more compact representation where the fields
//    are packed into two unsigned 32-bit integers.  In the packed
//    integer representations, bit 0 is the least significant bit,
//    and bit 31 is the most significant bit of the integer value.
//
//    The time address and flags fields can be packed in three
//    different ways:
//
//          bits  packing for   packing for         packing for
//                24-frame      60-field      50-field
//                film          television          television
//
//         0 -  3 frame units   frame units         frame units
//         4 -  5 frame tens    frame tens          frame tens
//         6            unused, set to 0  drop frame flag   unused, set to 0
//         7            unused, set to 0  color frame flag  color frame flag
//         8 - 11 seconds units       seconds units       seconds units
//        12 - 14 seconds tens        seconds tens        seconds tens
//        15            phase flag    field/phase flag  bgf0
//        16 - 19 minutes units       minutes units       minutes units
//        20 - 22 minutes tens        minutes tens        minutes tens
//        23            bgf0          bgf0                bgf2
//        24 - 27 hours units   hours units         hours units
//        28 - 29 hours tens    hours tens          hours tens
//        30            bgf1          bgf1                bgf1
//        31            bgf2          bgf2                field/phase flag
//
//    User-defined data and control codes are packed as follows:
//
//          bits  field
//
//         0 -  3 binary group 1
//         4 -  7 binary group 2
//         8 - 11 binary group 3
//        12 - 15 binary group 4
//        16 - 19 binary group 5
//        20 - 23 binary group 6
//        24 - 27 binary group 7
//        28 - 31 binary group 8
//
//-----------------------------------------------------------------------------

namespace Imf {

   
class TimeCode
{
  public:

    //---------------------
    // Bit packing variants
    //---------------------

    enum Packing
    {
      TV60_PACKING,           // packing for 60-field television
      TV50_PACKING,           // packing for 50-field television
      FILM24_PACKING          // packing for 24-frame film
    };


    //-------------------------------------
    // Constructors and assignment operator
    //-------------------------------------

    TimeCode ();  // all fields set to 0 or false

    TimeCode (int hours,
            int minutes,
            int seconds,
            int frame,
            bool dropFrame = false,
            bool colorFrame = false,
            bool fieldPhase = false,
            bool bgf0 = false,
            bool bgf1 = false,
            bool bgf2 = false,
            int binaryGroup1 = 0,
            int binaryGroup2 = 0,
            int binaryGroup3 = 0,
            int binaryGroup4 = 0,
            int binaryGroup5 = 0,
            int binaryGroup6 = 0,
            int binaryGroup7 = 0,
            int binaryGroup8 = 0);

    TimeCode (unsigned int timeAndFlags,
            unsigned int userData = 0,
            Packing packing = TV60_PACKING);

    TimeCode (const TimeCode &other);

    TimeCode & operator = (const TimeCode &other);


    //----------------------------
    // Access to individual fields
    //----------------------------

    int           hours () const;
    void    setHours (int value);

    int           minutes () const;
    void    setMinutes (int value);

    int           seconds () const;
    void    setSeconds (int value);

    int           frame () const;
    void    setFrame (int value);

    bool    dropFrame () const;
    void    setDropFrame (bool value);

    bool    colorFrame () const;
    void    setColorFrame (bool value);

    bool    fieldPhase () const;
    void    setFieldPhase (bool value);

    bool    bgf0 () const;
    void    setBgf0 (bool value);

    bool    bgf1 () const;
    void    setBgf1 (bool value);

    bool    bgf2 () const;
    void    setBgf2 (bool value);

    int           binaryGroup (int group) const; // group must be between 1 and 8
    void    setBinaryGroup (int group, int value);

    
    //---------------------------------
    // Access to packed representations
    //---------------------------------

    unsigned int  timeAndFlags (Packing packing = TV60_PACKING) const;

    void          setTimeAndFlags (unsigned int value,
                               Packing packing = TV60_PACKING);

    unsigned int  userData () const;

    void          setUserData (unsigned int value);

  private:

    unsigned int  _time;
    unsigned int  _user;
};


} // namespace Imf

#endif

Generated by  Doxygen 1.6.0   Back to index