summaryrefslogtreecommitdiffhomepage
path: root/video/video-widget.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'video/video-widget.hpp')
-rw-r--r--video/video-widget.hpp31
1 files changed, 17 insertions, 14 deletions
diff --git a/video/video-widget.hpp b/video/video-widget.hpp
index 563f468c..ab5d42d2 100644
--- a/video/video-widget.hpp
+++ b/video/video-widget.hpp
@@ -11,36 +11,39 @@
#include "export.hpp"
#include <vector>
+#include <atomic>
+#include <tuple>
#include <QWidget>
+#include <QImage>
#include <QTimer>
+
#include <QMutex>
-class OTR_VIDEO_EXPORT video_widget : public QWidget
+struct OTR_VIDEO_EXPORT video_widget : QWidget
{
- Q_OBJECT
-
-public:
video_widget(QWidget* parent = nullptr);
void update_image(const QImage& image);
- void get_preview_size(int& w, int& h);
+ std::tuple<int, int> preview_size() const;
void resizeEvent(QResizeEvent*) override;
-protected slots:
void paintEvent(QPaintEvent*) override;
- void update_and_repaint();
-private:
- QTimer timer;
+ void draw_image();
protected:
- QMutex mtx { QMutex::Recursive };
+ mutable QMutex mtx { QMutex::NonRecursive };
QImage texture;
std::vector<unsigned char> vec;
+ bool fresh() const;
+ void set_fresh(bool x);
+ void set_image(const unsigned char* src, int width, int height, unsigned stride, QImage::Format fmt);
- bool freshp = false;
+private:
+ void init_image_nolock();
+ QTimer timer;
- int W = iround(QWidget::width() * devicePixelRatioF());
- int H = iround(QWidget::height() * devicePixelRatioF());
+ std::atomic<QSize> size_ = QSize(320, 240);
+ std::atomic<bool> fresh_ { false };
- void init_image_nolock();
+ static_assert(decltype(fresh_)::is_always_lock_free);
};