mirror of
https://github.com/vale981/Taevitas
synced 2025-03-05 09:31:42 -05:00
some little tweaks
This commit is contained in:
parent
3e3c103c93
commit
28703fe31b
4 changed files with 2 additions and 498 deletions
|
@ -36,7 +36,6 @@ MainWindow::MainWindow( QWidget * parent ) :
|
||||||
// Connect Frame Counts, Time Captured LCD
|
// Connect Frame Counts, Time Captured LCD
|
||||||
connect( &recorder, &Recorder::frameSaved, this, [this] {
|
connect( &recorder, &Recorder::frameSaved, this, [this] {
|
||||||
ui->framesCaptured->display( recorder.frameNumber() );
|
ui->framesCaptured->display( recorder.frameNumber() );
|
||||||
qDebug() << recorder.timeCaptured();
|
|
||||||
ui->timeCaptured->display( QString( "%1:%2" ).arg( ( ( ( int )recorder.timeCaptured() ) / 60 ) ).arg( ( int )recorder.timeCaptured() % 60 ) );
|
ui->timeCaptured->display( QString( "%1:%2" ).arg( ( ( ( int )recorder.timeCaptured() ) / 60 ) ).arg( ( int )recorder.timeCaptured() % 60 ) );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
@ -264,6 +263,7 @@ void MainWindow::startStopRecording() {
|
||||||
}
|
}
|
||||||
|
|
||||||
setStatus( RECORDING );
|
setStatus( RECORDING );
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Stop Capture!
|
// Stop Capture!
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1,307 +0,0 @@
|
||||||
#include "mainwindow.h"
|
|
||||||
#include "ui_mainwindow.h"
|
|
||||||
#include <QPushButton>
|
|
||||||
#include <QImage>
|
|
||||||
#include <QGraphicsItem>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QTime>
|
|
||||||
#include <QErrorMessage>
|
|
||||||
#include <QFileDialog>
|
|
||||||
|
|
||||||
// TODO: Handle Errors!!
|
|
||||||
// TODO: Handle Disconnect!!
|
|
||||||
|
|
||||||
MainWindow::MainWindow( QWidget * parent ) :
|
|
||||||
QMainWindow( parent ),
|
|
||||||
ui( new Ui::MainWindow ),
|
|
||||||
camMan( this ),
|
|
||||||
recorder( this, 18, false ),
|
|
||||||
resize { false } {
|
|
||||||
ui->setupUi( this );
|
|
||||||
|
|
||||||
// Set Scene and Hide Preview Widget
|
|
||||||
ui->preview_widget->hide();
|
|
||||||
|
|
||||||
fit();
|
|
||||||
|
|
||||||
// Set status
|
|
||||||
setStatus( WAITING );
|
|
||||||
|
|
||||||
// Try to connect to first cam
|
|
||||||
scanAndUpdateCameras();
|
|
||||||
|
|
||||||
// Set default name
|
|
||||||
ui->projectName->setText( "Taevitas_Rec_" + QDateTime::currentDateTime().toString( "dd_MM_yyyy_hh_mm_ss" ) );
|
|
||||||
|
|
||||||
// Connect Frame Counts, Time Captured LCD
|
|
||||||
connect( &recorder, &Recorder::frameSaved, this, [this] {
|
|
||||||
ui->framesCaptured->display( recorder.frameNumber() );
|
|
||||||
qDebug() << recorder.timeCaptured();
|
|
||||||
ui->timeCaptured->display( QString( "%1:%2" ).arg( ( ( ( int )recorder.timeCaptured() ) / 60 ) ).arg( ( int )recorder.timeCaptured() % 60 ) );
|
|
||||||
} );
|
|
||||||
|
|
||||||
// Connect Events
|
|
||||||
connect( ui->preview_button, &QPushButton::clicked, this, &MainWindow::togglePreview );
|
|
||||||
|
|
||||||
// Cam ComboBox clicked
|
|
||||||
connect( ui->camScanButton, &QPushButton::clicked, this, &MainWindow::scanAndUpdateCameras );
|
|
||||||
|
|
||||||
// Camera selected
|
|
||||||
connect( ui->cameraSelector, static_cast<void( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &MainWindow::cameraSelected );
|
|
||||||
|
|
||||||
// File Selector
|
|
||||||
connect( ui->directorySelector, &QPushButton::clicked, this, &MainWindow::directorySelection );
|
|
||||||
|
|
||||||
// Frame Captured
|
|
||||||
connect( &camMan, &CameraManager::frameCaptured, this, &MainWindow::frameCaptured, Qt::DirectConnection );
|
|
||||||
|
|
||||||
// Change Project Name
|
|
||||||
connect( ui->projectName, &QLineEdit::textChanged, this, &MainWindow::enableStart );
|
|
||||||
|
|
||||||
// Change Record Frames
|
|
||||||
connect( ui->saveFrames, &QCheckBox::toggled, &recorder, &Recorder::setCaptureFrames );
|
|
||||||
|
|
||||||
// Start recording
|
|
||||||
connect( ui->startButton, &QPushButton::clicked, this, &MainWindow::startStopRecording );
|
|
||||||
}
|
|
||||||
|
|
||||||
MainWindow::~MainWindow() {
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::setStatus( STATUS status ) {
|
|
||||||
switch ( status ) {
|
|
||||||
case WAITING:
|
|
||||||
disableRecOptions();
|
|
||||||
ui->statusLabel->setText( "Waiting..." );
|
|
||||||
ui->startButton->setText( "Start" );
|
|
||||||
ui->recStats->hide();
|
|
||||||
break;
|
|
||||||
case CONNECTED:
|
|
||||||
enableRecOptions();
|
|
||||||
ui->statusLabel->setText( "Connected." );
|
|
||||||
ui->startButton->setText( "Start" );
|
|
||||||
ui->recStats->hide();
|
|
||||||
qDebug( "Connected...." );
|
|
||||||
break;
|
|
||||||
case RECORDING:
|
|
||||||
ui->timeCaptured->display( QString( "00:00" ) );
|
|
||||||
ui->framesCaptured->display( 0 );
|
|
||||||
|
|
||||||
ui->statusLabel->setText( "Recording!" );
|
|
||||||
ui->startButton->setText( "Stop" );
|
|
||||||
ui->recStats->show();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME
|
|
||||||
void MainWindow::fit() {
|
|
||||||
setMinimumSize( 0, 0 );
|
|
||||||
setMaximumSize( 5000, 5000 );
|
|
||||||
adjustSize();
|
|
||||||
//setFixedSize( this->size() );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::updateCameraList( unsigned int num_cameras ) {
|
|
||||||
ui->cameraSelector->clear();
|
|
||||||
|
|
||||||
// Fill Combo Box with cameras
|
|
||||||
for ( unsigned int i = 0; i < num_cameras; i++ ) {
|
|
||||||
ui->cameraSelector->addItem( QString( i + '0' ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::scanAndUpdateCameras() {
|
|
||||||
unsigned int num_cameras = camMan.numCameras();
|
|
||||||
updateCameraList( num_cameras );
|
|
||||||
if ( num_cameras > 0 && !camMan.isConnected() )
|
|
||||||
cameraSelectnnnned( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::disableRecOptions() {
|
|
||||||
ui->recOptions->setProperty( "enabled", false );
|
|
||||||
ui->startButton->setProperty( "enabled", false );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::enableRecOptions() {
|
|
||||||
ui->recOptions->setProperty( "enabled", true );
|
|
||||||
enableStart();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::enableStart() {
|
|
||||||
if ( ui->projectName->text() != "t" && recorder.dirSet() && camMan.isConnected() ) {
|
|
||||||
ui->startButton->setProperty( "enabled", true );
|
|
||||||
} else {
|
|
||||||
ui->startButton->setProperty( "enabled", true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::showError( QString error ) {
|
|
||||||
QMessageBox errBox;
|
|
||||||
errBox.critical( 0, "Error", "An Error has occured:\n" + error );
|
|
||||||
errBox.setFixedSize( 500, 200 );
|
|
||||||
errBox.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::showError( FlyCapture2::Error error ) {
|
|
||||||
showError( error.GetDescription() );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::cameraSelected( int index ) {
|
|
||||||
if ( recorder.isRecording() || index < 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
try {
|
|
||||||
camMan.connectCamera( index );
|
|
||||||
} catch ( FlyCapture2::Error e ) {
|
|
||||||
showError( e );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setStatus( CONNECTED );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show/Hide Preview
|
|
||||||
void MainWindow::togglePreview( bool checked ) {
|
|
||||||
// skip if there is no camera
|
|
||||||
if ( !camMan.isConnected() ) {
|
|
||||||
ui->preview_button->setProperty( "checked", false );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( checked ) {
|
|
||||||
ui->preview_widget->setProperty( "enabled", true );
|
|
||||||
resize = true;
|
|
||||||
|
|
||||||
// Start Capturing for preview
|
|
||||||
try {
|
|
||||||
camMan.startCapture();
|
|
||||||
} catch ( FlyCapture2::Error e ) {
|
|
||||||
showError( e );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ui->preview_widget->setProperty( "enabled", false );
|
|
||||||
ui->preview_widget->hide();
|
|
||||||
|
|
||||||
//Stop capture
|
|
||||||
if ( !recorder.isRecording() )
|
|
||||||
camMan.stopCapture();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::frameCaptured( FlyCapture2::Image * image ) {
|
|
||||||
qDebug() << "Image Captured!";
|
|
||||||
|
|
||||||
// If preview is activated...
|
|
||||||
if ( ui->preview_widget->isEnabled() )
|
|
||||||
displayPreview( image );
|
|
||||||
|
|
||||||
if ( recorder.isRecording() )
|
|
||||||
recorder.appendFrame( image );
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Render Preview
|
|
||||||
void MainWindow::displayPreview( FlyCapture2::Image * last_capture ) {
|
|
||||||
ui->preview_widget->show();
|
|
||||||
|
|
||||||
FlyCapture2::Image last_image;
|
|
||||||
QImage last_preview_image;
|
|
||||||
QPixmap last_preview;
|
|
||||||
|
|
||||||
// Convert Pixel Format to RGB
|
|
||||||
FlyCapture2::Error e = last_capture->Convert( FlyCapture2::PIXEL_FORMAT_RGB, &last_image );
|
|
||||||
|
|
||||||
last_preview_image = QImage( last_image.GetData(), last_image.GetCols(), last_image.GetRows(), QImage::Format_RGB888 );
|
|
||||||
|
|
||||||
last_preview_image = last_preview_image.scaledToHeight( 500 );
|
|
||||||
ui->preview_widget->setFixedSize( last_preview_image.width(), last_preview_image.height() );
|
|
||||||
|
|
||||||
last_preview.convertFromImage( last_preview_image );
|
|
||||||
ui->preview_widget->setPixmap( last_preview );
|
|
||||||
|
|
||||||
if ( resize ) {
|
|
||||||
fit();
|
|
||||||
resize = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::directorySelection() {
|
|
||||||
QString dir = QFileDialog::getExistingDirectory( this, tr( "Choose the working Directory." ), ( recorder.dirSet() ? recorder.getProjectDir() : QStandardPaths::writableLocation( QStandardPaths::DocumentsLocation ) ), QFileDialog::ShowDirsOnly );
|
|
||||||
try {
|
|
||||||
recorder.setProjectDir( dir );
|
|
||||||
enableStart();
|
|
||||||
} catch ( FlyCapture2::Error e ) {
|
|
||||||
showError( e );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::startStopRecording() {
|
|
||||||
// TODO: Errors
|
|
||||||
if ( !recorder.isRecording() ) {
|
|
||||||
// TODO: Maybe allow dynamic setting...
|
|
||||||
ui->saveFrames->setProperty( "enabled", false );
|
|
||||||
|
|
||||||
if ( !camMan.isCapturing() ) {
|
|
||||||
try {
|
|
||||||
camMan.startCapture();
|
|
||||||
} catch ( FlyCapture2::Error e ) {
|
|
||||||
showError( e );
|
|
||||||
ui->saveFrames->setProperty( "enabled", true );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
recorder.newRecording( ui->projectName->text() );
|
|
||||||
} catch ( RecorderError ) {
|
|
||||||
showError( "Could not start Recording!" );
|
|
||||||
ui->saveFrames->setProperty( "enabled", true );
|
|
||||||
stopCapture();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setStatus( RECORDING );
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// Stop Capture!
|
|
||||||
try {
|
|
||||||
camMan.stopCapture();
|
|
||||||
} catch ( FlyCapture2::Error e ) {
|
|
||||||
showError( e );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
recorder.stopRecording();
|
|
||||||
} catch ( FlyCapture2::Error e ) {
|
|
||||||
showError( e );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restart Preview
|
|
||||||
if ( ui->preview_button->isChecked() ) {
|
|
||||||
try {
|
|
||||||
camMan.startCapture();
|
|
||||||
} catch ( FlyCapture2::Error e ) {
|
|
||||||
showError( e );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->saveFrames->setProperty( "enabled", true );
|
|
||||||
setStatus( CONNECTED );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::stopCapture() {
|
|
||||||
if ( !ui->preview_button->isChecked() ) {
|
|
||||||
try {
|
|
||||||
camMan.stopCapture();
|
|
||||||
} catch ( FlyCapture2::Error e ) {
|
|
||||||
showError( e );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -129,7 +129,6 @@ RecorderError Recorder::verifyRecDir() {
|
||||||
return RecorderError::OK;
|
return RecorderError::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Capture Status...
|
|
||||||
void Recorder::stopRecording() {
|
void Recorder::stopRecording() {
|
||||||
if ( is_recording ) {
|
if ( is_recording ) {
|
||||||
// Stop Recorder
|
// Stop Recorder
|
||||||
|
@ -179,6 +178,7 @@ void Recorder::appendFrame( FlyCapture2::Image * image ) {
|
||||||
|
|
||||||
frame_n++;
|
frame_n++;
|
||||||
time_c = frame_n / options.frameRate;
|
time_c = frame_n / options.frameRate;
|
||||||
|
qDebug() << time_c;
|
||||||
emit frameSaved();
|
emit frameSaved();
|
||||||
|
|
||||||
// Go to begining.
|
// Go to begining.
|
||||||
|
|
|
@ -1,189 +0,0 @@
|
||||||
#include "recorder.h"
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QRegExp>
|
|
||||||
|
|
||||||
using namespace FlyCapture2;
|
|
||||||
|
|
||||||
Recorder::Recorder( QObject * parent, unsigned int frame_rate, bool cap_frames ) : QObject( parent ), is_recording {false}, frame_n {0}, time_c {0}, pDirSet { false } {
|
|
||||||
// No Compression for frame_captures
|
|
||||||
frame_options.compression = frame_options.NONE;
|
|
||||||
options.frameRate = frame_rate;
|
|
||||||
capture_frames = cap_frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
Recorder::~Recorder() {
|
|
||||||
stopRecording();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Recorder::setProjectDir( QString &p_dir ) {
|
|
||||||
QFileInfo pDirInfo( p_dir );
|
|
||||||
if ( !pDirInfo.isDir() || !pDirInfo.isWritable() ) {
|
|
||||||
throw RecorderError::INVALID_PROJECT_DIRECTORY;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
baseDir = QDir( p_dir );
|
|
||||||
pDirSet = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Recorder::newRecording( QString r_name ) {
|
|
||||||
stopRecording();
|
|
||||||
|
|
||||||
// If unset.
|
|
||||||
if ( !dirSet() ) {
|
|
||||||
throw RecorderError::INVALID_PROJECT_DIRECTORY;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( r_name.length() == 0 ) {
|
|
||||||
throw RecorderError::INVALID_RECORDING_NAME;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean r_name // TODO: Maybe Visual Feedback for that...
|
|
||||||
r_name.replace(QRegExp("[^\w\s]", Qt::CaseInsensitive), "");
|
|
||||||
recName = r_name;
|
|
||||||
|
|
||||||
// Verify Recdir... create directories...
|
|
||||||
record_dir = QDir( baseDir.path() + "/" + recName );
|
|
||||||
// Change to try/catch
|
|
||||||
RecorderError err = verifyRecDir();
|
|
||||||
if ( err != RecorderError::OK ) {
|
|
||||||
throw err;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool statExists = QFile( record_dir.path() + "/" + ".stat" ).exists();
|
|
||||||
|
|
||||||
// get Status file
|
|
||||||
statFile = new QFile( record_dir.path() + "/" + ".stat" );
|
|
||||||
if ( !statFile->open( QIODevice::ReadWrite | QIODevice::Text ) ) {
|
|
||||||
throw RecorderError::CANT_OPEN_STATFILE;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !statExists ) {
|
|
||||||
statFile->write( "0" );
|
|
||||||
}
|
|
||||||
|
|
||||||
frame_n = 0;
|
|
||||||
time_c = 0;
|
|
||||||
|
|
||||||
// If append, figure out Frame count etc...
|
|
||||||
if ( append ) {
|
|
||||||
if ( !restoreRecording() ) {
|
|
||||||
throw RecorderError::STATFILE_ERROR;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Error f_err;
|
|
||||||
|
|
||||||
qDebug() << ( record_dir.path() + "/" + recName ).toStdString().c_str();
|
|
||||||
// open AVI in recorder
|
|
||||||
f_err = recorder.AVIOpen( ( record_dir.path() + "/" + recName + "_" + QString::number( frame_n ) + ".avi" ).toStdString().c_str(), &options );
|
|
||||||
if ( f_err != PGRERROR_OK ) {
|
|
||||||
throw f_err;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
is_recording = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Recorder::restoreRecording() {
|
|
||||||
bool ok;
|
|
||||||
|
|
||||||
QByteArray tmp = statFile->readLine();
|
|
||||||
frame_n = QString( tmp ).toUInt( &ok );
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
RecorderError Recorder::verifyRecDir() {
|
|
||||||
// check if project with same name exists and append to that
|
|
||||||
|
|
||||||
if ( record_dir.exists() ) {
|
|
||||||
QMessageBox msgBox;
|
|
||||||
|
|
||||||
msgBox.setText( tr( "A recording with this name already exists. Which action should be taken?" ) );
|
|
||||||
void * appendButton = msgBox.addButton( tr( "Append the recording." ), QMessageBox::ActionRole );
|
|
||||||
void * removeButton = msgBox.addButton( tr( "Overwrite recording." ), QMessageBox::ActionRole );
|
|
||||||
void * abortButton = msgBox.addButton( QMessageBox::Abort );
|
|
||||||
|
|
||||||
msgBox.exec();
|
|
||||||
|
|
||||||
if ( msgBox.clickedButton() == appendButton ) {
|
|
||||||
append = true;
|
|
||||||
} else if ( msgBox.clickedButton() == removeButton ) {
|
|
||||||
record_dir.removeRecursively();
|
|
||||||
} else if ( msgBox.clickedButton() == abortButton ) {
|
|
||||||
return RecorderError::CANCELED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
baseDir.mkdir( recName );
|
|
||||||
|
|
||||||
if ( capture_frames )
|
|
||||||
record_dir.mkdir( "frames" );
|
|
||||||
|
|
||||||
return RecorderError::OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Recorder::stopRecording() {
|
|
||||||
if ( is_recording ) {
|
|
||||||
// Stop Recorder
|
|
||||||
Error err = recorder.AVIClose();
|
|
||||||
if ( err != PGRERROR_OK ) {
|
|
||||||
throw err;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
is_recording = false;
|
|
||||||
cleanup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Recorder::cleanup() {
|
|
||||||
// Reset Everything
|
|
||||||
if ( !is_recording ) {
|
|
||||||
frame_n = 0;
|
|
||||||
time_c = 0;
|
|
||||||
append = false;
|
|
||||||
delete statFile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Recorder::appendFrame( FlyCapture2::Image * image ) {
|
|
||||||
write_lock.lock();
|
|
||||||
// If not recording, just stop.
|
|
||||||
if ( !is_recording )
|
|
||||||
return;
|
|
||||||
|
|
||||||
Error app_err = recorder.AVIAppend( image );
|
|
||||||
if ( app_err != PGRERROR_OK ) {
|
|
||||||
write_lock.unlock();
|
|
||||||
throw app_err;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// save image as frame
|
|
||||||
if ( capture_frames ) {
|
|
||||||
app_err = image->Save( ( record_dir.path() + "/frames/" + recName + "_" + QString::number( frame_n ) + ".tiff" ).toStdString().c_str(), &frame_options );
|
|
||||||
if ( app_err != PGRERROR_OK ) {
|
|
||||||
write_lock.unlock();
|
|
||||||
throw app_err;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
frame_n++;
|
|
||||||
time_c = frame_n / options.frameRate;
|
|
||||||
emit frameSaved();
|
|
||||||
|
|
||||||
// Go to begining.
|
|
||||||
statFile->seek( 0 );
|
|
||||||
// Write Frames to Stat File.
|
|
||||||
statFile->write( QByteArray::number( frame_n ) );
|
|
||||||
|
|
||||||
write_lock.unlock();
|
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue