From 12c2f6292fbeb2d255cdd32e84d2985e520f3c68 Mon Sep 17 00:00:00 2001
From: Jan Grewe <jan.grewe@g-node.org>
Date: Wed, 12 Mar 2025 10:00:35 +0100
Subject: [PATCH] [recorder] wait for writer to finish before deleting buffer
 ...

more messaging, use the size-aware Image constructor
---
 pylonrecorder.cpp | 51 ++++++++++++++++++++++++++++++-----------------
 1 file changed, 33 insertions(+), 18 deletions(-)

diff --git a/pylonrecorder.cpp b/pylonrecorder.cpp
index 733632c..eb3c785 100644
--- a/pylonrecorder.cpp
+++ b/pylonrecorder.cpp
@@ -87,6 +87,7 @@ PylonRecorder::PylonRecorder(QWidget *parent)
   statusHeader->setStyleSheet("QLabel{font-size: 11pt;font-family: Arial; font-weight: Bold}");
   QLabel *fileHeader = new QLabel("Output file:");
   fileHeader->setStyleSheet("QLabel{font-size: 11pt;font-family: Arial; font-weight: Bold}");
+
   statusBar()->addWidget(camHeader);
   statusBar()->addWidget(cameraConnectedLabel);
   statusBar()->addWidget(pressureLabel);
@@ -98,6 +99,7 @@ PylonRecorder::PylonRecorder(QWidget *parent)
   statusBar()->addWidget(writingLabel);
   statusBar()->addWidget(fileHeader);
   statusBar()->addWidget(fileLabel);
+
   resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5);
   detectCameras();
   createActions();
@@ -206,6 +208,7 @@ bool PylonRecorder::loadFile(const QString &fileName) {
 
 
 void PylonRecorder::setImage(const QImage &newImage) {
+  qDebug() << "Setting image";
   //FIXME figure out how to display both images. extract to extra class...
   image = newImage;
   // (image.colorSpace().isValid())
@@ -223,6 +226,7 @@ void PylonRecorder::setImage(const QImage &newImage) {
     applyScaling();
   }
   this->update();
+  qDebug() << "Setting image done";
 }
 
 
@@ -608,16 +612,17 @@ void PylonRecorder::adjustScrollBar(QScrollBar *scrollBar, double factor) {
 
 
 void PylonRecorder::cameraConfiguration(){
-    cameraConfigDialog = new CamConfigurator(deviceList, this);
-    connect(cameraConfigDialog, SIGNAL(accepted()), SLOT(cameraConfigurationAccepted()));
-    connect(cameraConfigDialog, SIGNAL(rejected()),  SLOT(cameraConfigurationAborted()));
-    // QObject::connect(&d, SIGNAL(column_visibility_changed(QString, QString,bool)), this, SLOT(visible_columns_update(QString, QString,bool)));
-    cameraConfigDialog->exec();
+  qDebug() << "Configuring camera(s)";
+  cameraConfigDialog = new CamConfigurator(deviceList, this);
+  connect(cameraConfigDialog, SIGNAL(accepted()), SLOT(cameraConfigurationAccepted()));
+  connect(cameraConfigDialog, SIGNAL(rejected()),  SLOT(cameraConfigurationAborted()));
+  // QObject::connect(&d, SIGNAL(column_visibility_changed(QString, QString,bool)), this, SLOT(visible_columns_update(QString, QString,bool)));
+  cameraConfigDialog->exec();
 }
 
 
 void PylonRecorder::cameraConfigurationAccepted() {
-  qDebug() << "Cameras setting " << ((cameraConfigDialog->result()) ? "Accepted" : "Discarded");
+  qDebug() << "Camera configuration " << ((cameraConfigDialog->result()) ? "Accepted" : "Discarded");
   this->layout = cameraConfigDialog->layout();
   camsconfigured = true;
   delete cameraConfigDialog;
@@ -627,12 +632,13 @@ void PylonRecorder::cameraConfigurationAccepted() {
 void PylonRecorder::cameraConfigurationAborted() {
   qDebug() << "Camera configuration aborted!";
   camsconfigured = false;
+  delete cameraConfigDialog;
 }
 
 
 void PylonRecorder::connectCamera() {
-  this->layout = CameraLayout();
   qDebug() << "connecting camera(s)";
+  this->layout = CameraLayout();
   if (deviceList.size() == 0) {
     detectCameras();
     QMessageBox msgBox;
@@ -647,6 +653,8 @@ void PylonRecorder::connectCamera() {
     qDebug() << "cameras have not been properly configured!";
     return;
   }
+  
+  //Single Camera mode
   if (layout.mode == CameraMode::single && layout.devices.size() == 1) {
     qDebug() << "single camera mode";
     std::string cname = layout.devices[0];
@@ -668,12 +676,15 @@ void PylonRecorder::connectCamera() {
     statusBar()->showMessage(QString::fromStdString(message));
     updateActions();
   }
+  
+  // Dual Camera mode
   if (layout.mode == CameraMode::dual && layout.devices.size() == 2) {
     qDebug() << "dual camera mode";
     std::string message;
     dualcam = new DualcamWrapper(layout);
     bool success = dualcam->openCameras(message);
     if (success) {
+      qDebug()::cerr << "dual camera connected\n";
       cameraConnectedLabel->setText("connected");
       cameraConnectedLabel->setStyleSheet("QLabel { font-size: 10px;font-family: Arial;color: green;}");
       cameraOpened = true;
@@ -843,10 +854,10 @@ void PylonRecorder::startDualcamRecording() {
   connect(writer, SIGNAL(writingDone()), this, SLOT(writerDone()));
   writer->setVideoSpecs(specs);
 
-  qDebug() << "push metadata to writer";
-  QSettings s;
-  this->mdata.read(s);
-  writer->setProjectMetadata(mdata);
+  // qDebug() << "push metadata to writer";
+  // QSettings s;
+  // this->mdata.read(s);
+  // writer->setProjectMetadata(mdata);
 
   dryRun = dryRunCheckBox->isChecked();
   buffer->clear();
@@ -895,10 +906,8 @@ void PylonRecorder::stopRecording() {
       stopRequest = true;
       grab_stop_action->setEnabled(false);
       qDebug() << "StopRecording: clear buffer!";
-      if(buffer != nullptr) {
-          buffer->clear();
-          if (dryRun)
-            writerDone();
+      if (dryRun){
+        writerDone();
       }
   }
   qDebug() << "StopRecording done!";
@@ -919,8 +928,12 @@ void PylonRecorder::writerDone() {
   }
   if (writer != nullptr)
     writer->wait(10000);
+  if(buffer != nullptr) {
+    buffer->clear();
+  }
   writing = false;
   updateActions();
+
   qInfo() << "writer is Done!";
 }
 
@@ -933,6 +946,7 @@ void PylonRecorder::displayActivity() {
 
 
 void PylonRecorder::displaySingleFrame() {
+  qDebug() << "display single frame";
   MyImage *img;
   size_t fc = 0;
   img = buffer->readLast(fc);
@@ -940,7 +954,7 @@ void PylonRecorder::displaySingleFrame() {
     QImage qimg(static_cast<uchar *>(img->data()), img->width(), img->height(), QImage::Format::Format_Grayscale8);
     setImage(qimg);
   }else {
-      std::cerr << "Error reading last image" << std::endl;
+      qDebug() << "Error reading last image";
   }
 }
 
@@ -986,7 +1000,8 @@ void PylonRecorder::displayBufferPressure() {
 void PylonRecorder::grabStillFromPylon() {
   qDebug() << "Grab still image form camera!";
   if (singlecam != nullptr && singlecam->isOpen()) {
-      MyImage img;
+      ImageSettings s = singlecam->getImageSettings();
+      MyImage img(s.width, s.height);
       bool valid = singlecam->grabFrame(img);
       if (valid) {
           QImage qimg(static_cast<uchar *>(img.data()), img.width(), img.height(),
@@ -996,7 +1011,7 @@ void PylonRecorder::grabStillFromPylon() {
     } else {
       statusBar()->showMessage(tr("Camera is not open! Connect to camera first!"));
     }
-  //FIXME does not work for single camera mode!
+  //FIXME does not work for stereo camera mode!
   qDebug() << "grabbing still image done!";
 }