libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
mediaiostatscollector.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <cstddef>
14#include <functional>
17#include <promeki/namespace.h>
18
19PROMEKI_NAMESPACE_BEGIN
20
35struct MediaIOStatsCollectorKey {
37 MediaIOCommand::Kind kind = MediaIOCommand::Open;
38
40 MediaIOStats::ID id;
41
43 bool operator==(const MediaIOStatsCollectorKey &o) const noexcept {
44 return kind == o.kind && id == o.id;
45 }
46
48 bool operator!=(const MediaIOStatsCollectorKey &o) const noexcept { return !(*this == o); }
49};
50
51PROMEKI_NAMESPACE_END
52
60template <> struct std::hash<promeki::MediaIOStatsCollectorKey> {
61 std::size_t operator()(const promeki::MediaIOStatsCollectorKey &k) const noexcept {
62 std::size_t h = std::hash<promeki::MediaIOStats::ID>{}(k.id);
63 h ^= static_cast<std::size_t>(k.kind) + 0x9e3779b97f4a7c15ULL + (h << 6) + (h >> 2);
64 return h;
65 }
66};
67
68#include <promeki/hashmap.h>
69#include <promeki/objectbase.h>
71
72PROMEKI_NAMESPACE_BEGIN
73
74class MediaIO;
75
116class MediaIOStatsCollector : public ObjectBase {
117 PROMEKI_OBJECT(MediaIOStatsCollector, ObjectBase)
118 public:
120 using Key = MediaIOStatsCollectorKey;
121
123 using WindowMap = HashMap<Key, WindowedStat>;
124
126 static constexpr int DefaultWindowSize = 256;
127
137 explicit MediaIOStatsCollector(ObjectBase *parent = nullptr);
138
145 explicit MediaIOStatsCollector(MediaIO *target, ObjectBase *parent = nullptr);
146
148 ~MediaIOStatsCollector() override;
149
151 MediaIO *target() const { return const_cast<ObjectBasePtr<MediaIO> &>(_target).data(); }
152
162 void setTarget(MediaIO *io);
163
165 int windowSize() const { return _windowSize; }
166
176 void setWindowSize(int n);
177
187 const WindowMap &windows() const { return _windows; }
188
193 WindowedStat window(const Key &key) const;
194
196 void clear();
197
198 private:
199 void onCommandCompleted(MediaIOCommand::Ptr cmd);
200
201 ObjectBasePtr<MediaIO> _target;
202 int _windowSize = DefaultWindowSize;
203 WindowMap _windows;
204};
205
206PROMEKI_NAMESPACE_END
207
208#endif // PROMEKI_ENABLE_PROAV