From f7906fd251327298459483e9c21bd263706a2b50 Mon Sep 17 00:00:00 2001 From: masc4ii Date: Wed, 11 Feb 2026 19:55:13 +0100 Subject: [PATCH 1/5] ParallelDNG --- platform/qt/MainWindow.cpp | 118 ++++++++++++++++++++----------------- 1 file changed, 65 insertions(+), 53 deletions(-) diff --git a/platform/qt/MainWindow.cpp b/platform/qt/MainWindow.cpp index 20e870149..def28013f 100755 --- a/platform/qt/MainWindow.cpp +++ b/platform/qt/MainWindow.cpp @@ -2851,9 +2851,6 @@ void MainWindow::startExportCdng(QString fileName) picAR[2] = 1; picAR[3] = 1; } - //Init DNG data struct - dngObject_t * cinemaDng = initDngObject( m_pMlvObject, m_codecProfile - 6, getFramerate(), picAR); - //Render one single frame for raw correction init uint32_t frameSize = getMlvWidth( m_pMlvObject ) * getMlvHeight( m_pMlvObject ) * 3; uint16_t * imgBuffer; @@ -2861,67 +2858,82 @@ void MainWindow::startExportCdng(QString fileName) getMlvProcessedFrame16( m_pMlvObject, 0, imgBuffer, QThread::idealThreadCount() ); free( imgBuffer ); - //Output frames loop - for( uint32_t frame = m_exportQueue.first()->cutIn() - 1; frame < m_exportQueue.first()->cutOut(); frame++ ) + std::atomic doneFrames{0}; + std::atomic abortFlag{false}; + + QTimer* progressTimer = new QTimer(this); + connect(progressTimer, &QTimer::timeout, this, [=,&doneFrames,&abortFlag]() { + m_pStatusDialog->ui->progressBar->setValue(doneFrames.load()); + m_pStatusDialog->ui->progressBar->repaint(); + m_pStatusDialog->drawTimeFromToDoFrames( totalFrames - doneFrames.load() + ( m_exportQueue.first()->cutIn() - 1 ) - 1 ); + qApp->processEvents(); + }); + progressTimer->start(50); + + uint32_t start = m_exportQueue.first()->cutIn() - 1; + uint32_t end = m_exportQueue.first()->cutOut(); + + QMutex mutex; + +#pragma omp parallel { - QString dngName; - if( m_codecOption == CODEC_CNDG_DEFAULT ) dngName = dngName.append( "%1_%2.dng" ) - .arg( fileName ) - .arg( getMlvFrameNumber( m_pMlvObject, frame ), 6, 10, QChar('0') ); - else dngName = dngName.append( "%1_1_%2-%3-%4_0001_C0000_%5.dng" ) - .arg( fileName ) - .arg( getMlvTmYear( m_pMlvObject ), 2, 10, QChar('0') ) - .arg( getMlvTmMonth( m_pMlvObject ), 2, 10, QChar('0') ) - .arg( getMlvTmDay( m_pMlvObject ), 2, 10, QChar('0') ) - .arg( getMlvFrameNumber( m_pMlvObject, frame ), 6, 10, QChar('0') ); + dngObject_t* localDng = initDngObject( + m_pMlvObject, + m_codecProfile - 6, + getFramerate(), + picAR + ); + +#pragma omp for schedule(dynamic) + for (uint32_t frame = start; frame < end; ++frame) + { + if (abortFlag.load()) + continue; + + QString dngName; + if( m_codecOption == CODEC_CNDG_DEFAULT ) dngName = dngName.append( "%1_%2.dng" ) + .arg( fileName ) + .arg( getMlvFrameNumber( m_pMlvObject, frame ), 6, 10, QChar('0') ); + else dngName = dngName.append( "%1_1_%2-%3-%4_0001_C0000_%5.dng" ) + .arg( fileName ) + .arg( getMlvTmYear( m_pMlvObject ), 2, 10, QChar('0') ) + .arg( getMlvTmMonth( m_pMlvObject ), 2, 10, QChar('0') ) + .arg( getMlvTmDay( m_pMlvObject ), 2, 10, QChar('0') ) + .arg( getMlvFrameNumber( m_pMlvObject, frame ), 6, 10, QChar('0') ); + + QString filePathNr = pathName; + filePathNr = filePathNr.append( "/" + dngName ); - QString filePathNr = pathName; - filePathNr = filePathNr.append( "/" + dngName ); + m_pMlvObject->cpu_cores = 1; - //Save cDNG frame + //Save cDNG frame #ifdef Q_OS_UNIX - QString properties_fn = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); - properties_fn.append("/mlv-dng-params.txt"); - if( saveDngFrame( m_pMlvObject, cinemaDng, frame, filePathNr.toUtf8().data(), properties_fn.toUtf8().data() ) ) + QString properties_fn = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); + properties_fn.append("/mlv-dng-params.txt"); + bool error = saveDngFrame( m_pMlvObject, localDng, frame, filePathNr.toUtf8().data(), properties_fn.toUtf8().data() ); #else - QString properties_fn = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); - properties_fn.append("\\mlv-dng-params.txt"); - if( saveDngFrame( m_pMlvObject, cinemaDng, frame, filePathNr.toLatin1().data(), properties_fn.toLatin1().data() ) ) + QString properties_fn = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); + properties_fn.append("\\mlv-dng-params.txt"); + bool error = saveDngFrame( m_pMlvObject, localDng, frame, filePathNr.toLatin1().data(), properties_fn.toLatin1().data() ); #endif - { - m_pStatusDialog->close(); - qApp->processEvents(); - int ret = QMessageBox::critical( this, - tr( "MLV App - Export file error" ), - tr( "Could not save: %1\nHow do you like to proceed?" ).arg( dngName ), - tr( "Skip frame" ), - tr( "Abort current export" ), - tr( "Abort batch export" ), - 0, 2 ); - if( ret == 2 ) - { - exportAbort(); - } - if( ret > 0 ) + + if (error || m_exportAbortPressed) { - break; + abortFlag = true; } - } - //Set Status - m_pStatusDialog->ui->progressBar->setValue( frame - ( m_exportQueue.first()->cutIn() - 1 ) + 1 ); - m_pStatusDialog->ui->progressBar->repaint(); - m_pStatusDialog->drawTimeFromToDoFrames( totalFrames - frame + ( m_exportQueue.first()->cutIn() - 1 ) - 1 ); - qApp->processEvents(); + //Check diskspace + mutex.lock(); + checkDiskFull( filePathNr ); + mutex.unlock(); - //Check diskspace - checkDiskFull( filePathNr ); - //Abort pressed? -> End the loop - if( m_exportAbortPressed ) break; - } + doneFrames++; - //Free DNG data struct - freeDngObject( cinemaDng ); + qApp->processEvents(); + } + + freeDngObject(localDng); + } //Enable GUI drawing m_dontDraw = false; From 0331c27706fa6788d0fddf5aa8be16c32a909e2e Mon Sep 17 00:00:00 2001 From: masc4ii Date: Wed, 11 Feb 2026 20:20:28 +0100 Subject: [PATCH 2/5] One core per dng --- platform/qt/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/qt/MainWindow.cpp b/platform/qt/MainWindow.cpp index def28013f..87bdf88ed 100755 --- a/platform/qt/MainWindow.cpp +++ b/platform/qt/MainWindow.cpp @@ -2870,6 +2870,8 @@ void MainWindow::startExportCdng(QString fileName) }); progressTimer->start(50); + m_pMlvObject->cpu_cores = 1; + uint32_t start = m_exportQueue.first()->cutIn() - 1; uint32_t end = m_exportQueue.first()->cutOut(); @@ -2904,8 +2906,6 @@ void MainWindow::startExportCdng(QString fileName) QString filePathNr = pathName; filePathNr = filePathNr.append( "/" + dngName ); - m_pMlvObject->cpu_cores = 1; - //Save cDNG frame #ifdef Q_OS_UNIX QString properties_fn = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); From 156ae1bd4e1b4258f57eb0828956cfd4d78886c8 Mon Sep 17 00:00:00 2001 From: masc4ii Date: Wed, 11 Feb 2026 20:46:02 +0100 Subject: [PATCH 3/5] Parallel DNG for non-DualISO only --- platform/qt/MainWindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/qt/MainWindow.cpp b/platform/qt/MainWindow.cpp index 87bdf88ed..d6170e473 100755 --- a/platform/qt/MainWindow.cpp +++ b/platform/qt/MainWindow.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #ifdef Q_OS_MACX #include "AvfLibWrapper.h" @@ -2877,7 +2878,7 @@ void MainWindow::startExportCdng(QString fileName) QMutex mutex; -#pragma omp parallel +#pragma omp parallel if( m_pMlvObject->llrawproc->dual_iso == 0 ) { dngObject_t* localDng = initDngObject( m_pMlvObject, From 85850af1d49b51229c7da49b259d44465121db63 Mon Sep 17 00:00:00 2001 From: masc4ii Date: Wed, 11 Feb 2026 20:53:34 +0100 Subject: [PATCH 4/5] Fix: full power DualISO --- platform/qt/MainWindow.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform/qt/MainWindow.cpp b/platform/qt/MainWindow.cpp index d6170e473..0d8296714 100755 --- a/platform/qt/MainWindow.cpp +++ b/platform/qt/MainWindow.cpp @@ -2871,8 +2871,6 @@ void MainWindow::startExportCdng(QString fileName) }); progressTimer->start(50); - m_pMlvObject->cpu_cores = 1; - uint32_t start = m_exportQueue.first()->cutIn() - 1; uint32_t end = m_exportQueue.first()->cutOut(); From 3e577d279adfa07d21b7961c81361460caf7a113 Mon Sep 17 00:00:00 2001 From: masc4ii Date: Wed, 11 Feb 2026 21:10:53 +0100 Subject: [PATCH 5/5] Error on export --- platform/qt/MainWindow.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/platform/qt/MainWindow.cpp b/platform/qt/MainWindow.cpp index 0d8296714..c63d6c2c3 100755 --- a/platform/qt/MainWindow.cpp +++ b/platform/qt/MainWindow.cpp @@ -2861,6 +2861,7 @@ void MainWindow::startExportCdng(QString fileName) std::atomic doneFrames{0}; std::atomic abortFlag{false}; + std::atomic errorFlag{false}; QTimer* progressTimer = new QTimer(this); connect(progressTimer, &QTimer::timeout, this, [=,&doneFrames,&abortFlag]() { @@ -2919,6 +2920,7 @@ void MainWindow::startExportCdng(QString fileName) if (error || m_exportAbortPressed) { abortFlag = true; + errorFlag = true; } //Check diskspace @@ -2934,6 +2936,20 @@ void MainWindow::startExportCdng(QString fileName) freeDngObject(localDng); } + m_pStatusDialog->close(); + if( errorFlag.load() ) + { + int ret = QMessageBox::critical( this, + tr( "MLV App - Export file error" ), + tr( "Error exporting DNG frame.\nAbort batch export?" ), + tr( "Yes" ), + tr( "No" ) ); + if( ret == 0 ) + { + exportAbort(); + } + } + //Enable GUI drawing m_dontDraw = false;