Blame IlmImf/ImfTimeCode.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
Packit Service 6754ca
// Digital Ltd. LLC
Packit Service 6754ca
// 
Packit Service 6754ca
// All rights reserved.
Packit Service 6754ca
// 
Packit Service 6754ca
// Redistribution and use in source and binary forms, with or without
Packit Service 6754ca
// modification, are permitted provided that the following conditions are
Packit Service 6754ca
// met:
Packit Service 6754ca
// *       Redistributions of source code must retain the above copyright
Packit Service 6754ca
// notice, this list of conditions and the following disclaimer.
Packit Service 6754ca
// *       Redistributions in binary form must reproduce the above
Packit Service 6754ca
// copyright notice, this list of conditions and the following disclaimer
Packit Service 6754ca
// in the documentation and/or other materials provided with the
Packit Service 6754ca
// distribution.
Packit Service 6754ca
// *       Neither the name of Industrial Light & Magic nor the names of
Packit Service 6754ca
// its contributors may be used to endorse or promote products derived
Packit Service 6754ca
// from this software without specific prior written permission. 
Packit Service 6754ca
// 
Packit Service 6754ca
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 6754ca
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 6754ca
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 6754ca
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 6754ca
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 6754ca
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 6754ca
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 6754ca
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 6754ca
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 6754ca
//
Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
//
Packit Service 6754ca
//	class TimeCode
Packit Service 6754ca
// 	
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
#include <ImfTimeCode.h>
Packit Service 6754ca
#include "Iex.h"
Packit Service 6754ca
#include "ImfNamespace.h"
Packit Service 6754ca
Packit Service 6754ca
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
Packit Service 6754ca
Packit Service 6754ca
   
Packit Service 6754ca
TimeCode::TimeCode ()
Packit Service 6754ca
{
Packit Service 6754ca
    _time = 0;
Packit Service 6754ca
    _user = 0;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
TimeCode::TimeCode
Packit Service 6754ca
    (int hours,
Packit Service 6754ca
     int minutes,
Packit Service 6754ca
     int seconds,
Packit Service 6754ca
     int frame,
Packit Service 6754ca
     bool dropFrame,
Packit Service 6754ca
     bool colorFrame,
Packit Service 6754ca
     bool fieldPhase,
Packit Service 6754ca
     bool bgf0,
Packit Service 6754ca
     bool bgf1,
Packit Service 6754ca
     bool bgf2,
Packit Service 6754ca
     int binaryGroup1,
Packit Service 6754ca
     int binaryGroup2,
Packit Service 6754ca
     int binaryGroup3,
Packit Service 6754ca
     int binaryGroup4,
Packit Service 6754ca
     int binaryGroup5,
Packit Service 6754ca
     int binaryGroup6,
Packit Service 6754ca
     int binaryGroup7,
Packit Service 6754ca
     int binaryGroup8)
Packit Service 6754ca
{
Packit Service 6754ca
    setHours (hours);
Packit Service 6754ca
    setMinutes (minutes);
Packit Service 6754ca
    setSeconds (seconds);
Packit Service 6754ca
    setFrame (frame);
Packit Service 6754ca
    setDropFrame (dropFrame);
Packit Service 6754ca
    setColorFrame (colorFrame);
Packit Service 6754ca
    setFieldPhase (fieldPhase);
Packit Service 6754ca
    setBgf0 (bgf0);
Packit Service 6754ca
    setBgf1 (bgf1);
Packit Service 6754ca
    setBgf2 (bgf2);
Packit Service 6754ca
    setBinaryGroup (1, binaryGroup1);
Packit Service 6754ca
    setBinaryGroup (2, binaryGroup2);
Packit Service 6754ca
    setBinaryGroup (3, binaryGroup3);
Packit Service 6754ca
    setBinaryGroup (4, binaryGroup4);
Packit Service 6754ca
    setBinaryGroup (5, binaryGroup5);
Packit Service 6754ca
    setBinaryGroup (6, binaryGroup6);
Packit Service 6754ca
    setBinaryGroup (7, binaryGroup7);
Packit Service 6754ca
    setBinaryGroup (8, binaryGroup8);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
TimeCode::TimeCode
Packit Service 6754ca
    (unsigned int timeAndFlags,
Packit Service 6754ca
     unsigned int userData,
Packit Service 6754ca
     Packing packing)
Packit Service 6754ca
{
Packit Service 6754ca
    setTimeAndFlags (timeAndFlags, packing);
Packit Service 6754ca
    setUserData (userData);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
TimeCode::TimeCode (const TimeCode &other)
Packit Service 6754ca
{
Packit Service 6754ca
    _time = other._time;
Packit Service 6754ca
    _user = other._user;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
TimeCode &
Packit Service 6754ca
TimeCode::operator = (const TimeCode &other)
Packit Service 6754ca
{
Packit Service 6754ca
    _time = other._time;
Packit Service 6754ca
    _user = other._user;
Packit Service 6754ca
    return *this;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
    
Packit Service 6754ca
bool
Packit Service 6754ca
TimeCode::operator == (const TimeCode & c) const
Packit Service 6754ca
{
Packit Service 6754ca
    return (_time == c._time && _user == c._user);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
bool
Packit Service 6754ca
TimeCode::operator != (const TimeCode & c) const
Packit Service 6754ca
{
Packit Service 6754ca
    return (_time != c._time || _user != c._user);
Packit Service 6754ca
}
Packit Service 6754ca
    
Packit Service 6754ca
    
Packit Service 6754ca
Packit Service 6754ca
namespace {
Packit Service 6754ca
Packit Service 6754ca
unsigned int
Packit Service 6754ca
bitField (unsigned int value, int minBit, int maxBit)
Packit Service 6754ca
{
Packit Service 6754ca
    int shift = minBit;
Packit Service 6754ca
    unsigned int mask = (~(~0U << (maxBit - minBit + 1)) << minBit);
Packit Service 6754ca
    return (value & mask) >> shift;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
setBitField (unsigned int &value, int minBit, int maxBit, unsigned int field)
Packit Service 6754ca
{
Packit Service 6754ca
    int shift = minBit;
Packit Service 6754ca
    unsigned int mask = (~(~0U << (maxBit - minBit + 1)) << minBit);
Packit Service 6754ca
    value = ((value & ~mask) | ((field << shift) & mask));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
int
Packit Service 6754ca
bcdToBinary (unsigned int bcd)
Packit Service 6754ca
{
Packit Service 6754ca
    return int ((bcd & 0x0f) + 10 * ((bcd >> 4) & 0x0f));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
unsigned int
Packit Service 6754ca
binaryToBcd (int binary)
Packit Service 6754ca
{
Packit Service 6754ca
    int units = binary % 10;
Packit Service 6754ca
    int tens = (binary / 10) % 10;
Packit Service 6754ca
    return (unsigned int) (units | (tens << 4));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
} // namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
int
Packit Service 6754ca
TimeCode::hours () const
Packit Service 6754ca
{
Packit Service 6754ca
    return bcdToBinary (bitField (_time, 24, 29));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setHours (int value)
Packit Service 6754ca
{
Packit Service 6754ca
    if (value < 0 || value > 23)
Packit Service 6754ca
	throw IEX_NAMESPACE::ArgExc ("Cannot set hours field in time code. "
Packit Service 6754ca
			   "New value is out of range.");
Packit Service 6754ca
Packit Service 6754ca
    setBitField (_time, 24, 29, binaryToBcd (value));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
int
Packit Service 6754ca
TimeCode::minutes () const
Packit Service 6754ca
{
Packit Service 6754ca
    return bcdToBinary (bitField (_time, 16, 22));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setMinutes (int value)
Packit Service 6754ca
{
Packit Service 6754ca
    if (value < 0 || value > 59)
Packit Service 6754ca
	throw IEX_NAMESPACE::ArgExc ("Cannot set minutes field in time code. "
Packit Service 6754ca
			   "New value is out of range.");
Packit Service 6754ca
Packit Service 6754ca
    setBitField (_time, 16, 22, binaryToBcd (value));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
int
Packit Service 6754ca
TimeCode::seconds () const
Packit Service 6754ca
{
Packit Service 6754ca
    return bcdToBinary (bitField (_time, 8, 14));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setSeconds (int value)
Packit Service 6754ca
{
Packit Service 6754ca
    if (value < 0 || value > 59)
Packit Service 6754ca
	throw IEX_NAMESPACE::ArgExc ("Cannot set seconds field in time code. "
Packit Service 6754ca
			   "New value is out of range.");
Packit Service 6754ca
Packit Service 6754ca
    setBitField (_time, 8, 14, binaryToBcd (value));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
int
Packit Service 6754ca
TimeCode::frame () const
Packit Service 6754ca
{
Packit Service 6754ca
    return bcdToBinary (bitField (_time, 0, 5));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setFrame (int value)
Packit Service 6754ca
{
Packit Service 6754ca
    if (value < 0 || value > 59)
Packit Service 6754ca
	throw IEX_NAMESPACE::ArgExc ("Cannot set frame field in time code. "
Packit Service 6754ca
			   "New value is out of range.");
Packit Service 6754ca
Packit Service 6754ca
    setBitField (_time, 0, 5, binaryToBcd (value));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
bool
Packit Service 6754ca
TimeCode::dropFrame () const
Packit Service 6754ca
{
Packit Service 6754ca
    return !!bitField (_time, 6, 6);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setDropFrame (bool value)
Packit Service 6754ca
{
Packit Service 6754ca
    setBitField (_time, 6, 6, (unsigned int) !!value);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
bool
Packit Service 6754ca
TimeCode::colorFrame () const
Packit Service 6754ca
{
Packit Service 6754ca
    return !!bitField (_time, 7, 7);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setColorFrame (bool value)
Packit Service 6754ca
{
Packit Service 6754ca
    setBitField (_time, 7, 7, (unsigned int) !!value);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
bool
Packit Service 6754ca
TimeCode::fieldPhase () const
Packit Service 6754ca
{
Packit Service 6754ca
    return !!bitField (_time, 15, 15);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setFieldPhase (bool value)
Packit Service 6754ca
{
Packit Service 6754ca
    setBitField (_time, 15, 15, (unsigned int) !!value);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
bool
Packit Service 6754ca
TimeCode::bgf0 () const
Packit Service 6754ca
{
Packit Service 6754ca
    return !!bitField (_time, 23, 23);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setBgf0 (bool value)
Packit Service 6754ca
{
Packit Service 6754ca
    setBitField (_time, 23, 23, (unsigned int) !!value);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
bool
Packit Service 6754ca
TimeCode::bgf1 () const
Packit Service 6754ca
{
Packit Service 6754ca
    return!!bitField (_time, 30, 30);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setBgf1 (bool value)
Packit Service 6754ca
{
Packit Service 6754ca
    setBitField (_time, 30, 30, (unsigned int) !!value);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
bool
Packit Service 6754ca
TimeCode::bgf2 () const
Packit Service 6754ca
{
Packit Service 6754ca
    return !!bitField (_time, 31, 31);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setBgf2 (bool value)
Packit Service 6754ca
{
Packit Service 6754ca
    setBitField (_time, 31, 31, (unsigned int) !!value);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
int
Packit Service 6754ca
TimeCode::binaryGroup (int group) const
Packit Service 6754ca
{
Packit Service 6754ca
    if (group < 1 || group > 8)
Packit Service 6754ca
	throw IEX_NAMESPACE::ArgExc ("Cannot extract binary group from time code "
Packit Service 6754ca
		           "user data.  Group number is out of range.");
Packit Service 6754ca
Packit Service 6754ca
    int minBit = 4 * (group - 1);
Packit Service 6754ca
    int maxBit = minBit + 3;
Packit Service 6754ca
    return int (bitField (_user, minBit, maxBit));
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setBinaryGroup (int group, int value)
Packit Service 6754ca
{
Packit Service 6754ca
    if (group < 1 || group > 8)
Packit Service 6754ca
	throw IEX_NAMESPACE::ArgExc ("Cannot extract binary group from time code "
Packit Service 6754ca
		           "user data.  Group number is out of range.");
Packit Service 6754ca
Packit Service 6754ca
    int minBit = 4 * (group - 1);
Packit Service 6754ca
    int maxBit = minBit + 3;
Packit Service 6754ca
    setBitField (_user, minBit, maxBit, (unsigned int) value);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
unsigned int
Packit Service 6754ca
TimeCode::timeAndFlags (Packing packing) const
Packit Service 6754ca
{
Packit Service 6754ca
    if (packing == TV50_PACKING)
Packit Service 6754ca
    {
Packit Service 6754ca
	unsigned int t = _time;
Packit Service 6754ca
Packit Service 6754ca
	t &= ~((1 << 6) | (1 << 15) | (1 << 23) | (1 << 30) | (1 << 31));
Packit Service 6754ca
Packit Service 6754ca
	t |= ((unsigned int) bgf0() << 15);
Packit Service 6754ca
	t |= ((unsigned int) bgf2() << 23);
Packit Service 6754ca
	t |= ((unsigned int) bgf1() << 30);
Packit Service 6754ca
	t |= ((unsigned int) fieldPhase() << 31);
Packit Service 6754ca
Packit Service 6754ca
	return t;
Packit Service 6754ca
    }
Packit Service 6754ca
    if (packing == FILM24_PACKING)
Packit Service 6754ca
    {
Packit Service 6754ca
	return _time & ~((1 << 6) | (1 << 7));
Packit Service 6754ca
    }
Packit Service 6754ca
    else // packing == TV60_PACKING
Packit Service 6754ca
    {
Packit Service 6754ca
	return _time;
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setTimeAndFlags (unsigned int value, Packing packing)
Packit Service 6754ca
{
Packit Service 6754ca
    if (packing == TV50_PACKING)
Packit Service 6754ca
    {
Packit Service 6754ca
	_time = value &
Packit Service 6754ca
		 ~((1 << 6) | (1 << 15) | (1 << 23) | (1 << 30) | (1 << 31));
Packit Service 6754ca
Packit Service 6754ca
	if (value & (1 << 15))
Packit Service 6754ca
	    setBgf0 (true);
Packit Service 6754ca
Packit Service 6754ca
	if (value & (1 << 23))
Packit Service 6754ca
	    setBgf2 (true);
Packit Service 6754ca
Packit Service 6754ca
	if (value & (1 << 30))
Packit Service 6754ca
	    setBgf1 (true);
Packit Service 6754ca
Packit Service 6754ca
	if (value & (1 << 31))
Packit Service 6754ca
	    setFieldPhase (true);
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (packing == FILM24_PACKING)
Packit Service 6754ca
    {
Packit Service 6754ca
	_time = value & ~((1 << 6) | (1 << 7));
Packit Service 6754ca
    }
Packit Service 6754ca
    else // packing == TV60_PACKING
Packit Service 6754ca
    {
Packit Service 6754ca
	_time = value;
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
unsigned int
Packit Service 6754ca
TimeCode::userData () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _user;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
TimeCode::setUserData (unsigned int value)
Packit Service 6754ca
{
Packit Service 6754ca
    _user = value;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT