diff options
Diffstat (limited to 'video/video-widget.hpp')
| -rw-r--r-- | video/video-widget.hpp | 31 | 
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);  }; | 
