add fit to widget option to camera view (#22056)

* add fit to widget option to camera view

* add clicked signal

* cleanup

* use release for driverview

Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 86a73497de
commatwo_master
Adeeb Shihadeh 4 years ago committed by GitHub
parent ea344bb52f
commit 8cbf48b550
  1. 4
      selfdrive/ui/qt/offroad/driverview.cc
  2. 2
      selfdrive/ui/qt/offroad/driverview.h
  3. 63
      selfdrive/ui/qt/widgets/cameraview.cc
  4. 8
      selfdrive/ui/qt/widgets/cameraview.h

@ -12,7 +12,7 @@ DriverViewWindow::DriverViewWindow(QWidget* parent) : QWidget(parent) {
layout = new QStackedLayout(this); layout = new QStackedLayout(this);
layout->setStackingMode(QStackedLayout::StackAll); layout->setStackingMode(QStackedLayout::StackAll);
cameraView = new CameraViewWidget(VISION_STREAM_RGB_FRONT, this); cameraView = new CameraViewWidget(VISION_STREAM_RGB_FRONT, true, this);
layout->addWidget(cameraView); layout->addWidget(cameraView);
scene = new DriverViewScene(this); scene = new DriverViewScene(this);
@ -21,7 +21,7 @@ DriverViewWindow::DriverViewWindow(QWidget* parent) : QWidget(parent) {
layout->setCurrentWidget(scene); layout->setCurrentWidget(scene);
} }
void DriverViewWindow::mousePressEvent(QMouseEvent* e) { void DriverViewWindow::mouseReleaseEvent(QMouseEvent* e) {
emit done(); emit done();
} }

@ -39,7 +39,7 @@ signals:
void done(); void done();
protected: protected:
void mousePressEvent(QMouseEvent* e) override; void mouseReleaseEvent(QMouseEvent* e) override;
private: private:
CameraViewWidget *cameraView; CameraViewWidget *cameraView;

@ -1,8 +1,8 @@
#include "selfdrive/ui/qt/widgets/cameraview.h"
#include "selfdrive/ui/qt/qt_window.h" #include "selfdrive/ui/qt/qt_window.h"
#include "selfdrive/ui/qt/widgets/cameraview.h"
namespace { namespace {
const char frame_vertex_shader[] = const char frame_vertex_shader[] =
#ifdef NANOVG_GL3_IMPLEMENTATION #ifdef NANOVG_GL3_IMPLEMENTATION
"#version 150 core\n" "#version 150 core\n"
@ -73,9 +73,27 @@ mat4 get_driver_view_transform() {
return transform; return transform;
} }
mat4 get_fit_view_transform(float widget_aspect_ratio, float frame_aspect_ratio) {
float zx = 1, zy = 1;
if (frame_aspect_ratio > widget_aspect_ratio) {
zy = widget_aspect_ratio / frame_aspect_ratio;
} else {
zx = frame_aspect_ratio / widget_aspect_ratio;
}
const mat4 frame_transform = {{
zx, 0.0, 0.0, 0.0,
0.0, zy, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0,
}};
return frame_transform;
}
} // namespace } // namespace
CameraViewWidget::CameraViewWidget(VisionStreamType stream_type, QWidget* parent) : stream_type(stream_type), QOpenGLWidget(parent) { CameraViewWidget::CameraViewWidget(VisionStreamType stream_type, bool zoom, QWidget* parent) :
stream_type(stream_type), zoomed_view(zoom), QOpenGLWidget(parent) {
setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_OpaquePaintEvent);
timer = new QTimer(this); timer = new QTimer(this);
@ -125,6 +143,29 @@ void CameraViewWidget::initializeGL() {
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0); glBindVertexArray(0);
vipc_client = std::make_unique<VisionIpcClient>("camerad", stream_type, true);
}
void CameraViewWidget::showEvent(QShowEvent *event) {
timer->start(0);
}
void CameraViewWidget::hideEvent(QHideEvent *event) {
timer->stop();
vipc_client->connected = false;
latest_frame = nullptr;
}
void CameraViewWidget::mouseReleaseEvent(QMouseEvent *event) {
emit clicked();
}
void CameraViewWidget::resizeGL(int w, int h) {
if (!vipc_client->connected) {
return;
}
if (zoomed_view) {
if (stream_type == VISION_STREAM_RGB_FRONT) { if (stream_type == VISION_STREAM_RGB_FRONT) {
frame_mat = matmul(device_transform, get_driver_view_transform()); frame_mat = matmul(device_transform, get_driver_view_transform());
} else { } else {
@ -144,17 +185,12 @@ void CameraViewWidget::initializeGL() {
}}; }};
frame_mat = matmul(device_transform, frame_transform); frame_mat = matmul(device_transform, frame_transform);
} }
vipc_client = std::make_unique<VisionIpcClient>("camerad", stream_type, true); } else {
} // fit frame to widget size
float w = (float)width() / height();
void CameraViewWidget::showEvent(QShowEvent *event) { float f = (float)vipc_client->buffers[0].width / vipc_client->buffers[0].height;
timer->start(0); frame_mat = matmul(device_transform, get_fit_view_transform(w, f));
} }
void CameraViewWidget::hideEvent(QHideEvent *event) {
timer->stop();
vipc_client->connected = false;
latest_frame = nullptr;
} }
void CameraViewWidget::paintGL() { void CameraViewWidget::paintGL() {
@ -204,6 +240,7 @@ void CameraViewWidget::updateFrame() {
assert(glGetError() == GL_NO_ERROR); assert(glGetError() == GL_NO_ERROR);
} }
latest_frame = nullptr; latest_frame = nullptr;
resizeGL(width(), height());
} }
if (vipc_client->connected) { if (vipc_client->connected) {

@ -16,22 +16,26 @@ Q_OBJECT
public: public:
using QOpenGLWidget::QOpenGLWidget; using QOpenGLWidget::QOpenGLWidget;
explicit CameraViewWidget(VisionStreamType stream_type, QWidget* parent = nullptr); explicit CameraViewWidget(VisionStreamType stream_type, bool zoom, QWidget* parent = nullptr);
~CameraViewWidget(); ~CameraViewWidget();
signals: signals:
void clicked();
void frameUpdated(); void frameUpdated();
protected: protected:
void paintGL() override; void paintGL() override;
void resizeGL(int w, int h) override;
void initializeGL() override; void initializeGL() override;
void showEvent(QShowEvent *event) override; void showEvent(QShowEvent *event) override;
void hideEvent(QHideEvent *event) override; void hideEvent(QHideEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
protected slots: protected slots:
void updateFrame(); void updateFrame();
private: private:
bool zoomed_view;
VisionBuf *latest_frame = nullptr; VisionBuf *latest_frame = nullptr;
GLuint frame_vao, frame_vbo, frame_ibo; GLuint frame_vao, frame_vbo, frame_ibo;
mat4 frame_mat; mat4 frame_mat;
@ -39,6 +43,6 @@ private:
std::unique_ptr<EGLImageTexture> texture[UI_BUF_COUNT]; std::unique_ptr<EGLImageTexture> texture[UI_BUF_COUNT];
std::unique_ptr<GLShader> gl_shader; std::unique_ptr<GLShader> gl_shader;
VisionStreamType stream_type;
QTimer* timer; QTimer* timer;
VisionStreamType stream_type;
}; };

Loading…
Cancel
Save