X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffmpeg_capture.h;fp=ffmpeg_capture.h;h=328685b30208ef9416a7e97047fe23137e57533b;hb=f396212c454be6ddeaf3f04e71ae07f2e44cb831;hp=55eb8979632e62e65ca698dcd49e613c9f1be1ab;hpb=cfcfe8010a40cae1050005637ea1780226cac9cf;p=nageru diff --git a/ffmpeg_capture.h b/ffmpeg_capture.h index 55eb897..328685b 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. @@ -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;