]> git.sesse.net Git - nageru/blobdiff - nageru/ffmpeg_capture.h
Fix a Clang 19 warning.
[nageru] / nageru / ffmpeg_capture.h
index 4cddbfddf757bce77a1f49b6c21b52bd7b57675b..b974583a10ef22d3f339859513d74c4797bcb673 100644 (file)
 // see the subtitle until the next frame.
 
 #include <assert.h>
+#include <stddef.h>
 #include <stdint.h>
+#include <time.h>
+
+#include <atomic>
+#include <chrono>
 #include <functional>
 #include <map>
 #include <memory>
 #include <set>
 #include <string>
 #include <thread>
+#include <vector>
 
 #include <movit/effect.h>
 #include <movit/ycbcr.h>
 
 extern "C" {
+#include <libavutil/frame.h>
 #include <libswresample/swresample.h>
+#include <libavutil/channel_layout.h>
 #include <libavutil/pixfmt.h>
 #include <libavutil/rational.h>
 #include <libavutil/samplefmt.h>
@@ -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<void(const AVPacket *pkt, const AVRational timebase)> audio_callback_t;
-       void set_audio_callback(audio_callback_t callback)
+       // FFmpegCapture-specific callback that gives the raw audio/video.
+       typedef std::function<void(const AVPacket *pkt, const AVRational timebase)> 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<bool> 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<void()> dequeue_init_callback = nullptr;
        std::function<void()> dequeue_cleanup_callback = nullptr;
@@ -297,7 +314,8 @@ private:
        std::unique_ptr<bmusb::FrameAllocator> owned_video_frame_allocator;
        std::unique_ptr<bmusb::FrameAllocator> 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).
@@ -329,6 +347,12 @@ private:
        std::string last_subtitle;
 
        movit::RGBTriplet last_neutral_color{1.0f, 1.0f, 1.0f};
+
+       // Used for suppressing repeated warnings. Reset when a video starts playing.
+       // -1 is strictly speaking outside the range of the enum, but hopefully, it will be alright.
+       AVColorSpace last_colorspace = static_cast<AVColorSpace>(-1);
+       AVChromaLocation last_chroma_location = static_cast<AVChromaLocation>(-1);
+       QSurface *const surface;
 };
 
 #endif  // !defined(_FFMPEG_CAPTURE_H)