lumiera_documentation/src/vault/out/timings.hpp

205 lines
7.4 KiB
C++
Raw Normal View History

2011-08-15 00:52:56 +02:00
/*
TIMINGS.hpp - timing specifications for a frame quantised data stream
Copyright: clarify and simplify the file headers * Lumiera source code always was copyrighted by individual contributors * there is no entity "Lumiera.org" which holds any copyrights * Lumiera source code is provided under the GPL Version 2+ == Explanations == Lumiera as a whole is distributed under Copyleft, GNU General Public License Version 2 or above. For this to become legally effective, the ''File COPYING in the root directory is sufficient.'' The licensing header in each file is not strictly necessary, yet considered good practice; attaching a licence notice increases the likeliness that this information is retained in case someone extracts individual code files. However, it is not by the presence of some text, that legally binding licensing terms become effective; rather the fact matters that a given piece of code was provably copyrighted and published under a license. Even reformatting the code, renaming some variables or deleting parts of the code will not alter this legal situation, but rather creates a derivative work, which is likewise covered by the GPL! The most relevant information in the file header is the notice regarding the time of the first individual copyright claim. By virtue of this initial copyright, the first author is entitled to choose the terms of licensing. All further modifications are permitted and covered by the License. The specific wording or format of the copyright header is not legally relevant, as long as the intention to publish under the GPL remains clear. The extended wording was based on a recommendation by the FSF. It can be shortened, because the full terms of the license are provided alongside the distribution, in the file COPYING.
2024-11-17 23:42:55 +01:00
Copyright (C)
2011, Hermann Vosseler <Ichthyostega@web.de>
2011-08-15 00:52:56 +02:00
Copyright: clarify and simplify the file headers * Lumiera source code always was copyrighted by individual contributors * there is no entity "Lumiera.org" which holds any copyrights * Lumiera source code is provided under the GPL Version 2+ == Explanations == Lumiera as a whole is distributed under Copyleft, GNU General Public License Version 2 or above. For this to become legally effective, the ''File COPYING in the root directory is sufficient.'' The licensing header in each file is not strictly necessary, yet considered good practice; attaching a licence notice increases the likeliness that this information is retained in case someone extracts individual code files. However, it is not by the presence of some text, that legally binding licensing terms become effective; rather the fact matters that a given piece of code was provably copyrighted and published under a license. Even reformatting the code, renaming some variables or deleting parts of the code will not alter this legal situation, but rather creates a derivative work, which is likewise covered by the GPL! The most relevant information in the file header is the notice regarding the time of the first individual copyright claim. By virtue of this initial copyright, the first author is entitled to choose the terms of licensing. All further modifications are permitted and covered by the License. The specific wording or format of the copyright header is not legally relevant, as long as the intention to publish under the GPL remains clear. The extended wording was based on a recommendation by the FSF. It can be shortened, because the full terms of the license are provided alongside the distribution, in the file COPYING.
2024-11-17 23:42:55 +01:00
  **Lumiera** 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 of the License, or (at your
  option) any later version. See the file COPYING for further details.
2011-08-15 00:52:56 +02:00
*/
/** @file timings.hpp
** How to define a timing specification or constraint.
** A timing spec is used to anchor a data stream with relation to a time axis or frame grid.
2011-08-15 00:52:56 +02:00
** There are two kinds of timing specs:
** - nominal timing specifications relate to the nominal time values
** of the frames in a data stream, i.e. the "should be" time values.
** These might be values derived from a timecode or just values in
** in relation to the timeline axis, but without any connection to
** the real wall clock time
** - actual timing specifications are always connected or related to
** an external time source, typically just wall clock time. For example,
** actual timing specs dictate the constraints for real time frame
** delivery to an external output connection.
**
** @todo WIP-WIP-WIP 3/2026 although this class is around for many years now,
** its actual meaning is still not well defined; sometimes it appears as a specification,
** while at places it also plays the role of a constraint.
** @see dispatcher.hpp
** @see output-slot.hpp
2011-08-15 00:52:56 +02:00
*/
#ifndef VAULT_OUT_TIMINGS_H
#define VAULT_OUT_TIMINGS_H
2011-08-15 00:52:56 +02:00
#include "lib/error.hpp"
//#include "lib/handle.hpp"
#include "lib/time/timevalue.hpp"
//#include "steam/engine/buffer-provider.hpp"
2011-08-15 00:52:56 +02:00
//#include "lib/iter-source.hpp"
//#include "lib/sync.hpp"
//#include <string>
//#include <vector>
#include <boost/rational.hpp>
#include <memory>
2011-08-15 00:52:56 +02:00
namespace lib {
namespace time{
class Quantiser;
typedef std::shared_ptr<const Quantiser> PQuant;
}}
2011-08-15 00:52:56 +02:00
namespace vault {
namespace out {
2011-08-15 00:52:56 +02:00
using lib::time::FrameCnt;
using lib::time::FrameRate;
using lib::time::TimeValue;
using lib::time::Duration;
using lib::time::Offset;
using lib::time::Time;
2011-08-15 00:52:56 +02:00
//using std::string;
//using std::vector;
//using std::shared_ptr;
2011-08-15 00:52:56 +02:00
enum PlaybackUrgency {
ASAP,
NICE,
TIMEBOUND
};
2011-08-15 00:52:56 +02:00
/*************************************************************************//**
* Generic frame timing specification. Defines the expected delivery interval,
* optionally also the expected quality-of-service (urgency).
2011-08-15 00:52:56 +02:00
*
* @note copyable value class
*
* @todo write type comment
* /////////////////////////////////////////////////////////////////TODO: WIP seems to become some kind of abstracted Grid representation!
2011-08-15 00:52:56 +02:00
*/
class Timings
{
lib::time::PQuant grid_;
2011-08-15 00:52:56 +02:00
public:
PlaybackUrgency playbackUrgency;
boost::rational<FrameCnt> playbackSpeed; /////////////TICKET #902 we need a more generic representation for variable speed playback
Time scheduledDelivery; ///< a wall clock time corresponding to the Grid's origin. Can be Time::Never (=not time bound)
Duration outputLatency; ///////////////TICKET #802 this information is necessary, but it is not clear who maintains and updates the latency
Duration engineLatency; ///< reasonable guess at the scheduling and dispatch-delay of the render engine
explicit
Timings (FrameRate fps);
Timings (FrameRate fps, Time realTimeAnchor);
// default copy acceptable
/** marker for halted output */
static Timings DISABLED;
2013-08-18 03:16:49 +02:00
Time getOrigin() const;
Time getFrameStartAt (FrameCnt frameNr) const;
2013-08-18 03:16:49 +02:00
Duration getFrameDurationAt (TimeValue refPoint) const;
Duration getFrameDurationAt (FrameCnt refFrameNr) const;
/** the next grid point at or after the given reference time */
FrameCnt getBreakPointAfter (TimeValue refPoint) const;
/** the frame spacing and duration remains constant for some time...
* @param startPoint looking from that time point into future
* @return duration after this starting point, where it's safe
* to assume unaltered frame dimensions */
Duration constantFrameTimingsInterval (TimeValue startPoint) const;
/** calculate the given frame's distance from origin,
* but do so using the real time scale, including any
* playback speed factor and similar corrections.
* @param frameOffset frame number relative to the implicit grid
* @return real time value relative to the implicit grid's zero point
* @note since the Timings don't contain any information relating the
* nominal time scale to wall clock time, this result is just
* a relative offset, but expressed in real time scale values
* @see steam::engine::TimeAnchor for an absolutely anchored conversion
*/
Offset getRealOffset (FrameCnt frameOffset) const;
/** real time deadline for the given frame, without any latency.
* This value is provided in case of scheduled time of delivery,
* which is signalled by `playbackUrgency == TIMEBOUND`
* @return wall clock time to expect delivery of data
* corresponding to a frame specified relative
* to [time axis origin](\ref #getOrigin)
* @note for other playback urgencies `Time::NEVER` is returned
2025-06-07 23:59:57 +02:00
*
* @warning not clear as of 1/13 if it is even possible to have such a function
2025-06-07 23:59:57 +02:00
* on the Timings record.
*/
Time getTimeDue(FrameCnt frameOffset) const;
/** the minimum time span to be covered by frame calculation jobs
* planned in one sway. The ongoing planning of additional jobs
* proceeds in chunks of jobs added at once to the schedule.
* This setting defines the minimum time to plan ahead; after
* covering at least this time span with new jobs, the
* frame dispatcher concludes "enough for now" and emits
* a continuation job for the next planning chunk.
*/
Duration getPlanningChunkDuration() const;
/** establish the time point to anchor the next planning chunk,
* in accordance with #getPlanningChunkDuration
* @param anchorFrame frame number where the current planning chunk started
* @return number of the first frame, which is located strictly more than
* the planning chunk duration into the future
* @remarks this value is used by the frame dispatcher to create a
* follow-up planning job */
FrameCnt establishNextPlanningChunkStart(FrameCnt anchorFrame) const;
bool isOriginalSpeed() const;
bool isTimebound() const;
/** Consistency self-check */
bool isValid() const;
//////////////TODO further accessor functions here
Timings constrainedBy (Timings additionalConditions);
2011-08-15 00:52:56 +02:00
};
inline bool
Timings::isOriginalSpeed() const
{
return 1 == playbackSpeed;
}
inline bool
Timings::isTimebound() const
{
return out::TIMEBOUND == playbackUrgency;
}
}} // namespace vault::out
#endif /*VAULT_OUT_TIMINGS_H*/