]> git.sesse.net Git - nageru/blobdiff - futatabi/jpeg_frame_view.h
Log a warning when we kill a client that is not keeping up.
[nageru] / futatabi / jpeg_frame_view.h
index 3ecfa0d2f4568254a4e41fa64798523860755c13..108aa73d0c424eb84f0a42f70dfe578ab94440f3 100644 (file)
@@ -13,6 +13,8 @@
 #include <movit/mix_effect.h>
 #include <movit/ycbcr_input.h>
 #include <stdint.h>
+#include <condition_variable>
+#include <deque>
 #include <thread>
 
 enum CacheMissBehavior {
@@ -22,12 +24,14 @@ enum CacheMissBehavior {
 
 std::shared_ptr<Frame> decode_jpeg(const std::string &jpeg);
 std::shared_ptr<Frame> decode_jpeg_with_cache(FrameOnDisk id, CacheMissBehavior cache_miss_behavior, FrameReader *frame_reader, bool *did_decode);
+std::shared_ptr<Frame> get_black_frame();
 
 class JPEGFrameView : public QGLWidget {
        Q_OBJECT
 
 public:
        JPEGFrameView(QWidget *parent);
+       ~JPEGFrameView();
 
        void setFrame(unsigned stream_idx, FrameOnDisk frame, FrameOnDisk secondary_frame = {}, float fade_alpha = 0.0f);
        void setFrame(std::shared_ptr<Frame> frame);
@@ -39,8 +43,6 @@ public:
        void setDecodedFrame(std::shared_ptr<Frame> frame, std::shared_ptr<Frame> secondary_frame, float fade_alpha);
        void set_overlay(const std::string &text);  // Blank for none.
 
-       static void shutdown();
-
 signals:
        void clicked();
 
@@ -50,7 +52,7 @@ protected:
        void paintGL() override;
 
 private:
-       static void jpeg_decoder_thread_func();
+       void jpeg_decoder_thread_func();
 
        FrameReader frame_reader;
 
@@ -63,7 +65,7 @@ private:
        std::shared_ptr<Frame> current_frame;  // So that we hold on to the pixels.
        std::shared_ptr<Frame> current_secondary_frame;  // Same.
 
-       static constexpr int overlay_base_width = 16, overlay_base_height = 16;
+       int overlay_base_width = 16, overlay_base_height = 16;
        int overlay_width = overlay_base_width, overlay_height = overlay_base_height;
        std::unique_ptr<QImage> overlay_image;  // If nullptr, no overlay.
        std::unique_ptr<movit::EffectChain> overlay_chain;  // Just to get the overlay on screen in the easiest way possible.
@@ -72,7 +74,22 @@ private:
 
        int gl_width, gl_height;
 
-       static std::thread jpeg_decoder_thread;
+       std::thread jpeg_decoder_thread;
+       movit::ResourcePool *resource_pool = nullptr;
+
+       struct PendingDecode {
+               // For actual decodes (only if frame below is nullptr).
+               FrameOnDisk primary, secondary;
+               float fade_alpha;  // Irrelevant if secondary.stream_idx == -1.
+
+               // Already-decoded frames are also sent through PendingDecode,
+               // so that they get drawn in the right order. If frame is nullptr,
+               // it's a real decode.
+               std::shared_ptr<Frame> frame;
+       };
+
+       std::condition_variable any_pending_decodes;
+       std::deque<PendingDecode> pending_decodes;  // Under cache_mu.
 };
 
 #endif  // !defined(_JPEG_FRAME_VIEW_H)