#pragma once #include #include #include #include #include #include "cereal/visionipc/visionipc_client.h" #include "selfdrive/camerad/cameras/camera_common.h" #include "selfdrive/common/visionimg.h" #include "selfdrive/ui/ui.h" class CameraViewWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: using QOpenGLWidget::QOpenGLWidget; explicit CameraViewWidget(std::string stream_name, VisionStreamType stream_type, bool zoom, QWidget* parent = nullptr); ~CameraViewWidget(); void setStreamType(VisionStreamType type) { stream_type = type; } void setBackgroundColor(const QColor &color) { bg = color; } signals: void clicked(); void vipcThreadConnected(VisionIpcClient *); void vipcThreadFrameReceived(VisionBuf *); protected: void paintGL() override; void initializeGL() override; void resizeGL(int w, int h) override { updateFrameMat(w, h); } void showEvent(QShowEvent *event) override; void hideEvent(QHideEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override { emit clicked(); } virtual void updateFrameMat(int w, int h); void vipcThread(); struct WaitFence { WaitFence() { sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); } ~WaitFence() { glDeleteSync(sync); } void wait() { glWaitSync(sync, 0, GL_TIMEOUT_IGNORED); } GLsync sync = 0; }; bool zoomed_view; std::mutex lock; int latest_texture_id = -1; GLuint frame_vao, frame_vbo, frame_ibo; mat4 frame_mat; std::unique_ptr wait_fence; std::unique_ptr program; QColor bg = QColor("#000000"); std::string stream_name; int stream_width = 0; int stream_height = 0; std::atomic stream_type; QThread *vipc_thread = nullptr; GLuint textures[3]; protected slots: void vipcConnected(VisionIpcClient *vipc_client); };