66 lines
1.8 KiB
C++
66 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include "fl/bytestream.h"
|
|
#include "fl/file_system.h"
|
|
#include "fx/video/frame_interpolator.h"
|
|
#include "fx/video/pixel_stream.h"
|
|
#include "fl/stdint.h"
|
|
|
|
#include "fl/namespace.h"
|
|
|
|
namespace fl {
|
|
FASTLED_SMART_PTR(FileHandle);
|
|
FASTLED_SMART_PTR(ByteStream);
|
|
} // namespace fl
|
|
|
|
namespace fl {
|
|
|
|
FASTLED_SMART_PTR(VideoImpl);
|
|
FASTLED_SMART_PTR(FrameInterpolator);
|
|
FASTLED_SMART_PTR(PixelStream)
|
|
|
|
class VideoImpl {
|
|
public:
|
|
enum {
|
|
kSizeRGB8 = 3,
|
|
};
|
|
// frameHistoryCount is the number of frames to keep in the buffer after
|
|
// draw. This allows for time based effects like syncing video speed to
|
|
// audio triggers.
|
|
VideoImpl(size_t pixelsPerFrame, float fpsVideo,
|
|
size_t frameHistoryCount = 0);
|
|
~VideoImpl();
|
|
// Api
|
|
void begin(fl::FileHandlePtr h);
|
|
void beginStream(fl::ByteStreamPtr s);
|
|
void setFade(fl::u32 fadeInTime, fl::u32 fadeOutTime);
|
|
bool draw(fl::u32 now, CRGB *leds);
|
|
void end();
|
|
bool rewind();
|
|
// internal use
|
|
bool draw(fl::u32 now, Frame *frame);
|
|
bool full() const;
|
|
void setTimeScale(float timeScale);
|
|
float timeScale() const { return mTimeScale; }
|
|
size_t pixelsPerFrame() const { return mPixelsPerFrame; }
|
|
void pause(fl::u32 now);
|
|
void resume(fl::u32 now);
|
|
bool needsFrame(fl::u32 now) const;
|
|
int32_t durationMicros() const; // -1 if this is a stream.
|
|
|
|
private:
|
|
bool updateBufferIfNecessary(fl::u32 prev, fl::u32 now);
|
|
bool updateBufferFromFile(fl::u32 now, bool forward);
|
|
bool updateBufferFromStream(fl::u32 now);
|
|
fl::u32 mPixelsPerFrame = 0;
|
|
PixelStreamPtr mStream;
|
|
fl::u32 mPrevNow = 0;
|
|
FrameInterpolatorPtr mFrameInterpolator;
|
|
TimeWarpPtr mTime;
|
|
fl::u32 mFadeInTime = 1000;
|
|
fl::u32 mFadeOutTime = 1000;
|
|
float mTimeScale = 1.0f;
|
|
};
|
|
|
|
} // namespace fl
|