// CPU conversion), but it would require some more plumbing, and it would also
// fail if the file changes parameters midway, which is allowed in some formats.
//
-// There is currently no audio support. There is also no support for changing
-// the video underway (unlike images), although there really should be.
-// Finally, there is currently no support for controlling the video from Lua.
+// There is currently no audio support.
#include <assert.h>
#include <stdint.h>
#include <thread>
#include "bmusb/bmusb.h"
+#include "quittable_sleeper.h"
class FFmpegCapture : public bmusb::CaptureInterface
{
command_queue.push_back(QueuedCommand { QueuedCommand::REWIND });
}
+ void change_rate(double new_rate)
+ {
+ std::lock_guard<std::mutex> lock(queue_mu);
+ command_queue.push_back(QueuedCommand { QueuedCommand::CHANGE_RATE, new_rate });
+ }
+
// CaptureInterface.
void set_video_frame_allocator(bmusb::FrameAllocator *allocator) override
{
uint32_t get_current_video_mode() const override { return 0; }
std::set<bmusb::PixelFormat> get_available_pixel_formats() const override {
- return std::set<bmusb::PixelFormat>{ bmusb::PixelFormat_8BitRGBA };
+ return std::set<bmusb::PixelFormat>{ bmusb::PixelFormat_8BitBGRA };
}
void set_pixel_format(bmusb::PixelFormat pixel_format) override {
- assert(pixel_format == bmusb::PixelFormat_8BitRGBA);
+ assert(pixel_format == bmusb::PixelFormat_8BitBGRA);
}
bmusb::PixelFormat get_current_pixel_format() const override {
- return bmusb::PixelFormat_8BitRGBA;
+ return bmusb::PixelFormat_8BitBGRA;
}
std::map<uint32_t, std::string> get_available_video_inputs() const override {
private:
void producer_thread_func();
bool play_video(const std::string &pathname);
+ void internal_rewind();
std::string description, filename;
uint16_t timecode = 0;
std::unique_ptr<bmusb::FrameAllocator> owned_audio_frame_allocator;
bmusb::frame_callback_t frame_callback = nullptr;
- std::atomic<bool> producer_thread_should_quit{false};
+ QuittableSleeper producer_thread_should_quit;
std::thread producer_thread;
+ int64_t pts_origin, last_pts;
+ std::chrono::steady_clock::time_point start, next_frame_start;
+
std::mutex queue_mu;
struct QueuedCommand {
- enum Command { REWIND } command;
+ enum Command { REWIND, CHANGE_RATE } command;
+ double new_rate; // For CHANGE_RATE.
};
std::vector<QueuedCommand> command_queue; // Protected by <queue_mu>.
};