setting ocio config specific to project

This commit is contained in:
itsmattkc
2019-09-30 05:40:14 +10:00
parent 9a78f5ce86
commit 45bfad2b20
13 changed files with 188 additions and 31 deletions
+12 -12
View File
@@ -101,6 +101,18 @@ public:
*/
void StartModalTask(Task* t);
/**
* @brief Get the currently active project
*
* Uses the UI/Panel system to determine which Project was the last focused on and assumes this is the active Project
* that the user wishes to work on.
*
* @return
*
* The active Project file, or nullptr if the heuristic couldn't find one.
*/
Project* GetActiveProject();
public slots:
/**
* @brief Set the current application-wide tool
@@ -186,18 +198,6 @@ private:
*/
void StartGUI(bool full_screen);
/**
* @brief Get the currently active project
*
* Uses the UI/Panel system to determine which Project was the last focused on and assumes this is the active Project
* that the user wishes to work on.
*
* @return
*
* The active Project file, or nullptr if the heuristic couldn't find one.
*/
Project* GetActiveProject();
/**
* @brief Internal main window object
*/
@@ -23,34 +23,68 @@
#include <QDialogButtonBox>
#include <QFileDialog>
#include <QGridLayout>
#include <QGroupBox>
#include <QLabel>
#include <QMessageBox>
#include <QPushButton>
#include <OpenColorIO/OpenColorIO.h>
namespace OCIO = OCIO_NAMESPACE::v1;
#include "config/config.h"
#include "core.h"
#include "render/colormanager.h"
ProjectPropertiesDialog::ProjectPropertiesDialog(QWidget *parent) :
QDialog(parent)
QDialog(parent),
working_project_(olive::core.GetActiveProject())
{
QGridLayout* layout = new QGridLayout(this);
QVBoxLayout* layout = new QVBoxLayout(this);
setWindowTitle(tr("Project Properties"));
layout->addWidget(new QLabel(tr("OpenColorIO Configuration:")), 0, 0);
QGroupBox* color_group = new QGroupBox();
color_group->setTitle(tr("Color Management"));
QGridLayout* color_layout = new QGridLayout(color_group);
int row = 0;
color_layout->addWidget(new QLabel(tr("OpenColorIO Configuration:")), row, 0);
ocio_filename_ = new QLineEdit();
layout->addWidget(ocio_filename_, 0, 1);
color_layout->addWidget(ocio_filename_, row, 1);
row++;
color_layout->addWidget(new QLabel(tr("Default Input Color Space:")), row, 0);
default_input_colorspace_ = new QComboBox();
color_layout->addWidget(default_input_colorspace_, row, 1, 1, 2);
row++;
QPushButton* browse_btn = new QPushButton(tr("Browse"));
layout->addWidget(browse_btn, 0, 2);
color_layout->addWidget(browse_btn, 0, 2);
connect(browse_btn, SIGNAL(clicked(bool)), this, SLOT(BrowseForOCIOConfig()));
layout->addWidget(color_group);
QDialogButtonBox* dialog_btns = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal);
layout->addWidget(dialog_btns, 1, 0, 1, 3);
layout->addWidget(dialog_btns);
connect(dialog_btns, SIGNAL(accepted()), this, SLOT(accept()));
connect(dialog_btns, SIGNAL(rejected()), this, SLOT(reject()));
if (working_project_ == nullptr) {
QMessageBox::critical(this,
tr("No Active Project"),
tr("No project is currently open to set the properties for"),
QMessageBox::Ok);
reject();
return;
}
ocio_filename_->setText(working_project_->ocio_config());
ListPossibleInputSpaces(working_project_->ocio_config());
}
void ProjectPropertiesDialog::accept()
@@ -58,6 +92,11 @@ void ProjectPropertiesDialog::accept()
try {
OCIO::ConstConfigRcPtr config = OCIO::Config::CreateFromFile(ocio_filename_->text().toUtf8());
working_project_->set_default_input_colorspace(default_input_colorspace_->currentText());
working_project_->set_ocio_config(ocio_filename_->text());
// This should ripple changes throughout the program that the color config has changed, therefore must be done last
ColorManager::instance()->SetConfig(config);
QDialog::accept();
@@ -69,10 +108,48 @@ void ProjectPropertiesDialog::accept()
}
}
bool ProjectPropertiesDialog::VerifyOCIOConfig(const QString &fn)
{
try {
OCIO::Config::CreateFromFile(fn.toUtf8());
return true;
} catch (OCIO::Exception& e) {
QMessageBox::critical(this,
tr("OpenColorIO Config Error"),
tr("Failed to set OpenColorIO configuration: %1").arg(e.what()),
QMessageBox::Ok);
return false;
}
}
void ProjectPropertiesDialog::ListPossibleInputSpaces(const QString& fn)
{
try {
default_input_colorspace_->clear();
QStringList input_cs = ColorManager::ListAvailableInputColorspaces(OCIO::Config::CreateFromFile(fn.toUtf8()));
foreach (QString cs, input_cs) {
default_input_colorspace_->addItem(cs);
if (cs == working_project_->default_input_colorspace()) {
default_input_colorspace_->setCurrentIndex(default_input_colorspace_->count()-1);
}
}
} catch (OCIO::Exception&) {
}
}
void ProjectPropertiesDialog::BrowseForOCIOConfig()
{
QString fn = QFileDialog::getOpenFileName(this, tr("Browse for OpenColorIO configuration"));
if (!fn.isEmpty()) {
ocio_filename_->setText(fn);
if (VerifyOCIOConfig(fn)) {
ocio_filename_->setText(fn);
ListPossibleInputSpaces(fn);
}
}
}
@@ -21,9 +21,12 @@
#ifndef PROJECTPROPERTIESDIALOG_H
#define PROJECTPROPERTIESDIALOG_H
#include <QComboBox>
#include <QDialog>
#include <QLineEdit>
#include "project/project.h"
class ProjectPropertiesDialog : public QDialog
{
Q_OBJECT
@@ -34,8 +37,16 @@ public slots:
virtual void accept() override;
private:
bool VerifyOCIOConfig(const QString& fn);
void ListPossibleInputSpaces(const QString &fn);
Project* working_project_;
QLineEdit* ocio_filename_;
QComboBox* default_input_colorspace_;
private slots:
void BrowseForOCIOConfig();
+19 -8
View File
@@ -23,6 +23,7 @@
#include <QDebug>
#include <QOpenGLPixelTransferOptions>
#include "core.h"
#include "decoder/ffmpeg/ffmpegdecoder.h"
#include "node/processor/renderer/renderer.h"
#include "project/item/footage/footage.h"
@@ -32,7 +33,7 @@
MediaInput::MediaInput() :
decoder_(nullptr),
color_service_(nullptr),
color_processor_(nullptr),
pipeline_(nullptr),
ocio_texture_(0),
frame_(nullptr)
@@ -77,7 +78,7 @@ void MediaInput::Release()
frame_ = nullptr;
decoder_ = nullptr;
color_service_ = nullptr;
color_processor_ = nullptr;
pipeline_ = nullptr;
if (ocio_texture_ != 0) {
@@ -95,6 +96,11 @@ NodeOutput *MediaInput::texture_output()
return texture_output_;
}
StreamPtr MediaInput::Footage()
{
return footage_input_->get_value(0).value<StreamPtr>();
}
void MediaInput::SetFootage(StreamPtr f)
{
footage_input_->set_value(QVariant::fromValue(f));
@@ -152,9 +158,14 @@ QVariant MediaInput::Value(NodeOutput *output, const rational &time)
return 0;
}
if (color_service_ == nullptr) {
// FIXME: Hardcoded values for testing
color_service_ = ColorProcessor::Create("srgb", OCIO::ROLE_SCENE_LINEAR);
if (color_processor_ == nullptr) {
QString colorspace = std::static_pointer_cast<VideoStream>(Footage())->colorspace();
if (colorspace.isEmpty()) {
// FIXME: Should use Footage() to find the Project* it belongs to instead of this
colorspace = olive::core.GetActiveProject()->default_input_colorspace();
}
color_processor_ = ColorProcessor::Create(colorspace, OCIO::ROLE_SCENE_LINEAR);
}
// OpenColorIO v1's color transforms can be done on GPU, which improves performance but reduces accuracy. When
@@ -170,7 +181,7 @@ QVariant MediaInput::Value(NodeOutput *output, const rational &time)
}
// Transform color to reference space
color_service_->ConvertFrame(frame_);
color_processor_->ConvertFrame(frame_);
if (alpha_is_associated) {
// If alpha was associated, reassociate here
@@ -223,7 +234,7 @@ QVariant MediaInput::Value(NodeOutput *output, const rational &time)
if (pipeline_ == nullptr) {
pipeline_ = olive::ShaderGenerator::OCIOPipeline(renderer->context(),
ocio_texture_, // FIXME: A raw GLuint texture, should wrap this up
color_service_->GetProcessor(),
color_processor_->GetProcessor(),
alpha_is_associated);
// Used for cleanup later
@@ -284,7 +295,7 @@ bool MediaInput::SetupDecoder()
}
// Get currently selected Footage
StreamPtr stream = footage_input_->get_value(0).value<StreamPtr>();
StreamPtr stream = Footage();
// If no footage is selected, return nothing
if (stream == nullptr) {
+2 -1
View File
@@ -49,6 +49,7 @@ public:
NodeOutput* texture_output();
StreamPtr Footage();
void SetFootage(StreamPtr f);
virtual void Hash(QCryptographicHash *hash, NodeOutput* from, const rational &time) override;
@@ -69,7 +70,7 @@ private:
DecoderPtr decoder_;
ColorProcessorPtr color_service_;
ColorProcessorPtr color_processor_;
ShaderPtr pipeline_;
+2 -1
View File
@@ -26,8 +26,9 @@
/**
* @brief A Stream derivative containing video-specific information
*/
class ImageStream : public Stream, public QObject
class ImageStream : public Stream
{
Q_OBJECT
public:
ImageStream();
+2 -1
View File
@@ -38,8 +38,9 @@ class Footage;
* The Stream class is fairly simple and is intended to be subclassed for data that pertains specifically to one
* Stream::Type. \see VideoStream and \see AudioStream.
*/
class Stream
class Stream : public QObject
{
Q_OBJECT
public:
enum Type {
kUnknown,
+20
View File
@@ -39,3 +39,23 @@ void Project::set_name(const QString &s)
{
name_ = s;
}
const QString &Project::ocio_config()
{
return ocio_config_;
}
void Project::set_ocio_config(const QString &ocio_config)
{
ocio_config_ = ocio_config;
}
const QString &Project::default_input_colorspace()
{
return default_input_colorspace_;
}
void Project::set_default_input_colorspace(const QString &colorspace)
{
default_input_colorspace_ = colorspace;
}
+9
View File
@@ -48,10 +48,19 @@ public:
const QString& name();
void set_name(const QString& s);
const QString& ocio_config();
void set_ocio_config(const QString& ocio_config);
const QString& default_input_colorspace();
void set_default_input_colorspace(const QString& colorspace);
private:
Folder root_;
QString name_;
QString ocio_config_;
QString default_input_colorspace_;
};
using ProjectPtr = std::shared_ptr<Project>;
+14
View File
@@ -3,6 +3,7 @@
#include <QFloat16>
#include "common/define.h"
#include "config/config.h"
ColorManager* ColorManager::instance_ = nullptr;
@@ -106,6 +107,19 @@ QStringList ColorManager::ListAvailableLooks()
return looks;
}
QStringList ColorManager::ListAvailableInputColorspaces(OpenColorIO::v1::ConstConfigRcPtr config)
{
QStringList spaces;
int number_of_colorspaces = config->getNumColorSpaces();
for (int i=0;i<number_of_colorspaces;i++) {
spaces.append(config->getColorSpaceNameByIndex(i));
}
return spaces;
}
ColorManager::ColorManager()
{
}
+2
View File
@@ -37,6 +37,8 @@ public:
static QStringList ListAvailableLooks();
static QStringList ListAvailableInputColorspaces(OCIO::ConstConfigRcPtr config);
signals:
void ConfigChanged();
+6 -1
View File
@@ -36,7 +36,7 @@ MainMenu::MainMenu(QMainWindow *parent) :
//
// FILE MENU
//
file_menu_ = new Menu(this);
file_menu_ = new Menu(this, this, SLOT(FileMenuAboutToShow()));
file_new_menu_ = new Menu(file_menu_);
olive::menu_shared.AddItemsForNewMenu(file_new_menu_);
file_open_item_ = file_menu_->AddItem("openproj", nullptr, nullptr, "Ctrl+O");
@@ -327,6 +327,11 @@ void MainMenu::ToolItemTriggered()
olive::core.SetTool(tool);
}
void MainMenu::FileMenuAboutToShow()
{
file_project_properties_item_->setEnabled(olive::core.GetActiveProject() != nullptr);
}
void MainMenu::ViewMenuAboutToShow()
{
// Parent is QMainWindow
+5
View File
@@ -57,6 +57,11 @@ private slots:
*/
void ToolItemTriggered();
/**
* @brief Slot triggered just before the File menu shows
*/
void FileMenuAboutToShow();
/**
* @brief Slot triggered just before the View menu shows
*/