X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fffmpeg_capture.h;h=122bf86726ba4cb6d73a70a0ca81166d6e7d7431;hb=HEAD;hp=1fc8f7128f516d6b4d06431b3049256f7bbdf7f7;hpb=1be4f26ad8f13698671d63f203ec0433cf4cf4aa;p=nageru diff --git a/nageru/ffmpeg_capture.h b/nageru/ffmpeg_capture.h index 1fc8f71..b974583 100644 --- a/nageru/ffmpeg_capture.h +++ b/nageru/ffmpeg_capture.h @@ -24,7 +24,12 @@ // see the subtitle until the next frame. #include +#include #include +#include + +#include +#include #include #include #include @@ -32,12 +37,15 @@ #include #include #include +#include #include #include extern "C" { +#include #include +#include #include #include #include @@ -52,14 +60,15 @@ struct AVFormatContext; struct AVFrame; struct AVRational; struct AVPacket; +class QSurface; class FFmpegCapture : public bmusb::CaptureInterface { public: - FFmpegCapture(const std::string &filename, unsigned width, unsigned height); + FFmpegCapture(const std::string &filename, unsigned width, unsigned height, QSurface *surface); #ifdef HAVE_SRT // Takes ownership of the SRT client socket. - FFmpegCapture(int srt_sock, const std::string &stream_id); + FFmpegCapture(int srt_sock, const std::string &stream_id, QSurface *surface); #endif ~FFmpegCapture(); @@ -159,9 +168,13 @@ public: std::placeholders::_11); } - // FFmpegCapture-specific callback that gives the raw audio. - typedef std::function audio_callback_t; - void set_audio_callback(audio_callback_t callback) + // FFmpegCapture-specific callback that gives the raw audio/video. + typedef std::function packet_callback_t; + void set_video_callback(packet_callback_t callback) + { + video_callback = callback; + } + void set_audio_callback(packet_callback_t callback) { audio_callback = callback; } @@ -284,6 +297,10 @@ private: std::atomic should_interrupt{false}; bool last_frame_was_connected = true; + // TODO: Replace with std::optional if we go C++17. + bool frame_timeout_valid = false; // If true, will time out any reads after ten seconds. + std::chrono::steady_clock::time_point frame_timeout_started; // Only relevant if frame_timeout_valid == true. + bool has_dequeue_callbacks = false; std::function dequeue_init_callback = nullptr; std::function dequeue_cleanup_callback = nullptr; @@ -297,7 +314,8 @@ private: std::unique_ptr owned_video_frame_allocator; std::unique_ptr owned_audio_frame_allocator; frame_callback_t frame_callback = nullptr; - audio_callback_t audio_callback = nullptr; + packet_callback_t video_callback = nullptr; + packet_callback_t audio_callback = nullptr; SwsContextWithDeleter sws_ctx; int sws_last_width = -1, sws_last_height = -1, sws_last_src_format = -1; @@ -321,7 +339,7 @@ private: // Audio resampler. SwrContext *resampler = nullptr; AVSampleFormat last_src_format, last_dst_format; - int64_t last_channel_layout; + AVChannelLayout last_channel_layout; int last_sample_rate; // Subtitles (no decoding done, really). @@ -334,6 +352,7 @@ private: // -1 is strictly speaking outside the range of the enum, but hopefully, it will be alright. AVColorSpace last_colorspace = static_cast(-1); AVChromaLocation last_chroma_location = static_cast(-1); + QSurface *const surface; }; #endif // !defined(_FFMPEG_CAPTURE_H)