From 8263ccf814d866ba053baa88c02e8d5375c421dc Mon Sep 17 00:00:00 2001 From: Mike Solar Date: Mon, 5 Jan 2026 03:11:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 3 +++ app/node/keyframe.cpp | 4 ++++ app/render/videoparams.cpp | 4 ++++ tests/CMakeLists.txt | 2 ++ tests/gtest/CMakeLists.txt | 2 ++ tests/gtest/codec_frame_test.cpp | 2 +- tests/gtest/common_current_test.cpp | 2 +- tests/gtest/common_xmlutils_test.cpp | 4 ++-- tests/gtest/main.cpp | 4 ++-- tests/gtest/node_serialization_test.cpp | 18 ++++++++++++++++-- tests/gtest/project_serializer_test.cpp | 19 +++++++++++++++++-- tests/gtest/render_audioparams_test.cpp | 2 +- tests/gtest/timeline_marker_test.cpp | 2 +- tests/gtest/undo_stack_test.cpp | 5 +++++ 14 files changed, 61 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8af8fc9f3..92546816b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -178,6 +178,9 @@ list(APPEND OLIVE_LIBRARIES KDAB::kddockwidgets ) +# Link OFX HostSupport wherever libolive-editor objects are used. +list(APPEND OLIVE_LIBRARIES OfxHost) + # Link FFmpeg find_package(FFMPEG REQUIRED COMPONENTS diff --git a/app/node/keyframe.cpp b/app/node/keyframe.cpp index f43cf5a52..f35d6b2bf 100644 --- a/app/node/keyframe.cpp +++ b/app/node/keyframe.cpp @@ -252,6 +252,10 @@ bool NodeKeyframe::load(QXmlStreamReader *reader, NodeValue::Type data_type) this->set_value( NodeValue::StringToValue(data_type, reader->readElementText(), true)); + if (!key_input.isEmpty()) { + this->set_input(key_input); + } + this->set_bezier_control_in(key_in_handle); this->set_bezier_control_out(key_out_handle); diff --git a/app/render/videoparams.cpp b/app/render/videoparams.cpp index b6d095729..f53a930d9 100644 --- a/app/render/videoparams.cpp +++ b/app/render/videoparams.cpp @@ -71,11 +71,15 @@ VideoParams::VideoParams() : width_(0) , height_(0) , depth_(0) + , time_base_(0) , format_(PixelFormat::INVALID) , channel_count_(0) + , pixel_aspect_ratio_(1) , interlacing_(Interlacing::kInterlaceNone) , divider_(1) { + calculate_effective_size(); + validate_pixel_aspect_ratio(); set_defaults_for_footage(); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index bb218f179..4f766ab70 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -45,6 +45,8 @@ function(olive_add_test GROUP NAME SOURCE) PRIVATE ${CMAKE_SOURCE_DIR}/app ${CMAKE_SOURCE_DIR}/tests + ${CMAKE_SOURCE_DIR}/third_party/openfx/include + ${CMAKE_SOURCE_DIR}/third_party/openfx/HostSupport/include ${OLIVE_INCLUDE_DIRS} ) target_link_libraries( diff --git a/tests/gtest/CMakeLists.txt b/tests/gtest/CMakeLists.txt index 4bbf4255f..07fca36b7 100644 --- a/tests/gtest/CMakeLists.txt +++ b/tests/gtest/CMakeLists.txt @@ -24,6 +24,8 @@ target_include_directories( PRIVATE ${CMAKE_SOURCE_DIR}/app ${CMAKE_SOURCE_DIR}/tests + ${CMAKE_SOURCE_DIR}/third_party/openfx/include + ${CMAKE_SOURCE_DIR}/third_party/openfx/HostSupport/include ${OLIVE_INCLUDE_DIRS} ) diff --git a/tests/gtest/codec_frame_test.cpp b/tests/gtest/codec_frame_test.cpp index 17c29020f..1ffec9ae4 100644 --- a/tests/gtest/codec_frame_test.cpp +++ b/tests/gtest/codec_frame_test.cpp @@ -7,5 +7,5 @@ TEST(CodecFrame, DefaultState) olive::Frame frame; EXPECT_EQ(frame.width(), 0); EXPECT_EQ(frame.height(), 0); - EXPECT_EQ(frame.pixel_format(), olive::core::PixelFormat::Format::kFormatNone); + EXPECT_EQ(frame.format(), olive::core::PixelFormat::INVALID); } diff --git a/tests/gtest/common_current_test.cpp b/tests/gtest/common_current_test.cpp index 6cbd96af9..bff3a4c0e 100644 --- a/tests/gtest/common_current_test.cpp +++ b/tests/gtest/common_current_test.cpp @@ -2,7 +2,7 @@ #include "common/Current.h" #include "render/videoparams.h" -#include "render/audioparams.h" +#include "olive/core/render/audioparams.h" TEST(CommonCurrent, SetAndGetVideoParams) { diff --git a/tests/gtest/common_xmlutils_test.cpp b/tests/gtest/common_xmlutils_test.cpp index b776ea2e5..9d04380ea 100644 --- a/tests/gtest/common_xmlutils_test.cpp +++ b/tests/gtest/common_xmlutils_test.cpp @@ -13,8 +13,8 @@ TEST(CommonXmlUtils, ReadNextStartElement) buffer.open(QIODevice::ReadOnly); QXmlStreamReader reader(&buffer); - EXPECT_TRUE(XMLReadNextStartElement(&reader)); + EXPECT_TRUE(olive::XMLReadNextStartElement(&reader)); EXPECT_EQ(reader.name().toString(), QStringLiteral("root")); - EXPECT_TRUE(XMLReadNextStartElement(&reader)); + EXPECT_TRUE(olive::XMLReadNextStartElement(&reader)); EXPECT_EQ(reader.name().toString(), QStringLiteral("child")); } diff --git a/tests/gtest/main.cpp b/tests/gtest/main.cpp index a9d548259..0bf0dbde7 100644 --- a/tests/gtest/main.cpp +++ b/tests/gtest/main.cpp @@ -1,9 +1,9 @@ -#include +#include #include int main(int argc, char **argv) { - QCoreApplication app(argc, argv); + QApplication app(argc, argv); ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } diff --git a/tests/gtest/node_serialization_test.cpp b/tests/gtest/node_serialization_test.cpp index f527a0770..8fae79f64 100644 --- a/tests/gtest/node_serialization_test.cpp +++ b/tests/gtest/node_serialization_test.cpp @@ -6,7 +6,9 @@ #include "node/node.h" #include "node/serializeddata.h" +#include "node/splitvalue.h" #include "node/value.h" +#include "render/diskmanager.h" namespace { class TestNode final : public olive::Node { @@ -14,7 +16,9 @@ public: TestNode() { AddInput(QStringLiteral("Value"), olive::NodeValue::kFloat); - SetSplitStandardValue(QStringLiteral("Value"), 3.5, -1); + olive::SplitValue value; + value.append(3.5); + SetSplitStandardValue(QStringLiteral("Value"), value, -1); } TestNode *copy() const override @@ -42,7 +46,8 @@ public: return QStringLiteral("Test node for serialization"); } - void Value(const NodeValueRow &, const NodeGlobals &, NodeValueTable *) const override + void Value(const olive::NodeValueRow &, const olive::NodeGlobals &, + olive::NodeValueTable *) const override { } }; @@ -50,6 +55,11 @@ public: TEST(NodeSerialization, SaveAndLoadInput) { + const bool created_disk_manager = (olive::DiskManager::instance() == nullptr); + if (created_disk_manager) { + olive::DiskManager::CreateInstance(); + } + TestNode node; node.SetLabel(QStringLiteral("MyNode")); node.SetOverrideColor(2); @@ -78,4 +88,8 @@ TEST(NodeSerialization, SaveAndLoadInput) EXPECT_EQ(loaded.GetOverrideColor(), 2); EXPECT_DOUBLE_EQ(loaded.GetSplitStandardValue(QStringLiteral("Value"), -1) .first().toDouble(), 3.5); + + if (created_disk_manager) { + olive::DiskManager::DestroyInstance(); + } } diff --git a/tests/gtest/project_serializer_test.cpp b/tests/gtest/project_serializer_test.cpp index 2f8d14149..b08203f0a 100644 --- a/tests/gtest/project_serializer_test.cpp +++ b/tests/gtest/project_serializer_test.cpp @@ -8,10 +8,19 @@ #include "node/project.h" #include "node/input/time/timeinput.h" #include "node/project/serializer/serializer.h" +#include "node/color/colormanager/colormanager.h" +#include "render/diskmanager.h" TEST(ProjectSerializer, SaveLoadProjectRoundTrip) { + const bool created_disk_manager = (olive::DiskManager::instance() == nullptr); + if (created_disk_manager) { + olive::DiskManager::CreateInstance(); + } + + olive::ColorManager::SetUpDefaultConfig(); olive::NodeFactory::Initialize(); + olive::ProjectSerializer::Initialize(); olive::Project project; project.Initialize(); @@ -27,8 +36,9 @@ TEST(ProjectSerializer, SaveLoadProjectRoundTrip) QBuffer buffer(&xml); buffer.open(QIODevice::WriteOnly); QXmlStreamWriter writer(&buffer); - EXPECT_EQ(olive::ProjectSerializer::Save(&writer, save_data), - olive::ProjectSerializer::kSuccess); + olive::ProjectSerializer::Result save_result = + olive::ProjectSerializer::Save(&writer, save_data); + EXPECT_EQ(save_result.code(), olive::ProjectSerializer::kSuccess); buffer.close(); olive::Project loaded_project; @@ -40,4 +50,9 @@ TEST(ProjectSerializer, SaveLoadProjectRoundTrip) olive::ProjectSerializer::kProject); EXPECT_EQ(result.code(), olive::ProjectSerializer::kSuccess); EXPECT_FALSE(loaded_project.nodes().isEmpty()); + + olive::ProjectSerializer::Destroy(); + if (created_disk_manager) { + olive::DiskManager::DestroyInstance(); + } } diff --git a/tests/gtest/render_audioparams_test.cpp b/tests/gtest/render_audioparams_test.cpp index 60b28864d..48da336fc 100644 --- a/tests/gtest/render_audioparams_test.cpp +++ b/tests/gtest/render_audioparams_test.cpp @@ -5,7 +5,7 @@ #include #include "node/project/serializer/typeserializer.h" -#include "render/audioparams.h" +#include "olive/core/render/audioparams.h" TEST(RenderAudioParams, SaveLoadRoundTrip) { diff --git a/tests/gtest/timeline_marker_test.cpp b/tests/gtest/timeline_marker_test.cpp index e6d644e19..eb766bf06 100644 --- a/tests/gtest/timeline_marker_test.cpp +++ b/tests/gtest/timeline_marker_test.cpp @@ -32,7 +32,7 @@ TEST(TimelineMarker, SaveLoadRoundTrip) EXPECT_EQ(reader.name().toString(), QStringLiteral("marker")); loaded.load(&reader); - EXPECT_EQ(loaded.time(), olive::core::rational(10, 1)); + EXPECT_EQ(loaded.time().in(), olive::core::rational(10, 1)); EXPECT_EQ(loaded.name(), QStringLiteral("Marker")); EXPECT_EQ(loaded.color(), 5); } diff --git a/tests/gtest/undo_stack_test.cpp b/tests/gtest/undo_stack_test.cpp index 9dcd008ac..31dd7a76c 100644 --- a/tests/gtest/undo_stack_test.cpp +++ b/tests/gtest/undo_stack_test.cpp @@ -11,6 +11,11 @@ public: { } + olive::Project *GetRelevantProject() const override + { + return nullptr; + } + protected: void redo() override {