Overte C++ Documentation
ArrayClip.h
1 //
2 // Created by Bradley Austin Davis 2015/11/05
3 // Copyright 2015 High Fidelity, Inc.
4 //
5 // Distributed under the Apache License, Version 2.0.
6 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7 //
8 
9 #pragma once
10 #ifndef hifi_Recording_Impl_ArrayClip_h
11 #define hifi_Recording_Impl_ArrayClip_h
12 
13 #include "../Clip.h"
14 
15 #include <mutex>
16 
17 namespace recording {
18 
19 template <typename T>
20 class ArrayClip : public Clip {
21 public:
22  virtual float duration() const override {
23  Locker lock(_mutex);
24  if (_frames.empty()) {
25  return 0;
26  }
27  return Frame::frameTimeToSeconds((*_frames.rbegin()).timeOffset);
28  }
29 
30  virtual size_t frameCount() const override {
31  Locker lock(_mutex);
32  return _frames.size();
33  }
34 
35  virtual Clip::Pointer duplicate() const override {
36  auto result = newClip();
37  Locker lock(_mutex);
38  for (size_t i = 0; i < _frames.size(); ++i) {
39  result->addFrame(readFrame(i));
40  }
41  return result;
42  }
43 
44  virtual void seekFrameTime(Frame::Time offset) override {
45  Locker lock(_mutex);
46  auto itr = std::lower_bound(_frames.begin(), _frames.end(), offset,
47  [](const T& a, Frame::Time b)->bool {
48  return a.timeOffset < b;
49  }
50  );
51  _frameIndex = itr - _frames.begin();
52  }
53 
54  virtual Frame::Time positionFrameTime() const override {
55  Locker lock(_mutex);
56  Frame::Time result = Frame::INVALID_TIME;
57  if (_frameIndex < _frames.size()) {
58  result = _frames[_frameIndex].timeOffset;
59  }
60  return result;
61  }
62 
63  virtual FrameConstPointer peekFrame() const override {
64  Locker lock(_mutex);
65  FrameConstPointer result;
66  if (_frameIndex < _frames.size()) {
67  result = readFrame(_frameIndex);
68  }
69  return result;
70  }
71 
72  virtual FrameConstPointer nextFrame() override {
73  Locker lock(_mutex);
74  FrameConstPointer result;
75  if (_frameIndex < _frames.size()) {
76  result = readFrame(_frameIndex++);
77  }
78  return result;
79  }
80 
81  virtual void skipFrame() override {
82  Locker lock(_mutex);
83  if (_frameIndex < _frames.size()) {
84  ++_frameIndex;
85  }
86  }
87 
88 protected:
89  virtual void reset() override {
90  _frameIndex = 0;
91  }
92 
93  virtual FrameConstPointer readFrame(size_t index) const = 0;
94  std::vector<T> _frames;
95  mutable size_t _frameIndex { 0 };
96 };
97 
98 }
99 
100 #endif