diff options
Diffstat (limited to 'video/video-widget.hpp')
| -rw-r--r-- | video/video-widget.hpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/video/video-widget.hpp b/video/video-widget.hpp new file mode 100644 index 00000000..4f54b2b9 --- /dev/null +++ b/video/video-widget.hpp @@ -0,0 +1,49 @@ +/* Copyright (c) 2014-2016, 2019 Stanislaw Halik <sthalik@misaki.pl> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + */ + +#pragma once + +#include "compat/math.hpp" +#include "export.hpp" + +#include <vector> +#include <atomic> +#include <tuple> + +#include <QWidget> +#include <QImage> +#include <QTimer> + +#include <QMutex> + +struct OTR_VIDEO_EXPORT video_widget : QWidget +{ + video_widget(QWidget* parent = nullptr); + + void update_image(const QImage& image); + std::tuple<int, int> preview_size() const; + void resizeEvent(QResizeEvent*) override; + void paintEvent(QPaintEvent*) override; + void draw_image(); + bool fresh() const; + +protected: + mutable QMutex mtx { QMutex::NonRecursive }; + QImage texture; + std::vector<unsigned char> vec; + void set_fresh(bool x); + void set_image(const unsigned char* src, int width, int height, int stride, QImage::Format fmt); + +private: + void init_image_nolock(); + QTimer timer; + + std::atomic<QSize> size_ = QSize(320, 240); + std::atomic<bool> fresh_ { false }; + + static_assert(decltype(fresh_)::is_always_lock_free); +}; |
