ktime.h

Go to the documentation of this file.
00001 
00004 #ifndef FBXFILESDK_COMPONENTS_KBASELIB_KLIB_KTIME_H
00005 #define FBXFILESDK_COMPONENTS_KBASELIB_KLIB_KTIME_H
00006 
00007 /**************************************************************************************
00008 
00009  Copyright (C) 2001 - 2009 Autodesk, Inc. and/or its licensors.
00010  All Rights Reserved.
00011 
00012  The coded instructions, statements, computer programs, and/or related material 
00013  (collectively the "Data") in these files contain unpublished information 
00014  proprietary to Autodesk, Inc. and/or its licensors, which is protected by 
00015  Canada and United States of America federal copyright law and by international 
00016  treaties. 
00017  
00018  The Data may not be disclosed or distributed to third parties, in whole or in
00019  part, without the prior written consent of Autodesk, Inc. ("Autodesk").
00020 
00021  THE DATA IS PROVIDED "AS IS" AND WITHOUT WARRANTY.
00022  ALL WARRANTIES ARE EXPRESSLY EXCLUDED AND DISCLAIMED. AUTODESK MAKES NO
00023  WARRANTY OF ANY KIND WITH RESPECT TO THE DATA, EXPRESS, IMPLIED OR ARISING
00024  BY CUSTOM OR TRADE USAGE, AND DISCLAIMS ANY IMPLIED WARRANTIES OF TITLE, 
00025  NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR USE. 
00026  WITHOUT LIMITING THE FOREGOING, AUTODESK DOES NOT WARRANT THAT THE OPERATION
00027  OF THE DATA WILL BE UNINTERRUPTED OR ERROR FREE. 
00028  
00029  IN NO EVENT SHALL AUTODESK, ITS AFFILIATES, PARENT COMPANIES, LICENSORS
00030  OR SUPPLIERS ("AUTODESK GROUP") BE LIABLE FOR ANY LOSSES, DAMAGES OR EXPENSES
00031  OF ANY KIND (INCLUDING WITHOUT LIMITATION PUNITIVE OR MULTIPLE DAMAGES OR OTHER
00032  SPECIAL, DIRECT, INDIRECT, EXEMPLARY, INCIDENTAL, LOSS OF PROFITS, REVENUE
00033  OR DATA, COST OF COVER OR CONSEQUENTIAL LOSSES OR DAMAGES OF ANY KIND),
00034  HOWEVER CAUSED, AND REGARDLESS OF THE THEORY OF LIABILITY, WHETHER DERIVED
00035  FROM CONTRACT, TORT (INCLUDING, BUT NOT LIMITED TO, NEGLIGENCE), OR OTHERWISE,
00036  ARISING OUT OF OR RELATING TO THE DATA OR ITS USE OR ANY OTHER PERFORMANCE,
00037  WHETHER OR NOT AUTODESK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS
00038  OR DAMAGE. 
00039 
00040 **************************************************************************************/
00041 
00042 #include <fbxfilesdk/components/kbaselib/kbaselib_h.h>
00043 
00044 #include <fbxfilesdk/fbxfilesdk_nsbegin.h>
00045 
00046     //
00047 // Basic constants.
00048     //
00049 #define KTIME_INFINITE          KTime (K_LONGLONG( 0x7fffffffffffffff))
00050 #define KTIME_MINUS_INFINITE    KTime (K_LONGLONG(-0x7fffffffffffffff))
00051 #define KTIME_ZERO              KTime (0)
00052 #define KTIME_EPSILON           KTime (1)
00053 #define KTIME_ONE_SECOND        KTime (K_LONGLONG(46186158000))
00054     #define KTIME_ONE_MINUTE        KTime (K_LONGLONG(2771169480000))
00055     #define KTIME_ONE_HOUR          KTime (K_LONGLONG(166270168800000))
00056 
00057     #define KTIME_FIVE_SECONDS      KTime (K_LONGLONG(230930790000))
00058 #define KTIME_ASSERT_EPSILON    0.5
00059 
00060 KFBX_FORWARD(KTimeModeObject);
00061 
00065 class KFBX_DLL KTime 
00066 {
00067 
00068 public:
00069 
00073     KTime(kLongLong pTime=0) {mTime=pTime;}
00074 
00079 
00101     //
00102     // *** Affected files when adding new enum values ***
00103     // (ktimeinline.h kfcurveview.cxx, kaudioview.cxx, kvideoview.cxx, kttimespanviewoptical.cxx,
00104     //  kttimespanview.cxx, ktcameraswitchertimelinecontrol.cxx, fbxsdk(fpproperties.cxx) )
00105     //
00123     enum ETimeMode
00124     {
00125         eDEFAULT_MODE       = 0,
00126         eFRAMES120          = 1,
00127         eFRAMES100          = 2,
00128         eFRAMES60           = 3,
00129         eFRAMES50           = 4,
00130         eFRAMES48           = 5,
00131         eFRAMES30           = 6,
00132         eFRAMES30_DROP      = 7,
00133         eNTSC_DROP_FRAME    = 8,
00134         eNTSC_FULL_FRAME    = 9,
00135         ePAL                = 10,
00136         eCINEMA             = 11,
00137         eFRAMES1000         = 12,
00138         eCINEMA_ND      = 13,
00139         eCUSTOM             = 14,
00140         eTIME_MODE_COUNT    = 15
00141     };
00142 
00148     enum ETimeProtocol
00149     {
00150         eSMPTE,
00151         eFRAME,
00152         eDEFAULT_PROTOCOL,
00153         eTIME_PROTOCOL_COUNT
00154     };
00155 
00161     static void SetGlobalTimeMode(ETimeMode pTimeMode, double pFrameRate=0.0);
00162 
00167     static ETimeMode GetGlobalTimeMode();
00168     
00173     static void SetGlobalTimeProtocol(ETimeProtocol pTimeProtocol);
00174 
00179     static ETimeProtocol GetGlobalTimeProtocol();
00180 
00185     static double GetFrameRate(ETimeMode pTimeMode);
00186 
00193     static ETimeMode ConvertFrameRateToTimeMode(double pFrameRate, double lPrecision = 0.00000001);
00194 
00196     
00201     
00205     inline void Set(kLongLong pTime) {mTime = pTime;}
00206 
00210     inline const kLongLong& Get() const {return mTime;}
00211 
00215     inline void SetMilliSeconds(kLongLong pMilliSeconds) {mTime = pMilliSeconds * K_LONGLONG(46186158);}
00216 
00220     inline kLongLong GetMilliSeconds() const {return mTime / K_LONGLONG(46186158);}
00221 
00225     void SetSecondDouble(double pTime);
00226 
00230     double GetSecondDouble() const;
00231 
00232 
00245     void SetTime 
00246     (
00247         int pHour, 
00248         int pMinute, 
00249         int pSecond, 
00250         int pFrame = 0, 
00251         int pField = 0, 
00252         int pTimeMode=eDEFAULT_MODE,
00253         double pFramerate = 0.0
00254     );
00255 
00274     void SetTime 
00275     (
00276         int pHour, 
00277         int pMinute, 
00278         int pSecond, 
00279         int pFrame, 
00280         int pField, 
00281         int pResidual, 
00282         int pTimeMode,
00283         double pFramerate = 0.0
00284     );
00285 
00298     bool GetTime 
00299     (
00300         kLongLong& pHour, 
00301         kLongLong& pMinute, 
00302         kLongLong& pSecond, 
00303         kLongLong& pFrame, 
00304         kLongLong& pField, 
00305         kLongLong& pResidual, 
00306         int pTimeMode=eDEFAULT_MODE,
00307         double pFramerate = 0.0
00308     ) const;
00309 
00313     KTime   GetFramedTime(bool pRound = true);
00314 
00321     kLongLong GetHour(bool pCummul=false, int pTimeMode=eDEFAULT_MODE, double pFramerate=0.0) const;
00322     
00330     kLongLong GetMinute(bool pCummul=false, int pTimeMode=eDEFAULT_MODE, double pFramerate=0.0) const;
00331     
00339     kLongLong GetSecond(bool pCummul=false, int pTimeMode=eDEFAULT_MODE, double pFramerate=0.0) const;
00340     
00348     kLongLong GetFrame(bool pCummul=false, int pTimeMode=eDEFAULT_MODE, double pFramerate=0.0) const;
00349     
00357     kLongLong GetField(bool pCummul=false, int pTimeMode=eDEFAULT_MODE, double pFramerate=0.0) const;
00358 
00364     kLongLong GetResidual(int pTimeMode=eDEFAULT_MODE, double pFramerate=0.0) const;
00365 
00381     char* GetTimeString 
00382     (
00383         char* pTimeString,  
00384         int pInfo=5, 
00385         int pTimeMode=eDEFAULT_MODE, 
00386     int pTimeFormat=eDEFAULT_PROTOCOL,
00387     double pFramerate = 0.0
00388 
00389     ) const;
00390 
00403     void SetTimeString(char* pTime, int pTimeMode=eDEFAULT_MODE, int pTimeFormat=eDEFAULT_PROTOCOL, double pFramerate = 0.0);
00404 
00406 
00411  
00416     inline bool operator==(const KTime& pTime) const {return mTime == pTime.mTime;}
00417 
00422     inline bool operator!=(const KTime& pTime) const {return mTime != pTime.mTime;}
00423 
00428     inline bool operator>=(const KTime& pTime) const {return mTime >= pTime.mTime;}
00429 
00434     inline bool operator<=(const KTime& pTime) const {return mTime <= pTime.mTime;}
00435 
00440     inline bool operator>(const KTime& pTime) const {return mTime > pTime.mTime;}
00441  
00446     inline bool operator<(const KTime& pTime) const {return mTime < pTime.mTime;} 
00447 
00451     inline KTime& operator=(const KTime& pTime) {mTime = pTime.mTime; return *this;}
00452     
00457     inline KTime& operator+=(const KTime& pTime) {mTime += pTime.mTime; return *this;}
00458     
00463     inline KTime& operator-=(const KTime& pTime) {mTime -= pTime.mTime; return *this;}
00464     
00469     KTime operator+(const KTime& pTime) const;
00470 
00475     KTime operator-(const KTime& pTime) const;
00476 
00481     KTime operator*(const int Mult) const;
00482 
00487     KTime operator/(const KTime &pTime) const;
00488 
00493     KTime operator*(const KTime &pTime) const;
00494 
00496     inline KTime &operator++() {mTime += 1; return (*this);}
00497 
00499     inline const KTime operator++(int) {KTime lOld = *this; ++(*this); return lOld;}
00500 
00502     inline KTime &operator--() {mTime -= 1; return (*this);}
00503 
00505     inline const KTime operator--(int) {KTime lOld = *this; --(*this); return lOld;}
00506 
00508     static KTime GetSystemTimer();
00510     //
00511     //  WARNING!
00512     //
00513     //  Anything beyond these lines may not be documented accurately and is 
00514     //  subject to change without notice.
00515     //
00517 
00518 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00519 
00520 private:
00521 
00522     kLongLong mTime; // In 1/46, 186, 158, 000 Seconds
00523 
00524     static ETimeMode gsGlobalTimeMode;
00525     static ETimeProtocol gsGlobalTimeProtocol;
00526     static KTimeModeObject* gsTimeObject;
00527 
00528 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
00529     
00530     // Global Friend Function
00531     friend KFBX_DLL KTime::ETimeMode        KTime_GetGlobalTimeMode();
00532     friend KFBX_DLL HKTimeModeObject        KTime_GetGlobalTimeModeObject();
00533     friend KFBX_DLL KTime::ETimeProtocol    KTime_GetGlobalTimeFormat();
00534     friend KFBX_DLL void                    KTime_SetGlobalTimeMode( KTime::ETimeMode pTimeMode, double pFrameRate=0.0 );
00535     friend KFBX_DLL void                    KTime_SetGlobalTimeFormat( KTime::ETimeProtocol pTimeFormat );
00536 
00537     inline kLongLong GetOneFrameValue ( int pTimeMode, double pFramerate ) const;
00538 
00539 };
00540 
00541 
00542 #define KTS_FORWARD 1
00543 #define KTS_BACKWARD -1
00544 
00545 #define KTIMESPAN_INFINITE          KTimeSpan (KTIME_MINUS_INFINITE, KTIME_INFINITE)
00546 
00550 class KFBX_DLL KTimeSpan
00551 {
00552 
00553 public:
00554 
00556     KTimeSpan() {}
00557 
00562     KTimeSpan(KTime pStart, KTime pStop) {mStart=pStart; mStop=pStop;}
00563 
00568     inline void Set(KTime pStart, KTime pStop) {mStart=pStart; mStop=pStop;}
00569 
00573     inline void SetStart(KTime pStart) {mStart=pStart;}
00574     
00578     inline void SetStop(KTime pStop) {mStop=pStop;}
00579     
00583     inline KTime &GetStart() {return mStart;}
00584     
00588     inline KTime &GetStop() {return mStop;}
00589     
00593     inline KTime GetDuration() const {if (mStop>mStart)return mStop-mStart; else return mStart-mStop;}
00594     
00598     inline KTime GetSignedDuration() const {return mStop-mStart;}
00599     
00603     inline int GetDirection() const {if (mStop>=mStart)return KTS_FORWARD; else return KTS_BACKWARD;}
00604 
00609     bool operator&(KTime &pTime) const;
00610     
00615     KTimeSpan operator&(KTimeSpan &pTime) const;
00616 
00621     bool operator!=(KTimeSpan &pTime);
00622 
00623     
00625     //
00626     //  WARNING!
00627     //
00628     //  Anything beyond these lines may not be documented accurately and is 
00629     //  subject to change without notice.
00630     //
00632 
00633 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00634 
00635 private:
00636 
00637     KTime mStart;
00638     KTime mStop;
00639 
00640 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
00641 
00642 };
00643 
00644 
00645 
00661 enum EOldTimeMode
00662 {
00663     eOLD_DEFAULT_MODE,      
00664     eOLD_CINEMA,            
00665     eOLD_PAL,               
00666     eOLD_FRAMES30,          
00667     eOLD_NTSC_DROP_FRAME,   
00668     eOLD_FRAMES50,          
00669     eOLD_FRAMES60,          
00670     eOLD_FRAMES100,         
00671     eOLD_FRAMES120,         
00672     eOLD_NTSC_FULL_FRAME,   
00673     eOLD_FRAMES30_DROP,     
00674     eOLD_FRAMES1000,        
00675     eOLD_TIME_MODE_COUNT
00676 };
00677 
00678 class KFBX_DLL KTimeModeObject
00679 {
00680 public:
00681     double              mFrameRateValue;
00682     char*               mFrameRateString;
00683     KTime::ETimeMode    mTimeMode;
00684     EOldTimeMode        mOldTimeMode;
00685     char*               mTimeModeString;
00686     int                 mShowValue;     
00687 
00688     bool                mSystemRate;    
00689     bool                mExistInOldValue;
00690     kLongLong           mOneFrameValue;  
00691 };
00692 
00693 
00694 KFBX_DLL KTime::ETimeMode       KTime_GetGlobalTimeMode();
00695 KFBX_DLL HKTimeModeObject       KTime_GetGlobalTimeModeObject();
00696 KFBX_DLL KTime::ETimeProtocol   KTime_GetGlobalTimeFormat();
00697 KFBX_DLL void                   KTime_SetGlobalTimeMode(KTime::ETimeMode pTimeMode, double pFrameRate);
00698 KFBX_DLL void                   KTime_SetGlobalTimeFormat(KTime::ETimeProtocol pTimeFormat);
00699 //
00700 // Use those functions to keep the compatibility with old timemode since we added new timemode.
00701 //
00702 KFBX_DLL int                    KTime_GetOldTimeModeCorrespondance(KTime::ETimeMode pNewTimeMode);
00703 KFBX_DLL int                    KTime_GetTimeModeFromOldValue(int pOldTimeMode);
00704 //
00705 // We now store the framerate instead of the timemode.
00706 //
00707 KFBX_DLL int                    KTime_GetTimeModeFromFrameRate(char* pFrameRate);
00708 KFBX_DLL void                   KTime_GetControlStringList(char* pControlString, KTime::ETimeProtocol pTimeFormat);
00709 KFBX_DLL char*                  KTime_GetGlobalFrameRateString(KTime::ETimeMode pTimeMode);
00710 KFBX_DLL char*                  KTime_GetGlobalTimeModeString(KTime::ETimeMode pTimeMode);
00711 KFBX_DLL double                 KTime_GetFrameRate(KTime::ETimeMode pTimeMode);
00712 //
00713 // Time format
00714 //
00715 KFBX_DLL int                    KTime_SelectionToTimeFormat(int pSelection);
00716 KFBX_DLL int                    KTime_SelectionToTimeMode(int pSelection);
00717 KFBX_DLL int                    KTime_TimeToSelection(int pTimeMode=KTime::eDEFAULT_MODE, int pTimeFormat=KTime::eDEFAULT_PROTOCOL);
00718 KFBX_DLL char*                  KTime_GetTimeModeName(int pTimeMode);
00719 KFBX_DLL int                    KTime_GetFrameRateStringListIndex(KTime::ETimeMode pTimeMode);
00720 KFBX_DLL bool                   KTime_IsValidCustomFramerate(double pFramerate);
00721 KFBX_DLL bool                   KTime_GetNearestCustomFramerate(double pFramerate, double& pNearestRate);
00722 
00723 // Compatibility Only
00724 // Ideally, we want to make this go away :)
00725 #define DEFAULT_MODE        KTime::eDEFAULT_MODE
00726 #define CINEMA              KTime::eCINEMA
00727 #define PAL                 KTime::ePAL
00728 #define FRAMES30            KTime::eFRAMES30
00729 #define NTSC_DROP_FRAME     KTime::eNTSC_DROP_FRAME
00730 #define FRAMES50            KTime::eFRAMES50    
00731 #define FRAMES60            KTime::eFRAMES60
00732 #define FRAMES100           KTime::eFRAMES100
00733 #define FRAMES120           KTime::eFRAMES120
00734 #define NTSC_FULL_FRAME     KTime::eNTSC_FULL_FRAME
00735 #define FRAMES30_DROP       KTime::eFRAMES30_DROP
00736 #define FRAMES1000          KTime::eFRAMES1000
00737 
00738 #define TIMEFORMAT_SMPTE    KTime::eSMPTE
00739 #define TIMEFORMAT_FRAME    KTime::eFRAME
00740 #define DEFAULT_FORMAT      KTime::eDEFAULT_PROTOCOL
00741 
00742 #include <fbxfilesdk/fbxfilesdk_nsend.h>
00743 
00744 #endif // FBXFILESDK_COMPONENTS_KBASELIB_KLIB_KTIME_H
00745