///////////////////////////////////////////////////////////////////////////////
//
//  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;
    std::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 std::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 std::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 std::string&, std::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
