obs-studio/build_dependencies/aja/include/ajalibraries/ajabase/common/timebase.h

394 lines
10 KiB
C
Raw Normal View History

2023-03-04 18:33:16 +01:00
/* SPDX-License-Identifier: MIT */
/**
@file timebase.h
@brief Declares the AJATimeBase class.
@copyright (C) 2009-2021 AJA Video Systems, Inc. All rights reserved.
**/
#ifndef TIMEBASE_H
#define TIMEBASE_H
#include "ajabase/common/public.h"
#include "ajabase/common/videotypes.h"
/**
* Class provides high resolution time base conversion
* @ingroup AJAGroupSystem
*/
class AJA_EXPORT AJATimeBase
{
public:
AJATimeBase();
/**
* Construct the time base class.
*
* @param[in] ajaFrameRate Frame rate define found in videotypes.h
*/
AJATimeBase(AJA_FrameRate ajaFrameRate);
/**
* Construct the time base class.
*
* @param[in] frameTimeScale Time units per second (units/second)
* @param[in] frameDuration Time units per frame (units/frame)
*/
AJATimeBase(int64_t frameTimeScale, int64_t frameDuration);
/**
* Construct the time base class.
*
* @param[in] frameTimeScale Time units per second (units/second)
* @param[in] frameDuration Time units per frame (units/frame)
* @param[in] audioRate Audio sample rate (samples/second)
*/
AJATimeBase(int64_t frameTimeScale, int64_t frameDuration, int64_t audioRate);
/**
* Copy constructor
*
* @param[in] other AJATimeBase to copy
*/
AJATimeBase(const AJATimeBase &other);
virtual ~AJATimeBase();
/**
* Set to default value.
*/
void SetToDefault(void);
/**
* Set the video frame rate to use in conversions.
*
* The frame rate is specified as frameTimeScale/frameDuration = frames/second.
*
* @param[in] frameTimeScale Time units per second (units/second)
* @param[in] frameDuration Time units per frame (units/frame)
*/
void SetFrameRate(int64_t frameTimeScale, int64_t frameDuration);
/**
* Set the video frame rate to use in conversions.
*
* The frame rate is specified Frame rate define found in videotypes.h
*
* @param[in] ajaFrameRate AJA_FrameRate
*/
void SetAJAFrameRate(AJA_FrameRate ajaFrameRate);
/**
* Get the video frame rate used in conversions.
*
* The frame rate is specified as frameTimeScale/frameDuration = frames/seconds.
*
* @param[out] frameTimeScale Time units per second (units/second)
* @param[out] frameDuration Time units per frame (units/frame)
*/
void GetFrameRate(int64_t& frameTimeScale, int64_t& frameDuration) const;
void GetFrameRate(uint32_t& frameTimeScale, uint32_t& frameDuration) const;
/**
* Get the video frame time scale used in conversions.
*
* @return frameTimeScale Time units per second (units/second)
*/
int64_t GetFrameTimeScale(void) const;
/**
* Set the video frame duration used in conversions.
*
* @param[in] timeScale Time units per second (units/second)
*/
void SetFrameTimeScale(int64_t timeScale);
/**
* Get the video frame duration used in conversions.
*
* @return frameDuration Time units per frame (units/frame)
*/
int64_t GetFrameDuration(void) const;
/**
* Set the audio sample rate to use in conversions.
*
* @param[in] rate Audio rate in samples/second.
*/
void SetAudioRate(int64_t rate);
/**
* Get the audio sample rate used in conversions.
*
* @return Audio rate in samples/second.
*/
int64_t GetAudioRate() const;
/**
* Get the AJA_FrameRate which is close to the current value, return unknown if not close.
*
* @return AJA_FrameRate value, may be unknown
*/
AJA_FrameRate GetAJAFrameRate(void) const;
/**
* Set the system tick rate to use in conversions.
*
* @param[in] rate System tick rate in ticks/second.
* 0 == system native rate.
*/
void SetTickRate(int64_t rate);
/**
* Get the system tick rate used in conversions.
*
* @return Tick rate in ticks/second.
*/
int64_t GetTickRate() const;
/**
* Convert video frames to audio samples.
*
* @param[in] frames Video frame count to convert.
* @param[in] round Round the result.
* @return Audio sample count.
*/
int64_t FramesToSamples(int64_t frames, bool round = false) const;
/**
* Convert video frames to system ticks.
*
* @param[in] frames Video frame count to convert.
* @param[in] round Round the result.
* @return System tick count.
*/
int64_t FramesToTicks(int64_t frames, bool round = false) const;
/**
* Convert video frames to time in seconds.
*
* @param[in] frames Video frame count to convert.
* @return Time in seconds.
*/
double FramesToSeconds(int64_t frames) const;
/**
* Convert time scale units to time in seconds.
*
* @param[in] num Time scale units to convert.
* @return Time in seconds.
*/
double ScaleUnitsToSeconds(int64_t num) const;
/**
* Convert video frames to time in microseconds.
*
* @param[in] frames Video frame count to convert.
* @param[in] round Round the result.
* @return Time in microseconds.
*/
int64_t FramesToMicroseconds(int64_t frames, bool round = false) const;
/**
* Convert audio samples to video frames.
*
* @param[in] samples Audio sample count to convert.
* @param[in] round Round the result.
* @return Video frame count.
*/
int64_t SamplesToFrames(int64_t samples, bool round = false) const;
/**
* Convert audio samples to system ticks.
*
* @param[in] samples Audio sample count to convert.
* @param[in] round Round the result.
* @return System tick count.
*/
int64_t SamplesToTicks(int64_t samples, bool round = false) const;
/**
* Convert audio samples to time in seconds.
*
* @param[in] samples Sample count to convert.
* @return Time in seconds.
*/
double SamplesToSeconds(int64_t samples);
/**
* Convert audio samples to time in microseconds.
*
* @param[in] samples Sample count to convert.
* @param[in] round Round the result.
* @return Time in microseconds.
*/
int64_t SamplesToMicroseconds(int64_t samples, bool round = false);
/**
* Convert system ticks to video frames.
*
* @param[in] ticks System tick count to convert.
* @param[in] round Round the result.
* @return Video frame count.
*/
int64_t TicksToFrames(int64_t ticks, bool round = false);
/**
* Convert system ticks to audio samples.
*
* @param[in] ticks System tick count to convert.
* @param[in] round Round the result.
* @return Audio sample count.
*/
int64_t TicksToSamples(int64_t ticks, bool round = false);
/**
* Convert system ticks to time in seconds.
*
* @param[in] ticks System tick count to convert.
* @return Time in seconds.
*/
double TicksToSeconds(int64_t ticks);
/**
* Convert system ticks to time in microseconds.
*
* @param[in] ticks System tick count to convert.
* @param[in] round Round the result.
* @return Time in microseconds.
*/
int64_t TicksToMicroseconds(int64_t ticks, bool round = false);
/**
* Convert time in seconds to video frames.
*
* @param[in] seconds Time in seconds.
* @param[in] round Round the result.
* @return Video frame count.
*/
int64_t SecondsToFrames(double seconds, bool round = false);
/**
* Convert time in seconds to audio samples.
*
* @param[in] seconds Time in seconds.
* @param[in] round Round the result.
* @return Audio sample count.
*/
int64_t SecondsToSamples(double seconds, bool round = false);
/**
* Convert time in seconds to system ticks.
*
* @param[in] seconds Time in seconds.
* @param[in] round Round the result.
* @return System tick count.
*/
int64_t SecondsToTicks(double seconds, bool round = false);
/**
* Convert microseconds to video frames.
*
* @param[in] microseconds System tick count to convert.
* @param[in] round Round the result.
* @return Video frame count.
*/
int64_t MicrosecondsToFrames(int64_t microseconds, bool round = false);
/**
* Convert microseconds to audio samples.
*
* @param[in] microseconds System tick count to convert.
* @param[in] round Round the result.
* @return Audio sample count.
*/
int64_t MicrosecondsToSamples(int64_t microseconds, bool round = false);
/**
* Convert microseconds to system ticks.
*
* @param[in] microseconds System tick count to convert.
* @param[in] round Round the result.
* @return Time in microseconds.
*/
int64_t MicrosecondsToTicks(int64_t microseconds, bool round = false);
/**
* Get the current value of the system tick count.
*
* @return System tick count.
*/
int64_t GetSystemTicks();
/**
* Returns if timebases are reasonably close
*
* @param[in] timeBase Time base to compare.
* @return True if the same or close (returns false if either duration is zero).
*/
bool IsCloseTo(const AJATimeBase &timeBase) const;
/**
* Returns if timebases are reasonably close
*
* @param[in] frameTimeScale Time scale to compare.
* @param[in] frameDuration Time duration to compare.
* @return True if the same or close (returns false if either duration is zero).
*/
bool IsCloseTo(int64_t frameTimeScale, int64_t frameDuration) const;
/**
* Test if the timescale is not a simple multiple of the duration
*
* The intent is that even ratios are "non-drop", otherwise the timebase is "drop frame"
* In this sense, this method can be thought of as equivalent to IsDropFrame()
*
* @return True if the timescale/duration ratio has a non-zero fraction, i.e. "drop frame".
*/
bool IsNonIntegralRatio(void) const;
/**
* Returns frames per second
*
* @return frames per second
*/
float GetFramesPerSecond(void) const;
double GetFramesPerSecondDouble(void) const;
AJATimeBase& operator=(const AJATimeBase &t);
bool operator==(const AJATimeBase &val) const;
bool operator!=(const AJATimeBase &val) const;
/**
* Convert time in seconds to microseconds.
*
* @param[in] seconds Time in seconds.
* @param[in] round Round the result.
* @return Time in microseconds.
*/
static int64_t SecondsToMicroseconds(double seconds, bool round = false);
/**
* Convert microseconds to time in seconds.
*
* @param[in] microseconds System tick count to convert.
* @return Time in seconds.
*/
static double MicrosecondsToSeconds(int64_t microseconds);
static int64_t Convert(int64_t inValue, int64_t inRate, int64_t outRate, bool round, bool large);
static int64_t Convert(int64_t inValue, int64_t inScale, int64_t inDuration,
int64_t outScale, int64_t outDuration, bool round, bool large);
private:
void SetAJAFrameRatePrivate(AJA_FrameRate ajaFrameRate);
int64_t mFrameTimeScale;
int64_t mFrameDuration;
int64_t mAudioRate;
int64_t mTickRate;
};
#endif