[recorde] revert back to single writers/buffers

This commit is contained in:
Jan Grewe 2024-03-12 15:33:28 +01:00
parent 03e5cd70c7
commit 5263d04cac
2 changed files with 84 additions and 142 deletions

View File

@ -34,8 +34,7 @@
PylonRecorder::PylonRecorder(QWidget *parent)
: QMainWindow(parent), imageLabel(new QLabel), scrollArea(new QScrollArea),
singlecamgrabber(nullptr), dualcamgrabber(nullptr),
writer0(nullptr), writer1(nullptr),
buffer0(nullptr), buffer1(nullptr),
writer(nullptr), buffer(nullptr),
singlecam(nullptr), dualcam(nullptr),
dryRun(false), cameraOpened(false), camsconfigured(false)
{
@ -119,9 +118,9 @@ PylonRecorder::~PylonRecorder(){
singlecamgrabber->requestStop();
singlecamgrabber->wait(1000);
}
if (writer0 != nullptr && writer0->isRunning()) {
writer0->forceStop();
writer0->wait(1000);
if (writer != nullptr && writer->isRunning()) {
writer->forceStop();
writer->wait(1000);
}
storeSettings();
if (singlecam != nullptr) {
@ -135,16 +134,12 @@ PylonRecorder::~PylonRecorder(){
dualcam = nullptr;
}
if (buffer0 != nullptr) {
if (buffer != nullptr) {
qDebug() << "Deleting buffer";
delete buffer0;
buffer0 = nullptr;
}
if (buffer1 != nullptr) {
qDebug() << "Deleting buffer";
delete buffer1;
buffer1 = nullptr;
delete buffer;
buffer = nullptr;
}
if (singlecamgrabber != nullptr) {
qDebug() << "Deleting grabber";
delete singlecamgrabber;
@ -155,15 +150,10 @@ PylonRecorder::~PylonRecorder(){
delete dualcamgrabber;
dualcamgrabber = nullptr;
}
if (writer0 != nullptr) {
qDebug() << "Deleting writer";
delete writer0;
writer0 = nullptr;
}
if (writer1 != nullptr) {
if (writer != nullptr) {
qDebug() << "Deleting writer";
delete writer1;
writer1 = nullptr;
delete writer;
writer = nullptr;
}
qDebug() << "Deleting setting";
delete settings;
@ -206,11 +196,8 @@ bool PylonRecorder::loadFile(const QString &fileName) {
.arg(QDir::toNativeSeparators(fileName), reader.errorString()));
return false;
}
setImage(newImage);
setWindowFilePath(fileName);
const QString message = tr("Opened \"%1\", %2x%3, Depth: %4")
.arg(QDir::toNativeSeparators(fileName)).arg(image.width()).arg(image.height()).arg(image.depth());
statusBar()->showMessage(message);
@ -700,20 +687,22 @@ void PylonRecorder::disconnectCamera() {
VideoSpecs PylonRecorder::getVideoSpecs(const ImageSettings &settings) {
VideoSpecs s = VideoSpecs();
if (this->layout.mode == CameraMode::single && this->layout.devices.size() > 0) {
s.fps = framerateSpinner->value();
s.exposureTime = static_cast<double>(exposureSpinner->value());
s.detectorGain = static_cast<double>(gainSpinner->value());
if (!this->layout.devices.size() > 0) {
return s;
}
s.fps = framerateSpinner->value();
s.exposureTime = static_cast<double>(exposureSpinner->value());
s.detectorGain = static_cast<double>(gainSpinner->value());
s.pixelType = settings.pixelType;
s.orientation = settings.orientation;
s.quality = 95;
if (layout.mode == CameraMode::single) {
s.width = static_cast<uint32_t>(this->layout.rois[0].width);
s.height = static_cast<uint32_t>(this->layout.rois[0].height);
s.xoffset = static_cast<uint32_t>(this->layout.rois[0].x);
s.yoffset = static_cast<uint32_t>(this->layout.rois[0].y);
s.pixelType = settings.pixelType;
s.orientation = settings.orientation;
s.quality = 95;
} else {
qWarning() << "Dual camera mode not supported yet!";
} else if (layout.mode == CameraMode::dual) {
s.width = static_cast<uint32_t>(this->layout.rois[0].width * 2);
s.height = static_cast<uint32_t>(this->layout.rois[0].height);
}
return s;
}
@ -721,7 +710,7 @@ VideoSpecs PylonRecorder::getVideoSpecs(const ImageSettings &settings) {
void PylonRecorder::startSinglecamRecording() {
qDebug() << "start single-camera recording!";
std::string filename = createFilename(".mp4");
std::string filename = createFilename("", ".mp4");
fileLabel->setText(QString::fromStdString(filename));
qDebug() << "storing to file " << filename.c_str();
@ -733,15 +722,15 @@ void PylonRecorder::startSinglecamRecording() {
specs.format = VideoFormat::mp4;
qDebug() << "got video specifications";
if (buffer0 != nullptr) {
buffer0->clear();
delete buffer0;
buffer0 = nullptr;
if (buffer != nullptr) {
buffer->clear();
delete buffer;
buffer = nullptr;
}
qDebug() << "setting image buffer to size " << buffersizeSpinner->value();
buffer0 = new ImageBuffer(defaultBufferSize);
if (buffersizeSpinner->value() != static_cast<int>(buffer0->capacity())) {
buffer0->resize(static_cast<size_t>(buffersizeSpinner->value()));
buffer = new ImageBuffer(defaultBufferSize);
if (buffersizeSpinner->value() != static_cast<int>(buffer->capacity())) {
buffer->resize(static_cast<size_t>(buffersizeSpinner->value()));
loadBar->setRange(0, buffersizeSpinner->value());
}
@ -750,7 +739,7 @@ void PylonRecorder::startSinglecamRecording() {
delete singlecamgrabber;
singlecamgrabber = nullptr;
}
singlecamgrabber = new Grabber(singlecam, buffer0, defaultFrameRate);
singlecamgrabber = new Grabber(singlecam, buffer, defaultFrameRate);
if (framerateSpinner->value() != singlecamgrabber->currentFramerate())
singlecamgrabber->setFrameRate(framerateSpinner->value());
@ -760,22 +749,21 @@ void PylonRecorder::startSinglecamRecording() {
singlecamgrabber->setGain(static_cast<double>(gainSpinner->value()));
qDebug() << "setup writer";
if (writer0 != nullptr) {
delete writer0;
writer0 = nullptr;
if (writer != nullptr) {
delete writer;
writer = nullptr;
}
writer0 = new Writer(buffer0, 0);
connect(writer0, SLOT(writingDone( int)), this, SLOT(writerDone( int )));
writer0->setVideoSpecs(specs);
writer = new Writer(buffer, 0);
connect(writer, SLOT(writingDone( int)), this, SLOT(writerDone( int )));
writer->setVideoSpecs(specs);
QSettings s;
this->mdata.read(s);
writer0->setProjectMetadata(mdata);
writer->setProjectMetadata(mdata);
buffer0->clear();
buffer->clear();
if (!dryRunCheckBox->isChecked()) {
writer0->start();
iswriting[0] = true;
writer->start();
writing = true;
}
dryRun = dryRunCheckBox->isChecked();
@ -787,51 +775,37 @@ void PylonRecorder::startSinglecamRecording() {
void PylonRecorder::startDualcamRecording() {
qDebug() << "start dual-camera recording!";
std::string filenamea = createFilename("a", ".mp4");
std::string filenameb = createFilename("b", ".mp4");
fileLabel->setText(QString::fromStdString(filenamea + " & " + filenameb));
qDebug() << "storing to files " << filenamea.c_str() << ", " << filenameb.c_str();
std::string filename = createFilename("", ".mp4");
fileLabel->setText(QString::fromStdString(filename));
qDebug() << "storing to files " << filename.c_str();
ImageSettings settings = dualcam->getImageSettings(0);
ImageSettings settings = dualcam->getImageSettings(0); //FIXME!
qDebug() << "got image settings";
VideoSpecs specsa = getVideoSpecs(settings);
specsa.filename = filenamea;
specsa.format = VideoFormat::mp4;
VideoSpecs specsb = getVideoSpecs(settings);
specsb.filename = filenameb;
specsb.format = VideoFormat::mp4;
VideoSpecs specs = getVideoSpecs(settings);
specs.filename = filename;
specs.format = VideoFormat::mp4;
qDebug() << "got video specifications";
if (buffer0 != nullptr) {
buffer0->clear();
delete buffer0;
buffer0 = nullptr;
}
if (buffer1 != nullptr) {
buffer1->clear();
delete buffer1;
buffer1 = nullptr;
if (buffer != nullptr) {
buffer->clear();
delete buffer;
buffer = nullptr;
}
qDebug() << "setting image buffer to size " << buffersizeSpinner->value();
buffer0 = new ImageBuffer(defaultBufferSize);
if (buffersizeSpinner->value() != static_cast<int>(buffer0->capacity())) {
buffer0->resize(static_cast<size_t>(buffersizeSpinner->value()));
buffer = new ImageBuffer(defaultBufferSize);
if (buffersizeSpinner->value() != static_cast<int>(buffer->capacity())) {
buffer->resize(static_cast<size_t>(buffersizeSpinner->value()));
loadBar->setRange(0, buffersizeSpinner->value());
}
buffer1 = new ImageBuffer(defaultBufferSize);
if (buffersizeSpinner->value() != static_cast<int>(buffer1->capacity())) {
buffer1->resize(static_cast<size_t>(buffersizeSpinner->value()));
}
qDebug() << "setting up grabber";
if (dualcamgrabber != nullptr) {
delete dualcamgrabber;
dualcamgrabber = nullptr;
}
dualcamgrabber = new DualcamGrabber(dualcam, buffer0, buffer1, defaultFrameRate);
dualcamgrabber = new DualcamGrabber(dualcam, buffer, defaultFrameRate);
if (framerateSpinner->value() != dualcamgrabber->currentFramerate())
dualcamgrabber->setFrameRate(framerateSpinner->value());
if (exposureSpinner->value() != int(dualcamgrabber->currentExposureTime()))
@ -840,42 +814,26 @@ void PylonRecorder::startDualcamRecording() {
dualcamgrabber->setGain(static_cast<double>(gainSpinner->value()));
qDebug() << "setting up writers";
if (writer0 != nullptr) {
delete writer0;
writer0 = nullptr;
}
writer0 = new Writer(buffer0, 0);
connect(writer0, SIGNAL(writingDone(int)), this, SLOT(writerDone( int )));
writer0->setVideoSpecs(specsa);
if (writer1 != nullptr) {
delete writer1;
writer1 = nullptr;
if (writer != nullptr) {
delete writer;
writer = nullptr;
}
writer1 = new Writer(buffer1, 1);
connect(writer1, SIGNAL(writingDone(int)), this, SLOT(writerDone( int )));
writer1->setVideoSpecs(specsb);
writer = new Writer(buffer, 0);
connect(writer, SIGNAL(writingDone(int)), this, SLOT(writerDone( int )));
writer->setVideoSpecs(specs);
qDebug() << "push metadata to writer";
QSettings s;
this->mdata.read(s);
writer0->setProjectMetadata(mdata);
buffer0->clear();
if (!dryRunCheckBox->isChecked()) {
writer0->start();
writing = true;
iswriting[0] = true;
}
writer->setProjectMetadata(mdata);
buffer1->clear();
if (!dryRunCheckBox->isChecked()) {
writer1->start();
dryRun = dryRunCheckBox->isChecked();
buffer->clear();
if (!dryRun) {
writer->start();
writing = true;
iswriting[1] = true;
}
dryRun = dryRunCheckBox->isChecked();
dualcamgrabber->start();
grabbing = true;
stopRequest = false;
@ -906,37 +864,26 @@ void PylonRecorder::stopRecording() {
qDebug() << "StopRecording: stop grabber!";
if (singlecamgrabber !=nullptr)
singlecamgrabber->requestStop();
qDebug() << "StopRecording: stop writer!";
if (writer0 != nullptr)
writer0->requestStop();
if (writer1 != nullptr)
writer1->requestStop();
if (dualcamgrabber !=nullptr)
dualcamgrabber->requestStop();
qDebug() << "StopRecording: stop writer!";
if (writer != nullptr)
writer->requestStop();
grabbing = false;
stopRequest = true;
grab_stop_action->setEnabled(false);
qDebug() << "StopRecording: clear buffer!";
if(buffer0 != nullptr) {
buffer0->clear();
if(buffer != nullptr) {
buffer->clear();
// writerDone( 0 ); // Needed? or even dangerous?
}
qDebug() << "StopRecording: clear buffer!";
if(buffer1 != nullptr) {
buffer1->clear();
// writerDone( 1 );
}
}
qDebug() << "StopRecording done!";
}
void PylonRecorder::writerDone(int cam) {
std::cerr << "writer " << cam << "is Done!!!" << std::endl;
iswriting[cam] = false;
if (iswriting[0] + iswriting[1] > 0) {
qDebug() << "waiting for the other writer to finish";
return;
}
pressureTimer->stop();
pressureBar->reset();
loadBar->reset();
@ -948,13 +895,9 @@ void PylonRecorder::writerDone(int cam) {
} else {
dualcamgrabber->wait(10000);
}
if (writer0 != nullptr)
writer0->wait(10000);
if (writer1 != nullptr)
writer1->wait(10000);
if (writer != nullptr)
writer->wait(10000);
writing = false;
iswriting[0] = false;
iswriting[1] = false;
updateActions();
qInfo() << "writer is Done!";
}
@ -970,9 +913,8 @@ void PylonRecorder::displayActivity() {
void PylonRecorder::displaySingleFrame() {
MyImage *img;
size_t fc = 0;
img = buffer0->readLast(fc);
img = buffer->readLast(fc);
if (img != nullptr){
std::cerr << "display, last frame count " << fc << std::endl;
QImage qimg(static_cast<uchar *>(img->data()), img->width(), img->height(), QImage::Format::Format_Grayscale8);
setImage(qimg);
}else {
@ -1008,13 +950,13 @@ std::string PylonRecorder::createFilename(const std::string &suffix, const std::
void PylonRecorder::displayBufferPressure() {
int value = static_cast<int>(round(buffer0->bufferPressure()));
int value = static_cast<int>(round(buffer->bufferPressure()));
pressureBar->setValue(value);
QColor color = progressColor(value);
progressPalette.setBrush(QPalette::Highlight, QBrush(color));
pressureBar->setPalette(progressPalette);
int load = static_cast<int>(buffer0->bufferLoad());
int load = static_cast<int>(buffer->bufferLoad());
loadBar->setValue(load);
}

View File

@ -13,6 +13,7 @@
#include "grabber.h"
#include "dualcamgrabber.h"
#include "writer.h"
#include "opencvwriter.h"
#include "projectsettings.h"
#include "camconfig.h"
#include "util.h"
@ -105,13 +106,12 @@ private:
double scaleFactor = 1;
PylonWrapper *singlecam;
DualcamWrapper *dualcam;
ImageBuffer *buffer0, *buffer1;
ImageBuffer *buffer;
Grabber *singlecamgrabber;
DualcamGrabber *dualcamgrabber;
Writer *writer0, *writer1;
Writer *writer;
CameraLayout layout;
bool grabbing, stopRequest, writing, labelSwitch, dryRun, cameraOpened, camsconfigured;
bool iswriting[2] = {0, 0};
QPalette progressPalette;
QString activeLabelStyleHigh = "QLabel { font-size: 10pt;font-family: Arial; color : red; }";
QString activeLabelStyleLow = "QLabel { font-size: 10pt;font-family: Arial; color : cmyk(0, 255, 255, 0, 50); }";