fbxsdk/core/base/fbxtime.h Source File
 
 
 
fbxsdk/core/base/fbxtime.h
Go to the documentation of this file.
00001 /****************************************************************************************
00002  
00003    Copyright (C) 2013 Autodesk, Inc.
00004    All rights reserved.
00005  
00006    Use of this software is subject to the terms of the Autodesk license agreement
00007    provided at the time of installation or download, or which otherwise accompanies
00008    this software in either electronic or hard copy form.
00009  
00010 ****************************************************************************************/
00011 
00013 #ifndef _FBXSDK_CORE_BASE_TIME_H_
00014 #define _FBXSDK_CORE_BASE_TIME_H_
00015 
00016 #include <fbxsdk/fbxsdk_def.h>
00017 
00018 #include <fbxsdk/core/base/fbxtimecode.h>
00019 
00020 #include <fbxsdk/fbxsdk_nsbegin.h>
00021 
00022 #define FBXSDK_TIME_INFINITE            FbxTime(FBXSDK_TC_INFINITY)
00023 #define FBXSDK_TIME_MINUS_INFINITE      FbxTime(FBXSDK_TC_MINFINITY)
00024 #define FBXSDK_TIME_ZERO                        FbxTime(FBXSDK_TC_ZERO)
00025 #define FBXSDK_TIME_EPSILON                     FbxTime(FBXSDK_TC_EPSILON)
00026 #define FBXSDK_TIME_ONE_SECOND          FbxTime(FBXSDK_TC_SECOND)
00027 #define FBXSDK_TIME_ASSERT_EPSILON      0.5
00028 #define FBXSDK_TIME_FORWARD                     1
00029 #define FBXSDK_TIME_BACKWARD            -1
00030 
00031 class FbxTimeModeObject;
00032 
00041 class FBXSDK_DLL FbxTime 
00042 {
00043 public:
00047         FbxTime(const FbxLongLong pTime=0){ mTime = pTime; }
00048 
00087                 enum EMode
00088                 {
00089                         eDefaultMode,
00090                         eFrames120,
00091                         eFrames100,
00092                         eFrames60,
00093                         eFrames50,
00094                         eFrames48,
00095                         eFrames30,
00096                         eFrames30Drop,
00097                         eNTSCDropFrame,
00098                         eNTSCFullFrame,
00099                         ePAL,
00100                         eFrames24,
00101                         eFrames1000,
00102                         eFilmFullFrame,
00103                         eCustom,
00104                         eFrames96,
00105                         eFrames72,
00106                         eFrames59dot94,
00107                         eModesCount
00108                 };
00109 
00115                 enum EProtocol {eSMPTE, eFrameCount, eDefaultProtocol};
00116 
00122                 static void SetGlobalTimeMode(EMode pTimeMode, double pFrameRate=0.0);
00123 
00128                 static EMode GetGlobalTimeMode();
00129 
00134                 static void SetGlobalTimeProtocol(EProtocol pTimeProtocol);
00135 
00140                 static EProtocol GetGlobalTimeProtocol();
00141 
00146                 static double GetFrameRate(EMode pTimeMode);
00147 
00154                 static EMode ConvertFrameRateToTimeMode(double pFrameRate, double pPrecision=0.00000001);
00156         
00164                 inline void Set(FbxLongLong pTime){ mTime = pTime; }
00165 
00169                 inline FbxLongLong Get() const { return mTime; }
00170 
00174                 inline void SetMilliSeconds(FbxLongLong pMilliSeconds){ mTime = pMilliSeconds * FBXSDK_TC_MILLISECOND; }
00175 
00179                 inline FbxLongLong GetMilliSeconds() const { return mTime / FBXSDK_TC_MILLISECOND; }
00180 
00184                 void SetSecondDouble(double pTime);
00185 
00189                 double GetSecondDouble() const;
00190 
00202                 void SetTime(int pHour, int pMinute, int pSecond, int pFrame=0, int pField=0, EMode pTimeMode=eDefaultMode);
00203 
00221                 void SetTime(int pHour, int pMinute, int pSecond, int pFrame, int pField, int pResidual, EMode pTimeMode);
00222 
00234                 bool GetTime(int& pHour, int& pMinute, int& pSecond, int& pFrame, int& pField, int& pResidual, EMode pTimeMode=eDefaultMode) const;
00235 
00240                 FbxTime GetFramedTime(bool pRound=true);
00241 
00246                 void SetFrame(FbxLongLong pFrames, EMode pTimeMode=eDefaultMode);
00247 
00251                 int GetHourCount() const;
00252 
00256                 int GetMinuteCount() const;
00257 
00261                 int GetSecondCount() const;
00262 
00268                 FbxLongLong GetFrameCount(EMode pTimeMode=eDefaultMode) const;
00269 
00274                 FbxLongLong GetFieldCount(EMode pTimeMode=eDefaultMode) const;
00275 
00280                 int GetResidual(EMode pTimeMode=eDefaultMode) const;
00281 
00286                 static bool IsDropFrame(EMode pTimeMode=eDefaultMode);
00287 
00292                 char GetFrameSeparator(EMode pTimeMode=eDefaultMode) const;
00293 
00309                 FBX_DEPRECATED char* GetTimeString(char* pTimeString, int pInfo=5, EMode pTimeMode=eDefaultMode, EProtocol pTimeFormat=eDefaultProtocol) const;
00310 
00326                 char* GetTimeString(char* pTimeString, const FbxUShort& pTimeStringSize, int pInfo=5, EMode pTimeMode=eDefaultMode, EProtocol pTimeFormat=eDefaultProtocol) const;
00327 
00340                 bool SetTimeString(const char* pTime, EMode pTimeMode=eDefaultMode, EProtocol pTimeFormat=eDefaultProtocol);
00342 
00351                 inline bool operator==(const FbxTime& pTime) const { return mTime == pTime.mTime; }
00352 
00357                 inline bool operator!=(const FbxTime& pTime) const { return mTime != pTime.mTime; }
00358 
00363                 inline bool operator>=(const FbxTime& pTime) const { return mTime >= pTime.mTime; }
00364 
00369                 inline bool operator<=(const FbxTime& pTime) const { return mTime <= pTime.mTime; }
00370 
00375                 inline bool operator>(const FbxTime& pTime) const { return mTime > pTime.mTime; }
00376 
00381                 inline bool operator<(const FbxTime& pTime) const { return mTime < pTime.mTime; } 
00382 
00386                 inline FbxTime& operator=(const FbxTime& pTime) { mTime = pTime.mTime; return *this; }
00387 
00392                 inline FbxTime& operator+=(const FbxTime& pTime) { mTime += pTime.mTime; return *this; }
00393 
00398                 inline FbxTime& operator-=(const FbxTime& pTime) { mTime -= pTime.mTime; return *this; }
00399 
00404                 FbxTime operator+(const FbxTime& pTime) const;
00405 
00410                 FbxTime operator-(const FbxTime& pTime) const;
00411 
00416                 FbxTime operator*(const int Mult) const;
00417 
00422                 FbxTime operator/(const FbxTime& pTime) const;
00423 
00428                 FbxTime operator*(const FbxTime& pTime) const;
00429 /*
00431                 inline FbxTime& operator++() { mTime += 1; return (*this); }
00432 
00434                 inline const FbxTime operator++(int) { FbxTime lOld = *this; ++(*this); return lOld; }
00435 
00437                 inline FbxTime& operator--() { mTime -= 1; return (*this); }
00438 
00440                 inline const FbxTime operator--(int) { FbxTime lOld = *this; --(*this); return lOld; }*/
00442 
00447         static FbxLongLong GetOneFrameValue(EMode pTimeMode=eDefaultMode);
00448 
00449 /*****************************************************************************************************************************
00450 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
00451 *****************************************************************************************************************************/
00452 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00453         // Keep compatibility with old fbx format
00454         enum EOldMode
00455         {
00456                 eOLD_DEFAULT_MODE,              //Default mode set using FbxTime::SetGlobalTimeMode(EMode pTimeMode)
00457                 eOLD_CINEMA,                    //24 frameOLD_s/s
00458                 eOLD_PAL,                               //25 frameOLD_s/s        PAL/SECAM
00459                 eOLD_FRAMES30,                  //30 frameOLD_s/s        BLACK & WHITE NTSC
00460                 eOLD_NTSC_DROP_FRAME,   //29.97002617 frameOLD_s/s COLOR NTSC
00461                 eOLD_FRAMES50,                  //50 frameOLD_s/s
00462                 eOLD_FRAMES60,                  //60 frameOLD_s/s
00463                 eOLD_FRAMES100,                 //100 frameOLD_s/s
00464                 eOLD_FRAMES120,                 //120 frameOLD_s/s
00465                 eOLD_NTSC_FULL_FRAME,   //29.97002617 frameOLD_s/s COLOR NTSC
00466                 eOLD_FRAMES30_DROP,             //30 frameOLD_s/s
00467                 eOLD_FRAMES1000                 //1000 frameOLD_s/s
00468         };
00469 
00470 private:
00471         FbxLongLong                                     mTime; //In 1 / 46,186,158,000 Seconds
00472 
00473         static EMode                            gsGlobalTimeMode;
00474         static EProtocol                        gsGlobalTimeProtocol;
00475         static FbxTimeModeObject*       gsTimeObject;
00476 
00477         void InternalSetTime(int pHour, int pMinute, int pSecond, FbxLongLong pFrame, int pField, EMode pTimeMode);
00478 
00479     friend FBXSDK_DLL FbxTime::EMode            FbxGetGlobalTimeMode();
00480         friend FBXSDK_DLL FbxTimeModeObject*    FbxGetGlobalTimeModeObject();
00481     friend FBXSDK_DLL FbxTime::EProtocol        FbxGetGlobalTimeFormat();
00482         friend FBXSDK_DLL void                                  FbxSetGlobalTimeMode(FbxTime::EMode pTimeMode, double pFrameRate);
00483     friend FBXSDK_DLL void                                      FbxSetGlobalTimeFormat(FbxTime::EProtocol pTimeFormat);
00484 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
00485 };
00486 
00490 FBXSDK_DLL inline FbxTime FbxTimeSeconds(const FbxDouble& pTime=0.0)
00491 {
00492         FbxTime lTime;
00493         lTime.SetSecondDouble(pTime);
00494         return lTime;
00495 }
00496 
00501 class FBXSDK_DLL FbxTimeSpan
00502 {
00503 public:
00505         FbxTimeSpan() {}
00506 
00511         FbxTimeSpan(FbxTime pStart, FbxTime pStop){ mStart = pStart; mStop = pStop; }
00512 
00517         inline void Set(FbxTime pStart, FbxTime pStop){ mStart = pStart; mStop = pStop; }
00518 
00522         inline void SetStart(FbxTime pStart){ mStart = pStart; }
00523 
00527         inline void SetStop(FbxTime pStop){ mStop = pStop; }
00528 
00532         inline FbxTime GetStart() const { return mStart; }
00533 
00537         inline FbxTime GetStop() const { return mStop; }
00538 
00542         inline FbxTime GetDuration() const { if( mStop > mStart ) return mStop - mStart; else return mStart - mStop; }
00543 
00547         inline FbxTime GetSignedDuration() const { return mStop - mStart; }
00548 
00552         inline int GetDirection() const { if( mStop >= mStart ) return FBXSDK_TIME_FORWARD; else return FBXSDK_TIME_BACKWARD; }
00553 
00558         bool IsInside(FbxTime pTime) const;
00559 
00564         FbxTimeSpan Intersect(const FbxTimeSpan& pTime) const;
00565 
00570         bool operator!=(const FbxTimeSpan& pTime) const;
00571 
00576         bool operator==(const FbxTimeSpan& pTime) const;
00577 
00585         void UnionAssignment(const FbxTimeSpan& pSpan, int pDirection=FBXSDK_TIME_FORWARD);
00586 
00587 /*****************************************************************************************************************************
00588 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
00589 *****************************************************************************************************************************/
00590 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00591 private:
00592         FbxTime mStart;
00593         FbxTime mStop;
00594 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
00595 };
00596 
00597 class FBXSDK_DLL FbxLocalTime
00598 {
00599 public:
00600         FbxLocalTime();
00601 
00602         int mYear;
00603         int mMonth;
00604         int mDay;
00605         int mHour;
00606         int mMinute;
00607         int mSecond;
00608         int mMillisecond;
00609 };
00610 
00611 FBXSDK_DLL void                                 FbxGetCurrentLocalTime(FbxLocalTime& pLocalTime);
00612 
00613 FBXSDK_DLL FbxTime::EMode               FbxGetGlobalTimeMode();
00614 FBXSDK_DLL FbxTimeModeObject*   FbxGetGlobalTimeModeObject();
00615 FBXSDK_DLL FbxTime::EProtocol   FbxGetGlobalTimeFormat();
00616 FBXSDK_DLL void                                 FbxSetGlobalTimeMode(FbxTime::EMode pTimeMode, double pFrameRate=0.0);
00617 FBXSDK_DLL void                                 FbxSetGlobalTimeFormat(FbxTime::EProtocol pTimeFormat);
00618 
00619 // Use those functions to keep the compatibility with old time mode since we added new time mode.
00620 FBXSDK_DLL FbxTime::EOldMode            FbxGetOldTimeModeCorrespondance(FbxTime::EMode pMode);
00621 FBXSDK_DLL FbxTime::EMode               FbxGetTimeModeFromOldValue(FbxTime::EOldMode pOldMode);
00622 
00623 // We now store the framerate instead of the time mode.
00624 FBXSDK_DLL FbxTime::EMode               FbxGetTimeModeFromFrameRate(char* pFrameRate);
00625 FBXSDK_DLL void                                 FbxGetControlStringList(char* pControlString, FbxTime::EProtocol pTimeFormat);
00626 FBXSDK_DLL const char*                  FbxGetGlobalFrameRateString(FbxTime::EMode pTimeMode);
00627 FBXSDK_DLL const char*                  FbxGetGlobalTimeModeString(FbxTime::EMode pTimeMode);
00628 FBXSDK_DLL double                               FbxGetFrameRate(FbxTime::EMode pTimeMode);
00629 
00630 // Time format
00631 FBXSDK_DLL FbxTime::EProtocol   FbxSelectionToTimeFormat(int pSelection);
00632 FBXSDK_DLL FbxTime::EMode               FbxSelectionToTimeMode(int pSelection);
00633 FBXSDK_DLL int                                  FbxTimeToSelection(FbxTime::EMode pTimeMode=FbxTime::eDefaultMode, int pTimeFormat=FbxTime::eDefaultProtocol);
00634 FBXSDK_DLL const char*                  FbxGetTimeModeName(FbxTime::EMode pTimeMode);
00635 FBXSDK_DLL int                                  FbxGetFrameRateStringListIndex(FbxTime::EMode pTimeMode);
00636 FBXSDK_DLL bool                                 FbxIsValidCustomFrameRate(double pFramerate);
00637 FBXSDK_DLL bool                                 FbxGetNearestCustomFrameRate(double pFramerate, double& pNearestRate);
00638 
00639 #include <fbxsdk/fbxsdk_nsend.h>
00640 
00641 #endif /* _FBXSDK_CORE_BASE_TIME_H_ */