#include <movit/ycbcr.h>
#include "bmusb/bmusb.h"
+#include "ffmpeg_raii.h"
#include "quittable_sleeper.h"
+struct AVFormatContext;
+
class FFmpegCapture : public bmusb::CaptureInterface
{
public:
bool play_video(const std::string &pathname);
void internal_rewind();
+ // Returns true if there was an error.
+ bool process_queued_commands(AVFormatContext *format_ctx, const std::string &pathname, timespec last_modified);
+
+ // Returns nullptr if no frame was decoded (e.g. EOF).
+ AVFrameWithDeleter decode_frame(AVFormatContext *format_ctx, AVCodecContext *codec_ctx, const std::string &pathname, int video_stream_index, bool *error);
+
std::string description, filename;
uint16_t timecode = 0;
unsigned width, height;
movit::YCbCrFormat current_frame_ycbcr_format;
bool running = false;
int card_index = -1;
+ double rate = 1.0;
bool has_dequeue_callbacks = false;
std::function<void()> dequeue_init_callback = nullptr;