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

OCIO improvements #1880

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
Open
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
10 changes: 4 additions & 6 deletions app/dialog/color/colordialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,16 +177,14 @@ void ColorDialog::ColorSpaceChanged(const QString &input, const ColorTransform &
// FIXME: For some reason, using OCIO::TRANSFORM_DIR_INVERSE (wrapped by ColorProcessor::kInverse) causes OCIO to
// crash. We've disabled that functionality for now (also disabling display_tab_ in ColorValuesWidget)

/*ColorProcessorPtr display_to_ref = ColorProcessor::Create(color_manager_->GetConfig(),
ColorProcessorPtr display_to_ref = ColorProcessor::Create(color_manager_,
color_manager_->GetReferenceColorSpace(),
display,
view,
look,
ColorProcessor::kInverse);*/
output,
ColorProcessor::Direction::kInverse);

color_wheel_->SetColorProcessor(input_to_ref_processor_, ref_to_display);
hsv_value_gradient_->SetColorProcessor(input_to_ref_processor_, ref_to_display);
color_values_widget_->SetColorProcessor(input_to_ref_processor_, ref_to_display, nullptr, ref_to_input);
color_values_widget_->SetColorProcessor(input_to_ref_processor_, ref_to_display, display_to_ref, ref_to_input);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -63,20 +63,24 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index)

video_layout->addWidget(new QLabel(tr("Color Space:")), row, 0);

video_color_space_ = new QComboBox();
OCIO::ConstConfigRcPtr config = footage_->project()->color_manager()->GetConfig();
int number_of_colorspaces = config->getNumColorSpaces();

video_color_space_->addItem(tr("Default (%1)").arg(footage_->project()->color_manager()->GetDefaultInputColorSpace()));

for (int i=0;i<number_of_colorspaces;i++) {
QString colorspace = config->getColorSpaceNameByIndex(i);

video_color_space_->addItem(colorspace);
ColorManager *color_manager = footage_->project()->color_manager();
video_color_space_ = new ColorSpaceComboBox(footage_->project()->color_manager(), "Input", true, this);

if (!vp.colorspace().isEmpty()) {
video_color_space_->setColorSpacePlaceHolder(color_manager->GetConfig()->getCanonicalName(
vp.colorspace().toStdString().c_str()));
} else {
QString colorspace;
if (vp.format() == VideoParams::Format::kFormatUnsigned8 ||
vp.format() == VideoParams::Format::kFormatUnsigned16) {
colorspace = color_manager->GetDefaultByteInputColorSpace();
} else {
colorspace = color_manager->GetDefaultFloatInputColorSpace();
}
video_color_space_->setColorSpacePlaceHolder(color_manager->GetConfig()->getCanonicalName(
colorspace.toStdString().c_str()));
}

video_color_space_->setCurrentText(vp.colorspace());

video_layout->addWidget(video_color_space_, row, 1);

row++;
Expand Down Expand Up @@ -136,11 +140,7 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index)

void VideoStreamProperties::Accept(MultiUndoCommand *parent)
{
QString set_colorspace;

if (video_color_space_->currentIndex() > 0) {
set_colorspace = video_color_space_->currentText();
}
QString set_colorspace = video_color_space_->ColorSpacePlaceHolder();

VideoParams vp = footage_->GetVideoParams(video_index_);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

#include "node/project/footage/footage.h"
#include "streamproperties.h"
#include "widget/colorspacecombobox/colorspacecombobox.h"
#include "widget/slider/integerslider.h"
#include "widget/standardcombos/standardcombos.h"

Expand Down Expand Up @@ -54,7 +55,7 @@ class VideoStreamProperties : public StreamProperties
/**
* @brief Setting for this media's color space
*/
QComboBox* video_color_space_;
ColorSpaceComboBox* video_color_space_;

/**
* @brief Setting for this streams's color range
Expand Down
38 changes: 24 additions & 14 deletions app/dialog/projectproperties/projectproperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,19 @@ ProjectPropertiesDialog::ProjectPropertiesDialog(Project* p, QWidget *parent) :

row++;

color_layout->addWidget(new QLabel(tr("Default Input Color Space:")), row, 0);
color_layout->addWidget(new QLabel(tr("Default Float Input Color Space:")), row, 0);

default_input_colorspace_ = new QComboBox();
color_layout->addWidget(default_input_colorspace_, row, 1, 1, 2);
default_float_input_colorspace_ = new ColorSpaceComboBox(working_project_->color_manager(), "Input");
default_float_input_colorspace_->setColorSpacePlaceHolder(working_project_->color_manager()->GetDefaultFloatInputColorSpace());
color_layout->addWidget(default_float_input_colorspace_, row, 1, 1, 2);

row++;

color_layout->addWidget(new QLabel(tr("Default Byte Input Color Space:")), row, 0);

default_byte_input_colorspace_ = new ColorSpaceComboBox(working_project_->color_manager(), "Input");
default_byte_input_colorspace_->setColorSpacePlaceHolder(working_project_->color_manager()->GetDefaultByteInputColorSpace());
color_layout->addWidget(default_byte_input_colorspace_, row, 1, 1, 2);

row++;

Expand Down Expand Up @@ -177,8 +186,11 @@ void ProjectPropertiesDialog::accept()
if (working_project_->color_manager()->GetConfigFilename() != ocio_filename_->text()) {
working_project_->color_manager()->SetConfigFilename(ocio_filename_->text());
}
if (working_project_->color_manager()->GetDefaultInputColorSpace() != default_input_colorspace_->currentText()) {
working_project_->color_manager()->SetDefaultInputColorSpace(default_input_colorspace_->currentText());
if (working_project_->color_manager()->GetDefaultFloatInputColorSpace() != default_float_input_colorspace_->ColorSpacePlaceHolder()) {
working_project_->color_manager()->SetDefaultFloatInputColorSpace(default_float_input_colorspace_->ColorSpacePlaceHolder());
}
if (working_project_->color_manager()->GetDefaultByteInputColorSpace() != default_byte_input_colorspace_->ColorSpacePlaceHolder()) {
working_project_->color_manager()->SetDefaultByteInputColorSpace(default_byte_input_colorspace_->ColorSpacePlaceHolder());
}

super::accept();
Expand Down Expand Up @@ -210,7 +222,8 @@ void ProjectPropertiesDialog::BrowseForOCIOConfig()

void ProjectPropertiesDialog::OCIOFilenameUpdated()
{
default_input_colorspace_->clear();
default_float_input_colorspace_->clear();
default_byte_input_colorspace_->clear();

try {
OCIO::ConstConfigRcPtr c;
Expand All @@ -219,21 +232,18 @@ void ProjectPropertiesDialog::OCIOFilenameUpdated()
c = ColorManager::GetDefaultConfig();
} else {
c = ColorManager::CreateConfigFromFile(ocio_filename_->text());
c->validate();
}

ocio_filename_->setStyleSheet(QString());
ocio_config_is_valid_ = true;

// List input color spaces
QStringList input_cs = ColorManager::ListAvailableColorspaces(c);
default_float_input_colorspace_->setPlaceholderText(working_project_->color_manager()->GetConfig()->getCanonicalName(
working_project_->color_manager()->GetDefaultFloatInputColorSpace().toStdString().c_str()));

foreach (QString cs, input_cs) {
default_input_colorspace_->addItem(cs);
default_byte_input_colorspace_->setPlaceholderText(working_project_->color_manager()->GetConfig()->getCanonicalName(
working_project_->color_manager()->GetDefaultByteInputColorSpace().toStdString().c_str()));

if (cs == working_project_->color_manager()->GetDefaultInputColorSpace()) {
default_input_colorspace_->setCurrentIndex(default_input_colorspace_->count()-1);
}
}
} catch (OCIO::Exception& e) {
ocio_config_is_valid_ = false;
ocio_filename_->setStyleSheet(QStringLiteral("QLineEdit {color: red;}"));
Expand Down
4 changes: 3 additions & 1 deletion app/dialog/projectproperties/projectproperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <QRadioButton>

#include "node/project/project.h"
#include "widget/colorspacecombobox/colorspacecombobox.h"
#include "widget/path/pathwidget.h"

namespace olive {
Expand All @@ -49,7 +50,8 @@ public slots:

QLineEdit* ocio_filename_;

QComboBox* default_input_colorspace_;
ColorSpaceComboBox* default_float_input_colorspace_;
ColorSpaceComboBox* default_byte_input_colorspace_;

bool ocio_config_is_valid_;

Expand Down
112 changes: 90 additions & 22 deletions app/node/color/colormanager/colormanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
namespace olive {

const QString ColorManager::kConfigFilenameIn = QStringLiteral("config");
const QString ColorManager::kDefaultColorspaceIn = QStringLiteral("default_input");
const QString ColorManager::kDefaultFloatColorspaceIn = QStringLiteral("default_float_input");
const QString ColorManager::kDefaultByteColorspaceIn = QStringLiteral("default_byte_input");
const QString ColorManager::kReferenceSpaceIn = QStringLiteral("reference_space");

#define super Node
Expand All @@ -45,14 +46,27 @@ ColorManager::ColorManager() :
AddInput(kConfigFilenameIn, NodeValue::kFile, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable));

// Colorspace input
AddInput(kDefaultColorspaceIn, NodeValue::kCombo, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable));
AddInput(kDefaultFloatColorspaceIn, NodeValue::kCombo, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable));
AddInput(kDefaultByteColorspaceIn, NodeValue::kCombo, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable));

// Default reference space is scene linear
AddInput(kReferenceSpaceIn, NodeValue::kCombo, 0, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable));

// Set config to our built-in default
SetConfig(GetDefaultConfig());
SetDefaultInputColorSpace(config_->getCanonicalName(OCIO::ROLE_DEFAULT));

if (config_->hasRole("default_float")) {
SetDefaultFloatInputColorSpace(config_->getCanonicalName("default_float"));
}
else {
SetDefaultFloatInputColorSpace(config_->getCanonicalName(OCIO::ROLE_DEFAULT));
}

if (config_->hasRole("default_byte")) {
SetDefaultByteInputColorSpace(config_->getCanonicalName("default_byte"));
} else {
SetDefaultByteInputColorSpace(config_->getCanonicalName(OCIO::ROLE_DEFAULT));
}
}

OCIO::ConstConfigRcPtr ColorManager::GetConfig() const
Expand Down Expand Up @@ -81,13 +95,8 @@ void ColorManager::SetUpDefaultConfig()
{
if (!qEnvironmentVariableIsEmpty("OCIO")) {
// Attempt to set config from "OCIO" environment variable
try {
OCIO_SET_C_LOCALE_FOR_SCOPE;
default_config_ = OCIO::Config::CreateFromEnv();

if (LoadConfigFromPath(qEnvironmentVariable("OCIO"))) {
return;
} catch (OCIO::Exception& e) {
qWarning() << "Failed to load config from OCIO environment variable config:" << e.what();
}
}

Expand All @@ -106,6 +115,33 @@ void ColorManager::SetUpDefaultConfig()
}
}

bool ColorManager::LoadConfigFromPath(QString path)
{
try {
OCIO_SET_C_LOCALE_FOR_SCOPE;
default_config_ = OCIO::Config::CreateFromFile(path.toStdString().c_str());

try {
default_config_->validate();
if (!default_config_->hasRole("cie_xyz_d65_interchange")) {
qWarning() << "Failed to validate config from OCIO environment vairable: Missing required role cie_xyz_d65_interchange";
return false;
}
qInfo() << "Succesfully loaded OCIO config from: " << path;
return true;
} catch (OCIO::Exception &e) {
qWarning() << "Failed to validate config from OCIO environment vairable:" << e.what();
}

} catch (OCIO::Exception &e) {
qWarning() << "Failed to load config from OCIO environment variable config:" << e.what();
}

qWarning() << "Falling back on internal config.";

return false;
}

void ColorManager::SetConfigFilename(const QString &filename)
{
SetStandardValue(kConfigFilenameIn, filename);
Expand Down Expand Up @@ -165,14 +201,24 @@ QStringList ColorManager::ListAvailableColorspaces() const
return ListAvailableColorspaces(config_);
}

QString ColorManager::GetDefaultInputColorSpace() const
QString ColorManager::GetDefaultFloatInputColorSpace() const
{
return ListAvailableColorspaces().at(GetStandardValue(kDefaultFloatColorspaceIn).toInt());
}

void ColorManager::SetDefaultFloatInputColorSpace(const QString &s)
{
SetStandardValue(kDefaultFloatColorspaceIn, ListAvailableColorspaces().indexOf(s));
}

QString ColorManager::GetDefaultByteInputColorSpace() const
{
return ListAvailableColorspaces().at(GetStandardValue(kDefaultColorspaceIn).toInt());
return ListAvailableColorspaces().at(GetStandardValue(kDefaultByteColorspaceIn).toInt());
}

void ColorManager::SetDefaultInputColorSpace(const QString &s)
void ColorManager::SetDefaultByteInputColorSpace(const QString &s)
{
SetStandardValue(kDefaultColorspaceIn, ListAvailableColorspaces().indexOf(s));
SetStandardValue(kDefaultByteColorspaceIn, ListAvailableColorspaces().indexOf(s));
}

QString ColorManager::GetReferenceColorSpace() const
Expand All @@ -191,7 +237,7 @@ QString ColorManager::GetCompliantColorSpace(const QString &s)
if (ListAvailableColorspaces().contains(s)) {
return s;
} else {
return GetDefaultInputColorSpace();
return config_->getCanonicalName(OCIO::ROLE_DEFAULT);
}
}

Expand Down Expand Up @@ -225,7 +271,7 @@ ColorTransform ColorManager::GetCompliantColorSpace(const ColorTransform &transf
QString output = transform.output();

if (!ListAvailableColorspaces().contains(output)) {
output = GetDefaultInputColorSpace();
output = config_->getCanonicalName(OCIO::ROLE_DEFAULT);
}

return ColorTransform(output);
Expand Down Expand Up @@ -253,12 +299,22 @@ void ColorManager::GetDefaultLumaCoefs(double *rgb) const
config_->getDefaultLumaCoefs(rgb);
}

OCIO::ColorSpaceMenuHelperRcPtr ColorManager::CreateMenuHelper(OCIO::ConstConfigRcPtr config, QString categories) {
OCIO::ColorSpaceMenuHelperRcPtr menu_helper;
auto params = OCIO::ColorSpaceMenuParameters::Create(config);
params->setAppCategories(categories.toStdString().c_str());
menu_helper = OCIO::ColorSpaceMenuHelper::Create(params);

return menu_helper;
}

void ColorManager::Retranslate()
{
super::Retranslate();

SetInputName(kConfigFilenameIn, tr("Configuration"));
SetInputName(kDefaultColorspaceIn, tr("Default Input"));
SetInputName(kDefaultFloatColorspaceIn, tr("Default Float Input"));
SetInputName(kDefaultByteColorspaceIn, tr("Default Byte Input"));
SetInputName(kReferenceSpaceIn, tr("Reference Space"));

SetComboBoxStrings(kReferenceSpaceIn, {tr("Scene Linear"), tr("Compositing Log")});
Expand All @@ -272,20 +328,31 @@ void ColorManager::InputValueChangedEvent(const QString &input, int element)
if (input == kConfigFilenameIn) {

try {
QString old_default_cs = GetDefaultInputColorSpace();
QString old_default_float_cs = GetDefaultFloatInputColorSpace();
QString old_default_byte_cs = GetDefaultByteInputColorSpace();

SetConfig(OCIO::Config::CreateFromFile(GetConfigFilename().toUtf8()));

// Set new default colorspace appropriately
int new_default = 0;
int new_default_float = 0;
QStringList available_cs = ListAvailableColorspaces();
for (int i=0; i<available_cs.size(); i++) {
if (available_cs.at(i).compare(old_default_cs, Qt::CaseInsensitive)) {
new_default = i;
if (available_cs.at(i).compare(old_default_float_cs, Qt::CaseInsensitive)) {
new_default_float = i;
break;
}
}
SetStandardValue(kDefaultFloatColorspaceIn, new_default_float);

// Set new default colorspace appropriately
int new_default_byte = 0;
for (int i = 0; i < available_cs.size(); i++) {
if (available_cs.at(i).compare(old_default_byte_cs, Qt::CaseInsensitive)) {
new_default_float = i;
break;
}
}
SetStandardValue(kDefaultColorspaceIn, new_default);
SetStandardValue(kDefaultByteColorspaceIn, new_default_byte);

emit ConfigChanged();
} catch (OCIO::Exception&) {}
Expand All @@ -308,7 +375,8 @@ void ColorManager::SetConfig(OCIO::ConstConfigRcPtr config)
{
config_ = config;

SetComboBoxStrings(kDefaultColorspaceIn, ListAvailableColorspaces());
// FIXME Tom:Do we ever see this on the node properties window?
//SetComboBoxStrings(kDefaultColorspaceIn, ListAvailableColorspaces());
}

}
Loading