Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow LUT calibration when no USB grabber is present #518

Merged
merged 3 commits into from
May 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/api/JsonAPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ public slots:

void releaseLock();

hyperhdr::Components getActiveComponent();

private slots:
///
/// @brief Handle emits from API of a new Token request.
Expand Down
2 changes: 2 additions & 0 deletions include/base/HyperHdrInstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,8 @@ public slots:
///
const PriorityMuxer::InputInfo& getPriorityInfo(int priority) const;

PriorityMuxer::InputInfo getCurrentPriorityInfo();

/// #############
/// SETTINGSMANAGER
///
Expand Down
6 changes: 4 additions & 2 deletions include/utils/LutCalibrator.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include <algorithm>

#include <utils/Image.h>
#include <utils/Components.h>

class Logger;

Expand Down Expand Up @@ -115,14 +116,15 @@ class LutCalibrator : public QObject
static LutCalibrator* getInstance();

signals:
void assign(int checksum, ColorRgb startColor, ColorRgb endColor, bool limitedRange, double saturation, double luminance, double gammaR, double gammaG, double gammaB, int coef);
void assign(hyperhdr::Components defaultComp, int checksum, ColorRgb startColor, ColorRgb endColor, bool limitedRange, double saturation, double luminance, double gammaR, double gammaG, double gammaB, int coef);
void stop();
void lutCalibrationUpdate(const QJsonObject& data);

public slots:
void assignHandler(int checksum, ColorRgb startColor, ColorRgb endColor, bool limitedRange, double saturation, double luminance, double gammaR, double gammaG, double gammaB, int coef);
void assignHandler(hyperhdr::Components defaultComp, int checksum, ColorRgb startColor, ColorRgb endColor, bool limitedRange, double saturation, double luminance, double gammaR, double gammaG, double gammaB, int coef);
void stopHandler();
void setVideoImage(const QString& name, const Image<ColorRgb>& image);
void setSystemImage(const QString& name, const Image<ColorRgb>& image);
void setGlobalInputImage(int priority, const Image<ColorRgb>& image, int timeout_ms, bool clearEffect = true);

private:
Expand Down
14 changes: 13 additions & 1 deletion sources/api/JsonAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,18 @@ void JsonAPI::handleSysInfoCommand(const QJsonObject&, const QString& command, i
emit callbackMessage(result);
}

hyperhdr::Components JsonAPI::getActiveComponent()
{
PriorityMuxer::InputInfo prio;

if (QThread::currentThread() == _hyperhdr->thread())
prio = _hyperhdr->getCurrentPriorityInfo();
else
QMetaObject::invokeMethod(_hyperhdr, "getCurrentPriorityInfo", Qt::ConnectionType::BlockingQueuedConnection, Q_RETURN_ARG(PriorityMuxer::InputInfo, prio));

return prio.componentId;
}

void JsonAPI::handleServerInfoCommand(const QJsonObject& message, const QString& command, int tan)
{
try
Expand Down Expand Up @@ -1327,7 +1339,7 @@ void JsonAPI::handleLutCalibrationCommand(const QJsonObject& message, const QStr
_endColor.blue = endColor["b"].toInt(255);

if (subcommand == "capture")
emit LutCalibrator::getInstance()->assign(checksum, _startColor, _endColor, limitedRange, saturation, luminance, gammaR, gammaG, gammaB, coef);
emit LutCalibrator::getInstance()->assign(getActiveComponent(), checksum, _startColor, _endColor, limitedRange, saturation, luminance, gammaR, gammaG, gammaB, coef);
else
emit LutCalibrator::getInstance()->stop();

Expand Down
6 changes: 6 additions & 0 deletions sources/base/HyperHdrInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,12 @@ const HyperHdrInstance::InputInfo& HyperHdrInstance::getPriorityInfo(int priorit
return _muxer.getInputInfo(priority);
}

PriorityMuxer::InputInfo HyperHdrInstance::getCurrentPriorityInfo()
{
PriorityMuxer::InputInfo val = _muxer.getInputInfo(getCurrentPriority());
return val;
}

std::list<EffectDefinition> HyperHdrInstance::getEffects() const
{
std::list<EffectDefinition> result;
Expand Down
2 changes: 1 addition & 1 deletion sources/base/schema/schema-systemGrabber.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"title" : "edt_conf_stream_max_resolution_title",
"default" : 512,
"minimum" : 196,
"maximum" : 640,
"maximum" : 960,
"append" : "edt_append_pixel",
"required" : true,
"propertyOrder" : 7
Expand Down
33 changes: 30 additions & 3 deletions sources/utils/LutCalibrator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <utils/GlobalSignals.h>
#include <utils/Logger.h>
#include <base/GrabberWrapper.h>
#include <api/JsonAPI.h>
#include <utils/ColorSys.h>
#include <base/HyperHdrIManager.h>
#include <utils/RgbTransform.h>
Expand Down Expand Up @@ -102,7 +103,7 @@ LutCalibrator* LutCalibrator::getInstance()
return instance;
}

void LutCalibrator::assignHandler(int checksum, ColorRgb startColor, ColorRgb endColor, bool limitedRange, double saturation, double luminance, double gammaR, double gammaG, double gammaB, int coef)
void LutCalibrator::assignHandler(hyperhdr::Components defaultComp, int checksum, ColorRgb startColor, ColorRgb endColor, bool limitedRange, double saturation, double luminance, double gammaR, double gammaG, double gammaB, int coef)
{
if (checksum == 0)
{
Expand Down Expand Up @@ -166,8 +167,21 @@ void LutCalibrator::assignHandler(int checksum, ColorRgb startColor, ColorRgb en
_log->enable();
}

connect(GlobalSignals::getInstance(), &GlobalSignals::setVideoImage, this, &LutCalibrator::setVideoImage, Qt::ConnectionType::UniqueConnection);
connect(GlobalSignals::getInstance(), &GlobalSignals::setGlobalImage, this, &LutCalibrator::setGlobalInputImage, Qt::ConnectionType::UniqueConnection);
if (defaultComp == hyperhdr::COMP_VIDEOGRABBER)
{
Debug(_log, "Using video grabber as a source");
connect(GlobalSignals::getInstance(), &GlobalSignals::setVideoImage, this, &LutCalibrator::setVideoImage, Qt::ConnectionType::UniqueConnection);
}
else if (defaultComp == hyperhdr::COMP_SYSTEMGRABBER)
{
Debug(_log, "Using system grabber as a source");
connect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, this, &LutCalibrator::setSystemImage, Qt::ConnectionType::UniqueConnection);
}
else
{
Debug(_log, "Using flatbuffers/protobuffers as a source");
connect(GlobalSignals::getInstance(), &GlobalSignals::setGlobalImage, this, &LutCalibrator::setGlobalInputImage, Qt::ConnectionType::UniqueConnection);
}
}
else
{
Expand Down Expand Up @@ -212,6 +226,11 @@ void LutCalibrator::setVideoImage(const QString& name, const Image<ColorRgb>& im
handleImage(image);
}

void LutCalibrator::setSystemImage(const QString& name, const Image<ColorRgb>& image)
{
handleImage(image);
}

void LutCalibrator::setGlobalInputImage(int priority, const Image<ColorRgb>& image, int timeout_ms, bool clearEffect)
{
handleImage(image);
Expand Down Expand Up @@ -853,6 +872,7 @@ bool LutCalibrator::correctionEnd()
{

disconnect(GlobalSignals::getInstance(), &GlobalSignals::setVideoImage, this, &LutCalibrator::setVideoImage);
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, this, &LutCalibrator::setSystemImage);
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setGlobalImage, this, &LutCalibrator::setGlobalInputImage);

double floor = qMax(_minColor.red, qMax(_minColor.green, _minColor.blue));
Expand Down Expand Up @@ -1125,6 +1145,12 @@ double LutCalibrator::fineTune(double& optimalRange, double& optimalScale, int&
calculated.green = ootf(calculated.green);
calculated.blue = ootf(calculated.blue);
}
else
{
calculated.red = normalized.red;
calculated.green = normalized.green;
calculated.blue = normalized.blue;
}

calculated.red = clampDouble(calculated.red, 0, 1.0) * 255.0;
calculated.green = clampDouble(calculated.green, 0, 1.0) * 255.0;
Expand Down Expand Up @@ -1198,6 +1224,7 @@ bool LutCalibrator::finalize(bool fastTrack)
if (!fastTrack)
{
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setVideoImage, this, &LutCalibrator::setVideoImage);
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, this, &LutCalibrator::setSystemImage);
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setGlobalImage, this, &LutCalibrator::setGlobalInputImage);
}

Expand Down