diff options
Diffstat (limited to 'libutil/Timecode.h')
-rw-r--r-- | libutil/Timecode.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/libutil/Timecode.h b/libutil/Timecode.h new file mode 100644 index 0000000..dd164e6 --- /dev/null +++ b/libutil/Timecode.h @@ -0,0 +1,119 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// The contents of this file are subject to the Mozilla Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations +// under the License. +// +// The Original Code is MP4v2. +// +// The Initial Developer of the Original Code is Kona Blend. +// Portions created by Kona Blend are Copyright (C) 2008. +// All Rights Reserved. +// +// Contributors: +// Kona Blend, kona8lend@@gmail.com +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef MP4V2_UTIL_TIMECODE_H +#define MP4V2_UTIL_TIMECODE_H + +namespace mp4v2 { namespace util { + +/////////////////////////////////////////////////////////////////////////////// + +/// Class representing SMPTE timecode. +/// +/// Objects of this class represent a specific time or duration and can +/// be converted to/from string values, and various epochs. +/// +/// The standard pattern for string representation is as follows: +/// @li HH:MM:SS:FF +/// @li HH:MM:SS.DDD +/// +/// where: +/// @li <b>HH</b> specifies hours +/// @li <b>MM</b> specifies minutes +/// @li <b>SS</b> specifies seconds +/// @li <b>:</b> specifies normal timecode +/// @li <b>FF</b> specifies the frame number +/// @li <b>.</b> specifies decimal fractions of a second follow +/// @li <b>DDD</b> specifies decimal fractions of a second, rounded down to closest scale +/// +class MP4V2_EXPORT Timecode { +public: + enum Format { + FRAME, + DECIMAL, + }; + +private: + double _scale; + uint64_t _duration; + Format _format; + string _svalue; + + uint64_t _hours; + uint64_t _minutes; + uint64_t _seconds; + uint64_t _subseconds; + +public: + const double& scale; + const uint64_t& duration; + const Format& format; + const string& svalue; + + const uint64_t& hours; + const uint64_t& minutes; + const uint64_t& seconds; + const uint64_t& subseconds; + +public: + Timecode( const Timecode& ); + explicit Timecode( const string&, double = 1.0 ); + explicit Timecode( uint64_t = 0, double = 1.0 ); + + Timecode& operator= ( const Timecode& ); + Timecode& operator+= ( const Timecode& ); + Timecode& operator-= ( const Timecode& ); + + bool operator< ( const Timecode& ) const; + bool operator<= ( const Timecode& ) const; + bool operator> ( const Timecode& ) const; + bool operator>= ( const Timecode& ) const; + bool operator!= ( const Timecode& ) const; + bool operator== ( const Timecode& ) const; + + Timecode operator+ ( const Timecode& ) const; + Timecode operator- ( const Timecode& ) const; + + bool parse( const string&, string* = NULL ); + + void reset(); + + void setScale ( double ); + void setDuration ( uint64_t, double = 0.0 ); + void setFormat ( Format ); + + void setHours ( uint64_t ); + void setMinutes ( uint64_t ); + void setSeconds ( uint64_t ); + void setSubseconds ( uint64_t ); + +private: + uint64_t convertDuration( const Timecode& ) const; + void recompute(); +}; + +/////////////////////////////////////////////////////////////////////////////// + +}} // namespace mp4v2::util + +#endif // MP4V2_UTIL_TIMECODE_H |