[recorde] revert back to single writers/buffers
This commit is contained in:
parent
03e5cd70c7
commit
5263d04cac
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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); }";
|
||||
|
Loading…
Reference in New Issue
Block a user