Version 1.0.0

This commit is contained in:
2026-09-05 23:00:30 +02:00
parent cc3527f86a
commit d1de850b60
11 changed files with 171 additions and 102 deletions

View File

@@ -392,7 +392,7 @@ void CaptureThread::restoreHardwareControls()
qDebug().noquote() << "Hardware-Regler auf Ausgangswerte zurückgesetzt.";
}
// Für Live-Tasten (Kontrast/Sättigung): liest den aktuellen Wert, addiert
// Für Live-Tasten (Helligkeit/Kontrast/Sättigung): liest den aktuellen Wert, addiert
// delta, schreibt zurück, merkt sich den neuen Wert dauerhaft und meldet
// ihn per Signal (für die Einblendung in der UI).
void CaptureThread::adjustHardwareControl(quint32 id, const char* settingsKey,
@@ -422,6 +422,11 @@ void CaptureThread::adjustHardwareControl(quint32 id, const char* settingsKey,
}
}
void CaptureThread::adjustHardwareBrightness(int delta)
{
adjustHardwareControl(V4L2_CID_BRIGHTNESS, "hardware/brightness", "Hardware-Helligkeit", delta);
}
void CaptureThread::adjustHardwareContrast(int delta)
{
adjustHardwareControl(V4L2_CID_CONTRAST, "hardware/contrast", "Hardware-Kontrast", delta);

View File

@@ -24,6 +24,7 @@ public:
void stopAndWait();
void requestFrameDump(); // speichert das nächste rohe MJPEG-Frame unverändert auf die Platte
void adjustHardwareBrightness(int delta);
void adjustHardwareContrast(int delta);
void adjustHardwareSaturation(int delta);

View File

@@ -1,5 +1,5 @@
#include "DeviceDialog.h"
#include "VideoWidget.h" // für kBrightnessMin/Max, kSharpenMin/Max (eine Quelle der Wahrheit)
#include "VideoWidget.h" // für kSharpenMin/Max (eine Quelle der Wahrheit)
#include <QVBoxLayout>
#include <QHBoxLayout>
@@ -85,16 +85,17 @@ DeviceDialog::DeviceDialog(QWidget* parent)
"0 = aus. Im laufenden Betrieb mit [X]/[+]/[-] änderbar.");
form->addRow("Nachschärfen:", m_sharpenSpin);
m_brightnessSpin = new QDoubleSpinBox(this);
m_brightnessSpin->setRange(VideoWidget::kBrightnessMin * 100.0, VideoWidget::kBrightnessMax * 100.0);
m_brightnessSpin->setSingleStep(VideoWidget::kBrightnessStep * 100.0);
m_brightnessSpin->setDecimals(0);
m_brightnessSpin->setSuffix(" %");
m_brightnessSpin->setValue(100.0);
m_brightnessSpin->setToolTip(
"Gamma-Helligkeit, 100 % = unverändert. Im laufenden Betrieb\n"
"mit [,]/[.] änderbar.");
form->addRow("Helligkeit:", m_brightnessSpin);
m_hwBrightnessSpin = new QSpinBox(this);
m_hwBrightnessSpin->setRange(-1, 100);
m_hwBrightnessSpin->setValue(-1);
m_hwBrightnessSpin->setSpecialValueText("unverändert");
m_hwBrightnessSpin->setToolTip(
"Hardware-Helligkeit direkt am Grabber-Chip, VOR der JPEG-Kompression\n"
"(Wertebereich hängt vom jeweiligen Chip ab, hier 0-100 angenommen).\n"
"\"unverändert\" lässt den aktuellen Chip-Wert einfach in Ruhe.\n"
"Im laufenden Betrieb mit [,]/[.] änderbar. hdmi-viewer merkt sich\n"
"beim Start den Ausgangswert und stellt ihn beim Beenden wieder her.");
form->addRow("Hardware-Helligkeit:", m_hwBrightnessSpin);
m_hwContrastSpin = new QSpinBox(this);
m_hwContrastSpin->setRange(-1, 100);
@@ -125,7 +126,7 @@ DeviceDialog::DeviceDialog(QWidget* parent)
"Titelleiste angezeigt.<br>"
"<b>F</b> Vollbild &nbsp;·&nbsp; <b>S</b> Glättung &nbsp;·&nbsp; "
"<b>C</b> Retro &nbsp;·&nbsp; <b>X/+/-</b> Schärfen &nbsp;·&nbsp; "
"<b>,/.</b> Helligkeit &nbsp;·&nbsp; <b>1/2</b> HW-Kontrast &nbsp;·&nbsp; "
"<b>,/.</b> HW-Helligkeit &nbsp;·&nbsp; <b>1/2</b> HW-Kontrast &nbsp;·&nbsp; "
"<b>3/4</b> HW-Sättigung &nbsp;·&nbsp; <b>V</b> Vergleich &nbsp;·&nbsp; "
"<b>P</b> Screenshot &nbsp;·&nbsp; <b>Esc</b> zurück hierher</small>",
this);
@@ -156,7 +157,7 @@ int DeviceDialog::selectedFps() const { return m_fpsCombo->currentDa
bool DeviceDialog::selectedSmoothMode() const { return m_smoothCheck->isChecked(); }
bool DeviceDialog::selectedRetroMode() const { return m_retroCheck->isChecked(); }
float DeviceDialog::selectedSharpenAmount() const { return static_cast<float>(m_sharpenSpin->value()); }
float DeviceDialog::selectedBrightness() const { return static_cast<float>(m_brightnessSpin->value() / 100.0); }
int DeviceDialog::selectedHwBrightness() const { return m_hwBrightnessSpin->value(); }
int DeviceDialog::selectedHwContrast() const { return m_hwContrastSpin->value(); }
int DeviceDialog::selectedHwSaturation() const { return m_hwSaturationSpin->value(); }
@@ -166,7 +167,7 @@ void DeviceDialog::setPreselectedFps(int fps) { selectByData(m_fpsCombo, QString
void DeviceDialog::setPreselectedSmoothMode(bool enabled) { m_smoothCheck->setChecked(enabled); }
void DeviceDialog::setPreselectedRetroMode(bool enabled) { m_retroCheck->setChecked(enabled); }
void DeviceDialog::setPreselectedSharpenAmount(float amount) { m_sharpenSpin->setValue(amount); }
void DeviceDialog::setPreselectedBrightness(float gamma) { m_brightnessSpin->setValue(gamma * 100.0); }
void DeviceDialog::setPreselectedHwBrightness(int value) { m_hwBrightnessSpin->setValue(value); }
void DeviceDialog::setPreselectedHwContrast(int value) { m_hwContrastSpin->setValue(value); }
void DeviceDialog::setPreselectedHwSaturation(int value) { m_hwSaturationSpin->setValue(value); }

View File

@@ -23,7 +23,7 @@ public:
bool selectedSmoothMode() const;
bool selectedRetroMode() const;
float selectedSharpenAmount() const;
float selectedBrightness() const;
int selectedHwBrightness() const; // -1 = unverändert lassen
int selectedHwContrast() const; // -1 = unverändert lassen
int selectedHwSaturation() const; // -1 = unverändert lassen
@@ -33,7 +33,7 @@ public:
void setPreselectedSmoothMode(bool enabled);
void setPreselectedRetroMode(bool enabled);
void setPreselectedSharpenAmount(float amount);
void setPreselectedBrightness(float gamma);
void setPreselectedHwBrightness(int value); // -1 = unverändert
void setPreselectedHwContrast(int value); // -1 = unverändert
void setPreselectedHwSaturation(int value); // -1 = unverändert
@@ -47,8 +47,8 @@ private:
QComboBox* m_fpsCombo = nullptr;
QCheckBox* m_smoothCheck = nullptr;
QCheckBox* m_retroCheck = nullptr;
QDoubleSpinBox* m_sharpenSpin = nullptr;
QDoubleSpinBox* m_brightnessSpin = nullptr;
QSpinBox* m_hwContrastSpin = nullptr;
QDoubleSpinBox* m_sharpenSpin = nullptr;
QSpinBox* m_hwBrightnessSpin = nullptr;
QSpinBox* m_hwContrastSpin = nullptr;
QSpinBox* m_hwSaturationSpin = nullptr;
};

View File

@@ -25,7 +25,6 @@ MainWindow::MainWindow(const QString& videoDevice,
int targetFps,
bool smoothModeEnabled,
bool retroModeEnabled,
float brightness,
float sharpenAmount,
float lastSharpenAmount,
QWidget* parent)
@@ -41,7 +40,6 @@ MainWindow::MainWindow(const QString& videoDevice,
m_video->setSmoothModeEnabled(smoothModeEnabled);
m_video->setRetroModeEnabled(retroModeEnabled);
m_video->setSharpenAmount(sharpenAmount);
m_video->setBrightness(brightness);
setCentralWidget(m_video);
// Kurzzeitige Einblendung unten links (funktioniert auch im Vollbild,
@@ -118,11 +116,11 @@ void MainWindow::setupMenuBar()
viewMenu->addSeparator();
QAction* brighterAct = viewMenu->addAction("Heller\t.");
connect(brighterAct, &QAction::triggered, this, &MainWindow::increaseBrightness);
QAction* brighterAct = viewMenu->addAction("Heller (Hardware)\t.");
connect(brighterAct, &QAction::triggered, this, &MainWindow::increaseHwBrightness);
QAction* darkerAct = viewMenu->addAction("Dunkler\t,");
connect(darkerAct, &QAction::triggered, this, &MainWindow::decreaseBrightness);
QAction* darkerAct = viewMenu->addAction("Dunkler (Hardware)\t,");
connect(darkerAct, &QAction::triggered, this, &MainWindow::decreaseHwBrightness);
viewMenu->addSeparator();
@@ -230,14 +228,20 @@ void MainWindow::applySharpen(float value)
showOverlayMessage(QString("Nachschärfen: %1").arg(value, 0, 'f', 1));
}
void MainWindow::increaseBrightness()
void MainWindow::increaseHwBrightness()
{
applyBrightness(m_video->brightness() + VideoWidget::kBrightnessStep);
if (m_capture)
{
m_capture->adjustHardwareBrightness(5);
}
}
void MainWindow::decreaseBrightness()
void MainWindow::decreaseHwBrightness()
{
applyBrightness(m_video->brightness() - VideoWidget::kBrightnessStep);
if (m_capture)
{
m_capture->adjustHardwareBrightness(-5);
}
}
void MainWindow::toggleRaw()
@@ -279,19 +283,6 @@ void MainWindow::saveScreenshot()
}
}
void MainWindow::applyBrightness(float value)
{
value = qBound(VideoWidget::kBrightnessMin, value, VideoWidget::kBrightnessMax);
m_video->setBrightness(value);
QSettings settings;
settings.setValue("display/brightness", static_cast<double>(value));
statusBar()->showMessage(
QString("Helligkeit: %1 %").arg(qRound(value * 100.0f)), 2000);
showOverlayMessage(QString("Helligkeit: %1 %").arg(qRound(value * 100.0f)));
}
void MainWindow::showAbout()
{
auto* dlg = new QDialog(this);
@@ -345,7 +336,7 @@ void MainWindow::showAbout()
grid->addWidget(v, row, 1);
};
addRow(0, "Version", "1.4.0");
addRow(0, "Version", "1.0");
addRow(1, "Entwickler", "Dany Thinnes");
addRow(2, "Projekt", "Projekt Hirnfrei");
addRow(3, "Framework", QString("Qt %1").arg(QT_VERSION_STR));
@@ -365,7 +356,7 @@ void MainWindow::showAbout()
"<b>S</b> Glättung &nbsp;&nbsp; "
"<b>C</b> Retro &nbsp;&nbsp; "
"<b>X</b>/<b>+</b>/<b>-</b> Schärfen &nbsp;&nbsp; "
"<b>,</b>/<b>.</b> Helligkeit<br>"
"<b>,</b>/<b>.</b> HW-Helligkeit<br>"
"<b>1</b>/<b>2</b> HW-Kontrast &nbsp;&nbsp; "
"<b>3</b>/<b>4</b> HW-Sättigung &nbsp;&nbsp; "
"<b>R</b> Roh-Diagnose<br>"
@@ -442,10 +433,10 @@ void MainWindow::keyPressEvent(QKeyEvent* event)
decreaseSharpen();
break;
case Qt::Key_Period:
increaseBrightness();
increaseHwBrightness();
break;
case Qt::Key_Comma:
decreaseBrightness();
decreaseHwBrightness();
break;
case Qt::Key_R:
toggleRaw();
@@ -503,7 +494,7 @@ void MainWindow::updateStatusBar()
info = QString("%1×%2 @ %3fps %4 ")
.arg(m_capWidth).arg(m_capHeight).arg(m_capFps).arg(m_capFmt);
info += QString("Video: %1 Audio: %2 [F] Vollbild [S] Glättung [C] Retro [X/+/-] Schärfen [,/.] Helligkeit [1/2] HW-Kontrast [3/4] HW-Sättigung [R] Roh [V] Vergleich [P] Screenshot [D] Frame dumpen [Esc] Einstellungen")
info += QString("Video: %1 Audio: %2 [F] Vollbild [S] Glättung [C] Retro [X/+/-] Schärfen [,/.] HW-Helligkeit [1/2] HW-Kontrast [3/4] HW-Sättigung [R] Roh [V] Vergleich [P] Screenshot [D] Frame dumpen [Esc] Einstellungen")
.arg(m_videoDevice,
m_audioDevice.isEmpty() ? QStringLiteral("") : m_audioDevice);

View File

@@ -21,7 +21,6 @@ public:
int targetFps,
bool smoothModeEnabled = true,
bool retroModeEnabled = false,
float brightness = 1.0f,
float sharpenAmount = 0.0f,
float lastSharpenAmount = 2.5f,
QWidget* parent = nullptr);
@@ -44,8 +43,8 @@ private slots:
void toggleSharpen();
void increaseSharpen();
void decreaseSharpen();
void increaseBrightness();
void decreaseBrightness();
void increaseHwBrightness();
void decreaseHwBrightness();
void toggleRaw();
void toggleCompare();
void saveScreenshot();
@@ -55,7 +54,6 @@ private:
void toggleFullscreen();
void stopAll();
void updateStatusBar();
void applyBrightness(float value);
void applySharpen(float value);
void showOverlayMessage(const QString& text);

View File

@@ -18,7 +18,7 @@ int main(int argc, char* argv[])
QApplication app(argc, argv);
app.setApplicationName("HDMIViewer");
app.setApplicationVersion("1.4.0");
app.setApplicationVersion("1.0");
app.setOrganizationName("hdmi-viewer");
QSettings settings;
@@ -31,7 +31,7 @@ int main(int argc, char* argv[])
dlg.setPreselectedSmoothMode(settings.value("display/smooth", true).toBool());
dlg.setPreselectedRetroMode(settings.value("display/retro", false).toBool());
dlg.setPreselectedSharpenAmount(settings.value("display/sharpen", 0.0).toFloat());
dlg.setPreselectedBrightness(settings.value("display/brightness", 1.0).toFloat());
dlg.setPreselectedHwBrightness(settings.value("hardware/brightness", -1).toInt());
dlg.setPreselectedHwContrast(settings.value("hardware/contrast", -1).toInt());
dlg.setPreselectedHwSaturation(settings.value("hardware/saturation", -1).toInt());
@@ -44,7 +44,7 @@ int main(int argc, char* argv[])
const bool smoothMode = dlg.selectedSmoothMode();
const bool retroMode = dlg.selectedRetroMode();
const float sharpenAmt = dlg.selectedSharpenAmount();
const float brightness = dlg.selectedBrightness();
const int hwBrightness = dlg.selectedHwBrightness();
const int hwContrast = dlg.selectedHwContrast();
const int hwSaturation = dlg.selectedHwSaturation();
// Für die Taste [X] (Quick-Toggle 0 ↔ letzter Wert) zur Laufzeit:
@@ -66,11 +66,14 @@ int main(int argc, char* argv[])
settings.setValue("display/smooth", smoothMode);
settings.setValue("display/retro", retroMode);
settings.setValue("display/sharpen", static_cast<double>(sharpenAmt));
settings.setValue("display/brightness", static_cast<double>(brightness));
if (sharpenAmt > 0.0f)
settings.setValue("display/sharpen_last", static_cast<double>(sharpenAmt));
// -1 = "unverändert" -> kein expliziter Nutzerwert, Regler bleibt
// beim Öffnen unangetastet (siehe CaptureThread::applyHardwareControls)
if (hwBrightness >= 0)
settings.setValue("hardware/brightness", hwBrightness);
else
settings.remove("hardware/brightness");
if (hwContrast >= 0)
settings.setValue("hardware/contrast", hwContrast);
else
@@ -81,7 +84,7 @@ int main(int argc, char* argv[])
settings.remove("hardware/saturation");
settings.sync();
MainWindow win(videoDevice, audioDevice, fps, smoothMode, retroMode, brightness, sharpenAmt, lastSharpen);
MainWindow win(videoDevice, audioDevice, fps, smoothMode, retroMode, sharpenAmt, lastSharpen);
win.show();
app.exec();