X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fffmpeg_capture.h;h=2ab9481aad6d351e5597f86cc0df3315a39d6606;hb=d35a697e031264d9102a52b5f41d9f4c057e9f11;hp=685191a1f28bf9f463773fccb9abe3858c46b86d;hpb=4df45e479ddbc8e2247be8aab7f2bab5ddaa1b74;p=nageru diff --git a/nageru/ffmpeg_capture.h b/nageru/ffmpeg_capture.h index 685191a..2ab9481 100644 --- a/nageru/ffmpeg_capture.h +++ b/nageru/ffmpeg_capture.h @@ -159,9 +159,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; } @@ -213,6 +217,7 @@ public: void start_bm_capture() override; void stop_dequeue_thread() override; bool get_disconnected() const override { return disconnected; } // Only if play_once == true. + int get_srt_sock() const { return srt_sock; } std::map get_available_video_modes() const override; void set_video_mode(uint32_t video_mode_id) override {} // Ignore. @@ -266,11 +271,14 @@ private: int read_srt(uint8_t *buf, int buf_size); #endif + inline unsigned frame_width(const AVFrame *frame) const; + inline unsigned frame_height(const AVFrame *frame) const; + mutable std::mutex filename_mu; std::string description, filename; int srt_sock = -1; uint16_t timecode = 0; - unsigned width, height; + unsigned width, height; // 0 means keep input size. bmusb::PixelFormat pixel_format = bmusb::PixelFormat_8BitBGRA; movit::YCbCrFormat current_frame_ycbcr_format; bool running = false; @@ -293,7 +301,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; @@ -325,6 +334,11 @@ 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(-1); + AVChromaLocation last_chroma_location = static_cast(-1); }; #endif // !defined(_FFMPEG_CAPTURE_H)