From 6771a2f1cbd8f5bc0e77cbdc1dc7e6147acd73d6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 15 Jan 2020 18:26:42 +1100 Subject: [PATCH] implemented footage loading from projects Footage is a special case where the node parameters can reference objects that exist outside of the graph. Therefore specific code is needed to serialize/deserialize. --- app/node/input.cpp | 45 ++++++++++++++---------- app/node/input.h | 8 ++--- app/node/inputarray.cpp | 4 +-- app/node/inputarray.h | 2 +- app/node/node.cpp | 4 +-- app/node/node.h | 2 +- app/node/output.cpp | 2 +- app/node/output.h | 2 +- app/node/param.h | 7 +++- app/project/item/folder/folder.cpp | 4 +-- app/project/item/folder/folder.h | 4 ++- app/project/item/footage/audiostream.cpp | 8 ++--- app/project/item/footage/audiostream.h | 8 ++--- app/project/item/footage/footage.cpp | 27 +++++++++----- app/project/item/footage/footage.h | 4 +-- app/project/item/footage/imagestream.cpp | 21 ++++++++--- app/project/item/footage/imagestream.h | 12 ++++--- app/project/item/footage/stream.cpp | 17 +++++++-- app/project/item/footage/stream.h | 10 ++++-- app/project/item/footage/videostream.cpp | 4 +-- app/project/item/footage/videostream.h | 4 +-- app/project/item/item.h | 4 ++- app/project/item/sequence/sequence.cpp | 4 +-- app/project/item/sequence/sequence.h | 3 +- app/project/project.cpp | 11 +++++- 25 files changed, 142 insertions(+), 79 deletions(-) diff --git a/app/node/input.cpp b/app/node/input.cpp index 45dea81f7..921226da4 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -30,6 +30,7 @@ #include "node.h" #include "output.h" #include "inputarray.h" +#include "project/item/footage/stream.h" NodeInput::NodeInput(const QString& id, const DataType &type, const QVariant &default_value) : NodeParam(id), @@ -85,7 +86,7 @@ QString NodeInput::name() return NodeParam::name(); } -void NodeInput::Load(QXmlStreamReader *reader, QHash& param_ptrs, QList &input_connections) +void NodeInput::Load(QXmlStreamReader *reader, QHash& param_ptrs, QList &input_connections, QList& footage_connections) { XMLAttributeLoop(reader, attr) { if (attr.name() == "keyframing") { @@ -108,7 +109,7 @@ void NodeInput::Load(QXmlStreamReader *reader, QHash& par if (value_text.isEmpty()) { standard_value_.replace(val_index, QVariant()); } else { - standard_value_.replace(val_index, StringToValue(data_type_, value_text)); + standard_value_.replace(val_index, StringToValue(value_text, footage_connections)); } val_index++; @@ -145,7 +146,7 @@ void NodeInput::Load(QXmlStreamReader *reader, QHash& par reader->readNext(); - key_value = StringToValue(data_type_, reader->text().toString()); + key_value = StringToValue(reader->text().toString(), footage_connections); NodeKeyframePtr key = NodeKeyframe::Create(key_time, key_value, key_type, track); key->set_bezier_control_in(key_in_handle); @@ -166,7 +167,7 @@ void NodeInput::Load(QXmlStreamReader *reader, QHash& par } } } else { - LoadInternal(reader, param_ptrs, input_connections); + LoadInternal(reader, param_ptrs, input_connections, footage_connections); } } } @@ -184,7 +185,7 @@ void NodeInput::Save(QXmlStreamWriter *writer) const writer->writeStartElement("standard"); foreach (const QVariant& v, standard_value_) { - writer->writeTextElement("value", ValueToString(data_type_, v)); + writer->writeTextElement("value", ValueToString(v)); } writer->writeEndElement(); // standard @@ -205,7 +206,7 @@ void NodeInput::Save(QXmlStreamWriter *writer) const writer->writeAttribute("outhandlex", QString::number(key->bezier_control_out().x())); writer->writeAttribute("outhandley", QString::number(key->bezier_control_out().y())); - writer->writeCharacters(ValueToString(data_type_, key->value())); + writer->writeCharacters(ValueToString(key->value())); writer->writeEndElement(); // key } @@ -240,7 +241,7 @@ const NodeParam::DataType &NodeInput::data_type() const return data_type_; } -void NodeInput::LoadInternal(QXmlStreamReader *reader, QHash ¶m_ptrs, QList &input_connections) +void NodeInput::LoadInternal(QXmlStreamReader *reader, QHash ¶m_ptrs, QList &input_connections, QList& footage_connections) { } @@ -248,27 +249,33 @@ void NodeInput::SaveInternal(QXmlStreamWriter *writer) const { } -QString NodeInput::ValueToString(const NodeParam::DataType &type, const QVariant &value) +QString NodeInput::ValueToString(const QVariant &value) const { - if (type == kRational) { + switch (data_type_) { + case kRational: return value.value().toString(); - } + case kFootage: + return QString::number(reinterpret_cast(value.value().get())); + default: + if (value.canConvert()) { + return value.toString(); + } - if (value.canConvert()) { - return value.toString(); + qWarning() << "Failed to convert type" << data_type_ << "to string"; + return QString(); } - - qWarning() << "Failed to convert type" << type << "to string"; - return QString(); } -QVariant NodeInput::StringToValue(const NodeParam::DataType &type, const QString &string) +QVariant NodeInput::StringToValue(const QString &string, QList& footage_connections) { - if (type == kRational) { + switch (data_type_) { + case kRational: return QVariant::fromValue(rational::fromString(string)); + case kFootage: + footage_connections.append({this, string.toULongLong()}); + default: + return string; } - - return string; } NodeOutput *NodeInput::get_connected_output() const diff --git a/app/node/input.h b/app/node/input.h index cf729b368..dede7641d 100644 --- a/app/node/input.h +++ b/app/node/input.h @@ -54,7 +54,7 @@ public: virtual QString name() override; - virtual void Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections) override; + virtual void Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections, QList& footage_connections) override; virtual void Save(QXmlStreamWriter* writer) const override; @@ -243,14 +243,14 @@ signals: void KeyframeRemoved(NodeKeyframePtr key); protected: - virtual void LoadInternal(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections); + virtual void LoadInternal(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections, QList& footage_connections); virtual void SaveInternal(QXmlStreamWriter* writer) const; private: - static QString ValueToString(const DataType& type, const QVariant& value); + QString ValueToString(const QVariant& value) const; - static QVariant StringToValue(const DataType& type, const QString &string); + QVariant StringToValue(const QString &string, QList &footage_connections); void SaveConnections(QXmlStreamWriter* writer) const; diff --git a/app/node/inputarray.cpp b/app/node/inputarray.cpp index 4d9a5272c..d3e0c12d3 100644 --- a/app/node/inputarray.cpp +++ b/app/node/inputarray.cpp @@ -170,13 +170,13 @@ void NodeInputArray::RemoveAt(int index) RemoveLast(); } -void NodeInputArray::LoadInternal(QXmlStreamReader *reader, QHash& param_ptrs, QList &input_connections) +void NodeInputArray::LoadInternal(QXmlStreamReader *reader, QHash& param_ptrs, QList &input_connections, QList& footage_connections) { if (reader->name() == "subparameters") { XMLReadLoop(reader, "subparameters") { if (reader->name() == "input") { Append(); - At(GetSize() - 1)->Load(reader, param_ptrs, input_connections); + At(GetSize() - 1)->Load(reader, param_ptrs, input_connections, footage_connections); } } } diff --git a/app/node/inputarray.h b/app/node/inputarray.h index 5ebb04fdb..956debc49 100644 --- a/app/node/inputarray.h +++ b/app/node/inputarray.h @@ -33,7 +33,7 @@ signals: void SizeChanged(int size); protected: - virtual void LoadInternal(QXmlStreamReader* reader, QHash ¶m_ptrs, QList &input_connections) override; + virtual void LoadInternal(QXmlStreamReader* reader, QHash ¶m_ptrs, QList &input_connections, QList& footage_connections) override; virtual void SaveInternal(QXmlStreamWriter* writer) const override; diff --git a/app/node/node.cpp b/app/node/node.cpp index 1f4f05910..5cb734be5 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -50,7 +50,7 @@ Node::~Node() } } -void Node::Load(QXmlStreamReader *reader, QHash &output_ptrs, QList& input_connections, const QString& element) +void Node::Load(QXmlStreamReader *reader, QHash &output_ptrs, QList& input_connections, QList& footage_connections, const QString& element) { XMLReadLoop(reader, (element.isEmpty() ? "node" : element)) { if (reader->isStartElement()) { @@ -77,7 +77,7 @@ void Node::Load(QXmlStreamReader *reader, QHash &output_ continue; } - param->Load(reader, output_ptrs, input_connections); + param->Load(reader, output_ptrs, input_connections, footage_connections); } } } diff --git a/app/node/node.h b/app/node/node.h index 83378708d..b836b53e8 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -68,7 +68,7 @@ public: /** * @brief Clear current node variables and replace them with */ - void Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections, const QString &element = QString()); + void Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections, QList& footage_connections, const QString &element = QString()); /** * @brief Save this node into a text/XML format diff --git a/app/node/output.cpp b/app/node/output.cpp index 319860753..9c2888850 100644 --- a/app/node/output.cpp +++ b/app/node/output.cpp @@ -42,7 +42,7 @@ QString NodeOutput::name() return NodeParam::name(); } -void NodeOutput::Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections) +void NodeOutput::Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections, QList& footage_connections) { XMLAttributeLoop(reader, attr) { if (attr.name() == "ptr") { diff --git a/app/node/output.h b/app/node/output.h index 733b3b73b..6107aaf50 100644 --- a/app/node/output.h +++ b/app/node/output.h @@ -42,7 +42,7 @@ public: virtual QString name() override; - virtual void Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections) override; + virtual void Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections, QList& footage_connections) override; virtual void Save(QXmlStreamWriter* writer) const override; diff --git a/app/node/param.h b/app/node/param.h index e1419d102..a7f529b43 100644 --- a/app/node/param.h +++ b/app/node/param.h @@ -235,10 +235,15 @@ public: quintptr output; }; + struct FootageConnection { + NodeInput* input; + quintptr footage; + }; + /** * @brief Load function */ - virtual void Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections) = 0; + virtual void Load(QXmlStreamReader* reader, QHash& param_ptrs, QList &input_connections, QList& footage_connections) = 0; /** * @brief Save function diff --git a/app/project/item/folder/folder.cpp b/app/project/item/folder/folder.cpp index 72cb12f5f..5f26b0d29 100644 --- a/app/project/item/folder/folder.cpp +++ b/app/project/item/folder/folder.cpp @@ -44,7 +44,7 @@ QIcon Folder::icon() return icon::Folder; } -void Folder::Load(QXmlStreamReader *reader) +void Folder::Load(QXmlStreamReader *reader, QHash &footage_ptrs, QList& footage_connections) { XMLAttributeLoop(reader, attr) { if (attr.name() == "name") { @@ -67,7 +67,7 @@ void Folder::Load(QXmlStreamReader *reader) } add_child(child); - child->Load(reader); + child->Load(reader, footage_ptrs, footage_connections); } } } diff --git a/app/project/item/folder/folder.h b/app/project/item/folder/folder.h index 037359df1..84e9498a9 100644 --- a/app/project/item/folder/folder.h +++ b/app/project/item/folder/folder.h @@ -21,6 +21,8 @@ #ifndef FOLDER_H #define FOLDER_H +#include "node/param.h" +#include "project/item/footage/footage.h" #include "project/item/item.h" /** @@ -40,7 +42,7 @@ public: virtual QIcon icon() override; - virtual void Load(QXmlStreamReader* reader) override; + virtual void Load(QXmlStreamReader* reader, QHash &footage_ptrs, QList &footage_connections) override; virtual void Save(QXmlStreamWriter* writer) const override; diff --git a/app/project/item/footage/audiostream.cpp b/app/project/item/footage/audiostream.cpp index a6a154bdf..9182f135c 100644 --- a/app/project/item/footage/audiostream.cpp +++ b/app/project/item/footage/audiostream.cpp @@ -25,14 +25,14 @@ AudioStream::AudioStream() set_type(kAudio); } -QString AudioStream::description() +QString AudioStream::description() const { return QCoreApplication::translate("Stream", "%1: Audio - %2 Channels, %3Hz").arg(QString::number(index()), QString::number(channels()), QString::number(sample_rate())); } -const int &AudioStream::channels() +const int &AudioStream::channels() const { return channels_; } @@ -42,7 +42,7 @@ void AudioStream::set_channels(const int &channels) channels_ = channels; } -const uint64_t &AudioStream::channel_layout() +const uint64_t &AudioStream::channel_layout() const { return layout_; } @@ -52,7 +52,7 @@ void AudioStream::set_channel_layout(const uint64_t &layout) layout_ = layout; } -const int &AudioStream::sample_rate() +const int &AudioStream::sample_rate() const { return sample_rate_; } diff --git a/app/project/item/footage/audiostream.h b/app/project/item/footage/audiostream.h index 5350596d5..c12093e8a 100644 --- a/app/project/item/footage/audiostream.h +++ b/app/project/item/footage/audiostream.h @@ -32,15 +32,15 @@ class AudioStream : public Stream public: AudioStream(); - virtual QString description() override; + virtual QString description() const override; - const int& channels(); + const int& channels() const; void set_channels(const int& channels); - const uint64_t& channel_layout(); + const uint64_t& channel_layout() const; void set_channel_layout(const uint64_t& channel_layout); - const int& sample_rate(); + const int& sample_rate() const; void set_sample_rate(const int& sample_rate); private: diff --git a/app/project/item/footage/footage.cpp b/app/project/item/footage/footage.cpp index 4de0d4dd6..085d86853 100644 --- a/app/project/item/footage/footage.cpp +++ b/app/project/item/footage/footage.cpp @@ -37,7 +37,7 @@ Footage::~Footage() ClearStreams(); } -void Footage::Load(QXmlStreamReader *reader) +void Footage::Load(QXmlStreamReader *reader, QHash& footage_ptrs, QList& footage_connections) { QXmlStreamAttributes attributes = reader->attributes(); @@ -54,7 +54,24 @@ void Footage::Load(QXmlStreamReader *reader) XMLReadLoop(reader, "footage") { if (reader->isStartElement()) { if (reader->name() == "stream") { - // FIXME: Load stream custom options here + int stream_index = -1; + quintptr stream_ptr = 0; + + XMLAttributeLoop(reader, attr) { + if (attr.name() == "index") { + stream_index = attr.value().toInt(); + } else if (attr.name() == "ptr") { + stream_ptr = attr.value().toULongLong(); + } + } + + if (stream_index > -1 && stream_ptr > 0) { + footage_ptrs.insert(stream_ptr, stream(stream_index)); + + stream(stream_index)->Load(reader); + } else { + qWarning() << "Invalid stream found in project file"; + } } } } @@ -66,7 +83,6 @@ void Footage::Save(QXmlStreamWriter *writer) const writer->writeAttribute("name", name()); writer->writeAttribute("filename", filename()); - writer->writeAttribute("ptr", FootageToString(this)); foreach (StreamPtr stream, streams_) { stream->Save(writer); @@ -322,8 +338,3 @@ void Footage::UpdateTooltip() break; } } - -QString FootageToString(const Footage *footage) -{ - return QString::number(reinterpret_cast(footage)); -} diff --git a/app/project/item/footage/footage.h b/app/project/item/footage/footage.h index 8829f1b07..d5c7def03 100644 --- a/app/project/item/footage/footage.h +++ b/app/project/item/footage/footage.h @@ -63,7 +63,7 @@ public: /** * @brief Load function */ - virtual void Load(QXmlStreamReader* reader) override; + virtual void Load(QXmlStreamReader* reader, QHash &footage_ptrs, QList &footage_connections) override; /** * @brief Save function @@ -260,8 +260,6 @@ private: }; -QString FootageToString(const Footage* footage); - using FootagePtr = std::shared_ptr; #endif // FOOTAGE_H diff --git a/app/project/item/footage/imagestream.cpp b/app/project/item/footage/imagestream.cpp index 99c16c3f7..ac95cc420 100644 --- a/app/project/item/footage/imagestream.cpp +++ b/app/project/item/footage/imagestream.cpp @@ -20,6 +20,7 @@ #include "imagestream.h" +#include "common/xmlreadloop.h" #include "footage.h" #include "project/project.h" #include "render/colormanager.h" @@ -36,19 +37,29 @@ void ImageStream::FootageSetEvent(Footage *f) connect(f->project()->color_manager(), SIGNAL(ConfigChanged()), this, SLOT(ColorConfigChanged()), Qt::DirectConnection); } +void ImageStream::LoadCustomParameters(QXmlStreamReader *reader) +{ + XMLReadLoop(reader, "stream") { + if (reader->isStartElement() && reader->name() == "colorspace") { + reader->readNext(); + set_colorspace(reader->text().toString()); + } + } +} + void ImageStream::SaveCustomParameters(QXmlStreamWriter *writer) const { writer->writeTextElement("colorspace", colorspace_); } -QString ImageStream::description() +QString ImageStream::description() const { return QCoreApplication::translate("Stream", "%1: Image - %2x%3").arg(QString::number(index()), QString::number(width()), QString::number(height())); } -const int &ImageStream::width() +const int &ImageStream::width() const { return width_; } @@ -58,7 +69,7 @@ void ImageStream::set_width(const int &width) width_ = width; } -const int &ImageStream::height() +const int &ImageStream::height() const { return height_; } @@ -68,7 +79,7 @@ void ImageStream::set_height(const int &height) height_ = height; } -bool ImageStream::premultiplied_alpha() +bool ImageStream::premultiplied_alpha() const { return premultiplied_alpha_; } @@ -78,7 +89,7 @@ void ImageStream::set_premultiplied_alpha(bool e) premultiplied_alpha_ = e; } -const QString &ImageStream::colorspace() +const QString &ImageStream::colorspace() const { if (colorspace_.isEmpty()) { return footage()->project()->default_input_colorspace(); diff --git a/app/project/item/footage/imagestream.h b/app/project/item/footage/imagestream.h index 8ff140b90..952b0c432 100644 --- a/app/project/item/footage/imagestream.h +++ b/app/project/item/footage/imagestream.h @@ -32,18 +32,18 @@ class ImageStream : public Stream public: ImageStream(); - virtual QString description() override; + virtual QString description() const override; - const int& width(); + const int& width() const; void set_width(const int& width); - const int& height(); + const int& height() const; void set_height(const int& height); - bool premultiplied_alpha(); + bool premultiplied_alpha() const; void set_premultiplied_alpha(bool e); - const QString& colorspace(); + const QString& colorspace() const; void set_colorspace(const QString& color); signals: @@ -52,6 +52,8 @@ signals: protected: virtual void FootageSetEvent(Footage*) override; + virtual void LoadCustomParameters(QXmlStreamReader *reader) override; + virtual void SaveCustomParameters(QXmlStreamWriter* writer) const override; private: diff --git a/app/project/item/footage/stream.cpp b/app/project/item/footage/stream.cpp index 0f30acd09..0f8ebafb7 100644 --- a/app/project/item/footage/stream.cpp +++ b/app/project/item/footage/stream.cpp @@ -35,10 +35,17 @@ Stream::~Stream() { } +void Stream::Load(QXmlStreamReader *reader) +{ + LoadCustomParameters(reader); +} + void Stream::Save(QXmlStreamWriter *writer) const { writer->writeStartElement("stream"); + writer->writeAttribute("ptr", QString::number(reinterpret_cast(this))); + writer->writeAttribute("index", QString::number(index_)); SaveCustomParameters(writer); @@ -46,12 +53,12 @@ void Stream::Save(QXmlStreamWriter *writer) const writer->writeEndElement(); // stream } -QString Stream::description() +QString Stream::description() const { return QCoreApplication::translate("Stream", "%1: Unknown").arg(index()); } -const Stream::Type &Stream::type() +const Stream::Type &Stream::type() const { return type_; } @@ -102,7 +109,7 @@ void Stream::set_duration(const int64_t &duration) duration_ = duration; } -bool Stream::enabled() +bool Stream::enabled() const { return enabled_; } @@ -137,6 +144,10 @@ void Stream::FootageSetEvent(Footage *) { } +void Stream::LoadCustomParameters(QXmlStreamReader* reader) +{ +} + void Stream::SaveCustomParameters(QXmlStreamWriter *writer) const { } diff --git a/app/project/item/footage/stream.h b/app/project/item/footage/stream.h index a80e4ac7f..e90b48e68 100644 --- a/app/project/item/footage/stream.h +++ b/app/project/item/footage/stream.h @@ -75,11 +75,13 @@ public: */ virtual ~Stream(); + void Load(QXmlStreamReader* reader); + void Save(QXmlStreamWriter *writer) const; - virtual QString description(); + virtual QString description() const; - const Type& type(); + const Type& type() const; void set_type(const Type& type); Footage* footage() const; @@ -94,7 +96,7 @@ public: const int64_t& duration() const; void set_duration(const int64_t& duration); - bool enabled(); + bool enabled() const; void set_enabled(bool e); static QIcon IconFromType(const Type& type); @@ -106,6 +108,8 @@ public: protected: virtual void FootageSetEvent(Footage*); + virtual void LoadCustomParameters(QXmlStreamReader *reader); + virtual void SaveCustomParameters(QXmlStreamWriter* writer) const; private: diff --git a/app/project/item/footage/videostream.cpp b/app/project/item/footage/videostream.cpp index ed97bb94d..4f7ae7d1c 100644 --- a/app/project/item/footage/videostream.cpp +++ b/app/project/item/footage/videostream.cpp @@ -25,14 +25,14 @@ VideoStream::VideoStream() set_type(kVideo); } -QString VideoStream::description() +QString VideoStream::description() const { return QCoreApplication::translate("Stream", "%1: Video - %2x%3").arg(QString::number(index()), QString::number(width()), QString::number(height())); } -const rational &VideoStream::frame_rate() +const rational &VideoStream::frame_rate() const { return frame_rate_; } diff --git a/app/project/item/footage/videostream.h b/app/project/item/footage/videostream.h index 334182b01..addd2f9cb 100644 --- a/app/project/item/footage/videostream.h +++ b/app/project/item/footage/videostream.h @@ -28,14 +28,14 @@ class VideoStream : public ImageStream public: VideoStream(); - virtual QString description() override; + virtual QString description() const override; /** * @brief Get this video stream's frame rate * * Used purely for metadata, rendering uses the timebase instead. */ - const rational& frame_rate(); + const rational& frame_rate() const; void set_frame_rate(const rational& frame_rate); private: diff --git a/app/project/item/item.h b/app/project/item/item.h index b999f3b86..195daac88 100644 --- a/app/project/item/item.h +++ b/app/project/item/item.h @@ -30,6 +30,8 @@ #include "common/constructors.h" #include "common/threadedobject.h" +#include "node/param.h" +#include "project/item/footage/stream.h" class Project; @@ -63,7 +65,7 @@ public: DISABLE_COPY_MOVE(Item) - virtual void Load(QXmlStreamReader* reader) = 0; + virtual void Load(QXmlStreamReader* reader, QHash &footage_ptrs, QList &footage_connections) = 0; virtual void Save(QXmlStreamWriter* writer) const = 0; diff --git a/app/project/item/sequence/sequence.cpp b/app/project/item/sequence/sequence.cpp index 2f3128a45..8bc8768a6 100644 --- a/app/project/item/sequence/sequence.cpp +++ b/app/project/item/sequence/sequence.cpp @@ -42,7 +42,7 @@ Sequence::Sequence() AddNode(viewer_output_); } -void Sequence::Load(QXmlStreamReader *reader) +void Sequence::Load(QXmlStreamReader *reader, QHash &footage_ptrs, QList& footage_connections) { XMLAttributeLoop(reader, attr) { if (attr.name() == "name") { @@ -125,7 +125,7 @@ void Sequence::Load(QXmlStreamReader *reader) } if (node) { - node->Load(reader, output_ptrs, desired_connections, reader->name().toString()); + node->Load(reader, output_ptrs, desired_connections, footage_connections, reader->name().toString()); AddNode(node); } diff --git a/app/project/item/sequence/sequence.h b/app/project/item/sequence/sequence.h index 51e062985..551f2831a 100644 --- a/app/project/item/sequence/sequence.h +++ b/app/project/item/sequence/sequence.h @@ -25,6 +25,7 @@ #include "node/graph.h" #include "node/output/viewer/viewer.h" #include "render/videoparams.h" +#include "project/item/footage/stream.h" #include "project/item/item.h" class Sequence; @@ -41,7 +42,7 @@ public: /** * @brief Load function */ - virtual void Load(QXmlStreamReader* reader) override; + virtual void Load(QXmlStreamReader* reader, QHash &footage_ptrs, QList &footage_connections) override; /** * @brief Save function diff --git a/app/project/project.cpp b/app/project/project.cpp index a0884c189..2459a285d 100644 --- a/app/project/project.cpp +++ b/app/project/project.cpp @@ -35,12 +35,15 @@ Project::Project() void Project::Load(QXmlStreamReader *reader) { + QHash footage_ptrs; + QList footage_connections; + XMLReadLoop(reader, "project") { if (reader->isStartElement()) { if (reader->name() == "folder") { // Assume this folder is our root - root_.Load(reader); + root_.Load(reader, footage_ptrs, footage_connections); } else if (reader->name() == "colormanagement") { @@ -57,6 +60,12 @@ void Project::Load(QXmlStreamReader *reader) } } } + + foreach (const NodeInput::FootageConnection& con, footage_connections) { + if (con.footage) { + con.input->set_standard_value(QVariant::fromValue(footage_ptrs.value(con.footage))); + } + } } void Project::Save(QXmlStreamWriter *writer) const