You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					65 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					65 lines
				
				1.8 KiB
			| 
											4 months ago
										 | #pragma once
 | ||
|  | 
 | ||
|  | #include <memory>
 | ||
|  | #include <mutex>
 | ||
|  | #include <set>
 | ||
|  | #include <string>
 | ||
|  | #include <utility>
 | ||
|  | 
 | ||
|  | #include <QOpenGLFunctions>
 | ||
|  | #include <QOpenGLShaderProgram>
 | ||
|  | #include <QOpenGLWidget>
 | ||
|  | #include <QThread>
 | ||
|  | 
 | ||
|  | #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<VisionStreamType>);
 | ||
|  | 
 | ||
|  | 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<QOpenGLShaderProgram> shader_program_;
 | ||
|  |   QColor bg = Qt::black;
 | ||
|  | 
 | ||
|  |   std::string stream_name;
 | ||
|  |   int stream_width = 0;
 | ||
|  |   int stream_height = 0;
 | ||
|  |   int stream_stride = 0;
 | ||
|  |   std::atomic<VisionStreamType> active_stream_type;
 | ||
|  |   std::atomic<VisionStreamType> requested_stream_type;
 | ||
|  |   std::set<VisionStreamType> 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<VisionStreamType> streams);
 | ||
|  | };
 | ||
|  | 
 | ||
|  | Q_DECLARE_METATYPE(std::set<VisionStreamType>);
 |