Erster Teststream absolviert. Positives Ergebnis

This commit is contained in:
2026-09-05 18:55:56 +02:00
parent 953c37d8d1
commit cc3527f86a
11 changed files with 1198 additions and 46 deletions

View File

@@ -1,22 +1,79 @@
#pragma once
#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>
#include <QImage>
#include <QPixmap>
#include <QSize>
class VideoWidget : public QWidget
QT_BEGIN_NAMESPACE
class QOpenGLShaderProgram;
class QOpenGLTexture;
QT_END_NAMESPACE
// VideoWidget zeichnet das eingehende Frame per OpenGL (statt QPainter/CPU).
// Zwei unabhängige Effekte können live per Shader zugeschaltet werden:
// Bildglättung (Chroma/Luma-Rekonstruktion gegen Scaler-Artefakte, echte
// Bildverbesserung) und Retro-Optik (Scanlines/Maske/Wölbung, Nostalgie-Look).
// QOpenGLExtraFunctions (statt nur QOpenGLFunctions) wird benötigt, weil
// Vertex-Array-Objects (glGenVertexArrays & Co.) nicht Teil des reinen
// ES2-kompatiblen QOpenGLFunctions-Subsets sind.
class VideoWidget : public QOpenGLWidget, protected QOpenGLExtraFunctions
{
Q_OBJECT
public:
explicit VideoWidget(QWidget* parent = nullptr);
~VideoWidget() override;
public slots:
void setFrame(const QImage& image);
void setSmoothModeEnabled(bool enabled);
void setRetroModeEnabled(bool enabled);
void setSharpenAmount(float amount);
void setBrightness(float gamma);
void setRawEnabled(bool enabled);
void setCompareEnabled(bool enabled);
bool smoothModeEnabled() const { return m_smoothEnabled; }
bool retroModeEnabled() const { return m_retroEnabled; }
float sharpenAmount() const { return m_sharpenAmount; }
float brightness() const { return m_brightness; }
bool rawEnabled() const { return m_rawEnabled; }
bool compareEnabled() const { return m_compareEnabled; }
QImage grabProcessedFrame() { return grabFramebuffer(); }
protected:
void paintEvent(QPaintEvent* event) override;
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
private:
QPixmap m_pixmap;
void uploadPendingFrame();
void drawNoSignal();
QOpenGLShaderProgram* m_program = nullptr;
QOpenGLTexture* m_texture = nullptr;
unsigned int m_vbo = 0;
unsigned int m_vao = 0;
QImage m_pendingImage; // Wartet auf Upload im GL-Thread (paintGL)
bool m_pendingDirty = false;
QSize m_imageSize; // Auflösung des zuletzt hochgeladenen Frames
bool m_hasFrame = false;
bool m_smoothEnabled = true; // Bildglättung: Chroma/Luma-Rekonstruktion gegen Scaler-Artefakte
bool m_retroEnabled = false; // Retro-Optik: Scanlines/Maske/Wölbung (Nostalgie-Look)
float m_sharpenAmount = 0.0f; // Nachschärfen (Unsharp Mask): 0 = aus
float m_brightness = 1.0f; // Gamma-Faktor: 1.0 = neutral, >1 heller, <1 dunkler
bool m_rawEnabled = false; // Diagnose: umgeht ALLES (Studio-Range, Kontrast, Sättigung, Gamma)
bool m_compareEnabled = false; // Live-Vergleich: links roh, rechts bearbeitet
public:
static constexpr float kBrightnessMin = 0.4f;
static constexpr float kBrightnessMax = 3.2f;
static constexpr float kBrightnessStep = 0.1f;
static constexpr float kSharpenMin = 0.0f;
static constexpr float kSharpenMax = 20.0f;
static constexpr float kSharpenStep = 0.5f;
static constexpr float kSharpenDefault = 2.5f; // Wert für Taste X (Quick-Toggle)
};