#pragma once #include #include #include #include #include #include #include #include #include #include "msgq/visionipc/visionipc_client.h" class CameraWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: using QOpenGLWidget::QOpenGLWidget; explicit CameraWidget(std::string stream_name, VisionStreamType stream_type, QWidget* parent = nullptr); ~CameraWidget(); void setStreamType(VisionStreamType type) { requested_stream_type = type; } VisionStreamType getStreamType() { return active_stream_type; } void stopVipcThread(); signals: void clicked(); void vipcThreadConnected(VisionIpcClient *); void vipcThreadFrameReceived(); void vipcAvailableStreamsUpdated(std::set); protected: void paintGL() override; void initializeGL() override; void showEvent(QShowEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override { emit clicked(); } void vipcThread(); void clearFrames(); GLuint frame_vao, frame_vbo, frame_ibo; GLuint textures[2]; std::unique_ptr shader_program_; QColor bg = Qt::black; std::string stream_name; int stream_width = 0; int stream_height = 0; int stream_stride = 0; std::atomic active_stream_type; std::atomic requested_stream_type; std::set available_streams; QThread *vipc_thread = nullptr; std::recursive_mutex frame_lock; VisionBuf* current_frame_ = nullptr; VisionIpcBufExtra frame_meta_ = {}; protected slots: void vipcConnected(VisionIpcClient *vipc_client); void vipcFrameReceived(); void availableStreamsUpdated(std::set streams); }; Q_DECLARE_METATYPE(std::set);