Skip to content

Commit

Permalink
Add support for re-encoding with Intel QSV
Browse files Browse the repository at this point in the history
  • Loading branch information
skyhisi committed Aug 9, 2023
1 parent 4aff8f7 commit b51f244
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 4 deletions.
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"cmake.configureOnOpen": true
}
48 changes: 46 additions & 2 deletions src/clipmergewidget.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright 2021 Silas Parker.
/* Copyright 2021-2023 Silas Parker.
*
* This file is part of NB Dashcam Tools.
*
Expand Down Expand Up @@ -46,6 +46,7 @@ ClipMergeWidget::ClipMergeWidget(QWidget *parent) :
mProgDlg(new QProgressDialog(this)),
mFFmpegRegex("time=(\\d\\d):(\\d\\d):(\\d\\d.\\d\\d)"),
mHaveNvenc(false),
mHaveQsv(false),
mUdtaData()
{
Q_ASSERT(mFFmpegRegex.isValid());
Expand Down Expand Up @@ -369,6 +370,9 @@ void ClipMergeWidget::startMerge()
case VideoEncodeNVidia:
args << "-c:v" << "h264_nvenc" << "-rc" << "vbr" << "-cq" << crfStr;
break;
case VideoEncodeQsv:
args << "-c:v" << "h264_qsv" << "-global_quality" << crfStr;
break;
}

// Subtitle track is GPS data
Expand Down Expand Up @@ -490,13 +494,14 @@ void ClipMergeWidget::nvencCheckStart()
if (!libcuda.load())
{
qDebug() << "Failed to locate libcuda, skipping ffmpeg check: " << libcuda.errorString();
QMetaObject::invokeMethod(this, &ClipMergeWidget::qsvCheckStart, Qt::QueuedConnection);
return;
}
libcuda.unload();
#endif
QStringList nvencCheckArgs;
nvencCheckArgs
<< "-hide_banner"
<< "-hide_banner"<< "-nostdin"
<< "-f" << "lavfi" << "-i" << "nullsrc=s=256x256:d=5"
<< "-c:v" << "hevc_nvenc"
<< "-gpu" << "list"
Expand Down Expand Up @@ -538,6 +543,45 @@ void ClipMergeWidget::nvencCheckFinished(int, QProcess::ExitStatus exitStatus)
}
mFFmpegProc->deleteLater();
mFFmpegProc = nullptr;
QMetaObject::invokeMethod(this, &ClipMergeWidget::qsvCheckStart, Qt::QueuedConnection);
}

void ClipMergeWidget::qsvCheckStart()
{
QStringList nvencCheckArgs;
nvencCheckArgs
<< "-hide_banner" << "-nostdin"
<< "-f" << "lavfi" << "-i" << "nullsrc=s=256x256:d=5"
<< "-c:v" << "hevc_qsv"
<< "-f" << "null" << QProcess::nullDevice();

mFFmpegProc = new QProcess(this);
mFFmpegProc->setProgram(ToolLocator::instance()->ffmpeg());
mFFmpegProc->setArguments(nvencCheckArgs);
mFFmpegProc->setStandardInputFile(QProcess::nullDevice());

connect(
mFFmpegProc,
QOverload<int,QProcess::ExitStatus>::of(&QProcess::finished),
this,
&ClipMergeWidget::qsvCheckFinished);

mFFmpegProc->start();
}

void ClipMergeWidget::qsvCheckFinished(int, QProcess::ExitStatus exitStatus)
{
if (exitStatus == QProcess::NormalExit)
{
mHaveNvenc = true;
QComboBox* videoEncodeComboBox = findChild<QComboBox*>("videoEncodeComboBox");
videoEncodeComboBox->addItem(tr("Re-encode Video Using Intel QSV"), QVariant(int(VideoEncodeQsv)));

QSettings settings;
videoEncodeComboBox->setCurrentIndex(settings.value("clipmerge/videoEncodeComboBox", 0).toInt());
}
mFFmpegProc->deleteLater();
mFFmpegProc = nullptr;
}

void ClipMergeWidget::encodeChanged()
Expand Down
8 changes: 6 additions & 2 deletions src/clipmergewidget.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright 2021 Silas Parker.
/* Copyright 2021-2023 Silas Parker.
*
* This file is part of NB Dashcam Tools.
*
Expand Down Expand Up @@ -50,6 +50,8 @@ private slots:
void cancelMerge();
void nvencCheckStart();
void nvencCheckFinished(int exitCode, QProcess::ExitStatus exitStatus);
void qsvCheckStart();
void qsvCheckFinished(int exitCode, QProcess::ExitStatus exitStatus);
void encodeChanged();

private:
Expand All @@ -62,13 +64,15 @@ private slots:
QProgressDialog* mProgDlg;
QRegularExpression mFFmpegRegex;
bool mHaveNvenc;
bool mHaveQsv;
QByteArray mUdtaData;

enum VideoEncode
{
VideoEncodeCopy = 0,
VideoEncodeSoftware,
VideoEncodeNVidia
VideoEncodeNVidia,
VideoEncodeQsv
};

};
Expand Down

0 comments on commit b51f244

Please sign in to comment.