diff options
Diffstat (limited to 'xbmc/linux/OMXClock.h')
-rw-r--r-- | xbmc/linux/OMXClock.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/xbmc/linux/OMXClock.h b/xbmc/linux/OMXClock.h new file mode 100644 index 0000000000..1327996dbb --- /dev/null +++ b/xbmc/linux/OMXClock.h @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2005-2008 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#ifndef _AVCLOCK_H_ +#define _AVCLOCK_H_ + +#if defined(HAVE_OMXLIB) + +#include "OMXCore.h" +#include "DVDClock.h" +#include "linux/XTimeUtils.h" + +#ifdef OMX_SKIP64BIT +static inline OMX_TICKS ToOMXTime(int64_t pts) +{ + OMX_TICKS ticks; + ticks.nLowPart = pts; + ticks.nHighPart = pts >> 32; + return ticks; +} +static inline uint64_t FromOMXTime(OMX_TICKS ticks) +{ + uint64_t pts = ticks.nLowPart | ((uint64_t)ticks.nHighPart << 32); + return pts; +} +#else +#define FromOMXTime(x) (x) +#define ToOMXTime(x) (x) +#endif + +enum { + AV_SYNC_AUDIO_MASTER, + AV_SYNC_VIDEO_MASTER, + AV_SYNC_EXTERNAL_MASTER, +}; + +class OMXClock +{ +protected: + bool m_pause; + bool m_has_video; + bool m_has_audio; + int m_play_speed; + pthread_mutex_t m_lock; + double SystemToAbsolute(int64_t system); + double SystemToPlaying(int64_t system); + int64_t m_systemUsed; + int64_t m_startClock; + int64_t m_pauseClock; + double m_iDisc; + bool m_bReset; + static int64_t m_systemFrequency; + static int64_t m_systemOffset; + int64_t m_ClockOffset; + double m_maxspeedadjust; + bool m_speedadjust; + static bool m_ismasterclock; + double m_fps; + int m_omx_speed; + bool m_video_start; + bool m_audio_start; + bool m_audio_buffer; + CDVDClock m_clock; + OMX_TIME_CONFIG_CLOCKSTATETYPE m_clock_state; +private: + COMXCoreComponent m_omx_clock; +public: + OMXClock(); + ~OMXClock(); + void Lock(); + void UnLock(); + double GetAbsoluteClock(bool interpolated = true); + double GetFrequency() { return (double)m_systemFrequency ; } + double WaitAbsoluteClock(double target); + double GetClock(bool interpolated = true); + double GetClock(double& absolute, bool interpolated = true); + void CheckSystemClock(); + void SetSpeed(int iSpeed); + void SetMasterClock(bool ismasterclock) { m_ismasterclock = ismasterclock; } + bool IsMasterClock() { return m_ismasterclock; } + void Discontinuity(double currentPts = 0LL); + + void Reset() { m_bReset = true; } + void Pause(); + void Resume(); + + int UpdateFramerate(double fps, double* interval = NULL); + bool SetMaxSpeedAdjust(double speed); + + void OMXSetClockPorts(OMX_TIME_CONFIG_CLOCKSTATETYPE *clock); + bool OMXSetReferenceClock(bool lock = true); + bool OMXInitialize(bool has_video, bool has_audio); + void OMXDeinitialize(); + bool OMXIsPaused() { return m_pause; }; + void OMXSaveState(bool lock = true); + void OMXRestoreState(bool lock = true); + bool OMXStop(bool lock = true); + bool OMXStart(bool lock = true); + bool OMXReset(bool lock = true); + double OMXWallTime(bool lock = true); + double OMXMediaTime(bool lock = true); + bool OMXPause(bool lock = true); + bool OMXResume(bool lock = true); + bool OMXUpdateClock(double pts, bool lock = true); + bool OMXWaitStart(double pts, bool lock = true); + void OMXHandleBackward(bool lock = true); + bool OMXSetSpeed(int speed, bool lock = true); + int OMXPlaySpeed() { return m_omx_speed; }; + int OMXGetPlaySpeed() { return m_omx_speed; }; + COMXCoreComponent *GetOMXClock(); + bool OMXStatePause(bool lock = true); + bool OMXStateExecute(bool lock = true); + void OMXStateIdle(bool lock = true); + static void AddTimespecs(struct timespec &time, long millisecs); + bool HDMIClockSync(bool lock = true); + static int64_t CurrentHostCounter(void); + static int64_t CurrentHostFrequency(void); + bool HasVideo() { return m_has_video; }; + bool HasAudio() { return m_has_audio; }; + void HasVideo(bool has_video) { m_has_video = has_video; }; + void HasAudio(bool has_audio) { m_has_audio = has_audio; }; + bool VideoStart() { return m_video_start; }; + bool AudioStart() { return m_audio_start; }; + void VideoStart(bool video_start); + void AudioStart(bool audio_start); + static void AddTimeSpecNano(struct timespec &time, uint64_t nanoseconds); + + void OMXAudioBufferStart(); + void OMXAudioBufferStop(); + bool OMXAudioBuffer() { return m_audio_buffer; }; + + int GetRefreshRate(double* interval = NULL); + void SetRefreshRate(double fps) { m_fps = fps; }; + + static double NormalizeFrameduration(double frameduration); +}; + +#endif + +#endif |