|
|
@ -96,8 +96,8 @@ mat4 get_fit_view_transform(float widget_aspect_ratio, float frame_aspect_ratio) |
|
|
|
CameraWidget::CameraWidget(std::string stream_name, VisionStreamType type, bool zoom, QWidget* parent) : |
|
|
|
CameraWidget::CameraWidget(std::string stream_name, VisionStreamType type, bool zoom, QWidget* parent) : |
|
|
|
stream_name(stream_name), stream_type(type), zoomed_view(zoom), QOpenGLWidget(parent) { |
|
|
|
stream_name(stream_name), stream_type(type), zoomed_view(zoom), QOpenGLWidget(parent) { |
|
|
|
setAttribute(Qt::WA_OpaquePaintEvent); |
|
|
|
setAttribute(Qt::WA_OpaquePaintEvent); |
|
|
|
connect(this, &CameraWidget::vipcThreadConnected, this, &CameraWidget::vipcConnected, Qt::BlockingQueuedConnection); |
|
|
|
QObject::connect(this, &CameraWidget::vipcThreadConnected, this, &CameraWidget::vipcConnected, Qt::BlockingQueuedConnection); |
|
|
|
connect(this, &CameraWidget::vipcThreadFrameReceived, this, &CameraWidget::vipcFrameReceived); |
|
|
|
QObject::connect(this, &CameraWidget::vipcThreadFrameReceived, this, &CameraWidget::vipcFrameReceived, Qt::QueuedConnection); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CameraWidget::~CameraWidget() { |
|
|
|
CameraWidget::~CameraWidget() { |
|
|
@ -162,13 +162,13 @@ void CameraWidget::initializeGL() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void CameraWidget::showEvent(QShowEvent *event) { |
|
|
|
void CameraWidget::showEvent(QShowEvent *event) { |
|
|
|
frames.clear(); |
|
|
|
|
|
|
|
if (!vipc_thread) { |
|
|
|
if (!vipc_thread) { |
|
|
|
vipc_thread = new QThread(); |
|
|
|
vipc_thread = new QThread(); |
|
|
|
connect(vipc_thread, &QThread::started, [=]() { vipcThread(); }); |
|
|
|
connect(vipc_thread, &QThread::started, [=]() { vipcThread(); }); |
|
|
|
connect(vipc_thread, &QThread::finished, vipc_thread, &QObject::deleteLater); |
|
|
|
connect(vipc_thread, &QThread::finished, vipc_thread, &QObject::deleteLater); |
|
|
|
vipc_thread->start(); |
|
|
|
vipc_thread->start(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
clearFrames(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void CameraWidget::hideEvent(QHideEvent *event) { |
|
|
|
void CameraWidget::hideEvent(QHideEvent *event) { |
|
|
@ -178,6 +178,7 @@ void CameraWidget::hideEvent(QHideEvent *event) { |
|
|
|
vipc_thread->wait(); |
|
|
|
vipc_thread->wait(); |
|
|
|
vipc_thread = nullptr; |
|
|
|
vipc_thread = nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
clearFrames(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void CameraWidget::updateFrameMat() { |
|
|
|
void CameraWidget::updateFrameMat() { |
|
|
@ -233,6 +234,7 @@ void CameraWidget::paintGL() { |
|
|
|
glClearColor(bg.redF(), bg.greenF(), bg.blueF(), bg.alphaF()); |
|
|
|
glClearColor(bg.redF(), bg.greenF(), bg.blueF(), bg.alphaF()); |
|
|
|
glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); |
|
|
|
glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::lock_guard lk(frame_lock); |
|
|
|
if (frames.empty()) return; |
|
|
|
if (frames.empty()) return; |
|
|
|
|
|
|
|
|
|
|
|
int frame_idx = frames.size() - 1; |
|
|
|
int frame_idx = frames.size() - 1; |
|
|
@ -249,14 +251,14 @@ void CameraWidget::paintGL() { |
|
|
|
qDebug() << "Skipped frame" << frames[frame_idx].first; |
|
|
|
qDebug() << "Skipped frame" << frames[frame_idx].first; |
|
|
|
} |
|
|
|
} |
|
|
|
prev_frame_id = frames[frame_idx].first; |
|
|
|
prev_frame_id = frames[frame_idx].first; |
|
|
|
|
|
|
|
VisionBuf *frame = frames[frame_idx].second; |
|
|
|
|
|
|
|
assert(frame != nullptr); |
|
|
|
|
|
|
|
|
|
|
|
glViewport(0, 0, width(), height()); |
|
|
|
glViewport(0, 0, width(), height()); |
|
|
|
glBindVertexArray(frame_vao); |
|
|
|
glBindVertexArray(frame_vao); |
|
|
|
glUseProgram(program->programId()); |
|
|
|
glUseProgram(program->programId()); |
|
|
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); |
|
|
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); |
|
|
|
|
|
|
|
|
|
|
|
VisionBuf *frame = frames[frame_idx].second; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef QCOM2 |
|
|
|
#ifdef QCOM2 |
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, egl_images[frame->idx]); |
|
|
|
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, egl_images[frame->idx]); |
|
|
@ -288,7 +290,6 @@ void CameraWidget::paintGL() { |
|
|
|
|
|
|
|
|
|
|
|
void CameraWidget::vipcConnected(VisionIpcClient *vipc_client) { |
|
|
|
void CameraWidget::vipcConnected(VisionIpcClient *vipc_client) { |
|
|
|
makeCurrent(); |
|
|
|
makeCurrent(); |
|
|
|
frames.clear(); |
|
|
|
|
|
|
|
stream_width = vipc_client->buffers[0].width; |
|
|
|
stream_width = vipc_client->buffers[0].width; |
|
|
|
stream_height = vipc_client->buffers[0].height; |
|
|
|
stream_height = vipc_client->buffers[0].height; |
|
|
|
stream_stride = vipc_client->buffers[0].stride; |
|
|
|
stream_stride = vipc_client->buffers[0].stride; |
|
|
@ -339,11 +340,7 @@ void CameraWidget::vipcConnected(VisionIpcClient *vipc_client) { |
|
|
|
updateFrameMat(); |
|
|
|
updateFrameMat(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void CameraWidget::vipcFrameReceived(VisionBuf *buf, uint32_t frame_id) { |
|
|
|
void CameraWidget::vipcFrameReceived() { |
|
|
|
frames.push_back(std::make_pair(frame_id, buf)); |
|
|
|
|
|
|
|
while (frames.size() > FRAME_BUFFER_SIZE) { |
|
|
|
|
|
|
|
frames.pop_front(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
update(); |
|
|
|
update(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -354,11 +351,13 @@ void CameraWidget::vipcThread() { |
|
|
|
|
|
|
|
|
|
|
|
while (!QThread::currentThread()->isInterruptionRequested()) { |
|
|
|
while (!QThread::currentThread()->isInterruptionRequested()) { |
|
|
|
if (!vipc_client || cur_stream_type != stream_type) { |
|
|
|
if (!vipc_client || cur_stream_type != stream_type) { |
|
|
|
|
|
|
|
clearFrames(); |
|
|
|
cur_stream_type = stream_type; |
|
|
|
cur_stream_type = stream_type; |
|
|
|
vipc_client.reset(new VisionIpcClient(stream_name, cur_stream_type, false)); |
|
|
|
vipc_client.reset(new VisionIpcClient(stream_name, cur_stream_type, false)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!vipc_client->connected) { |
|
|
|
if (!vipc_client->connected) { |
|
|
|
|
|
|
|
clearFrames(); |
|
|
|
if (!vipc_client->connect(false)) { |
|
|
|
if (!vipc_client->connect(false)) { |
|
|
|
QThread::msleep(100); |
|
|
|
QThread::msleep(100); |
|
|
|
continue; |
|
|
|
continue; |
|
|
@ -367,7 +366,14 @@ void CameraWidget::vipcThread() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (VisionBuf *buf = vipc_client->recv(&meta_main, 1000)) { |
|
|
|
if (VisionBuf *buf = vipc_client->recv(&meta_main, 1000)) { |
|
|
|
emit vipcThreadFrameReceived(buf, meta_main.frame_id); |
|
|
|
{ |
|
|
|
|
|
|
|
std::lock_guard lk(frame_lock); |
|
|
|
|
|
|
|
frames.push_back(std::make_pair(meta_main.frame_id, buf)); |
|
|
|
|
|
|
|
while (frames.size() > FRAME_BUFFER_SIZE) { |
|
|
|
|
|
|
|
frames.pop_front(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
emit vipcThreadFrameReceived(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -378,3 +384,8 @@ void CameraWidget::vipcThread() { |
|
|
|
egl_images.clear(); |
|
|
|
egl_images.clear(); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CameraWidget::clearFrames() { |
|
|
|
|
|
|
|
std::lock_guard lk(frame_lock); |
|
|
|
|
|
|
|
frames.clear(); |
|
|
|
|
|
|
|
} |
|
|
|