X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffmpeg_capture.h;h=85e436e65ac9668511db42da92bb6a33d3558c51;hb=fb7eac9998ac186130409e859eb7c63906f7a2fd;hp=55eb8979632e62e65ca698dcd49e613c9f1be1ab;hpb=cfcfe8010a40cae1050005637ea1780226cac9cf;p=nageru diff --git a/ffmpeg_capture.h b/ffmpeg_capture.h index 55eb897..85e436e 100644 --- a/ffmpeg_capture.h +++ b/ffmpeg_capture.h @@ -32,6 +32,7 @@ extern "C" { #include +#include } #include "bmusb/bmusb.h" @@ -62,12 +63,14 @@ public: { std::lock_guard lock(queue_mu); command_queue.push_back(QueuedCommand { QueuedCommand::REWIND }); + producer_thread_should_quit.wakeup(); } void change_rate(double new_rate) { std::lock_guard lock(queue_mu); command_queue.push_back(QueuedCommand { QueuedCommand::CHANGE_RATE, new_rate }); + producer_thread_should_quit.wakeup(); } // CaptureInterface. @@ -128,7 +131,7 @@ public: void stop_dequeue_thread() override; bool get_disconnected() const override { return false; } // We never unplug. - std::map get_available_video_modes() const; + std::map get_available_video_modes() const override; void set_video_mode(uint32_t video_mode_id) override {} // Ignore. uint32_t get_current_video_mode() const override { return 0; } @@ -160,7 +163,7 @@ private: void internal_rewind(); // Returns true if there was an error. - bool process_queued_commands(AVFormatContext *format_ctx, const std::string &pathname, timespec last_modified); + bool process_queued_commands(AVFormatContext *format_ctx, const std::string &pathname, timespec last_modified, bool *rewound); // 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); @@ -190,6 +193,7 @@ private: SwsContextWithDeleter sws_ctx; int sws_last_width = -1, sws_last_height = -1, sws_last_src_format = -1; AVPixelFormat sws_dst_format = AVPixelFormat(-1); // In practice, always initialized. + AVRational video_timebase; QuittableSleeper producer_thread_should_quit; std::thread producer_thread;