10 #ifndef hifi_Recording_Impl_ArrayClip_h
11 #define hifi_Recording_Impl_ArrayClip_h
20 class ArrayClip :
public Clip {
22 virtual float duration()
const override {
24 if (_frames.empty()) {
27 return Frame::frameTimeToSeconds((*_frames.rbegin()).timeOffset);
30 virtual size_t frameCount()
const override {
32 return _frames.size();
35 virtual Clip::Pointer duplicate()
const override {
36 auto result = newClip();
38 for (
size_t i = 0; i < _frames.size(); ++i) {
39 result->addFrame(readFrame(i));
44 virtual void seekFrameTime(Frame::Time offset)
override {
46 auto itr = std::lower_bound(_frames.begin(), _frames.end(), offset,
47 [](
const T& a, Frame::Time b)->bool {
48 return a.timeOffset < b;
51 _frameIndex = itr - _frames.begin();
54 virtual Frame::Time positionFrameTime()
const override {
56 Frame::Time result = Frame::INVALID_TIME;
57 if (_frameIndex < _frames.size()) {
58 result = _frames[_frameIndex].timeOffset;
63 virtual FrameConstPointer peekFrame()
const override {
65 FrameConstPointer result;
66 if (_frameIndex < _frames.size()) {
67 result = readFrame(_frameIndex);
72 virtual FrameConstPointer nextFrame()
override {
74 FrameConstPointer result;
75 if (_frameIndex < _frames.size()) {
76 result = readFrame(_frameIndex++);
81 virtual void skipFrame()
override {
83 if (_frameIndex < _frames.size()) {
89 virtual void reset()
override {
93 virtual FrameConstPointer readFrame(
size_t index)
const = 0;
94 std::vector<T> _frames;
95 mutable size_t _frameIndex { 0 };