11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
27PROMEKI_NAMESPACE_BEGIN
83class MediaIOPortGroup :
public ObjectBase {
84 PROMEKI_OBJECT(MediaIOPortGroup, ObjectBase)
86 friend class MediaIOSink;
87 friend class MediaIOSource;
88 friend class MediaIOReadCache;
89 friend class CommandMediaIO;
92 using PortList = ::promeki::List<MediaIOPort *>;
115 MediaIOPortGroup(MediaIO *mediaIO,
const String &name,
const Clock::Ptr &clock);
118 ~MediaIOPortGroup()
override;
121 MediaIO *mediaIO()
const {
return _mediaIO; }
124 const String &name()
const {
return _name; }
133 const PortList &ports()
const {
return _ports; }
145 void addPort(MediaIOPort *port);
161 const Clock::Ptr &clock()
const {
return _clock; }
195 MediaIORequest setClock(
const Clock::Ptr &clock);
208 int pendingWrites()
const {
return _pendingWriteCount.value(); }
218 int pendingReads()
const {
return _pendingReadCount.value(); }
228 FrameNumber currentFrame()
const {
return _currentFrame; }
249 double rate()
const {
return _rate; }
268 void setRate(
double r);
319 MediaIORequest seekToFrame(
const FrameNumber &frameNumber,
320 MediaIOSeekMode mode = MediaIO_SeekDefault);
323 FrameCount frameCount()
const {
return _frameCount; }
326 bool canSeek()
const {
return _canSeek; }
329 void setCanSeek(
bool val) { _canSeek = val; }
332 void setFrameCount(
const FrameCount &val) { _frameCount = val; }
335 bool atEnd()
const {
return _atEnd; }
338 const FrameRate &frameRate()
const {
return _frameRate; }
341 void setFrameRate(
const FrameRate &val) { _frameRate = val; }
344 const TimeStamp &originTime()
const {
return _originTime; }
347 void setOriginTime(
const TimeStamp &val) { _originTime = val; }
361 int64_t bytesPerSecond()
const {
return _rateTracker.bytesPerSecond(); }
364 double framesPerSecond()
const {
return _rateTracker.framesPerSecond(); }
367 int64_t framesDroppedTotal()
const {
return _framesDroppedTotal.value(); }
370 int64_t framesRepeatedTotal()
const {
return _framesRepeatedTotal.value(); }
373 int64_t framesLateTotal()
const {
return _framesLateTotal.value(); }
376 MediaIO *_mediaIO =
nullptr;
380 Atomic<int> _pendingWriteCount;
381 Atomic<int> _pendingReadCount;
382 FrameNumber _currentFrame;
383 FrameCount _frameCount;
384 FrameRate _frameRate;
385 TimeStamp _originTime;
386 RateTracker _rateTracker;
387 Atomic<int64_t> _framesDroppedTotal{0};
388 Atomic<int64_t> _framesRepeatedTotal{0};
389 Atomic<int64_t> _framesLateTotal{0};
391 double _rateAccumulator = 0.0;
392 bool _canSeek =
false;