#pragma once #include #include #include #include #include #include #include #include #include #include #include #ifdef QCOM2 #define EGL_EGLEXT_PROTOTYPES #define EGL_NO_X11 #define GL_TEXTURE_EXTERNAL_OES 0x8D65 #include #include #include #endif #include "msgq/visionipc/visionipc_client.h" #include "selfdrive/ui/ui.h" const int FRAME_BUFFER_SIZE = 5; 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 setBackgroundColor(const QColor &color) { bg = color; } void setFrameId(int frame_id) { draw_frame_id = frame_id; } 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(); } virtual mat4 calcFrameMatrix(); void vipcThread(); void clearFrames(); int glWidth(); int glHeight(); GLuint frame_vao, frame_vbo, frame_ibo; GLuint textures[2]; std::unique_ptr program; QColor bg = QColor("#000000"); #ifdef QCOM2 std::map egl_images; #endif 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; std::deque> frames; uint32_t draw_frame_id = 0; uint32_t prev_frame_id = 0; protected slots: void vipcConnected(VisionIpcClient *vipc_client); void vipcFrameReceived(); void availableStreamsUpdated(std::set streams); }; Q_DECLARE_METATYPE(std::set);