#include <movit/mix_effect.h>
#include <movit/ycbcr_input.h>
#include <stdint.h>
+#include <condition_variable>
+#include <deque>
#include <thread>
enum CacheMissBehavior {
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);
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();
void paintGL() override;
private:
- static void jpeg_decoder_thread_func();
+ void jpeg_decoder_thread_func();
FrameReader frame_reader;
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)