From b582843d27b85c1a818aa558205668c8efb56bab Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 29 Oct 2020 01:36:26 +1100 Subject: [PATCH 01/72] moved things around and started rewriting render backend --- app/CMakeLists.txt | 1 + app/codec/samplebuffer.cpp | 5 + app/codec/samplebuffer.h | 1 + app/common/timerange.cpp | 16 + app/common/timerange.h | 2 + app/core.cpp | 8 +- app/node/output/viewer/viewer.cpp | 5 + app/project/item/sequence/sequence.cpp | 1 + app/render/CMakeLists.txt | 6 + app/render/backend/CMakeLists.txt | 10 - app/render/backend/opengl/CMakeLists.txt | 4 - app/render/backend/opengl/openglbackend.cpp | 43 - app/render/backend/opengl/openglbackend.h | 43 - app/render/backend/opengl/openglworker.cpp | 90 -- app/render/backend/opengl/openglworker.h | 49 - app/render/backend/renderbackend.cpp | 888 ------------------ app/render/backend/renderbackend.h | 259 ----- app/render/backend/rendercontext.cpp | 6 + app/render/backend/rendercontext.h | 11 + app/render/backend/renderframebuffer.cpp | 6 + app/render/backend/renderframebuffer.h | 11 + app/render/backend/rendershader.cpp | 6 + app/render/backend/rendershader.h | 11 + app/render/backend/rendertexture.cpp | 6 + app/render/backend/rendertexture.h | 12 + app/render/backend/renderworker.cpp | 471 ---------- app/render/backend/renderworker.h | 208 ---- .../{backend => }/colorprocessorcache.h | 0 app/render/{backend => }/decodercache.h | 0 app/render/previewautocacher.cpp | 695 ++++++++++++++ app/render/previewautocacher.h | 198 ++++ app/render/rendermanager.cpp | 169 ++++ app/render/rendermanager.h | 115 +++ app/task/export/export.cpp | 10 +- app/task/precache/precachetask.cpp | 9 +- app/task/render/render.cpp | 26 +- app/task/render/render.h | 24 +- app/threading/CMakeLists.txt | 26 + app/threading/threadpool.cpp | 138 +++ app/threading/threadpool.h | 94 ++ .../threadticket.cpp} | 59 +- .../threadticket.h} | 29 +- .../threadticketwatcher.cpp} | 9 +- .../threadticketwatcher.h} | 4 +- app/widget/viewer/viewer.cpp | 52 +- app/widget/viewer/viewer.h | 13 +- 46 files changed, 1650 insertions(+), 2199 deletions(-) delete mode 100644 app/render/backend/opengl/openglbackend.cpp delete mode 100644 app/render/backend/opengl/openglbackend.h delete mode 100644 app/render/backend/opengl/openglworker.cpp delete mode 100644 app/render/backend/opengl/openglworker.h delete mode 100644 app/render/backend/renderbackend.cpp delete mode 100644 app/render/backend/renderbackend.h create mode 100644 app/render/backend/rendercontext.cpp create mode 100644 app/render/backend/rendercontext.h create mode 100644 app/render/backend/renderframebuffer.cpp create mode 100644 app/render/backend/renderframebuffer.h create mode 100644 app/render/backend/rendershader.cpp create mode 100644 app/render/backend/rendershader.h create mode 100644 app/render/backend/rendertexture.cpp create mode 100644 app/render/backend/rendertexture.h delete mode 100644 app/render/backend/renderworker.cpp delete mode 100644 app/render/backend/renderworker.h rename app/render/{backend => }/colorprocessorcache.h (100%) rename app/render/{backend => }/decodercache.h (100%) create mode 100644 app/render/previewautocacher.cpp create mode 100644 app/render/previewautocacher.h create mode 100644 app/render/rendermanager.cpp create mode 100644 app/render/rendermanager.h create mode 100644 app/threading/CMakeLists.txt create mode 100644 app/threading/threadpool.cpp create mode 100644 app/threading/threadpool.h rename app/{render/backend/renderticket.cpp => threading/threadticket.cpp} (63%) rename app/{render/backend/renderticket.h => threading/threadticket.h} (84%) rename app/{render/backend/renderticketwatcher.cpp => threading/threadticketwatcher.cpp} (93%) rename app/{render/backend/renderticketwatcher.h => threading/threadticketwatcher.h} (96%) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index a5177e705..7e7487ba5 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -41,6 +41,7 @@ add_subdirectory(project) add_subdirectory(render) add_subdirectory(shaders) add_subdirectory(task) +add_subdirectory(threading) add_subdirectory(timeline) add_subdirectory(tool) add_subdirectory(ui) diff --git a/app/codec/samplebuffer.cpp b/app/codec/samplebuffer.cpp index fdd25b825..8c8fdc3b9 100644 --- a/app/codec/samplebuffer.cpp +++ b/app/codec/samplebuffer.cpp @@ -38,6 +38,11 @@ SampleBufferPtr SampleBuffer::Create() return std::make_shared(); } +SampleBufferPtr SampleBuffer::CreateAllocated(const AudioParams &audio_params, const rational &length) +{ + return CreateAllocated(audio_params, audio_params.time_to_samples(length)); +} + SampleBufferPtr SampleBuffer::CreateAllocated(const AudioParams &audio_params, int samples_per_channel) { SampleBufferPtr buffer = Create(); diff --git a/app/codec/samplebuffer.h b/app/codec/samplebuffer.h index 891e9156d..eef51ff8a 100644 --- a/app/codec/samplebuffer.h +++ b/app/codec/samplebuffer.h @@ -46,6 +46,7 @@ public: virtual ~SampleBuffer(); static SampleBufferPtr Create(); + static SampleBufferPtr CreateAllocated(const AudioParams& audio_params, const rational& length); static SampleBufferPtr CreateAllocated(const AudioParams& audio_params, int samples_per_channel); static SampleBufferPtr CreateFromPackedData(const AudioParams& audio_params, const QByteArray& bytes); diff --git a/app/common/timerange.cpp b/app/common/timerange.cpp index d8b2a5b6b..fde65bbf3 100644 --- a/app/common/timerange.cpp +++ b/app/common/timerange.cpp @@ -20,6 +20,7 @@ #include "timerange.h" +#include #include OLIVE_NAMESPACE_ENTER @@ -148,6 +149,21 @@ const TimeRange &TimeRange::operator-=(const rational &rhs) return *this; } +std::list TimeRange::Split(const int &chunk_size) const +{ + std::list split_ranges; + + int start_time = qFloor(this->in().toDouble() / static_cast(chunk_size)) * chunk_size; + int end_time = qCeil(this->out().toDouble() / static_cast(chunk_size)) * chunk_size; + + for (int i=start_time; iin(), rational(i)), + qMin(this->out(), rational(i + chunk_size)))); + } + + return split_ranges; +} + void TimeRange::normalize() { // If `out` is earlier than `in`, swap them diff --git a/app/common/timerange.h b/app/common/timerange.h index de5785b5f..109d9361b 100644 --- a/app/common/timerange.h +++ b/app/common/timerange.h @@ -56,6 +56,8 @@ public: const TimeRange& operator+=(const rational &rhs); const TimeRange& operator-=(const rational &rhs); + std::list Split(const int &chunk_size) const; + private: void normalize(); diff --git a/app/core.cpp b/app/core.cpp index 8db737dbd..449197683 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -53,6 +53,7 @@ #include "render/colormanager.h" #include "render/diskmanager.h" #include "render/pixelformat.h" +#include "render/rendermanager.h" #include "render/shaderinfo.h" #ifdef USE_OTIO #include "task/project/loadotio/loadotio.h" @@ -135,8 +136,8 @@ void Core::Start() // Initialize task manager TaskManager::CreateInstance(); - // Initialize OpenGL service - OpenGLProxy::CreateInstance(); + // Initialize RenderManager + RenderManager::CreateInstance(); // // Start application @@ -180,7 +181,7 @@ void Core::Stop() } } - OpenGLProxy::DestroyInstance(); + RenderManager::DestroyInstance(); MenuShared::DestroyInstance(); @@ -197,6 +198,7 @@ void Core::Stop() NodeFactory::Destroy(); delete main_window_; + main_window_ = nullptr; } MainWindow *Core::main_window() diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index ca99b0837..ae5788929 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -164,6 +164,8 @@ void ViewerOutput::set_video_params(const VideoParams &video) } emit VideoParamsChanged(); + + video_frame_cache_.InvalidateAll(); } void ViewerOutput::set_audio_params(const AudioParams &audio) @@ -171,6 +173,9 @@ void ViewerOutput::set_audio_params(const AudioParams &audio) audio_params_ = audio; emit AudioParamsChanged(); + + // This will automatically InvalidateAll + audio_playback_cache_.SetParameters(audio_params()); } rational ViewerOutput::GetLength() diff --git a/app/project/item/sequence/sequence.cpp b/app/project/item/sequence/sequence.cpp index ab61093a1..91042e555 100644 --- a/app/project/item/sequence/sequence.cpp +++ b/app/project/item/sequence/sequence.cpp @@ -21,6 +21,7 @@ #include "sequence.h" #include +#include #include "config/config.h" #include "common/channellayout.h" diff --git a/app/render/CMakeLists.txt b/app/render/CMakeLists.txt index 709a8c5e5..44b590ee6 100644 --- a/app/render/CMakeLists.txt +++ b/app/render/CMakeLists.txt @@ -28,7 +28,9 @@ set(OLIVE_SOURCES render/colormanager.h render/colormanager.cpp render/colorprocessor.h + render/colorprocessorcache.h render/colorprocessor.cpp + render/decodercache.h render/diskmanager.h render/diskmanager.cpp render/framehashcache.h @@ -39,6 +41,10 @@ set(OLIVE_SOURCES render/pixelformat.cpp render/playbackcache.h render/playbackcache.cpp + render/previewautocacher.h + render/previewautocacher.cpp + render/rendermanager.h + render/rendermanager.cpp render/rendermodes.h render/shaderinfo.h render/videoparams.h diff --git a/app/render/backend/CMakeLists.txt b/app/render/backend/CMakeLists.txt index 79650bd7b..8dc59590c 100644 --- a/app/render/backend/CMakeLists.txt +++ b/app/render/backend/CMakeLists.txt @@ -18,15 +18,5 @@ add_subdirectory(opengl) set(OLIVE_SOURCES ${OLIVE_SOURCES} - render/backend/colorprocessorcache.h - render/backend/decodercache.h - render/backend/renderbackend.h - render/backend/renderbackend.cpp - render/backend/renderticket.h - render/backend/renderticket.cpp - render/backend/renderticketwatcher.h - render/backend/renderticketwatcher.cpp - render/backend/renderworker.h - render/backend/renderworker.cpp PARENT_SCOPE ) diff --git a/app/render/backend/opengl/CMakeLists.txt b/app/render/backend/opengl/CMakeLists.txt index f1a46cbd7..cb8f1b674 100644 --- a/app/render/backend/opengl/CMakeLists.txt +++ b/app/render/backend/opengl/CMakeLists.txt @@ -16,8 +16,6 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} - render/backend/opengl/openglbackend.h - render/backend/opengl/openglbackend.cpp render/backend/opengl/openglcolorprocessor.h render/backend/opengl/openglcolorprocessor.cpp render/backend/opengl/openglframebuffer.h @@ -32,7 +30,5 @@ set(OLIVE_SOURCES render/backend/opengl/opengltexture.cpp render/backend/opengl/opengltexturecache.h render/backend/opengl/opengltexturecache.cpp - render/backend/opengl/openglworker.h - render/backend/opengl/openglworker.cpp PARENT_SCOPE ) diff --git a/app/render/backend/opengl/openglbackend.cpp b/app/render/backend/opengl/openglbackend.cpp deleted file mode 100644 index 60e81f914..000000000 --- a/app/render/backend/opengl/openglbackend.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "openglbackend.h" - -#include "openglworker.h" - -OLIVE_NAMESPACE_ENTER - -OpenGLBackend::OpenGLBackend(QObject* parent) : - RenderBackend(parent) -{ - -} - -OpenGLBackend::~OpenGLBackend() -{ - Close(); -} - -RenderWorker *OpenGLBackend::CreateNewWorker() -{ - return new OpenGLWorker(this); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglbackend.h b/app/render/backend/opengl/openglbackend.h deleted file mode 100644 index 7d88611f3..000000000 --- a/app/render/backend/opengl/openglbackend.h +++ /dev/null @@ -1,43 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLBACKEND_H -#define OPENGLBACKEND_H - -#include "openglproxy.h" -#include "render/backend/renderbackend.h" - -OLIVE_NAMESPACE_ENTER - -class OpenGLBackend : public RenderBackend -{ -public: - OpenGLBackend(QObject* parent = nullptr); - - virtual ~OpenGLBackend() override; - -protected: - virtual RenderWorker* CreateNewWorker() override; - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // OPENGLBACKEND_H diff --git a/app/render/backend/opengl/openglworker.cpp b/app/render/backend/opengl/openglworker.cpp deleted file mode 100644 index ec518ffc7..000000000 --- a/app/render/backend/opengl/openglworker.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "openglworker.h" - -OLIVE_NAMESPACE_ENTER - -OpenGLWorker::OpenGLWorker(RenderBackend *parent) : - RenderWorker(parent) -{ -} - -void OpenGLWorker::TextureToFrame(const QVariant &texture, FramePtr frame, const QMatrix4x4& mat) const -{ - QMetaObject::invokeMethod(OpenGLProxy::instance(), - "TextureToBuffer", - Qt::BlockingQueuedConnection, - Q_ARG(const QVariant&, texture), - OLIVE_NS_ARG(FramePtr, frame), - Q_ARG(const QMatrix4x4&, mat)); -} - -QVariant OpenGLWorker::FootageFrameToTexture(StreamPtr stream, FramePtr frame) const -{ - QVariant value; - - QMetaObject::invokeMethod(OpenGLProxy::instance(), - "FrameToValue", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QVariant, value), - OLIVE_NS_ARG(FramePtr, frame), - OLIVE_NS_ARG(StreamPtr, stream), - OLIVE_NS_CONST_ARG(VideoParams&, video_params()), - OLIVE_NS_CONST_ARG(RenderMode::Mode&, render_mode())); - - return value; -} - -QVariant OpenGLWorker::CachedFrameToTexture(FramePtr frame) const -{ - QVariant value; - - QMetaObject::invokeMethod(OpenGLProxy::instance(), - "PreCachedFrameToValue", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QVariant, value), - OLIVE_NS_ARG(FramePtr, frame)); - - return value; -} - -QVariant OpenGLWorker::ProcessShader(const Node *node, const TimeRange &range, const ShaderJob &job) -{ - QVariant value; - - QMetaObject::invokeMethod(OpenGLProxy::instance(), - "RunNodeAccelerated", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QVariant, value), - OLIVE_NS_CONST_ARG(Node*, node), - OLIVE_NS_CONST_ARG(TimeRange&, range), - OLIVE_NS_CONST_ARG(ShaderJob&, job), - OLIVE_NS_CONST_ARG(VideoParams&, video_params())); - - return value; -} - -bool OpenGLWorker::TextureHasAlpha(const QVariant &v) const -{ - return PixelFormat::FormatHasAlphaChannel(v.value()->texture()->format()); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglworker.h b/app/render/backend/opengl/openglworker.h deleted file mode 100644 index 75eed65f8..000000000 --- a/app/render/backend/opengl/openglworker.h +++ /dev/null @@ -1,49 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLWORKER_H -#define OPENGLWORKER_H - -#include "openglproxy.h" -#include "render/backend/renderworker.h" - -OLIVE_NAMESPACE_ENTER - -class OpenGLWorker : public RenderWorker -{ -public: - OpenGLWorker(RenderBackend* parent); - -protected: - virtual void TextureToFrame(const QVariant& texture, FramePtr frame, const QMatrix4x4 &mat) const override; - - virtual QVariant FootageFrameToTexture(StreamPtr stream, FramePtr frame) const override; - - virtual QVariant CachedFrameToTexture(FramePtr frame) const override; - - virtual QVariant ProcessShader(const Node *node, const TimeRange &range, const ShaderJob& job) override; - - virtual bool TextureHasAlpha(const QVariant& v) const override; - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // OPENGLWORKER_H diff --git a/app/render/backend/renderbackend.cpp b/app/render/backend/renderbackend.cpp deleted file mode 100644 index 6e469e07e..000000000 --- a/app/render/backend/renderbackend.cpp +++ /dev/null @@ -1,888 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "renderbackend.h" - -#include -#include -#include - -#include "config/config.h" -#include "core.h" -#include "task/conform/conform.h" -#include "task/taskmanager.h" -#include "window/mainwindow/mainwindow.h" - -OLIVE_NAMESPACE_ENTER - -QVector RenderBackend::instances_; -QMutex RenderBackend::instance_lock_; -RenderBackend* RenderBackend::active_instance_ = nullptr; -QThreadPool RenderBackend::thread_pool_; - -RenderBackend::RenderBackend(QObject *parent) : - QObject(parent), - viewer_node_(nullptr), - video_force_download_resolution_(false), - autocache_enabled_(false), - autocache_paused_(false), - generate_audio_previews_(false), - render_mode_(RenderMode::kOnline), - autocache_has_changed_(false), - use_custom_autocache_range_(false), - ignore_next_mouse_button_(false) -{ - instance_lock_.lock(); - instances_.append(this); - instance_lock_.unlock(); - - // Set default autocache range - SetAutoCachePlayhead(rational()); -} - -RenderBackend::~RenderBackend() -{ - Close(); -} - -void RenderBackend::SetViewerNode(ViewerOutput *viewer_node) -{ - if (viewer_node_ == viewer_node) { - return; - } - - ViewerOutput* old_viewer = viewer_node_; - if (!viewer_node) { - // If setting to null, set it here before we wait for jobs to finish to prevent WorkerFinished() - // from calling RunNextJob() again and preventing us from finishing - viewer_node_ = nullptr; - } - - if (old_viewer) { - // Cancel any remaining tickets - ClearQueue(); - - // Wait for any currently running jobs to finish - foreach (RenderTicketPtr ticket, running_tickets_) { - ticket->WaitForFinished(); - } - - // Clear autocache lists - { - // This can be cleared normally (hashes will be discarded and need to be calculated again) - autocache_hash_tasks_.clear(); - - // We need to wait for these since they work directly on the FrameHashCache. Most of the time - // this is fine, but not if the FrameHashCache gets deleted after this function. - foreach (QFutureWatcher* watcher, autocache_hash_process_tasks_) { - watcher->waitForFinished(); - } - autocache_hash_process_tasks_.clear(); - - // This can be cleared normally (frames will be discarded and need to be rendered again) - autocache_video_tasks_.clear(); - - // This can be cleared normally (PCM data will be discarded and need to be rendered again) - autocache_audio_tasks_.clear(); - - // We'll need to wait for these since they work directly on the FrameHashCache. Frames will - // be in the cache for later use. - { - QMap*, QByteArray>::const_iterator i; - for (i=autocache_video_download_tasks_.constBegin(); i!=autocache_video_download_tasks_.constEnd(); i++) { - i.key()->waitForFinished(); - } - autocache_video_download_tasks_.clear(); - } - - // No longer caching any hashes - autocache_currently_caching_hashes_.clear(); - } - - // Delete all of our copied nodes - foreach (Node* c, copy_map_) { - c->deleteLater(); - } - copy_map_.clear(); - copied_viewer_node_ = nullptr; - graph_update_queue_.clear(); - - // Disconnect signal (will be a no-op if the signal was never connected) - disconnect(old_viewer, - &ViewerOutput::GraphChangedFrom, - this, - &RenderBackend::NodeGraphChanged); - - disconnect(old_viewer->video_frame_cache(), - &PlaybackCache::Invalidated, - this, - &RenderBackend::AutoCacheVideoInvalidated); - - disconnect(old_viewer->audio_playback_cache(), - &PlaybackCache::Invalidated, - this, - &RenderBackend::AutoCacheAudioInvalidated); - - foreach (const WorkerData& worker, workers_) { - worker.worker->ClearDecoders(); - } - } - - if (viewer_node) { - // If setting to non-null, set it now - viewer_node_ = viewer_node; - - // Copy graph - copied_viewer_node_ = static_cast(viewer_node_->copy()); - copy_map_.insert(viewer_node_, copied_viewer_node_); - - // We begin an operation and never end it which prevents the copy from unnecessarily - // invalidating its own cache - copied_viewer_node_->BeginOperation(); - - NodeGraphChanged(viewer_node_->texture_input()); - NodeGraphChanged(viewer_node_->samples_input()); - ProcessUpdateQueue(); - - if (autocache_enabled_) { - connect(viewer_node_, - &ViewerOutput::GraphChangedFrom, - this, - &RenderBackend::NodeGraphChanged); - - connect(viewer_node_->video_frame_cache(), - &PlaybackCache::Invalidated, - this, - &RenderBackend::AutoCacheVideoInvalidated); - - connect(viewer_node_->audio_playback_cache(), - &PlaybackCache::Invalidated, - this, - &RenderBackend::AutoCacheAudioInvalidated); - } - } -} - -void RenderBackend::AutoCacheRange(const TimeRange &range) -{ - Q_ASSERT(autocache_enabled_); - - autocache_has_changed_ = true; - use_custom_autocache_range_ = true; - custom_autocache_range_ = range; - - AutoCacheRequeueFrames(); -} - -RenderTicketPtr RenderBackend::Hash(const QVector ×, bool prioritize) -{ - Q_ASSERT(viewer_node_); - - SetActiveInstance(); - - RenderTicketPtr ticket = std::make_shared(RenderTicket::kTypeHash, - QVariant::fromValue(times)); - - if (prioritize) { - render_queue_.push_front(ticket); - } else { - render_queue_.push_back(ticket); - } - - QMetaObject::invokeMethod(this, "RunNextJob", Qt::QueuedConnection); - - return ticket; -} - -RenderTicketPtr RenderBackend::RenderFrame(const rational &time, bool prioritize, const QByteArray& hash) -{ - Q_ASSERT(viewer_node_); - - SetActiveInstance(); - - RenderTicketPtr ticket = std::make_shared(RenderTicket::kTypeVideo, - QVariant::fromValue(time)); - - ticket->setProperty("hash", hash); - - if (prioritize) { - render_queue_.push_front(ticket); - } else { - render_queue_.push_back(ticket); - } - - QMetaObject::invokeMethod(this, "RunNextJob", Qt::QueuedConnection); - - return ticket; -} - -RenderTicketPtr RenderBackend::RenderAudio(const TimeRange &r, bool prioritize) -{ - Q_ASSERT(viewer_node_); - - SetActiveInstance(); - - RenderTicketPtr ticket = std::make_shared(RenderTicket::kTypeAudio, - QVariant::fromValue(r)); - - if (prioritize) { - render_queue_.push_front(ticket); - } else { - render_queue_.push_back(ticket); - } - - QMetaObject::invokeMethod(this, "RunNextJob", Qt::QueuedConnection); - - return ticket; -} - -void RenderBackend::SetVideoParams(const VideoParams ¶ms) -{ - video_params_ = params; -} - -void RenderBackend::SetAudioParams(const AudioParams ¶ms) -{ - audio_params_ = params; -} - -void RenderBackend::IgnoreNextMouseButton() -{ - ignore_next_mouse_button_ = true; -} - -std::list RenderBackend::SplitRangeIntoChunks(const TimeRange &r) -{ - // FIXME: Magic number - const int chunk_size = 2; - - std::list split_ranges; - - int start_time = qFloor(r.in().toDouble() / static_cast(chunk_size)) * chunk_size; - int end_time = qCeil(r.out().toDouble() / static_cast(chunk_size)) * chunk_size; - - for (int i=start_time; iCancel(); - } - render_queue_.clear(); -} - -void RenderBackend::NodeGraphChanged(NodeInput *source) -{ - // We need to determine: - // - If we don't have this input, assume that it's coming soon and ignore it - // - If we do, is this input a child of another input we're already copying? - // - Or are any of the queued inputs children of this one? - - // First we need to find our copy of the input being queued - Node* our_copy_node = copy_map_.value(source->parentNode()); - - // If we don't have this node yet, assume it's coming in a later copy in which case it'll be - // copied then - if (!our_copy_node) { - // Assert that there are updates coming - Q_ASSERT(!graph_update_queue_.isEmpty()); - return; - } - - // If we're here, we must have this node. Determine if we're already copying a "parent" of this - for (int i=0; iIsArray() && static_cast(source)->sub_params().contains(queued_input)) - || queued_input->parentNode()->OutputsTo(source, true, true)) { - // In which case, we don't need to queue it and can queue our own - graph_update_queue_.removeAt(i); - disconnect(queued_input, &NodeInput::destroyed, this, &RenderBackend::QueuedInputRemoved); - i--; - } - - // Check if the source is a member of this array, in which case it'll be copied eventually anyway - if (queued_input->IsArray() - && static_cast(queued_input)->sub_params().contains(source)) { - return; - } - - // Check if this dependency graph is already queued - if (source->parentNode()->OutputsTo(queued_input, true, true)) { - // In which case, no further copy is necessary - return; - } - } - - graph_update_queue_.append(source); - connect(source, &NodeInput::destroyed, this, &RenderBackend::QueuedInputRemoved); -} - -void RenderBackend::Close() -{ - SetViewerNode(nullptr); - - for (int i=0;ideleteLater(); - } - workers_.clear(); -} - -void RenderBackend::RunNextJob() -{ - // If queue is empty, nothing to be done - if (render_queue_.empty()) { - - // If we're the active instance, unset it - instance_lock_.lock(); - if (active_instance_ == this) { - active_instance_ = nullptr; - } - instance_lock_.unlock(); - - return; - } - - // If we have a value update queued, check if all workers are available and proceed from there - if (autocache_enabled_ && !graph_update_queue_.isEmpty()) { - bool all_workers_available = true; - - foreach (const WorkerData& data, workers_) { - if (data.busy) { - all_workers_available = false; - break; - } - } - - if (all_workers_available) { - // Process queue - ProcessUpdateQueue(); - } else { - return; - } - } - - // If we have no workers allocated, allocate them now - if (workers_.isEmpty()) { - // Allocate workers here - workers_.resize(thread_pool_.maxThreadCount()); - - for (int i=0;iSetVideoParams(video_params_); - worker->SetAudioParams(audio_params_); - worker->SetForceDownloadResolution(video_force_download_resolution_); - worker->SetVideoDownloadMatrix(video_download_matrix_); - worker->SetRenderMode(render_mode_); - worker->SetPreviewGenerationEnabled(generate_audio_previews_); - worker->SetCopyMap(©_map_); - worker->SetCachePath(viewer_node_->video_frame_cache()->GetCacheDirectory()); - - // Move ticket from queue to running list - RenderTicketPtr ticket = render_queue_.front(); - render_queue_.pop_front(); - running_tickets_.push_back(ticket); - - // Create watcher to remove from running list - RenderTicketWatcher* watcher = new RenderTicketWatcher(); - connect(watcher, &RenderTicketWatcher::Finished, this, &RenderBackend::TicketFinished); - watcher->SetTicket(ticket); - - // Set job time to now - ticket->SetJobTime(); - - switch (ticket->GetType()) { - case RenderTicket::kTypeHash: - Q_ASSERT(video_params_.is_valid()); - - QtConcurrent::run(&thread_pool_, - worker, - &RenderWorker::Hash, - ticket, - copied_viewer_node_, - ticket->GetTime().value >()); - break; - case RenderTicket::kTypeVideo: - { - Q_ASSERT(video_params_.is_valid()); - - rational frame = ticket->GetTime().value(); - - QtConcurrent::run(&thread_pool_, - worker, - &RenderWorker::RenderFrame, - ticket, - copied_viewer_node_, - frame); - - QByteArray frame_hash = ticket->property("hash").toByteArray(); - if (!frame_hash.isEmpty()) { - autocache_currently_caching_hashes_.append(frame_hash); - } - break; - } - case RenderTicket::kTypeAudio: - Q_ASSERT(audio_params_.is_valid()); - - QtConcurrent::run(&thread_pool_, - worker, - &RenderWorker::RenderAudio, - ticket, - copied_viewer_node_, - ticket->GetTime().value()); - break; - } - - if (render_queue_.empty()) { - // No more jobs, can exit here - break; - } - } - } -} - -void RenderBackend::TicketFinished() -{ - RenderTicketPtr ticket = static_cast(sender())->GetTicket(); - delete sender(); - - running_tickets_.remove(ticket); -} - -void RenderBackend::WorkerGeneratedWaveform(RenderTicketPtr ticket, TrackOutput *track, AudioVisualWaveform samples, TimeRange range) -{ - QList valid_ranges = viewer_node_->audio_playback_cache()->GetValidRanges(range, - ticket->GetJobTime()); - if (!valid_ranges.isEmpty()) { - // Generate visual waveform in this background thread - track->waveform_lock()->lock(); - - track->waveform().set_channel_count(audio_params_.channel_count()); - - foreach (const TimeRange& r, valid_ranges) { - track->waveform().OverwriteSums(samples, r.in(), r.in() - range.in(), r.length()); - } - - track->waveform_lock()->unlock(); - - emit track->PreviewChanged(); - } -} - -void RenderBackend::AutoCacheVideoInvalidated(const TimeRange &range) -{ - ClearVideoQueue(); - - // Hash these frames since that should be relatively quick. - if (ignore_next_mouse_button_ || !(qApp->mouseButtons() & Qt::LeftButton)) { - ignore_next_mouse_button_ = false; - RenderTicketWatcher* watcher = new RenderTicketWatcher(); - QVector frames = viewer_node_->video_frame_cache()->GetFrameListFromTimeRange({range}); - autocache_hash_tasks_.insert(watcher, frames); - connect(watcher, &RenderTicketWatcher::Finished, this, &RenderBackend::AutoCacheHashesGenerated); - watcher->SetTicket(Hash(frames)); - } -} - -void RenderBackend::AutoCacheAudioInvalidated(const TimeRange &range) -{ - // Start a task to re-render the audio at this range - RenderTicketWatcher* watcher = new RenderTicketWatcher(); - autocache_audio_tasks_.insert(watcher, range); - connect(watcher, &RenderTicketWatcher::Finished, this, &RenderBackend::AutoCacheAudioRendered); - watcher->SetTicket(RenderAudio(range, true)); -} - -void RenderBackend::SetHashes(FrameHashCache* cache, const QVector& times, const QVector& hashes, qint64 job_time) -{ - std::vector existing_hashes; - - for (int i=0; iCachePathName(hash)); - - if (hash_exists) { - existing_hashes.push_back(hash); - } - } - - QMetaObject::invokeMethod(cache, "SetHash", Qt::QueuedConnection, - OLIVE_NS_ARG(rational, time), - Q_ARG(QByteArray, hash), - Q_ARG(qint64, job_time), - Q_ARG(bool, hash_exists)); - } -} - -void RenderBackend::AutoCacheHashesGenerated() -{ - RenderTicketWatcher* watcher = static_cast(sender()); - - if (autocache_hash_tasks_.contains(watcher)) { - if (!watcher->WasCancelled()) { - QFutureWatcher* hw = new QFutureWatcher(); - connect(hw, &QFutureWatcher::finished, this, &RenderBackend::AutoCacheHashesProcessed); - autocache_hash_process_tasks_.append(hw); - hw->setFuture(QtConcurrent::run(this, - &RenderBackend::SetHashes, - viewer_node_->video_frame_cache(), - autocache_hash_tasks_.value(watcher), - watcher->Get().value >(), - watcher->GetTicket()->GetJobTime())); - } - - autocache_hash_tasks_.remove(watcher); - } - - delete watcher; -} - -void RenderBackend::AutoCacheHashesProcessed() -{ - QFutureWatcher* watcher = static_cast*>(sender()); - - if (autocache_hash_process_tasks_.contains(watcher)) { - autocache_hash_process_tasks_.removeOne(watcher); - - AutoCacheRequeueFrames(); - } - - delete watcher; -} - -void RenderBackend::AutoCacheAudioRendered() -{ - RenderTicketWatcher* watcher = static_cast(sender()); - - if (autocache_audio_tasks_.contains(watcher)) { - if (!watcher->WasCancelled()) { - viewer_node_->audio_playback_cache()->WritePCM(autocache_audio_tasks_.value(watcher), - watcher->Get().value(), - watcher->GetTicket()->GetJobTime()); - } - - autocache_audio_tasks_.remove(watcher); - } - - delete watcher; -} - -void RenderBackend::AutoCacheVideoRendered() -{ - RenderTicketWatcher* watcher = static_cast(sender()); - - if (autocache_video_tasks_.contains(watcher)) { - if (!watcher->WasCancelled()) { - const QByteArray& hash = autocache_video_tasks_.value(watcher); - - // Download frame in another thread - QFutureWatcher* w = new QFutureWatcher(); - autocache_video_download_tasks_.insert(w, hash); - connect(w, &QFutureWatcher::finished, this, &RenderBackend::AutoCacheVideoDownloaded); - w->setFuture(QtConcurrent::run(viewer_node_->video_frame_cache(), - &FrameHashCache::SaveCacheFrame, - hash, - watcher->Get().value())); - } - - autocache_video_tasks_.remove(watcher); - } - - delete watcher; -} - -void RenderBackend::AutoCacheVideoDownloaded() -{ - QFutureWatcher* watcher = static_cast*>(sender()); - - if (autocache_video_download_tasks_.contains(watcher)) { - if (!watcher->isCanceled()) { - if (watcher->result()) { - const QByteArray& hash = autocache_video_download_tasks_.value(watcher); - - autocache_currently_caching_hashes_.removeOne(hash); - - viewer_node_->video_frame_cache()->ValidateFramesWithHash(hash); - } else { - qCritical() << "Failed to download video frame"; - } - } - - autocache_video_download_tasks_.remove(watcher); - } - - delete watcher; -} - -void RenderBackend::QueuedInputRemoved() -{ - NodeInput* i = static_cast(sender()); - disconnect(i, &NodeInput::destroyed, this, &RenderBackend::QueuedInputRemoved); - graph_update_queue_.removeOne(i); -} - -//#define PRINT_UPDATE_QUEUE_INFO -void RenderBackend::ProcessUpdateQueue() -{ -#ifdef PRINT_UPDATE_QUEUE_INFO - qint64 t = QDateTime::currentMSecsSinceEpoch(); - qDebug() << "Processing update queue of" << graph_update_queue_.size() << "elements:"; -#endif - - while (!graph_update_queue_.isEmpty()) { - NodeInput* i = graph_update_queue_.takeFirst(); -#ifdef PRINT_UPDATE_QUEUE_INFO - qDebug() << " " << i->parentNode()->id() << i->id(); -#endif - disconnect(i, &NodeInput::destroyed, this, &RenderBackend::QueuedInputRemoved); - - CopyNodeInputValue(i); - } - -#ifdef PRINT_UPDATE_QUEUE_INFO - qDebug() << "Update queue took:" << (QDateTime::currentMSecsSinceEpoch() - t); -#endif -} - -void RenderBackend::WorkerFinished() -{ - RenderWorker* worker = static_cast(sender()); - - // Set busy state to false - for (int i=0;iparentNode()); - Q_ASSERT(our_copy_node); - NodeInput* our_copy = our_copy_node->GetInputWithID(input->id()); - - // Copy the standard/keyframe values between these two inputs - NodeInput::CopyValues(input, - our_copy, - false, - false); - - // Handle connections - if (input->is_connected() || our_copy->is_connected()) { - // If one of the inputs is connected, it's likely this change came from connecting or - // disconnecting whatever was connected to it - - // We start by removing all old dependencies from the map - QList old_deps = our_copy->GetExclusiveDependencies(); - foreach (Node* i, old_deps) { - copy_map_.take(copy_map_.key(i))->deleteLater(); - } - - // And clear any other edges - while (!our_copy->edges().isEmpty()) { - NodeParam::DisconnectEdge(our_copy->edges().first()); - } - - // Then we copy all node dependencies and connections (if there are any) - CopyNodeMakeConnection(input, our_copy); - } - - // Call on sub-elements too - if (input->IsArray()) { - foreach (NodeInput* i, static_cast(input)->sub_params()) { - CopyNodeInputValue(i); - } - } -} - -Node* RenderBackend::CopyNodeConnections(Node* src_node) -{ - // Check if this node is already in the map - Node* dst_node = copy_map_.value(src_node); - - // If not, create it now - if (!dst_node) { - dst_node = src_node->copy(); - - if (dst_node->IsTrack()) { - // Hack that ensures the track type is set since we don't bother copying the whole timeline - static_cast(dst_node)->set_track_type(static_cast(src_node)->track_type()); - } - - copy_map_.insert(src_node, dst_node); - } - - // Make sure its values are copied - Node::CopyInputs(src_node, dst_node, false); - - // Copy all connections - QList src_node_inputs = src_node->GetInputsIncludingArrays(); - QList dst_node_inputs = dst_node->GetInputsIncludingArrays(); - - for (int i=0;iis_connected()) { - Node* dst_node = CopyNodeConnections(src_input->get_connected_node()); - - NodeOutput* corresponding_output = dst_node->GetOutputWithID(src_input->get_connected_output()->id()); - - NodeParam::ConnectEdge(corresponding_output, - dst_input); - } -} - -void RenderBackend::ClearQueueOfType(RenderTicket::Type type) -{ - std::list::iterator i = render_queue_.begin(); - - while (i != render_queue_.end()) { - if ((*i)->GetType() == type) { - (*i)->Cancel(); - i = render_queue_.erase(i); - } else { - i++; - } - } -} - -void RenderBackend::SetActiveInstance() -{ - QMutexLocker locker(&instance_lock_); - - if (active_instance_ != this) { - // Signal active instance to stop - QMetaObject::invokeMethod(active_instance_, "ClearVideoQueue", Qt::QueuedConnection); - - active_instance_ = this; - } -} - -void RenderBackend::AutoCacheRequeueFrames() -{ - if (viewer_node_ - && viewer_node_->video_frame_cache()->HasInvalidatedRanges() - && autocache_hash_tasks_.isEmpty() - && autocache_hash_process_tasks_.isEmpty() - && autocache_has_changed_ - && (!autocache_paused_ || use_custom_autocache_range_)) { - TimeRange using_range; - - if (use_custom_autocache_range_) { - using_range = custom_autocache_range_; - use_custom_autocache_range_ = false; - } else { - using_range = autocache_range_; - } - - QVector invalidated_ranges = viewer_node_->video_frame_cache()->GetInvalidatedFrames(using_range); - - ClearVideoQueue(); - - // QMaps are automatically sorted by time which is always best for rendering - QList queued_hashes; - - foreach (const rational& t, invalidated_ranges) { - const QByteArray& hash = viewer_node_->video_frame_cache()->GetHash(t); - - if (t >= using_range.in() - && t < using_range.out() - && !queued_hashes.contains(hash) - && !autocache_currently_caching_hashes_.contains(hash)) { - // Don't render any hash more than once - queued_hashes.append(hash); - - RenderTicketWatcher* watcher = new RenderTicketWatcher(); - connect(watcher, &RenderTicketWatcher::Finished, this, &RenderBackend::AutoCacheVideoRendered); - autocache_video_tasks_.insert(watcher, hash); - - watcher->SetTicket(RenderFrame(t, false, hash)); - } - } - - autocache_has_changed_ = false; - } -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/renderbackend.h b/app/render/backend/renderbackend.h deleted file mode 100644 index c7e29e317..000000000 --- a/app/render/backend/renderbackend.h +++ /dev/null @@ -1,259 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef RENDERBACKEND_H -#define RENDERBACKEND_H - -#include - -#include "config/config.h" -#include "dialog/rendercancel/rendercancel.h" -#include "decodercache.h" -#include "node/graph.h" -#include "node/output/viewer/viewer.h" -#include "render/backend/colorprocessorcache.h" -#include "renderticket.h" -#include "renderticketwatcher.h" -#include "renderworker.h" - -OLIVE_NAMESPACE_ENTER - -class RenderBackend : public QObject -{ - Q_OBJECT -public: - RenderBackend(QObject* parent = nullptr); - - virtual ~RenderBackend() override; - - void Close(); - - ViewerOutput* GetViewerNode() const - { - return viewer_node_; - } - - void SetViewerNode(ViewerOutput* viewer_node); - - void SetAutoCacheEnabled(bool e) - { - autocache_enabled_ = e; - } - - bool IsAutoCachePaused() const - { - return autocache_paused_; - } - - void SetAutoCachePaused(bool paused) - { - autocache_paused_ = paused; - - if (autocache_paused_) { - // Pause the autocache - ClearVideoQueue(); - } else { - // Unpause the cache - AutoCacheRequeueFrames(); - } - } - - void AutoCacheRange(const TimeRange& range); - - void AutoCacheRequeueFrames(); - - void SetAutoCachePlayhead(const rational& playhead) - { - autocache_range_ = TimeRange(playhead - Config::Current()["DiskCacheBehind"].value(), - playhead + Config::Current()["DiskCacheAhead"].value()); - - autocache_has_changed_ = true; - use_custom_autocache_range_ = false; - - AutoCacheRequeueFrames(); - } - - void SetRenderMode(RenderMode::Mode e) - { - render_mode_ = e; - } - - void SetPreviewGenerationEnabled(bool e) - { - generate_audio_previews_ = e; - } - - void ProcessUpdateQueue(); - - /** - * @brief Asynchronously generate a hash at a given time - */ - RenderTicketPtr Hash(const QVector ×, bool prioritize = false); - - /** - * @brief Asynchronously generate a frame at a given time - */ - RenderTicketPtr RenderFrame(const rational& time, bool prioritize = false, const QByteArray& hash = QByteArray()); - - /** - * @brief Asynchronously generate a chunk of audio - */ - RenderTicketPtr RenderAudio(const TimeRange& r, bool prioritize = false); - - const VideoParams& GetVideoParams() const - { - return video_params_; - } - - const AudioParams& GetAudioParams() const - { - return audio_params_; - } - - void SetVideoParams(const VideoParams& params); - - void SetAudioParams(const AudioParams& params); - - void SetForceDownloadResolution(bool e) - { - video_force_download_resolution_ = e; - } - - void SetVideoDownloadMatrix(const QMatrix4x4& mat) - { - video_download_matrix_ = mat; - } - - void IgnoreNextMouseButton(); - - static std::list SplitRangeIntoChunks(const TimeRange& r); - -public slots: - void NodeGraphChanged(NodeInput *source); - - void ClearVideoQueue(); - - void ClearAudioQueue(); - - void ClearQueue(); - -signals: - -protected: - virtual RenderWorker* CreateNewWorker() = 0; - -private: - void CopyNodeInputValue(NodeInput* input); - Node *CopyNodeConnections(Node *src_node); - void CopyNodeMakeConnection(NodeInput *src_input, NodeInput *dst_input); - - void ClearQueueOfType(RenderTicket::Type type); - - void SetHashes(FrameHashCache* cache, const QVector& times, const QVector& hashes, qint64 job_time); - - ViewerOutput* viewer_node_; - - // VIDEO MEMBERS - VideoParams video_params_; - bool video_force_download_resolution_; - QMatrix4x4 video_download_matrix_; - - // AUDIO MEMBERS - AudioParams audio_params_; - - QList graph_update_queue_; - QHash copy_map_; - ViewerOutput* copied_viewer_node_; - - std::list render_queue_; - - std::list running_tickets_; - - struct WorkerData { - RenderWorker* worker; - bool busy; - }; - - QVector workers_; - - bool autocache_enabled_; - bool autocache_paused_; - - bool generate_audio_previews_; - - RenderMode::Mode render_mode_; - - TimeRange autocache_range_; - - bool autocache_has_changed_; - - bool use_custom_autocache_range_; - TimeRange custom_autocache_range_; - - static QVector instances_; - static QMutex instance_lock_; - static RenderBackend* active_instance_; - static QThreadPool thread_pool_; - void SetActiveInstance(); - - QMap > autocache_hash_tasks_; - - QList*> autocache_hash_process_tasks_; - - QMap autocache_audio_tasks_; - - QMap autocache_video_tasks_; - - QMap*, QByteArray> autocache_video_download_tasks_; - - QVector autocache_currently_caching_hashes_; - - bool ignore_next_mouse_button_; - -private slots: - void WorkerFinished(); - - void RunNextJob(); - - void TicketFinished(); - - void WorkerGeneratedWaveform(OLIVE_NAMESPACE::RenderTicketPtr ticket, OLIVE_NAMESPACE::TrackOutput* track, OLIVE_NAMESPACE::AudioVisualWaveform samples, OLIVE_NAMESPACE::TimeRange range); - - void AutoCacheVideoInvalidated(const OLIVE_NAMESPACE::TimeRange &range); - - void AutoCacheAudioInvalidated(const OLIVE_NAMESPACE::TimeRange &range); - - void AutoCacheHashesGenerated(); - - void AutoCacheHashesProcessed(); - - void AutoCacheAudioRendered(); - - void AutoCacheVideoRendered(); - - void AutoCacheVideoDownloaded(); - - void QueuedInputRemoved(); - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // RENDERBACKEND_H diff --git a/app/render/backend/rendercontext.cpp b/app/render/backend/rendercontext.cpp new file mode 100644 index 000000000..a9a4ce73e --- /dev/null +++ b/app/render/backend/rendercontext.cpp @@ -0,0 +1,6 @@ +#include "rendercontext.h" + +RenderContext::RenderContext() +{ + +} diff --git a/app/render/backend/rendercontext.h b/app/render/backend/rendercontext.h new file mode 100644 index 000000000..fc443507e --- /dev/null +++ b/app/render/backend/rendercontext.h @@ -0,0 +1,11 @@ +#ifndef RENDERCONTEXT_H +#define RENDERCONTEXT_H + + +class RenderContext +{ +public: + RenderContext(); +}; + +#endif // RENDERCONTEXT_H diff --git a/app/render/backend/renderframebuffer.cpp b/app/render/backend/renderframebuffer.cpp new file mode 100644 index 000000000..dd03c9d59 --- /dev/null +++ b/app/render/backend/renderframebuffer.cpp @@ -0,0 +1,6 @@ +#include "renderframebuffer.h" + +RenderFrameBuffer::RenderFrameBuffer() +{ + +} diff --git a/app/render/backend/renderframebuffer.h b/app/render/backend/renderframebuffer.h new file mode 100644 index 000000000..b4b928826 --- /dev/null +++ b/app/render/backend/renderframebuffer.h @@ -0,0 +1,11 @@ +#ifndef RENDERFRAMEBUFFER_H +#define RENDERFRAMEBUFFER_H + + +class RenderFrameBuffer +{ +public: + RenderFrameBuffer(); +}; + +#endif // RENDERFRAMEBUFFER_H diff --git a/app/render/backend/rendershader.cpp b/app/render/backend/rendershader.cpp new file mode 100644 index 000000000..a90f3a1e3 --- /dev/null +++ b/app/render/backend/rendershader.cpp @@ -0,0 +1,6 @@ +#include "rendershader.h" + +RenderShader::RenderShader() +{ + +} diff --git a/app/render/backend/rendershader.h b/app/render/backend/rendershader.h new file mode 100644 index 000000000..63f5f97de --- /dev/null +++ b/app/render/backend/rendershader.h @@ -0,0 +1,11 @@ +#ifndef RENDERSHADER_H +#define RENDERSHADER_H + + +class RenderShader +{ +public: + RenderShader(); +}; + +#endif // RENDERSHADER_H diff --git a/app/render/backend/rendertexture.cpp b/app/render/backend/rendertexture.cpp new file mode 100644 index 000000000..0ba906451 --- /dev/null +++ b/app/render/backend/rendertexture.cpp @@ -0,0 +1,6 @@ +#include "rendertexture.h" + +RenderTexture::RenderTexture(RenderContext *ctx) +{ + +} diff --git a/app/render/backend/rendertexture.h b/app/render/backend/rendertexture.h new file mode 100644 index 000000000..462ad26b9 --- /dev/null +++ b/app/render/backend/rendertexture.h @@ -0,0 +1,12 @@ +#ifndef RENDERTEXTURE_H +#define RENDERTEXTURE_H + +#include "rendercontext.h" + +class RenderTexture +{ +public: + RenderTexture(RenderContext* ctx); +}; + +#endif // RENDERTEXTURE_H diff --git a/app/render/backend/renderworker.cpp b/app/render/backend/renderworker.cpp deleted file mode 100644 index 7c3e2bddd..000000000 --- a/app/render/backend/renderworker.cpp +++ /dev/null @@ -1,471 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "renderworker.h" - -#include -#include -#include - -#include "audio/audiovisualwaveform.h" -#include "common/functiontimer.h" -#include "config/config.h" -#include "node/block/clip/clip.h" -#include "task/conform/conform.h" - -OLIVE_NAMESPACE_ENTER - -// FIXME: Hardcoded value. It seems to work fine, but is there a possibility we should make -// this a dynamic value somehow or a configurable value? -const int RenderWorker::kMaxDecoderLife = 6000; - -RenderWorker::RenderWorker(RenderBackend* parent) : - parent_(parent), - video_force_download_resolution_(false), - available_(true), - generate_audio_previews_(false), - render_mode_(RenderMode::kOnline) -{ - cleanup_timer_ = new QTimer(); - cleanup_timer_->setInterval(kMaxDecoderLife); - connect(cleanup_timer_, &QTimer::timeout, this, &RenderWorker::ClearOldDecoders, Qt::DirectConnection); - cleanup_timer_->moveToThread(qApp->thread()); - QMetaObject::invokeMethod(cleanup_timer_, "start", Qt::QueuedConnection); -} - -RenderWorker::~RenderWorker() -{ - QMetaObject::invokeMethod(cleanup_timer_, "stop", Qt::QueuedConnection); - cleanup_timer_->deleteLater(); -} - -void RenderWorker::Hash(RenderTicketPtr ticket, ViewerOutput *viewer, const QVector ×) -{ - ticket_ = ticket; - - QVector hashes(times.size()); - - for (int i=0;itexture_input()->get_connected_node(), - video_params_, - times.at(i)); - } - - ticket->Finish(QVariant::fromValue(hashes)); - - emit FinishedJob(); -} - -QByteArray RenderWorker::HashNode(const Node *n, const VideoParams ¶ms, const rational &time) -{ - QCryptographicHash hasher(QCryptographicHash::Sha1); - - // Embed video parameters into this hash - hasher.addData(reinterpret_cast(¶ms.effective_width()), sizeof(int)); - hasher.addData(reinterpret_cast(¶ms.effective_height()), sizeof(int)); - hasher.addData(reinterpret_cast(¶ms.format()), sizeof(PixelFormat::Format)); - - if (n) { - n->Hash(hasher, time); - } - - return hasher.result(); -} - -void RenderWorker::ClearOldDecoders() -{ - QMutexLocker locker(&decoder_lock_); - - QHash::iterator i = decoder_age_.begin(); - - while (i != decoder_age_.end()) { - if (i.value() < QDateTime::currentMSecsSinceEpoch() - kMaxDecoderLife) { - // This decoder is old, remove it - decoder_cache_.remove(i.key()); - - i = decoder_age_.erase(i); - } else { - i++; - } - } -} - -void RenderWorker::RenderFrame(RenderTicketPtr ticket, ViewerOutput* viewer, const rational &time) -{ - ticket_ = ticket; - - NodeValueTable table = ProcessInput(viewer->texture_input(), - TimeRange(time, time + video_params_.time_base())); - - QVariant texture = table.Get(NodeParam::kTexture); - - PixelFormat::Format output_format; - if (!texture.isNull() && TextureHasAlpha(texture)) { - output_format = PixelFormat::GetFormatWithAlphaChannel(video_params_.format()); - } else { - output_format = PixelFormat::GetFormatWithoutAlphaChannel(video_params_.format()); - } - - FramePtr frame = Frame::Create(); - frame->set_timestamp(time); - - if (video_force_download_resolution_ || texture.isNull()) { - // If we're setting the resolution ourselves or we're zeroing it out, allocate the frame now - frame->set_video_params(VideoParams(video_params_.width(), - video_params_.height(), - video_params_.time_base(), - output_format, - video_params_.pixel_aspect_ratio(), - video_params_.interlacing(), - video_params_.divider())); - frame->allocate(); - } - - if (texture.isNull()) { - // Blank frame out - memset(frame->data(), 0, frame->allocated_size()); - } else { - // Dump texture contents to frame - TextureToFrame(texture, frame, video_download_matrix_); - } - - ticket->Finish(QVariant::fromValue(frame)); - - emit FinishedJob(); -} - -void RenderWorker::RenderAudio(RenderTicketPtr ticket, ViewerOutput* viewer, const TimeRange &range) -{ - ticket_ = ticket; - - NodeValueTable table = ProcessInput(viewer->samples_input(), range); - - QVariant samples = table.Get(NodeParam::kSamples); - - ticket->Finish(samples); - - emit FinishedJob(); -} - -void RenderWorker::ClearDecoders() -{ - decoder_cache_.clear(); -} - -NodeValueTable RenderWorker::GenerateBlockTable(const TrackOutput *track, const TimeRange &range) -{ - if (track->track_type() == Timeline::kTrackTypeAudio) { - - QList active_blocks = track->BlocksAtTimeRange(range); - - // All these blocks will need to output to a buffer so we create one here - SampleBufferPtr block_range_buffer = SampleBuffer::CreateAllocated(audio_params_, - audio_params_.time_to_samples(range.length())); - block_range_buffer->fill(0); - - NodeValueTable merged_table; - - // Loop through active blocks retrieving their audio - foreach (Block* b, active_blocks) { - TimeRange range_for_block(qMax(b->in(), range.in()), - qMin(b->out(), range.out())); - - int destination_offset = audio_params_.time_to_samples(range_for_block.in() - range.in()); - int max_dest_sz = audio_params_.time_to_samples(range_for_block.length()); - - // Destination buffer - NodeValueTable table = GenerateTable(b, range_for_block); - SampleBufferPtr samples_from_this_block = table.Take(NodeParam::kSamples).value(); - - if (!samples_from_this_block) { - // If we retrieved no samples from this block, do nothing - continue; - } - - // FIXME: Doesn't handle reversing - if (b->speed_input()->is_keyframing() || b->speed_input()->is_connected()) { - // FIXME: We'll need to calculate the speed hoo boy - } else { - double speed_value = b->speed_input()->get_standard_value().toDouble(); - - if (qIsNull(speed_value)) { - // Just silence, don't think there's any other practical application of 0 speed audio - samples_from_this_block->fill(0); - } else if (!qFuzzyCompare(speed_value, 1.0)) { - // Multiply time - samples_from_this_block->speed(speed_value); - } - } - - int copy_length = qMin(max_dest_sz, samples_from_this_block->sample_count()); - - // Copy samples into destination buffer - block_range_buffer->set(samples_from_this_block->const_data(), destination_offset, copy_length); - - NodeValueTable::Merge({merged_table, table}); - } - - if (generate_audio_previews_) { - // Find original track object - TrackOutput* original_track = nullptr; - - // Have to do a manual loop since our track is const and QHash won't take it - QHash::const_iterator i; - for (i=copy_map_->constBegin(); i!=copy_map_->constEnd(); i++) { - if (i.value() == track) { - original_track = static_cast(i.key()); - break; - } - } - - if (original_track) { - // Generate a visual waveform and send it back to the main thread - AudioVisualWaveform visual_waveform; - visual_waveform.set_channel_count(audio_params_.channel_count()); - visual_waveform.OverwriteSamples(block_range_buffer, audio_params_.sample_rate()); - - emit WaveformGenerated(ticket_, original_track, visual_waveform, range); - } - } - - merged_table.Push(NodeParam::kSamples, QVariant::fromValue(block_range_buffer), track); - - return merged_table; - - } else { - return NodeTraverser::GenerateBlockTable(track, range); - } -} - -QVariant RenderWorker::ProcessSamples(const Node *node, const TimeRange &range, const SampleJob& job) -{ - if (!job.samples() || !job.samples()->is_allocated()) { - return QVariant(); - } - - SampleBufferPtr output_buffer = SampleBuffer::CreateAllocated(job.samples()->audio_params(), job.samples()->sample_count()); - NodeValueDatabase value_db; - - for (int i=0;isample_count();i++) { - // Calculate the exact rational time at this sample - double sample_to_second = static_cast(i) / static_cast(audio_params_.sample_rate()); - - rational this_sample_time = rational::fromDouble(range.in().toDouble() + sample_to_second); - - // Update all non-sample and non-footage inputs - NodeValueMap::const_iterator j; - for (j=job.GetValues().constBegin(); j!=job.GetValues().constEnd(); j++) { - NodeValueTable value; - NodeInput* corresponding_input = node->GetInputWithID(j.key()); - - if (corresponding_input) { - value = ProcessInput(corresponding_input, TimeRange(this_sample_time, this_sample_time)); - } else { - value.Push(j.value()); - } - - value_db.Insert(j.key(), value); - } - - AddGlobalsToDatabase(value_db, TimeRange(this_sample_time, this_sample_time)); - - node->ProcessSamples(value_db, - job.samples(), - output_buffer, - i); - } - - return QVariant::fromValue(output_buffer); -} - -QVariant RenderWorker::ProcessFrameGeneration(const Node* node, const GenerateJob &job) -{ - FramePtr frame = Frame::Create(); - - PixelFormat::Format output_fmt; - if (job.GetAlphaChannelRequired()) { - output_fmt = PixelFormat::GetFormatWithAlphaChannel(video_params_.format()); - } else { - output_fmt = PixelFormat::GetFormatWithoutAlphaChannel(video_params_.format()); - } - - frame->set_video_params(VideoParams(video_params_.width(), - video_params_.height(), - video_params_.time_base(), - output_fmt, - video_params_.pixel_aspect_ratio(), - video_params_.interlacing(), - video_params_.divider())); - frame->allocate(); - - node->GenerateFrame(frame, job); - - return CachedFrameToTexture(frame); -} - -QVariant RenderWorker::GetCachedFrame(const Node* node, const rational& time) -{ - if (render_mode_ == RenderMode::kOffline - && !cache_path_.isEmpty() - && node->id() == QStringLiteral("org.olivevideoeditor.Olive.videoinput")) { - QByteArray hash = HashNode(node, video_params(), time); - - FramePtr f = FrameHashCache::LoadCacheFrame(cache_path_, hash); - - if (f) { - // The cached frame won't load with the correct divider by default, so we enforce it here - f->set_video_params(VideoParams(f->width() * video_params_.divider(), - f->height() * video_params_.divider(), - f->video_params().time_base(), - f->video_params().format(), - f->video_params().pixel_aspect_ratio(), - f->video_params().interlacing(), - video_params_.divider())); - - return CachedFrameToTexture(f); - } - } - - return QVariant(); -} - -DecoderPtr RenderWorker::ResolveDecoderFromInput(StreamPtr stream) -{ - // Access a map of Node inputs and decoder instances and retrieve a frame! - QMutexLocker locker(&decoder_lock_); - - DecoderPtr decoder = decoder_cache_.value(stream.get()); - - if (!decoder && stream) { - // Create a new Decoder here - decoder = Decoder::CreateFromID(stream->footage()->decoder()); - decoder->set_stream(stream); - - if (decoder->Open()) { - decoder_cache_.insert(stream.get(), decoder); - } else { - decoder = nullptr; - qWarning() << "Failed to open decoder for" << stream->footage()->filename() - << "::" << stream->index(); - } - } - - decoder_age_.insert(stream.get(), QDateTime::currentMSecsSinceEpoch()); - - return decoder; -} - -QVariant RenderWorker::ProcessVideoFootage(StreamPtr stream, const rational &input_time) -{ - VideoStreamPtr video_stream = std::static_pointer_cast(stream); - rational time_match = (video_stream->video_type() == VideoStream::kVideoTypeStill) ? 0 : input_time; - QString colorspace_match = video_stream->get_colorspace_match_string(); - - QVariant value; - bool found_cache = false; - - if (still_image_cache_.contains(stream.get())) { - const CachedStill& cs = still_image_cache_[stream.get()]; - - if (cs.colorspace == colorspace_match - && cs.alpha_is_associated == video_stream->premultiplied_alpha() - && cs.divider == video_params_.divider() - && cs.time == time_match) { - value = cs.texture; - found_cache = true; - } else { - still_image_cache_.remove(stream.get()); - } - } - - if (!found_cache) { - - DecoderPtr decoder = ResolveDecoderFromInput(stream); - - if (decoder) { - FramePtr frame = decoder->RetrieveVideo(input_time, - video_params().divider()); - - if (frame) { - // Return a texture from the derived class - value = FootageFrameToTexture(stream, frame); - - if (!value.isNull()) { - // Put this into the image cache instead - still_image_cache_.insert(stream.get(), {value, - colorspace_match, - video_stream->premultiplied_alpha(), - video_params_.divider(), - time_match}); - } - } - } - - } - - return value; -} - -QVariant RenderWorker::ProcessAudioFootage(StreamPtr stream, const TimeRange &input_time) -{ - QVariant value; - - DecoderPtr decoder = ResolveDecoderFromInput(stream); - - if (decoder) { - // See if we have a conformed version of this audio - if (!decoder->HasConformedVersion(audio_params())) { - - // If not, the audio needs to be conformed - // For online rendering/export, it's a waste of time to render the audio until we have - // all we need, so we try to handle the conform ourselves - AudioStreamPtr as = std::static_pointer_cast(stream); - - // Check if any other threads are conforming this audio - if (as->try_start_conforming(audio_params())) { - - // If not, conform it ourselves - decoder->ConformAudio(&IsCancelled(), audio_params()); - - } else { - - // If another thread is conforming already, hackily try to wait until it's done. - do { - QThread::msleep(1000); - } while (!as->has_conformed_version(audio_params()) && !IsCancelled()); - - } - - } - - if (decoder->HasConformedVersion(audio_params())) { - SampleBufferPtr frame = decoder->RetrieveAudio(input_time.in(), input_time.length(), - audio_params()); - - if (frame) { - value = QVariant::fromValue(frame); - } - } - } - - return value; -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/renderworker.h b/app/render/backend/renderworker.h deleted file mode 100644 index 84f9fbe94..000000000 --- a/app/render/backend/renderworker.h +++ /dev/null @@ -1,208 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef RENDERWORKER_H -#define RENDERWORKER_H - -#include - -#include "decodercache.h" -#include "node/traverser.h" -#include "node/output/viewer/viewer.h" -#include "renderticket.h" - -OLIVE_NAMESPACE_ENTER - -class RenderBackend; - -class RenderWorker : public QObject, public NodeTraverser -{ - Q_OBJECT -public: - RenderWorker(RenderBackend* parent); - - virtual ~RenderWorker() override; - - bool IsAvailable() const - { - return available_; - } - - void SetAvailable(bool a) - { - available_ = a; - } - - void SetVideoParams(const VideoParams& params) - { - video_params_ = params; - } - - void SetAudioParams(const AudioParams& params) - { - audio_params_ = params; - } - - void SetForceDownloadResolution(bool e) - { - video_force_download_resolution_ = e; - } - - void SetVideoDownloadMatrix(const QMatrix4x4& mat) - { - video_download_matrix_ = mat; - } - - void SetCopyMap(QHash* copy_map) - { - copy_map_ = copy_map; - } - - void SetRenderMode(const RenderMode::Mode& mode) - { - render_mode_ = mode; - } - - void SetPreviewGenerationEnabled(bool e) - { - generate_audio_previews_ = e; - } - - void SetCachePath(const QString& s) - { - cache_path_ = s; - } - - void Hash(RenderTicketPtr ticket, ViewerOutput* viewer, const QVector& times); - - /** - * @brief Render the frame at this time - * - * Produces a fully rendered frame from the connected viewer at this time. - * - * @return - * - * A frame corresponding to the set video parameters. If no nodes are active at the time, this - * function will still return a blank frame with the same parameters. If no viewer node is set, - * nullptr is returned. - */ - void RenderFrame(RenderTicketPtr ticket, ViewerOutput* viewer, const rational &time); - - void RenderAudio(RenderTicketPtr ticket, ViewerOutput* viewer, const TimeRange& range); - - void ClearDecoders(); - -protected: - virtual void TextureToFrame(const QVariant& texture, FramePtr frame, const QMatrix4x4 &mat) const = 0; - - virtual QVariant FootageFrameToTexture(StreamPtr stream, FramePtr frame) const = 0; - - virtual QVariant CachedFrameToTexture(FramePtr frame) const = 0; - - virtual NodeValueTable GenerateBlockTable(const TrackOutput *track, const TimeRange &range) override; - - virtual QVariant ProcessVideoFootage(StreamPtr stream, const rational &input_time) override; - - virtual QVariant ProcessAudioFootage(StreamPtr stream, const TimeRange &input_time) override; - - virtual QVariant ProcessSamples(const Node *node, const TimeRange &range, const SampleJob &job) override; - - virtual QVariant ProcessFrameGeneration(const Node *node, const GenerateJob& job) override; - - virtual QVariant GetCachedFrame(const Node *node, const rational &time) override; - - virtual bool TextureHasAlpha(const QVariant& v) const = 0; - - const VideoParams& video_params() const - { - return video_params_; - } - - const AudioParams& audio_params() const - { - return audio_params_; - } - - const RenderMode::Mode& render_mode() const - { - return render_mode_; - } - -signals: - void AudioConformUnavailable(StreamPtr stream, TimeRange range, - rational stream_time, AudioParams params); - - void FinishedJob(); - - void WaveformGenerated(OLIVE_NAMESPACE::RenderTicketPtr ticket, OLIVE_NAMESPACE::TrackOutput* track, OLIVE_NAMESPACE::AudioVisualWaveform samples, OLIVE_NAMESPACE::TimeRange range); - -private: - DecoderPtr ResolveDecoderFromInput(StreamPtr stream); - - static QByteArray HashNode(const Node* n, const VideoParams& params, const rational& time); - - RenderBackend* parent_; - - RenderTicketPtr ticket_; - - VideoParams video_params_; - - AudioParams audio_params_; - - struct CachedStill { - QVariant texture; - QString colorspace; - bool alpha_is_associated; - int divider; - rational time; - }; - - QHash still_image_cache_; - - bool video_force_download_resolution_; - QMatrix4x4 video_download_matrix_; - - QMutex decoder_lock_; - DecoderCache decoder_cache_; - QHash decoder_age_; - - TimeRange audio_render_time_; - bool available_; - - bool generate_audio_previews_; - - QHash* copy_map_; - - RenderMode::Mode render_mode_; - - QTimer* cleanup_timer_; - - QString cache_path_; - - static const int kMaxDecoderLife; - -private slots: - void ClearOldDecoders(); - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // RENDERWORKER_H diff --git a/app/render/backend/colorprocessorcache.h b/app/render/colorprocessorcache.h similarity index 100% rename from app/render/backend/colorprocessorcache.h rename to app/render/colorprocessorcache.h diff --git a/app/render/backend/decodercache.h b/app/render/decodercache.h similarity index 100% rename from app/render/backend/decodercache.h rename to app/render/decodercache.h diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp new file mode 100644 index 000000000..8658ba48a --- /dev/null +++ b/app/render/previewautocacher.cpp @@ -0,0 +1,695 @@ +#include "previewautocacher.h" + +#include +#include + +#include "render/rendermanager.h" + +OLIVE_NAMESPACE_ENTER + +PreviewAutoCacher::PreviewAutoCacher() : + viewer_node_(nullptr), + paused_(false), + has_changed_(false), + use_custom_range_(false), + last_update_time_(0), + ignore_next_mouse_button_(false), + video_params_changed_(false), + audio_params_changed_(false) +{ + // Set default autocache range + SetPlayhead(rational()); +} + +RenderTicketPtr PreviewAutoCacher::GetSingleFrame(const rational &t) +{ + RenderTicketPtr ticket = std::make_shared(); + + ticket->setProperty("time", QVariant::fromValue(t)); + + TryRender(); + + return ticket; +} + +void PreviewAutoCacher::SetPaused(bool paused) +{ + paused_ = paused; + + if (paused_) { + // Pause the autocache + ClearVideoQueue(); + } else { + // Unpause the cache + RequeueFrames(); + } +} + +void PreviewAutoCacher::NodeGraphChanged(NodeInput *source) +{ + // We need to determine: + // - If we don't have this input, assume that it's coming soon and ignore it + // - If we do, is this input a child of another input we're already copying? + // - Or are any of the queued inputs children of this one? + + // First we need to find our copy of the input being queued + Node* our_copy_node = copy_map_.value(source->parentNode()); + + // If we don't have this node yet, assume it's coming in a later copy in which case it'll be + // copied then + if (!our_copy_node) { + // Assert that there are updates coming + Q_ASSERT(!graph_update_queue_.isEmpty()); + return; + } + + // If we're here, we must have this node. Determine if we're already copying a "parent" of this + for (int i=0; iIsArray() && static_cast(source)->sub_params().contains(queued_input)) + || queued_input->parentNode()->OutputsTo(source, true, true)) { + // In which case, we don't need to queue it and can queue our own + graph_update_queue_.removeAt(i); + disconnect(queued_input, &NodeInput::destroyed, this, &PreviewAutoCacher::QueuedInputRemoved); + i--; + } + + // Check if the source is a member of this array, in which case it'll be copied eventually anyway + if (queued_input->IsArray() + && static_cast(queued_input)->sub_params().contains(source)) { + return; + } + + // Check if this dependency graph is already queued + if (source->parentNode()->OutputsTo(queued_input, true, true)) { + // In which case, no further copy is necessary + return; + } + } + + graph_update_queue_.append(source); + connect(source, &NodeInput::destroyed, this, &PreviewAutoCacher::QueuedInputRemoved); +} + +void PreviewAutoCacher::GenerateHashes(ViewerOutput *viewer, const QVector ×, qint64 job_time) +{ + std::vector existing_hashes; + + foreach (const rational& time, times) { + // See if hash already exists in disk cache + QByteArray hash = RenderManager::Hash(viewer, viewer->video_params(), time); + + // Check memory list since disk checking is slow + bool hash_exists = (std::find(existing_hashes.begin(), existing_hashes.end(), hash) != existing_hashes.end()); + + if (!hash_exists) { + hash_exists = QFileInfo::exists(viewer->video_frame_cache()->CachePathName(hash)); + + if (hash_exists) { + existing_hashes.push_back(hash); + } + } + + // Set hash in FrameHashCache's thread rather than in ours to prevent race conditions + QMetaObject::invokeMethod(viewer->video_frame_cache(), "SetHash", Qt::QueuedConnection, + OLIVE_NS_ARG(rational, time), + Q_ARG(QByteArray, hash), + Q_ARG(qint64, job_time), + Q_ARG(bool, hash_exists)); + } +} + +void PreviewAutoCacher::VideoInvalidated(const TimeRange &range) +{ + qDebug() << "Video invalidated"; + + ClearQueue(false); + + // Hash these frames since that should be relatively quick. + if (ignore_next_mouse_button_ || !(qApp->mouseButtons() & Qt::LeftButton)) { + ignore_next_mouse_button_ = false; + + invalidated_video_.InsertTimeRange(range); + + TryRender(); + } +} + +void PreviewAutoCacher::AudioInvalidated(const TimeRange &range) +{ + ClearQueue(false); + + // Start jobs to re-render the audio at this range, split into 2 second chunks + invalidated_audio_.InsertTimeRange(range); + + TryRender(); +} + +void PreviewAutoCacher::HashesProcessed() +{ + QFutureWatcher* watcher = static_cast*>(sender()); + + if (hash_tasks_.contains(watcher)) { + hash_tasks_.removeOne(watcher); + + RequeueFrames(); + } + + delete watcher; +} + +void PreviewAutoCacher::AudioRendered() +{ + RenderTicketWatcher* watcher = static_cast(sender()); + + if (audio_tasks_.contains(watcher)) { + if (!watcher->WasCancelled()) { + viewer_node_->audio_playback_cache()->WritePCM(audio_tasks_.value(watcher), + watcher->Get().value(), + watcher->GetTicket()->GetJobTime()); + } + + audio_tasks_.remove(watcher); + } + + delete watcher; +} + +void PreviewAutoCacher::VideoRendered() +{ + RenderTicketWatcher* watcher = static_cast(sender()); + + if (video_tasks_.contains(watcher)) { + if (watcher->WasCancelled()) { + // We didn't get this hash + currently_caching_hashes_.removeOne(watcher->property("hash").toByteArray()); + } else { + const QByteArray& hash = video_tasks_.value(watcher); + + // Download frame in another thread + QFutureWatcher* w = new QFutureWatcher(); + video_download_tasks_.insert(w, hash); + connect(w, &QFutureWatcher::finished, this, &PreviewAutoCacher::VideoDownloaded); + w->setFuture(QtConcurrent::run(viewer_node_->video_frame_cache(), + &FrameHashCache::SaveCacheFrame, + hash, + watcher->Get().value())); + } + + video_tasks_.remove(watcher); + } + + delete watcher; +} + +void PreviewAutoCacher::VideoDownloaded() +{ + QFutureWatcher* watcher = static_cast*>(sender()); + + if (video_download_tasks_.contains(watcher)) { + if (!watcher->isCanceled()) { + if (watcher->result()) { + const QByteArray& hash = video_download_tasks_.value(watcher); + + currently_caching_hashes_.removeOne(hash); + + viewer_node_->video_frame_cache()->ValidateFramesWithHash(hash); + } else { + qCritical() << "Failed to download video frame"; + } + } + + video_download_tasks_.remove(watcher); + } + + delete watcher; +} + +void PreviewAutoCacher::QueuedInputRemoved() +{ + NodeInput* i = static_cast(sender()); + disconnect(i, &NodeInput::destroyed, this, &PreviewAutoCacher::QueuedInputRemoved); + graph_update_queue_.removeOne(i); +} + +void PreviewAutoCacher::VideoParamsChanged() +{ + // In case the user is pressing the mouse at this exact moment + IgnoreNextMouseButton(); + + ClearVideoQueue(); + video_params_changed_ = true; + TryRender(); +} + +void PreviewAutoCacher::AudioParamsChanged() +{ + ClearAudioQueue(); + audio_params_changed_ = true; + TryRender(); +} + +//#define PRINT_UPDATE_QUEUE_INFO +void PreviewAutoCacher::ProcessUpdateQueue() +{ +#ifdef PRINT_UPDATE_QUEUE_INFO + qint64 t = QDateTime::currentMSecsSinceEpoch(); + qDebug() << "Processing update queue of" << graph_update_queue_.size() << "elements:"; +#endif + + while (!graph_update_queue_.isEmpty()) { + NodeInput* i = graph_update_queue_.takeFirst(); +#ifdef PRINT_UPDATE_QUEUE_INFO + qDebug() << " " << i->parentNode()->id() << i->id(); +#endif + disconnect(i, &NodeInput::destroyed, this, &PreviewAutoCacher::QueuedInputRemoved); + + CopyNodeInputValue(i); + } + +#ifdef PRINT_UPDATE_QUEUE_INFO + qDebug() << "Update queue took:" << (QDateTime::currentMSecsSinceEpoch() - t); +#endif +} + +bool PreviewAutoCacher::HasActiveJobs() const +{ + return !hash_tasks_.isEmpty() + || !audio_tasks_.isEmpty() + || !video_tasks_.isEmpty() + || !video_download_tasks_.isEmpty(); +} + +void PreviewAutoCacher::SetPlayhead(const rational &playhead) +{ + cache_range_ = TimeRange(playhead - Config::Current()["DiskCacheBehind"].value(), + playhead + Config::Current()["DiskCacheAhead"].value()); + + has_changed_ = true; + use_custom_range_ = false; + + RequeueFrames(); +} + +void PreviewAutoCacher::ClearQueue(bool wait) +{ + ClearHashQueue(wait); + ClearVideoQueue(wait); + ClearAudioQueue(wait); +} + +void PreviewAutoCacher::ClearHashQueue(bool wait) +{ + auto copy = hash_tasks_; + + for (auto it=copy.cbegin(); it!=copy.cend(); it++) { + (*it)->cancel(); + } + if (wait) { + for (auto it=copy.cbegin(); it!=copy.cend(); it++) { + (*it)->waitForFinished(); + } + } +} + +void PreviewAutoCacher::ClearVideoQueue(bool wait) +{ + // Copy because tasks that cancel immediately will be automatically removed from the list + auto copy = video_tasks_; + + for (auto it=copy.cbegin(); it!=copy.cend(); it++) { + it.key()->Cancel(); + } + if (wait) { + for (auto it=copy.cbegin(); it!=copy.cend(); it++) { + it.key()->WaitForFinished(); + } + } + + has_changed_ = true; + use_custom_range_ = false; +} + +void PreviewAutoCacher::ClearAudioQueue(bool wait) +{ + // Create a copy because otherwise + auto copy = audio_tasks_; + + for (auto it=copy.cbegin(); it!=copy.cend(); it++) { + it.key()->Cancel(); + } + if (wait) { + for (auto it=copy.cbegin(); it!=copy.cend(); it++) { + it.key()->WaitForFinished(); + } + } +} + +void PreviewAutoCacher::CopyNodeInputValue(NodeInput *input) +{ + // Find our copy of this parameter + Node* our_copy_node = copy_map_.value(input->parentNode()); + Q_ASSERT(our_copy_node); + NodeInput* our_copy = our_copy_node->GetInputWithID(input->id()); + + // Copy the standard/keyframe values between these two inputs + NodeInput::CopyValues(input, + our_copy, + false, + false); + + // Handle connections + if (input->is_connected() || our_copy->is_connected()) { + // If one of the inputs is connected, it's likely this change came from connecting or + // disconnecting whatever was connected to it + + // We start by removing all old dependencies from the map + QList old_deps = our_copy->GetExclusiveDependencies(); + foreach (Node* i, old_deps) { + copy_map_.take(copy_map_.key(i))->deleteLater(); + } + + // And clear any other edges + while (!our_copy->edges().isEmpty()) { + NodeParam::DisconnectEdge(our_copy->edges().first()); + } + + // Then we copy all node dependencies and connections (if there are any) + CopyNodeMakeConnection(input, our_copy); + } + + // Call on sub-elements too + if (input->IsArray()) { + foreach (NodeInput* i, static_cast(input)->sub_params()) { + CopyNodeInputValue(i); + } + } +} + +Node* PreviewAutoCacher::CopyNodeConnections(Node* src_node) +{ + // Check if this node is already in the map + Node* dst_node = copy_map_.value(src_node); + + // If not, create it now + if (!dst_node) { + dst_node = src_node->copy(); + + if (dst_node->IsTrack()) { + // Hack that ensures the track type is set since we don't bother copying the whole timeline + static_cast(dst_node)->set_track_type(static_cast(src_node)->track_type()); + } + + copy_map_.insert(src_node, dst_node); + } + + // Make sure its values are copied + Node::CopyInputs(src_node, dst_node, false); + + // Copy all connections + QList src_node_inputs = src_node->GetInputsIncludingArrays(); + QList dst_node_inputs = dst_node->GetInputsIncludingArrays(); + + for (int i=0;iis_connected()) { + Node* dst_node = CopyNodeConnections(src_input->get_connected_node()); + + NodeOutput* corresponding_output = dst_node->GetOutputWithID(src_input->get_connected_output()->id()); + + NodeParam::ConnectEdge(corresponding_output, + dst_input); + } +} + +void PreviewAutoCacher::TryRender() +{ + if (!graph_update_queue_.isEmpty()) { + if (HasActiveJobs()) { + // Still waiting for jobs to finish + return; + } + + // No jobs are active, we can process the update queue + last_update_time_ = QDateTime::currentMSecsSinceEpoch(); + + ProcessUpdateQueue(); + + if (video_params_changed_) { + copied_viewer_node_->set_video_params(viewer_node_->video_params()); + video_params_changed_ = false; + } + + if (audio_params_changed_) { + copied_viewer_node_->set_audio_params(viewer_node_->audio_params()); + audio_params_changed_ = false; + } + } + + // If we're here, we must be able to render + if (!invalidated_video_.isEmpty()) { + QVector frames = viewer_node_->video_frame_cache()->GetFrameListFromTimeRange(invalidated_video_); + + QFutureWatcher* watcher = new QFutureWatcher(); + hash_tasks_.append(watcher); + connect(watcher, &QFutureWatcher::finished, this, &PreviewAutoCacher::HashesProcessed); + watcher->setFuture(QtConcurrent::run(&PreviewAutoCacher::GenerateHashes, + copied_viewer_node_, + frames, + last_update_time_)); + + invalidated_video_.clear(); + } + + if (!invalidated_audio_.isEmpty()) { + foreach (const TimeRange& range, invalidated_audio_) { + std::list chunks = range.Split(2); + + foreach (const TimeRange& r, chunks) { + RenderTicketWatcher* watcher = new RenderTicketWatcher(); + connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::AudioRendered); + audio_tasks_.insert(watcher, r); + watcher->SetTicket(RenderManager::instance()->RenderAudio(copied_viewer_node_, r, true)); + } + } + + invalidated_audio_.clear(); + } + + if (!single_frame_renders_.isEmpty()) { + foreach (RenderTicketPtr ticket, single_frame_renders_) { + RenderTicketWatcher* watcher = new RenderTicketWatcher(); + + watcher->setProperty("passthrough", QVariant::fromValue(ticket)); + + connect(watcher, &RenderTicketWatcher::Finished, watcher, [watcher]{ + RenderTicketPtr passthrough = watcher->property("passthrough").value(); + passthrough->Finish(watcher->GetTicket()->Get(), watcher->GetTicket()->WasCancelled()); + watcher->deleteLater(); + }); + + watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, + ticket->property("time").value(), + RenderMode::kOffline, true)); + } + single_frame_renders_.clear(); + } +} + +void PreviewAutoCacher::RequeueFrames() +{ + if (viewer_node_ + && viewer_node_->video_frame_cache()->HasInvalidatedRanges() + && hash_tasks_.isEmpty() + && has_changed_ + && (!paused_ || use_custom_range_)) { + TimeRange using_range; + + if (use_custom_range_) { + using_range = custom_autocache_range_; + use_custom_range_ = false; + } else { + using_range = cache_range_; + } + + QVector invalidated_ranges = viewer_node_->video_frame_cache()->GetInvalidatedFrames(using_range); + + ClearVideoQueue(); + + foreach (const rational& t, invalidated_ranges) { + const QByteArray& hash = viewer_node_->video_frame_cache()->GetHash(t); + + if (t >= using_range.in() + && t < using_range.out() + && !currently_caching_hashes_.contains(hash)) { + // Don't render any hash more than once + currently_caching_hashes_.append(hash); + + RenderTicketWatcher* watcher = new RenderTicketWatcher(); + watcher->setProperty("hash", hash); + connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::VideoRendered); + video_tasks_.insert(watcher, hash); + watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, t, RenderMode::kOffline, false)); + } + } + + has_changed_ = false; + } +} + +void PreviewAutoCacher::IgnoreNextMouseButton() +{ + ignore_next_mouse_button_ = true; +} + +void PreviewAutoCacher::ForceCacheRange(const TimeRange &range) +{ + has_changed_ = true; + use_custom_range_ = true; + custom_autocache_range_ = range; + + RequeueFrames(); +} + +void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) +{ + if (viewer_node_ == viewer_node) { + return; + } + + if (viewer_node_) { + // Cancel any remaining tickets and wait for them to finish + ClearQueue(true); + + // Clear autocache lists + { + // We need to wait for these since they work directly on the FrameHashCache. Most of the time + // this is fine, but not if the FrameHashCache gets deleted after this function. + ClearHashQueue(true); + + // This can be cleared normally (frames will be discarded and need to be rendered again) + ClearVideoQueue(false); + + // This can be cleared normally (PCM data will be discarded and need to be rendered again) + ClearAudioQueue(false); + + // We'll need to wait for these since they work directly on the FrameHashCache. Frames will + // be in the cache for later use. + { + QMap*, QByteArray>::const_iterator i; + for (i=video_download_tasks_.constBegin(); i!=video_download_tasks_.constEnd(); i++) { + i.key()->waitForFinished(); + } + video_download_tasks_.clear(); + } + + // No longer caching any hashes + currently_caching_hashes_.clear(); + } + + // Delete all of our copied nodes + foreach (Node* c, copy_map_) { + delete c; + } + copy_map_.clear(); + copied_viewer_node_ = nullptr; + graph_update_queue_.clear(); + + video_params_changed_ = false; + audio_params_changed_ = false; + + // Disconnect signal (will be a no-op if the signal was never connected) + disconnect(viewer_node_, + &ViewerOutput::GraphChangedFrom, + this, + &PreviewAutoCacher::NodeGraphChanged); + + disconnect(viewer_node_, + &ViewerOutput::VideoParamsChanged, + this, + &PreviewAutoCacher::VideoParamsChanged); + + disconnect(viewer_node_, + &ViewerOutput::AudioParamsChanged, + this, + &PreviewAutoCacher::AudioParamsChanged); + + disconnect(viewer_node_->video_frame_cache(), + &PlaybackCache::Invalidated, + this, + &PreviewAutoCacher::VideoInvalidated); + + disconnect(viewer_node_->audio_playback_cache(), + &PlaybackCache::Invalidated, + this, + &PreviewAutoCacher::AudioInvalidated); + } + + viewer_node_ = viewer_node; + + if (viewer_node_) { + // Copy graph + copied_viewer_node_ = static_cast(viewer_node_->copy()); + copy_map_.insert(viewer_node_, copied_viewer_node_); + + // Copy parameters + copied_viewer_node_->set_video_params(viewer_node_->video_params()); + copied_viewer_node_->set_audio_params(viewer_node_->audio_params()); + + // We begin an operation and never end it which prevents the copy from unnecessarily + // invalidating its own cache + copied_viewer_node_->BeginOperation(); + + NodeGraphChanged(viewer_node_->texture_input()); + NodeGraphChanged(viewer_node_->samples_input()); + ProcessUpdateQueue(); + + invalidated_video_ = viewer_node_->video_frame_cache()->GetInvalidatedRanges(); + invalidated_audio_ = viewer_node_->audio_playback_cache()->GetInvalidatedRanges(); + + connect(viewer_node_, + &ViewerOutput::GraphChangedFrom, + this, + &PreviewAutoCacher::NodeGraphChanged); + + connect(viewer_node_, + &ViewerOutput::VideoParamsChanged, + this, + &PreviewAutoCacher::VideoParamsChanged); + + connect(viewer_node_, + &ViewerOutput::AudioParamsChanged, + this, + &PreviewAutoCacher::AudioParamsChanged); + + connect(viewer_node_->video_frame_cache(), + &PlaybackCache::Invalidated, + this, + &PreviewAutoCacher::VideoInvalidated); + + connect(viewer_node_->audio_playback_cache(), + &PlaybackCache::Invalidated, + this, + &PreviewAutoCacher::AudioInvalidated); + + TryRender(); + } +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h new file mode 100644 index 000000000..bd897bc69 --- /dev/null +++ b/app/render/previewautocacher.h @@ -0,0 +1,198 @@ +#ifndef AUTOCACHER_H +#define AUTOCACHER_H + +#include + +#include "config/config.h" +#include "node/node.h" +#include "node/output/viewer/viewer.h" +#include "threading/threadticketwatcher.h" + +OLIVE_NAMESPACE_ENTER + +/** + * @brief Manager for dynamically caching a sequence in the background + * + * Intended to be used with a Viewer to dynamically cache parts of a sequence based on the playhead. + */ +class PreviewAutoCacher : public QObject +{ + Q_OBJECT +public: + PreviewAutoCacher(); + + RenderTicketPtr GetSingleFrame(const rational& t); + + /** + * @brief Set the viewer node to auto-cache + */ + void SetViewerNode(ViewerOutput *viewer_node); + + /** + * @brief If the mouse is held during the next cache invalidation, cache anyway + * + * By default, PreviewAutoCacher ignores invalidations that occur while the mouse is held down, + * assuming that if the mouse is held, the user is dragging something. If you know the mouse will + * be held during a certain action and want PreviewAutoCacher to cache anyway, call this before + * the cache invalidates. + */ + void IgnoreNextMouseButton(); + + /** + * @brief Returns whether the auto-cache is currently paused or not + */ + bool IsPaused() const + { + return paused_; + } + + /** + * @brief Sets whether the auto-cache is currently paused or not + * @param paused + * + * If TRUE, the cache queue is cleared (any frames currently being rendered will be processed as + * normal however). If FALSE, any uncached frames in the range will automatically be queued. + */ + void SetPaused(bool paused); + + /** + * @brief Force a certain range to be cached + * + * Usually, PreviewAutoCacher caches a user-defined range around the playhead, however there are + * times they may want certain non-playhead-related time ranges to be cached (i.e. entire sequence + * or in/out range), so that can be set here. + */ + void ForceCacheRange(const TimeRange& range); + + /** + * @brief Updates the range of frames to auto-cache + */ + void SetPlayhead(const rational& playhead); + + /** + * @brief Clears queue of running jobs + * + * Any jobs that haven't run yet are cancelled and will never run. Any jobs that are currently + * running are cancelled, but may not be finished by the time this function returns. If the + * jobs must be finished by the time this function returns, set `wait` to TRUE. + */ + void ClearQueue(bool wait = false); + + void ClearHashQueue(bool wait = false); + void ClearVideoQueue(bool wait = false); + void ClearAudioQueue(bool wait = false); + +public slots: + /** + * @brief Main handler for when the NodeGraph changes + */ + void NodeGraphChanged(NodeInput *source); + +private: + static void GenerateHashes(ViewerOutput* viewer, const QVector& times, qint64 job_time); + + void CopyNodeInputValue(NodeInput* input); + Node *CopyNodeConnections(Node *src_node); + void CopyNodeMakeConnection(NodeInput *src_input, NodeInput *dst_input); + + void TryRender(); + + /** + * @brief Generic function called whenever the frames to render need to be (re)queued + */ + void RequeueFrames(); + + /** + * @brief Process all changes to internal NodeGraph copy + * + * PreviewAutoCacher staggers updates to its internal NodeGraph copy, only applying them when the + * RenderManager is not reading from it. This function is called when such an opportunity arises. + */ + void ProcessUpdateQueue(); + + bool HasActiveJobs() const; + + QList graph_update_queue_; + QHash copy_map_; + ViewerOutput* copied_viewer_node_; + + ViewerOutput* viewer_node_; + + bool paused_; + + TimeRange cache_range_; + + bool has_changed_; + + bool use_custom_range_; + TimeRange custom_autocache_range_; + + TimeRangeList invalidated_video_; + TimeRangeList invalidated_audio_; + + QVector single_frame_renders_; + + QList*> hash_tasks_; + QMap audio_tasks_; + QMap video_tasks_; + QMap*, QByteArray> video_download_tasks_; + + QVector currently_caching_hashes_; + + qint64 last_update_time_; + + bool ignore_next_mouse_button_; + + bool video_params_changed_; + + bool audio_params_changed_; + +private slots: + /** + * @brief Handler for when the NodeGraph reports a video change over a certain time range + */ + void VideoInvalidated(const OLIVE_NAMESPACE::TimeRange &range); + + /** + * @brief Handler for when the NodeGraph reports a audio change over a certain time range + */ + void AudioInvalidated(const OLIVE_NAMESPACE::TimeRange &range); + + /** + * @brief Handler for when we have applied all the hashes to the FrameHashCache + */ + void HashesProcessed(); + + /** + * @brief Handler for when the RenderManager has returned rendered audio + */ + void AudioRendered(); + + /** + * @brief Handler for when the RenderManager has returned rendered video frames + */ + void VideoRendered(); + + /** + * @brief Handler for when we've saved a video frame to the cache + */ + void VideoDownloaded(); + + /** + * @brief Handler for when a NodeInput has been deleted so we clear it from the queue + * + * FIXME: This is hacky. It also might not be necessary anymore with recent changes to the + * node system, but I haven't tested yet. Either way, PreviewAutoCacher should probably + * be able to pick up on these sorts of things without such a slot. + */ + void QueuedInputRemoved(); + + void VideoParamsChanged(); + + void AudioParamsChanged(); + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // AUTOCACHER_H diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp new file mode 100644 index 000000000..ac8c3881d --- /dev/null +++ b/app/render/rendermanager.cpp @@ -0,0 +1,169 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "rendermanager.h" + +#include +#include +#include + +#include "config/config.h" +#include "core.h" +#include "render/backend/opengl/openglproxy.h" +#include "task/conform/conform.h" +#include "task/taskmanager.h" +#include "window/mainwindow/mainwindow.h" + +OLIVE_NAMESPACE_ENTER + +RenderManager* RenderManager::instance_ = nullptr; + +RenderManager::RenderManager(QObject *parent) : + ThreadPool(QThread::IdlePriority, 0, parent) +{ + // Initialize OpenGL service + OpenGLProxy::CreateInstance(); +} + +RenderManager::~RenderManager() +{ + OpenGLProxy::DestroyInstance(); +} + +QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const rational &time) +{ + QCryptographicHash hasher(QCryptographicHash::Sha1); + + // Embed video parameters into this hash + hasher.addData(reinterpret_cast(¶ms.effective_width()), sizeof(int)); + hasher.addData(reinterpret_cast(¶ms.effective_height()), sizeof(int)); + hasher.addData(reinterpret_cast(¶ms.format()), sizeof(PixelFormat::Format)); + + if (n) { + n->Hash(hasher, time); + } + + return hasher.result(); +} + +RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, const rational &time, RenderMode::Mode mode, bool prioritize) +{ + // Create ticket + RenderTicketPtr ticket = std::make_shared(); + + ticket->setProperty("viewer", Node::PtrToValue(viewer)); + ticket->setProperty("time", QVariant::fromValue(time)); + ticket->setProperty("mode", mode); + ticket->setProperty("type", kTypeVideo); + + // Queue appending the ticket and running the next job on our thread to make this function thread-safe + QMetaObject::invokeMethod(this, "AddTicket", Qt::AutoConnection, + OLIVE_NS_ARG(RenderTicketPtr, ticket), + Q_ARG(bool, prioritize)); + + return ticket; +} + +RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange &r, bool prioritize) +{ + // Create ticket + RenderTicketPtr ticket = std::make_shared(); + + ticket->setProperty("viewer", Node::PtrToValue(viewer)); + ticket->setProperty("time", QVariant::fromValue(r)); + ticket->setProperty("type", kTypeAudio); + + // Queue appending the ticket and running the next job on our thread to make this function thread-safe + QMetaObject::invokeMethod(this, "AddTicket", Qt::AutoConnection, + OLIVE_NS_ARG(RenderTicketPtr, ticket), + Q_ARG(bool, prioritize)); + + return ticket; +} + +void RenderManager::RunTicket(RenderTicketPtr ticket) const +{ + // Depending on the render ticket type, start a job + TicketType type = ticket->property("type").value(); + + switch (type) { + case kTypeVideo: + RenderFrameInternal(ticket); + break; + case kTypeAudio: + RenderAudioInternal(ticket); + break; + default: + // Fail + ticket->Cancel(); + } +} + +void RenderManager::RenderFrameInternal(RenderTicketPtr ticket) +{ + ViewerOutput* viewer = Node::ValueToPtr(ticket->property("viewer")); + rational time = ticket->property("time").value(); + + ticket->Start(); + + qDebug() << "STUB: Rendered" << time << "frames for" << viewer; + + FramePtr frame = Frame::Create(); + frame->set_video_params(viewer->video_params()); + frame->allocate(); + + ticket->Finish(QVariant::fromValue(frame), false); +} + +void RenderManager::RenderAudioInternal(RenderTicketPtr ticket) +{ + ViewerOutput* viewer = Node::ValueToPtr(ticket->property("viewer")); + TimeRange time = ticket->property("time").value(); + + ticket->Start(); + + qDebug() << "STUB: Rendered" << time << "audio for" << viewer; + + ticket->Finish(QVariant::fromValue(SampleBuffer::CreateAllocated(viewer->audio_params(), time.length())), false); +} + +void RenderManager::WorkerGeneratedWaveform(RenderTicketPtr ticket, TrackOutput *track, AudioVisualWaveform samples, TimeRange range) +{ + ViewerOutput* viewer = Node::ValueToPtr(ticket->property("viewer")); + + QList valid_ranges = viewer->audio_playback_cache()->GetValidRanges(range, + ticket->GetJobTime()); + if (!valid_ranges.isEmpty()) { + // Generate visual waveform in this background thread + track->waveform_lock()->lock(); + + track->waveform().set_channel_count(viewer->audio_params().channel_count()); + + foreach (const TimeRange& r, valid_ranges) { + track->waveform().OverwriteSums(samples, r.in(), r.in() - range.in(), r.length()); + } + + track->waveform_lock()->unlock(); + + emit track->PreviewChanged(); + } +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h new file mode 100644 index 000000000..80a3b2bb3 --- /dev/null +++ b/app/render/rendermanager.h @@ -0,0 +1,115 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef RENDERBACKEND_H +#define RENDERBACKEND_H + +#include + +#include "config/config.h" +#include "colorprocessorcache.h" +#include "dialog/rendercancel/rendercancel.h" +#include "decodercache.h" +#include "node/graph.h" +#include "node/output/viewer/viewer.h" +#include "threading/threadpool.h" + +OLIVE_NAMESPACE_ENTER + +class RenderManager : public ThreadPool +{ + Q_OBJECT +public: + static void CreateInstance() + { + instance_ = new RenderManager(); + } + + static void DestroyInstance() + { + delete instance_; + instance_ = nullptr; + } + + static RenderManager* instance() + { + return instance_; + } + + /** + * @brief Generate a unique identifier for a certain node at a certain time + */ + static QByteArray Hash(const Node *n, const VideoParams ¶ms, const rational &time); + + /** + * @brief Asynchronously generate a frame at a given time + * + * The ticket from this function will return a FramePtr - the rendered frame in reference color + * space. + * + * Setting `prioritize` to TRUE puts this ticket at the top of the queue. Leaving it as FALSE + * appends it to the bottom. + * + * This function is thread-safe. + */ + RenderTicketPtr RenderFrame(ViewerOutput* viewer, const rational& time, RenderMode::Mode mode, bool prioritize = false); + + /** + * @brief Asynchronously generate a chunk of audio + * + * The ticket from this function will return a SampleBufferPtr - the rendered audio. + * + * Setting `prioritize` to TRUE puts this ticket at the top of the queue. Leaving it as FALSE + * appends it to the bottom. + * + * This function is thread-safe. + */ + RenderTicketPtr RenderAudio(ViewerOutput* viewer, const TimeRange& r, bool prioritize = false); + + virtual void RunTicket(RenderTicketPtr ticket) const override; + + enum TicketType { + kTypeVideo, + kTypeAudio + }; + +signals: + +private: + static void RenderFrameInternal(RenderTicketPtr ticket); + + static void RenderAudioInternal(RenderTicketPtr ticket); + + RenderManager(QObject* parent = nullptr); + + virtual ~RenderManager() override; + + static RenderManager* instance_; + +private slots: + void WorkerGeneratedWaveform(OLIVE_NAMESPACE::RenderTicketPtr ticket, OLIVE_NAMESPACE::TrackOutput* track, OLIVE_NAMESPACE::AudioVisualWaveform samples, OLIVE_NAMESPACE::TimeRange range); + +}; + +Q_DECLARE_METATYPE(RenderManager::TicketType); + +OLIVE_NAMESPACE_EXIT + +#endif // RENDERBACKEND_H diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index 28215e856..c2c27c547 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -33,9 +33,6 @@ ExportTask::ExportTask(ViewerOutput* viewer_node, params_(params) { SetTitle(tr("Exporting \"%1\"").arg(viewer_node->media_name())); - - // Render highest quality - backend()->SetRenderMode(RenderMode::kOnline); } bool ExportTask::Run() @@ -66,9 +63,6 @@ bool ExportTask::Run() if (params_.video_enabled()) { - // Ensure renderer always provides the same resolution - backend()->SetForceDownloadResolution(true); - // If a transformation matrix is applied to this video, create it here if (params_.video_scaling_method() != ExportParams::kStretch) { QMatrix4x4 mat = ExportParams::GenerateMatrix(params_.video_scaling_method(), @@ -77,7 +71,7 @@ bool ExportTask::Run() params_.video_params().width(), params_.video_params().height()); - backend()->SetVideoDownloadMatrix(mat); + // FIXME: Re-implement this } // Create color processor @@ -102,7 +96,7 @@ bool ExportTask::Run() audio_data_.SetLength(range.length()); } - Render(video_range, audio_range, false); + Render(video_range, audio_range, RenderMode::kOnline, false); bool success = true; diff --git a/app/task/precache/precachetask.cpp b/app/task/precache/precachetask.cpp index e707a6949..8250c2d01 100644 --- a/app/task/precache/precachetask.cpp +++ b/app/task/precache/precachetask.cpp @@ -29,9 +29,6 @@ PreCacheTask::PreCacheTask(VideoStreamPtr footage, Sequence* sequence) : viewer()->set_video_params(sequence->video_params()); viewer()->set_audio_params(sequence->audio_params()); - // Render fastest quality - backend()->SetRenderMode(RenderMode::kOffline); - video_node_ = new VideoInput(); video_node_->SetStream(footage); @@ -39,13 +36,11 @@ PreCacheTask::PreCacheTask(VideoStreamPtr footage, Sequence* sequence) : SetTitle(tr("Pre-caching %1:%2").arg(footage->footage()->filename(), QString::number(footage->index()))); - - backend()->NodeGraphChanged(viewer()->texture_input()); - backend()->ProcessUpdateQueue(); } PreCacheTask::~PreCacheTask() { + // We created this viewer node ourselves, so now we should delete it delete viewer(); delete video_node_; } @@ -66,7 +61,7 @@ bool PreCacheTask::Run() } */ - Render(video_range, TimeRangeList(), true); + Render(video_range, TimeRangeList(), RenderMode::kOnline, true); download_threads_.waitForDone(); diff --git a/app/task/render/render.cpp b/app/task/render/render.cpp index bd813ac19..d0b88d0c1 100644 --- a/app/task/render/render.cpp +++ b/app/task/render/render.cpp @@ -21,20 +21,20 @@ #include "render.h" #include "common/timecodefunctions.h" +#include "render/rendermanager.h" +#include "threading/threadticket.h" OLIVE_NAMESPACE_ENTER -RenderTask::RenderTask(ViewerOutput* viewer, const VideoParams &vparams, const AudioParams &aparams) +RenderTask::RenderTask(ViewerOutput* viewer, const VideoParams &vparams, const AudioParams &aparams) : + viewer_(viewer), + video_params_(vparams), + audio_params_(aparams) { - backend_ = new OpenGLBackend(); - backend_->SetViewerNode(viewer); - backend_->SetVideoParams(vparams); - backend_->SetAudioParams(aparams); } RenderTask::~RenderTask() { - delete backend_; } struct TimeHashFuturePair { @@ -65,8 +65,10 @@ struct HashDownloadFuturePair { void RenderTask::Render(const TimeRangeList& video_range, const TimeRangeList &audio_range, + RenderMode::Mode mode, bool use_disk_cache) { + /* double progress_counter = 0; double total_length = 0; double video_frame_sz = video_params().time_base().toDouble(); @@ -77,7 +79,7 @@ void RenderTask::Render(const TimeRangeList& video_range, foreach (const TimeRange& r, audio_range) { total_length += r.length().toDouble(); - std::list ranges = RenderBackend::SplitRangeIntoChunks(r); + std::list ranges = r.Split(2); audio_queue.insert(audio_queue.end(), ranges.begin(), ranges.end()); } } @@ -93,7 +95,7 @@ void RenderTask::Render(const TimeRangeList& video_range, total_length += video_frame_sz * times.size(); - RenderTicketPtr hash_future = backend_->Hash(times); + RenderTicketPtr hash_future = RenderManager::instance()->Hash(viewer(), times); hashes = hash_future->Get().value >(); hash_job_time = hash_future->GetJobTime(); @@ -159,7 +161,7 @@ void RenderTask::Render(const TimeRangeList& video_range, // If no existing disk cache was found, queue it now if (!hash_exists) { - render_lookup_table.push_back({p.hash, backend_->RenderFrame(p.time)}); + render_lookup_table.push_back({p.hash, RenderManager::instance()->RenderFrame(viewer(), p.time, mode)}); running_hashes.push_back(p.hash); } } @@ -169,7 +171,7 @@ void RenderTask::Render(const TimeRangeList& video_range, } while (!IsCancelled() && !audio_queue.empty()) { - audio_lookup_table.push_back({audio_queue.front(), backend_->RenderAudio(audio_queue.front())}); + audio_lookup_table.push_back({audio_queue.front(), RenderManager::instance()->RenderAudio(viewer(), audio_queue.front())}); audio_queue.pop_front(); } @@ -235,9 +237,7 @@ void RenderTask::Render(const TimeRangeList& video_range, } } } - - // `Close` will block until all jobs are done making a safe deletion - backend_->Close(); + */ } OLIVE_NAMESPACE_EXIT diff --git a/app/task/render/render.h b/app/task/render/render.h index 8571c0894..c70e40468 100644 --- a/app/task/render/render.h +++ b/app/task/render/render.h @@ -24,7 +24,6 @@ #include #include "node/output/viewer/viewer.h" -#include "render/backend/opengl/openglbackend.h" #include "task/task.h" OLIVE_NAMESPACE_ENTER @@ -38,7 +37,7 @@ public: protected: void Render(const TimeRangeList &video_range, - const TimeRangeList &audio_range, + const TimeRangeList &audio_range, RenderMode::Mode mode, bool use_disk_cache); virtual QFuture DownloadFrame(FramePtr frame, const QByteArray &hash) = 0; @@ -49,26 +48,25 @@ protected: ViewerOutput* viewer() const { - return backend_->GetViewerNode(); + return viewer_; } - VideoParams video_params() const + const VideoParams& video_params() const { - return backend_->GetVideoParams(); + return video_params_; } - AudioParams audio_params() const + const AudioParams& audio_params() const { - return backend_->GetAudioParams(); - } - - RenderBackend* backend() - { - return backend_; + return audio_params_; } private: - RenderBackend* backend_; + ViewerOutput* viewer_; + + VideoParams video_params_; + + AudioParams audio_params_; }; diff --git a/app/threading/CMakeLists.txt b/app/threading/CMakeLists.txt new file mode 100644 index 000000000..b7169048c --- /dev/null +++ b/app/threading/CMakeLists.txt @@ -0,0 +1,26 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + threading/threadticket.cpp + threading/threadticket.h + threading/threadticketwatcher.cpp + threading/threadticketwatcher.h + threading/threadpool.cpp + threading/threadpool.h + PARENT_SCOPE +) diff --git a/app/threading/threadpool.cpp b/app/threading/threadpool.cpp new file mode 100644 index 000000000..0b801b707 --- /dev/null +++ b/app/threading/threadpool.cpp @@ -0,0 +1,138 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "threadpool.h" + +OLIVE_NAMESPACE_ENTER + +ThreadPool::ThreadPool(QThread::Priority priority, int threads, QObject *parent) : + QObject(parent) +{ + all_threads_.resize(threads ? threads : QThread::idealThreadCount()); + + // Create threads + for (int i=0; istart(priority); + } +} + +ThreadPool::~ThreadPool() +{ + foreach (ThreadPoolThread* thread, all_threads_) { + thread->Cancel(); + thread->wait(); + delete thread; + } + + RunNext(); +} + +void ThreadPool::AddTicket(RenderTicketPtr ticket, bool prioritize) +{ + if (prioritize) { + ticket_queue_.push_front(ticket); + } else { + ticket_queue_.push_back(ticket); + } + + RunNext(); +} + +void ThreadPool::RunNext() +{ + while (!ticket_queue_.empty() && !available_threads_.empty()) { + // Run function + RenderTicketPtr ticket = ticket_queue_.front(); + ticket_queue_.pop_front(); + + if (!ticket->WasCancelled()) { + ThreadPoolThread* thread = available_threads_.front(); + available_threads_.pop_front(); + + // Run the ticket in the thread, which actually just calls our virtual function RunTicket + thread->RunTicket(ticket); + } + } +} + +void ThreadPool::ThreadDone() +{ + ThreadPoolThread* thread = static_cast(sender()); + + available_threads_.push_back(thread); + + RunNext(); +} + +ThreadPoolThread::ThreadPoolThread(ThreadPool *parent) +{ + pool_ = parent; + cancelled_ = false; + + // Ensures mutex is definitely locked by the time the thread is running + mutex_.lock(); +} + +ThreadPoolThread::~ThreadPoolThread() +{ + mutex_.unlock(); +} + +void ThreadPoolThread::RunTicket(RenderTicketPtr ticket) +{ + mutex_.lock(); + ticket_ = ticket; + wait_cond_.wakeAll(); + mutex_.unlock(); +} + +void ThreadPoolThread::Cancel() +{ + cancelled_ = true; + wait_cond_.wakeAll(); +} + +void ThreadPoolThread::run() +{ + while (!cancelled_) { + wait_cond_.wait(&mutex_); + + if (ticket_) { + pool_->RunTicket(ticket_); + ticket_ = nullptr; + } + + emit Done(); + } +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/threading/threadpool.h b/app/threading/threadpool.h new file mode 100644 index 000000000..9c3431674 --- /dev/null +++ b/app/threading/threadpool.h @@ -0,0 +1,94 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef THREADPOOL_H +#define THREADPOOL_H + +#include + +#include "threading/threadticket.h" + +OLIVE_NAMESPACE_ENTER + +class ThreadPoolThread; + +class ThreadPool : public QObject +{ + Q_OBJECT +public: + ThreadPool(QThread::Priority priority = QThread::InheritPriority, int threads = 0, QObject* parent = nullptr); + + virtual ~ThreadPool() override; + + RenderTicketPtr Queue(); + + virtual void RunTicket(RenderTicketPtr ticket) const = 0; + +public slots: + void AddTicket(OLIVE_NAMESPACE::RenderTicketPtr ticket, bool prioritize = false); + +private: + void RunNext(); + + QVector all_threads_; + + std::list available_threads_; + + std::list ticket_queue_; + +private slots: + void ThreadDone(); + +}; + +class ThreadPoolThread : public QThread +{ + Q_OBJECT +public: + ThreadPoolThread(ThreadPool* parent); + + virtual ~ThreadPoolThread() override; + + void RunTicket(RenderTicketPtr ticket); + + void Cancel(); + +protected: + virtual void run() override; + +signals: + void Done(); + +private: + ThreadPool* pool_; + + RenderTicketPtr ticket_; + + QMutex mutex_; + + QWaitCondition wait_cond_; + + QAtomicInt cancelled_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // THREADPOOL_H diff --git a/app/render/backend/renderticket.cpp b/app/threading/threadticket.cpp similarity index 63% rename from app/render/backend/renderticket.cpp rename to app/threading/threadticket.cpp index 027683cd1..30ae3b5e1 100644 --- a/app/render/backend/renderticket.cpp +++ b/app/threading/threadticket.cpp @@ -18,17 +18,16 @@ ***/ -#include "renderticket.h" +#include "threadticket.h" OLIVE_NAMESPACE_ENTER -RenderTicket::RenderTicket(Type type, const QVariant &time) : +RenderTicket::RenderTicket() : + started_(false), finished_(false), - cancelled_(false), - time_(time), - type_(type), - job_time_(0) + cancelled_(false) { + SetJobTime(); } void RenderTicket::WaitForFinished() @@ -42,12 +41,10 @@ void RenderTicket::WaitForFinished() QVariant RenderTicket::Get() { - QMutexLocker locker(&lock_); - - if (!finished_) { - wait_.wait(&lock_); - } + WaitForFinished(); + // We don't have to mutex around this because there is no way to write to `result_` after + // the ticket has finished and the above function blocks the calling thread until it is finished return result_; } @@ -73,32 +70,50 @@ bool RenderTicket::WasCancelled() return cancelled_; } -void RenderTicket::Finish(QVariant result) +void RenderTicket::Start() { QMutexLocker locker(&lock_); - finished_ = true; - result_ = result; + if (!started_ && !finished_) { + started_ = true; + } +} - wait_.wakeAll(); +void RenderTicket::Finish(QVariant result, bool cancelled) +{ + QMutexLocker locker(&lock_); - locker.unlock(); + if (started_ && !finished_) { + finished_ = true; + cancelled_ = cancelled; - emit Finished(); + result_ = result; + + wait_.wakeAll(); + + locker.unlock(); + + emit Finished(); + } } void RenderTicket::Cancel() { QMutexLocker locker(&lock_); - finished_ = true; - cancelled_ = true; + if (!finished_) { + cancelled_ = true; - wait_.wakeAll(); + if (!started_) { + finished_ = true; - locker.unlock(); + wait_.wakeAll(); - emit Finished(); + locker.unlock(); + + emit Finished(); + } + } } OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/renderticket.h b/app/threading/threadticket.h similarity index 84% rename from app/render/backend/renderticket.h rename to app/threading/threadticket.h index f4fca0c6b..7bb644640 100644 --- a/app/render/backend/renderticket.h +++ b/app/threading/threadticket.h @@ -28,6 +28,7 @@ #include "codec/frame.h" #include "codec/samplebuffer.h" #include "common/timerange.h" +#include "node/output/viewer/viewer.h" OLIVE_NAMESPACE_ENTER @@ -35,13 +36,7 @@ class RenderTicket : public QObject { Q_OBJECT public: - enum Type { - kTypeHash, - kTypeVideo, - kTypeAudio - }; - - RenderTicket(Type type, const QVariant& time); + RenderTicket(); qint64 GetJobTime() const { @@ -53,16 +48,6 @@ public: job_time_ = QDateTime::currentMSecsSinceEpoch(); } - const QVariant& GetTime() const - { - return time_; - } - - Type GetType() const - { - return type_; - } - void WaitForFinished(); QVariant Get(); @@ -76,7 +61,9 @@ public: return &lock_; } - void Finish(QVariant result); + void Start(); + + void Finish(QVariant result, bool cancelled); void Cancel(); @@ -84,6 +71,8 @@ signals: void Finished(); private: + bool started_; + bool finished_; bool cancelled_; @@ -94,10 +83,6 @@ private: QWaitCondition wait_; - QVariant time_; - - Type type_; - qint64 job_time_; }; diff --git a/app/render/backend/renderticketwatcher.cpp b/app/threading/threadticketwatcher.cpp similarity index 93% rename from app/render/backend/renderticketwatcher.cpp rename to app/threading/threadticketwatcher.cpp index d5860311d..13940668e 100644 --- a/app/render/backend/renderticketwatcher.cpp +++ b/app/threading/threadticketwatcher.cpp @@ -18,7 +18,7 @@ ***/ -#include "renderticketwatcher.h" +#include "threadticketwatcher.h" OLIVE_NAMESPACE_ENTER @@ -79,4 +79,11 @@ QVariant RenderTicketWatcher::Get() } } +void RenderTicketWatcher::Cancel() +{ + if (ticket_) { + ticket_->Cancel(); + } +} + OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/renderticketwatcher.h b/app/threading/threadticketwatcher.h similarity index 96% rename from app/render/backend/renderticketwatcher.h rename to app/threading/threadticketwatcher.h index fba301a3b..6bbe979c2 100644 --- a/app/render/backend/renderticketwatcher.h +++ b/app/threading/threadticketwatcher.h @@ -21,7 +21,7 @@ #ifndef RENDERTICKETWATCHER_H #define RENDERTICKETWATCHER_H -#include "renderticket.h" +#include "threadticket.h" OLIVE_NAMESPACE_ENTER @@ -38,6 +38,8 @@ public: void SetTicket(RenderTicketPtr ticket); + void Cancel(); + bool WasCancelled(); bool IsFinished(); diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 5d6bdca82..b46619cbc 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -38,6 +38,7 @@ #include "project/item/sequence/sequence.h" #include "project/project.h" #include "render/pixelformat.h" +#include "render/rendermanager.h" #include "task/taskmanager.h" #include "widget/menu/menu.h" #include "window/mainwindow/mainwindow.h" @@ -108,12 +109,6 @@ ViewerWidget::ViewerWidget(QWidget *parent) : // FIXME: Magic number SetScale(48.0); - // Start background renderer - renderer_ = new OpenGLBackend(this); - renderer_->SetAutoCacheEnabled(true); - renderer_->SetRenderMode(RenderMode::kOffline); - renderer_->SetPreviewGenerationEnabled(true); - // Ensures that seeking on the waveform view updates the time as expected connect(waveform_view_, &AudioWaveformView::TimeChanged, this, &ViewerWidget::TimeChangedFromWaveform); connect(waveform_view_, &AudioWaveformView::customContextMenuRequested, this, &ViewerWidget::ShowContextMenu); @@ -167,7 +162,7 @@ void ViewerWidget::TimeChangedEvent(const int64_t &i) } if (!pause_autocache_during_playback_ || !IsPlaying()) { - renderer_->SetAutoCachePlayhead(time_set); + auto_cacher_.SetPlayhead(time_set); } display_widget_->SetTime(time_set); @@ -192,8 +187,6 @@ void ViewerWidget::ConnectNodeInternal(ViewerOutput *n) ruler()->SetPlaybackCache(n->video_frame_cache()); - n->audio_playback_cache()->SetParameters(n->audio_params()); - SetViewerResolution(n->video_params().width(), n->video_params().height()); SetViewerPixelAspect(n->video_params().pixel_aspect_ratio()); last_length_ = rational(); @@ -261,7 +254,7 @@ void ViewerWidget::DisconnectNodeInternal(ViewerOutput *n) void ViewerWidget::ConnectedNodeChanged(ViewerOutput *n) { - renderer_->SetViewerNode(n); + auto_cacher_.SetViewerNode(n); } void ViewerWidget::ScaleChangedEvent(const double &s) @@ -355,18 +348,18 @@ void ViewerWidget::ForceUpdate() void ViewerWidget::SetAutoCacheEnabled(bool e) { - renderer_->SetAutoCachePaused(!e); + auto_cacher_.SetPaused(!e); } void ViewerWidget::CacheEntireSequence() { - renderer_->AutoCacheRange(TimeRange(rational(), GetConnectedNode()->video_frame_cache()->GetLength())); + auto_cacher_.ForceCacheRange(TimeRange(rational(), GetConnectedNode()->video_frame_cache()->GetLength())); } void ViewerWidget::CacheSequenceInOut() { if (GetConnectedTimelinePoints() && GetConnectedTimelinePoints()->workarea()->enabled()) { - renderer_->AutoCacheRange(GetConnectedTimelinePoints()->workarea()->range()); + auto_cacher_.ForceCacheRange(GetConnectedTimelinePoints()->workarea()->range()); } else { QMessageBox::warning(this, tr("Error"), @@ -396,7 +389,7 @@ FramePtr ViewerWidget::DecodeCachedImage(const QString &fn, const rational& time void ViewerWidget::DecodeCachedImage(RenderTicketPtr ticket, const QString &fn, const rational& time) const { - ticket->Finish(QVariant::fromValue(DecodeCachedImage(fn, time))); + ticket->Finish(QVariant::fromValue(DecodeCachedImage(fn, time)), false); } bool ViewerWidget::ShouldForceWaveform() const @@ -472,7 +465,7 @@ void ViewerWidget::PlayInternal(int speed, bool in_to_out_only) // Kindly tell all viewers to stop caching if (pause_autocache_during_playback_) { foreach (ViewerWidget* viewer, instances_) { - viewer->renderer_->ClearVideoQueue(); + viewer->auto_cacher_.ClearVideoQueue(); } } @@ -633,14 +626,14 @@ RenderTicketPtr ViewerWidget::GetFrame(const rational &t, bool clear_render_queu if (cached_hash.isEmpty() || !QFileInfo::exists(cache_fn)) { // Frame hasn't been cached, start render job if (clear_render_queue) { - renderer_->ClearVideoQueue(); + auto_cacher_.ClearVideoQueue(); } - return renderer_->RenderFrame(t, true); + return auto_cacher_.GetSingleFrame(t); } else { // Frame has been cached, grab the frame - RenderTicketPtr ticket = std::make_shared(RenderTicket::kTypeVideo, - QVariant::fromValue(t)); + RenderTicketPtr ticket = std::make_shared(); + ticket->setProperty("time", QVariant::fromValue(t)); QtConcurrent::run(this, &ViewerWidget::DecodeCachedImage, ticket, cache_fn, t); return ticket; @@ -896,7 +889,7 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) // Auto-cache QAction* autocache_action = cache_menu->addAction(tr("Auto-Cache")); autocache_action->setCheckable(true); - autocache_action->setChecked(!renderer_->IsAutoCachePaused()); + autocache_action->setChecked(!auto_cacher_.IsPaused()); connect(autocache_action, &QAction::triggered, this, &ViewerWidget::SetAutoCacheEnabled); cache_menu->addSeparator(); @@ -981,7 +974,7 @@ void ViewerWidget::Pause() { PauseInternal(); - renderer_->SetAutoCachePlayhead(GetTime()); + auto_cacher_.SetPlayhead(GetTime()); } void ViewerWidget::ShuttleLeft() @@ -1162,25 +1155,14 @@ void ViewerWidget::InterlacingChangedSlot(VideoParams::Interlacing interlacing) void ViewerWidget::UpdateRendererVideoParameters() { - renderer_->ClearVideoQueue(); - - renderer_->SetVideoParams(GetConnectedNode()->video_params()); - - // In case the user is pressing the mouse at this exact moment - renderer_->IgnoreNextMouseButton(); - - GetConnectedNode()->video_frame_cache()->InvalidateAll(); - display_widget_->SetVideoParams(GetConnectedNode()->video_params()); + foreach (ViewerWindow* window, windows_) { + window->display_widget()->SetVideoParams(GetConnectedNode()->video_params()); + } } void ViewerWidget::UpdateRendererAudioParameters() { - renderer_->ClearAudioQueue(); - - renderer_->SetAudioParams(GetConnectedNode()->audio_params()); - - GetConnectedNode()->audio_playback_cache()->InvalidateAll(); } void ViewerWidget::SetZoomFromMenu(QAction *action) diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 06b096d7d..887f92b06 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -32,8 +32,8 @@ #include "common/rational.h" #include "node/output/viewer/viewer.h" #include "panel/scope/scope.h" -#include "render/backend/opengl/openglbackend.h" -#include "render/backend/renderticketwatcher.h" +#include "render/previewautocacher.h" +#include "threading/threadticketwatcher.h" #include "viewerdisplay.h" #include "viewerplaybacktimer.h" #include "viewerqueue.h" @@ -82,11 +82,6 @@ public: */ void SetFullScreen(QScreen* screen = nullptr); - RenderBackend* renderer() const - { - return renderer_; - } - ColorManager* color_manager() const { return display_widget_->color_manager(); @@ -246,8 +241,6 @@ private: ViewerQueue playback_queue_; int64_t playback_queue_next_frame_; - RenderBackend* renderer_; - bool prequeuing_; QList nonqueue_watchers_; @@ -256,6 +249,8 @@ private: int prequeue_length_; + PreviewAutoCacher auto_cacher_; + static QVector instances_; private slots: From 07dc7104c5a55ad8682e3efc037cd913716d8bde Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 29 Oct 2020 02:17:50 +1100 Subject: [PATCH 02/72] made timerangelist a encapsulation rather than a derivation Locks off functionality that really shouldn't be used. --- app/common/timerange.cpp | 61 ++++++++++++++----- app/common/timerange.h | 55 +++++++++++++++-- app/render/audioplaybackcache.cpp | 2 +- app/render/framehashcache.cpp | 6 +- app/render/playbackcache.cpp | 8 +-- app/render/previewautocacher.cpp | 4 +- app/task/export/export.cpp | 4 +- app/widget/timelinewidget/timelinewidget.cpp | 6 +- .../timelinewidgetselections.cpp | 12 +--- 9 files changed, 115 insertions(+), 43 deletions(-) diff --git a/app/common/timerange.cpp b/app/common/timerange.cpp index fde65bbf3..c53524863 100644 --- a/app/common/timerange.cpp +++ b/app/common/timerange.cpp @@ -176,42 +176,42 @@ void TimeRange::normalize() length_ = out_ - in_; } -void TimeRangeList::InsertTimeRange(TimeRange range_to_add) +void TimeRangeList::insert(TimeRange range_to_add) { // See if list contains this range - if (ContainsTimeRange(range_to_add)) { + if (contains(range_to_add)) { return; } // Does not contain range, so we'll almost certainly be adding it in some way for (int i=0;isize(); for (int i=0;iremoveAt(i); + array_.removeAt(i); i--; sz--; } else if (compare.Contains(remove, false, false)) { // The remove range is within this element, only choice is to split the element into two - this->append(TimeRange(remove.out(), compare.out())); + array_.append(TimeRange(remove.out(), compare.out())); compare.set_out(remove.in()); } else if (compare.in() < remove.in() && compare.out() > remove.in()) { // This element's out point overlaps the range's in, we'll trim it @@ -223,10 +223,10 @@ void TimeRangeList::RemoveTimeRange(const TimeRange &remove) } } -bool TimeRangeList::ContainsTimeRange(const TimeRange &range, bool in_inclusive, bool out_inclusive) const +bool TimeRangeList::contains(const TimeRange &range, bool in_inclusive, bool out_inclusive) const { for (int i=0;i= range.out()) { // No intersect @@ -249,7 +282,7 @@ TimeRangeList TimeRangeList::Intersects(const TimeRange &range) const TimeRange cropped(qMax(range.in(), compare.in()), qMin(range.out(), compare.out())); - intersect_list.append(cropped); + intersect_list.insert(cropped); } } @@ -261,7 +294,7 @@ void TimeRangeList::PrintTimeList() qDebug() << "TimeRangeList now contains:"; for (int i=0;i { +class TimeRangeList { public: TimeRangeList() = default; TimeRangeList(std::initializer_list r) : - QList(r) + array_(r) { } - void InsertTimeRange(TimeRange range_to_add); + void insert(TimeRange range_to_add); - void RemoveTimeRange(const TimeRange& remove); + void remove(const TimeRange& remove); - bool ContainsTimeRange(const TimeRange& range, bool in_inclusive = true, bool out_inclusive = true) const; + bool contains(const TimeRange& range, bool in_inclusive = true, bool out_inclusive = true) const; + + bool isEmpty() const + { + return array_.isEmpty(); + } + + void clear() + { + array_.clear(); + } + + int size() const + { + return array_.size(); + } + + void shift(const rational& diff); + + void trim_in(const rational& diff); + + void trim_out(const rational& diff); TimeRangeList Intersects(const TimeRange& range) const; + using const_iterator = QVector::const_iterator; + + const_iterator begin() const + { + return array_.constBegin(); + } + + const_iterator end() const + { + return array_.constEnd(); + } + + const TimeRange& first() const + { + return array_.first(); + } + + const TimeRange& last() const + { + return array_.last(); + } + private: void PrintTimeList(); + QVector array_; + }; uint qHash(const TimeRange& r, uint seed); diff --git a/app/render/audioplaybackcache.cpp b/app/render/audioplaybackcache.cpp index eda8ae905..595b76620 100644 --- a/app/render/audioplaybackcache.cpp +++ b/app/render/audioplaybackcache.cpp @@ -127,7 +127,7 @@ void AudioPlaybackCache::WritePCM(const TimeRange &range, SampleBufferPtr sample seg_file.close(); - ranges_we_validated.InsertTimeRange(TimeRange(this_write_in_point, this_write_out_point)); + ranges_we_validated.insert(TimeRange(this_write_in_point, this_write_out_point)); } else { qWarning() << "Failed to write PCM data to" << seg_file.fileName(); } diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index 387baa12e..37a656acf 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -90,7 +90,7 @@ void FrameHashCache::ValidateFramesWithHash(const QByteArray &hash) if (iterator.value() == hash) { TimeRange frame_range(iterator.key(), iterator.key() + timebase_); - if (invalidated_ranges.ContainsTimeRange(frame_range)) { + if (invalidated_ranges.contains(frame_range)) { Validate(frame_range); } } @@ -167,7 +167,7 @@ QVector FrameHashCache::GetFrameListFromTimeRange(TimeRangeList range_ } times.append(snapped); - range_list.RemoveTimeRange(TimeRange(snapped, next)); + range_list.remove(TimeRange(snapped, next)); } return times; @@ -362,7 +362,7 @@ void FrameHashCache::HashDeleted(const QString& s, const QByteArray &hash) QMap::const_iterator i; for (i=time_hash_map_.constBegin(); i!=time_hash_map_.constEnd(); i++) { if (i.value() == hash) { - ranges_to_invalidate.InsertTimeRange(TimeRange(i.key(), i.key() + timebase_)); + ranges_to_invalidate.insert(TimeRange(i.key(), i.key() + timebase_)); } } diff --git a/app/render/playbackcache.cpp b/app/render/playbackcache.cpp index 1c6103e48..72eda146d 100644 --- a/app/render/playbackcache.cpp +++ b/app/render/playbackcache.cpp @@ -33,7 +33,7 @@ void PlaybackCache::Invalidate(const TimeRange &r) { Q_ASSERT(r.in() != r.out()); - invalidated_.InsertTimeRange(r); + invalidated_.insert(r); RemoveRangeFromJobs(r); qint64 job_time = QDateTime::currentMSecsSinceEpoch(); @@ -69,11 +69,11 @@ void PlaybackCache::SetLength(const rational &r) jobs_.clear(); } else if (r > length_) { // If new length is greater, simply extend the invalidated range for now - invalidated_.InsertTimeRange(range_diff); + invalidated_.insert(range_diff); jobs_.append({range_diff, QDateTime::currentMSecsSinceEpoch()}); } else { // If new length is smaller, removed hashes - invalidated_.RemoveTimeRange(range_diff); + invalidated_.remove(range_diff); RemoveRangeFromJobs(range_diff); } @@ -123,7 +123,7 @@ void PlaybackCache::Shift(const rational &from, const rational &to) void PlaybackCache::Validate(const TimeRange &r) { - invalidated_.RemoveTimeRange(r); + invalidated_.remove(r); emit Validated(r); } diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 8658ba48a..5033d4d87 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -136,7 +136,7 @@ void PreviewAutoCacher::VideoInvalidated(const TimeRange &range) if (ignore_next_mouse_button_ || !(qApp->mouseButtons() & Qt::LeftButton)) { ignore_next_mouse_button_ = false; - invalidated_video_.InsertTimeRange(range); + invalidated_video_.insert(range); TryRender(); } @@ -147,7 +147,7 @@ void PreviewAutoCacher::AudioInvalidated(const TimeRange &range) ClearQueue(false); // Start jobs to re-render the audio at this range, split into 2 second chunks - invalidated_audio_.InsertTimeRange(range); + invalidated_audio_.insert(range); TryRender(); } diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index c2c27c547..60afd5b97 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -88,11 +88,11 @@ bool ExportTask::Run() TimeRangeList video_range, audio_range; if (params_.video_enabled()) { - video_range.append(range); + video_range = {range}; } if (params_.audio_enabled()) { - audio_range.append(range); + audio_range = {range}; audio_data_.SetLength(range.length()); } diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 4a3a6b759..68e39e7cb 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -531,7 +531,7 @@ void TimelineWidget::DeleteSelected(bool ripple) TimeRangeList range_list; foreach (Block* b, blocks_to_delete) { - range_list.InsertTimeRange(TimeRange(b->in(), b->out())); + range_list.insert(TimeRange(b->in(), b->out())); } new TimelineRippleDeleteGapsAtRegionsCommand(GetConnectedNode(), range_list, command); @@ -1512,7 +1512,7 @@ void TimelineWidget::EndRubberBandSelect() void TimelineWidget::AddSelection(const TimeRange &time, const TrackReference &track) { - selections_[track].InsertTimeRange(time); + selections_[track].insert(time); UpdateViewports(track.type()); } @@ -1524,7 +1524,7 @@ void TimelineWidget::AddSelection(TimelineViewBlockItem *item) void TimelineWidget::RemoveSelection(const TimeRange &time, const TrackReference &track) { - selections_[track].RemoveTimeRange(time); + selections_[track].remove(time); UpdateViewports(track.type()); } diff --git a/app/widget/timelinewidget/timelinewidgetselections.cpp b/app/widget/timelinewidget/timelinewidgetselections.cpp index 951b80946..938f2e16a 100644 --- a/app/widget/timelinewidget/timelinewidgetselections.cpp +++ b/app/widget/timelinewidget/timelinewidgetselections.cpp @@ -25,9 +25,7 @@ OLIVE_NAMESPACE_ENTER void TimelineWidgetSelections::ShiftTime(const rational &diff) { for (auto it=this->begin(); it!=this->end(); it++) { - for (auto it2=it.value().begin(); it2!=it.value().end(); it2++) { - (*it2) += diff; - } + it.value().shift(diff); } } @@ -59,18 +57,14 @@ void TimelineWidgetSelections::ShiftTracks(Timeline::TrackType type, int diff) void TimelineWidgetSelections::TrimIn(const rational &diff) { for (auto it=this->begin(); it!=this->end(); it++) { - for (auto it2=it.value().begin(); it2!=it.value().end(); it2++) { - (*it2).set_in((*it2).in() + diff); - } + it.value().trim_in(diff); } } void TimelineWidgetSelections::TrimOut(const rational &diff) { for (auto it=this->begin(); it!=this->end(); it++) { - for (auto it2=it.value().begin(); it2!=it.value().end(); it2++) { - (*it2).set_out((*it2).out() + diff); - } + it.value().trim_out(diff); } } From 00fef29cac99a013d589c5406cab13b2b41a8b60 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 29 Oct 2020 02:18:58 +1100 Subject: [PATCH 03/72] fixed issues where hashes wouldn't set correctly --- app/render/previewautocacher.cpp | 54 ++++++++++++++++++++++---------- app/render/previewautocacher.h | 3 +- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 5033d4d87..030c94e48 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -98,7 +98,7 @@ void PreviewAutoCacher::NodeGraphChanged(NodeInput *source) connect(source, &NodeInput::destroyed, this, &PreviewAutoCacher::QueuedInputRemoved); } -void PreviewAutoCacher::GenerateHashes(ViewerOutput *viewer, const QVector ×, qint64 job_time) +void PreviewAutoCacher::GenerateHashes(ViewerOutput *viewer, FrameHashCache* cache, const QVector ×, qint64 job_time) { std::vector existing_hashes; @@ -110,7 +110,7 @@ void PreviewAutoCacher::GenerateHashes(ViewerOutput *viewer, const QVectorvideo_frame_cache()->CachePathName(hash)); + hash_exists = QFileInfo::exists(cache->CachePathName(hash)); if (hash_exists) { existing_hashes.push_back(hash); @@ -118,7 +118,7 @@ void PreviewAutoCacher::GenerateHashes(ViewerOutput *viewer, const QVectorvideo_frame_cache(), "SetHash", Qt::QueuedConnection, + QMetaObject::invokeMethod(cache, "SetHash", Qt::QueuedConnection, OLIVE_NS_ARG(rational, time), Q_ARG(QByteArray, hash), Q_ARG(qint64, job_time), @@ -128,8 +128,6 @@ void PreviewAutoCacher::GenerateHashes(ViewerOutput *viewer, const QVectorcancel(); + } + if (wait) { + for (auto it=copy.cbegin(); it!=copy.cend(); it++) { + it.key()->waitForFinished(); + } + } +} + void PreviewAutoCacher::CopyNodeInputValue(NodeInput *input) { // Find our copy of this parameter @@ -447,8 +476,6 @@ void PreviewAutoCacher::TryRender() } // No jobs are active, we can process the update queue - last_update_time_ = QDateTime::currentMSecsSinceEpoch(); - ProcessUpdateQueue(); if (video_params_changed_) { @@ -471,6 +498,7 @@ void PreviewAutoCacher::TryRender() connect(watcher, &QFutureWatcher::finished, this, &PreviewAutoCacher::HashesProcessed); watcher->setFuture(QtConcurrent::run(&PreviewAutoCacher::GenerateHashes, copied_viewer_node_, + viewer_node_->video_frame_cache(), frames, last_update_time_)); @@ -591,13 +619,7 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) // We'll need to wait for these since they work directly on the FrameHashCache. Frames will // be in the cache for later use. - { - QMap*, QByteArray>::const_iterator i; - for (i=video_download_tasks_.constBegin(); i!=video_download_tasks_.constEnd(); i++) { - i.key()->waitForFinished(); - } - video_download_tasks_.clear(); - } + ClearVideoDownloadQueue(true); // No longer caching any hashes currently_caching_hashes_.clear(); diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index bd897bc69..b2ab2953a 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -81,6 +81,7 @@ public: void ClearHashQueue(bool wait = false); void ClearVideoQueue(bool wait = false); void ClearAudioQueue(bool wait = false); + void ClearVideoDownloadQueue(bool wait = false); public slots: /** @@ -89,7 +90,7 @@ public slots: void NodeGraphChanged(NodeInput *source); private: - static void GenerateHashes(ViewerOutput* viewer, const QVector& times, qint64 job_time); + static void GenerateHashes(ViewerOutput* viewer, FrameHashCache *cache, const QVector& times, qint64 job_time); void CopyNodeInputValue(NodeInput* input); Node *CopyNodeConnections(Node *src_node); From a3a57181a6de8878e392a82435f03c3f18f48755 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 29 Oct 2020 02:59:10 +1100 Subject: [PATCH 04/72] re-copy list when waiting since it may have changed --- app/render/previewautocacher.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 030c94e48..66973aa7c 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -327,6 +327,7 @@ void PreviewAutoCacher::ClearHashQueue(bool wait) (*it)->cancel(); } if (wait) { + copy = hash_tasks_; for (auto it=copy.cbegin(); it!=copy.cend(); it++) { (*it)->waitForFinished(); } @@ -342,6 +343,7 @@ void PreviewAutoCacher::ClearVideoQueue(bool wait) it.key()->Cancel(); } if (wait) { + copy = video_tasks_; for (auto it=copy.cbegin(); it!=copy.cend(); it++) { it.key()->WaitForFinished(); } @@ -360,6 +362,7 @@ void PreviewAutoCacher::ClearAudioQueue(bool wait) it.key()->Cancel(); } if (wait) { + copy = audio_tasks_; for (auto it=copy.cbegin(); it!=copy.cend(); it++) { it.key()->WaitForFinished(); } @@ -375,6 +378,7 @@ void PreviewAutoCacher::ClearVideoDownloadQueue(bool wait) it.key()->cancel(); } if (wait) { + copy = video_download_tasks_; for (auto it=copy.cbegin(); it!=copy.cend(); it++) { it.key()->waitForFinished(); } From 84a1ec0ca340edf1be16e2b04e5342ecb684bb9b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 29 Oct 2020 02:59:18 +1100 Subject: [PATCH 05/72] began graphics backend enum --- app/render/rendermanager.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 80a3b2bb3..e8948db6a 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -37,6 +37,14 @@ class RenderManager : public ThreadPool { Q_OBJECT public: + enum Backend { + /// Graphics acceleration provided by OpenGL + kOpenGL, + + /// No graphics rendering - used to test core threading logic + kDummy + }; + static void CreateInstance() { instance_ = new RenderManager(); From 26e351d3634e55b3d710472ebda5870c4e187eb1 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 29 Oct 2020 03:12:04 +1100 Subject: [PATCH 06/72] moved frame cache saving to our custom thread pool so we can control the priority --- app/render/previewautocacher.cpp | 22 +++++++++++----------- app/render/previewautocacher.h | 2 +- app/render/rendermanager.cpp | 32 ++++++++++++++++++++++++++++++++ app/render/rendermanager.h | 7 ++++++- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 66973aa7c..8e31da39e 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -202,13 +202,13 @@ void PreviewAutoCacher::VideoRendered() const QByteArray& hash = video_tasks_.value(watcher); // Download frame in another thread - QFutureWatcher* w = new QFutureWatcher(); + RenderTicketWatcher* w = new RenderTicketWatcher(); video_download_tasks_.insert(w, hash); - connect(w, &QFutureWatcher::finished, this, &PreviewAutoCacher::VideoDownloaded); - w->setFuture(QtConcurrent::run(viewer_node_->video_frame_cache(), - &FrameHashCache::SaveCacheFrame, - hash, - watcher->Get().value())); + connect(w, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::VideoDownloaded); + w->SetTicket(RenderManager::instance()->SaveFrameToCache(viewer_node_->video_frame_cache(), + watcher->Get().value(), + hash, + true)); } video_tasks_.remove(watcher); @@ -224,11 +224,11 @@ void PreviewAutoCacher::VideoRendered() void PreviewAutoCacher::VideoDownloaded() { - QFutureWatcher* watcher = static_cast*>(sender()); + RenderTicketWatcher* watcher = static_cast(sender()); if (video_download_tasks_.contains(watcher)) { - if (!watcher->isCanceled()) { - if (watcher->result()) { + if (!watcher->WasCancelled()) { + if (watcher->Get().toBool()) { const QByteArray& hash = video_download_tasks_.value(watcher); currently_caching_hashes_.removeOne(hash); @@ -375,12 +375,12 @@ void PreviewAutoCacher::ClearVideoDownloadQueue(bool wait) auto copy = video_download_tasks_; for (auto it=copy.cbegin(); it!=copy.cend(); it++) { - it.key()->cancel(); + it.key()->Cancel(); } if (wait) { copy = video_download_tasks_; for (auto it=copy.cbegin(); it!=copy.cend(); it++) { - it.key()->waitForFinished(); + it.key()->WaitForFinished(); } } } diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index b2ab2953a..0190a4e00 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -136,7 +136,7 @@ private: QList*> hash_tasks_; QMap audio_tasks_; QMap video_tasks_; - QMap*, QByteArray> video_download_tasks_; + QMap video_download_tasks_; QVector currently_caching_hashes_; diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index ac8c3881d..3c0ff4e26 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -98,6 +98,24 @@ RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange return ticket; } +RenderTicketPtr RenderManager::SaveFrameToCache(FrameHashCache *cache, FramePtr frame, const QByteArray &hash, bool prioritize) +{ + // Create ticket + RenderTicketPtr ticket = std::make_shared(); + + ticket->setProperty("cache", Node::PtrToValue(cache)); + ticket->setProperty("frame", QVariant::fromValue(frame)); + ticket->setProperty("hash", hash); + ticket->setProperty("type", kTypeVideoDownload); + + // Queue appending the ticket and running the next job on our thread to make this function thread-safe + QMetaObject::invokeMethod(this, "AddTicket", Qt::AutoConnection, + OLIVE_NS_ARG(RenderTicketPtr, ticket), + Q_ARG(bool, prioritize)); + + return ticket; +} + void RenderManager::RunTicket(RenderTicketPtr ticket) const { // Depending on the render ticket type, start a job @@ -110,6 +128,9 @@ void RenderManager::RunTicket(RenderTicketPtr ticket) const case kTypeAudio: RenderAudioInternal(ticket); break; + case kTypeVideoDownload: + SaveFrameToCacheInternal(ticket); + break; default: // Fail ticket->Cancel(); @@ -144,6 +165,17 @@ void RenderManager::RenderAudioInternal(RenderTicketPtr ticket) ticket->Finish(QVariant::fromValue(SampleBuffer::CreateAllocated(viewer->audio_params(), time.length())), false); } +void RenderManager::SaveFrameToCacheInternal(RenderTicketPtr ticket) +{ + FrameHashCache* cache = Node::ValueToPtr(ticket->property("cache")); + FramePtr frame = ticket->property("frame").value(); + QByteArray hash = ticket->property("hash").toByteArray(); + + ticket->Start(); + + ticket->Finish(cache->SaveCacheFrame(hash, frame), false); +} + void RenderManager::WorkerGeneratedWaveform(RenderTicketPtr ticket, TrackOutput *track, AudioVisualWaveform samples, TimeRange range) { ViewerOutput* viewer = Node::ValueToPtr(ticket->property("viewer")); diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index e8948db6a..035bf7938 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -91,11 +91,14 @@ public: */ RenderTicketPtr RenderAudio(ViewerOutput* viewer, const TimeRange& r, bool prioritize = false); + RenderTicketPtr SaveFrameToCache(FrameHashCache* cache, FramePtr frame, const QByteArray& hash, bool prioritize = false); + virtual void RunTicket(RenderTicketPtr ticket) const override; enum TicketType { kTypeVideo, - kTypeAudio + kTypeAudio, + kTypeVideoDownload }; signals: @@ -105,6 +108,8 @@ private: static void RenderAudioInternal(RenderTicketPtr ticket); + static void SaveFrameToCacheInternal(RenderTicketPtr ticket); + RenderManager(QObject* parent = nullptr); virtual ~RenderManager() override; From 0b3dd128e1a9d5085bc45069537f8f64e4b711df Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Thu, 29 Oct 2020 10:54:16 +0100 Subject: [PATCH 07/72] Remove old Travis CI (Linux, macOS) --- .travis.yml | 44 ----------------------- .travis/after_success.sh | 40 --------------------- .travis/before_install.sh | 17 --------- .travis/install.sh | 18 ---------- .travis/script.sh | 76 --------------------------------------- 5 files changed, 195 deletions(-) delete mode 100644 .travis.yml delete mode 100644 .travis/after_success.sh delete mode 100644 .travis/before_install.sh delete mode 100644 .travis/install.sh delete mode 100644 .travis/script.sh diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9b7b9d3ff..000000000 --- a/.travis.yml +++ /dev/null @@ -1,44 +0,0 @@ -language: cpp - -matrix: - include: - - os: linux - env: ARCH=x86_64 - compiler: gcc - sudo: require - dist: xenial - - os: osx - osx_image: xcode10.3 - before_cache: - - brew cleanup - cache: - directories: - - $HOME/Library/Caches/Homebrew - addons: - homebrew: - packages: - - ffmpeg - - qt5 - - grep - - opencolorio - - openimageio - update: true - # Can't build on Windows - affected by https://travis-ci.community/t/current-known-issues-please-read-this-before-posting-a-new-topic/264/10 - # - os: windows - -before_install: - - source ./.travis/before_install.sh - -install: - - source ./.travis/install.sh - -script: - - source ./.travis/script.sh - -after_success: - - source ./.travis/after_success.sh - -branches: - except: - - # Do not build tags that we create when we upload to GitHub Releases - - /^(?i:continuous)/ diff --git a/.travis/after_success.sh b/.travis/after_success.sh deleted file mode 100644 index e189720f2..000000000 --- a/.travis/after_success.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Check if there's been a new commit since this build, and if so don't upload it - -GREP_PATH=grep - -if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - GREP_PATH=ggrep -fi - -# Get current repo commit from GitHub (problems arose from trying to pipe cURL directly into grep, so we buffer it through a file) -REMOTE=$(curl -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/repos/olive-editor/olive/commits/master | $GREP_PATH -Po '(?<=: \")(([a-z0-9])\w+)(?=\")' -m 1 --) -LOCAL=$(git rev-parse HEAD) - -if [ "$TRAVIS_TAG" != "" ] || [ "$REMOTE" == "$LOCAL" ] -then - echo "[INFO] Still current. Uploading..." - - export UPLOADTOOL_BODY=$(cat release.txt) - - # Retrieve upload tool - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - - bash upload.sh Olive*.zip - - elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - - find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq - - bash upload.sh Olive*.AppImage* - - fi - -else - - echo "[INFO] No longer current. $REMOTE vs $LOCAL - aborting upload." - -fi diff --git a/.travis/before_install.sh b/.travis/before_install.sh deleted file mode 100644 index 569d5f5bb..000000000 --- a/.travis/before_install.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - - # Qt 5.11 - sudo add-apt-repository ppa:beineri/opt-qt-5.11.0-xenial -y - - # FFmpeg 4.x - sudo add-apt-repository ppa:jonathonf/ffmpeg-4 -y - - # OpenColorIO - sudo add-apt-repository ppa:olive-editor/opencolorio -y - - # Update apt - sudo apt-get update -qq - -fi diff --git a/.travis/install.sh b/.travis/install.sh deleted file mode 100644 index 8d57de697..000000000 --- a/.travis/install.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - - export PATH="/usr/local/opt/qt/bin:/usr/local/opt/python@2/libexec/bin:$PATH" - -elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - - sudo apt-get -y -o Dpkg::Options::="--force-overwrite" install qt511base qt511multimedia qt511svg qt511tools libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev libopencolorio-dev libopenimageio-dev libgl1-mesa-dev - source /opt/qt*/bin/qt*-env.sh - - # Acquire latest cmake (apt somehow gets the wrong version?) - wget -c https://github.com/Kitware/CMake/releases/download/v3.17.2/cmake-3.17.2-Linux-x86_64.sh -O cmake.sh - chmod +x cmake.sh - ./cmake.sh --skip-license --prefix=cmake --exclude-dir - export PATH=$PWD/cmake/bin:$PATH - -fi diff --git a/.travis/script.sh b/.travis/script.sh deleted file mode 100644 index 4a7a7fa2c..000000000 --- a/.travis/script.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash - -# linuxdeployqt uses this for naming the file -export VERSION=$(git rev-parse --short=8 HEAD) - -if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - - # Generate Makefile - cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo - - # Make - make -j$(sysctl -n hw.ncpu) - - # Handle compile failure - if [ "$?" != "0" ] - then - exit 1 - fi - - BUNDLE_NAME=Olive.app - - # Move bundle to working directory - mv app/$BUNDLE_NAME . - - # Move Qt deps into bundle - macdeployqt $BUNDLE_NAME - - # Fix other deps that macdeployqt missed - curl -fLOSs --retry 3 https://github.com/arl/macdeployqtfix/raw/master/macdeployqtfix.py - python2 macdeployqtfix.py $BUNDLE_NAME/Contents/MacOS/Olive /usr/local/Cellar/qt5/5.*/ - - # Fix deps on crash handler - python2 macdeployqtfix.py $BUNDLE_NAME/Contents/MacOS/olive-crashhandler /usr/local/Cellar/qt5/5.*/ - - # Fix OpenEXR libs that seem to be missed by both macdeployqt _and_ macdeployqtfix - cd $BUNDLE_NAME/Contents/Frameworks - exrlib=(libImath-*.dylib libHalf-*.dylib libIexMath-*.dylib libIex-*.dylib libIlmThread-*.dylib) - - for a in ${exrlib[@]}; do - for b in ${exrlib[@]}; do - install_name_tool -change @rpath/$b @executable_path/../Frameworks/$b $a - done - done - - cd ../../.. - - # Distribute in zip - zip -r Olive-$VERSION-macOS.zip $BUNDLE_NAME - -elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - - # Generate Makefile - cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo - - # Make - make -j$(nproc) - - # Handle compile failure - if [ "$?" != "0" ] - then - exit 1 - fi - - # Use `make install` on `appdir` to place files in the correct place - make DESTDIR=appdir install - - # Download linuxdeployqt - wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" - chmod a+x linuxdeployqt-continuous-x86_64.AppImage - - unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH - - # Use linuxdeployqt to set up dependencies - ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/local/share/applications/*.desktop -extra-plugins=imageformats/libqsvg.so -appimage - -fi From ee8961eeae4b055901bd98a47276442caf682024 Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Thu, 29 Oct 2020 10:54:26 +0100 Subject: [PATCH 08/72] Remove old AppVayor CI (Windows) --- .appveyor/build.bat | 117 -------------------------------------------- appveyor.yml | 22 --------- 2 files changed, 139 deletions(-) delete mode 100644 .appveyor/build.bat delete mode 100644 appveyor.yml diff --git a/.appveyor/build.bat b/.appveyor/build.bat deleted file mode 100644 index fa4e48ecc..000000000 --- a/.appveyor/build.bat +++ /dev/null @@ -1,117 +0,0 @@ -REM Get git hash in variable [this seems to be the most efficient way] -git rev-parse --short=8 HEAD > hash.txt -git rev-parse HEAD > longhash.txt -set /p GITHASH= < hash.txt -set /p GITLONGHASH= < longhash.txt -set /p TRAVIS_COMMIT= < longhash.txt - -REM Set up Visual Studio x64 environment -call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" - -REM Install 64-bit packages -set VCPKG_DEFAULT_TRIPLET=x64-windows - -REM Hack to only install release builds for time -echo set(VCPKG_BUILD_TYPE release) >> C:\Tools\vcpkg\triplets\x64-windows.cmake - -REM Install Open*IO libraries -vcpkg install opencolorio -vcpkg install openimageio - -REM Integrate libraries -cd c:\tools\vcpkg -vcpkg integrate install -cd %APPVEYOR_BUILD_FOLDER% - -REM Acquire FFmpeg -set FFMPEG_VER=ffmpeg-4.2.3-win64 -curl https://ffmpeg.zeranoe.com/builds/win64/dev/%FFMPEG_VER%-dev.zip > %FFMPEG_VER%-dev.zip -curl https://ffmpeg.zeranoe.com/builds/win64/shared/%FFMPEG_VER%-shared.zip > %FFMPEG_VER%-shared.zip -7z x %FFMPEG_VER%-dev.zip -7z x %FFMPEG_VER%-shared.zip - -REM Acquire Google Crashpad -git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git -set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\depot_tools - -REM Run `fetch` through cmd /c since fetch is a batch file that seems to call exit -cmd /c fetch crashpad -cd crashpad -cmd /c gn gen out/Default - -REM Patch to build a dynamic release instead of a static release -ren out\Default\toolchain.ninja toolchain.ninja.old -sed "s/${cflags_c}/${cflags_c} \/MD/g" out\Default\toolchain.ninja.old > out\Default\toolchain.ninja - -REM Build Crashpad -ninja.exe -C out/Default -cd .. - -REM Add Qt, FFmpeg, and Crashpad to path -set PATH=%PATH%;C:\Qt\5.13.2\msvc2017_64\bin;%APPVEYOR_BUILD_FOLDER%\%FFMPEG_VER%-dev;%APPVEYOR_BUILD_FOLDER%\crashpad;%APPVEYOR_BUILD_FOLDER%\crashpad\out\Default - -REM Run cmake -cmake -G "Ninja" . -DCMAKE_TOOLCHAIN_FILE=c:/Tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo - -REM Build with Ninja -ninja.exe || exit /B 1 - -REM If this is a pull request, no further packaging/deploying needs to be done -if NOT "%APPVEYOR_PULL_REQUEST_NUMBER%" == "" goto end - -REM Create Crashpad symbol file and upload it -C:\msys64\usr\bin\wget.exe https://github.com/google/breakpad/blob/master/src/tools/windows/binaries/dump_syms.exe?raw=true -O dump_syms.exe -dump_syms app\olive-editor.pdb > olive-editor.sym -curl -F symfile=@olive-editor.sym https://olivevideoeditor.org/crashpad/symbols.php - -REM Start building package -mkdir olive-editor -cd olive-editor -copy ..\app\olive-editor.exe . -copy ..\app\olive-editor.pdb . -copy ..\app\crashhandler.exe . -copy ..\crashpad\out\Default\crashpad_handler.exe . -windeployqt olive-editor.exe -copy ..\%FFMPEG_VER%-shared\bin\*.dll . -copy ..\app\*.dll . - -REM Package done, begin deployment -cd .. -set PKGNAME=Olive-%GITHASH%-Windows-x86_64 - -REM Create installer -copy app\packaging\windows\nsis\* . -"C:/Program Files (x86)/NSIS/makensis.exe" -V4 -DX64 "-XOutFile %PKGNAME%.exe" olive.nsi - -REM Create portable -copy nul olive-editor\portable -7z a %PKGNAME%.zip olive-editor - -REM If this was a tagged build, upload -if "%APPVEYOR_REPO_TAG%"=="true" GOTO upload - -REM Else, if this is a continuous build, check if this commit is the most recent - -REM Force locale to UTF-8 or grep -P fails -set LC_ALL=en_US.UTF-8 - -curl -H "Authorization: token %GITHUB_TOKEN%" https://api.github.com/repos/olive-editor/olive/commits/master > repoinfo.txt -grep -Po '(?^<=: \")(([a-z0-9])\w+)(?=\")' -m 1 repoinfo.txt > latestcommit.txt -set /p REMOTEHASH= < latestcommit.txt -if "%REMOTEHASH%"=="%GITLONGHASH%" GOTO upload - -REM The previous if statements failed, skip to the end -GOTO end - -:upload -set /p UPLOADTOOL_BODY= < latestcommit.txt - -curl -L https://github.com/probonopd/uploadtool/raw/master/upload.sh > upload.sh -bash upload.sh Olive*.zip -bash upload.sh Olive*.exe - -:end -REM Check if this build should set up a debugging session -IF "%ENABLE_RDP%"=="1" ( - powershell -command "$blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))" -) diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 436930972..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,22 +0,0 @@ -version: "{build}" -image: Visual Studio 2017 -environment: - TRAVIS_REPO_SLUG: olive-editor/olive - -# Hack to not build the "continuous" tag (https://github.com/appveyor/ci/issues/486) -# FIXME: Will unfortunately skip release tags -skip_tags: true - -install: -- cd C:\Tools\vcpkg -- git pull -- .\bootstrap-vcpkg.bat -- cd %APPVEYOR_BUILD_FOLDER% -build_script: -- cmd: .appveyor\build.bat -#artifacts: -#- path: Olive*.zip -# name: Olive Portable -#- path: Olive*.exe -# name: Olive Installer -cache: c:\tools\vcpkg\installed\ From 493babab595e4e252d68ebcbdd50711ae45a3937 Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Thu, 29 Oct 2020 11:15:35 +0100 Subject: [PATCH 09/72] Update Qt gitignores --- .gitignore | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index eaf33fa1c..5e0716088 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,7 @@ build/ CmakeSettings.json # -# Qt ignores taken from https://github.com/github/gitignore +# Qt ignores taken from https://github.com/github/gitignore/blob/master/Qt.gitignore # # C++ objects and libs @@ -24,6 +24,7 @@ CmakeSettings.json *.la *.lai *.so +*.so.* *.dll *.dylib @@ -46,6 +47,8 @@ ui_*.h *.jsc Makefile* *build-* +*.qm +*.prl # Qt unit tests target_wrapper.* @@ -65,3 +68,5 @@ compile_commands.json # QtCreator local machine specific files for imported projects *creator.user* + +*_qmlcache.qrc From 8c1f7d6d94a3b624f4e22db32f2204e6b2bd6b84 Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Thu, 29 Oct 2020 11:16:03 +0100 Subject: [PATCH 10/72] Cleanup and add a few more gitignores --- .gitignore | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 5e0716088..a2d250b96 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,36 @@ -*.pro.user* -Makefile -.qmake.stash -effects/frei0r -ts/*.qm -docs -history -build/ -.DS_Store +# CMake artifacts +build*/ -.vscode -.vs +# Doxygen +docs/ + +# Visual Studio (Code) +.localhistory/ +.history/ +.vscode/ +.vs/ CmakeSettings.json +# macOS General +.DS_Store +.AppleDouble +.LSOverride + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Windows folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares (Windows) +$RECYCLE.BIN/ + +# Windows shortcuts +*.lnk + # # Qt ignores taken from https://github.com/github/gitignore/blob/master/Qt.gitignore # From 82347ccda605d0f80ae002b6e617d09658cd8c9d Mon Sep 17 00:00:00 2001 From: Simran Date: Thu, 29 Oct 2020 17:24:34 +0100 Subject: [PATCH 11/72] Limit build*/ and docs/ to top level, ignore out/ at top level --- .gitignore | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a2d250b96..88b977edd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,15 @@ # CMake artifacts -build*/ +/build*/ # Doxygen -docs/ +/docs/ # Visual Studio (Code) .localhistory/ .history/ .vscode/ .vs/ +/out/ CmakeSettings.json # macOS General From 60eb71cb4c107c1cd9984e89c88329f6a3d6d04d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 30 Oct 2020 22:48:25 +1100 Subject: [PATCH 12/72] derive threadpool from cancelableobject --- app/common/cancelableobject.h | 10 ++++++++-- app/threading/threadpool.cpp | 14 ++++++-------- app/threading/threadpool.h | 7 ++++--- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/app/common/cancelableobject.h b/app/common/cancelableobject.h index 19364a521..00d5254c9 100644 --- a/app/common/cancelableobject.h +++ b/app/common/cancelableobject.h @@ -34,14 +34,20 @@ public: { } - void Cancel() { + void Cancel() + { cancelled_ = true; + CancelEvent(); } - const QAtomicInt& IsCancelled() const { + const QAtomicInt& IsCancelled() const + { return cancelled_; } +protected: + virtual void CancelEvent(){} + private: QAtomicInt cancelled_; diff --git a/app/threading/threadpool.cpp b/app/threading/threadpool.cpp index 0b801b707..ccd139a3c 100644 --- a/app/threading/threadpool.cpp +++ b/app/threading/threadpool.cpp @@ -96,7 +96,6 @@ void ThreadPool::ThreadDone() ThreadPoolThread::ThreadPoolThread(ThreadPool *parent) { pool_ = parent; - cancelled_ = false; // Ensures mutex is definitely locked by the time the thread is running mutex_.lock(); @@ -115,15 +114,9 @@ void ThreadPoolThread::RunTicket(RenderTicketPtr ticket) mutex_.unlock(); } -void ThreadPoolThread::Cancel() -{ - cancelled_ = true; - wait_cond_.wakeAll(); -} - void ThreadPoolThread::run() { - while (!cancelled_) { + while (!IsCancelled()) { wait_cond_.wait(&mutex_); if (ticket_) { @@ -135,4 +128,9 @@ void ThreadPoolThread::run() } } +void ThreadPoolThread::CancelEvent() +{ + wait_cond_.wakeAll(); +} + OLIVE_NAMESPACE_EXIT diff --git a/app/threading/threadpool.h b/app/threading/threadpool.h index 9c3431674..b202aeb22 100644 --- a/app/threading/threadpool.h +++ b/app/threading/threadpool.h @@ -23,6 +23,7 @@ #include +#include "common/cancelableobject.h" #include "threading/threadticket.h" OLIVE_NAMESPACE_ENTER @@ -58,7 +59,7 @@ private slots: }; -class ThreadPoolThread : public QThread +class ThreadPoolThread : public QThread, public CancelableObject { Q_OBJECT public: @@ -73,6 +74,8 @@ public: protected: virtual void run() override; + virtual void CancelEvent() override; + signals: void Done(); @@ -85,8 +88,6 @@ private: QWaitCondition wait_cond_; - QAtomicInt cancelled_; - }; OLIVE_NAMESPACE_EXIT From 13dd31d5bef196315e204f28c4db8598c12f1844 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 6 Nov 2020 20:18:10 +1100 Subject: [PATCH 13/72] began rewrite of renderer inner workings --- app/node/output/track/track.h | 6 - app/render/CMakeLists.txt | 2 + app/render/backend/CMakeLists.txt | 4 + app/render/backend/opengl/CMakeLists.txt | 16 +- .../backend/opengl/openglcolorprocessor.cpp | 90 --- .../backend/opengl/openglcolorprocessor.h | 69 -- app/render/backend/opengl/openglcontext.cpp | 195 ++++++ app/render/backend/opengl/openglcontext.h | 76 +++ .../backend/opengl/openglframebuffer.cpp | 153 ----- app/render/backend/opengl/openglframebuffer.h | 65 -- app/render/backend/opengl/openglproxy.cpp | 567 ---------------- app/render/backend/opengl/openglproxy.h | 122 ---- .../backend/opengl/openglrenderfunctions.cpp | 232 ------- .../backend/opengl/openglrenderfunctions.h | 70 -- app/render/backend/opengl/openglshader.cpp | 254 ------- app/render/backend/opengl/openglshader.h | 65 -- app/render/backend/opengl/opengltexture.cpp | 191 ------ app/render/backend/opengl/opengltexture.h | 118 ---- .../backend/opengl/opengltexturecache.cpp | 121 ---- .../backend/opengl/opengltexturecache.h | 80 --- app/render/backend/rendercontext.cpp | 32 +- app/render/backend/rendercontext.h | 58 +- .../backend/rendercontextthreadwrapper.cpp | 107 +++ .../backend/rendercontextthreadwrapper.h | 66 ++ app/render/backend/renderframebuffer.cpp | 6 - app/render/backend/renderframebuffer.h | 11 - app/render/backend/rendershader.cpp | 6 - app/render/backend/rendershader.h | 11 - app/render/backend/rendertexture.cpp | 6 - app/render/backend/rendertexture.h | 12 - app/render/previewautocacher.cpp | 30 + app/render/rendermanager.cpp | 108 +-- app/render/rendermanager.h | 16 +- app/render/renderprocessor.cpp | 630 ++++++++++++++++++ app/render/renderprocessor.h | 75 +++ app/threading/threadpool.h | 2 - 36 files changed, 1299 insertions(+), 2373 deletions(-) delete mode 100644 app/render/backend/opengl/openglcolorprocessor.cpp delete mode 100644 app/render/backend/opengl/openglcolorprocessor.h create mode 100644 app/render/backend/opengl/openglcontext.cpp create mode 100644 app/render/backend/opengl/openglcontext.h delete mode 100644 app/render/backend/opengl/openglframebuffer.cpp delete mode 100644 app/render/backend/opengl/openglframebuffer.h delete mode 100644 app/render/backend/opengl/openglproxy.cpp delete mode 100644 app/render/backend/opengl/openglproxy.h delete mode 100644 app/render/backend/opengl/openglrenderfunctions.cpp delete mode 100644 app/render/backend/opengl/openglrenderfunctions.h delete mode 100644 app/render/backend/opengl/openglshader.cpp delete mode 100644 app/render/backend/opengl/openglshader.h delete mode 100644 app/render/backend/opengl/opengltexture.cpp delete mode 100644 app/render/backend/opengl/opengltexture.h delete mode 100644 app/render/backend/opengl/opengltexturecache.cpp delete mode 100644 app/render/backend/opengl/opengltexturecache.h create mode 100644 app/render/backend/rendercontextthreadwrapper.cpp create mode 100644 app/render/backend/rendercontextthreadwrapper.h delete mode 100644 app/render/backend/renderframebuffer.cpp delete mode 100644 app/render/backend/renderframebuffer.h delete mode 100644 app/render/backend/rendershader.cpp delete mode 100644 app/render/backend/rendershader.h delete mode 100644 app/render/backend/rendertexture.cpp delete mode 100644 app/render/backend/rendertexture.h create mode 100644 app/render/renderprocessor.cpp create mode 100644 app/render/renderprocessor.h diff --git a/app/node/output/track/track.h b/app/node/output/track/track.h index 6e32f1c9c..b498f4b68 100644 --- a/app/node/output/track/track.h +++ b/app/node/output/track/track.h @@ -217,11 +217,6 @@ public: return waveform_; } - QMutex* waveform_lock() - { - return &waveform_lock_; - } - static const double kTrackHeightDefault; static const double kTrackHeightMinimum; static const double kTrackHeightInterval; @@ -297,7 +292,6 @@ private: bool locked_; AudioVisualWaveform waveform_; - QMutex waveform_lock_; private slots: void BlockConnected(NodeEdgePtr edge); diff --git a/app/render/CMakeLists.txt b/app/render/CMakeLists.txt index 44b590ee6..1b3c2b9fc 100644 --- a/app/render/CMakeLists.txt +++ b/app/render/CMakeLists.txt @@ -46,6 +46,8 @@ set(OLIVE_SOURCES render/rendermanager.h render/rendermanager.cpp render/rendermodes.h + render/renderprocessor.h + render/renderprocessor.cpp render/shaderinfo.h render/videoparams.h render/videoparams.cpp diff --git a/app/render/backend/CMakeLists.txt b/app/render/backend/CMakeLists.txt index 8dc59590c..65c369e52 100644 --- a/app/render/backend/CMakeLists.txt +++ b/app/render/backend/CMakeLists.txt @@ -18,5 +18,9 @@ add_subdirectory(opengl) set(OLIVE_SOURCES ${OLIVE_SOURCES} + render/backend/rendercontext.cpp + render/backend/rendercontext.h + render/backend/rendercontextthreadwrapper.cpp + render/backend/rendercontextthreadwrapper.h PARENT_SCOPE ) diff --git a/app/render/backend/opengl/CMakeLists.txt b/app/render/backend/opengl/CMakeLists.txt index cb8f1b674..9464d26bd 100644 --- a/app/render/backend/opengl/CMakeLists.txt +++ b/app/render/backend/opengl/CMakeLists.txt @@ -16,19 +16,7 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} - render/backend/opengl/openglcolorprocessor.h - render/backend/opengl/openglcolorprocessor.cpp - render/backend/opengl/openglframebuffer.h - render/backend/opengl/openglframebuffer.cpp - render/backend/opengl/openglproxy.h - render/backend/opengl/openglproxy.cpp - render/backend/opengl/openglrenderfunctions.h - render/backend/opengl/openglrenderfunctions.cpp - render/backend/opengl/openglshader.h - render/backend/opengl/openglshader.cpp - render/backend/opengl/opengltexture.h - render/backend/opengl/opengltexture.cpp - render/backend/opengl/opengltexturecache.h - render/backend/opengl/opengltexturecache.cpp + render/backend/opengl/openglcontext.cpp + render/backend/opengl/openglcontext.h PARENT_SCOPE ) diff --git a/app/render/backend/opengl/openglcolorprocessor.cpp b/app/render/backend/opengl/openglcolorprocessor.cpp deleted file mode 100644 index bc0993f4f..000000000 --- a/app/render/backend/opengl/openglcolorprocessor.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "openglcolorprocessor.h" - -#include -#include - -#include "openglrenderfunctions.h" - -OLIVE_NAMESPACE_ENTER - -void OpenGLColorProcessor::Enable(QOpenGLContext *context, bool alpha_is_associated) -{ - if (IsEnabled()) { - return; - } - - context_ = context; - - pipeline_ = OpenGLShader::CreateOCIO(context_, - ocio_lut_, - GetProcessor(), - alpha_is_associated); - - connect(context_, &QOpenGLContext::aboutToBeDestroyed, this, &OpenGLColorProcessor::ClearTexture, Qt::DirectConnection); -} - -bool OpenGLColorProcessor::IsEnabled() const -{ - return ocio_lut_; -} - -OpenGLShaderPtr OpenGLColorProcessor::pipeline() const -{ - return pipeline_; -} - -void OpenGLColorProcessor::ProcessOpenGL(bool flipped, const QMatrix4x4& matrix) -{ - OpenGLRenderFunctions::OCIOBlit(pipeline_, ocio_lut_, flipped, matrix); -} - -void OpenGLColorProcessor::ClearTexture() -{ - if (IsEnabled()) { - // Clean up OCIO LUT texture and shader - context_->functions()->glDeleteTextures(1, &ocio_lut_); - - disconnect(context_, &QOpenGLContext::aboutToBeDestroyed, this, &OpenGLColorProcessor::ClearTexture); - - ocio_lut_ = 0; - pipeline_ = nullptr; - } -} - -OpenGLColorProcessor::OpenGLColorProcessor(ColorManager* config, const QString &source_space, const ColorTransform &dest_space) : - ColorProcessor(config, source_space, dest_space), - ocio_lut_(0) -{ -} - -OpenGLColorProcessor::~OpenGLColorProcessor() -{ - ClearTexture(); -} - -OpenGLColorProcessorPtr OpenGLColorProcessor::Create(ColorManager *config, const QString &source_space, const ColorTransform &dest_space) -{ - return std::make_shared(config, source_space, dest_space); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglcolorprocessor.h b/app/render/backend/opengl/openglcolorprocessor.h deleted file mode 100644 index bd8e6dc9c..000000000 --- a/app/render/backend/opengl/openglcolorprocessor.h +++ /dev/null @@ -1,69 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLCOLORPROCESSOR_H -#define OPENGLCOLORPROCESSOR_H - -#include "openglshader.h" -#include "render/colorprocessor.h" - -OLIVE_NAMESPACE_ENTER - -class OpenGLColorProcessor; -using OpenGLColorProcessorPtr = std::shared_ptr; - -class OpenGLColorProcessor : public QObject, public ColorProcessor -{ - Q_OBJECT -public: - OpenGLColorProcessor(ColorManager *config, - const QString& input, - const ColorTransform& dest); - - virtual ~OpenGLColorProcessor() override; - - static OpenGLColorProcessorPtr Create(ColorManager* config, - const QString& input, - const ColorTransform& dest); - - void Enable(QOpenGLContext* context, bool alpha_is_associated); - bool IsEnabled() const; - - OpenGLShaderPtr pipeline() const; - - void ProcessOpenGL(bool flipped = false, const QMatrix4x4& matrix = QMatrix4x4()); - -private: - QOpenGLContext* context_; - - GLuint ocio_lut_; - - OpenGLShaderPtr pipeline_; - -private slots: - void ClearTexture(); - -}; - -using OpenGLColorProcessorCache = QHash; - -OLIVE_NAMESPACE_EXIT - -#endif // OPENGLCOLORPROCESSOR_H diff --git a/app/render/backend/opengl/openglcontext.cpp b/app/render/backend/opengl/openglcontext.cpp new file mode 100644 index 000000000..5a81f4719 --- /dev/null +++ b/app/render/backend/opengl/openglcontext.cpp @@ -0,0 +1,195 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "openglcontext.h" + +#include + +OLIVE_NAMESPACE_ENTER + +OpenGLContext::OpenGLContext(QObject* parent) : + RenderContext(parent) +{ +} + +OpenGLContext::~OpenGLContext() +{ +} + +bool OpenGLContext::Init() +{ + surface_.create(); + + context_ = new QOpenGLContext(); + if (!context_->create()) { + qCritical() << "Failed to create OpenGL context"; + return false; + } + + context_->moveToThread(this->thread()); + + return true; +} + +void OpenGLContext::PostInit() +{ + // Make context current on that surface + if (!context_->makeCurrent(&surface_)) { + qCritical() << "Failed to makeCurrent() on offscreen surface in thread" << thread(); + return; + } + + // Store OpenGL functions instance + functions_ = context_->functions(); + functions_->glBlendFunc(GL_ONE, GL_ZERO); +} + +void OpenGLContext::Destroy() +{ + delete context_; + surface_.destroy(); +} + +QVariant OpenGLContext::CreateTexture(const VideoParams &p, void *data, int linesize) +{ + GLuint texture; + functions_->glGenTextures(1, &texture); + texture_params_.insert(texture, p); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); + + functions_->glTexImage2D(GL_TEXTURE_2D, 0, GetInternalFormat(p.format()), + p.width(), p.height(), 0, GetPixelFormat(p.format()), + GetPixelType(p.format()), data); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + return texture; +} + +void OpenGLContext::DestroyTexture(QVariant texture) +{ + GLuint t = texture.value(); + functions_->glDeleteTextures(1, &t); + texture_params_.remove(t); +} + +void OpenGLContext::UploadToTexture(QVariant texture, void *data, int linesize) +{ + GLuint t = texture.value(); + const VideoParams& p = texture_params_.value(t); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); + + functions_->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, + p.effective_width(), p.effective_height(), + GetPixelFormat(p.format()), GetPixelType(p.format()), + data); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); +} + +void OpenGLContext::DownloadFromTexture(QVariant texture, void *data, int linesize) +{ + GLuint t = texture.value(); + const VideoParams& p = texture_params_.value(t); + + functions_->glPixelStorei(GL_PACK_ROW_LENGTH, linesize); + + functions_->glReadPixels(0, + 0, + p.width(), + p.height(), + GetPixelFormat(p.format()), + GetPixelType(p.format()), + data); + + functions_->glPixelStorei(GL_PACK_ROW_LENGTH, 0); +} + +VideoParams OpenGLContext::GetParamsFromTexture(QVariant texture) +{ + GLuint t = texture.value(); + + return texture_params_.value(t); +} + +GLint OpenGLContext::GetInternalFormat(PixelFormat::Format format) +{ + switch (format) { + case PixelFormat::PIX_FMT_RGB8: + return GL_RGB8; + case PixelFormat::PIX_FMT_RGBA8: + return GL_RGBA8; + case PixelFormat::PIX_FMT_RGB16U: + return GL_RGB16; + case PixelFormat::PIX_FMT_RGBA16U: + return GL_RGBA16; + case PixelFormat::PIX_FMT_RGB16F: + return GL_RGB16F; + case PixelFormat::PIX_FMT_RGBA16F: + return GL_RGBA16F; + case PixelFormat::PIX_FMT_RGB32F: + return GL_RGB32F; + case PixelFormat::PIX_FMT_RGBA32F: + return GL_RGBA32F; + + case PixelFormat::PIX_FMT_INVALID: + case PixelFormat::PIX_FMT_COUNT: + break; + } + + return GL_INVALID_VALUE; +} + +GLenum OpenGLContext::GetPixelFormat(PixelFormat::Format format) +{ + if (PixelFormat::FormatHasAlphaChannel(format)) { + return GL_RGBA; + } else { + return GL_RGB; + } +} + +GLenum OpenGLContext::GetPixelType(PixelFormat::Format format) +{ + switch (format) { + case PixelFormat::PIX_FMT_RGB8: + case PixelFormat::PIX_FMT_RGBA8: + return GL_UNSIGNED_BYTE; + case PixelFormat::PIX_FMT_RGB16U: + case PixelFormat::PIX_FMT_RGBA16U: + return GL_UNSIGNED_SHORT; + case PixelFormat::PIX_FMT_RGB16F: + case PixelFormat::PIX_FMT_RGBA16F: + return GL_HALF_FLOAT; + case PixelFormat::PIX_FMT_RGB32F: + case PixelFormat::PIX_FMT_RGBA32F: + return GL_FLOAT; + + case PixelFormat::PIX_FMT_INVALID: + case PixelFormat::PIX_FMT_COUNT: + break; + } + + return GL_INVALID_VALUE; +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglcontext.h b/app/render/backend/opengl/openglcontext.h new file mode 100644 index 000000000..9c56f428f --- /dev/null +++ b/app/render/backend/opengl/openglcontext.h @@ -0,0 +1,76 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef OPENGLCONTEXT_H +#define OPENGLCONTEXT_H + +#include +#include +#include + +#include "render/backend/rendercontext.h" + +OLIVE_NAMESPACE_ENTER + +class OpenGLContext : public RenderContext +{ + Q_OBJECT +public: + OpenGLContext(QObject* parent = nullptr); + + virtual ~OpenGLContext() override; + + virtual bool Init() override; + +public slots: + virtual void PostInit() override; + + virtual void Destroy() override; + + virtual QVariant CreateTexture(const VideoParams& param, void* data, int linesize) override; + + virtual void DestroyTexture(QVariant texture) override; + + virtual void UploadToTexture(QVariant texture, void* data, int linesize) override; + + virtual void DownloadFromTexture(QVariant texture, void* data, int linesize) override; + + virtual VideoParams GetParamsFromTexture(QVariant texture) override; + +private: + static GLint GetInternalFormat(PixelFormat::Format format); + + static GLenum GetPixelFormat(PixelFormat::Format format); + + static GLenum GetPixelType(PixelFormat::Format format); + + QOpenGLContext* context_; + + QOpenGLFunctions* functions_; + + QOffscreenSurface surface_; + + QMap texture_params_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // OPENGLCONTEXT_H diff --git a/app/render/backend/opengl/openglframebuffer.cpp b/app/render/backend/opengl/openglframebuffer.cpp deleted file mode 100644 index e31ce50b3..000000000 --- a/app/render/backend/opengl/openglframebuffer.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "openglframebuffer.h" - -#include -#include - -OLIVE_NAMESPACE_ENTER - -OpenGLFramebuffer::OpenGLFramebuffer() : - context_(nullptr), - buffer_(0), - texture_(nullptr) -{ -} - -OpenGLFramebuffer::~OpenGLFramebuffer() -{ - Destroy(); -} - -void OpenGLFramebuffer::Create(QOpenGLContext *ctx) -{ - if (ctx == nullptr) { - qWarning() << "OpenGLFramebuffer::Create was passed an invalid context"; - return; - } - - // Free any previous framebuffer - Destroy(); - - context_ = ctx; - - connect(context_, &QOpenGLContext::aboutToBeDestroyed, this, &OpenGLFramebuffer::Destroy); - - // Create framebuffer object - context_->functions()->glGenFramebuffers(1, &buffer_); -} - -void OpenGLFramebuffer::Destroy() -{ - if (context_ != nullptr) { - disconnect(context_, &QOpenGLContext::aboutToBeDestroyed, this, &OpenGLFramebuffer::Destroy); - - context_->functions()->glDeleteFramebuffers(1, &buffer_); - - buffer_ = 0; - - context_ = nullptr; - } -} - -bool OpenGLFramebuffer::IsCreated() const -{ - return (buffer_ > 0); -} - -void OpenGLFramebuffer::Bind() -{ - if (context_ == nullptr) { - return; - } - context_->functions()->glBindFramebuffer(GL_FRAMEBUFFER, buffer_); -} - -void OpenGLFramebuffer::Release() -{ - if (context_ == nullptr) { - return; - } - context_->functions()->glBindFramebuffer(GL_FRAMEBUFFER, 0); -} - -void OpenGLFramebuffer::Attach(OpenGLTexture *texture, bool clear) -{ - if (context_ == nullptr) { - return; - } - - Detach(); - - texture_ = texture; - - QOpenGLFunctions* f = context_->functions(); - - // bind framebuffer for attaching - f->glBindFramebuffer(GL_FRAMEBUFFER, buffer_); - - context_->extraFunctions()->glFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_->texture(), 0 - ); - - if (clear) { - context_->functions()->glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - context_->functions()->glClear(GL_COLOR_BUFFER_BIT); - } - - // release framebuffer - f->glBindFramebuffer(GL_FRAMEBUFFER, 0); -} - -void OpenGLFramebuffer::Attach(OpenGLTexturePtr texture, bool clear) -{ - Attach(texture.get(), clear); -} - -void OpenGLFramebuffer::Detach() -{ - if (context_ == nullptr) { - return; - } - - if (texture_) { - QOpenGLFunctions* f = context_->functions(); - - // bind framebuffer for attaching - f->glBindFramebuffer(GL_FRAMEBUFFER, buffer_); - - context_->extraFunctions()->glFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0 - ); - - // release framebuffer - f->glBindFramebuffer(GL_FRAMEBUFFER, 0); - - texture_ = nullptr; - } -} - -const GLuint &OpenGLFramebuffer::buffer() const -{ - return buffer_; -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglframebuffer.h b/app/render/backend/opengl/openglframebuffer.h deleted file mode 100644 index e7d8de9b4..000000000 --- a/app/render/backend/opengl/openglframebuffer.h +++ /dev/null @@ -1,65 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLFRAMEBUFFER_H -#define OPENGLFRAMEBUFFER_H - -#include - -#include "opengltexture.h" - -OLIVE_NAMESPACE_ENTER - -class OpenGLFramebuffer : public QObject -{ - Q_OBJECT -public: - OpenGLFramebuffer(); - virtual ~OpenGLFramebuffer() override; - - void Create(QOpenGLContext *ctx); - - bool IsCreated() const; - - void Bind(); - - void Release(); - - void Attach(OpenGLTexture* texture, bool clear = false); - void Attach(OpenGLTexturePtr texture, bool clear = false); - - void Detach(); - - const GLuint& buffer() const; - -public slots: - void Destroy(); - -private: - QOpenGLContext* context_; - - GLuint buffer_; - - OpenGLTexture* texture_; -}; - -OLIVE_NAMESPACE_EXIT - -#endif // OPENGLFRAMEBUFFER_H diff --git a/app/render/backend/opengl/openglproxy.cpp b/app/render/backend/opengl/openglproxy.cpp deleted file mode 100644 index 1db21e0b3..000000000 --- a/app/render/backend/opengl/openglproxy.cpp +++ /dev/null @@ -1,567 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "openglproxy.h" - -#include - -#include "common/clamp.h" -#include "core.h" -#include "node/block/transition/transition.h" -#include "node/node.h" -#include "openglcolorprocessor.h" -#include "openglrenderfunctions.h" -#include "render/colormanager.h" -#include "render/pixelformat.h" - -OLIVE_NAMESPACE_ENTER - -OpenGLProxy* OpenGLProxy::instance_ = nullptr; - -OpenGLProxy::OpenGLProxy(QObject *parent) : - QObject(parent), - ctx_(nullptr), - functions_(nullptr) -{ - surface_.create(); -} - -OpenGLProxy::~OpenGLProxy() -{ - Close(); - - surface_.destroy(); -} - -void OpenGLProxy::CreateInstance() -{ - instance_ = new OpenGLProxy(); - - QThread* proxy_thread = new QThread(); - proxy_thread->start(QThread::IdlePriority); - instance_->moveToThread(proxy_thread); - - if (!instance_->Init()) { - DestroyInstance(); - } -} - -void OpenGLProxy::DestroyInstance() -{ - if (instance_) { - instance_->thread()->quit(); - instance_->thread()->wait(); - instance_->thread()->deleteLater(); - instance_->deleteLater(); - instance_ = nullptr; - } -} - -bool OpenGLProxy::Init() -{ - // Create context object - ctx_ = new QOpenGLContext(); - - // Create OpenGL context (automatically destroys any existing if there is one) - if (!ctx_->create()) { - qWarning() << "Failed to create OpenGL context in thread" << thread(); - return false; - } - - ctx_->moveToThread(this->thread()); - - // The rest of the initialization needs to occur in the other thread, so we signal for it to start - QMetaObject::invokeMethod(this, "FinishInit", Qt::QueuedConnection); - - return true; -} - -QVariant OpenGLProxy::FrameToValue(FramePtr frame, StreamPtr stream, const VideoParams& params, const RenderMode::Mode& mode) -{ - VideoStreamPtr video_stream = std::static_pointer_cast(stream); - - // Set up OCIO context - QString colorspace_match = video_stream->get_colorspace_match_string(); - - OpenGLColorProcessorPtr color_processor = std::static_pointer_cast(color_cache_.value(colorspace_match)); - - if (!color_processor) { - color_processor = OpenGLColorProcessor::Create(video_stream->footage()->project()->color_manager(), - video_stream->colorspace(), - video_stream->footage()->project()->color_manager()->GetReferenceColorSpace()); - color_cache_.insert(colorspace_match, color_processor); - } - - ColorManager::OCIOMethod ocio_method = ColorManager::GetOCIOMethodForMode(mode); - - // OCIO's CPU conversion is more accurate, so for online we render on CPU but offline we render GPU - if (ocio_method == ColorManager::kOCIOAccurate) { - bool has_alpha = PixelFormat::FormatHasAlphaChannel(frame->format()); - - // Convert frame to float for OCIO - frame = PixelFormat::ConvertPixelFormat(frame, - has_alpha - ? PixelFormat::PIX_FMT_RGBA32F - : PixelFormat::PIX_FMT_RGB32F); - - // If alpha is associated, disassociate for the color transform - if (has_alpha && video_stream->premultiplied_alpha()) { - ColorManager::DisassociateAlpha(frame); - } - - // Perform color transform - color_processor->ConvertFrame(frame); - - // Associate alpha - if (has_alpha) { - if (video_stream->premultiplied_alpha()) { - ColorManager::ReassociateAlpha(frame); - } else { - ColorManager::AssociateAlpha(frame); - } - } - } - - OpenGLTextureCache::ReferencePtr footage_tex_ref = texture_cache_.Get(ctx_, frame); - - if (ocio_method == ColorManager::kOCIOFast) { - if (!color_processor->IsEnabled()) { - color_processor->Enable(ctx_, video_stream->premultiplied_alpha()); - } - - VideoParams frame_params = frame->video_params(); - - PixelFormat::Format texture_fmt; - if (PixelFormat::FormatHasAlphaChannel(frame_params.format())) { - texture_fmt = PixelFormat::GetFormatWithAlphaChannel(params.format()); - } else { - texture_fmt = PixelFormat::GetFormatWithoutAlphaChannel(params.format()); - } - - VideoParams dest_params(frame_params.width(), - frame_params.height(), - texture_fmt, - frame_params.pixel_aspect_ratio(), - frame_params.interlacing(), - frame_params.divider()); - - // Create destination texture - OpenGLTextureCache::ReferencePtr associated_tex_ref = texture_cache_.Get(ctx_, dest_params); - - buffer_.Attach(associated_tex_ref->texture(), true); - buffer_.Bind(); - footage_tex_ref->texture()->Bind(); - - // Set viewport for texture size - functions_->glViewport(0, 0, associated_tex_ref->texture()->width(), associated_tex_ref->texture()->height()); - - // Blit old texture to new texture through OCIO shader - color_processor->ProcessOpenGL(); - - footage_tex_ref->texture()->Release(); - buffer_.Release(); - buffer_.Detach(); - - footage_tex_ref = associated_tex_ref; - } - - return QVariant::fromValue(footage_tex_ref); -} - -QVariant OpenGLProxy::PreCachedFrameToValue(FramePtr frame) -{ - return QVariant::fromValue(texture_cache_.Get(ctx_, frame)); -} - -OpenGLShaderPtr OpenGLProxy::ResolveShaderFromCache(const Node *node, const QString &shader_id) -{ - // Make a composite of the node ID and the shader ID (if applicable) - QString full_shader_id = QStringLiteral("%1:%2").arg(node->id(), shader_id); - OpenGLShaderPtr shader = shader_cache_.value(full_shader_id); - - if (!shader) { - // Since we have shader code, compile it now - ShaderCode code = node->GetShaderCode(shader_id); - QString vert_code = code.vert_code(); - QString frag_code = code.frag_code(); - - if (frag_code.isEmpty() && vert_code.isEmpty()) { - qWarning() << "No shader code found for" << node->id() << "- operation will be a no-op"; - } - - if (frag_code.isEmpty()) { - frag_code = OpenGLShader::CodeDefaultFragment(); - } - - if (vert_code.isEmpty()) { - vert_code = OpenGLShader::CodeDefaultVertex(); - } - - shader = OpenGLShader::Create(); - if (shader - && shader->create() - && shader->addShaderFromSourceCode(QOpenGLShader::Fragment, frag_code) - && shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vert_code) - && shader->link()) { - shader_cache_.insert(full_shader_id, shader); - } else { - qWarning() << "Failed to compile shader for" << node->id(); - shader = nullptr; - } - } - - return shader; -} - -void OpenGLProxy::Close() -{ - shader_cache_.clear(); - buffer_.Destroy(); - copy_pipeline_ = nullptr; - functions_ = nullptr; - delete ctx_; - ctx_ = nullptr; -} - -QVariant OpenGLProxy::RunNodeAccelerated(const Node *node, - const TimeRange &range, - const ShaderJob &job, - const VideoParams& params) -{ - // If this node is iterative, we'll pick up which input here - GLuint iterative_input = 0; - QList textures_to_bind; - bool input_textures_have_alpha = false; - - OpenGLShaderPtr shader = ResolveShaderFromCache(node, job.GetShaderID()); - - if (!shader) { - return QVariant(); - } - - shader->bind(); - - NodeValueMap::const_iterator it; - for (it=job.GetValues().constBegin(); it!=job.GetValues().constEnd(); it++) { - // See if the shader has takes this parameter as an input - int variable_location = shader->uniformLocation(it.key()); - - if (variable_location == -1) { - continue; - } - - // See if this value corresponds to an input (NOTE: it may not and this may be null) - NodeInput* corresponding_input = node->GetInputWithID(it.key()); - - // This variable is used in the shader, let's set it - const QVariant& value = it.value().data(); - - NodeParam::DataType data_type = (it.value().type() != NodeParam::kNone) - ? it.value().type() - : corresponding_input->data_type(); - - switch (data_type) { - case NodeInput::kInt: - // kInt technically specifies a LongLong, but OpenGL doesn't support those. This may lead to - // over/underflows if the number is large enough, but the likelihood of that is quite low. - shader->setUniformValue(variable_location, value.toInt()); - break; - case NodeInput::kFloat: - // kFloat technically specifies a double but as above, OpenGL doesn't support those. - shader->setUniformValue(variable_location, value.toFloat()); - break; - case NodeInput::kVec2: - if (corresponding_input && corresponding_input->IsArray()) { - QVector nv = value.value< QVector >(); - QVector a(nv.size()); - - for (int j=0;j(); - } - - shader->setUniformValueArray(variable_location, a.constData(), a.size()); - - int count_location = shader->uniformLocation(QStringLiteral("%1_count").arg(it.key())); - if (count_location > -1) { - shader->setUniformValue(count_location, a.size()); - } - } else { - shader->setUniformValue(variable_location, value.value()); - } - break; - case NodeInput::kVec3: - shader->setUniformValue(variable_location, value.value()); - break; - case NodeInput::kVec4: - shader->setUniformValue(variable_location, value.value()); - break; - case NodeInput::kMatrix: - shader->setUniformValue(variable_location, value.value()); - break; - case NodeInput::kCombo: - shader->setUniformValue(variable_location, value.value()); - break; - case NodeInput::kColor: - { - Color color = value.value(); - - shader->setUniformValue(variable_location, color.red(), color.green(), color.blue(), color.alpha()); - break; - } - case NodeInput::kBoolean: - shader->setUniformValue(variable_location, value.toBool()); - break; - case NodeInput::kBuffer: - case NodeInput::kTexture: - { - OpenGLTextureCache::ReferencePtr texture = value.value(); - - if (texture) { - if (PixelFormat::FormatHasAlphaChannel(texture->texture()->format())) { - input_textures_have_alpha = true; - } - } - - // Set value to bound texture - shader->setUniformValue(variable_location, textures_to_bind.size()); - - // If this texture binding is the iterative input, set it here - if (corresponding_input && corresponding_input == job.GetIterativeInput()) { - iterative_input = textures_to_bind.size(); - } - - GLuint tex_id = texture ? texture->texture()->texture() : 0; - textures_to_bind.append(tex_id); - - // Set enable flag if shader wants it - int enable_param_location = shader->uniformLocation(QStringLiteral("%1_enabled").arg(it.key())); - if (enable_param_location > -1) { - shader->setUniformValue(enable_param_location, - tex_id > 0); - } - - if (tex_id > 0) { - // Set texture resolution if shader wants it - int res_param_location = shader->uniformLocation(QStringLiteral("%1_resolution").arg(it.key())); - if (res_param_location > -1) { - int adjusted_width = texture->texture()->width() * texture->texture()->divider(); - - // Adjust virtual width by pixel aspect if necessary - if (texture->texture()->params().pixel_aspect_ratio() != 1 - || params.pixel_aspect_ratio() != 1) { - double relative_pixel_aspect = texture->texture()->params().pixel_aspect_ratio().toDouble() / params.pixel_aspect_ratio().toDouble(); - - adjusted_width = qRound(static_cast(adjusted_width) * relative_pixel_aspect); - } - - shader->setUniformValue(res_param_location, - adjusted_width, - static_cast(texture->texture()->height() * texture->texture()->divider())); - } - } - break; - } - case NodeInput::kSamples: - case NodeInput::kText: - case NodeInput::kRational: - case NodeInput::kFont: - case NodeInput::kFile: - case NodeInput::kDecimal: - case NodeInput::kNumber: - case NodeInput::kString: - case NodeInput::kVector: - case NodeInput::kShaderJob: - case NodeInput::kSampleJob: - case NodeInput::kGenerateJob: - case NodeInput::kFootage: - case NodeInput::kNone: - case NodeInput::kAny: - break; - } - } - - // Provide some standard args - shader->setUniformValue("ove_resolution", - static_cast(params.width()), - static_cast(params.height())); - - shader->release(); - - // Create the output textures - PixelFormat::Format output_format = (input_textures_have_alpha || job.GetAlphaChannelRequired()) - ? PixelFormat::GetFormatWithAlphaChannel(params.format()) - : PixelFormat::GetFormatWithoutAlphaChannel(params.format()); - VideoParams output_params(params.width(), - params.height(), - params.time_base(), - output_format, - params.pixel_aspect_ratio(), - params.interlacing(), - params.divider()); - - int real_iteration_count; - if (job.GetIterationCount() > 1 && job.GetIterativeInput()) { - real_iteration_count = job.GetIterationCount(); - } else { - real_iteration_count = 1; - } - - OpenGLTextureCache::ReferencePtr dst_refs[2]; - dst_refs[0] = texture_cache_.Get(ctx_, output_params); - - // If this node requires multiple iterations, get a texture for it too - if (real_iteration_count > 1) { - dst_refs[1] = texture_cache_.Get(ctx_, output_params); - } - - // Some nodes use multiple iterations for optimization - OpenGLTextureCache::ReferencePtr input_tex, output_tex; - - // Set up OpenGL parameters as necessary - functions_->glViewport(0, 0, params.effective_width(), params.effective_height()); - - // Bind all textures - for (int i=0; iglActiveTexture(GL_TEXTURE0 + i); - functions_->glBindTexture(GL_TEXTURE_2D, textures_to_bind.at(i)); - OpenGLRenderFunctions::PrepareToDraw(functions_); - } - - for (int iteration=0; iterationbind(); - shader->setUniformValue("ove_iteration", iteration); - shader->release(); - - // Replace iterative input - if (iteration == 0) { - output_tex = dst_refs[0]; - } else { - input_tex = dst_refs[(iteration+1)%2]; - output_tex = dst_refs[iteration%2]; - - functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); - functions_->glBindTexture(GL_TEXTURE_2D, input_tex->texture()->texture()); - OpenGLRenderFunctions::PrepareToDraw(functions_); - } - - buffer_.Attach(output_tex->texture(), true); - buffer_.Bind(); - - // Blit this texture through this shader - OpenGLRenderFunctions::Blit(shader); - - buffer_.Release(); - buffer_.Detach(); - } - - // Release any textures we bound before - for (int i=textures_to_bind.size()-1; i>=0; i--) { - functions_->glActiveTexture(GL_TEXTURE0 + i); - functions_->glBindTexture(GL_TEXTURE_2D, 0); - } - - return QVariant::fromValue(output_tex); -} - -void OpenGLProxy::TextureToBuffer(const QVariant& tex_in, - FramePtr frame, - const QMatrix4x4& matrix) -{ - OpenGLTextureCache::ReferencePtr texture = tex_in.value(); - - if (!texture) { - return; - } - - OpenGLTextureCache::ReferencePtr download_tex; - - if (!frame->is_allocated()) { - // If the frame isn't allocated, we'll assume that we're allocating it to the texture dimensions - frame->set_video_params(texture->texture()->params()); - frame->allocate(); - } - - functions_->glViewport(0, 0, frame->width(), frame->height()); - - if (frame->width() != texture->texture()->width() - || frame->height() != texture->texture()->height()) { - - // Resize the texture if necessary - OpenGLTextureCache::ReferencePtr resized = texture_cache_.Get(ctx_, frame->video_params()); - - buffer_.Attach(resized->texture(), true); - buffer_.Bind(); - - texture->texture()->Bind(); - - // Blit to this new texture - OpenGLRenderFunctions::Blit(copy_pipeline_, false, matrix); - - texture->texture()->Release(); - - buffer_.Release(); - buffer_.Detach(); - - download_tex = resized; - - } else { - - download_tex = texture; - - } - - buffer_.Attach(download_tex->texture()); - buffer_.Bind(); - - functions_->glPixelStorei(GL_PACK_ROW_LENGTH, frame->linesize_pixels()); - - functions_->glReadPixels(0, - 0, - frame->width(), - frame->height(), - OpenGLRenderFunctions::GetPixelFormat(frame->format()), - OpenGLRenderFunctions::GetPixelType(frame->format()), - frame->data()); - - functions_->glPixelStorei(GL_PACK_ROW_LENGTH, 0); - - buffer_.Release(); - buffer_.Detach(); -} - -void OpenGLProxy::FinishInit() -{ - // Make context current on that surface - if (!ctx_->makeCurrent(&surface_)) { - qWarning() << "Failed to makeCurrent() on offscreen surface in thread" << thread(); - return; - } - - // Store OpenGL functions instance - functions_ = ctx_->functions(); - functions_->glBlendFunc(GL_ONE, GL_ZERO); - - buffer_.Create(ctx_); - - copy_pipeline_ = OpenGLShader::CreateDefault(); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglproxy.h b/app/render/backend/opengl/openglproxy.h deleted file mode 100644 index ff59f76b9..000000000 --- a/app/render/backend/opengl/openglproxy.h +++ /dev/null @@ -1,122 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLPROXY_H -#define OPENGLPROXY_H - -#include -#include - -#include "common/timerange.h" -#include "node/value.h" -#include "openglcolorprocessor.h" -#include "openglframebuffer.h" -#include "opengltexturecache.h" -#include "render/shaderinfo.h" - -OLIVE_NAMESPACE_ENTER - -class OpenGLProxy : public QObject -{ - Q_OBJECT -public: - OpenGLProxy(QObject* parent = nullptr); - - virtual ~OpenGLProxy() override; - - static void CreateInstance(); - - static void DestroyInstance(); - - static OpenGLProxy* instance() - { - return instance_; - } - - /** - * @brief Initialize OpenGL instance in whatever thread this object is a part of - * - * This function creates a context (shared with share_ctx provided in the constructor) as well as various other - * OpenGL thread-specific objects necessary for rendering. This function should only ever be called from the main - * thread (i.e. the thread where share_ctx is current on) but AFTER this object has been pushed to its thread with - * moveToThread(). If this function is called from a different thread, it could fail or even segfault on some - * platforms. - * - * The reason this function must be called in the main thread (rather than initializing asynchronously in a separate - * thread) is because different platforms have different rules about creating a share context with a context that - * is still "current" in another thread. While some implementations do allow this, Windows OpenGL (wgl) explicitly - * forbids it and other platforms/drivers will segfault attempting it. While we can obviously call "doneCurrent", I - * haven't found any reliable way to prevent the main thread from making it current again before initialization is - * complete other than blocking it entirely. - * - * To get around this, we create all share contexts in the main thread and then move them to the other thread - * afterwards (which is completely legal). While annoying, this gets around the issue listed above by both preventing - * the main thread from using the context during initialization and preventing more than one shared context being made - * at the same time (which may or may not actually make a difference). - */ - bool Init(); - - void Close(); - -public slots: - QVariant RunNodeAccelerated(const OLIVE_NAMESPACE::Node *node, - const OLIVE_NAMESPACE::TimeRange &range, - const OLIVE_NAMESPACE::ShaderJob &job, - const OLIVE_NAMESPACE::VideoParams ¶ms); - - void TextureToBuffer(const QVariant& texture, - OLIVE_NAMESPACE::FramePtr frame, - const QMatrix4x4& matrix); - - QVariant FrameToValue(OLIVE_NAMESPACE::FramePtr frame, - OLIVE_NAMESPACE::StreamPtr stream, - const OLIVE_NAMESPACE::VideoParams ¶ms, - const OLIVE_NAMESPACE::RenderMode::Mode &mode); - - QVariant PreCachedFrameToValue(OLIVE_NAMESPACE::FramePtr frame); - -private: - OpenGLShaderPtr ResolveShaderFromCache(const Node* node, const QString &shader_id); - - QOpenGLContext* ctx_; - QOffscreenSurface surface_; - - QOpenGLFunctions* functions_; - - OpenGLFramebuffer buffer_; - - OpenGLColorProcessorCache color_cache_; - - OpenGLShaderPtr copy_pipeline_; - - QHash shader_cache_; - - OpenGLTextureCache texture_cache_; - - static OpenGLProxy* instance_; - -private slots: - void FinishInit(); - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // OPENGLPROXY_H diff --git a/app/render/backend/opengl/openglrenderfunctions.cpp b/app/render/backend/opengl/openglrenderfunctions.cpp deleted file mode 100644 index fcdc36a64..000000000 --- a/app/render/backend/opengl/openglrenderfunctions.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "openglrenderfunctions.h" - -#include -#include -#include - -OLIVE_NAMESPACE_ENTER - -const QVector blit_vertices = { - -1.0f, -1.0f, 0.0f, - 1.0f, -1.0f, 0.0f, - 1.0f, 1.0f, 0.0f, - - -1.0f, -1.0f, 0.0f, - -1.0f, 1.0f, 0.0f, - 1.0f, 1.0f, 0.0f -}; - -const QVector blit_texcoords = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 1.0f, 1.0f, - - 0.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f -}; - -const QVector flipped_blit_texcoords = { - 0.0f, 1.0f, - 1.0f, 1.0f, - 1.0f, 0.0f, - - 0.0f, 1.0f, - 0.0f, 0.0f, - 1.0f, 0.0f -}; - -/** - * @brief Set up texture parameters and mipmap for drawing - * - * Internal function used just before drawing to allow mipmapped bilinear filtering when drawing textures small. - * - * @param f - * - * Currently active QOpenGLFunctions object (use context()->functions() if unsure). - */ -void OpenGLRenderFunctions::PrepareToDraw(QOpenGLFunctions* f) -{ - f->glGenerateMipmap(GL_TEXTURE_2D); - f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -} - -GLint OpenGLRenderFunctions::GetInternalFormat(const PixelFormat::Format &format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGB8: - return GL_RGB8; - case PixelFormat::PIX_FMT_RGBA8: - return GL_RGBA8; - case PixelFormat::PIX_FMT_RGB16U: - return GL_RGB16; - case PixelFormat::PIX_FMT_RGBA16U: - return GL_RGBA16; - case PixelFormat::PIX_FMT_RGB16F: - return GL_RGB16F; - case PixelFormat::PIX_FMT_RGBA16F: - return GL_RGBA16F; - case PixelFormat::PIX_FMT_RGB32F: - return GL_RGB32F; - case PixelFormat::PIX_FMT_RGBA32F: - return GL_RGBA32F; - - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return GL_INVALID_VALUE; -} - -GLenum OpenGLRenderFunctions::GetPixelFormat(const PixelFormat::Format &format) -{ - if (PixelFormat::FormatHasAlphaChannel(format)) { - return GL_RGBA; - } else { - return GL_RGB; - } -} - -GLenum OpenGLRenderFunctions::GetPixelType(const PixelFormat::Format &format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGB8: - case PixelFormat::PIX_FMT_RGBA8: - return GL_UNSIGNED_BYTE; - case PixelFormat::PIX_FMT_RGB16U: - case PixelFormat::PIX_FMT_RGBA16U: - return GL_UNSIGNED_SHORT; - case PixelFormat::PIX_FMT_RGB16F: - case PixelFormat::PIX_FMT_RGBA16F: - return GL_HALF_FLOAT; - case PixelFormat::PIX_FMT_RGB32F: - case PixelFormat::PIX_FMT_RGBA32F: - return GL_FLOAT; - - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return GL_INVALID_VALUE; -} - -void OpenGLRenderFunctions::Blit(OpenGLShaderPtr pipeline, bool flipped, QMatrix4x4 matrix) -{ - Blit(pipeline.get(), flipped, matrix); -} - -void OpenGLRenderFunctions::Blit(OpenGLShader *pipeline, bool flipped, QMatrix4x4 matrix) -{ - Blit(pipeline, - GL_TRIANGLES, - blit_vertices, - flipped ? flipped_blit_texcoords : blit_texcoords, - matrix); -} - -void OpenGLRenderFunctions::Blit(OpenGLShader *pipeline, GLenum mode, const QVector &vert, const QVector &tex, QMatrix4x4 matrix) -{ - QOpenGLFunctions* func = QOpenGLContext::currentContext()->functions(); - - PrepareToDraw(func); - - QOpenGLVertexArrayObject m_vao; - m_vao.create(); - m_vao.bind(); - - QOpenGLBuffer m_vbo; - m_vbo.create(); - m_vbo.bind(); - m_vbo.allocate(vert.constData(), vert.size() * sizeof(GLfloat)); - m_vbo.release(); - - QOpenGLBuffer m_vbo2; - m_vbo2.create(); - m_vbo2.bind(); - m_vbo2.allocate(tex.constData(), tex.size() * sizeof(GLfloat)); - m_vbo2.release(); - - pipeline->bind(); - - pipeline->setUniformValue("ove_mvpmat", matrix); - pipeline->setUniformValue("ove_maintex", 0); - - int vertex_location = pipeline->attributeLocation("a_position"); - m_vbo.bind(); - func->glEnableVertexAttribArray(vertex_location); - func->glVertexAttribPointer(vertex_location, 3, GL_FLOAT, GL_FALSE, 0, nullptr); - m_vbo.release(); - - int tex_location = pipeline->attributeLocation("a_texcoord"); - m_vbo2.bind(); - func->glEnableVertexAttribArray(tex_location); - func->glVertexAttribPointer(tex_location, 2, GL_FLOAT, GL_FALSE, 0, nullptr); - m_vbo2.release(); - - // (Size / 3) because we assume each GLfloat has an XYZ pair - func->glDrawArrays(mode, 0, blit_vertices.size() / 3); - - pipeline->release(); - - m_vbo2.destroy(); - m_vbo.destroy(); - m_vao.release(); - m_vao.destroy(); -} - -void OpenGLRenderFunctions::OCIOBlit(OpenGLShaderPtr pipeline, GLuint lut, bool flipped, QMatrix4x4 matrix) -{ - OCIOBlit(pipeline.get(), lut, flipped, matrix); -} - -void OpenGLRenderFunctions::OCIOBlit(OpenGLShader *pipeline, - GLuint lut, - bool flipped, - QMatrix4x4 matrix) -{ - QOpenGLContext* ctx = QOpenGLContext::currentContext(); - QOpenGLExtraFunctions* xf = ctx->extraFunctions(); - - xf->glActiveTexture(GL_TEXTURE1); - xf->glBindTexture(GL_TEXTURE_3D, lut); - xf->glActiveTexture(GL_TEXTURE0); - - pipeline->bind(); - - pipeline->setUniformValue("ove_ociolut", 1); - - Blit(pipeline, flipped, matrix); - - pipeline->release(); - - xf->glActiveTexture(GL_TEXTURE1); - xf->glBindTexture(GL_TEXTURE_3D, 0); - xf->glActiveTexture(GL_TEXTURE0); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglrenderfunctions.h b/app/render/backend/opengl/openglrenderfunctions.h deleted file mode 100644 index 7e31987f7..000000000 --- a/app/render/backend/opengl/openglrenderfunctions.h +++ /dev/null @@ -1,70 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLFUNCTIONS_H -#define OPENGLFUNCTIONS_H - -#include -#include -#include - -#include "openglshader.h" -#include "render/pixelformat.h" - -OLIVE_NAMESPACE_ENTER - -class OpenGLRenderFunctions { -public: - /** - * @brief Draw texture on screen - * - * @param pipeline - * - * Shader to use for the texture drawing - * - * @param flipped - * - * Draw the texture vertically flipped (defaults to FALSE) - * - * @param matrix - * - * Transformation matrix to use when drawing (defaults to no transform) - */ - static void Blit(OpenGLShaderPtr pipeline, bool flipped = false, QMatrix4x4 matrix = QMatrix4x4()); - static void Blit(OpenGLShader* pipeline, bool flipped = false, QMatrix4x4 matrix = QMatrix4x4()); - static void Blit(OpenGLShader* pipeline, GLenum mode, const QVector& vert, - const QVector& tex, QMatrix4x4 matrix = QMatrix4x4()); - - static void OCIOBlit(OpenGLShaderPtr pipeline, GLuint lut, bool flipped = false, QMatrix4x4 matrix = QMatrix4x4()); - static void OCIOBlit(OpenGLShader* pipeline, GLuint lut, bool flipped = false, QMatrix4x4 matrix = QMatrix4x4()); - - static void PrepareToDraw(QOpenGLFunctions* f); - - static GLint GetInternalFormat(const PixelFormat::Format& format); - - static GLenum GetPixelFormat(const PixelFormat::Format& format); - - static GLenum GetPixelType(const PixelFormat::Format& format); - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // OPENGLFUNCTIONS_H diff --git a/app/render/backend/opengl/openglshader.cpp b/app/render/backend/opengl/openglshader.cpp deleted file mode 100644 index 7e76f619a..000000000 --- a/app/render/backend/opengl/openglshader.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "openglshader.h" - -#include -OLIVE_NAMESPACE_ENTER - -OpenGLShaderPtr OpenGLShader::Create() -{ - return std::make_shared(); -} - -OpenGLShaderPtr OpenGLShader::CreateDefault(const QString &function_name, const QString &shader_code) -{ - OpenGLShaderPtr program = Create(); - - // Add shaders to program - program->addShaderFromSourceCode(QOpenGLShader::Vertex, CodeDefaultVertex()); - program->addShaderFromSourceCode(QOpenGLShader::Fragment, CodeDefaultFragment(function_name, shader_code)); - program->link(); - - return program; -} - -// copied from source code to OCIODisplay -const int OCIO_LUT3D_EDGE_SIZE = 64; - -// copied from source code to OCIODisplay, expanded from 3*LUT3D_EDGE_SIZE*LUT3D_EDGE_SIZE*LUT3D_EDGE_SIZE -const int OCIO_NUM_3D_ENTRIES = 3*OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE; - -OpenGLShaderPtr OpenGLShader::CreateOCIO(QOpenGLContext* ctx, - GLuint& lut_texture, - OCIO::ConstProcessorRcPtr processor, - bool alpha_is_associated) -{ - QOpenGLExtraFunctions* xf = ctx->extraFunctions(); - - // Set up shader description - OCIO::GpuShaderDesc shaderDesc; - const char* ocio_func_name = "OCIODisplay"; - shaderDesc.setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_3); - shaderDesc.setFunctionName(ocio_func_name); - shaderDesc.setLut3DEdgeLen(OCIO_LUT3D_EDGE_SIZE); - - // Compute LUT - std::vector ocio_lut_data(OCIO_NUM_3D_ENTRIES); - processor->getGpuLut3D(&ocio_lut_data[0], shaderDesc); - - // Create LUT texture - xf->glGenTextures(1, &lut_texture); - - // Bind LUT - xf->glActiveTexture(GL_TEXTURE1); - xf->glBindTexture(GL_TEXTURE_3D, lut_texture); - - // Set texture parameters - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - - // Allocate storage for texture - xf->glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16F, - OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, - 0, GL_RGB, GL_FLOAT, &ocio_lut_data[0]); - - // Create OCIO shader code - QString shader_text; - - // Workaround since OCIO doesn't support the GLSL version we use - shader_text.append(QStringLiteral("#define texture2D texture\n" - "#define texture3D texture\n")); - - // Append OCIO shader code - shader_text.append(processor->getGpuShaderText(shaderDesc)); - - QString shader_call; - - // Enforce alpha association - if (alpha_is_associated) { - - // If alpha is already associated, we'll need to disassociate and reassociate - shader_text.append("\n"); - - QString disassociate_func_name = "disassoc"; - shader_text.append(CodeAlphaDisassociate(disassociate_func_name)); - - QString reassociate_func_name = "reassoc"; - shader_text.append(CodeAlphaReassociate(reassociate_func_name)); - - // Make OCIO call pass through disassociate and reassociate function - shader_call = QStringLiteral("%3(%1(%2(col), ove_ociolut));").arg(ocio_func_name, - disassociate_func_name, - reassociate_func_name); - - } else { - - // If alpha is not already associated, we can just associate after OCIO - - // Add associate function - QString associate_func_name = "assoc"; - shader_text.append(CodeAlphaAssociate(associate_func_name)); - - // Make OCIO call pass through associate function - shader_call = QStringLiteral("%2(%1(col, ove_ociolut));").arg(ocio_func_name, associate_func_name); - - } - - // Add process() function, which GetPipeline() will call if specified - QString process_function_name = "process"; - shader_text.append(QStringLiteral("\n" - "uniform sampler3D ove_ociolut;\n" - "\n" - "vec4 %2(vec4 col) {\n" - " return %1\n" - "}\n").arg(shader_call, process_function_name)); - - - // Get pipeline-based shader to inject OCIO shader into - OpenGLShaderPtr shader = OpenGLShader::CreateDefault(process_function_name, shader_text); - - // Release LUT - xf->glBindTexture(GL_TEXTURE_3D, 0); - - xf->glActiveTexture(GL_TEXTURE0); - - return shader; -} - -QString OpenGLShader::CodeDefaultFragment(QString function_name, const QString &shader_code) -{ - // Create shader header - QString frag_code = QStringLiteral("#version 150\n" - "\n" - "#ifdef GL_ES\n" - "precision highp int;\n" - "precision highp float;\n" - "#endif\n" - "\n" - "uniform sampler2D ove_maintex;\n" - "uniform vec2 ove_resolution;\n" - "uniform bool ove_deinterlace;\n" - "\n" - "in vec2 ove_texcoord;\n" - "\n" - "out vec4 fragColor;\n" - "\n"); - - // Check if additional code was passed to this function, add it here - if (!function_name.isEmpty() && !shader_code.isEmpty()) { - - // If additional code was passed, add it and reference it in main(). - // - // The function in the additional code is expected to be `vec4 function_name(vec4 color)`. - // The texture coordinate can be acquired through `ove_texcoord`. - - frag_code.append(shader_code); - - } else { - - // No function to call - function_name = QString(); - - } - - // Our function_name arg will either resolve to the function added to this or to nothing, in - // which case they'll just be benign brackets. - frag_code.append(QStringLiteral("\n" - "void main() {\n" - " vec2 using_texcoord = ove_texcoord;\n" - " if (ove_deinterlace) {\n" - " // A very basic deinterlace that halves the vertical\n" - " // resolution and linearly interpolates the two fields\n" - " // by reading the texture coord between them.\n" - " float half_vert = round(ove_resolution.y / 2.0);\n" - " using_texcoord.y = (round(using_texcoord.y * half_vert) + 0.25) / half_vert;\n" - " }\n" - " vec4 color = %1(texture(ove_maintex, using_texcoord));\n" - " fragColor = color;\n" - "}\n").arg(function_name)); - - return frag_code; -} - -QString OpenGLShader::CodeDefaultVertex() -{ - // Generate vertex shader - return QStringLiteral("#version 150\n" - "\n" - "#ifdef GL_ES\n" - "precision highp int;\n" - "precision highp float;\n" - "#endif\n" - "\n" - "uniform mat4 ove_mvpmat;\n" - "\n" - "in vec4 a_position;\n" - "in vec2 a_texcoord;\n" - "\n" - "out vec2 ove_texcoord;\n" - "\n" - "void main() {\n" - " gl_Position = ove_mvpmat * a_position;\n" - " ove_texcoord = a_texcoord;\n" - "}\n"); -} - -QString OpenGLShader::CodeAlphaDisassociate(const QString &function_name) -{ - return QStringLiteral("vec4 %1(vec4 col) {\n" - " if (col.a > 0.0) {\n" - " return vec4(col.rgb / col.a, col.a);" - " }\n" - " return col;\n" - "}\n").arg(function_name); -} - -QString OpenGLShader::CodeAlphaReassociate(const QString &function_name) -{ - return QStringLiteral("vec4 %1(vec4 col) {\n" - " if (col.a > 0.0) {\n" - " return vec4(col.rgb * col.a, col.a);" - " }\n" - " return col;\n" - "}\n").arg(function_name); -} - -QString OpenGLShader::CodeAlphaAssociate(const QString &function_name) -{ - return QStringLiteral("vec4 %1(vec4 col) {\n" - " return vec4(col.rgb * col.a, col.a);\n" - "}\n").arg(function_name); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglshader.h b/app/render/backend/opengl/openglshader.h deleted file mode 100644 index 452dc3c3d..000000000 --- a/app/render/backend/opengl/openglshader.h +++ /dev/null @@ -1,65 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLSHADER_H -#define OPENGLSHADER_H - -#include -#include - -#include -namespace OCIO = OCIO_NAMESPACE::v1; - -#include "common/define.h" - -OLIVE_NAMESPACE_ENTER - -class OpenGLShader; -using OpenGLShaderPtr = std::shared_ptr; - -/** - * @brief A simple QOpenGLShaderProgram derivative with static functions for creating - */ -class OpenGLShader : public QOpenGLShaderProgram { -public: - OpenGLShader() = default; - - static OpenGLShaderPtr Create(); - - static OpenGLShaderPtr CreateDefault(const QString &function_name = QString(), - const QString &shader_code = QString()); - - static OpenGLShaderPtr CreateOCIO(QOpenGLContext* ctx, - GLuint& lut_texture, - OCIO::ConstProcessorRcPtr processor, - bool alpha_is_associated); - - static QString CodeDefaultFragment(QString function_name = QString(), - const QString &shader_code = QString()); - static QString CodeDefaultVertex(); - static QString CodeAlphaDisassociate(const QString& function_name); - static QString CodeAlphaReassociate(const QString& function_name); - static QString CodeAlphaAssociate(const QString& function_name); - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // OPENGLSHADER_H diff --git a/app/render/backend/opengl/opengltexture.cpp b/app/render/backend/opengl/opengltexture.cpp deleted file mode 100644 index 9954e863c..000000000 --- a/app/render/backend/opengl/opengltexture.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "opengltexture.h" - -#include -#include -#include - -#include "openglrenderfunctions.h" -#include "render/pixelformat.h" - -OLIVE_NAMESPACE_ENTER - -OpenGLTexture::OpenGLTexture() : - created_ctx_(nullptr), - texture_(0) -{ -} - -OpenGLTexture::~OpenGLTexture() -{ - Destroy(); -} - -bool OpenGLTexture::IsCreated() const -{ - return (texture_); -} - -void OpenGLTexture::Create(QOpenGLContext *ctx, const VideoParams ¶ms, const void* data, int linesize) -{ - if (!ctx) { - qWarning() << "OpenGLTexture::Create was passed an invalid context"; - return; - } - - Destroy(); - - created_ctx_ = ctx; - params_ = params; - - connect(created_ctx_, SIGNAL(aboutToBeDestroyed()), this, SLOT(Destroy()), Qt::DirectConnection); - - // Create main texture - CreateInternal(created_ctx_, &texture_, data, linesize); -} - -void OpenGLTexture::Create(QOpenGLContext *ctx, const VideoParams ¶ms) -{ - Create(ctx, params, nullptr, 0); -} - -void OpenGLTexture::Create(QOpenGLContext *ctx, FramePtr frame) -{ - Create(ctx, frame.get()); -} - -void OpenGLTexture::Create(QOpenGLContext *ctx, Frame *frame) -{ - Create(ctx, frame->video_params(), frame->data(), frame->linesize_pixels()); -} - -void OpenGLTexture::Destroy() -{ - if (created_ctx_) { - disconnect(created_ctx_, SIGNAL(aboutToBeDestroyed()), this, SLOT(Destroy())); - - created_ctx_->functions()->glDeleteTextures(1, &texture_); - texture_ = 0; - - created_ctx_ = nullptr; - } -} - -void OpenGLTexture::Bind() -{ - created_ctx_->functions()->glBindTexture(GL_TEXTURE_2D, texture_); -} - -void OpenGLTexture::Release() -{ - created_ctx_->functions()->glBindTexture(GL_TEXTURE_2D, 0); -} - -void OpenGLTexture::SetPixelAspectRatio(const rational &r) -{ - params_ = VideoParams(params_.width(), - params_.height(), - params_.time_base(), - params_.format(), - r, - params_.interlacing(), - params_.divider()); -} - -void OpenGLTexture::Upload(FramePtr frame) -{ - Upload(frame.get()); -} - -void OpenGLTexture::Upload(Frame *frame) -{ - Upload(frame->data(), frame->linesize_pixels()); -} - -void OpenGLTexture::Upload(const void *data, int linesize) -{ - if (!IsCreated()) { - qWarning() << "OpenGLTexture::Upload() called while it wasn't created"; - return; - } - - Bind(); - - created_ctx_->functions()->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); - - created_ctx_->functions()->glTexSubImage2D(GL_TEXTURE_2D, - 0, - 0, - 0, - width(), - height(), - OpenGLRenderFunctions::GetPixelFormat(format()), - OpenGLRenderFunctions::GetPixelType(format()), - data); - - created_ctx_->functions()->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - - Release(); -} - -void OpenGLTexture::CreateInternal(QOpenGLContext* create_ctx, GLuint* tex, const void *data, int linesize) -{ - QOpenGLFunctions* f = create_ctx->functions(); - - // Create texture - f->glGenTextures(1, tex); - - // Verify texture - if (texture_ == 0) { - qWarning() << "OpenGL texture creation failed"; - return; - } - - // Bind texture - f->glBindTexture(GL_TEXTURE_2D, *tex); - - // Set linesize - f->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); - - // Allocate storage for texture - f->glTexImage2D(GL_TEXTURE_2D, - 0, - OpenGLRenderFunctions::GetInternalFormat(format()), - width(), - height(), - 0, - OpenGLRenderFunctions::GetPixelFormat(format()), - OpenGLRenderFunctions::GetPixelType(format()), - data); - - // Return linesize to default - f->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - - // Set texture filtering to bilinear - f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - // Release texture - f->glBindTexture(GL_TEXTURE_2D, 0); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/opengltexture.h b/app/render/backend/opengl/opengltexture.h deleted file mode 100644 index 301383da9..000000000 --- a/app/render/backend/opengl/opengltexture.h +++ /dev/null @@ -1,118 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLTEXTURE_H -#define OPENGLTEXTURE_H - -#include -#include - -#include "codec/frame.h" -#include "render/pixelformat.h" - -OLIVE_NAMESPACE_ENTER - -/** - * @brief A class wrapper around an OpenGL texture - */ -class OpenGLTexture : public QObject -{ - Q_OBJECT -public: - OpenGLTexture(); - virtual ~OpenGLTexture() override; - - DISABLE_COPY_MOVE(OpenGLTexture) - - void Create(QOpenGLContext* ctx, const VideoParams& params, const void *data, int linesize); - void Create(QOpenGLContext* ctx, const VideoParams& params); - void Create(QOpenGLContext* ctx, FramePtr frame); - void Create(QOpenGLContext* ctx, Frame* frame); - - bool IsCreated() const; - - void Bind(); - - void Release(); - - const VideoParams& params() const - { - return params_; - } - - const int& width() const - { - return params_.effective_width(); - } - - const int& height() const - { - return params_.effective_height(); - } - - const PixelFormat::Format &format() const - { - return params_.format(); - } - - const GLuint& texture() const - { - return texture_; - } - - const int& divider() const - { - return params_.divider(); - } - - /** - * @brief Changes the pixel aspect ratio metadata of this textuer - * - * This metadata is important for our render pipeline, but we don't need to do any re-allocation - * to set it like we do with other VideoParam changes, so we provide a function to change only - * the PAR here. - */ - void SetPixelAspectRatio(const rational& r); - - void Upload(FramePtr frame); - void Upload(Frame* frame); - void Upload(const void *data, int linesize); - -public slots: - void Destroy(); - -private: - void CreateInternal(QOpenGLContext *create_ctx, GLuint *tex, const void *data, int linesize); - - QOpenGLContext* created_ctx_; - - GLuint texture_; - - VideoParams params_; - -}; - -using OpenGLTexturePtr = std::shared_ptr; - -OLIVE_NAMESPACE_EXIT - -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::OpenGLTexturePtr) - -#endif // OPENGLTEXTURE_H diff --git a/app/render/backend/opengl/opengltexturecache.cpp b/app/render/backend/opengl/opengltexturecache.cpp deleted file mode 100644 index e00fc8f42..000000000 --- a/app/render/backend/opengl/opengltexturecache.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "opengltexturecache.h" - -OLIVE_NAMESPACE_ENTER - -OpenGLTextureCache::~OpenGLTextureCache() -{ - foreach (Reference* ref, existing_references_) { - ref->ParentKilled(); - } -} - -OpenGLTextureCache::ReferencePtr OpenGLTextureCache::Get(QOpenGLContext *ctx, FramePtr frame) -{ - return Get(ctx, frame.get()); -} - -OpenGLTextureCache::ReferencePtr OpenGLTextureCache::Get(QOpenGLContext *ctx, Frame *frame) -{ - return Get(ctx, frame->video_params(), frame->data(), frame->linesize_pixels()); -} - -OpenGLTextureCache::ReferencePtr OpenGLTextureCache::Get(QOpenGLContext* ctx, const VideoParams ¶ms, const void *data, int linesize) -{ - OpenGLTexturePtr texture = nullptr; - - lock_.lock(); - - // Iterate through textures and see if we have one that matches these parameters - for (int i=0;iwidth() == params.effective_width() - && test->height() == params.effective_height() - && test->format() == params.format()) { - texture = test; - available_textures_.removeAt(i); - break; - } - } - - // If we didn't find a texture, we'll need to create one - if (!texture) { - texture = std::make_shared(); - texture->Create(ctx, params); - } - - texture->SetPixelAspectRatio(params.pixel_aspect_ratio()); - - ReferencePtr ref = std::make_shared(this, texture); - existing_references_.append(ref.get()); - - lock_.unlock(); - - if (data) { - texture->Upload(data, linesize); - } - - return ref; -} - -OpenGLTextureCache::ReferencePtr OpenGLTextureCache::Get(QOpenGLContext *ctx, const VideoParams ¶ms) -{ - return Get(ctx, params, nullptr, 0); -} - -void OpenGLTextureCache::Relinquish(OpenGLTextureCache::Reference *ref) -{ - OpenGLTexturePtr tex = ref->texture(); - - lock_.lock(); - - existing_references_.removeOne(ref); - available_textures_.append(tex); - - lock_.unlock(); -} - -OpenGLTextureCache::Reference::Reference(OpenGLTextureCache *parent, OpenGLTexturePtr texture) : - parent_(parent), - texture_(texture) -{ -} - -OpenGLTextureCache::Reference::~Reference() -{ - if (parent_) { - parent_->Relinquish(this); - } -} - -OpenGLTexturePtr OpenGLTextureCache::Reference::texture() -{ - return texture_; -} - -void OpenGLTextureCache::Reference::ParentKilled() -{ - parent_ = nullptr; -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/opengltexturecache.h b/app/render/backend/opengl/opengltexturecache.h deleted file mode 100644 index 276cdd150..000000000 --- a/app/render/backend/opengl/opengltexturecache.h +++ /dev/null @@ -1,80 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLTEXTURECACHE_H -#define OPENGLTEXTURECACHE_H - -#include - -#include "openglframebuffer.h" -#include "opengltexture.h" -#include "render/videoparams.h" - -OLIVE_NAMESPACE_ENTER - -class OpenGLTextureCache -{ -public: - class Reference { - public: - Reference(OpenGLTextureCache* parent, OpenGLTexturePtr texture); - ~Reference(); - - DISABLE_COPY_MOVE(Reference) - - OpenGLTexturePtr texture(); - - void ParentKilled(); - - private: - OpenGLTextureCache* parent_; - - OpenGLTexturePtr texture_; - }; - - using ReferencePtr = std::shared_ptr; - - OpenGLTextureCache() = default; - - ~OpenGLTextureCache(); - - DISABLE_COPY_MOVE(OpenGLTextureCache) - - ReferencePtr Get(QOpenGLContext *ctx, FramePtr frame); - ReferencePtr Get(QOpenGLContext *ctx, Frame* frame); - ReferencePtr Get(QOpenGLContext *ctx, const VideoParams& params, const void *data, int linesize); - ReferencePtr Get(QOpenGLContext *ctx, const VideoParams& params); - -private: - void Relinquish(Reference* ref); - - QMutex lock_; - - QList available_textures_; - - QList existing_references_; - -}; - -OLIVE_NAMESPACE_EXIT - -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::OpenGLTextureCache::ReferencePtr) - -#endif // OPENGLTEXTURECACHE_H diff --git a/app/render/backend/rendercontext.cpp b/app/render/backend/rendercontext.cpp index a9a4ce73e..2f07702a9 100644 --- a/app/render/backend/rendercontext.cpp +++ b/app/render/backend/rendercontext.cpp @@ -1,6 +1,36 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "rendercontext.h" -RenderContext::RenderContext() +OLIVE_NAMESPACE_ENTER + +RenderContext::RenderContext(QObject *parent) : + QObject(parent) { } + +QVariant RenderContext::CreateTexture(const VideoParams ¶m) +{ + return CreateTexture(param, nullptr, 0); +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/rendercontext.h b/app/render/backend/rendercontext.h index fc443507e..dba4a9e51 100644 --- a/app/render/backend/rendercontext.h +++ b/app/render/backend/rendercontext.h @@ -1,11 +1,65 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef RENDERCONTEXT_H #define RENDERCONTEXT_H +#include +#include -class RenderContext +#include "common/define.h" +#include "render/videoparams.h" + +OLIVE_NAMESPACE_ENTER + +class RenderContext : public QObject { + Q_OBJECT public: - RenderContext(); + RenderContext(QObject* parent = nullptr); + + virtual ~RenderContext() override; + + virtual bool Init() = 0; + +public slots: + virtual void PostInit() = 0; + + virtual void Destroy() = 0; + + virtual QVariant CreateTexture(const OLIVE_NAMESPACE::VideoParams& param, void* data, int linesize) = 0; + + virtual void DestroyTexture(QVariant texture) = 0; + + virtual void UploadToTexture(QVariant texture, void* data, int linesize) = 0; + + virtual void DownloadFromTexture(QVariant texture, void* data, int linesize) = 0; + + virtual QVariant CreateShader(); + + virtual VideoParams GetParamsFromTexture(QVariant texture) = 0; + + QVariant CreateTexture(const OLIVE_NAMESPACE::VideoParams& param); + }; +OLIVE_NAMESPACE_EXIT + #endif // RENDERCONTEXT_H diff --git a/app/render/backend/rendercontextthreadwrapper.cpp b/app/render/backend/rendercontextthreadwrapper.cpp new file mode 100644 index 000000000..397189809 --- /dev/null +++ b/app/render/backend/rendercontextthreadwrapper.cpp @@ -0,0 +1,107 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "rendercontextthreadwrapper.h" + +OLIVE_NAMESPACE_ENTER + +RenderContextThreadWrapper::RenderContextThreadWrapper(RenderContext *inner, QObject *parent) : + RenderContext(parent), + inner_(inner), + thread_(nullptr) +{ + inner_->setParent(this); +} + +bool RenderContextThreadWrapper::Init() +{ + // Create thread + QThread* thread = new QThread(this); + thread->start(QThread::IdlePriority); + + // Move context to thread + inner_->moveToThread(thread); + + // Init context in main thread + inner_->Init(); + + // Queue post-init in new thread + QMetaObject::invokeMethod(inner_, "PostInit", Qt::QueuedConnection); +} + +void RenderContextThreadWrapper::Destroy() +{ + if (thread_) { + QMetaObject::invokeMethod(inner_, "Destroy", Qt::QueuedConnection); + + thread_->quit(); + thread_->wait(); + delete thread_; + thread_ = nullptr; + } +} + +QVariant RenderContextThreadWrapper::CreateTexture(const VideoParams ¶m, void *data, int linesize) +{ + QVariant v; + + QMetaObject::invokeMethod(inner_, "CreateTexture", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QVariant, v), + OLIVE_NS_CONST_ARG(VideoParams&, param), + Q_ARG(void*, data), + Q_ARG(int, linesize)); + + return v; +} + +void RenderContextThreadWrapper::DestroyTexture(QVariant texture) +{ + QMetaObject::invokeMethod(inner_, "DestroyTexture", Qt::QueuedConnection, + Q_ARG(QVariant, texture)); +} + +void RenderContextThreadWrapper::UploadToTexture(QVariant texture, void *data, int linesize) +{ + QMetaObject::invokeMethod(inner_, "UploadToTexture", Qt::QueuedConnection, + Q_ARG(QVariant, texture), + Q_ARG(void*, data), + Q_ARG(int, linesize)); +} + +void RenderContextThreadWrapper::DownloadFromTexture(QVariant texture, void *data, int linesize) +{ + QMetaObject::invokeMethod(inner_, "DownloadFromTexture", Qt::QueuedConnection, + Q_ARG(QVariant, texture), + Q_ARG(void*, data), + Q_ARG(int, linesize)); +} + +VideoParams RenderContextThreadWrapper::GetParamsFromTexture(QVariant texture) +{ + VideoParams p; + + QMetaObject::invokeMethod(inner_, "GetParamsFromTexture", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(VideoParams, p), + Q_ARG(QVariant, texture)); + + return p; +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/rendercontextthreadwrapper.h b/app/render/backend/rendercontextthreadwrapper.h new file mode 100644 index 000000000..1a8a7f6c1 --- /dev/null +++ b/app/render/backend/rendercontextthreadwrapper.h @@ -0,0 +1,66 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef RENDERCONTEXTTHREADWRAPPER_H +#define RENDERCONTEXTTHREADWRAPPER_H + +#include + +#include "rendercontext.h" + +OLIVE_NAMESPACE_ENTER + +class RenderContextThreadWrapper : public RenderContext +{ +public: + RenderContextThreadWrapper(RenderContext* inner, QObject* parent = nullptr); + + virtual ~RenderContextThreadWrapper() override + { + Destroy(); + } + + virtual bool Init() override; + +public slots: + virtual void PostInit() override{} + + virtual void Destroy() override; + + virtual QVariant CreateTexture(const VideoParams& param, void* data, int linesize) override; + + virtual void DestroyTexture(QVariant texture) override; + + virtual void UploadToTexture(QVariant texture, void* data, int linesize) override; + + virtual void DownloadFromTexture(QVariant texture, void* data, int linesize) override; + + virtual VideoParams GetParamsFromTexture(QVariant texture) override; + +private: + RenderContext* inner_; + + QThread* thread_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // RENDERCONTEXTTHREADWRAPPER_H diff --git a/app/render/backend/renderframebuffer.cpp b/app/render/backend/renderframebuffer.cpp deleted file mode 100644 index dd03c9d59..000000000 --- a/app/render/backend/renderframebuffer.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "renderframebuffer.h" - -RenderFrameBuffer::RenderFrameBuffer() -{ - -} diff --git a/app/render/backend/renderframebuffer.h b/app/render/backend/renderframebuffer.h deleted file mode 100644 index b4b928826..000000000 --- a/app/render/backend/renderframebuffer.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef RENDERFRAMEBUFFER_H -#define RENDERFRAMEBUFFER_H - - -class RenderFrameBuffer -{ -public: - RenderFrameBuffer(); -}; - -#endif // RENDERFRAMEBUFFER_H diff --git a/app/render/backend/rendershader.cpp b/app/render/backend/rendershader.cpp deleted file mode 100644 index a90f3a1e3..000000000 --- a/app/render/backend/rendershader.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "rendershader.h" - -RenderShader::RenderShader() -{ - -} diff --git a/app/render/backend/rendershader.h b/app/render/backend/rendershader.h deleted file mode 100644 index 63f5f97de..000000000 --- a/app/render/backend/rendershader.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef RENDERSHADER_H -#define RENDERSHADER_H - - -class RenderShader -{ -public: - RenderShader(); -}; - -#endif // RENDERSHADER_H diff --git a/app/render/backend/rendertexture.cpp b/app/render/backend/rendertexture.cpp deleted file mode 100644 index 0ba906451..000000000 --- a/app/render/backend/rendertexture.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "rendertexture.h" - -RenderTexture::RenderTexture(RenderContext *ctx) -{ - -} diff --git a/app/render/backend/rendertexture.h b/app/render/backend/rendertexture.h deleted file mode 100644 index 462ad26b9..000000000 --- a/app/render/backend/rendertexture.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef RENDERTEXTURE_H -#define RENDERTEXTURE_H - -#include "rendercontext.h" - -class RenderTexture -{ -public: - RenderTexture(RenderContext* ctx); -}; - -#endif // RENDERTEXTURE_H diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 8e31da39e..b0945e611 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -4,6 +4,7 @@ #include #include "render/rendermanager.h" +#include "render/renderprocessor.h" OLIVE_NAMESPACE_ENTER @@ -177,6 +178,35 @@ void PreviewAutoCacher::AudioRendered() viewer_node_->audio_playback_cache()->WritePCM(audio_tasks_.value(watcher), watcher->Get().value(), watcher->GetTicket()->GetJobTime()); + + // Retrieve visual waveforms + QVector waveform_list = watcher->GetTicket()->property("waveforms").value< QVector >(); + foreach (const RenderProcessor::RenderedWaveform& waveform_info, waveform_list) { + // Find original track + TrackOutput* track = nullptr; + + for (auto it=copy_map_.cbegin(); it!=copy_map_.cend(); it++) { + if (it.value() == waveform_info.track) { + track = static_cast(it.key()); + break; + } + } + + if (track) { + QList valid_ranges = viewer_node_->audio_playback_cache()->GetValidRanges(waveform_info.range, + watcher->GetTicket()->GetJobTime()); + if (!valid_ranges.isEmpty()) { + // Generate visual waveform in this background thread + track->waveform().set_channel_count(viewer_node_->audio_params().channel_count()); + + foreach (const TimeRange& r, valid_ranges) { + track->waveform().OverwriteSums(waveform_info.waveform, r.in(), r.in() - waveform_info.range.in(), r.length()); + } + + emit track->PreviewChanged(); + } + } + } } audio_tasks_.remove(watcher); diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 3c0ff4e26..546b90784 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -22,11 +22,14 @@ #include #include +#include #include #include "config/config.h" #include "core.h" -#include "render/backend/opengl/openglproxy.h" +#include "render/backend/opengl/openglcontext.h" +#include "render/backend/rendercontextthreadwrapper.h" +#include "renderprocessor.h" #include "task/conform/conform.h" #include "task/taskmanager.h" #include "window/mainwindow/mainwindow.h" @@ -38,13 +41,8 @@ RenderManager* RenderManager::instance_ = nullptr; RenderManager::RenderManager(QObject *parent) : ThreadPool(QThread::IdlePriority, 0, parent) { - // Initialize OpenGL service - OpenGLProxy::CreateInstance(); -} - -RenderManager::~RenderManager() -{ - OpenGLProxy::DestroyInstance(); + context_ = new RenderContextThreadWrapper(new OpenGLContext(), this); + context_->Init(); } QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const rational &time) @@ -63,13 +61,23 @@ QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const r return hasher.result(); } -RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, const rational &time, RenderMode::Mode mode, bool prioritize) +RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, const rational &time, RenderMode::Mode mode, bool prioritize) +{ + return RenderFrame(viewer, time, mode, + QSize(), + QMatrix4x4(), + prioritize); +} + +RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, const rational &time, RenderMode::Mode mode, const QSize &force_size, const QMatrix4x4 &matrix, bool prioritize) { // Create ticket RenderTicketPtr ticket = std::make_shared(); ticket->setProperty("viewer", Node::PtrToValue(viewer)); ticket->setProperty("time", QVariant::fromValue(time)); + ticket->setProperty("size", force_size); + ticket->setProperty("matrix", matrix); ticket->setProperty("mode", mode); ticket->setProperty("type", kTypeVideo); @@ -81,7 +89,7 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, const rational return ticket; } -RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange &r, bool prioritize) +RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange &r, bool generate_waveforms, bool prioritize) { // Create ticket RenderTicketPtr ticket = std::make_shared(); @@ -89,6 +97,7 @@ RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange ticket->setProperty("viewer", Node::PtrToValue(viewer)); ticket->setProperty("time", QVariant::fromValue(r)); ticket->setProperty("type", kTypeAudio); + ticket->setProperty("waveforms", generate_waveforms); // Queue appending the ticket and running the next job on our thread to make this function thread-safe QMetaObject::invokeMethod(this, "AddTicket", Qt::AutoConnection, @@ -118,84 +127,7 @@ RenderTicketPtr RenderManager::SaveFrameToCache(FrameHashCache *cache, FramePtr void RenderManager::RunTicket(RenderTicketPtr ticket) const { - // Depending on the render ticket type, start a job - TicketType type = ticket->property("type").value(); - - switch (type) { - case kTypeVideo: - RenderFrameInternal(ticket); - break; - case kTypeAudio: - RenderAudioInternal(ticket); - break; - case kTypeVideoDownload: - SaveFrameToCacheInternal(ticket); - break; - default: - // Fail - ticket->Cancel(); - } -} - -void RenderManager::RenderFrameInternal(RenderTicketPtr ticket) -{ - ViewerOutput* viewer = Node::ValueToPtr(ticket->property("viewer")); - rational time = ticket->property("time").value(); - - ticket->Start(); - - qDebug() << "STUB: Rendered" << time << "frames for" << viewer; - - FramePtr frame = Frame::Create(); - frame->set_video_params(viewer->video_params()); - frame->allocate(); - - ticket->Finish(QVariant::fromValue(frame), false); -} - -void RenderManager::RenderAudioInternal(RenderTicketPtr ticket) -{ - ViewerOutput* viewer = Node::ValueToPtr(ticket->property("viewer")); - TimeRange time = ticket->property("time").value(); - - ticket->Start(); - - qDebug() << "STUB: Rendered" << time << "audio for" << viewer; - - ticket->Finish(QVariant::fromValue(SampleBuffer::CreateAllocated(viewer->audio_params(), time.length())), false); -} - -void RenderManager::SaveFrameToCacheInternal(RenderTicketPtr ticket) -{ - FrameHashCache* cache = Node::ValueToPtr(ticket->property("cache")); - FramePtr frame = ticket->property("frame").value(); - QByteArray hash = ticket->property("hash").toByteArray(); - - ticket->Start(); - - ticket->Finish(cache->SaveCacheFrame(hash, frame), false); -} - -void RenderManager::WorkerGeneratedWaveform(RenderTicketPtr ticket, TrackOutput *track, AudioVisualWaveform samples, TimeRange range) -{ - ViewerOutput* viewer = Node::ValueToPtr(ticket->property("viewer")); - - QList valid_ranges = viewer->audio_playback_cache()->GetValidRanges(range, - ticket->GetJobTime()); - if (!valid_ranges.isEmpty()) { - // Generate visual waveform in this background thread - track->waveform_lock()->lock(); - - track->waveform().set_channel_count(viewer->audio_params().channel_count()); - - foreach (const TimeRange& r, valid_ranges) { - track->waveform().OverwriteSums(samples, r.in(), r.in() - range.in(), r.length()); - } - - track->waveform_lock()->unlock(); - - emit track->PreviewChanged(); - } + RenderProcessor::Process(ticket, context_); } OLIVE_NAMESPACE_EXIT diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 035bf7938..68e26905b 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -29,6 +29,8 @@ #include "decodercache.h" #include "node/graph.h" #include "node/output/viewer/viewer.h" +#include "node/traverser.h" +#include "render/backend/rendercontext.h" #include "threading/threadpool.h" OLIVE_NAMESPACE_ENTER @@ -78,6 +80,7 @@ public: * This function is thread-safe. */ RenderTicketPtr RenderFrame(ViewerOutput* viewer, const rational& time, RenderMode::Mode mode, bool prioritize = false); + RenderTicketPtr RenderFrame(ViewerOutput* viewer, const rational& time, RenderMode::Mode mode, const QSize& force_size, const QMatrix4x4& matrix, bool prioritize = false); /** * @brief Asynchronously generate a chunk of audio @@ -89,7 +92,7 @@ public: * * This function is thread-safe. */ - RenderTicketPtr RenderAudio(ViewerOutput* viewer, const TimeRange& r, bool prioritize = false); + RenderTicketPtr RenderAudio(ViewerOutput* viewer, const TimeRange& r, bool generate_waveforms, bool prioritize = false); RenderTicketPtr SaveFrameToCache(FrameHashCache* cache, FramePtr frame, const QByteArray& hash, bool prioritize = false); @@ -104,20 +107,11 @@ public: signals: private: - static void RenderFrameInternal(RenderTicketPtr ticket); - - static void RenderAudioInternal(RenderTicketPtr ticket); - - static void SaveFrameToCacheInternal(RenderTicketPtr ticket); - RenderManager(QObject* parent = nullptr); - virtual ~RenderManager() override; - static RenderManager* instance_; -private slots: - void WorkerGeneratedWaveform(OLIVE_NAMESPACE::RenderTicketPtr ticket, OLIVE_NAMESPACE::TrackOutput* track, OLIVE_NAMESPACE::AudioVisualWaveform samples, OLIVE_NAMESPACE::TimeRange range); + RenderContext* context_; }; diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp new file mode 100644 index 000000000..b3c354c05 --- /dev/null +++ b/app/render/renderprocessor.cpp @@ -0,0 +1,630 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "renderprocessor.h" + +#include "rendermanager.h" + +OLIVE_NAMESPACE_ENTER + +RenderProcessor::RenderProcessor(RenderTicketPtr ticket, RenderContext *render_ctx) : + ticket_(ticket), + render_ctx_(render_ctx) +{ +} + +void RenderProcessor::Run() +{ + // Depending on the render ticket type, start a job + RenderManager::TicketType type = ticket_->property("type").value(); + + ticket_->Start(); + + switch (type) { + case RenderManager::kTypeVideo: + { + ViewerOutput* viewer = Node::ValueToPtr(ticket_->property("viewer")); + rational time = ticket_->property("time").value(); + + NodeValueTable table = ProcessInput(viewer->texture_input(), + TimeRange(time, time + viewer->video_params().time_base())); + + QVariant texture = table.Get(NodeParam::kTexture); + + QSize frame_size = ticket_->property("size").value(); + if (frame_size.isNull()) { + frame_size = QSize(viewer->video_params().effective_width(), + viewer->video_params().effective_height()); + } + + FramePtr frame = Frame::Create(); + frame->set_timestamp(time); + frame->set_video_params(VideoParams(frame_size.width(), + frame_size.height(), + viewer->video_params().time_base(), + viewer->video_params().format(), + viewer->video_params().pixel_aspect_ratio(), + viewer->video_params().interlacing(), + viewer->video_params().divider())); + frame->allocate(); + + if (texture.isNull()) { + // Blank frame out + memset(frame->data(), 0, frame->allocated_size()); + } else { + // Dump texture contents to frame + VideoParams tex_params = render_ctx_->GetParamsFromTexture(texture); + + if (tex_params.width() != frame->width() || tex_params.height() != frame->height()) { + // FIXME: Blit this shit + } + + render_ctx_->DownloadFromTexture(texture, frame->data(), frame->linesize_pixels()); + } + + ticket_->Finish(QVariant::fromValue(frame), IsCancelled()); + break; + } + case RenderManager::kTypeAudio: + { + ViewerOutput* viewer = Node::ValueToPtr(ticket_->property("viewer")); + TimeRange time = ticket_->property("time").value(); + + NodeValueTable table = ProcessInput(viewer->samples_input(), time); + + ticket_->Finish(table.Get(NodeParam::kSamples), IsCancelled()); + break; + } + case RenderManager::kTypeVideoDownload: + { + FrameHashCache* cache = Node::ValueToPtr(ticket_->property("cache")); + FramePtr frame = ticket_->property("frame").value(); + QByteArray hash = ticket_->property("hash").toByteArray(); + + ticket_->Finish(cache->SaveCacheFrame(hash, frame), false); + break; + } + default: + // Fail + ticket_->Cancel(); + } + + this->deleteLater(); +} + +void RenderProcessor::Process(RenderTicketPtr ticket, RenderContext *render_ctx) +{ + RenderProcessor p(ticket, render_ctx); + p.Run(); +} + +NodeValueTable RenderProcessor::GenerateBlockTable(const TrackOutput *track, const TimeRange &range) +{ + if (track->track_type() == Timeline::kTrackTypeAudio) { + + const AudioParams& audio_params = Node::ValueToPtr(ticket_->property("viewer"))->audio_params(); + + QList active_blocks = track->BlocksAtTimeRange(range); + + // All these blocks will need to output to a buffer so we create one here + SampleBufferPtr block_range_buffer = SampleBuffer::CreateAllocated(audio_params, + audio_params.time_to_samples(range.length())); + block_range_buffer->fill(0); + + NodeValueTable merged_table; + + // Loop through active blocks retrieving their audio + foreach (Block* b, active_blocks) { + TimeRange range_for_block(qMax(b->in(), range.in()), + qMin(b->out(), range.out())); + + int destination_offset = audio_params.time_to_samples(range_for_block.in() - range.in()); + int max_dest_sz = audio_params.time_to_samples(range_for_block.length()); + + // Destination buffer + NodeValueTable table = GenerateTable(b, range_for_block); + SampleBufferPtr samples_from_this_block = table.Take(NodeParam::kSamples).value(); + + if (!samples_from_this_block) { + // If we retrieved no samples from this block, do nothing + continue; + } + + // FIXME: Doesn't handle reversing + if (b->speed_input()->is_keyframing() || b->speed_input()->is_connected()) { + // FIXME: We'll need to calculate the speed hoo boy + } else { + double speed_value = b->speed_input()->get_standard_value().toDouble(); + + if (qIsNull(speed_value)) { + // Just silence, don't think there's any other practical application of 0 speed audio + samples_from_this_block->fill(0); + } else if (!qFuzzyCompare(speed_value, 1.0)) { + // Multiply time + samples_from_this_block->speed(speed_value); + } + } + + int copy_length = qMin(max_dest_sz, samples_from_this_block->sample_count()); + + // Copy samples into destination buffer + block_range_buffer->set(samples_from_this_block->const_data(), destination_offset, copy_length); + + NodeValueTable::Merge({merged_table, table}); + } + + if (ticket_->property("waveforms").toBool()) { + // Generate a visual waveform and send it back to the main thread + AudioVisualWaveform visual_waveform; + visual_waveform.set_channel_count(audio_params.channel_count()); + visual_waveform.OverwriteSamples(block_range_buffer, audio_params.sample_rate()); + + RenderedWaveform waveform_info = {track, visual_waveform, range}; + QVector waveform_list = ticket_->property("waveforms").value< QVector >(); + waveform_list.append(waveform_info); + ticket_->setProperty("waveforms", QVariant::fromValue(waveform_list)); + } + + merged_table.Push(NodeParam::kSamples, QVariant::fromValue(block_range_buffer), track); + + return merged_table; + + } else { + return NodeTraverser::GenerateBlockTable(track, range); + } +} + +QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational &input_time) +{ + VideoStreamPtr video_stream = std::static_pointer_cast(stream); + rational time_match = (video_stream->video_type() == VideoStream::kVideoTypeStill) ? 0 : input_time; + QString colorspace_match = video_stream->get_colorspace_match_string(); + + QVariant value; + bool found_cache = false; + + const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); + + if (still_image_cache_.contains(stream.get())) { + const CachedStill& cs = still_image_cache_[stream.get()]; + + if (cs.colorspace == colorspace_match + && cs.alpha_is_associated == video_stream->premultiplied_alpha() + && cs.divider == video_params.divider() + && cs.time == time_match) { + value = cs.texture; + found_cache = true; + } else { + still_image_cache_.remove(stream.get()); + } + } + + if (!found_cache) { + + DecoderPtr decoder = ResolveDecoderFromInput(stream); + + if (decoder) { + FramePtr frame = decoder->RetrieveVideo(input_time, + video_params.divider()); + + if (frame) { + // Return a texture from the derived class + value = FootageFrameToTexture(stream, frame); + + if (!value.isNull()) { + // Put this into the image cache instead + still_image_cache_.insert(stream.get(), {value, + colorspace_match, + video_stream->premultiplied_alpha(), + video_params .divider(), + time_match}); + } + } + } + + } + + return value; +} + +QVariant RenderProcessor::ProcessAudioFootage(StreamPtr stream, const TimeRange &input_time) +{ + QVariant value; + + DecoderPtr decoder = ResolveDecoderFromInput(stream); + + if (decoder) { + const AudioParams& audio_params = Node::ValueToPtr(ticket_->property("viewer"))->audio_params(); + + // See if we have a conformed version of this audio + if (!decoder->HasConformedVersion(audio_params)) { + + // If not, the audio needs to be conformed + // For online rendering/export, it's a waste of time to render the audio until we have + // all we need, so we try to handle the conform ourselves + AudioStreamPtr as = std::static_pointer_cast(stream); + + // Check if any other threads are conforming this audio + if (as->try_start_conforming(audio_params)) { + + // If not, conform it ourselves + decoder->ConformAudio(&IsCancelled(), audio_params); + + } else { + + // If another thread is conforming already, hackily try to wait until it's done. + do { + QThread::msleep(1000); + } while (!as->has_conformed_version(audio_params) && !IsCancelled()); + + } + + } + + if (decoder->HasConformedVersion(audio_params)) { + SampleBufferPtr frame = decoder->RetrieveAudio(input_time.in(), input_time.length(), + audio_params); + + if (frame) { + value = QVariant::fromValue(frame); + } + } + } + + return value; +} + +QVariant RenderProcessor::ProcessShader(const Node *node, const TimeRange &range, const ShaderJob &job) +{ + // If this node is iterative, we'll pick up which input here + GLuint iterative_input = 0; + QList textures_to_bind; + bool input_textures_have_alpha = false; + + OpenGLShaderPtr shader = ResolveShaderFromCache(node, job.GetShaderID()); + + if (!shader) { + return QVariant(); + } + + shader->bind(); + + NodeValueMap::const_iterator it; + for (it=job.GetValues().constBegin(); it!=job.GetValues().constEnd(); it++) { + // See if the shader has takes this parameter as an input + int variable_location = shader->uniformLocation(it.key()); + + if (variable_location == -1) { + continue; + } + + // See if this value corresponds to an input (NOTE: it may not and this may be null) + NodeInput* corresponding_input = node->GetInputWithID(it.key()); + + // This variable is used in the shader, let's set it + const QVariant& value = it.value().data(); + + NodeParam::DataType data_type = (it.value().type() != NodeParam::kNone) + ? it.value().type() + : corresponding_input->data_type(); + + switch (data_type) { + case NodeInput::kInt: + // kInt technically specifies a LongLong, but OpenGL doesn't support those. This may lead to + // over/underflows if the number is large enough, but the likelihood of that is quite low. + shader->setUniformValue(variable_location, value.toInt()); + break; + case NodeInput::kFloat: + // kFloat technically specifies a double but as above, OpenGL doesn't support those. + shader->setUniformValue(variable_location, value.toFloat()); + break; + case NodeInput::kVec2: + if (corresponding_input && corresponding_input->IsArray()) { + QVector nv = value.value< QVector >(); + QVector a(nv.size()); + + for (int j=0;j(); + } + + shader->setUniformValueArray(variable_location, a.constData(), a.size()); + + int count_location = shader->uniformLocation(QStringLiteral("%1_count").arg(it.key())); + if (count_location > -1) { + shader->setUniformValue(count_location, a.size()); + } + } else { + shader->setUniformValue(variable_location, value.value()); + } + break; + case NodeInput::kVec3: + shader->setUniformValue(variable_location, value.value()); + break; + case NodeInput::kVec4: + shader->setUniformValue(variable_location, value.value()); + break; + case NodeInput::kMatrix: + shader->setUniformValue(variable_location, value.value()); + break; + case NodeInput::kCombo: + shader->setUniformValue(variable_location, value.value()); + break; + case NodeInput::kColor: + { + Color color = value.value(); + + shader->setUniformValue(variable_location, color.red(), color.green(), color.blue(), color.alpha()); + break; + } + case NodeInput::kBoolean: + shader->setUniformValue(variable_location, value.toBool()); + break; + case NodeInput::kBuffer: + case NodeInput::kTexture: + { + OpenGLTextureCache::ReferencePtr texture = value.value(); + + if (texture) { + if (PixelFormat::FormatHasAlphaChannel(texture->texture()->format())) { + input_textures_have_alpha = true; + } + } + + // Set value to bound texture + shader->setUniformValue(variable_location, textures_to_bind.size()); + + // If this texture binding is the iterative input, set it here + if (corresponding_input && corresponding_input == job.GetIterativeInput()) { + iterative_input = textures_to_bind.size(); + } + + GLuint tex_id = texture ? texture->texture()->texture() : 0; + textures_to_bind.append(tex_id); + + // Set enable flag if shader wants it + int enable_param_location = shader->uniformLocation(QStringLiteral("%1_enabled").arg(it.key())); + if (enable_param_location > -1) { + shader->setUniformValue(enable_param_location, + tex_id > 0); + } + + if (tex_id > 0) { + // Set texture resolution if shader wants it + int res_param_location = shader->uniformLocation(QStringLiteral("%1_resolution").arg(it.key())); + if (res_param_location > -1) { + int adjusted_width = texture->texture()->width() * texture->texture()->divider(); + + // Adjust virtual width by pixel aspect if necessary + if (texture->texture()->params().pixel_aspect_ratio() != 1 + || params.pixel_aspect_ratio() != 1) { + double relative_pixel_aspect = texture->texture()->params().pixel_aspect_ratio().toDouble() / params.pixel_aspect_ratio().toDouble(); + + adjusted_width = qRound(static_cast(adjusted_width) * relative_pixel_aspect); + } + + shader->setUniformValue(res_param_location, + adjusted_width, + static_cast(texture->texture()->height() * texture->texture()->divider())); + } + } + break; + } + case NodeInput::kSamples: + case NodeInput::kText: + case NodeInput::kRational: + case NodeInput::kFont: + case NodeInput::kFile: + case NodeInput::kDecimal: + case NodeInput::kNumber: + case NodeInput::kString: + case NodeInput::kVector: + case NodeInput::kShaderJob: + case NodeInput::kSampleJob: + case NodeInput::kGenerateJob: + case NodeInput::kFootage: + case NodeInput::kNone: + case NodeInput::kAny: + break; + } + } + + // Provide some standard args + shader->setUniformValue("ove_resolution", + static_cast(params.width()), + static_cast(params.height())); + + shader->release(); + + // Create the output textures + PixelFormat::Format output_format = (input_textures_have_alpha || job.GetAlphaChannelRequired()) + ? PixelFormat::GetFormatWithAlphaChannel(params.format()) + : PixelFormat::GetFormatWithoutAlphaChannel(params.format()); + VideoParams output_params(params.width(), + params.height(), + params.time_base(), + output_format, + params.pixel_aspect_ratio(), + params.interlacing(), + params.divider()); + + int real_iteration_count; + if (job.GetIterationCount() > 1 && job.GetIterativeInput()) { + real_iteration_count = job.GetIterationCount(); + } else { + real_iteration_count = 1; + } + + OpenGLTextureCache::ReferencePtr dst_refs[2]; + dst_refs[0] = texture_cache_.Get(ctx_, output_params); + + // If this node requires multiple iterations, get a texture for it too + if (real_iteration_count > 1) { + dst_refs[1] = texture_cache_.Get(ctx_, output_params); + } + + // Some nodes use multiple iterations for optimization + OpenGLTextureCache::ReferencePtr input_tex, output_tex; + + // Set up OpenGL parameters as necessary + functions_->glViewport(0, 0, params.effective_width(), params.effective_height()); + + // Bind all textures + for (int i=0; iglActiveTexture(GL_TEXTURE0 + i); + functions_->glBindTexture(GL_TEXTURE_2D, textures_to_bind.at(i)); + OpenGLRenderFunctions::PrepareToDraw(functions_); + } + + for (int iteration=0; iterationbind(); + shader->setUniformValue("ove_iteration", iteration); + shader->release(); + + // Replace iterative input + if (iteration == 0) { + output_tex = dst_refs[0]; + } else { + input_tex = dst_refs[(iteration+1)%2]; + output_tex = dst_refs[iteration%2]; + + functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); + functions_->glBindTexture(GL_TEXTURE_2D, input_tex->texture()->texture()); + OpenGLRenderFunctions::PrepareToDraw(functions_); + } + + buffer_.Attach(output_tex->texture(), true); + buffer_.Bind(); + + // Blit this texture through this shader + OpenGLRenderFunctions::Blit(shader); + + buffer_.Release(); + buffer_.Detach(); + } + + // Release any textures we bound before + for (int i=textures_to_bind.size()-1; i>=0; i--) { + functions_->glActiveTexture(GL_TEXTURE0 + i); + functions_->glBindTexture(GL_TEXTURE_2D, 0); + } + + return QVariant::fromValue(output_tex); +} + +QVariant RenderProcessor::ProcessSamples(const Node *node, const TimeRange &range, const SampleJob &job) +{ + if (!job.samples() || !job.samples()->is_allocated()) { + return QVariant(); + } + + SampleBufferPtr output_buffer = SampleBuffer::CreateAllocated(job.samples()->audio_params(), job.samples()->sample_count()); + NodeValueDatabase value_db; + + const AudioParams& audio_params = Node::ValueToPtr(ticket_->property("viewer"))->audio_params(); + + for (int i=0;isample_count();i++) { + // Calculate the exact rational time at this sample + double sample_to_second = static_cast(i) / static_cast(audio_params.sample_rate()); + + rational this_sample_time = rational::fromDouble(range.in().toDouble() + sample_to_second); + + // Update all non-sample and non-footage inputs + NodeValueMap::const_iterator j; + for (j=job.GetValues().constBegin(); j!=job.GetValues().constEnd(); j++) { + NodeValueTable value; + NodeInput* corresponding_input = node->GetInputWithID(j.key()); + + if (corresponding_input) { + value = ProcessInput(corresponding_input, TimeRange(this_sample_time, this_sample_time)); + } else { + value.Push(j.value()); + } + + value_db.Insert(j.key(), value); + } + + AddGlobalsToDatabase(value_db, TimeRange(this_sample_time, this_sample_time)); + + node->ProcessSamples(value_db, + job.samples(), + output_buffer, + i); + } + + return QVariant::fromValue(output_buffer); +} + +QVariant RenderProcessor::ProcessFrameGeneration(const Node *node, const GenerateJob &job) +{ + FramePtr frame = Frame::Create(); + + const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); + + PixelFormat::Format output_fmt; + if (job.GetAlphaChannelRequired()) { + output_fmt = PixelFormat::GetFormatWithAlphaChannel(video_params.format()); + } else { + output_fmt = PixelFormat::GetFormatWithoutAlphaChannel(video_params.format()); + } + + frame->set_video_params(VideoParams(video_params.width(), + video_params.height(), + video_params.time_base(), + output_fmt, + video_params.pixel_aspect_ratio(), + video_params.interlacing(), + video_params.divider())); + frame->allocate(); + + node->GenerateFrame(frame, job); + + return CachedFrameToTexture(frame); +} + +QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) +{ + if (ticket_->property("mode").value() == RenderMode::kOffline + && !cache_path_.isEmpty() + && node->id() == QStringLiteral("org.olivevideoeditor.Olive.videoinput")) { + const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); + + QByteArray hash = RenderManager::Hash(node, video_params, time); + + FramePtr f = FrameHashCache::LoadCacheFrame(cache_path_, hash); + + if (f) { + // The cached frame won't load with the correct divider by default, so we enforce it here + f->set_video_params(VideoParams(f->width() * video_params.divider(), + f->height() * video_params.divider(), + f->video_params().time_base(), + f->video_params().format(), + f->video_params().pixel_aspect_ratio(), + f->video_params().interlacing(), + video_params.divider())); + + return CachedFrameToTexture(f); + } + } + + return QVariant(); +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h new file mode 100644 index 000000000..c7a287b0e --- /dev/null +++ b/app/render/renderprocessor.h @@ -0,0 +1,75 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef RENDERPROCESSOR_H +#define RENDERPROCESSOR_H + +#include "node/traverser.h" +#include "render/backend/rendercontext.h" +#include "threading/threadticket.h" + +OLIVE_NAMESPACE_ENTER + +class RenderProcessor : public NodeTraverser, public QObject +{ + Q_OBJECT +public: + static void Process(RenderTicketPtr ticket, RenderContext* render_ctx); + + struct RenderedWaveform { + const TrackOutput* track; + AudioVisualWaveform waveform; + TimeRange range; + }; + +signals: + void GeneratedFrame(FramePtr frame); + + void GeneratedAudio(SampleBufferPtr audio); + +protected: + virtual NodeValueTable GenerateBlockTable(const TrackOutput *track, const TimeRange &range) override; + + virtual QVariant ProcessVideoFootage(StreamPtr stream, const rational &input_time) override; + + virtual QVariant ProcessAudioFootage(StreamPtr stream, const TimeRange &input_time) override; + + virtual QVariant ProcessShader(const Node *node, const TimeRange &range, const ShaderJob& job) override; + + virtual QVariant ProcessSamples(const Node *node, const TimeRange &range, const SampleJob &job) override; + + virtual QVariant ProcessFrameGeneration(const Node *node, const GenerateJob& job) override; + + virtual QVariant GetCachedFrame(const Node *node, const rational &time) override; + +private: + RenderProcessor(RenderTicketPtr ticket, RenderContext* render_ctx); + + void Run(); + + RenderTicketPtr ticket_; + + RenderContext* render_ctx_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // RENDERPROCESSOR_H diff --git a/app/threading/threadpool.h b/app/threading/threadpool.h index b202aeb22..4c9f8d3af 100644 --- a/app/threading/threadpool.h +++ b/app/threading/threadpool.h @@ -69,8 +69,6 @@ public: void RunTicket(RenderTicketPtr ticket); - void Cancel(); - protected: virtual void run() override; From 7b05e1b59e633dffb973d1ad5607bc460922f42a Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Sat, 7 Nov 2020 12:31:31 +0100 Subject: [PATCH 14/72] [UI] update "new" icon with a right bottom triangle because the button really opens a menu --- app/ui/style/olive-dark/png/new.128.png | Bin 1053 -> 1154 bytes app/ui/style/olive-dark/png/new.16.png | Bin 419 -> 407 bytes app/ui/style/olive-dark/png/new.32.png | Bin 504 -> 518 bytes app/ui/style/olive-dark/png/new.64.png | Bin 667 -> 707 bytes app/ui/style/olive-dark/svg/new.svg | 25 ++++++++++-------- app/ui/style/olive-light/png/new.128.png | Bin 1172 -> 1294 bytes app/ui/style/olive-light/png/new.16.png | Bin 460 -> 442 bytes app/ui/style/olive-light/png/new.32.png | Bin 559 -> 547 bytes app/ui/style/olive-light/png/new.64.png | Bin 750 -> 798 bytes app/ui/style/olive-light/svg/new.svg | 31 +++++++++++++---------- 10 files changed, 31 insertions(+), 25 deletions(-) diff --git a/app/ui/style/olive-dark/png/new.128.png b/app/ui/style/olive-dark/png/new.128.png index 68cf532970f244733a47fafce419f4e60cf5af11..7b8c6b8e8b073f5de4df077577da3c66c82cd09b 100644 GIT binary patch delta 982 zcmbQs(Zo4HWunQ<`VF2gjv*Cu-rm{oClV;p_VKxd=|pLRt`M!Zd)J~51a z{Ze+#&};^G`=9Gy{QuPdo8=C-VvVM)N9Q>enaxhNr`aPI<{g*NpDwq=MU!FLX8%CD zNES_ob?Nhy%%T|Lj!3MZB9}62DZ`A@c1Pcs_!p~AaGb!j;M)=bi32B3Di}08^aK(Y zL;DXf_^r=k(JW^wkCH3e|F+&zD0=>f$L}xQG5llm@UxF;JmazTr?eXxx2(2eVY{$z zm4F8Gjkg7FY&HZQu4X^QAjcG2w{Z2Nz09c$_Z!_yoG<*I4rC^lspa2UamKYeawakCJYvU{jdK*by$=(0qyc%f?v@H9EEq@~b%y%!Y9HFyEUlwUrL<`#^4jpwEocrXfq;GT%Osolq<`jbD~w$4S$* zKS|IwmU4skioYaSW-L^Y+fhtPn?uwuj{|ti{ZW45vzY z=D*fG64c!5x<`EL7LjfTf#gI%{eylR;ujrsQ@*CAA~12Ig>(Rq%53BP#m{Q)Gi!dI zpLl-u%_lm$6Vi4CePObE-hF^;1CI{V^hMWoo-o{CGHbl9x%BX<-<*O{4(EOvePD{{ zig{jdKZBt^$m@P~{*o;l7?$n-nV<3hk^E048xPIe)q5vSI>&l0F40C@K7p}fX7RqL zYGqYdwhb~CyQf`r6_7k|_P|Y3U552V=dNevFKIc!@Qf+_x|x5ukcqrw3PZAa7l(|4 z{aN=148O9inAii{HVaxb6wT^U_~iHCTMvJw#K!*Q`ZcWQ?=Re){KK?ju2K!tl6o<@#95?Ys<{5WaC>1cI8_xm?-0W3iV!z=38EEytS$zi>r(Dco;af0A z4X7j4RJ^gCS!4Z5pfh`7A84lD^V%1b=6$@Fp|I}4T$Wm;2!?t7_L;JW7>{TP9uz8A zf2QnTsa@8Gjx|^BG2B&OdtI6BH%rFhwJQ$tE#OU@zom@fkxYXHyMmu#L-Q?Z38AA5 zcGvG6n4rP-Vcj>jHW$MN{sYHv&6eOg%23C6zJR6S-P#AX^}DLSY;UwaPA zez72%DlU1T?m>=ebzrkH^A8b=Xx|(AuS{gjVLKNl{4FNTjco&?57YD2GcMRpS3Jbz zp()F>+M>x$?Ld~-%k(QuiQAj{pUlx`_};ktfRcgu-n7Tx8g(D&ZV;^ec=iks_*~3S XFTNd}x5_?~0SG)@{an^LB{Ts5THI(k diff --git a/app/ui/style/olive-dark/png/new.16.png b/app/ui/style/olive-dark/png/new.16.png index 08465e682ebe7dedcb82a4fbad142ce5da32c88a..d69c1e387fc216d3617de87f3b46791863136f58 100644 GIT binary patch delta 248 zcmV$if4_BRDxRGr1a9pTtLS(#=)EcnlO$8sQ(}$}hR}db#_y zmtGS@#0@4$wza@CrSxfsT6yi`4rhg3V}RF)=#UX(AY-`r=y_^Rk%yeIw%3YU=h47JTDjT?|W3?k)vO*gdTP0000Mxp3vLa#+Q|$Pzz#^rzRM18%Kf)7;*IDXbPafvjx$Q zfoKZQ7$OJ27GeU-EQnEEqkRs%8R4Cyrw7~yf~`cP>nli^z;8tDaa}{* zbHJq~a9>mN7`j-lO_;0#Pyh-*0Vn{i0;uY+H2_sh9RlqDY|X*{I=aTxhrGc+GnN0000i~?L za~sQ|T426y+#DbSUPa{AvZ$``c?Y(C0o$-JZUPe#QD;H}um)BNfFp3jS0-Mx5TO#3 z(PIt)hH}IN*cTw0!1OPOm;j|9Vgr0bj0+GG5%JzE%^}okdcl?fec-uhsG5P3!MEX? ztO_tQLi|$I5-jo-(jD+{DZn)jp-BlK0VIF~kN^_EzXNEV<1Xdj{B8_@Uf!-PqEHFU spG<|kF+&-6%ll5G&3C{&QmnW-1H4v42xDToF8}}l07*qoM6N<$f&fL3BLDyZ diff --git a/app/ui/style/olive-dark/png/new.64.png b/app/ui/style/olive-dark/png/new.64.png index ddb69f86fe23cd1cef0dc23a01ccb025e7947293..9c3e97453ebe1188ff5b638fd283ed0234e017a4 100644 GIT binary patch delta 551 zcmV+?0@(eV1;Yi9BoYa5NLh0L01m?d01m?e$8V@)kw%Aq@kvBMRCt{2n@vi?KmbPH zh(9OL6L^i%g%?my;7;9CTzCpMx)DXu-k@7ST!;uB!V6eWpjgI*t+d*VNv4@^n#_X| z$h0%x_n0J`1{#jZ8nD(b0f)dQuvWp^eV_-N8e={xm_HXT0Y|`YfD8}7zDmM^V{9u> zhBk0vtz8L!wB7_R0aa}KELy<1LV`;`Xe1J15&!}TuAAUX#?VfQb-D$={|M|EW8O=w zRfyPjz=&WwK`r3fG1dakthLKk22cyQ1fCq@l|LfY0tUb}ZV8oM4r&1)mJovg5K4$e z0Ei^SBme{wViN%05^f0eh>TGHz$b8pTS6N+@Lgzs(RTt*x}Lw^29A9uh;;|#Wz~0r zc^BYKC;@MQ)+tOV0r!E{DNLxF;N9@J!3?h3SrSUX0Jt4~%F>-plu6P}P#r)`5}*#C zCJ9gnP?H3x1E@&?)B)5a0qOv1k^pr8HA#RvfSM#g9Y9SIpbnrW2~Y=6lLV*(D6!Ud z8Y{qmTH67dDPU9{8h8nemxqQ4_+1_vBw$*3Xo!HU@=)%5fv7OXth>ft<)P*~;J@-v zV*z=}gIhpb=t|i<-skWS0+(l{$wmt9^C&CIvF0f2>T9U9)4cC9Y0yLJUE^L p^G2ESP!j=V%R>zW_>>3u0*HaBH1O=(#sB~c002ovPDHLkV1jbK(E6s^wu`_>FT=|l7X~P2+@4}u!Rtu(WjlC?DY!31k+=?}775`Ym7>^%_ zTclH8$-*~l!iJPJ?^QhwJ;itQ)Ell_nwKIvA?eNXi;Q|f-W#|wW<3!q5@+aCjW9oW zUDJEF@fW?Gul@(>I36aq#RX>`X8AKIMW{&RL(rycjOUVjR+pNd4m=?GA!bwDYjq=c zM&}1@MVwpr@>y~8z%xI8%RX3=RXAI1f!6D3kN#^MXbC#7d&75$r48(f?+s7+eyA(Cf9S`( zYn?#{1a?TrZVoyleaPIgl)+TbLDr#{JAgglG1C>sD?1oS5DJ9q48C63xQ0V9Cv0u( z56%L{W4|0HiG2N(rn!ylh4gFD8Aeh6l}oI4eb4yDlPG%Zc-~b - - + inkscape:snap-smooth-nodes="true" + inkscape:document-rotation="0"> + diff --git a/app/ui/style/olive-light/png/new.128.png b/app/ui/style/olive-light/png/new.128.png index 867ee45205b5d7fcd3f50327300d48287b0ef904..3f20d71e544ffa17b829e7c15f88106dfafe56f1 100644 GIT binary patch delta 1124 zcmbQj*~c|OWunQ9dKMc`7srr_IdAX!XG@1m9DVpX?q-`*%qBs_&{ma#;4?MTbG%n@v}f1&nns(IrCSA~`(7ku|Ql{e}n&o)u~wy3Er(4cTxqtxBoz08U?CZ#>=TlZ|< z=jihpaewT3T8`H`V~A1-){(T98fh>6ll;+a#Ua_PI6FS;65em_%xrj z-)-^r&^~^}n((hurAC|Cb@%`K^5@T=+b>IgrO&<|S-Oi^Cvsgm6XS}2J`R=zNjnu6 zunIWMFtaG%uyNx@gZ6axEew0U+cRc-YSilnapn}KZ@!r$&nxicLzx3Ng8)-~gA9WL z%NGWQJQk(`L2V|+9~y2fOdmXRI9MJ`ngMi|=tc#B21`RA!TPk%fnl0PIt$Z=l$}Zf z4P3DbKP-8USBcha5!}Bq4`?Y1{+2Ne})sM zIS>54!d$X3hoME_-jaC>yHlADoT>A-bruK86f@K>nYTC_C{%4f`)t~N2M(>NybKHl z=k^+Ju6_SE*0`Fn)*vRL>^#$+@5aW}&-T_&d-N;!|I$e}QcKwbt_m}JVgXrG53~oy zrY|$kM((~KL;a;=k3Y&XFdewj{*<|jd%^3+Pnnqz0&*tonF7p@{~0TtJAKU0ww5sffv2mV%Q~loCII)<_NV{= delta 999 zcmeCS|IwmU4u4mrl>EaktG3V`FfA5e)k>ekW=LISr%rN%w zJ#3KBdguEivn9UWRg!Nvr_NT0Vo{RZ@=4XTRB|za-OtV-Ye+2pltr- zz2ATSwad0WfAD8f`Uk5%4#9^(@0q(6&Cohsbn%Rs%ad&#F(2)WCngJ4=BH&F8yl}T zH#e`Zzp{4%`*nu4!w++MKDKt8sh;;)K4OR;6@9i;;92VX4h&2PFs5NlX<@6)W<&2`H!S6+Sn zHSgM953YIP4Vmk2mKtxq_vFbFFFwH?tP^&}C?zn6J`t#AWL~l2t)M{z%Pkp3W{)Ln z1$X?_sxXjv6Z7o#**E(xYt;u_oqq1KySlpicelkC)6W+NJrq^gxGk1bqM_N$^#H@1 zEvigx1$@TRp+D~3J96Ym(d75C1`WkWB;>n2riz#J?khjQa8A(4LZ<(?caUO}nmtgK z`-CM>kK<0a0}SZ{PXbP!@DWoa}6JwT8M}K@7i(s<&qnTjxN)*`G3`O$1z4Zgubsho5rB~;HO_U z8$%ysLo&ky0cMMJ)s1S6+y~CsUES+E`2g#JRr#;)E%X#%u25H!e|2xM<^!e zKL#hVC^1Piba-$)^a!1v)N?+h)VU#E;?O;ApnPbl?Xewk$A8}Yzw*fdDVh;qf9_$J%Hpe8}+3wMtzpS?{9O_hvqCCbGugcfo%n123bJ2u>8r%zCOu>OLwmZ0}yz+`njxgN@xNAjO(AO diff --git a/app/ui/style/olive-light/png/new.16.png b/app/ui/style/olive-light/png/new.16.png index 1d478fe4c5f105447ffd69a211a7238877f9dbba..dbdf400b2553c50c12f070ee3c27e081a2094c7d 100644 GIT binary patch delta 283 zcmV+$0p$M71G)o{BoYa5NLh0L00Xc900XcAC&Uk}kw%Aq=t)FDR5*?8lOayUKomvK zodGt0_=cvX1o;KO78H0^fMEf!1QZI5!V>IX2|EB)9I1n#Iu`*YpN2LxSWfcH%eyD@ zGBX0m^L$UzIUv6C*0$|cUDuBc5C9|{*xm;=y0SgDeH22t&9ZD~RM3%9y6#HS15g7R zlZ2m|9g?1YZC?V!81Krm+?^yyDa|C!fqUDVDW#kK%-T@cb}eZEoUZh?rU;h6^6RJ} z9NIpaw8C%r7yMCB6vbKp8n;L0XZ hfEeSG?c**C@D3hkSmKmc&Po6P002ovPDHLkV1lDoeb)d0 delta 302 zcmV+}0nz@t1Iz=EBq9WJLP=Bz2nYy#2xN!=000SaNLh0L00XfA00XfB^@Ht6kv4~a z>PbXFR5*?8k}*m{K@f)jnI{2@fMBIy*nLep4=-tL5Y7NR131MlA~|c@c7X!E6%QqiB%K530qBto zl5XAoErf8_CCJQ4PDxJPeYrVX0hpA3Bqc$KR{-w-CNakQqXm*~NPbG9q?fv`2l?)# zqjzm)Nz#LvWf@3b0BAb}Bv$~&IXANbfTyFMaEO1w9|-ooQPLHFs#GlLGVjBlAf@!< z?l7~*uBjxybG)OAFS~4s>8K00000NkvXXu0mh|f+X*L A$p8QV diff --git a/app/ui/style/olive-light/png/new.32.png b/app/ui/style/olive-light/png/new.32.png index c63d512f7c43fa7f2cfdb76e670401c4813038e4..d02612005faa6f025605ea5e3cfdc03b22a2756c 100644 GIT binary patch delta 389 zcmV;00eb$g1fv9yBoYa5NLh0L00&_J00&_KmBYBUkw%AqQAtEWR9J=WmmyLEK@de> z?|?vYgWZlra0DC@mk2~m4v-4~2EjRyRAER(fZ`CGU?>cZ!eF4LF-g_dCOg^LO)6%; z>zSVZuXDBAp;Q1C$_Uz;hWQ&-3d|XKRPBiOg&)BI5%gk4t#1~{+%00000NkvXXu0mjfqA94d delta 401 zcmV;C0dD@I1g`{;Bq9WJLP=Bz2nYy#2xN!=000SaNLh0L00&|K00&|LIC`1ekv4~a zO-V#SR9J=Wm!VF?KoExinGoc05><8$Ifc6?Kp_B&Av_H@JnC`;i$h%q4*>}zs0}Ak zoF?5L0iu*$y4yBj`m1(kcIL~>Hro}1rN)?j0Gkp2H<2t=_0~D}k`iB)gp9_RLz3s2 zx!y>gESJm2oJAV3Z)Fw-fU$^NS!;KHau%&M1&GK)S(Z;BpQ;|!Oe638tSE})PBa1l zxEGPTh_4E;0&p* zF|*bNzpRu^m?ROI*FdVTW0HFSF6!&LcHliDc0FY51mL~D&V=}(P9qSJ1<6HZ%&)4u zB#(c~(fcOM)c`O63;+Yb05AajJ3z{DJQ0z$Xa1x!0LdwUX`AY`-?E@$BgnpFCMcLQ vcsT_i#+U<=+kI44)o1724S?pB{Ixy+>)LySZ+Ut<00000NkvXXu0mjf>7c3; diff --git a/app/ui/style/olive-light/png/new.64.png b/app/ui/style/olive-light/png/new.64.png index 7f64611647f3a84917540d0149ef666f18e36f13..02178dbe3002a50f02f925eac156325c8c709081 100644 GIT binary patch delta 642 zcmV-|0)74N1)c_wBoYa5NLh0L01m?d01m?e$8V@)kw%AqOi4sRRCt{2n?H`zKop0+ zNx)ldN<$SXF4BcAw5u(+0B{02s1_lPu?^cGA`ozcZ6hHngv15XsFJOu7KsJ#F#d%fPpY&J_B%wLFZ z-ar&ZFM+3jz_Fv+$H4tGP4D&l{poVK%pBFR(y@#^@|59pyCljWJJ37g6eCnfr|~U!o{_HlNRbl&w{k zMy-G=e69p(0pIcllu{?#?e_I(G>TjX5EY=5daIOw`f9nw`4K59Kx>@=?`;xXZwKiu zATB{%0LV&cgaD9}&=>(ABcV|O;J1Vicse2*CjdZe{ZlFR4vPffbhFt!uUqR@-3jVo z`-yCfDKf=l;Ji+TMy`Mo+^IXkO&3rbUjmk%>XgQd0Il_BA9bqW^TrKZN1Y1KK({;5)w@DP*^AWaY;9YC5OKstalL4b4sX@UUh0MY~j z(gCCi0;B^-69h;HkR}L_4j@esARR!OAV4~RG(muL07;T0Icu$eBuUPIb_%#^9$L5s zt~U=Y6YzKQ&>{i5nunGM$ZH-dydHP;n%Wg*w&vl$SHS<8hXWQ+qaFENC;NxLi?V*mgE07*qoM6N<$f;ICUtN;K2 delta 594 zcmbQo_KtOeiV{n)lV=DA5Y%v_bTBY5a29w(7BevL9RXp+soH$f6V2M|c|2VlLn`LH zow?CZ+EJkG|HhMn4?cOMp6s<=UL56ekeg**gI)>8M+uV)E*l*h%@=HKSrMQTcVKQj zL-e{gYUz2?xwtu>A5q!!$Z{-evM(PO=HULR_|Y* zr&F|a<@bB{RXvLgWcdDPRErA!Ww8;?5=s&&_`h9RX_M*v^YtZGbC;}1yT~apu~_hD zeQZF`D?!P*49{cu9)wS9G1~52!qkwZ>Y~Z8!p~_7kg4LL%fO+pSjBk2>5wXu%tUQP z28KDs{YpiROq>kc(l_5+n09yT|L#yb*Yzjv{oby#k^RAwwSU9Xm_%~2y6!J#5cOe9 zPI}L3!gy|HblCgp7v!40R{d2wUwkENtE|TN`rMfpSS+3w3BIg;|NH;0wr`718NE?F z!FS*o%Le8RhKz3*a(o!98Ki{|kS^r)(>Cr{ewLVg9g|PPraBQ7*PS*QU0a#fP5sIf zA{okb$;6gb^@8)9$p%apyf1(0kv(D%)}g+=WXYG7%{g7b6vN=@>gTe~DWM4fcX#^) diff --git a/app/ui/style/olive-light/svg/new.svg b/app/ui/style/olive-light/svg/new.svg index 482ad42da..f600b7e82 100644 --- a/app/ui/style/olive-light/svg/new.svg +++ b/app/ui/style/olive-light/svg/new.svg @@ -1,6 +1,4 @@ - - + inkscape:snap-smooth-nodes="true" + inkscape:document-rotation="0"> + From 83cefbd7c75b72ed85560a22fda89bb1e906dcc5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 7 Nov 2020 22:44:27 +1100 Subject: [PATCH 15/72] uhh yeah this might be fubar --- app/core.cpp | 3 - app/node/output/viewer/viewer.cpp | 1 - app/render/backend/CMakeLists.txt | 8 +- app/render/backend/opengl/CMakeLists.txt | 4 +- app/render/backend/opengl/openglcontext.cpp | 195 ------- app/render/backend/opengl/openglrenderer.cpp | 504 ++++++++++++++++++ .../{openglcontext.h => openglrenderer.h} | 30 +- app/render/backend/opengl/openglshader.cpp | 254 +++++++++ app/render/backend/opengl/openglshader.h | 65 +++ app/render/backend/rendercontext.h | 65 --- .../{rendercontext.cpp => renderer.cpp} | 14 +- app/render/backend/renderer.h | 148 +++++ ...dwrapper.cpp => rendererthreadwrapper.cpp} | 68 ++- ...hreadwrapper.h => rendererthreadwrapper.h} | 22 +- app/render/rendermanager.cpp | 6 +- app/render/rendermanager.h | 8 +- app/render/renderprocessor.cpp | 251 +-------- app/render/renderprocessor.h | 12 +- app/widget/manageddisplay/manageddisplay.cpp | 18 +- app/widget/manageddisplay/manageddisplay.h | 11 +- app/widget/scope/histogram/histogram.cpp | 3 +- app/widget/scope/histogram/histogram.h | 8 +- app/widget/scope/scopebase/scopebase.cpp | 2 +- app/widget/scope/scopebase/scopebase.h | 24 +- app/widget/viewer/viewerdisplay.h | 4 +- 25 files changed, 1131 insertions(+), 597 deletions(-) delete mode 100644 app/render/backend/opengl/openglcontext.cpp create mode 100644 app/render/backend/opengl/openglrenderer.cpp rename app/render/backend/opengl/{openglcontext.h => openglrenderer.h} (56%) create mode 100644 app/render/backend/opengl/openglshader.cpp create mode 100644 app/render/backend/opengl/openglshader.h delete mode 100644 app/render/backend/rendercontext.h rename app/render/backend/{rendercontext.cpp => renderer.cpp} (71%) create mode 100644 app/render/backend/renderer.h rename app/render/backend/{rendercontextthreadwrapper.cpp => rendererthreadwrapper.cpp} (50%) rename app/render/backend/{rendercontextthreadwrapper.h => rendererthreadwrapper.h} (66%) diff --git a/app/core.cpp b/app/core.cpp index 449197683..0a7e9fd9e 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -49,7 +49,6 @@ #include "panel/panelmanager.h" #include "panel/project/project.h" #include "panel/viewer/viewer.h" -#include "render/backend/opengl/opengltexturecache.h" #include "render/colormanager.h" #include "render/diskmanager.h" #include "render/pixelformat.h" @@ -96,8 +95,6 @@ Core *Core::instance() void Core::DeclareTypesForQt() { qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index ae5788929..b6a4753ef 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -102,7 +102,6 @@ void ViewerOutput::ShiftAudioCache(const rational &from, const rational &to) audio_playback_cache_.Shift(from, to); foreach (TrackOutput* track, track_lists_.at(Timeline::kTrackTypeAudio)->GetTracks()) { - QMutexLocker locker(track->waveform_lock()); track->waveform().Shift(from, to); } } diff --git a/app/render/backend/CMakeLists.txt b/app/render/backend/CMakeLists.txt index 65c369e52..de34bd6b3 100644 --- a/app/render/backend/CMakeLists.txt +++ b/app/render/backend/CMakeLists.txt @@ -18,9 +18,9 @@ add_subdirectory(opengl) set(OLIVE_SOURCES ${OLIVE_SOURCES} - render/backend/rendercontext.cpp - render/backend/rendercontext.h - render/backend/rendercontextthreadwrapper.cpp - render/backend/rendercontextthreadwrapper.h + render/backend/renderer.cpp + render/backend/renderer.h + render/backend/rendererthreadwrapper.cpp + render/backend/rendererthreadwrapper.h PARENT_SCOPE ) diff --git a/app/render/backend/opengl/CMakeLists.txt b/app/render/backend/opengl/CMakeLists.txt index 9464d26bd..e2df52f90 100644 --- a/app/render/backend/opengl/CMakeLists.txt +++ b/app/render/backend/opengl/CMakeLists.txt @@ -16,7 +16,7 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} - render/backend/opengl/openglcontext.cpp - render/backend/opengl/openglcontext.h + render/backend/opengl/openglrenderer.cpp + render/backend/opengl/openglrenderer.h PARENT_SCOPE ) diff --git a/app/render/backend/opengl/openglcontext.cpp b/app/render/backend/opengl/openglcontext.cpp deleted file mode 100644 index 5a81f4719..000000000 --- a/app/render/backend/opengl/openglcontext.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "openglcontext.h" - -#include - -OLIVE_NAMESPACE_ENTER - -OpenGLContext::OpenGLContext(QObject* parent) : - RenderContext(parent) -{ -} - -OpenGLContext::~OpenGLContext() -{ -} - -bool OpenGLContext::Init() -{ - surface_.create(); - - context_ = new QOpenGLContext(); - if (!context_->create()) { - qCritical() << "Failed to create OpenGL context"; - return false; - } - - context_->moveToThread(this->thread()); - - return true; -} - -void OpenGLContext::PostInit() -{ - // Make context current on that surface - if (!context_->makeCurrent(&surface_)) { - qCritical() << "Failed to makeCurrent() on offscreen surface in thread" << thread(); - return; - } - - // Store OpenGL functions instance - functions_ = context_->functions(); - functions_->glBlendFunc(GL_ONE, GL_ZERO); -} - -void OpenGLContext::Destroy() -{ - delete context_; - surface_.destroy(); -} - -QVariant OpenGLContext::CreateTexture(const VideoParams &p, void *data, int linesize) -{ - GLuint texture; - functions_->glGenTextures(1, &texture); - texture_params_.insert(texture, p); - - functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); - - functions_->glTexImage2D(GL_TEXTURE_2D, 0, GetInternalFormat(p.format()), - p.width(), p.height(), 0, GetPixelFormat(p.format()), - GetPixelType(p.format()), data); - - functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - - return texture; -} - -void OpenGLContext::DestroyTexture(QVariant texture) -{ - GLuint t = texture.value(); - functions_->glDeleteTextures(1, &t); - texture_params_.remove(t); -} - -void OpenGLContext::UploadToTexture(QVariant texture, void *data, int linesize) -{ - GLuint t = texture.value(); - const VideoParams& p = texture_params_.value(t); - - functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); - - functions_->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, - p.effective_width(), p.effective_height(), - GetPixelFormat(p.format()), GetPixelType(p.format()), - data); - - functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); -} - -void OpenGLContext::DownloadFromTexture(QVariant texture, void *data, int linesize) -{ - GLuint t = texture.value(); - const VideoParams& p = texture_params_.value(t); - - functions_->glPixelStorei(GL_PACK_ROW_LENGTH, linesize); - - functions_->glReadPixels(0, - 0, - p.width(), - p.height(), - GetPixelFormat(p.format()), - GetPixelType(p.format()), - data); - - functions_->glPixelStorei(GL_PACK_ROW_LENGTH, 0); -} - -VideoParams OpenGLContext::GetParamsFromTexture(QVariant texture) -{ - GLuint t = texture.value(); - - return texture_params_.value(t); -} - -GLint OpenGLContext::GetInternalFormat(PixelFormat::Format format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGB8: - return GL_RGB8; - case PixelFormat::PIX_FMT_RGBA8: - return GL_RGBA8; - case PixelFormat::PIX_FMT_RGB16U: - return GL_RGB16; - case PixelFormat::PIX_FMT_RGBA16U: - return GL_RGBA16; - case PixelFormat::PIX_FMT_RGB16F: - return GL_RGB16F; - case PixelFormat::PIX_FMT_RGBA16F: - return GL_RGBA16F; - case PixelFormat::PIX_FMT_RGB32F: - return GL_RGB32F; - case PixelFormat::PIX_FMT_RGBA32F: - return GL_RGBA32F; - - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return GL_INVALID_VALUE; -} - -GLenum OpenGLContext::GetPixelFormat(PixelFormat::Format format) -{ - if (PixelFormat::FormatHasAlphaChannel(format)) { - return GL_RGBA; - } else { - return GL_RGB; - } -} - -GLenum OpenGLContext::GetPixelType(PixelFormat::Format format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGB8: - case PixelFormat::PIX_FMT_RGBA8: - return GL_UNSIGNED_BYTE; - case PixelFormat::PIX_FMT_RGB16U: - case PixelFormat::PIX_FMT_RGBA16U: - return GL_UNSIGNED_SHORT; - case PixelFormat::PIX_FMT_RGB16F: - case PixelFormat::PIX_FMT_RGBA16F: - return GL_HALF_FLOAT; - case PixelFormat::PIX_FMT_RGB32F: - case PixelFormat::PIX_FMT_RGBA32F: - return GL_FLOAT; - - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return GL_INVALID_VALUE; -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglrenderer.cpp b/app/render/backend/opengl/openglrenderer.cpp new file mode 100644 index 000000000..a37a84055 --- /dev/null +++ b/app/render/backend/opengl/openglrenderer.cpp @@ -0,0 +1,504 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "openglrenderer.h" + +#include + +OLIVE_NAMESPACE_ENTER + +OpenGLRenderer::OpenGLRenderer(QObject* parent) : + Renderer(parent), + context_(nullptr) +{ +} + +OpenGLRenderer::~OpenGLRenderer() +{ +} + +void OpenGLRenderer::Init(QOpenGLContext *existing_ctx) +{ + if (context_) { + qCritical() << "Can't initialize already initialized OpenGLRenderer"; + return; + } + + context_ = existing_ctx; +} + +bool OpenGLRenderer::Init() +{ + if (context_) { + qCritical() << "Can't initialize already initialized OpenGLRenderer"; + return false; + } + + surface_.create(); + + context_ = new QOpenGLContext(this); + if (!context_->create()) { + qCritical() << "Failed to create OpenGL context"; + return false; + } + + context_->moveToThread(this->thread()); + + return true; +} + +void OpenGLRenderer::PostInit() +{ + // Make context current on that surface + if (!context_->makeCurrent(&surface_)) { + qCritical() << "Failed to makeCurrent() on offscreen surface in thread" << thread(); + return; + } + + // Store OpenGL functions instance + functions_ = context_->functions(); + functions_->glBlendFunc(GL_ONE, GL_ZERO); +} + +void OpenGLRenderer::Destroy() +{ + if (context_->parent() == this) { + delete context_; + } + context_ = nullptr; + + qDeleteAll(shader_cache_); + shader_cache_.clear(); + + if (surface_.isValid()) { + surface_.destroy(); + } +} + +QVariant OpenGLRenderer::CreateNativeTexture(const VideoParams &p, void *data, int linesize) +{ + GLuint texture; + functions_->glGenTextures(1, &texture); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); + + functions_->glTexImage2D(GL_TEXTURE_2D, 0, GetInternalFormat(p.format()), + p.width(), p.height(), 0, GetPixelFormat(p.format()), + GetPixelType(p.format()), data); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + return texture; +} + +void OpenGLRenderer::DestroyNativeTexture(QVariant texture) +{ + GLuint t = texture.value(); + functions_->glDeleteTextures(1, &t); +} + +void OpenGLRenderer::UploadToTexture(Texture *texture, void *data, int linesize) +{ + GLuint t = texture->id().value(); + const VideoParams& p = texture->params(); + + // Store currently bound texture so it can be restored later + GLint current_tex; + functions_->glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_tex); + + functions_->glBindTexture(GL_TEXTURE_2D, t); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); + + functions_->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, + p.effective_width(), p.effective_height(), + GetPixelFormat(p.format()), GetPixelType(p.format()), + data); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + functions_->glBindTexture(GL_TEXTURE_2D, current_tex); +} + +void OpenGLRenderer::DownloadFromTexture(Texture* texture, void *data, int linesize) +{ + GLuint t = texture->id().value(); + const VideoParams& p = texture->params(); + + GLint current_tex; + functions_->glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_tex); + + functions_->glBindTexture(GL_TEXTURE_2D, t); + + functions_->glPixelStorei(GL_PACK_ROW_LENGTH, linesize); + + functions_->glReadPixels(0, + 0, + p.width(), + p.height(), + GetPixelFormat(p.format()), + GetPixelType(p.format()), + data); + + functions_->glPixelStorei(GL_PACK_ROW_LENGTH, 0); + + functions_->glBindTexture(GL_TEXTURE_2D, current_tex); +} + +Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeRange &range, const ShaderJob &job, const VideoParams ¶ms) +{ + // If this node is iterative, we'll pick up which input here + GLuint iterative_input = 0; + QList textures_to_bind; + bool input_textures_have_alpha = false; + + QString full_shader_id = QStringLiteral("%1:%2").arg(node->id(), job.GetShaderID()); + QOpenGLShaderProgram* shader = shader_cache_.value(full_shader_id); + + if (!shader) { + // Since we have shader code, compile it now + ShaderCode code = node->GetShaderCode(job.GetShaderID()); + QString vert_code = code.vert_code(); + QString frag_code = code.frag_code(); + + if (frag_code.isEmpty() && vert_code.isEmpty()) { + qWarning() << "No shader code found for" << node->id() << "- operation will be a no-op"; + } + + if (frag_code.isEmpty()) { + frag_code = OpenGLShader::CodeDefaultFragment(); + } + + if (vert_code.isEmpty()) { + vert_code = OpenGLShader::CodeDefaultVertex(); + } + + shader = new QOpenGLShaderProgram(this); + if (shader + && shader->create() + && shader->addShaderFromSourceCode(QOpenGLShader::Fragment, frag_code) + && shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vert_code) + && shader->link()) { + shader_cache_.insert(full_shader_id, shader); + } else { + qWarning() << "Failed to compile shader for" << node->id(); + shader = nullptr; + } + + if (!shader) { + // Couldn't find or build the shader required + return nullptr; + } + } + + shader->bind(); + + NodeValueMap::const_iterator it; + for (it=job.GetValues().constBegin(); it!=job.GetValues().constEnd(); it++) { + // See if the shader has takes this parameter as an input + int variable_location = shader->uniformLocation(it.key()); + + if (variable_location == -1) { + continue; + } + + // See if this value corresponds to an input (NOTE: it may not and this may be null) + NodeInput* corresponding_input = node->GetInputWithID(it.key()); + + // This variable is used in the shader, let's set it + const QVariant& value = it.value().data(); + + NodeParam::DataType data_type = (it.value().type() != NodeParam::kNone) + ? it.value().type() + : corresponding_input->data_type(); + + switch (data_type) { + case NodeInput::kInt: + // kInt technically specifies a LongLong, but OpenGL doesn't support those. This may lead to + // over/underflows if the number is large enough, but the likelihood of that is quite low. + shader->setUniformValue(variable_location, value.toInt()); + break; + case NodeInput::kFloat: + // kFloat technically specifies a double but as above, OpenGL doesn't support those. + shader->setUniformValue(variable_location, value.toFloat()); + break; + case NodeInput::kVec2: + if (corresponding_input && corresponding_input->IsArray()) { + QVector nv = value.value< QVector >(); + QVector a(nv.size()); + + for (int j=0;j(); + } + + shader->setUniformValueArray(variable_location, a.constData(), a.size()); + + int count_location = shader->uniformLocation(QStringLiteral("%1_count").arg(it.key())); + if (count_location > -1) { + shader->setUniformValue(count_location, a.size()); + } + } else { + shader->setUniformValue(variable_location, value.value()); + } + break; + case NodeInput::kVec3: + shader->setUniformValue(variable_location, value.value()); + break; + case NodeInput::kVec4: + shader->setUniformValue(variable_location, value.value()); + break; + case NodeInput::kMatrix: + shader->setUniformValue(variable_location, value.value()); + break; + case NodeInput::kCombo: + shader->setUniformValue(variable_location, value.value()); + break; + case NodeInput::kColor: + { + Color color = value.value(); + + shader->setUniformValue(variable_location, color.red(), color.green(), color.blue(), color.alpha()); + break; + } + case NodeInput::kBoolean: + shader->setUniformValue(variable_location, value.toBool()); + break; + case NodeInput::kBuffer: + case NodeInput::kTexture: + { + TexturePtr texture = value.value(); + + if (texture) { + if (PixelFormat::FormatHasAlphaChannel(texture->format())) { + input_textures_have_alpha = true; + } + } + + // Set value to bound texture + shader->setUniformValue(variable_location, textures_to_bind.size()); + + // If this texture binding is the iterative input, set it here + if (corresponding_input && corresponding_input == job.GetIterativeInput()) { + iterative_input = textures_to_bind.size(); + } + + GLuint tex_id = texture ? texture->id().value() : 0; + textures_to_bind.append(tex_id); + + // Set enable flag if shader wants it + int enable_param_location = shader->uniformLocation(QStringLiteral("%1_enabled").arg(it.key())); + if (enable_param_location > -1) { + shader->setUniformValue(enable_param_location, + tex_id > 0); + } + + if (tex_id > 0) { + // Set texture resolution if shader wants it + int res_param_location = shader->uniformLocation(QStringLiteral("%1_resolution").arg(it.key())); + if (res_param_location > -1) { + int adjusted_width = texture->width() * texture->divider(); + + // Adjust virtual width by pixel aspect if necessary + if (texture->params().pixel_aspect_ratio() != 1 + || params.pixel_aspect_ratio() != 1) { + double relative_pixel_aspect = texture->params().pixel_aspect_ratio().toDouble() / params.pixel_aspect_ratio().toDouble(); + + adjusted_width = qRound(static_cast(adjusted_width) * relative_pixel_aspect); + } + + shader->setUniformValue(res_param_location, + adjusted_width, + static_cast(texture->height() * texture->divider())); + } + } + break; + } + case NodeInput::kSamples: + case NodeInput::kText: + case NodeInput::kRational: + case NodeInput::kFont: + case NodeInput::kFile: + case NodeInput::kDecimal: + case NodeInput::kNumber: + case NodeInput::kString: + case NodeInput::kVector: + case NodeInput::kShaderJob: + case NodeInput::kSampleJob: + case NodeInput::kGenerateJob: + case NodeInput::kFootage: + case NodeInput::kNone: + case NodeInput::kAny: + break; + } + } + + // Provide some standard args + shader->setUniformValue("ove_resolution", + static_cast(params.width()), + static_cast(params.height())); + + shader->release(); + + // Create the output textures + PixelFormat::Format output_format = (input_textures_have_alpha || job.GetAlphaChannelRequired()) + ? PixelFormat::GetFormatWithAlphaChannel(params.format()) + : PixelFormat::GetFormatWithoutAlphaChannel(params.format()); + VideoParams output_params(params.width(), + params.height(), + params.time_base(), + output_format, + params.pixel_aspect_ratio(), + params.interlacing(), + params.divider()); + + int real_iteration_count; + if (job.GetIterationCount() > 1 && job.GetIterativeInput()) { + real_iteration_count = job.GetIterationCount(); + } else { + real_iteration_count = 1; + } + + TexturePtr dst_refs[2]; + dst_refs[0] = CreateTexture(output_params); + + // If this node requires multiple iterations, get a texture for it too + if (real_iteration_count > 1) { + dst_refs[1] = CreateTexture(output_params); + } + + // Some nodes use multiple iterations for optimization + TexturePtr input_tex, output_tex; + + // Set up OpenGL parameters as necessary + functions_->glViewport(0, 0, params.effective_width(), params.effective_height()); + + // Bind all textures + for (int i=0; iglActiveTexture(GL_TEXTURE0 + i); + functions_->glBindTexture(GL_TEXTURE_2D, textures_to_bind.at(i)); + OpenGLRenderFunctions::PrepareToDraw(functions_); + } + + for (int iteration=0; iterationbind(); + shader->setUniformValue("ove_iteration", iteration); + shader->release(); + + // Replace iterative input + if (iteration == 0) { + output_tex = dst_refs[0]; + } else { + input_tex = dst_refs[(iteration+1)%2]; + output_tex = dst_refs[iteration%2]; + + functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); + functions_->glBindTexture(GL_TEXTURE_2D, input_tex->texture()->texture()); + OpenGLRenderFunctions::PrepareToDraw(functions_); + } + + buffer_.Attach(output_tex, true); + buffer_.Bind(); + + // Blit this texture through this shader + OpenGLRenderFunctions::Blit(shader); + + buffer_.Release(); + buffer_.Detach(); + } + + // Release any textures we bound before + for (int i=textures_to_bind.size()-1; i>=0; i--) { + functions_->glActiveTexture(GL_TEXTURE0 + i); + functions_->glBindTexture(GL_TEXTURE_2D, 0); + } + + return output_tex; +} + +/*VideoParams OpenGLRenderer::GetParamsFromTexture(QVariant texture) +{ + GLuint t = texture.value(); + + return texture_params_.value(t); +}*/ + +GLint OpenGLRenderer::GetInternalFormat(PixelFormat::Format format) +{ + switch (format) { + case PixelFormat::PIX_FMT_RGB8: + return GL_RGB8; + case PixelFormat::PIX_FMT_RGBA8: + return GL_RGBA8; + case PixelFormat::PIX_FMT_RGB16U: + return GL_RGB16; + case PixelFormat::PIX_FMT_RGBA16U: + return GL_RGBA16; + case PixelFormat::PIX_FMT_RGB16F: + return GL_RGB16F; + case PixelFormat::PIX_FMT_RGBA16F: + return GL_RGBA16F; + case PixelFormat::PIX_FMT_RGB32F: + return GL_RGB32F; + case PixelFormat::PIX_FMT_RGBA32F: + return GL_RGBA32F; + + case PixelFormat::PIX_FMT_INVALID: + case PixelFormat::PIX_FMT_COUNT: + break; + } + + return GL_INVALID_VALUE; +} + +GLenum OpenGLRenderer::GetPixelFormat(PixelFormat::Format format) +{ + if (PixelFormat::FormatHasAlphaChannel(format)) { + return GL_RGBA; + } else { + return GL_RGB; + } +} + +GLenum OpenGLRenderer::GetPixelType(PixelFormat::Format format) +{ + switch (format) { + case PixelFormat::PIX_FMT_RGB8: + case PixelFormat::PIX_FMT_RGBA8: + return GL_UNSIGNED_BYTE; + case PixelFormat::PIX_FMT_RGB16U: + case PixelFormat::PIX_FMT_RGBA16U: + return GL_UNSIGNED_SHORT; + case PixelFormat::PIX_FMT_RGB16F: + case PixelFormat::PIX_FMT_RGBA16F: + return GL_HALF_FLOAT; + case PixelFormat::PIX_FMT_RGB32F: + case PixelFormat::PIX_FMT_RGBA32F: + return GL_FLOAT; + + case PixelFormat::PIX_FMT_INVALID: + case PixelFormat::PIX_FMT_COUNT: + break; + } + + return GL_INVALID_VALUE; +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglcontext.h b/app/render/backend/opengl/openglrenderer.h similarity index 56% rename from app/render/backend/opengl/openglcontext.h rename to app/render/backend/opengl/openglrenderer.h index 9c56f428f..5c6bbb1d2 100644 --- a/app/render/backend/opengl/openglcontext.h +++ b/app/render/backend/opengl/openglrenderer.h @@ -23,19 +23,22 @@ #include #include +#include #include -#include "render/backend/rendercontext.h" +#include "render/backend/renderer.h" OLIVE_NAMESPACE_ENTER -class OpenGLContext : public RenderContext +class OpenGLRenderer : public Renderer { Q_OBJECT public: - OpenGLContext(QObject* parent = nullptr); + OpenGLRenderer(QObject* parent = nullptr); - virtual ~OpenGLContext() override; + virtual ~OpenGLRenderer() override; + + void Init(QOpenGLContext* existing_ctx); virtual bool Init() override; @@ -44,15 +47,20 @@ public slots: virtual void Destroy() override; - virtual QVariant CreateTexture(const VideoParams& param, void* data, int linesize) override; + virtual QVariant CreateNativeTexture(const VideoParams& p, void* data = nullptr, int linesize = 0) override; - virtual void DestroyTexture(QVariant texture) override; + virtual void DestroyNativeTexture(QVariant texture) override; - virtual void UploadToTexture(QVariant texture, void* data, int linesize) override; + virtual void UploadToTexture(Texture* texture, void* data, int linesize) override; - virtual void DownloadFromTexture(QVariant texture, void* data, int linesize) override; + virtual void DownloadFromTexture(Texture* texture, void* data, int linesize) override; - virtual VideoParams GetParamsFromTexture(QVariant texture) override; + virtual TexturePtr ProcessShader(const OLIVE_NAMESPACE::Node* node, + const OLIVE_NAMESPACE::TimeRange &range, + const OLIVE_NAMESPACE::ShaderJob &job, + const OLIVE_NAMESPACE::VideoParams ¶ms) override; + + virtual QVariant TransformColor(QVariant texture, ColorProcessorPtr processor) override; private: static GLint GetInternalFormat(PixelFormat::Format format); @@ -67,10 +75,12 @@ private: QOffscreenSurface surface_; - QMap texture_params_; + QHash shader_cache_; }; OLIVE_NAMESPACE_EXIT +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::OpenGLRenderer::TexturePtr); + #endif // OPENGLCONTEXT_H diff --git a/app/render/backend/opengl/openglshader.cpp b/app/render/backend/opengl/openglshader.cpp new file mode 100644 index 000000000..7e76f619a --- /dev/null +++ b/app/render/backend/opengl/openglshader.cpp @@ -0,0 +1,254 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "openglshader.h" + +#include +OLIVE_NAMESPACE_ENTER + +OpenGLShaderPtr OpenGLShader::Create() +{ + return std::make_shared(); +} + +OpenGLShaderPtr OpenGLShader::CreateDefault(const QString &function_name, const QString &shader_code) +{ + OpenGLShaderPtr program = Create(); + + // Add shaders to program + program->addShaderFromSourceCode(QOpenGLShader::Vertex, CodeDefaultVertex()); + program->addShaderFromSourceCode(QOpenGLShader::Fragment, CodeDefaultFragment(function_name, shader_code)); + program->link(); + + return program; +} + +// copied from source code to OCIODisplay +const int OCIO_LUT3D_EDGE_SIZE = 64; + +// copied from source code to OCIODisplay, expanded from 3*LUT3D_EDGE_SIZE*LUT3D_EDGE_SIZE*LUT3D_EDGE_SIZE +const int OCIO_NUM_3D_ENTRIES = 3*OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE; + +OpenGLShaderPtr OpenGLShader::CreateOCIO(QOpenGLContext* ctx, + GLuint& lut_texture, + OCIO::ConstProcessorRcPtr processor, + bool alpha_is_associated) +{ + QOpenGLExtraFunctions* xf = ctx->extraFunctions(); + + // Set up shader description + OCIO::GpuShaderDesc shaderDesc; + const char* ocio_func_name = "OCIODisplay"; + shaderDesc.setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_3); + shaderDesc.setFunctionName(ocio_func_name); + shaderDesc.setLut3DEdgeLen(OCIO_LUT3D_EDGE_SIZE); + + // Compute LUT + std::vector ocio_lut_data(OCIO_NUM_3D_ENTRIES); + processor->getGpuLut3D(&ocio_lut_data[0], shaderDesc); + + // Create LUT texture + xf->glGenTextures(1, &lut_texture); + + // Bind LUT + xf->glActiveTexture(GL_TEXTURE1); + xf->glBindTexture(GL_TEXTURE_3D, lut_texture); + + // Set texture parameters + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + // Allocate storage for texture + xf->glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16F, + OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, + 0, GL_RGB, GL_FLOAT, &ocio_lut_data[0]); + + // Create OCIO shader code + QString shader_text; + + // Workaround since OCIO doesn't support the GLSL version we use + shader_text.append(QStringLiteral("#define texture2D texture\n" + "#define texture3D texture\n")); + + // Append OCIO shader code + shader_text.append(processor->getGpuShaderText(shaderDesc)); + + QString shader_call; + + // Enforce alpha association + if (alpha_is_associated) { + + // If alpha is already associated, we'll need to disassociate and reassociate + shader_text.append("\n"); + + QString disassociate_func_name = "disassoc"; + shader_text.append(CodeAlphaDisassociate(disassociate_func_name)); + + QString reassociate_func_name = "reassoc"; + shader_text.append(CodeAlphaReassociate(reassociate_func_name)); + + // Make OCIO call pass through disassociate and reassociate function + shader_call = QStringLiteral("%3(%1(%2(col), ove_ociolut));").arg(ocio_func_name, + disassociate_func_name, + reassociate_func_name); + + } else { + + // If alpha is not already associated, we can just associate after OCIO + + // Add associate function + QString associate_func_name = "assoc"; + shader_text.append(CodeAlphaAssociate(associate_func_name)); + + // Make OCIO call pass through associate function + shader_call = QStringLiteral("%2(%1(col, ove_ociolut));").arg(ocio_func_name, associate_func_name); + + } + + // Add process() function, which GetPipeline() will call if specified + QString process_function_name = "process"; + shader_text.append(QStringLiteral("\n" + "uniform sampler3D ove_ociolut;\n" + "\n" + "vec4 %2(vec4 col) {\n" + " return %1\n" + "}\n").arg(shader_call, process_function_name)); + + + // Get pipeline-based shader to inject OCIO shader into + OpenGLShaderPtr shader = OpenGLShader::CreateDefault(process_function_name, shader_text); + + // Release LUT + xf->glBindTexture(GL_TEXTURE_3D, 0); + + xf->glActiveTexture(GL_TEXTURE0); + + return shader; +} + +QString OpenGLShader::CodeDefaultFragment(QString function_name, const QString &shader_code) +{ + // Create shader header + QString frag_code = QStringLiteral("#version 150\n" + "\n" + "#ifdef GL_ES\n" + "precision highp int;\n" + "precision highp float;\n" + "#endif\n" + "\n" + "uniform sampler2D ove_maintex;\n" + "uniform vec2 ove_resolution;\n" + "uniform bool ove_deinterlace;\n" + "\n" + "in vec2 ove_texcoord;\n" + "\n" + "out vec4 fragColor;\n" + "\n"); + + // Check if additional code was passed to this function, add it here + if (!function_name.isEmpty() && !shader_code.isEmpty()) { + + // If additional code was passed, add it and reference it in main(). + // + // The function in the additional code is expected to be `vec4 function_name(vec4 color)`. + // The texture coordinate can be acquired through `ove_texcoord`. + + frag_code.append(shader_code); + + } else { + + // No function to call + function_name = QString(); + + } + + // Our function_name arg will either resolve to the function added to this or to nothing, in + // which case they'll just be benign brackets. + frag_code.append(QStringLiteral("\n" + "void main() {\n" + " vec2 using_texcoord = ove_texcoord;\n" + " if (ove_deinterlace) {\n" + " // A very basic deinterlace that halves the vertical\n" + " // resolution and linearly interpolates the two fields\n" + " // by reading the texture coord between them.\n" + " float half_vert = round(ove_resolution.y / 2.0);\n" + " using_texcoord.y = (round(using_texcoord.y * half_vert) + 0.25) / half_vert;\n" + " }\n" + " vec4 color = %1(texture(ove_maintex, using_texcoord));\n" + " fragColor = color;\n" + "}\n").arg(function_name)); + + return frag_code; +} + +QString OpenGLShader::CodeDefaultVertex() +{ + // Generate vertex shader + return QStringLiteral("#version 150\n" + "\n" + "#ifdef GL_ES\n" + "precision highp int;\n" + "precision highp float;\n" + "#endif\n" + "\n" + "uniform mat4 ove_mvpmat;\n" + "\n" + "in vec4 a_position;\n" + "in vec2 a_texcoord;\n" + "\n" + "out vec2 ove_texcoord;\n" + "\n" + "void main() {\n" + " gl_Position = ove_mvpmat * a_position;\n" + " ove_texcoord = a_texcoord;\n" + "}\n"); +} + +QString OpenGLShader::CodeAlphaDisassociate(const QString &function_name) +{ + return QStringLiteral("vec4 %1(vec4 col) {\n" + " if (col.a > 0.0) {\n" + " return vec4(col.rgb / col.a, col.a);" + " }\n" + " return col;\n" + "}\n").arg(function_name); +} + +QString OpenGLShader::CodeAlphaReassociate(const QString &function_name) +{ + return QStringLiteral("vec4 %1(vec4 col) {\n" + " if (col.a > 0.0) {\n" + " return vec4(col.rgb * col.a, col.a);" + " }\n" + " return col;\n" + "}\n").arg(function_name); +} + +QString OpenGLShader::CodeAlphaAssociate(const QString &function_name) +{ + return QStringLiteral("vec4 %1(vec4 col) {\n" + " return vec4(col.rgb * col.a, col.a);\n" + "}\n").arg(function_name); +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglshader.h b/app/render/backend/opengl/openglshader.h new file mode 100644 index 000000000..452dc3c3d --- /dev/null +++ b/app/render/backend/opengl/openglshader.h @@ -0,0 +1,65 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef OPENGLSHADER_H +#define OPENGLSHADER_H + +#include +#include + +#include +namespace OCIO = OCIO_NAMESPACE::v1; + +#include "common/define.h" + +OLIVE_NAMESPACE_ENTER + +class OpenGLShader; +using OpenGLShaderPtr = std::shared_ptr; + +/** + * @brief A simple QOpenGLShaderProgram derivative with static functions for creating + */ +class OpenGLShader : public QOpenGLShaderProgram { +public: + OpenGLShader() = default; + + static OpenGLShaderPtr Create(); + + static OpenGLShaderPtr CreateDefault(const QString &function_name = QString(), + const QString &shader_code = QString()); + + static OpenGLShaderPtr CreateOCIO(QOpenGLContext* ctx, + GLuint& lut_texture, + OCIO::ConstProcessorRcPtr processor, + bool alpha_is_associated); + + static QString CodeDefaultFragment(QString function_name = QString(), + const QString &shader_code = QString()); + static QString CodeDefaultVertex(); + static QString CodeAlphaDisassociate(const QString& function_name); + static QString CodeAlphaReassociate(const QString& function_name); + static QString CodeAlphaAssociate(const QString& function_name); + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // OPENGLSHADER_H diff --git a/app/render/backend/rendercontext.h b/app/render/backend/rendercontext.h deleted file mode 100644 index dba4a9e51..000000000 --- a/app/render/backend/rendercontext.h +++ /dev/null @@ -1,65 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef RENDERCONTEXT_H -#define RENDERCONTEXT_H - -#include -#include - -#include "common/define.h" -#include "render/videoparams.h" - -OLIVE_NAMESPACE_ENTER - -class RenderContext : public QObject -{ - Q_OBJECT -public: - RenderContext(QObject* parent = nullptr); - - virtual ~RenderContext() override; - - virtual bool Init() = 0; - -public slots: - virtual void PostInit() = 0; - - virtual void Destroy() = 0; - - virtual QVariant CreateTexture(const OLIVE_NAMESPACE::VideoParams& param, void* data, int linesize) = 0; - - virtual void DestroyTexture(QVariant texture) = 0; - - virtual void UploadToTexture(QVariant texture, void* data, int linesize) = 0; - - virtual void DownloadFromTexture(QVariant texture, void* data, int linesize) = 0; - - virtual QVariant CreateShader(); - - virtual VideoParams GetParamsFromTexture(QVariant texture) = 0; - - QVariant CreateTexture(const OLIVE_NAMESPACE::VideoParams& param); - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // RENDERCONTEXT_H diff --git a/app/render/backend/rendercontext.cpp b/app/render/backend/renderer.cpp similarity index 71% rename from app/render/backend/rendercontext.cpp rename to app/render/backend/renderer.cpp index 2f07702a9..a1ddaa924 100644 --- a/app/render/backend/rendercontext.cpp +++ b/app/render/backend/renderer.cpp @@ -18,19 +18,25 @@ ***/ -#include "rendercontext.h" +#include "renderer.h" OLIVE_NAMESPACE_ENTER -RenderContext::RenderContext(QObject *parent) : +Renderer::Renderer(QObject *parent) : QObject(parent) { } -QVariant RenderContext::CreateTexture(const VideoParams ¶m) +Renderer::TexturePtr Renderer::CreateTexture(const VideoParams ¶m, void *data, int linesize) { - return CreateTexture(param, nullptr, 0); + QVariant v = CreateNativeTexture(param, data, linesize); + + if (v.isNull()) { + return nullptr; + } + + return std::make_shared(this, v, param); } OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/renderer.h b/app/render/backend/renderer.h new file mode 100644 index 000000000..7f3e3d334 --- /dev/null +++ b/app/render/backend/renderer.h @@ -0,0 +1,148 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef RENDERCONTEXT_H +#define RENDERCONTEXT_H + +#include +#include + +#include "common/define.h" +#include "common/timerange.h" +#include "node/node.h" +#include "render/colorprocessor.h" +#include "render/videoparams.h" + +OLIVE_NAMESPACE_ENTER + +class Renderer : public QObject +{ + Q_OBJECT +public: + Renderer(QObject* parent = nullptr); + + virtual ~Renderer() override; + + virtual bool Init() = 0; + + class Texture + { + public: + Texture(Renderer* renderer, const QVariant& native, const VideoParams& param) : + renderer_(renderer), + params_(param), + id_(native) + { + } + + ~Texture() + { + renderer_->DestroyNativeTexture(id_); + } + + QVariant id() const + { + return id_; + } + + const VideoParams& params() const + { + return params_; + } + + void Upload(void* data, int linesize = 0) + { + renderer_->UploadToTexture(this, data, linesize); + } + + int width() const + { + return params_.width(); + } + + int height() const + { + return params_.height(); + } + + PixelFormat::Format format() const + { + return params_.format(); + } + + int divider() const + { + return params_.divider(); + } + + const rational& pixel_aspect_ratio() const + { + return params_.pixel_aspect_ratio(); + } + + private: + Renderer* renderer_; + + VideoParams params_; + + QVariant id_; + + }; + + using TexturePtr = std::shared_ptr; + + TexturePtr CreateTexture(const VideoParams& param, void* data = nullptr, int linesize = 0); + +public slots: + virtual void PostInit() = 0; + + virtual void Destroy() = 0; + + virtual QVariant CreateNativeTexture(const VideoParams& param, void* data = nullptr, int linesize = 0) = 0; + + virtual void DestroyNativeTexture(QVariant texture) = 0; + + virtual QVariant CreateNativeShader(const ShaderCode& code) = 0; + + virtual void DestroyNativeShader(QVariant shader) = 0; + + virtual void UploadToTexture(Texture* texture, void* data, int linesize) = 0; + + virtual void DownloadFromTexture(Texture* texture, void* data, int linesize) = 0; + + virtual TexturePtr ProcessShader(const OLIVE_NAMESPACE::Node* node, + const OLIVE_NAMESPACE::TimeRange &range, + const OLIVE_NAMESPACE::ShaderJob &job, + const OLIVE_NAMESPACE::VideoParams ¶ms) = 0; + + virtual QVariant TransformColor(QVariant texture, OLIVE_NAMESPACE::ColorProcessorPtr processor) = 0; + + virtual void Render() = 0; + + virtual void RenderToTexture(Texture* destination) = 0; + +private: + + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // RENDERCONTEXT_H diff --git a/app/render/backend/rendercontextthreadwrapper.cpp b/app/render/backend/rendererthreadwrapper.cpp similarity index 50% rename from app/render/backend/rendercontextthreadwrapper.cpp rename to app/render/backend/rendererthreadwrapper.cpp index 397189809..d344b16c5 100644 --- a/app/render/backend/rendercontextthreadwrapper.cpp +++ b/app/render/backend/rendererthreadwrapper.cpp @@ -18,20 +18,25 @@ ***/ -#include "rendercontextthreadwrapper.h" +#include "rendererthreadwrapper.h" OLIVE_NAMESPACE_ENTER -RenderContextThreadWrapper::RenderContextThreadWrapper(RenderContext *inner, QObject *parent) : - RenderContext(parent), +/*RendererThreadWrapper::RendererThreadWrapper(Renderer *inner, QObject *parent) : + Renderer(parent), inner_(inner), thread_(nullptr) { inner_->setParent(this); } -bool RenderContextThreadWrapper::Init() +bool RendererThreadWrapper::Init() { + // Init context in main thread + if (!inner_->Init()) { + return false; + } + // Create thread QThread* thread = new QThread(this); thread->start(QThread::IdlePriority); @@ -39,17 +44,16 @@ bool RenderContextThreadWrapper::Init() // Move context to thread inner_->moveToThread(thread); - // Init context in main thread - inner_->Init(); - // Queue post-init in new thread - QMetaObject::invokeMethod(inner_, "PostInit", Qt::QueuedConnection); + QMetaObject::invokeMethod(inner_, "PostInit", Qt::BlockingQueuedConnection); + + return true; } -void RenderContextThreadWrapper::Destroy() +void RendererThreadWrapper::Destroy() { if (thread_) { - QMetaObject::invokeMethod(inner_, "Destroy", Qt::QueuedConnection); + QMetaObject::invokeMethod(inner_, "Destroy", Qt::BlockingQueuedConnection); thread_->quit(); thread_->wait(); @@ -58,7 +62,7 @@ void RenderContextThreadWrapper::Destroy() } } -QVariant RenderContextThreadWrapper::CreateTexture(const VideoParams ¶m, void *data, int linesize) +QVariant RendererThreadWrapper::CreateTexture(const VideoParams ¶m, void *data, int linesize) { QVariant v; @@ -71,29 +75,55 @@ QVariant RenderContextThreadWrapper::CreateTexture(const VideoParams ¶m, voi return v; } -void RenderContextThreadWrapper::DestroyTexture(QVariant texture) +void RendererThreadWrapper::DestroyTexture(QVariant texture) { - QMetaObject::invokeMethod(inner_, "DestroyTexture", Qt::QueuedConnection, + QMetaObject::invokeMethod(inner_, "DestroyTexture", Qt::BlockingQueuedConnection, Q_ARG(QVariant, texture)); } -void RenderContextThreadWrapper::UploadToTexture(QVariant texture, void *data, int linesize) +void RendererThreadWrapper::UploadToTexture(QVariant texture, void *data, int linesize) { - QMetaObject::invokeMethod(inner_, "UploadToTexture", Qt::QueuedConnection, + QMetaObject::invokeMethod(inner_, "UploadToTexture", Qt::BlockingQueuedConnection, Q_ARG(QVariant, texture), Q_ARG(void*, data), Q_ARG(int, linesize)); } -void RenderContextThreadWrapper::DownloadFromTexture(QVariant texture, void *data, int linesize) +void RendererThreadWrapper::DownloadFromTexture(QVariant texture, void *data, int linesize) { - QMetaObject::invokeMethod(inner_, "DownloadFromTexture", Qt::QueuedConnection, + QMetaObject::invokeMethod(inner_, "DownloadFromTexture", Qt::BlockingQueuedConnection, Q_ARG(QVariant, texture), Q_ARG(void*, data), Q_ARG(int, linesize)); } -VideoParams RenderContextThreadWrapper::GetParamsFromTexture(QVariant texture) +QVariant RendererThreadWrapper::ProcessShader(const Node *node, const TimeRange &range, const ShaderJob &job, const VideoParams ¶ms) +{ + QVariant v; + + QMetaObject::invokeMethod(inner_, "ProcessShader", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QVariant, v), + OLIVE_NS_CONST_ARG(Node*, node), + OLIVE_NS_CONST_ARG(TimeRange&, range), + OLIVE_NS_CONST_ARG(ShaderJob&, job), + OLIVE_NS_CONST_ARG(VideoParams&, params)); + + return v; +} + +QVariant RendererThreadWrapper::TransformColor(QVariant texture, ColorProcessorPtr processor) +{ + QVariant v; + + QMetaObject::invokeMethod(inner_, "ProcessShader", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QVariant, v), + Q_ARG(QVariant, texture), + OLIVE_NS_ARG(ColorProcessorPtr, processor)); + + return v; +} + +VideoParams RendererThreadWrapper::GetParamsFromTexture(QVariant texture) { VideoParams p; @@ -102,6 +132,6 @@ VideoParams RenderContextThreadWrapper::GetParamsFromTexture(QVariant texture) Q_ARG(QVariant, texture)); return p; -} +}*/ OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/rendercontextthreadwrapper.h b/app/render/backend/rendererthreadwrapper.h similarity index 66% rename from app/render/backend/rendercontextthreadwrapper.h rename to app/render/backend/rendererthreadwrapper.h index 1a8a7f6c1..5a0e8d5cb 100644 --- a/app/render/backend/rendercontextthreadwrapper.h +++ b/app/render/backend/rendererthreadwrapper.h @@ -23,16 +23,16 @@ #include -#include "rendercontext.h" +#include "renderer.h" OLIVE_NAMESPACE_ENTER -class RenderContextThreadWrapper : public RenderContext +/*class RendererThreadWrapper : public Renderer { public: - RenderContextThreadWrapper(RenderContext* inner, QObject* parent = nullptr); + RendererThreadWrapper(Renderer* inner, QObject* parent = nullptr); - virtual ~RenderContextThreadWrapper() override + virtual ~RendererThreadWrapper() override { Destroy(); } @@ -52,14 +52,22 @@ public slots: virtual void DownloadFromTexture(QVariant texture, void* data, int linesize) override; - virtual VideoParams GetParamsFromTexture(QVariant texture) override; + virtual QVariant ProcessShader(const OLIVE_NAMESPACE::Node* node, + const OLIVE_NAMESPACE::TimeRange &range, + const OLIVE_NAMESPACE::ShaderJob &job, + const OLIVE_NAMESPACE::VideoParams ¶ms) override; + + virtual QVariant TransformColor(QVariant texture, + OLIVE_NAMESPACE::ColorProcessorPtr processor) override; + + //virtual VideoParams GetParamsFromTexture(QVariant texture) override; private: - RenderContext* inner_; + Renderer* inner_; QThread* thread_; -}; +};*/ OLIVE_NAMESPACE_EXIT diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 546b90784..9979b2b29 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -27,8 +27,8 @@ #include "config/config.h" #include "core.h" -#include "render/backend/opengl/openglcontext.h" -#include "render/backend/rendercontextthreadwrapper.h" +#include "render/backend/opengl/openglrenderer.h" +#include "render/backend/rendererthreadwrapper.h" #include "renderprocessor.h" #include "task/conform/conform.h" #include "task/taskmanager.h" @@ -41,7 +41,7 @@ RenderManager* RenderManager::instance_ = nullptr; RenderManager::RenderManager(QObject *parent) : ThreadPool(QThread::IdlePriority, 0, parent) { - context_ = new RenderContextThreadWrapper(new OpenGLContext(), this); + context_ = new RendererThreadWrapper(new OpenGLRenderer(), this); context_->Init(); } diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 68e26905b..f00b6d2b0 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -30,7 +30,7 @@ #include "node/graph.h" #include "node/output/viewer/viewer.h" #include "node/traverser.h" -#include "render/backend/rendercontext.h" +#include "render/backend/renderer.h" #include "threading/threadpool.h" OLIVE_NAMESPACE_ENTER @@ -111,12 +111,12 @@ private: static RenderManager* instance_; - RenderContext* context_; + Renderer* context_; }; -Q_DECLARE_METATYPE(RenderManager::TicketType); - OLIVE_NAMESPACE_EXIT +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::RenderManager::TicketType); + #endif // RENDERBACKEND_H diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index b3c354c05..dc6d898d4 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -20,11 +20,15 @@ #include "renderprocessor.h" +#include +#include +#include + #include "rendermanager.h" OLIVE_NAMESPACE_ENTER -RenderProcessor::RenderProcessor(RenderTicketPtr ticket, RenderContext *render_ctx) : +RenderProcessor::RenderProcessor(RenderTicketPtr ticket, Renderer *render_ctx) : ticket_(ticket), render_ctx_(render_ctx) { @@ -46,7 +50,7 @@ void RenderProcessor::Run() NodeValueTable table = ProcessInput(viewer->texture_input(), TimeRange(time, time + viewer->video_params().time_base())); - QVariant texture = table.Get(NodeParam::kTexture); + Renderer::TexturePtr texture = table.Get(NodeParam::kTexture).value(); QSize frame_size = ticket_->property("size").value(); if (frame_size.isNull()) { @@ -65,18 +69,18 @@ void RenderProcessor::Run() viewer->video_params().divider())); frame->allocate(); - if (texture.isNull()) { + if (!texture) { // Blank frame out memset(frame->data(), 0, frame->allocated_size()); } else { // Dump texture contents to frame - VideoParams tex_params = render_ctx_->GetParamsFromTexture(texture); + const VideoParams& tex_params = texture->params(); if (tex_params.width() != frame->width() || tex_params.height() != frame->height()) { // FIXME: Blit this shit } - render_ctx_->DownloadFromTexture(texture, frame->data(), frame->linesize_pixels()); + render_ctx_->DownloadFromTexture(texture.get(), frame->data(), frame->linesize_pixels()); } ticket_->Finish(QVariant::fromValue(frame), IsCancelled()); @@ -109,7 +113,7 @@ void RenderProcessor::Run() this->deleteLater(); } -void RenderProcessor::Process(RenderTicketPtr ticket, RenderContext *render_ctx) +void RenderProcessor::Process(RenderTicketPtr ticket, Renderer *render_ctx) { RenderProcessor p(ticket, render_ctx); p.Run(); @@ -293,240 +297,9 @@ QVariant RenderProcessor::ProcessAudioFootage(StreamPtr stream, const TimeRange QVariant RenderProcessor::ProcessShader(const Node *node, const TimeRange &range, const ShaderJob &job) { - // If this node is iterative, we'll pick up which input here - GLuint iterative_input = 0; - QList textures_to_bind; - bool input_textures_have_alpha = false; + const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); - OpenGLShaderPtr shader = ResolveShaderFromCache(node, job.GetShaderID()); - - if (!shader) { - return QVariant(); - } - - shader->bind(); - - NodeValueMap::const_iterator it; - for (it=job.GetValues().constBegin(); it!=job.GetValues().constEnd(); it++) { - // See if the shader has takes this parameter as an input - int variable_location = shader->uniformLocation(it.key()); - - if (variable_location == -1) { - continue; - } - - // See if this value corresponds to an input (NOTE: it may not and this may be null) - NodeInput* corresponding_input = node->GetInputWithID(it.key()); - - // This variable is used in the shader, let's set it - const QVariant& value = it.value().data(); - - NodeParam::DataType data_type = (it.value().type() != NodeParam::kNone) - ? it.value().type() - : corresponding_input->data_type(); - - switch (data_type) { - case NodeInput::kInt: - // kInt technically specifies a LongLong, but OpenGL doesn't support those. This may lead to - // over/underflows if the number is large enough, but the likelihood of that is quite low. - shader->setUniformValue(variable_location, value.toInt()); - break; - case NodeInput::kFloat: - // kFloat technically specifies a double but as above, OpenGL doesn't support those. - shader->setUniformValue(variable_location, value.toFloat()); - break; - case NodeInput::kVec2: - if (corresponding_input && corresponding_input->IsArray()) { - QVector nv = value.value< QVector >(); - QVector a(nv.size()); - - for (int j=0;j(); - } - - shader->setUniformValueArray(variable_location, a.constData(), a.size()); - - int count_location = shader->uniformLocation(QStringLiteral("%1_count").arg(it.key())); - if (count_location > -1) { - shader->setUniformValue(count_location, a.size()); - } - } else { - shader->setUniformValue(variable_location, value.value()); - } - break; - case NodeInput::kVec3: - shader->setUniformValue(variable_location, value.value()); - break; - case NodeInput::kVec4: - shader->setUniformValue(variable_location, value.value()); - break; - case NodeInput::kMatrix: - shader->setUniformValue(variable_location, value.value()); - break; - case NodeInput::kCombo: - shader->setUniformValue(variable_location, value.value()); - break; - case NodeInput::kColor: - { - Color color = value.value(); - - shader->setUniformValue(variable_location, color.red(), color.green(), color.blue(), color.alpha()); - break; - } - case NodeInput::kBoolean: - shader->setUniformValue(variable_location, value.toBool()); - break; - case NodeInput::kBuffer: - case NodeInput::kTexture: - { - OpenGLTextureCache::ReferencePtr texture = value.value(); - - if (texture) { - if (PixelFormat::FormatHasAlphaChannel(texture->texture()->format())) { - input_textures_have_alpha = true; - } - } - - // Set value to bound texture - shader->setUniformValue(variable_location, textures_to_bind.size()); - - // If this texture binding is the iterative input, set it here - if (corresponding_input && corresponding_input == job.GetIterativeInput()) { - iterative_input = textures_to_bind.size(); - } - - GLuint tex_id = texture ? texture->texture()->texture() : 0; - textures_to_bind.append(tex_id); - - // Set enable flag if shader wants it - int enable_param_location = shader->uniformLocation(QStringLiteral("%1_enabled").arg(it.key())); - if (enable_param_location > -1) { - shader->setUniformValue(enable_param_location, - tex_id > 0); - } - - if (tex_id > 0) { - // Set texture resolution if shader wants it - int res_param_location = shader->uniformLocation(QStringLiteral("%1_resolution").arg(it.key())); - if (res_param_location > -1) { - int adjusted_width = texture->texture()->width() * texture->texture()->divider(); - - // Adjust virtual width by pixel aspect if necessary - if (texture->texture()->params().pixel_aspect_ratio() != 1 - || params.pixel_aspect_ratio() != 1) { - double relative_pixel_aspect = texture->texture()->params().pixel_aspect_ratio().toDouble() / params.pixel_aspect_ratio().toDouble(); - - adjusted_width = qRound(static_cast(adjusted_width) * relative_pixel_aspect); - } - - shader->setUniformValue(res_param_location, - adjusted_width, - static_cast(texture->texture()->height() * texture->texture()->divider())); - } - } - break; - } - case NodeInput::kSamples: - case NodeInput::kText: - case NodeInput::kRational: - case NodeInput::kFont: - case NodeInput::kFile: - case NodeInput::kDecimal: - case NodeInput::kNumber: - case NodeInput::kString: - case NodeInput::kVector: - case NodeInput::kShaderJob: - case NodeInput::kSampleJob: - case NodeInput::kGenerateJob: - case NodeInput::kFootage: - case NodeInput::kNone: - case NodeInput::kAny: - break; - } - } - - // Provide some standard args - shader->setUniformValue("ove_resolution", - static_cast(params.width()), - static_cast(params.height())); - - shader->release(); - - // Create the output textures - PixelFormat::Format output_format = (input_textures_have_alpha || job.GetAlphaChannelRequired()) - ? PixelFormat::GetFormatWithAlphaChannel(params.format()) - : PixelFormat::GetFormatWithoutAlphaChannel(params.format()); - VideoParams output_params(params.width(), - params.height(), - params.time_base(), - output_format, - params.pixel_aspect_ratio(), - params.interlacing(), - params.divider()); - - int real_iteration_count; - if (job.GetIterationCount() > 1 && job.GetIterativeInput()) { - real_iteration_count = job.GetIterationCount(); - } else { - real_iteration_count = 1; - } - - OpenGLTextureCache::ReferencePtr dst_refs[2]; - dst_refs[0] = texture_cache_.Get(ctx_, output_params); - - // If this node requires multiple iterations, get a texture for it too - if (real_iteration_count > 1) { - dst_refs[1] = texture_cache_.Get(ctx_, output_params); - } - - // Some nodes use multiple iterations for optimization - OpenGLTextureCache::ReferencePtr input_tex, output_tex; - - // Set up OpenGL parameters as necessary - functions_->glViewport(0, 0, params.effective_width(), params.effective_height()); - - // Bind all textures - for (int i=0; iglActiveTexture(GL_TEXTURE0 + i); - functions_->glBindTexture(GL_TEXTURE_2D, textures_to_bind.at(i)); - OpenGLRenderFunctions::PrepareToDraw(functions_); - } - - for (int iteration=0; iterationbind(); - shader->setUniformValue("ove_iteration", iteration); - shader->release(); - - // Replace iterative input - if (iteration == 0) { - output_tex = dst_refs[0]; - } else { - input_tex = dst_refs[(iteration+1)%2]; - output_tex = dst_refs[iteration%2]; - - functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); - functions_->glBindTexture(GL_TEXTURE_2D, input_tex->texture()->texture()); - OpenGLRenderFunctions::PrepareToDraw(functions_); - } - - buffer_.Attach(output_tex->texture(), true); - buffer_.Bind(); - - // Blit this texture through this shader - OpenGLRenderFunctions::Blit(shader); - - buffer_.Release(); - buffer_.Detach(); - } - - // Release any textures we bound before - for (int i=textures_to_bind.size()-1; i>=0; i--) { - functions_->glActiveTexture(GL_TEXTURE0 + i); - functions_->glBindTexture(GL_TEXTURE_2D, 0); - } - - return QVariant::fromValue(output_tex); + render_ctx_->ProcessShader(node, range, job, video_params); } QVariant RenderProcessor::ProcessSamples(const Node *node, const TimeRange &range, const SampleJob &job) diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index c7a287b0e..f41d4961d 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -22,16 +22,16 @@ #define RENDERPROCESSOR_H #include "node/traverser.h" -#include "render/backend/rendercontext.h" +#include "render/backend/renderer.h" #include "threading/threadticket.h" OLIVE_NAMESPACE_ENTER -class RenderProcessor : public NodeTraverser, public QObject +class RenderProcessor : public QObject, public NodeTraverser { Q_OBJECT public: - static void Process(RenderTicketPtr ticket, RenderContext* render_ctx); + static void Process(RenderTicketPtr ticket, Renderer* render_ctx); struct RenderedWaveform { const TrackOutput* track; @@ -60,16 +60,18 @@ protected: virtual QVariant GetCachedFrame(const Node *node, const rational &time) override; private: - RenderProcessor(RenderTicketPtr ticket, RenderContext* render_ctx); + RenderProcessor(RenderTicketPtr ticket, Renderer* render_ctx); void Run(); RenderTicketPtr ticket_; - RenderContext* render_ctx_; + Renderer* render_ctx_; }; OLIVE_NAMESPACE_EXIT +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::RenderProcessor::RenderedWaveform); + #endif // RENDERPROCESSOR_H diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index 30574363a..52ba3f356 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -22,6 +22,8 @@ #include +#include "render/backend/opengl/openglrenderer.h" + OLIVE_NAMESPACE_ENTER ManagedDisplayWidget::ManagedDisplayWidget(QWidget *parent) : @@ -30,6 +32,8 @@ ManagedDisplayWidget::ManagedDisplayWidget(QWidget *parent) : color_service_(nullptr) { setContextMenuPolicy(Qt::CustomContextMenu); + + attached_renderer_ = new OpenGLRenderer(); } ManagedDisplayWidget::~ManagedDisplayWidget() @@ -102,7 +106,7 @@ void ManagedDisplayWidget::ColorConfigChanged() SetColorTransform(color_manager_->GetCompliantColorSpace(color_transform_, true)); } -OpenGLColorProcessorPtr ManagedDisplayWidget::color_service() +ColorProcessorPtr ManagedDisplayWidget::color_service() { return color_service_; } @@ -113,6 +117,8 @@ void ManagedDisplayWidget::ContextCleanup() color_service_ = nullptr; + attached_renderer_->Destroy(); + doneCurrent(); } @@ -188,6 +194,8 @@ void ManagedDisplayWidget::initializeGL() SetupColorProcessor(); connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &ManagedDisplayWidget::ContextCleanup, Qt::DirectConnection); + + static_cast(attached_renderer_)->Init(context()); } void ManagedDisplayWidget::EnableDefaultContextMenu() @@ -280,11 +288,9 @@ void ManagedDisplayWidget::SetupColorProcessor() try { - color_service_ = OpenGLColorProcessor::Create(color_manager_, - color_manager_->GetReferenceColorSpace(), - color_transform_); - - color_service_->Enable(context(), true); + color_service_ = ColorProcessor::Create(color_manager_, + color_manager_->GetReferenceColorSpace(), + color_transform_); } catch (OCIO::Exception& e) { diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index c03d5ea71..ec524faeb 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -23,7 +23,7 @@ #include -#include "render/backend/opengl/openglcolorprocessor.h" +#include "render/backend/renderer.h" #include "render/colormanager.h" #include "widget/menu/menu.h" @@ -98,7 +98,7 @@ protected: /** * @brief Provides access to the color processor (nullptr if none is set) */ - OpenGLColorProcessorPtr color_service(); + ColorProcessorPtr color_service(); /** * @brief Override when setting up OpenGL context @@ -128,6 +128,11 @@ private: */ void ClearOCIOLutTexture(); + /** + * @brief Renderer abstraction + */ + Renderer* attached_renderer_; + /** * @brief Connected color manager */ @@ -136,7 +141,7 @@ private: /** * @brief Color management service */ - OpenGLColorProcessorPtr color_service_; + ColorProcessorPtr color_service_; /** * @brief Internal color transform storage diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index e89918c06..b88c3996d 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -25,7 +25,6 @@ #include "common/qtutils.h" #include "node/node.h" -#include "render/backend/opengl/openglrenderfunctions.h" OLIVE_NAMESPACE_ENTER @@ -75,7 +74,7 @@ void HistogramScope::CleanUp() doneCurrent(); } -OpenGLShaderPtr HistogramScope::CreateShader() +QVariant HistogramScope::CreateShader() { OpenGLShaderPtr pipeline = OpenGLShader::Create(); diff --git a/app/widget/scope/histogram/histogram.h b/app/widget/scope/histogram/histogram.h index 70751355f..8de6e4da4 100644 --- a/app/widget/scope/histogram/histogram.h +++ b/app/widget/scope/histogram/histogram.h @@ -36,16 +36,16 @@ public: protected: virtual void initializeGL() override; - virtual OpenGLShaderPtr CreateShader() override; - OpenGLShaderPtr CreateSecondaryShader(); + virtual QVariant CreateShader() override; + QVariant CreateSecondaryShader(); void AssertAdditionalTextures(); virtual void DrawScope() override; private: - OpenGLShaderPtr pipeline_secondary_; - OpenGLTexture texture_row_sums_; + QVariant pipeline_secondary_; + QVariant texture_row_sums_; private slots: void CleanUp(); diff --git a/app/widget/scope/scopebase/scopebase.cpp b/app/widget/scope/scopebase/scopebase.cpp index e3b65d48c..38aa84e13 100644 --- a/app/widget/scope/scopebase/scopebase.cpp +++ b/app/widget/scope/scopebase/scopebase.cpp @@ -54,7 +54,7 @@ void ScopeBase::showEvent(QShowEvent* e) UploadTextureFromBuffer(); } -OpenGLShaderPtr ScopeBase::CreateShader() +QVariant ScopeBase::CreateShader() { return OpenGLShader::CreateDefault(); } diff --git a/app/widget/scope/scopebase/scopebase.h b/app/widget/scope/scopebase/scopebase.h index 41e2edefc..dc48c20f3 100644 --- a/app/widget/scope/scopebase/scopebase.h +++ b/app/widget/scope/scopebase/scopebase.h @@ -22,10 +22,7 @@ #define SCOPEBASE_H #include "codec/frame.h" -#include "render/backend/opengl/openglcolorprocessor.h" -#include "render/backend/opengl/openglframebuffer.h" -#include "render/backend/opengl/openglshader.h" -#include "render/backend/opengl/opengltexture.h" +#include "render/colorprocessor.h" #include "widget/manageddisplay/manageddisplay.h" OLIVE_NAMESPACE_ENTER @@ -47,35 +44,28 @@ protected: virtual void showEvent(QShowEvent* e) override; - virtual OpenGLShaderPtr CreateShader(); + virtual QVariant CreateShader(); virtual void DrawScope(); - OpenGLShaderPtr pipeline() + QVariant pipeline() { return pipeline_; } - OpenGLTexture& managed_tex() + QVariant managed_tex() { return managed_tex_; } - OpenGLFramebuffer& framebuffer() - { - return framebuffer_; - } - private: void UploadTextureFromBuffer(); - OpenGLShaderPtr pipeline_; + QVariant pipeline_; - OpenGLTexture texture_; + QVariant texture_; - OpenGLTexture managed_tex_; - - OpenGLFramebuffer framebuffer_; + QVariant managed_tex_; Frame* buffer_; diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 0f8f6866f..430d8cbf7 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -25,9 +25,7 @@ #include "node/node.h" #include "render/backend/opengl/openglcolorprocessor.h" -#include "render/backend/opengl/openglframebuffer.h" #include "render/backend/opengl/openglshader.h" -#include "render/backend/opengl/opengltexture.h" #include "render/color.h" #include "render/colormanager.h" #include "tool/tool.h" @@ -211,7 +209,7 @@ private: /** * @brief Internal reference to the OpenGL texture to draw. Set in SetTexture() and used in paintGL(). */ - OpenGLTexture texture_; + QVariant texture_; /** * @brief Translation only matrix (defaults to identity). From 6ecdb02fd0541ea6fdef8e7c06cca82ce8dfd09e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 8 Nov 2020 00:47:59 +1100 Subject: [PATCH 16/72] okay maybe not --- app/common/CMakeLists.txt | 1 + app/common/threadsafemap.h | 27 ++ app/render/CMakeLists.txt | 1 + app/render/backend/opengl/openglrenderer.cpp | 137 ++++++++-- app/render/backend/opengl/openglrenderer.h | 14 +- app/render/backend/opengl/openglshader.cpp | 254 ------------------ app/render/backend/opengl/openglshader.h | 65 ----- app/render/backend/renderer.h | 2 +- app/render/rendermanager.cpp | 1 + app/render/renderprocessor.cpp | 94 +++++-- app/render/renderprocessor.h | 3 + app/render/shaderinfo.h | 13 + app/render/stillimagecache.h | 83 ++++++ app/shaders/default.frag | 21 ++ app/shaders/default.vert | 18 ++ app/shaders/deinterlace.frag | 26 ++ app/task/export/export.cpp | 8 +- app/widget/colorwheel/colorswatchwidget.cpp | 2 - app/widget/colorwheel/colorswatchwidget.h | 1 - app/widget/colorwheel/colorwheelwidget.h | 1 - app/widget/scope/waveform/waveform.cpp | 2 +- app/widget/scope/waveform/waveform.h | 2 +- .../view/timelineviewblockitem.cpp | 2 - app/widget/viewer/viewerdisplay.h | 3 +- 24 files changed, 393 insertions(+), 388 deletions(-) create mode 100644 app/common/threadsafemap.h delete mode 100644 app/render/backend/opengl/openglshader.cpp delete mode 100644 app/render/backend/opengl/openglshader.h create mode 100644 app/render/stillimagecache.h create mode 100644 app/shaders/default.frag create mode 100644 app/shaders/default.vert create mode 100644 app/shaders/deinterlace.frag diff --git a/app/common/CMakeLists.txt b/app/common/CMakeLists.txt index 99521453c..847d6e426 100644 --- a/app/common/CMakeLists.txt +++ b/app/common/CMakeLists.txt @@ -44,6 +44,7 @@ set(OLIVE_SOURCES common/ratiodialog.cpp common/rational.h common/rational.cpp + common/threadsafemap.h common/threadedobject.h common/threadedobject.cpp common/timecodefunctions.h diff --git a/app/common/threadsafemap.h b/app/common/threadsafemap.h new file mode 100644 index 000000000..0d4a6bc7e --- /dev/null +++ b/app/common/threadsafemap.h @@ -0,0 +1,27 @@ +#ifndef THREADSAFEMAP_H +#define THREADSAFEMAP_H + +#include +#include + +template +class ThreadSafeMap +{ +public: + ThreadSafeMap() = default; + + void insert(K key, V value) + { + mutex_.lock(); + map_.insert(key, value); + mutex_.unlock(); + } + +private: + QMutex mutex_; + + QMap map_; + +}; + +#endif // THREADSAFEMAP_H diff --git a/app/render/CMakeLists.txt b/app/render/CMakeLists.txt index 1b3c2b9fc..c569c0293 100644 --- a/app/render/CMakeLists.txt +++ b/app/render/CMakeLists.txt @@ -49,6 +49,7 @@ set(OLIVE_SOURCES render/renderprocessor.h render/renderprocessor.cpp render/shaderinfo.h + render/stillimagecache.h render/videoparams.h render/videoparams.cpp PARENT_SCOPE diff --git a/app/render/backend/opengl/openglrenderer.cpp b/app/render/backend/opengl/openglrenderer.cpp index a37a84055..8280f6518 100644 --- a/app/render/backend/opengl/openglrenderer.cpp +++ b/app/render/backend/opengl/openglrenderer.cpp @@ -24,6 +24,36 @@ OLIVE_NAMESPACE_ENTER +const QVector blit_vertices = { + -1.0f, -1.0f, 0.0f, + 1.0f, -1.0f, 0.0f, + 1.0f, 1.0f, 0.0f, + + -1.0f, -1.0f, 0.0f, + -1.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 0.0f +}; + +const QVector blit_texcoords = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 1.0f, 1.0f, + + 0.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f +}; + +const QVector flipped_blit_texcoords = { + 0.0f, 1.0f, + 1.0f, 1.0f, + 1.0f, 0.0f, + + 0.0f, 1.0f, + 0.0f, 0.0f, + 1.0f, 0.0f +}; + OpenGLRenderer::OpenGLRenderer(QObject* parent) : Renderer(parent), context_(nullptr) @@ -75,18 +105,45 @@ void OpenGLRenderer::PostInit() // Store OpenGL functions instance functions_ = context_->functions(); functions_->glBlendFunc(GL_ONE, GL_ZERO); + + // Set up framebuffer used for various things + functions_->glGenFramebuffers(1, &framebuffer_); + + // Set up vertex array object + vao_.create(); + + // Set up vertex buffer + vert_vbo_.create(); + vert_vbo_.bind(); + vert_vbo_.allocate(blit_vertices.constData(), blit_vertices.size() * sizeof(GLfloat)); + vert_vbo_.release(); + + // Set up fragment buffer + frag_vbo_.create(); + frag_vbo_.bind(); + frag_vbo_.allocate(blit_texcoords.constData(), blit_texcoords.size() * sizeof(GLfloat)); + frag_vbo_.release(); } void OpenGLRenderer::Destroy() { + // Delete vertex array object + vao_.destroy(); + + // Delete framebuffer + functions_->glDeleteFramebuffers(1, &framebuffer_); + + // Delete all shaders + qDeleteAll(shader_cache_); + shader_cache_.clear(); + + // Delete context if it belongs to us if (context_->parent() == this) { delete context_; } context_ = nullptr; - qDeleteAll(shader_cache_); - shader_cache_.clear(); - + // Destroy surface if we created it if (surface_.isValid()) { surface_.destroy(); } @@ -183,11 +240,11 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR } if (frag_code.isEmpty()) { - frag_code = OpenGLShader::CodeDefaultFragment(); + frag_code = Node::ReadFileAsString(QStringLiteral(":/shaders/default.frag")); } if (vert_code.isEmpty()) { - vert_code = OpenGLShader::CodeDefaultVertex(); + vert_code = Node::ReadFileAsString(QStringLiteral(":/shaders/default.vert")); } shader = new QOpenGLShaderProgram(this); @@ -354,8 +411,6 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR static_cast(params.width()), static_cast(params.height())); - shader->release(); - // Create the output textures PixelFormat::Format output_format = (input_textures_have_alpha || job.GetAlphaChannelRequired()) ? PixelFormat::GetFormatWithAlphaChannel(params.format()) @@ -393,14 +448,28 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR for (int i=0; iglActiveTexture(GL_TEXTURE0 + i); functions_->glBindTexture(GL_TEXTURE_2D, textures_to_bind.at(i)); - OpenGLRenderFunctions::PrepareToDraw(functions_); + PrepareInputTexture(job.GetBilinearFiltering()); } + // Bind vertex array object + vao_.bind(); + + // Set buffers + int vertex_location = shader->attributeLocation("a_position"); + vert_vbo_.bind(); + functions_->glEnableVertexAttribArray(vertex_location); + functions_->glVertexAttribPointer(vertex_location, 3, GL_FLOAT, GL_FALSE, 0, nullptr); + vert_vbo_.release(); + + int tex_location = shader->attributeLocation("a_texcoord"); + frag_vbo_.bind(); + functions_->glEnableVertexAttribArray(tex_location); + functions_->glVertexAttribPointer(tex_location, 2, GL_FLOAT, GL_FALSE, 0, nullptr); + frag_vbo_.release(); + for (int iteration=0; iterationbind(); shader->setUniformValue("ove_iteration", iteration); - shader->release(); // Replace iterative input if (iteration == 0) { @@ -410,18 +479,22 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR output_tex = dst_refs[iteration%2]; functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); - functions_->glBindTexture(GL_TEXTURE_2D, input_tex->texture()->texture()); - OpenGLRenderFunctions::PrepareToDraw(functions_); + functions_->glBindTexture(GL_TEXTURE_2D, input_tex->id().value()); + PrepareInputTexture(job.GetBilinearFiltering()); } - buffer_.Attach(output_tex, true); - buffer_.Bind(); + functions_->glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_); + functions_->glFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + output_tex->id().value(), + 0); // Blit this texture through this shader - OpenGLRenderFunctions::Blit(shader); + functions_->glDrawArrays(GL_TRIANGLES, 0, blit_vertices.size() / 3); - buffer_.Release(); - buffer_.Detach(); + // Reset framebuffer to default + functions_->glBindFramebuffer(GL_FRAMEBUFFER, 0); } // Release any textures we bound before @@ -430,16 +503,15 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR functions_->glBindTexture(GL_TEXTURE_2D, 0); } + // Release vertex array object + vao_.release(); + + // Release shader + shader->release(); + return output_tex; } -/*VideoParams OpenGLRenderer::GetParamsFromTexture(QVariant texture) -{ - GLuint t = texture.value(); - - return texture_params_.value(t); -}*/ - GLint OpenGLRenderer::GetInternalFormat(PixelFormat::Format format) { switch (format) { @@ -501,4 +573,21 @@ GLenum OpenGLRenderer::GetPixelType(PixelFormat::Format format) return GL_INVALID_VALUE; } +void OpenGLRenderer::PrepareInputTexture(bool bilinear) +{ + if (bilinear) { + // Use mipmapped bilinear + functions_->glGenerateMipmap(GL_TEXTURE_2D); + functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else { + // Use nearest + functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + + functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +} + OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglrenderer.h b/app/render/backend/opengl/openglrenderer.h index 5c6bbb1d2..00cf5275d 100644 --- a/app/render/backend/opengl/openglrenderer.h +++ b/app/render/backend/opengl/openglrenderer.h @@ -22,8 +22,10 @@ #define OPENGLCONTEXT_H #include +#include #include #include +#include #include #include "render/backend/renderer.h" @@ -60,7 +62,7 @@ public slots: const OLIVE_NAMESPACE::ShaderJob &job, const OLIVE_NAMESPACE::VideoParams ¶ms) override; - virtual QVariant TransformColor(QVariant texture, ColorProcessorPtr processor) override; + virtual TexturePtr TransformColor(Texture* texture, OLIVE_NAMESPACE::ColorProcessorPtr processor) override; private: static GLint GetInternalFormat(PixelFormat::Format format); @@ -69,12 +71,22 @@ private: static GLenum GetPixelType(PixelFormat::Format format); + void PrepareInputTexture(bool bilinear); + QOpenGLContext* context_; QOpenGLFunctions* functions_; QOffscreenSurface surface_; + QOpenGLVertexArrayObject vao_; + + QOpenGLBuffer vert_vbo_; + + QOpenGLBuffer frag_vbo_; + + GLuint framebuffer_; + QHash shader_cache_; }; diff --git a/app/render/backend/opengl/openglshader.cpp b/app/render/backend/opengl/openglshader.cpp deleted file mode 100644 index 7e76f619a..000000000 --- a/app/render/backend/opengl/openglshader.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "openglshader.h" - -#include -OLIVE_NAMESPACE_ENTER - -OpenGLShaderPtr OpenGLShader::Create() -{ - return std::make_shared(); -} - -OpenGLShaderPtr OpenGLShader::CreateDefault(const QString &function_name, const QString &shader_code) -{ - OpenGLShaderPtr program = Create(); - - // Add shaders to program - program->addShaderFromSourceCode(QOpenGLShader::Vertex, CodeDefaultVertex()); - program->addShaderFromSourceCode(QOpenGLShader::Fragment, CodeDefaultFragment(function_name, shader_code)); - program->link(); - - return program; -} - -// copied from source code to OCIODisplay -const int OCIO_LUT3D_EDGE_SIZE = 64; - -// copied from source code to OCIODisplay, expanded from 3*LUT3D_EDGE_SIZE*LUT3D_EDGE_SIZE*LUT3D_EDGE_SIZE -const int OCIO_NUM_3D_ENTRIES = 3*OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE; - -OpenGLShaderPtr OpenGLShader::CreateOCIO(QOpenGLContext* ctx, - GLuint& lut_texture, - OCIO::ConstProcessorRcPtr processor, - bool alpha_is_associated) -{ - QOpenGLExtraFunctions* xf = ctx->extraFunctions(); - - // Set up shader description - OCIO::GpuShaderDesc shaderDesc; - const char* ocio_func_name = "OCIODisplay"; - shaderDesc.setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_3); - shaderDesc.setFunctionName(ocio_func_name); - shaderDesc.setLut3DEdgeLen(OCIO_LUT3D_EDGE_SIZE); - - // Compute LUT - std::vector ocio_lut_data(OCIO_NUM_3D_ENTRIES); - processor->getGpuLut3D(&ocio_lut_data[0], shaderDesc); - - // Create LUT texture - xf->glGenTextures(1, &lut_texture); - - // Bind LUT - xf->glActiveTexture(GL_TEXTURE1); - xf->glBindTexture(GL_TEXTURE_3D, lut_texture); - - // Set texture parameters - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - - // Allocate storage for texture - xf->glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16F, - OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, - 0, GL_RGB, GL_FLOAT, &ocio_lut_data[0]); - - // Create OCIO shader code - QString shader_text; - - // Workaround since OCIO doesn't support the GLSL version we use - shader_text.append(QStringLiteral("#define texture2D texture\n" - "#define texture3D texture\n")); - - // Append OCIO shader code - shader_text.append(processor->getGpuShaderText(shaderDesc)); - - QString shader_call; - - // Enforce alpha association - if (alpha_is_associated) { - - // If alpha is already associated, we'll need to disassociate and reassociate - shader_text.append("\n"); - - QString disassociate_func_name = "disassoc"; - shader_text.append(CodeAlphaDisassociate(disassociate_func_name)); - - QString reassociate_func_name = "reassoc"; - shader_text.append(CodeAlphaReassociate(reassociate_func_name)); - - // Make OCIO call pass through disassociate and reassociate function - shader_call = QStringLiteral("%3(%1(%2(col), ove_ociolut));").arg(ocio_func_name, - disassociate_func_name, - reassociate_func_name); - - } else { - - // If alpha is not already associated, we can just associate after OCIO - - // Add associate function - QString associate_func_name = "assoc"; - shader_text.append(CodeAlphaAssociate(associate_func_name)); - - // Make OCIO call pass through associate function - shader_call = QStringLiteral("%2(%1(col, ove_ociolut));").arg(ocio_func_name, associate_func_name); - - } - - // Add process() function, which GetPipeline() will call if specified - QString process_function_name = "process"; - shader_text.append(QStringLiteral("\n" - "uniform sampler3D ove_ociolut;\n" - "\n" - "vec4 %2(vec4 col) {\n" - " return %1\n" - "}\n").arg(shader_call, process_function_name)); - - - // Get pipeline-based shader to inject OCIO shader into - OpenGLShaderPtr shader = OpenGLShader::CreateDefault(process_function_name, shader_text); - - // Release LUT - xf->glBindTexture(GL_TEXTURE_3D, 0); - - xf->glActiveTexture(GL_TEXTURE0); - - return shader; -} - -QString OpenGLShader::CodeDefaultFragment(QString function_name, const QString &shader_code) -{ - // Create shader header - QString frag_code = QStringLiteral("#version 150\n" - "\n" - "#ifdef GL_ES\n" - "precision highp int;\n" - "precision highp float;\n" - "#endif\n" - "\n" - "uniform sampler2D ove_maintex;\n" - "uniform vec2 ove_resolution;\n" - "uniform bool ove_deinterlace;\n" - "\n" - "in vec2 ove_texcoord;\n" - "\n" - "out vec4 fragColor;\n" - "\n"); - - // Check if additional code was passed to this function, add it here - if (!function_name.isEmpty() && !shader_code.isEmpty()) { - - // If additional code was passed, add it and reference it in main(). - // - // The function in the additional code is expected to be `vec4 function_name(vec4 color)`. - // The texture coordinate can be acquired through `ove_texcoord`. - - frag_code.append(shader_code); - - } else { - - // No function to call - function_name = QString(); - - } - - // Our function_name arg will either resolve to the function added to this or to nothing, in - // which case they'll just be benign brackets. - frag_code.append(QStringLiteral("\n" - "void main() {\n" - " vec2 using_texcoord = ove_texcoord;\n" - " if (ove_deinterlace) {\n" - " // A very basic deinterlace that halves the vertical\n" - " // resolution and linearly interpolates the two fields\n" - " // by reading the texture coord between them.\n" - " float half_vert = round(ove_resolution.y / 2.0);\n" - " using_texcoord.y = (round(using_texcoord.y * half_vert) + 0.25) / half_vert;\n" - " }\n" - " vec4 color = %1(texture(ove_maintex, using_texcoord));\n" - " fragColor = color;\n" - "}\n").arg(function_name)); - - return frag_code; -} - -QString OpenGLShader::CodeDefaultVertex() -{ - // Generate vertex shader - return QStringLiteral("#version 150\n" - "\n" - "#ifdef GL_ES\n" - "precision highp int;\n" - "precision highp float;\n" - "#endif\n" - "\n" - "uniform mat4 ove_mvpmat;\n" - "\n" - "in vec4 a_position;\n" - "in vec2 a_texcoord;\n" - "\n" - "out vec2 ove_texcoord;\n" - "\n" - "void main() {\n" - " gl_Position = ove_mvpmat * a_position;\n" - " ove_texcoord = a_texcoord;\n" - "}\n"); -} - -QString OpenGLShader::CodeAlphaDisassociate(const QString &function_name) -{ - return QStringLiteral("vec4 %1(vec4 col) {\n" - " if (col.a > 0.0) {\n" - " return vec4(col.rgb / col.a, col.a);" - " }\n" - " return col;\n" - "}\n").arg(function_name); -} - -QString OpenGLShader::CodeAlphaReassociate(const QString &function_name) -{ - return QStringLiteral("vec4 %1(vec4 col) {\n" - " if (col.a > 0.0) {\n" - " return vec4(col.rgb * col.a, col.a);" - " }\n" - " return col;\n" - "}\n").arg(function_name); -} - -QString OpenGLShader::CodeAlphaAssociate(const QString &function_name) -{ - return QStringLiteral("vec4 %1(vec4 col) {\n" - " return vec4(col.rgb * col.a, col.a);\n" - "}\n").arg(function_name); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglshader.h b/app/render/backend/opengl/openglshader.h deleted file mode 100644 index 452dc3c3d..000000000 --- a/app/render/backend/opengl/openglshader.h +++ /dev/null @@ -1,65 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OPENGLSHADER_H -#define OPENGLSHADER_H - -#include -#include - -#include -namespace OCIO = OCIO_NAMESPACE::v1; - -#include "common/define.h" - -OLIVE_NAMESPACE_ENTER - -class OpenGLShader; -using OpenGLShaderPtr = std::shared_ptr; - -/** - * @brief A simple QOpenGLShaderProgram derivative with static functions for creating - */ -class OpenGLShader : public QOpenGLShaderProgram { -public: - OpenGLShader() = default; - - static OpenGLShaderPtr Create(); - - static OpenGLShaderPtr CreateDefault(const QString &function_name = QString(), - const QString &shader_code = QString()); - - static OpenGLShaderPtr CreateOCIO(QOpenGLContext* ctx, - GLuint& lut_texture, - OCIO::ConstProcessorRcPtr processor, - bool alpha_is_associated); - - static QString CodeDefaultFragment(QString function_name = QString(), - const QString &shader_code = QString()); - static QString CodeDefaultVertex(); - static QString CodeAlphaDisassociate(const QString& function_name); - static QString CodeAlphaReassociate(const QString& function_name); - static QString CodeAlphaAssociate(const QString& function_name); - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // OPENGLSHADER_H diff --git a/app/render/backend/renderer.h b/app/render/backend/renderer.h index 7f3e3d334..e30bb0c9d 100644 --- a/app/render/backend/renderer.h +++ b/app/render/backend/renderer.h @@ -132,7 +132,7 @@ public slots: const OLIVE_NAMESPACE::ShaderJob &job, const OLIVE_NAMESPACE::VideoParams ¶ms) = 0; - virtual QVariant TransformColor(QVariant texture, OLIVE_NAMESPACE::ColorProcessorPtr processor) = 0; + virtual TexturePtr TransformColor(Texture* texture, OLIVE_NAMESPACE::ColorProcessorPtr processor) = 0; virtual void Render() = 0; diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 9979b2b29..99f7f47be 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -80,6 +80,7 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, const rational ticket->setProperty("matrix", matrix); ticket->setProperty("mode", mode); ticket->setProperty("type", kTypeVideo); + ticket->setProperty("cache", viewer->video_frame_cache()->GetCacheDirectory()); // Queue appending the ticket and running the next job on our thread to make this function thread-safe QMetaObject::invokeMethod(this, "AddTicket", Qt::AutoConnection, diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index dc6d898d4..8c194b358 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -197,30 +197,59 @@ NodeValueTable RenderProcessor::GenerateBlockTable(const TrackOutput *track, con QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational &input_time) { + Renderer::TexturePtr value = nullptr; + + // Check the still frame cache. On large frames such as high resolution still images, uploading + // and color managing them for every frame is a waste of time, so we implement a small cache here + // to optimize such a situation VideoStreamPtr video_stream = std::static_pointer_cast(stream); - rational time_match = (video_stream->video_type() == VideoStream::kVideoTypeStill) ? 0 : input_time; - QString colorspace_match = video_stream->get_colorspace_match_string(); - - QVariant value; - bool found_cache = false; - const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); + StillImageCache::Entry want_entry = {nullptr, + stream, + video_stream->get_colorspace_match_string(), + video_stream->premultiplied_alpha(), + video_params.divider(), + (video_stream->video_type() == VideoStream::kVideoTypeStill) ? 0 : input_time}; - if (still_image_cache_.contains(stream.get())) { - const CachedStill& cs = still_image_cache_[stream.get()]; + still_image_cache_->mutex()->lock(); - if (cs.colorspace == colorspace_match - && cs.alpha_is_associated == video_stream->premultiplied_alpha() - && cs.divider == video_params.divider() - && cs.time == time_match) { - value = cs.texture; - found_cache = true; - } else { - still_image_cache_.remove(stream.get()); + foreach (const StillImageCache::Entry& e, still_image_cache_->entries()) { + if (StillImageCache::CompareEntryMetadata(want_entry, e)) { + // Found an exact match of the texture we want in the cache, use it instead of reading it + // ourselves + value = e.texture; + break; } } - if (!found_cache) { + if (!value) { + // Failed to find the texture, let's see if it's being generated by another processor + foreach (const StillImageCache::Entry& e, still_image_cache_->pending()) { + if (StillImageCache::CompareEntryMetadata(want_entry, e)) { + // An exact match of this texture is pending, let's wait for it + while (!value) { + // FIXME: Hacky way of waiting for other threads + still_image_cache_->mutex()->unlock(); + QThread::msleep(1); + still_image_cache_->mutex()->lock(); + + value = e.texture; + } + break; + } + } + } + + if (value) { + // Found the texture, we can release the cache now + still_image_cache_->mutex()->unlock(); + } else { + // Wasn't in still image cache, so we'll have to retrieve it from the decoder + + // Let other processors know we're getting this texture + still_image_cache_->PushPending(want_entry); + + still_image_cache_->mutex()->unlock(); DecoderPtr decoder = ResolveDecoderFromInput(stream); @@ -230,22 +259,26 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & if (frame) { // Return a texture from the derived class + Renderer::TexturePtr unmanaged_texture = render_ctx_->CreateTexture(frame->video_params(), frame->data(), frame->linesize_pixels()); + + Renderer::TexturePtr managed_texture = render_ctx_->TransformColor(unmanaged_texture, ) + value = FootageFrameToTexture(stream, frame); - if (!value.isNull()) { - // Put this into the image cache instead - still_image_cache_.insert(stream.get(), {value, - colorspace_match, - video_stream->premultiplied_alpha(), - video_params .divider(), - time_match}); - } + still_image_cache_->mutex()->lock(); + + still_image_cache_->RemovePending(want_entry); + + // Put this into the image cache instead + want_entry.texture = value; + still_image_cache_->PushEntry(want_entry); + + still_image_cache_->mutex()->unlock(); } } - } - return value; + return QVariant::fromValue(value); } QVariant RenderProcessor::ProcessAudioFootage(StreamPtr stream, const TimeRange &input_time) @@ -369,7 +402,9 @@ QVariant RenderProcessor::ProcessFrameGeneration(const Node *node, const Generat node->GenerateFrame(frame, job); - return CachedFrameToTexture(frame); + Renderer::TexturePtr texture = render_ctx_->CreateTexture(frame->video_params(), frame->data(), frame->linesize_pixels()); + + return QVariant::fromValue(texture); } QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) @@ -393,7 +428,8 @@ QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) f->video_params().interlacing(), video_params.divider())); - return CachedFrameToTexture(f); + Renderer::TexturePtr texture = render_ctx_->CreateTexture(f->video_params(), f->data(), f->linesize_pixels()); + return QVariant::fromValue(texture); } } diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index f41d4961d..bf6942770 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -23,6 +23,7 @@ #include "node/traverser.h" #include "render/backend/renderer.h" +#include "stillimagecache.h" #include "threading/threadticket.h" OLIVE_NAMESPACE_ENTER @@ -68,6 +69,8 @@ private: Renderer* render_ctx_; + StillImageCache* still_image_cache_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/shaderinfo.h b/app/render/shaderinfo.h index 1fa685e2b..8af331d9a 100644 --- a/app/render/shaderinfo.h +++ b/app/render/shaderinfo.h @@ -122,6 +122,7 @@ public: { iterations_ = 1; iterative_input_ = nullptr; + bilinear_ = true; } const QString& GetShaderID() const @@ -150,6 +151,16 @@ public: return iterative_input_; } + bool GetBilinearFiltering() const + { + return bilinear_; + } + + void SetBilinearFiltering(bool e) + { + bilinear_ = e; + } + private: QString id_; @@ -157,6 +168,8 @@ private: NodeInput* iterative_input_; + bool bilinear_; + }; class ShaderCode { diff --git a/app/render/stillimagecache.h b/app/render/stillimagecache.h new file mode 100644 index 000000000..9a0b17cb7 --- /dev/null +++ b/app/render/stillimagecache.h @@ -0,0 +1,83 @@ +#ifndef STILLIMAGECACHE_H +#define STILLIMAGECACHE_H + +#include + +#include "common/rational.h" +#include "project/item/footage/stream.h" +#include "render/backend/renderer.h" + +OLIVE_NAMESPACE_ENTER + +class StillImageCache +{ +public: + struct Entry { + Renderer::TexturePtr texture; + StreamPtr stream; + QString colorspace; + bool alpha_is_associated; + int divider; + rational time; + }; + + QMutex* mutex() + { + return &mutex_; + } + + const QVector& entries() const + { + return entries_; + } + + const QVector& pending() const + { + return pending_; + } + + static bool CompareEntryMetadata(const Entry& a, const Entry& b) + { + return (a.stream == b.stream + && a.colorspace == b.colorspace + && a.alpha_is_associated == b.alpha_is_associated + && a.divider == b.divider + && a.time == b.time); + } + + void PushPending(const Entry& e) + { + pending_.prepend(e); + } + + void PushEntry(const Entry& e) + { + entries_.prepend(e); + + if (entries_.size() > 8) { + entries_.removeLast(); + } + } + + void RemovePending(const Entry& e) + { + for (int i=0; i entries_; + + QVector pending_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // STILLIMAGECACHE_H diff --git a/app/shaders/default.frag b/app/shaders/default.frag new file mode 100644 index 000000000..62a34b668 --- /dev/null +++ b/app/shaders/default.frag @@ -0,0 +1,21 @@ +#version 150 + +#ifdef GL_ES +precision highp int; +precision highp float; +#endif + +// Input texture +uniform sampler2D ove_maintex; + +// Input texture coordinate +in vec2 ove_texcoord; + +// Output color +out vec4 fragColor; + +void main() { + vec2 using_texcoord = ove_texcoord; + vec4 color = texture(ove_maintex, ove_texcoord); + fragColor = color; +} \ No newline at end of file diff --git a/app/shaders/default.vert b/app/shaders/default.vert new file mode 100644 index 000000000..2569ec9f2 --- /dev/null +++ b/app/shaders/default.vert @@ -0,0 +1,18 @@ +#version 150 + +#ifdef GL_ES +precision highp int; +precision highp float; +#endif + +uniform mat4 ove_mvpmat; + +in vec4 a_position; +in vec2 a_texcoord; + +out vec2 ove_texcoord; + +void main() { + gl_Position = ove_mvpmat * a_position; + ove_texcoord = a_texcoord; +} \ No newline at end of file diff --git a/app/shaders/deinterlace.frag b/app/shaders/deinterlace.frag new file mode 100644 index 000000000..bda9c732f --- /dev/null +++ b/app/shaders/deinterlace.frag @@ -0,0 +1,26 @@ +#version 150 + +#ifdef GL_ES +precision highp int; +precision highp float; +#endif + +uniform sampler2D ove_maintex; +uniform vec2 ove_resolution; + +in vec2 ove_texcoord; + +out vec4 fragColor; + +void main() { + vec2 using_texcoord = ove_texcoord; + + // A very basic deinterlace that halves the vertical + // resolution and linearly interpolates the two fields + // by reading the texture coord between them. + float half_vert = round(ove_resolution.y / 2.0); + using_texcoord.y = (round(using_texcoord.y * half_vert) + 0.25) / half_vert; + + vec4 color = %1(texture(ove_maintex, using_texcoord)); + fragColor = color; +} diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index 60afd5b97..210d1cb23 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -65,13 +65,13 @@ bool ExportTask::Run() // If a transformation matrix is applied to this video, create it here if (params_.video_scaling_method() != ExportParams::kStretch) { - QMatrix4x4 mat = ExportParams::GenerateMatrix(params_.video_scaling_method(), + // FIXME: Re-implement this + + /*QMatrix4x4 mat = ExportParams::GenerateMatrix(params_.video_scaling_method(), viewer()->video_params().width(), viewer()->video_params().height(), params_.video_params().width(), - params_.video_params().height()); - - // FIXME: Re-implement this + params_.video_params().height());*/ } // Create color processor diff --git a/app/widget/colorwheel/colorswatchwidget.cpp b/app/widget/colorwheel/colorswatchwidget.cpp index f243e46e2..be6722a83 100644 --- a/app/widget/colorwheel/colorswatchwidget.cpp +++ b/app/widget/colorwheel/colorswatchwidget.cpp @@ -22,8 +22,6 @@ #include -#include "render/backend/opengl/openglrenderfunctions.h" - OLIVE_NAMESPACE_ENTER ColorSwatchWidget::ColorSwatchWidget(QWidget *parent) : diff --git a/app/widget/colorwheel/colorswatchwidget.h b/app/widget/colorwheel/colorswatchwidget.h index de8c1a828..dc0a43f20 100644 --- a/app/widget/colorwheel/colorswatchwidget.h +++ b/app/widget/colorwheel/colorswatchwidget.h @@ -23,7 +23,6 @@ #include -#include "render/backend/opengl/openglshader.h" #include "render/color.h" #include "render/colorprocessor.h" diff --git a/app/widget/colorwheel/colorwheelwidget.h b/app/widget/colorwheel/colorwheelwidget.h index 17c739886..78ddb26c6 100644 --- a/app/widget/colorwheel/colorwheelwidget.h +++ b/app/widget/colorwheel/colorwheelwidget.h @@ -24,7 +24,6 @@ #include #include "colorswatchwidget.h" -#include "render/backend/opengl/openglshader.h" #include "render/color.h" OLIVE_NAMESPACE_ENTER diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index ff4f1296b..16e8b260b 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -36,7 +36,7 @@ WaveformScope::WaveformScope(QWidget* parent) : { } -OpenGLShaderPtr WaveformScope::CreateShader() +QVariant WaveformScope::CreateShader() { OpenGLShaderPtr pipeline = OpenGLShader::Create(); diff --git a/app/widget/scope/waveform/waveform.h b/app/widget/scope/waveform/waveform.h index 04a464e52..4aeebc105 100644 --- a/app/widget/scope/waveform/waveform.h +++ b/app/widget/scope/waveform/waveform.h @@ -32,7 +32,7 @@ public: WaveformScope(QWidget* parent = nullptr); protected: - virtual OpenGLShaderPtr CreateShader() override; + virtual QVariant CreateShader() override; virtual void DrawScope() override; diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.cpp b/app/widget/timelinewidget/view/timelineviewblockitem.cpp index 9c3a6ceba..7b98b3630 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewblockitem.cpp @@ -94,8 +94,6 @@ void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsI painter->setPen(QColor(64, 64, 64)); TrackOutput* track = TrackOutput::TrackFromBlock(block_); if (track) { - QMutexLocker locker(track->waveform_lock()); - AudioVisualWaveform::DrawWaveform(painter, rect().toRect(), this->GetScale(), diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 430d8cbf7..354d622cf 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -22,10 +22,9 @@ #define VIEWERGLWIDGET_H #include +#include #include "node/node.h" -#include "render/backend/opengl/openglcolorprocessor.h" -#include "render/backend/opengl/openglshader.h" #include "render/color.h" #include "render/colormanager.h" #include "tool/tool.h" From 94c0914e50087e795d2cd430cf0430c230aeef2e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 10 Nov 2020 11:23:25 +1100 Subject: [PATCH 17/72] codec system rework Codecs are now much cleaner and thread safe by design. --- app/codec/decoder.cpp | 226 +++-- app/codec/decoder.h | 236 +++-- app/codec/ffmpeg/ffmpegcommon.cpp | 14 - app/codec/ffmpeg/ffmpegdecoder.cpp | 1069 ++++++---------------- app/codec/ffmpeg/ffmpegdecoder.h | 207 ++--- app/codec/ffmpeg/ffmpegframepool.cpp | 20 +- app/codec/ffmpeg/ffmpegframepool.h | 4 +- app/codec/frame.cpp | 72 +- app/codec/frame.h | 69 +- app/codec/oiio/CMakeLists.txt | 4 +- app/codec/oiio/oiiocommon.cpp | 102 +++ app/codec/oiio/oiiocommon.h | 47 + app/codec/oiio/oiiodecoder.cpp | 170 +--- app/codec/oiio/oiiodecoder.h | 23 +- app/project/item/footage/audiostream.cpp | 32 - app/project/item/footage/audiostream.h | 11 - app/project/item/footage/footage.cpp | 2 +- 17 files changed, 932 insertions(+), 1376 deletions(-) create mode 100644 app/codec/oiio/oiiocommon.cpp create mode 100644 app/codec/oiio/oiiocommon.h diff --git a/app/codec/decoder.cpp b/app/codec/decoder.cpp index d4dc7108b..e8a5bf71b 100644 --- a/app/codec/decoder.cpp +++ b/app/codec/decoder.cpp @@ -39,55 +39,160 @@ OLIVE_NAMESPACE_ENTER +QMutex Decoder::currently_conforming_mutex_; +QWaitCondition Decoder::currently_conforming_wait_cond_; +QVector Decoder::currently_conforming_; + Decoder::Decoder() : - open_(false), stream_(nullptr) { } -Decoder::Decoder(Stream *fs) : - open_(false), - stream_(fs) +bool Decoder::Open(StreamPtr fs) { + QMutexLocker locker(&mutex_); + + if (stream_) { + // Decoder is already open. Return TRUE if the stream is the stream we have, or FALSE if not. + if (stream_ == fs) { + return true; + } else { + qWarning() << "Tried to open a decoder that was already open with another stream"; + return false; + } + } else { + // Stream was not open, try opening it now + if (fs == nullptr) { + // Cannot open null stream + qCritical() << "Decoder attempted to open null stream"; + return false; + } + + if (fs->footage()->decoder() != id()) { + qCritical() << "Tried to open footage in incorrect decoder"; + return false; + } + + // Set stream + stream_ = fs; + + // Try open internal + if (OpenInternal()) { + return true; + } else { + // Unset stream + CloseInternal(); + stream_ = nullptr; + return false; + } + } } -StreamPtr Decoder::stream() const +FramePtr Decoder::RetrieveVideo(const rational &timecode, const int ÷r) { - return stream_; + QMutexLocker locker(&mutex_); + + if (!stream_) { + qCritical() << "Can't retrieve video on a closed decoder"; + return nullptr; + } + + if (!SupportsVideo()) { + qCritical() << "Decoder doesn't support video"; + return nullptr; + } + + if (stream_->type() != Stream::kVideo) { + qCritical() << "Tried to retrieve video from a non-video stream"; + return nullptr; + } + + return RetrieveVideoInternal(timecode, divider); } -void Decoder::set_stream(StreamPtr fs) +SampleBufferPtr Decoder::RetrieveAudio(const TimeRange &range, const AudioParams ¶ms, const QAtomicInt *cancelled) { - Close(); + QMutexLocker locker(&mutex_); - stream_ = fs; + if (!stream_) { + qCritical() << "Can't retrieve audio on a closed decoder"; + return nullptr; + } + + if (!SupportsAudio()) { + qCritical() << "Decoder doesn't support audio"; + return nullptr; + } + + if (stream_->type() != Stream::kAudio) { + qCritical() << "Tried to retrieve audio from a non-audio stream"; + return nullptr; + } + + // Determine if we already have a conformed version + QString conform_filename = GetConformedFilename(params); + CurrentlyConforming want_conform = {stream_, params}; + + currently_conforming_mutex_.lock(); + + // Wait for conform to complete + while (currently_conforming_.contains(want_conform)) { + currently_conforming_wait_cond_.wait(¤tly_conforming_mutex_); + } + + // See if we got the conform + SampleBufferPtr buffer = RetrieveAudioFromConform(conform_filename, range); + + if (!buffer) { + // We'll need to conform this ourselves + currently_conforming_.append(want_conform); + currently_conforming_mutex_.unlock(); + + // We conform to a different filename until it's done to make it clear even across sessions + // whether this conform is ready or not + QString working_fn = conform_filename; + working_fn.append(QStringLiteral(".working")); + + if (ConformAudioInternal(working_fn, params, cancelled)) { + // Move file to standard conform name, making it clear this conform is ready for use + QFile::remove(conform_filename); + QFile::rename(working_fn, conform_filename); + + // Return audio as planned + buffer = RetrieveAudioFromConform(conform_filename, range); + } else { + // Failed + qCritical() << "Failed to conform audio"; + } + + currently_conforming_mutex_.lock(); + currently_conforming_.removeOne(want_conform); + currently_conforming_wait_cond_.wakeAll(); + } + + currently_conforming_mutex_.unlock(); + + return buffer; } -FramePtr Decoder::RetrieveVideo(const rational &/*timecode*/, const int &/*divider*/) +void Decoder::Close() { - return nullptr; -} + QMutexLocker locker(&mutex_); -SampleBufferPtr Decoder::RetrieveAudio(const rational &/*timecode*/, const rational &/*length*/, const AudioParams &/*params*/) -{ - return nullptr; -} - -bool Decoder::SupportsVideo() -{ - return false; -} - -bool Decoder::SupportsAudio() -{ - return false; + if (stream_) { + CloseInternal(); + stream_ = nullptr; + } else { + qWarning() << "Tried to close a decoder that wasn't open"; + } } /* * DECODER STATIC PUBLIC MEMBERS */ -QVector ReceiveListOfAllDecoders() { +QVector ReceiveListOfAllDecoders() +{ QVector decoders; // The order in which these decoders are added is their priority when probing. Hence FFmpeg should usually be last, @@ -98,7 +203,7 @@ QVector ReceiveListOfAllDecoders() { return decoders; } -FootagePtr Decoder::ProbeMedia(Project* project, const QString &filename, const QAtomicInt* cancelled) +FootagePtr Decoder::Probe(Project* project, const QString &filename, const QAtomicInt* cancelled) { // Check for a valid filename if (filename.isEmpty()) { @@ -184,37 +289,6 @@ QString Decoder::GetIndexFilename() return QDir(stream_->footage()->project()->cache_path()).filePath(FileFunctions::GetUniqueFileIdentifier(stream()->footage()->filename()).append(QString::number(stream()->index()))); } -bool Decoder::ConformAudio(const QAtomicInt *, const AudioParams& ) -{ - return false; -} - -bool Decoder::HasConformedVersion(const AudioParams ¶ms) -{ - if (stream()->type() != Stream::kAudio) { - return false; - } - - AudioStreamPtr audio_stream = std::static_pointer_cast(stream()); - - if (audio_stream->has_conformed_version(params)) { - return true; - } - - // Get indexed WAV file - WaveInput input(GetIndexFilename()); - - bool index_already_matches = false; - - if (input.open()) { - index_already_matches = (input.params() == params); - - input.close(); - } - - return index_already_matches; -} - void Decoder::SignalProcessingProgress(const int64_t &ts) { if (stream()->duration() != AV_NOPTS_VALUE && stream()->duration() != 0) { @@ -267,4 +341,40 @@ int64_t Decoder::GetImageSequenceIndex(const QString &filename) return number_only.toLongLong(); } +FramePtr Decoder::RetrieveVideoInternal(const rational &timecode, const int ÷r) +{ + Q_UNUSED(timecode) + Q_UNUSED(divider) + return nullptr; +} + +bool Decoder::ConformAudioInternal(const QString& filename, const AudioParams ¶ms, const QAtomicInt* cancelled) +{ + Q_UNUSED(filename) + Q_UNUSED(cancelled) + Q_UNUSED(params) + return false; +} + +SampleBufferPtr Decoder::RetrieveAudioFromConform(const QString &conform_filename, const TimeRange& range) +{ + WaveInput input(conform_filename); + + if (input.open()) { + const AudioParams& input_params = input.params(); + + // Read bytes from wav + QByteArray packed_data = input.read(input_params.time_to_bytes(range.in()), + input_params.time_to_bytes(range.length())); + input.close(); + + // Create sample buffer + SampleBufferPtr sample_buffer = SampleBuffer::CreateFromPackedData(input_params, packed_data); + + return sample_buffer; + } + + return nullptr; +} + OLIVE_NAMESPACE_EXIT diff --git a/app/codec/decoder.h b/app/codec/decoder.h index a096d5b08..68ff8dbb5 100644 --- a/app/codec/decoder.h +++ b/app/codec/decoder.h @@ -27,6 +27,7 @@ extern "C" { #include #include +#include #include #include "codec/frame.h" @@ -68,117 +69,46 @@ public: Decoder(); - Decoder(Stream* fs); - - DISABLE_COPY_MOVE(Decoder) - + /** + * @brief Unique decoder ID + */ virtual QString id() = 0; - StreamPtr stream() const; - void set_stream(StreamPtr fs); + virtual bool SupportsVideo(){return false;} + virtual bool SupportsAudio(){return false;} /** - * @brief Probe a footage file and dump metadata about it + * @brief Open stream for decoding * - * When a Footage file is imported, we'll need to know whether Olive is equipped with a decoder for utilizing it - * and metadata should be retrieved about it if so. For this purpose, the Footage object is passed through all - * Probe() functions of available deocders until one returns TRUE. A FALSE return means the Decoder was unable to - * parse this file and the next should be tried. + * This function is thread safe. * - * Probe() differs from Open() since it focuses on a file as a whole rather than one particular stream. Probe() - * should be able to be run directly without calling Open() or Close() and should free its memory before returning. - * - * Probe() will never be called on an object that is also used for decoding. In other words, it will never be called - * alongside Open() or Close() externally, so Probe() can use variables that would otherwise be used for decoding - * without conflict. - * - * @param f - * - * A Footage object to probe. The Footage object will have a valid filename and will be empty prior to being sent - * to this function (i.e. Footage::Clear() will not have to be called). - * - * @return - * - * TRUE if the Decoder was able to decode this file. FALSE if not. This function should have filled the Footage - * object with metadata if it returns TRUE. Otherwise, the Footage object should be untouched. + * Returns TRUE if stream could be opened successfully. Also returns TRUE if the decoder is + * already open and the stream == the stream provided. Returns FALSE if the stream couldn't + * be opened OR if already open and the stream is NOT the same. */ - virtual FootagePtr Probe(const QString& filename, const QAtomicInt* cancelled) const = 0; + bool Open(StreamPtr fs); /** - * @brief Open media/allocate memory + * @brief Retrieves a video frame from footage * - * Any file handles or memory allocation that needs to be done before this instance of a Decoder can return data - * should be done here. + * This function will always return a valid frame unless a fatal error occurs (in such case, + * nullptr will return). If the timecode is before the start of the footage, this function should + * return the first frame. Likewise, if it is after the timecode, this function should return the + * last frame. * - * @return - * - * TRUE if successful and ready to return data, FALSE if failed to open and unable to retrieve data. If the function - * fails, any memory allocated should be free'd before returning FALSE, possibly by calling Close(). + * This function is thread safe and can only run while the decoder is open. \see Open() */ - virtual bool Open() = 0; + FramePtr RetrieveVideo(const rational& timecode, const int& divider); /** - * @brief Retrieve video frame + * @brief Retrieve audio data from footage * - * The main function for retrieving video data from the Decoder. This function should always provide complete frame - * data (i.e. no partial frames) at the timecode provided. The Decoder should perform any steps required to retrieve - * a complete frame separate from the rest of the program, using any form of caching/indexing to keep this as - * performant as possible. + * This function will always return a sample buffer unless a fatal error occurs (in such case, + * nullptr will return). The SampleBuffer should always have enough audio for the range provided. * - * It's acceptable for this function to check whether the Decoder is open, and call Open() if not. If Open() returns - * false, this function should return nullptr. - * - * @param timecode - * - * The timecode (a rational in seconds) to retrieve the frame at. If there is not a frame at this precise location - * this should be corrected internally to the closest fit for the timecode. - * - * @return - * - * A FramePtr of valid data at this timecode or nullptr if there was nothing to retrieve at the provided timecode or - * the media could not be opened. + * This function is thread safe and can only run while the decoder is open. \see Open() */ - virtual FramePtr RetrieveVideo(const rational& timecode, const int& divider); - - /** - * @brief Retrieve video frame - * - * The main function for retrieving audio data from the Decoder. This function should always provide complete frame - * data (i.e. no missing samples) at the timecode and length requested. The Decoder should perform any steps - * required to retrieve a complete frame separate from the rest of the program, using any form of caching/indexing - * to keep this as performant as possible. - * - * It's acceptable for this function to check whether the Decoder is open, and call Open() if not. If Open() returns - * false, this function should return nullptr. - * - * @param timecode - * - * The starting timecode (a rational in seconds) to retrieve the data at. - * - * @param length - * - * The total length of audio data to retrieve (a rational in seconds). - * - * @return - * - * A FramePtr of valid data at this timecode of the requested length or nullptr if there was nothing to retrieve at - * the provided timecode or the media could not be opened. - */ - virtual SampleBufferPtr RetrieveAudio(const rational& timecode, const rational& length, const AudioParams& params); - - virtual bool SupportsVideo(); - virtual bool SupportsAudio(); - - /** - * @brief Close media/deallocate memory - * - * Any file handles or memory allocations opened in Open() should be cleaned up here. - * - * As the main memory freeing function, it's good practice to call this in Open() if there's an error that prevents - * correct function before Open() returns. As such, Close() should be prepared for not all memory/file handles to - * have been opened successfully. - */ - virtual void Close() = 0; + SampleBufferPtr RetrieveAudio(const TimeRange& range, const AudioParams& params, const QAtomicInt *cancelled); /** * @brief Try to probe a Footage file by passing it through all available Decoders @@ -199,7 +129,27 @@ public: * * TRUE if a Decoder was successfully able to parse and probe this file. FALSE if not. */ - static FootagePtr ProbeMedia(Project *project, const QString& filename, const QAtomicInt *cancelled); + static FootagePtr Probe(Project *project, const QString& filename, const QAtomicInt *cancelled); + + /** + * @brief Generate a Footage object from a file + * + * If this decoder is able to parse this file, it will return a valid FootagePtr. Otherwise, it + * will return nullptr. + * + * For sub-classes, this function should be effectively static. We can't do virtual static + * functions in C++, but it should hold and access no state during its run. + * + * This function is re-entrant. + */ + virtual FootagePtr Probe(const QString& filename, const QAtomicInt* cancelled) const = 0; + + /** + * @brief Closes media/deallocates memory + * + * This function is thread safe and can only run while the decoder is open. \see Open() + */ + void Close(); /** * @brief Create a Decoder instance using a Decoder ID @@ -210,42 +160,45 @@ public: */ static DecoderPtr CreateFromID(const QString& id); - /** - * @brief AUDIO ONLY: Produces a complete PCM extraction of the audio stream - * - * Internally, our render engine only deals with PCM since it provides the least headaches and - * modern computers have the processing power to do it. - * - * Resamples and converts the currently open audio to match the params. If the audio doesn't need - * conforming (e.g. audio params already match or a conformed match already exists), this function - * will return immediately. Otherwise it will block the calling thread until the conform is - * complete. This function should therefore only be called from a background render thread. - * - * All audio decoders must override this. It's not pure since video decoders don't need to use - * this, but default behavior will abort since it should never be called. - */ - virtual bool ConformAudio(const QAtomicInt* cancelled, const AudioParams ¶ms); - - /** - * @brief AUDIO ONLY: Returns whether a transcode of this audio matching the specified params - * already exists - */ - bool HasConformedVersion(const AudioParams& params); - static QString TransformImageSequenceFileName(const QString& filename, const int64_t& number); static int GetImageSequenceDigitCount(const QString& filename); static int64_t GetImageSequenceIndex(const QString& filename); -signals: - /** - * @brief While indexing, this signal will provide progress as a percentage (0-100 inclusive) if - * available - */ - void IndexProgress(double); - protected: + /** + * @brief Internal open function + * + * Sub-classes must override this function. Function will already be mutexed, so there is no need + * to worry about thread safety. Also many other sanity checks will be done before this, so + * sub-classes only need to worry about their own opening functions. It is guaranteed that the + * decoder is not open yet and that the footage stream was from that sub-classes probe function. + * + * Return TRUE if everything opened successfully and the decoder is ready to work. Otherwise, + * return FALSE. If this function returns false, Decoder will call CloseInternal to clean any + * memory allocated during OpenInternal. + */ + virtual bool OpenInternal() = 0; + + /** + * @brief Internal close function + * + * Sub-classes must override this function. Function should be able to safely clear all allocated + * memory. It may be called even if Open() didn't complete or RetrieveVideo() was never called. + */ + virtual void CloseInternal() = 0; + + /** + * @brief Internal frame retrieval function + * + * Sub-classes must override this function IF they support video. Function is already mutexed + * so sub-classes don't need to worry about thread safety. + */ + virtual FramePtr RetrieveVideoInternal(const rational& timecode, const int& divider); + + virtual bool ConformAudioInternal(const QString& filename, const AudioParams ¶ms, const QAtomicInt* cancelled); + void SignalProcessingProgress(const int64_t& ts); /** @@ -255,11 +208,44 @@ protected: QString GetIndexFilename(); - bool open_; + struct CurrentlyConforming { + StreamPtr stream; + AudioParams params; + + bool operator==(const CurrentlyConforming& rhs) const + { + return this->stream == rhs.stream && this->params == rhs.params; + } + }; + + /** + * @brief Return currently open stream + * + * This function is NOT thread safe and should therefore only be called by thread safe functions. + */ + StreamPtr stream() const + { + return stream_; + } + + static QMutex currently_conforming_mutex_; + static QWaitCondition currently_conforming_wait_cond_; + static QVector currently_conforming_; + +signals: + /** + * @brief While indexing, this signal will provide progress as a percentage (0-100 inclusive) if + * available + */ + void IndexProgress(double); private: + SampleBufferPtr RetrieveAudioFromConform(const QString& conform_filename, const TimeRange &range); + StreamPtr stream_; + QMutex mutex_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/codec/ffmpeg/ffmpegcommon.cpp b/app/codec/ffmpeg/ffmpegcommon.cpp index f66804048..cdc2554e1 100644 --- a/app/codec/ffmpeg/ffmpegcommon.cpp +++ b/app/codec/ffmpeg/ffmpegcommon.cpp @@ -25,9 +25,7 @@ OLIVE_NAMESPACE_ENTER AVPixelFormat FFmpegCommon::GetCompatiblePixelFormat(const AVPixelFormat &pix_fmt) { AVPixelFormat possible_pix_fmts[] = { - AV_PIX_FMT_RGB24, AV_PIX_FMT_RGBA, - AV_PIX_FMT_RGB48, AV_PIX_FMT_RGBA64, AV_PIX_FMT_NONE }; @@ -97,14 +95,8 @@ AVPixelFormat FFmpegCommon::GetFFmpegPixelFormat(const PixelFormat::Format &pix_ return AV_PIX_FMT_RGBA; case PixelFormat::PIX_FMT_RGBA16U: return AV_PIX_FMT_RGBA64; - case PixelFormat::PIX_FMT_RGB8: - return AV_PIX_FMT_RGB24; - case PixelFormat::PIX_FMT_RGB16U: - return AV_PIX_FMT_RGB48; case PixelFormat::PIX_FMT_RGBA16F: case PixelFormat::PIX_FMT_RGBA32F: - case PixelFormat::PIX_FMT_RGB16F: - case PixelFormat::PIX_FMT_RGB32F: case PixelFormat::PIX_FMT_INVALID: case PixelFormat::PIX_FMT_COUNT: break; @@ -116,14 +108,8 @@ AVPixelFormat FFmpegCommon::GetFFmpegPixelFormat(const PixelFormat::Format &pix_ PixelFormat::Format FFmpegCommon::GetCompatiblePixelFormat(const PixelFormat::Format &pix_fmt) { switch (pix_fmt) { - case PixelFormat::PIX_FMT_RGB8: - return PixelFormat::PIX_FMT_RGB8; case PixelFormat::PIX_FMT_RGBA8: return PixelFormat::PIX_FMT_RGBA8; - case PixelFormat::PIX_FMT_RGB16U: - case PixelFormat::PIX_FMT_RGB16F: - case PixelFormat::PIX_FMT_RGB32F: - return PixelFormat::PIX_FMT_RGB16U; case PixelFormat::PIX_FMT_RGBA16U: case PixelFormat::PIX_FMT_RGBA16F: case PixelFormat::PIX_FMT_RGBA32F: diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index c5a0f3546..9b3ae55cd 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -48,85 +48,47 @@ extern "C" { OLIVE_NAMESPACE_ENTER -QHash< Stream*, QList > FFmpegDecoder::instance_map_; -QMutex FFmpegDecoder::instance_map_lock_; -QHash< FFmpegDecoder::FFmpegFramePoolKey, FFmpegDecoder::FFmpegFramePoolValue > FFmpegDecoder::frame_pool_map_; - -// FIXME: Hardcoded value. It seems to work fine, but is there a possibility we should make -// this a dynamic value somehow or a configurable value? -const int FFmpegDecoderInstance::kMaxFrameLife = 2000; - FFmpegDecoder::FFmpegDecoder() : scale_ctx_(nullptr), - scale_divider_(0) + scale_divider_(0), + pool_(QThread::idealThreadCount()), + is_working_(false), + cache_at_zero_(false), + cache_at_eof_(false) { } FFmpegDecoder::~FFmpegDecoder() { - Close(); + CloseInternal(); } -bool FFmpegDecoder::Open() +bool FFmpegDecoder::OpenInternal() { - if (open_) { + if (instance_.Open(stream()->footage()->filename().toUtf8(), stream()->index())) { + AVStream* s = instance_.avstream(); + + // Store one second in the source's timebase + second_ts_ = qRound64(av_q2d(av_inv_q(s->time_base))); + + if (stream()->type() == Stream::kVideo) { + // Get an Olive compatible AVPixelFormat + ideal_pix_fmt_ = FFmpegCommon::GetCompatiblePixelFormat(static_cast(s->codecpar->format)); + + // Determine which Olive native pixel format we retrieved + // Note that FFmpeg doesn't support float formats + native_pix_fmt_ = GetNativePixelFormat(ideal_pix_fmt_); + + if (native_pix_fmt_ == PixelFormat::PIX_FMT_INVALID) { + qDebug() << "Failed to find valid native pixel format for" << ideal_pix_fmt_; + return false; + } + } + return true; } - Q_ASSERT(stream()); - - // Convert QString to a C string - QByteArray fn_bytes = stream()->footage()->filename().toUtf8(); - - FFmpegDecoderInstance* our_instance = new FFmpegDecoderInstance(fn_bytes.constData(), stream()->index()); - - if (!our_instance->IsValid()) { - delete our_instance; - return false; - } - - if (stream()->type() == Stream::kVideo) { - // Get an Olive compatible AVPixelFormat - src_pix_fmt_ = static_cast(our_instance->stream()->codecpar->format); - ideal_pix_fmt_ = FFmpegCommon::GetCompatiblePixelFormat(src_pix_fmt_); - - // Determine which Olive native pixel format we retrieved - // Note that FFmpeg doesn't support float formats - native_pix_fmt_ = GetNativePixelFormat(ideal_pix_fmt_); - - Q_ASSERT(native_pix_fmt_ != PixelFormat::PIX_FMT_INVALID); - } - - if (StreamUsesMultipleInstances(stream())) { - // Video optimizes with multiple instances that we can swap between - QMutexLocker map_locker(&instance_map_lock_); - - VideoStreamPtr vs = std::static_pointer_cast(stream()); - - FFmpegFramePoolKey key = {vs->width(), vs->height(), src_pix_fmt_}; - FFmpegFramePoolValue& frame_pool = frame_pool_map_[key]; - - if (!frame_pool.pool) { - // Frames are allocated as threads * threads, to scale from each thread sharing one set - // to all of them working individually - int thread_count = QThread::idealThreadCount(); - int max_memory_frame_count = thread_count * thread_count; - frame_pool.pool = new FFmpegFramePool(max_memory_frame_count); - } - frame_pool.handles++; - - our_instance->SetFramePool(frame_pool.pool); - - instance_map_[stream().get()].append(our_instance); - } else { - // Images, image sequences, and audio don't need an instance - delete our_instance; - } - - // All allocation succeeded so we set the state to open - open_ = true; - - return true; + return false; } FramePtr FFmpegDecoder::RetrieveStillImage(const rational &timecode, const int ÷r) @@ -136,49 +98,57 @@ FramePtr FFmpegDecoder::RetrieveStillImage(const rational &timecode, const int & QString img_filename = stream()->footage()->filename(); + int64_t ts; + // If it's an image sequence, we'll probably need to transform the filename if (is->video_type() == VideoStream::kVideoTypeImageSequence) { - int64_t ts = std::static_pointer_cast(stream())->get_time_in_timebase_units(timecode); + ts = std::static_pointer_cast(stream())->get_time_in_timebase_units(timecode); img_filename = TransformImageSequenceFileName(stream()->footage()->filename(), ts); + } else { + ts = 0; } - FFmpegDecoderInstance i(img_filename.toUtf8(), stream()->index()); - AVPacket* pkt = av_packet_alloc(); AVFrame* frame = av_frame_alloc(); FramePtr output_frame = nullptr; + Instance i; + i.Open(img_filename.toUtf8(), stream()->index()); + int ret = i.GetFrame(pkt, frame); if (ret >= 0) { - output_frame = BuffersToNativeFrame(divider, - is->width(), - is->height(), - 0, - frame->data, - frame->linesize); + // Create frame to return + FramePtr copy = Frame::Create(); + copy->set_video_params(VideoParams(frame->width, + frame->height, + native_pix_fmt_, + std::static_pointer_cast(stream())->pixel_aspect_ratio(), + std::static_pointer_cast(stream())->interlacing(), + divider)); + copy->set_timestamp(timecode); + copy->allocate(); + + uint8_t* copy_data = reinterpret_cast(copy->data()); + int copy_linesize = copy->linesize_bytes(); + FFmpegFrameToNativeBuffer(frame->data, frame->linesize, ©_data, ©_linesize); + + return copy; } else { qWarning() << "Failed to retrieve still image from decoder"; } + i.Close(); + av_frame_free(&frame); av_packet_free(&pkt); return output_frame; } -FramePtr FFmpegDecoder::RetrieveVideo(const rational &timecode, const int ÷r) +FramePtr FFmpegDecoder::RetrieveVideoInternal(const rational &timecode, const int ÷r) { - if (!open_) { - qWarning() << "Tried to retrieve video on a decoder that's still closed"; - return nullptr; - } - - if (stream()->type() != Stream::kVideo) { - return nullptr; - } - VideoStreamPtr vs = std::static_pointer_cast(stream()); if (vs->video_type() == VideoStream::kVideoTypeStill @@ -192,149 +162,38 @@ FramePtr FFmpegDecoder::RetrieveVideo(const rational &timecode, const int &divid int64_t target_ts = vs->get_time_in_timebase_units(timecode); - FFmpegDecoderInstance* working_instance = nullptr; - int divided_width = VideoParams::GetScaledDimension(vs->width(), divider); int divided_height = VideoParams::GetScaledDimension(vs->height(), divider); - // Find instance - do { - QMutexLocker list_locker(&instance_map_lock_); + if (pool_.width() != divided_width || pool_.height() != divided_height) { + // Clear all instance queues + ClearFrameCache(); - const QList& instances = instance_map_.value(stream().get()); - - FFmpegFramePool* pool = frame_pool_map_.value({vs->width(), vs->height(), src_pix_fmt_}).pool; - - if (pool->width() != divided_width || pool->height() != divided_height) { - // Clear all instance queues - foreach (FFmpegDecoderInstance* i, instances) { - i->ClearFrameCache(); - } - - // Set new frame pool parameters - pool->SetParameters(divided_width, divided_height, src_pix_fmt_); - } - - QList non_ideal_contenders; - - foreach (FFmpegDecoderInstance* i, instances) { - - i->cache_lock()->lock(); - - if (i->CacheContainsTime(target_ts)) { - - // Found our instance, allow others to enter the list - - list_locker.unlock(); - - // Get the frame from this cache - return_frame = i->GetFrameFromCache(target_ts); - - // Got our frame, allow cache to continue - i->cache_lock()->unlock(); - break; - - } else if (i->CacheWillContainTime(target_ts) || i->CacheCouldContainTime(target_ts)) { - - // Found our instance, allow others to enter the list - list_locker.unlock(); - - // If the instance is currently in use, enter into a loop of seeing from frames come up next in case one is ours - if (i->IsWorking()) { - - do { - // Allow instance to continue to the next frame - i->cache_wait_cond()->wait(i->cache_lock()); - - // See if the cache now contains this frame, if so we'll exit this loop - if (i->CacheContainsTime(target_ts)) { - - // Grab the frame - return_frame = i->GetFrameFromCache(target_ts); - - // We can release this worker now since we don't need it anymore - i->cache_lock()->unlock(); - - } else if (!i->IsWorking()) { - - // This instance finished and we didn't get our frame, we'll take it and continue it - working_instance = i; - break; - - } - } while (!return_frame); - - } else { - // Otherwise, we'll grab this instance and continue it ourselves - working_instance = i; - } - - break; - - } else if (i->IsWorking()) { - - // Ignore currently working instances - i->cache_lock()->unlock(); - - } else if (i->CacheIsEmpty()) { - - // Prioritize this cache over others (leaves this instance LOCKED in case we end up using it later) - non_ideal_contenders.prepend(i); - - } else { - - // De-prioritize this cache (leaves this instance LOCKED in case we end up using it later) - non_ideal_contenders.append(i); - - } - } - - // If we didn't find a suitable contender, grab the first non-suitable and roll with that - if (!return_frame && !working_instance && !non_ideal_contenders.isEmpty()) { - working_instance = non_ideal_contenders.takeFirst(); - } - - // For all instances we left locked but didn't end up using, lock them now - foreach (FFmpegDecoderInstance* unsuitable_instance, non_ideal_contenders) { - unsuitable_instance->cache_lock()->unlock(); - } - } while (!return_frame && !working_instance); - - if (!return_frame && working_instance) { - - // This instance SHOULD remain locked from our earlier loop, making this operation safe - working_instance->SetWorking(true); - - // Retrieve frame - return_frame = working_instance->RetrieveFrame(target_ts, divider, true); - - // Set working to false and wake any threads waiting - working_instance->cache_lock()->lock(); - working_instance->SetWorking(false); - working_instance->cache_wait_cond()->wakeAll(); - working_instance->cache_lock()->unlock(); + // Set new frame pool parameters + pool_.SetParameters(divided_width, divided_height, native_pix_fmt_); + } else { + return_frame = GetFrameFromCache(target_ts); } + // Retrieve frame + return_frame = RetrieveFrame(target_ts, divider); + // We found the frame, we'll return a copy if (return_frame) { - // Align buffer to data/linesize points that can be passed to sws_scale - uint8_t* input_data[4]; - int input_linesize[4]; + FramePtr copy = Frame::Create(); + copy->set_video_params(VideoParams(vs->width(), + vs->height(), + native_pix_fmt_, + std::static_pointer_cast(stream())->pixel_aspect_ratio(), + std::static_pointer_cast(stream())->interlacing(), + divider)); + copy->set_timestamp(timecode); + copy->allocate(); - av_image_fill_arrays(input_data, - input_linesize, - reinterpret_cast(return_frame->data()), - src_pix_fmt_, - divided_width, - divided_height, - 1); + // This data will already match the frame + memcpy(copy->data(), return_frame->data(), copy->allocated_size()); - return BuffersToNativeFrame(divider, - vs->width(), - vs->height(), - timecode, - input_data, - input_linesize); + return copy; } } @@ -342,97 +201,13 @@ FramePtr FFmpegDecoder::RetrieveVideo(const rational &timecode, const int &divid return nullptr; } -SampleBufferPtr FFmpegDecoder::RetrieveAudio(const rational &timecode, const rational &length, const AudioParams ¶ms) +void FFmpegDecoder::CloseInternal() { - if (!open_) { - qWarning() << "Tried to retrieve audio on a decoder that's still closed"; - return nullptr; - } + ClearFrameCache(); - if (stream()->type() != Stream::kAudio) { - return nullptr; - } + instance_.Close(); - QString wav_fn = GetConformedFilename(params); - WaveInput input(wav_fn); - - if (input.open()) { - const AudioParams& input_params = input.params(); - - // Read bytes from wav - QByteArray packed_data = input.read(input_params.time_to_bytes(timecode), input_params.time_to_bytes(length)); - input.close(); - - // Create sample buffer - SampleBufferPtr sample_buffer = SampleBuffer::CreateFromPackedData(input_params, packed_data); - - return sample_buffer; - } - - qCritical() << "Failed to open cached file" << wav_fn; - - return nullptr; -} - -void FFmpegDecoder::Close() -{ - if (stream() && StreamUsesMultipleInstances(stream())) { - // Clear whichever instance is not in use and is least useful (there are only ever as many instances as there are - // threads so if this thread is closing, an instance MUST be inactive) - QMutexLocker l(&instance_map_lock_); - - QList list = instance_map_.value(stream().get()); - - if (!list.isEmpty()) { - // Rank the instances by least useful (the top one should be one that isn't working and isn't in use) - QList least_useful; - - foreach (FFmpegDecoderInstance* i, list) { - i->cache_lock()->lock(); - - if (i->IsWorking()) { - // Don't bother any currently working instances - i->cache_lock()->unlock(); - continue; - } - - if (i->CacheIsEmpty()) { - least_useful.prepend(i); - } else { - least_useful.append(i); - } - } - - // Remove the least useful from the list and re-insert it into the map - FFmpegDecoderInstance* least_useful_instance = least_useful.first(); - list.removeOne(least_useful_instance); - instance_map_.insert(stream().get(), list); - - // If there are no more instances, destroy frame pool - VideoStreamPtr vs = std::static_pointer_cast(stream()); - FFmpegFramePoolKey frame_pool_key = {vs->width(), vs->height(), src_pix_fmt_}; - FFmpegFramePoolValue& frame_pool_info = frame_pool_map_[frame_pool_key]; - frame_pool_info.handles--; - - if (frame_pool_info.handles == 0) { - delete frame_pool_info.pool; - frame_pool_map_.remove(frame_pool_key); - } - - // We're done with the list now, we can unlock it and allow others to use it - l.unlock(); - - // Unlock all the instances we locked - foreach (FFmpegDecoderInstance* i, least_useful) { - i->cache_lock()->unlock(); - } - - // Delete this least useful instance now that we've definitely taken ownership of it - least_useful_instance->deleteLater(); - } - } - - ClearResources(); + FreeScaler(); } QString FFmpegDecoder::id() @@ -440,16 +215,6 @@ QString FFmpegDecoder::id() return QStringLiteral("ffmpeg"); } -bool FFmpegDecoder::SupportsVideo() -{ - return true; -} - -bool FFmpegDecoder::SupportsAudio() -{ - return true; -} - FootagePtr FFmpegDecoder::Probe(const QString& filename, const QAtomicInt* cancelled) const { // Variable for receiving errors from FFmpeg @@ -484,119 +249,131 @@ FootagePtr FFmpegDecoder::Probe(const QString& filename, const QAtomicInt* cance StreamPtr str; - if (avstream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && decoder) { + if (decoder + && (avstream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO + || avstream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)) { - bool image_is_still = false; - rational pixel_aspect_ratio; - rational frame_rate; - VideoParams::Interlacing interlacing = VideoParams::kInterlaceNone; + if (avstream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { - { - // Read at least two frames to get more information about this video stream - AVPacket* pkt = av_packet_alloc(); - AVFrame* frame = av_frame_alloc(); + bool image_is_still = false; + rational pixel_aspect_ratio; + rational frame_rate; + VideoParams::Interlacing interlacing = VideoParams::kInterlaceNone; { - FFmpegDecoderInstance instance(filename_c, i); + // Read at least two frames to get more information about this video stream + AVPacket* pkt = av_packet_alloc(); + AVFrame* frame = av_frame_alloc(); - // Read first frame and retrieve some metadata - if (instance.GetFrame(pkt, frame) >= 0) { - // Check if video is interlaced and what field dominance it has if so - if (frame->interlaced_frame) { - if (frame->top_field_first) { - interlacing = VideoParams::kInterlacedTopFirst; - } else { - interlacing = VideoParams::kInterlacedBottomFirst; + { + Instance instance; + instance.Open(filename.toUtf8(), avstream->index); + + // Read first frame and retrieve some metadata + if (instance.GetFrame(pkt, frame) >= 0) { + // Check if video is interlaced and what field dominance it has if so + if (frame->interlaced_frame) { + if (frame->top_field_first) { + interlacing = VideoParams::kInterlacedTopFirst; + } else { + interlacing = VideoParams::kInterlacedBottomFirst; + } } + + pixel_aspect_ratio = av_guess_sample_aspect_ratio(instance.fmt_ctx(), + instance.avstream(), + frame); + + frame_rate = av_guess_frame_rate(instance.fmt_ctx(), + instance.avstream(), + frame); } - pixel_aspect_ratio = av_guess_sample_aspect_ratio(instance.fmt_ctx(), - instance.stream(), - frame); + // Read second frame + int ret = instance.GetFrame(pkt, frame); - frame_rate = av_guess_frame_rate(instance.fmt_ctx(), - instance.stream(), - frame); - } + if (ret >= 0) { + // Check if we need a manual duration + if (avstream->duration == AV_NOPTS_VALUE) { + int64_t new_dur; - // Read second frame - int ret = instance.GetFrame(pkt, frame); + do { + new_dur = frame->pts; + } while (instance.GetFrame(pkt, frame) >= 0); - if (ret >= 0) { - // Check if we need a manual duration - if (avstream->duration == AV_NOPTS_VALUE) { - int64_t new_dur; - - do { - new_dur = frame->pts; - } while (instance.GetFrame(pkt, frame) >= 0); - - avstream->duration = new_dur; + avstream->duration = new_dur; + } + } else if (ret == AVERROR_EOF) { + // Video has only one frame in it, treat it like a still image + image_is_still = true; } - } else if (ret == AVERROR_EOF) { - // Video has only one frame in it, treat it like a still image - image_is_still = true; + + instance.Close(); } + + av_frame_free(&frame); + av_packet_free(&pkt); } - av_frame_free(&frame); - av_packet_free(&pkt); - } + VideoStreamPtr video_stream = std::make_shared(); - VideoStreamPtr video_stream = std::make_shared(); + if (image_is_still) { + video_stream->set_video_type(VideoStream::kVideoTypeStill); + } else { + video_stream->set_video_type(VideoStream::kVideoTypeVideo); + + video_stream->set_frame_rate(frame_rate); + video_stream->set_start_time(avstream->start_time); + } + + video_stream->set_width(avstream->codecpar->width); + video_stream->set_height(avstream->codecpar->height); + video_stream->set_format(GetNativePixelFormat(FFmpegCommon::GetCompatiblePixelFormat(static_cast(avstream->codecpar->format)))); + video_stream->set_interlacing(interlacing); + video_stream->set_pixel_aspect_ratio(pixel_aspect_ratio); + + str = video_stream; - if (image_is_still) { - video_stream->set_video_type(VideoStream::kVideoTypeStill); } else { - video_stream->set_video_type(VideoStream::kVideoTypeVideo); - video_stream->set_frame_rate(frame_rate); - video_stream->set_start_time(avstream->start_time); + // Create an audio stream object + AudioStreamPtr audio_stream = std::make_shared(); + + uint64_t channel_layout = avstream->codecpar->channel_layout; + if (!channel_layout) { + channel_layout = static_cast(av_get_default_channel_layout(avstream->codecpar->channels)); + } + + audio_stream->set_channel_layout(channel_layout); + audio_stream->set_channels(avstream->codecpar->channels); + audio_stream->set_sample_rate(avstream->codecpar->sample_rate); + + if (avstream->duration == AV_NOPTS_VALUE) { + // Loop through stream until we get the whole duration + Instance instance; + instance.Open(filename.toUtf8(), avstream->index); + + AVPacket* pkt = av_packet_alloc(); + AVFrame* frame = av_frame_alloc(); + + int64_t new_dur; + + do { + new_dur = frame->pts; + } while (instance.GetFrame(pkt, frame) >= 0); + + avstream->duration = new_dur; + + av_frame_free(&frame); + av_packet_free(&pkt); + + instance.Close(); + } + + str = audio_stream; + } - video_stream->set_width(avstream->codecpar->width); - video_stream->set_height(avstream->codecpar->height); - video_stream->set_format(GetNativePixelFormat(FFmpegCommon::GetCompatiblePixelFormat(static_cast(avstream->codecpar->format)))); - video_stream->set_interlacing(interlacing); - video_stream->set_pixel_aspect_ratio(pixel_aspect_ratio); - - str = video_stream; - - } else if (avstream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && decoder) { - - // Create an audio stream object - AudioStreamPtr audio_stream = std::make_shared(); - - uint64_t channel_layout = avstream->codecpar->channel_layout; - if (!channel_layout) { - channel_layout = static_cast(av_get_default_channel_layout(avstream->codecpar->channels)); - } - - audio_stream->set_channel_layout(channel_layout); - audio_stream->set_channels(avstream->codecpar->channels); - audio_stream->set_sample_rate(avstream->codecpar->sample_rate); - - if (avstream->duration == AV_NOPTS_VALUE) { - // Loop through stream until we get the whole duration - FFmpegDecoderInstance instance(filename_c, i); - - AVPacket* pkt = av_packet_alloc(); - AVFrame* frame = av_frame_alloc(); - - int64_t new_dur; - - do { - new_dur = frame->pts; - } while (instance.GetFrame(pkt, frame) >= 0); - - avstream->duration = new_dur; - - av_frame_free(&frame); - av_packet_free(&pkt); - } - - str = audio_stream; - } else { // This is data we can't utilize at the moment, but we make a Stream object anyway to keep parity with the file @@ -658,50 +435,23 @@ FootagePtr FFmpegDecoder::Probe(const QString& filename, const QAtomicInt* cance return footage; } -void FFmpegDecoder::FFmpegError(int error_code) +QString FFmpegDecoder::FFmpegError(int error_code) { char err[1024]; av_strerror(error_code, err, 1024); - - Error(QStringLiteral("Error decoding %1 - %2 %3").arg(stream()->footage()->filename(), - QString::number(error_code), - err)); + return QStringLiteral("%1 %2").arg(QString::number(error_code), err); } -void FFmpegDecoder::Error(const QString &s) -{ - qWarning() << s; - - ClearResources(); -} - -bool FFmpegDecoder::ConformAudio(const QAtomicInt *cancelled, const AudioParams &p) +bool FFmpegDecoder::ConformAudioInternal(const QString &filename, const AudioParams ¶ms, const QAtomicInt *cancelled) { // Iterate through each audio frame and extract the PCM data AudioStreamPtr audio_stream = std::static_pointer_cast(stream()); - // Check if we already have a conform of this type - QString conformed_fn = GetConformedFilename(p); - - if (QFileInfo::exists(conformed_fn)) { - - // If we have one, and we can open it correctly, we can use it as-is - WaveInput input(conformed_fn); - if (input.open()) { - audio_stream->append_conformed_version(p); - - input.close(); - - return true; - } - } - - // Conform doesn't exist, we'll have to produce one - FFmpegDecoderInstance index_instance(stream()->footage()->filename().toUtf8(), - stream()->index()); + // Seek to starting point + instance_.Seek(0); // Handle NULL channel layout - uint64_t channel_layout = ValidateChannelLayout(index_instance.stream()); + uint64_t channel_layout = ValidateChannelLayout(instance_.avstream()); if (!channel_layout) { qCritical() << "Failed to determine channel layout of audio file, could not conform"; return false; @@ -709,18 +459,18 @@ bool FFmpegDecoder::ConformAudio(const QAtomicInt *cancelled, const AudioParams // Create resampling context SwrContext* resampler = swr_alloc_set_opts(nullptr, - p.channel_layout(), - FFmpegCommon::GetFFmpegSampleFormat(p.format()), - p.sample_rate(), + params.channel_layout(), + FFmpegCommon::GetFFmpegSampleFormat(params.format()), + params.sample_rate(), channel_layout, - static_cast(index_instance.stream()->codecpar->format), - index_instance.stream()->codecpar->sample_rate, + static_cast(instance_.avstream()->codecpar->format), + instance_.avstream()->codecpar->sample_rate, 0, nullptr); swr_init(resampler); - WaveOutput wave_out(conformed_fn, p); + WaveOutput wave_out(filename, params); AVPacket* pkt = av_packet_alloc(); AVFrame* frame = av_frame_alloc(); @@ -735,7 +485,7 @@ bool FFmpegDecoder::ConformAudio(const QAtomicInt *cancelled, const AudioParams break; } - ret = index_instance.GetFrame(pkt, frame); + ret = instance_.GetFrame(pkt, frame); if (ret < 0) { @@ -752,7 +502,7 @@ bool FFmpegDecoder::ConformAudio(const QAtomicInt *cancelled, const AudioParams // Allocate buffers int nb_samples = swr_get_out_samples(resampler, frame->nb_samples); - char* data = new char[p.samples_to_bytes(nb_samples)]; + char* data = new char[params.samples_to_bytes(nb_samples)]; // Resample audio to our destination parameters nb_samples = swr_convert(resampler, @@ -769,7 +519,7 @@ bool FFmpegDecoder::ConformAudio(const QAtomicInt *cancelled, const AudioParams } // Write packed WAV data to the disk cache - wave_out.write(data, p.samples_to_bytes(nb_samples)); + wave_out.write(data, params.samples_to_bytes(nb_samples)); // If we allocated an output for the resampler, delete it here if (data != reinterpret_cast(frame->data[0])) { @@ -780,18 +530,6 @@ bool FFmpegDecoder::ConformAudio(const QAtomicInt *cancelled, const AudioParams } wave_out.close(); - - if (success) { - - // If our conform succeeded, add it - audio_stream->append_conformed_version(p); - - } else { - - // Audio index didn't complete, delete it - QFile(conformed_fn).remove(); - - } } else { qWarning() << "Failed to open WAVE output for indexing"; } @@ -807,12 +545,8 @@ bool FFmpegDecoder::ConformAudio(const QAtomicInt *cancelled, const AudioParams PixelFormat::Format FFmpegDecoder::GetNativePixelFormat(AVPixelFormat pix_fmt) { switch (pix_fmt) { - case AV_PIX_FMT_RGB24: - return PixelFormat::PIX_FMT_RGB8; case AV_PIX_FMT_RGBA: return PixelFormat::PIX_FMT_RGBA8; - case AV_PIX_FMT_RGB48: - return PixelFormat::PIX_FMT_RGB16U; case AV_PIX_FMT_RGBA64: return PixelFormat::PIX_FMT_RGBA16U; default: @@ -829,116 +563,15 @@ uint64_t FFmpegDecoder::ValidateChannelLayout(AVStream* stream) return av_get_default_channel_layout(stream->codecpar->channels); } -bool FFmpegDecoder::StreamUsesMultipleInstances(StreamPtr stream) +void FFmpegDecoder::FFmpegFrameToNativeBuffer(uint8_t **input_data, int *input_linesize, uint8_t** output_buffer, int* output_linesize) { - return stream->type() == Stream::kVideo - && std::static_pointer_cast(stream)->video_type() != VideoStream::kVideoTypeStill; -} - -FramePtr FFmpegDecoder::BuffersToNativeFrame(int divider, int width, int height, const rational& ts, uint8_t** input_data, int* input_linesize) -{ - if (divider != scale_divider_) { - FreeScaler(); - InitScaler(divider); - } - - // Create frame to return - FramePtr copy = Frame::Create(); - copy->set_video_params(VideoParams(width, - height, - native_pix_fmt_, - std::static_pointer_cast(stream())->pixel_aspect_ratio(), - std::static_pointer_cast(stream())->interlacing(), - divider)); - copy->set_timestamp(ts); - copy->allocate(); - - // Convert frame to RGB/A for the rest of the pipeline - uint8_t* output_data = reinterpret_cast(copy->data()); - int output_linesize = copy->linesize_bytes(); - sws_scale(scale_ctx_, input_data, input_linesize, 0, - VideoParams::GetScaledDimension(height, divider), - &output_data, - &output_linesize); - - return copy; -} - -int FFmpegDecoderInstance::GetFrame(AVPacket *pkt, AVFrame *frame) -{ - bool eof = false; - - int ret; - - // Clear any previous frames - av_frame_unref(frame); - - while ((ret = avcodec_receive_frame(codec_ctx_, frame)) == AVERROR(EAGAIN) && !eof) { - - // Find next packet in the correct stream index - do { - // Free buffer in packet if there is one - av_packet_unref(pkt); - - // Read packet from file - ret = av_read_frame(fmt_ctx_, pkt); - } while (pkt->stream_index != avstream_->index && ret >= 0); - - if (ret == AVERROR_EOF) { - // Don't break so that receive gets called again, but don't try to read again - eof = true; - - // Send a null packet to signal end of - avcodec_send_packet(codec_ctx_, nullptr); - } else if (ret < 0) { - // Handle other error by breaking loop and returning the code we received - break; - } else { - // Successful read, send the packet - ret = avcodec_send_packet(codec_ctx_, pkt); - - // We don't need the packet anymore, so free it - av_packet_unref(pkt); - - if (ret < 0) { - break; - } - } - } - - return ret; -} - -QMutex *FFmpegDecoderInstance::cache_lock() -{ - return &cache_lock_; -} - -QWaitCondition *FFmpegDecoderInstance::cache_wait_cond() -{ - return &cache_wait_cond_; -} - -bool FFmpegDecoderInstance::IsWorking() -{ - QMutexLocker locker(&is_working_mutex_); - return is_working_; -} - -void FFmpegDecoderInstance::SetWorking(bool working) -{ - QMutexLocker locker(&is_working_mutex_); - is_working_ = working; -} - -void FFmpegDecoderInstance::Seek(int64_t timestamp) -{ - avcodec_flush_buffers(codec_ctx_); - av_seek_frame(fmt_ctx_, avstream_->index, timestamp, AVSEEK_FLAG_BACKWARD); + instance_.avstream()->codecpar->height, + output_buffer, + output_linesize); } /* OLD UNUSED CODE: Keeping this around in case the code proves useful @@ -998,19 +631,15 @@ void FFmpegDecoder::CacheFrameToDisk(AVFrame *f) } */ -void FFmpegDecoderInstance::ClearFrameCache() +void FFmpegDecoder::ClearFrameCache() { cached_frames_.clear(); cache_at_eof_ = false; cache_at_zero_ = false; } -FFmpegFramePool::ElementPtr FFmpegDecoderInstance::RetrieveFrame(const int64_t& target_ts, int divider, bool cache_is_locked) +FFmpegFramePool::ElementPtr FFmpegDecoder::RetrieveFrame(const int64_t& target_ts, int divider) { - if (!cache_is_locked) { - cache_lock_.lock(); - } - if (scale_divider_ != divider) { FreeScaler(); InitScaler(divider); @@ -1019,16 +648,12 @@ FFmpegFramePool::ElementPtr FFmpegDecoderInstance::RetrieveFrame(const int64_t& int64_t seek_ts = target_ts; bool still_seeking = false; - // CacheCouldContainTime uses cache_target_time_, so we'll temporarily set it to the last frame's TS - if (!cached_frames_.isEmpty()) { - cache_target_time_ = cached_frames_.last()->timestamp(); - } - // If the frame wasn't in the frame cache, see if this frame cache is too old to use - if (!CacheCouldContainTime(target_ts)) { + if (cached_frames_.isEmpty() + || (target_ts < cached_frames_.first()->timestamp() && target_ts > cached_frames_.last()->timestamp() + 2*second_ts_)) { ClearFrameCache(); - Seek(seek_ts); + instance_.Seek(seek_ts); if (seek_ts == 0) { cache_at_zero_ = true; } @@ -1036,25 +661,20 @@ FFmpegFramePool::ElementPtr FFmpegDecoderInstance::RetrieveFrame(const int64_t& still_seeking = true; } - cache_target_time_ = target_ts; - int ret; AVPacket* pkt = av_packet_alloc(); FFmpegFramePool::ElementPtr return_frame = nullptr; // Allocate a new frame - AVFrameWrapper working_frame; - - bool unlocked = false; + AVFrame* working_frame = av_frame_alloc(); while (true) { // Pull from the decoder - ret = GetFrame(pkt, working_frame.frame()); + ret = instance_.GetFrame(pkt, working_frame); // Handle any errors that aren't EOF (EOF is handled later on) if (ret < 0 && ret != AVERROR_EOF) { - cache_lock_.unlock(); qCritical() << "Failed to retrieve frame:" << ret; break; } @@ -1062,10 +682,10 @@ FFmpegFramePool::ElementPtr FFmpegDecoderInstance::RetrieveFrame(const int64_t& if (still_seeking) { // Handle a failure to seek (occurs on some media) // We'll only be here if the frame cache was emptied earlier - if (!cache_at_zero_ && (ret == AVERROR_EOF || working_frame.frame()->pts > target_ts)) { + if (!cache_at_zero_ && (ret == AVERROR_EOF || working_frame->pts > target_ts)) { seek_ts = qMax(static_cast(0), seek_ts - second_ts_); - Seek(seek_ts); + instance_.Seek(seek_ts); if (seek_ts == 0) { cache_at_zero_ = true; } @@ -1078,11 +698,6 @@ FFmpegFramePool::ElementPtr FFmpegDecoderInstance::RetrieveFrame(const int64_t& } } - if (cache_is_locked) { - cache_is_locked = false; - } else if (unlocked) { - cache_lock_.lock(); - } if (ret == AVERROR_EOF) { @@ -1095,53 +710,29 @@ FFmpegFramePool::ElementPtr FFmpegDecoderInstance::RetrieveFrame(const int64_t& return_frame = cached_frames_.last(); } - cache_wait_cond_.wakeAll(); - cache_lock_.unlock(); break; } else { - // Whatever it is, keep this frame in memory for the time being just in case - if (!frame_pool_) { - qCritical() << "Cannot retrieve video without a valid frame pool"; - cache_lock_.unlock(); - break; + // Cut down to thread count - 1 before we acquire a new frame + if (cached_frames_.size() == QThread::idealThreadCount()) { + RemoveFirstFrame(); } - // Cut down to thread count - 1 before we acquire a new frame - TruncateCacheRangeToFrames(QThread::idealThreadCount() -1); - - FFmpegFramePool::ElementPtr cached = frame_pool_->Get(); + FFmpegFramePool::ElementPtr cached = pool_.Get(); if (!cached) { qCritical() << "Frame pool failed to return a valid frame - out of memory?"; - cache_lock_.unlock(); break; } - { - uint8_t* scale_data[4]; - int scale_linesize[4]; - - av_image_fill_arrays(scale_data, - scale_linesize, - cached->data(), - static_cast(working_frame.frame()->format), - VideoParams::GetScaledDimension(working_frame.frame()->width, divider), - VideoParams::GetScaledDimension(working_frame.frame()->height, divider), - 1); - - sws_scale(scale_ctx_, - working_frame.frame()->data, - working_frame.frame()->linesize, - 0, - working_frame.frame()->height, - scale_data, - scale_linesize); - } + // Store in queue, converting to native format + int destination_linesize = Frame::generate_linesize_bytes(VideoParams::GetScaledDimension(instance_.avstream()->codecpar->width, divider), native_pix_fmt_); + uint8_t* destination_data = cached->data(); + FFmpegFrameToNativeBuffer(working_frame->data, working_frame->linesize, &destination_data, &destination_linesize); // Set timestamp so this frame can be identified later - cached->set_timestamp(working_frame.frame()->pts); + cached->set_timestamp(working_frame->pts); // Store frame before just in case FFmpegFramePool::ElementPtr previous; @@ -1154,10 +745,6 @@ FFmpegFramePool::ElementPtr FFmpegDecoderInstance::RetrieveFrame(const int64_t& // Append this frame and signal to other threads that a new frame has arrived cached_frames_.append(cached); - cache_wait_cond_.wakeAll(); - cache_lock_.unlock(); - unlocked = true; - // If this is a valid frame, see if this or the frame before it are the one we need if (cached->timestamp() == target_ts) { return_frame = cached; @@ -1174,18 +761,12 @@ FFmpegFramePool::ElementPtr FFmpegDecoderInstance::RetrieveFrame(const int64_t& } } + av_frame_free(&working_frame); av_packet_free(&pkt); return return_frame; } -void FFmpegDecoder::ClearResources() -{ - FreeScaler(); - - open_ = false; -} - void FFmpegDecoder::InitScaler(int divider) { VideoStream* vs = static_cast(stream().get()); @@ -1193,9 +774,9 @@ void FFmpegDecoder::InitScaler(int divider) int scaled_width = VideoParams::GetScaledDimension(vs->width(), divider); int scaled_height = VideoParams::GetScaledDimension(vs->height(), divider); - scale_ctx_ = sws_getContext(scaled_width, - scaled_height, - src_pix_fmt_, + scale_ctx_ = sws_getContext(vs->width(), + vs->height(), + static_cast(instance_.avstream()->codecpar->format), scaled_width, scaled_height, ideal_pix_fmt_, @@ -1221,40 +802,7 @@ void FFmpegDecoder::FreeScaler() } } -void FFmpegDecoderInstance::InitScaler(int divider) -{ - int scaled_width = VideoParams::GetScaledDimension(avstream_->codecpar->width, divider); - int scaled_height = VideoParams::GetScaledDimension(avstream_->codecpar->height, divider); - - scale_ctx_ = sws_getContext(avstream_->codecpar->width, - avstream_->codecpar->height, - static_cast(avstream_->codecpar->format), - scaled_width, - scaled_height, - static_cast(avstream_->codecpar->format), - SWS_FAST_BILINEAR, - nullptr, - nullptr, - nullptr); - - if (scale_ctx_) { - scale_divider_ = divider; - } else { - scale_divider_ = 0; - } -} - -void FFmpegDecoderInstance::FreeScaler() -{ - if (scale_ctx_) { - sws_freeContext(scale_ctx_); - scale_ctx_ = nullptr; - - scale_divider_ = 0; - } -} - -int64_t FFmpegDecoderInstance::RangeStart() const +/*int64_t FFmpegDecoder::RangeStart() const { if (cached_frames_.isEmpty()) { return AV_NOPTS_VALUE; @@ -1262,7 +810,7 @@ int64_t FFmpegDecoderInstance::RangeStart() const return cached_frames_.first()->timestamp(); } -int64_t FFmpegDecoderInstance::RangeEnd() const +int64_t FFmpegDecoder::RangeEnd() const { if (cached_frames_.isEmpty()) { return AV_NOPTS_VALUE; @@ -1270,7 +818,7 @@ int64_t FFmpegDecoderInstance::RangeEnd() const return cached_frames_.last()->timestamp(); } -bool FFmpegDecoderInstance::CacheContainsTime(const int64_t &t) const +bool FFmpegDecoder::CacheContainsTime(const int64_t &t) const { return !cached_frames_.isEmpty() && ((RangeStart() <= t && RangeEnd() >= t) @@ -1278,22 +826,22 @@ bool FFmpegDecoderInstance::CacheContainsTime(const int64_t &t) const || (cache_at_eof_ && t > cached_frames_.last()->timestamp())); } -bool FFmpegDecoderInstance::CacheWillContainTime(const int64_t &t) const +bool FFmpegDecoder::CacheWillContainTime(const int64_t &t) const { return !cached_frames_.isEmpty() && t >= cached_frames_.first()->timestamp() && t <= cache_target_time_; } -bool FFmpegDecoderInstance::CacheCouldContainTime(const int64_t &t) const +bool FFmpegDecoder::CacheCouldContainTime(const int64_t &t) const { return !cached_frames_.isEmpty() && t >= cached_frames_.first()->timestamp() && t <= (cache_target_time_ + 2*second_ts_); } -bool FFmpegDecoderInstance::CacheIsEmpty() const +bool FFmpegDecoder::CacheIsEmpty() const { return cached_frames_.isEmpty(); -} +}*/ -FFmpegFramePool::ElementPtr FFmpegDecoderInstance::GetFrameFromCache(const int64_t &t) const +FFmpegFramePool::ElementPtr FFmpegDecoder::GetFrameFromCache(const int64_t &t) const { if (t < cached_frames_.first()->timestamp()) { @@ -1328,17 +876,14 @@ FFmpegFramePool::ElementPtr FFmpegDecoderInstance::GetFrameFromCache(const int64 return nullptr; } -void FFmpegDecoderInstance::RemoveFramesBefore(const qint64 &t) +/*void FFmpegDecoder::RemoveFramesBefore(const qint64 &t) { - // We keep one frame in memory as an identifier for what pts the decoder is up to - int min_frames = (MemoryPoolLimitReached() && !IsWorking()) ? 0 : 1; - - while (cached_frames_.size() > min_frames && cached_frames_.first()->last_accessed() < t) { + while (!cached_frames_.isEmpty() && cached_frames_.first()->last_accessed() < t) { RemoveFirstFrame(); } } -int FFmpegDecoderInstance::TruncateCacheRangeToTime(const qint64 &t) +int FFmpegDecoder::TruncateCacheRangeToTime(const qint64 &t) { int counter = 0; @@ -1351,7 +896,7 @@ int FFmpegDecoderInstance::TruncateCacheRangeToTime(const qint64 &t) return counter; } -int FFmpegDecoderInstance::TruncateCacheRangeToFrames(int nb_frames) +int FFmpegDecoder::TruncateCacheRangeToFrames(int nb_frames) { int counter = 0; @@ -1362,34 +907,30 @@ int FFmpegDecoderInstance::TruncateCacheRangeToFrames(int nb_frames) } return counter; -} +}*/ -void FFmpegDecoderInstance::RemoveFirstFrame() +void FFmpegDecoder::RemoveFirstFrame() { cached_frames_.removeFirst(); cache_at_zero_ = false; } -FFmpegDecoderInstance::FFmpegDecoderInstance(const char *filename, int stream_index) : +FFmpegDecoder::Instance::Instance() : fmt_ctx_(nullptr), codec_ctx_(nullptr), - opts_(nullptr), - scale_ctx_(nullptr), - scale_divider_(0), - frame_pool_(nullptr), - is_working_(false), - cache_at_zero_(false), - cache_at_eof_(false), - clear_timer_(nullptr) + opts_(nullptr) +{ +} + +bool FFmpegDecoder::Instance::Open(const char *filename, int stream_index) { // Open file in a format context int error_code = avformat_open_input(&fmt_ctx_, filename, nullptr, nullptr); // Handle format context error if (error_code != 0) { - qCritical() << "Failed to open input:" << filename << error_code; - ClearResources(); - return; + qCritical() << "Failed to open input:" << filename << FFmpegError(error_code); + return false; } // Get stream information from format @@ -1397,9 +938,8 @@ FFmpegDecoderInstance::FFmpegDecoderInstance(const char *filename, int stream_in // Handle get stream information error if (error_code < 0) { - qCritical() << "Failed to find stream info:" << error_code; - ClearResources(); - return; + qCritical() << "Failed to find stream info:" << FFmpegError(error_code); + return false; } // Get reference to correct AVStream @@ -1410,17 +950,18 @@ FFmpegDecoderInstance::FFmpegDecoderInstance(const char *filename, int stream_in // Handle failure to find decoder if (codec == nullptr) { - qCritical() << "Failed to find appropriate decoder for this codec:" << filename << stream_index << avstream_->codecpar->codec_id; - ClearResources(); - return; + qCritical() << "Failed to find appropriate decoder for this codec:" + << filename + << stream_index + << avstream_->codecpar->codec_id; + return false; } // Allocate context for the decoder codec_ctx_ = avcodec_alloc_context3(codec); if (codec_ctx_ == nullptr) { qCritical() << "Failed to allocate codec context"; - ClearResources(); - return; + return false; } // Copy parameters from the AVStream to the AVCodecContext @@ -1429,8 +970,7 @@ FFmpegDecoderInstance::FFmpegDecoderInstance(const char *filename, int stream_in // Handle failure to copy parameters if (error_code < 0) { qCritical() << "Failed to copy parameters from AVStream to AVCodecContext"; - ClearResources(); - return; + return false; } // Set multithreading setting @@ -1447,50 +987,14 @@ FFmpegDecoderInstance::FFmpegDecoderInstance(const char *filename, int stream_in char buf[50]; av_strerror(error_code, buf, 50); qCritical() << "Failed to open codec" << codec->id << error_code << buf; - ClearResources(); - return; + return false; } - // Create frame pool - if (avstream_->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { - // Start clear timer - clear_timer_ = new QTimer(); - clear_timer_->setInterval(kMaxFrameLife); - clear_timer_->moveToThread(qApp->thread()); - connect(clear_timer_, &QTimer::timeout, this, &FFmpegDecoderInstance::ClearTimerEvent, Qt::DirectConnection); - QMetaObject::invokeMethod(clear_timer_, "start", Qt::QueuedConnection); - } - - // Store one second in the source's timebase - second_ts_ = qRound64(av_q2d(av_inv_q(avstream_->time_base))); + return true; } -FFmpegDecoderInstance::~FFmpegDecoderInstance() +void FFmpegDecoder::Instance::Close() { - ClearResources(); -} - -bool FFmpegDecoderInstance::IsValid() const -{ - return codec_ctx_; -} - -void FFmpegDecoderInstance::SetFramePool(FFmpegFramePool *frame_pool) -{ - frame_pool_ = frame_pool; -} - -void FFmpegDecoderInstance::ClearResources() -{ - ClearFrameCache(); - - // Stop timer - if (clear_timer_) { - QMetaObject::invokeMethod(clear_timer_, "stop", Qt::QueuedConnection); - clear_timer_->deleteLater(); - clear_timer_ = nullptr; - } - if (opts_) { av_dict_free(&opts_); opts_ = nullptr; @@ -1505,20 +1009,57 @@ void FFmpegDecoderInstance::ClearResources() avformat_close_input(&fmt_ctx_); fmt_ctx_ = nullptr; } - - FreeScaler(); } -void FFmpegDecoderInstance::ClearTimerEvent() +int FFmpegDecoder::Instance::GetFrame(AVPacket *pkt, AVFrame *frame) { - cache_lock()->lock(); - RemoveFramesBefore(QDateTime::currentMSecsSinceEpoch() - kMaxFrameLife); - cache_lock()->unlock(); + bool eof = false; + + int ret; + + // Clear any previous frames + av_frame_unref(frame); + + while ((ret = avcodec_receive_frame(codec_ctx_, frame)) == AVERROR(EAGAIN) && !eof) { + + // Find next packet in the correct stream index + do { + // Free buffer in packet if there is one + av_packet_unref(pkt); + + // Read packet from file + ret = av_read_frame(fmt_ctx_, pkt); + } while (pkt->stream_index != avstream_->index && ret >= 0); + + if (ret == AVERROR_EOF) { + // Don't break so that receive gets called again, but don't try to read again + eof = true; + + // Send a null packet to signal end of + avcodec_send_packet(codec_ctx_, nullptr); + } else if (ret < 0) { + // Handle other error by breaking loop and returning the code we received + break; + } else { + // Successful read, send the packet + ret = avcodec_send_packet(codec_ctx_, pkt); + + // We don't need the packet anymore, so free it + av_packet_unref(pkt); + + if (ret < 0) { + break; + } + } + } + + return ret; } -uint qHash(const FFmpegDecoder::FFmpegFramePoolKey &r) +void FFmpegDecoder::Instance::Seek(int64_t timestamp) { - return ::qHash(r.width) ^ ::qHash(r.height) ^ ::qHash(r.format); + avcodec_flush_buffers(codec_ctx_); + av_seek_frame(fmt_ctx_, avstream_->index, timestamp, AVSEEK_FLAG_BACKWARD); } OLIVE_NAMESPACE_EXIT diff --git a/app/codec/ffmpeg/ffmpegdecoder.h b/app/codec/ffmpeg/ffmpegdecoder.h index b2d91800f..4dcb5992b 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.h +++ b/app/codec/ffmpeg/ffmpegdecoder.h @@ -41,99 +41,6 @@ extern "C" { OLIVE_NAMESPACE_ENTER -class FFmpegDecoderInstance : public QObject { - Q_OBJECT -public: - FFmpegDecoderInstance(const char* filename, int stream_index); - virtual ~FFmpegDecoderInstance(); - - DISABLE_COPY_MOVE(FFmpegDecoderInstance) - - bool IsValid() const; - - void SetFramePool(FFmpegFramePool* frame_pool); - - int64_t RangeStart() const; - int64_t RangeEnd() const; - bool CacheContainsTime(const int64_t& t) const; - bool CacheWillContainTime(const int64_t& t) const; - bool CacheCouldContainTime(const int64_t& t) const; - bool CacheIsEmpty() const; - FFmpegFramePool::ElementPtr GetFrameFromCache(const int64_t& t) const; - - void RemoveFramesBefore(const qint64& t); - int TruncateCacheRangeToTime(const qint64& t); - int TruncateCacheRangeToFrames(int nb_frames); - void RemoveFirstFrame(); - - AVFormatContext* fmt_ctx() const - { - return fmt_ctx_; - } - - AVStream* stream() const - { - return avstream_; - } - - void ClearFrameCache(); - - FFmpegFramePool::ElementPtr RetrieveFrame(const int64_t &target_ts, int divider, bool cache_is_locked); - - /** - * @brief Uses the FFmpeg API to retrieve a packet (stored in pkt_) and decode it (stored in frame_) - * - * @return - * - * An FFmpeg error code, or >= 0 on success - */ - int GetFrame(AVPacket* pkt, AVFrame* frame); - - QMutex* cache_lock(); - QWaitCondition* cache_wait_cond(); - - bool IsWorking(); - void SetWorking(bool working); - -private: - void ClearResources(); - - void Seek(int64_t timestamp); - - void InitScaler(int divider); - void FreeScaler(); - - AVFormatContext* fmt_ctx_; - AVCodecContext* codec_ctx_; - AVStream* avstream_; - AVDictionary* opts_; - - SwsContext* scale_ctx_; - int scale_divider_; - - int64_t second_ts_; - - QWaitCondition cache_wait_cond_; - QMutex cache_lock_; - QList cached_frames_; - FFmpegFramePool* frame_pool_; - - int64_t cache_target_time_; - - bool is_working_; - QMutex is_working_mutex_; - - bool cache_at_zero_; - bool cache_at_eof_; - - QTimer* clear_timer_; - static const int kMaxFrameLife; - -private slots: - void ClearTimerEvent(); - -}; - /** * @brief A Decoder derivative that wraps FFmpeg functions as on Olive decoder */ @@ -147,40 +54,62 @@ public: // Destructor virtual ~FFmpegDecoder() override; - virtual FootagePtr Probe(const QString& filename, const QAtomicInt* cancelled) const override; - - virtual bool Open() override; - virtual FramePtr RetrieveVideo(const rational &timecode, const int& divider) override; - virtual SampleBufferPtr RetrieveAudio(const rational &timecode, const rational &length, const AudioParams& params) override; - virtual void Close() override; - virtual QString id() override; - virtual bool SupportsVideo() override; - virtual bool SupportsAudio() override; + virtual bool SupportsVideo() override{return true;} + virtual bool SupportsAudio() override{return true;} - virtual bool ConformAudio(const QAtomicInt* cancelled, const AudioParams& p) override; + virtual FootagePtr Probe(const QString& filename, const QAtomicInt* cancelled) const override; - struct FFmpegFramePoolKey { - int width; - int height; - AVPixelFormat format; - - bool operator==(const FFmpegFramePoolKey& k) const - { - return width == k.width && height == k.height && format == k.format; - } - }; +protected: + virtual bool OpenInternal() override; + virtual FramePtr RetrieveVideoInternal(const rational &timecode, const int& divider) override; + virtual bool ConformAudioInternal(const QString& filename, const AudioParams ¶ms, const QAtomicInt* cancelled) override; + virtual void CloseInternal() override; private: - /** - * @brief Handle an error - * - * Immediately closes the Decoder (freeing memory resources) and sends the string provided to the warning stream. - * As this function closes the Decoder, no further Decoder functions should be performed after this is called - * (unless the Decoder is opened again first). - */ - void Error(const QString& s); + class Instance + { + public: + Instance(); + + ~Instance() + { + Close(); + } + + bool Open(const char* filename, int stream_index); + + void Close(); + + /** + * @brief Uses the FFmpeg API to retrieve a packet (stored in pkt_) and decode it (stored in frame_) + * + * @return + * + * An FFmpeg error code, or >= 0 on success + */ + int GetFrame(AVPacket* pkt, AVFrame* frame); + + void Seek(int64_t timestamp); + + AVFormatContext* fmt_ctx() const + { + return fmt_ctx_; + } + + AVStream* avstream() const + { + return avstream_; + } + + private: + AVFormatContext* fmt_ctx_; + AVCodecContext* codec_ctx_; + AVStream* avstream_; + AVDictionary* opts_; + + }; /** * @brief Handle an FFmpeg error code @@ -190,9 +119,7 @@ private: * * @param error_code */ - void FFmpegError(int error_code); - - void ClearResources(); + static QString FFmpegError(int error_code); void InitScaler(int divider); void FreeScaler(); @@ -203,29 +130,37 @@ private: static uint64_t ValidateChannelLayout(AVStream *stream); - static bool StreamUsesMultipleInstances(StreamPtr stream); + void FFmpegFrameToNativeBuffer(uint8_t** input_data, int* input_linesize, uint8_t **output_buffer, int *output_linesize); - FramePtr BuffersToNativeFrame(int divider, int width, int height, const rational &ts, uint8_t **input_data, int* input_linesize); + FFmpegFramePool::ElementPtr GetFrameFromCache(const int64_t& t) const; + + void ClearFrameCache(); + + FFmpegFramePool::ElementPtr RetrieveFrame(const int64_t &target_ts, int divider); + + void RemoveFirstFrame(); SwsContext* scale_ctx_; int scale_divider_; - AVPixelFormat src_pix_fmt_; AVPixelFormat ideal_pix_fmt_; PixelFormat::Format native_pix_fmt_; - struct FFmpegFramePoolValue { - FFmpegFramePool* pool = nullptr; - int handles = 0; - }; + FFmpegFramePool pool_; - static QHash< Stream*, QList > instance_map_; - static QHash< FFmpegFramePoolKey, FFmpegFramePoolValue > frame_pool_map_; - static QMutex instance_map_lock_; + int64_t second_ts_; + + QList cached_frames_; + + bool is_working_; + QMutex is_working_mutex_; + + bool cache_at_zero_; + bool cache_at_eof_; + + Instance instance_; }; -uint qHash(const FFmpegDecoder::FFmpegFramePoolKey& r); - OLIVE_NAMESPACE_EXIT #endif // FFMPEGDECODER_H diff --git a/app/codec/ffmpeg/ffmpegframepool.cpp b/app/codec/ffmpeg/ffmpegframepool.cpp index cca05aed4..ac114ba12 100644 --- a/app/codec/ffmpeg/ffmpegframepool.cpp +++ b/app/codec/ffmpeg/ffmpegframepool.cpp @@ -20,9 +20,7 @@ #include "ffmpegframepool.h" -extern "C" { -#include -} +#include "codec/frame.h" OLIVE_NAMESPACE_ENTER @@ -30,11 +28,11 @@ FFmpegFramePool::FFmpegFramePool(int element_count) : MemoryPool(element_count), width_(0), height_(0), - format_(AV_PIX_FMT_NONE) + format_(PixelFormat::PIX_FMT_INVALID) { } -void FFmpegFramePool::SetParameters(int width, int height, AVPixelFormat format) +void FFmpegFramePool::SetParameters(int width, int height, PixelFormat::Format format) { Clear(); @@ -45,17 +43,7 @@ void FFmpegFramePool::SetParameters(int width, int height, AVPixelFormat format) size_t FFmpegFramePool::GetElementSize() { - int buf_sz = av_image_get_buffer_size(static_cast(format_), - width_, - height_, - 1); - - if (buf_sz < 0) { - qDebug() << "Failed to find buffer size:" << buf_sz; - return 0; - } - - return buf_sz; + return Frame::generate_linesize_bytes(width_, format_) * height_; } OLIVE_NAMESPACE_EXIT diff --git a/app/codec/ffmpeg/ffmpegframepool.h b/app/codec/ffmpeg/ffmpegframepool.h index 81a31312e..8a72bb61e 100644 --- a/app/codec/ffmpeg/ffmpegframepool.h +++ b/app/codec/ffmpeg/ffmpegframepool.h @@ -32,7 +32,7 @@ class FFmpegFramePool : public MemoryPool public: FFmpegFramePool(int element_count); - void SetParameters(int width, int height, AVPixelFormat format); + void SetParameters(int width, int height, PixelFormat::Format format); const int& width() const { @@ -52,7 +52,7 @@ private: int height_; - AVPixelFormat format_; + PixelFormat::Format format_; }; diff --git a/app/codec/frame.cpp b/app/codec/frame.cpp index 8cd0a53bd..8b06cfbe6 100644 --- a/app/codec/frame.cpp +++ b/app/codec/frame.cpp @@ -45,33 +45,14 @@ void Frame::set_video_params(const VideoParams ¶ms) { params_ = params; - // Align linesize to 32 - linesize_ = qCeil(static_cast(width()) / 32.0) * 32; + linesize_ = generate_linesize_bytes(params_.width(), params_.format()); + linesize_pixels_ = linesize_ / PixelFormat::BytesPerPixel(params_.format()); } -int Frame::linesize_pixels() const +int Frame::generate_linesize_bytes(int width, PixelFormat::Format format) { - return linesize_; -} - -int Frame::linesize_bytes() const -{ - return linesize_pixels() * PixelFormat::BytesPerPixel(params_.format()); -} - -const int &Frame::width() const -{ - return params_.effective_width(); -} - -const int &Frame::height() const -{ - return params_.effective_height(); -} - -const PixelFormat::Format &Frame::format() const -{ - return params_.format(); + // Align to 32 bytes (not sure if this is necessary?) + return ((PixelFormat::BytesPerPixel(format) * width) + 31) & ~31; } Color Frame::get_pixel(int x, int y) const @@ -80,9 +61,7 @@ Color Frame::get_pixel(int x, int y) const return Color(); } - int pixel_index = y * linesize_pixels() + x; - - int byte_offset = PixelFormat::GetBufferSize(video_params().format(), pixel_index, 1); + int byte_offset = y * linesize_bytes() + x * PixelFormat::BytesPerPixel(video_params().format()); return Color(data_.data() + byte_offset, video_params().format()); } @@ -98,33 +77,11 @@ void Frame::set_pixel(int x, int y, const Color &c) return; } - int pixel_index = y * linesize_pixels() + x; - - int byte_offset = PixelFormat::GetBufferSize(video_params().format(), pixel_index, 1); + int byte_offset = y * linesize_bytes() + x * PixelFormat::BytesPerPixel(video_params().format()); c.toData(data_.data() + byte_offset, video_params().format()); } -const rational &Frame::timestamp() const -{ - return timestamp_; -} - -void Frame::set_timestamp(const rational ×tamp) -{ - timestamp_ = timestamp; -} - -char *Frame::data() -{ - return data_.data(); -} - -const char *Frame::const_data() const -{ - return data_.constData(); -} - void Frame::allocate() { // Assume this frame is intended to be a video frame @@ -136,19 +93,4 @@ void Frame::allocate() data_.resize(PixelFormat::GetBufferSize(params_.format(), linesize_, params_.height())); } -bool Frame::is_allocated() const -{ - return !data_.isEmpty(); -} - -void Frame::destroy() -{ - data_.clear(); -} - -int Frame::allocated_size() const -{ - return data_.size(); -} - OLIVE_NAMESPACE_EXIT diff --git a/app/codec/frame.h b/app/codec/frame.h index 7618ad622..57938096d 100644 --- a/app/codec/frame.h +++ b/app/codec/frame.h @@ -47,11 +47,32 @@ public: const VideoParams& video_params() const; void set_video_params(const VideoParams& params); - int linesize_pixels() const; - int linesize_bytes() const; - const int& width() const; - const int& height() const; - const PixelFormat::Format& format() const; + static int generate_linesize_bytes(int width, PixelFormat::Format format); + + int linesize_pixels() const + { + return linesize_pixels_; + } + + int linesize_bytes() const + { + return linesize_; + } + + int width() const + { + return params_.effective_width(); + } + + int height() const + { + return params_.effective_height(); + } + + PixelFormat::Format format() const + { + return params_.format(); + } Color get_pixel(int x, int y) const; bool contains_pixel(int x, int y) const; @@ -62,18 +83,31 @@ public: * * This timestamp is always a rational that will equate to the time in seconds. */ - const rational& timestamp() const; - void set_timestamp(const rational& timestamp); + const rational& timestamp() const + { + return timestamp_; + } + + void set_timestamp(const rational& timestamp) + { + timestamp_ = timestamp; + } /** * @brief Get the data buffer of this frame */ - char* data(); + char* data() + { + return data_.data(); + } /** * @brief Get the const data buffer of this frame */ - const char* const_data() const; + const char* const_data() const + { + return data_.constData(); + } /** * @brief Allocate memory buffer to store data based on parameters @@ -87,19 +121,28 @@ public: /** * @brief Return whether the frame is allocated or not */ - bool is_allocated() const; + bool is_allocated() const + { + return !data_.isEmpty(); + } /** * @brief Destroy a memory buffer allocated with allocate() */ - void destroy(); + void destroy() + { + data_.clear(); + } /** * @brief Returns the size of the array returned in data() in bytes * * Returns 0 if nothing is allocated. */ - int allocated_size() const; + int allocated_size() const + { + return data_.size(); + } private: VideoParams params_; @@ -110,6 +153,8 @@ private: int linesize_; + int linesize_pixels_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/codec/oiio/CMakeLists.txt b/app/codec/oiio/CMakeLists.txt index 19103a192..4843b25b1 100644 --- a/app/codec/oiio/CMakeLists.txt +++ b/app/codec/oiio/CMakeLists.txt @@ -16,7 +16,9 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} - codec/oiio/oiiodecoder.h + codec/oiio/oiiocommon.cpp + codec/oiio/oiiocommon.h codec/oiio/oiiodecoder.cpp + codec/oiio/oiiodecoder.h PARENT_SCOPE ) diff --git a/app/codec/oiio/oiiocommon.cpp b/app/codec/oiio/oiiocommon.cpp new file mode 100644 index 000000000..f51f82aa2 --- /dev/null +++ b/app/codec/oiio/oiiocommon.cpp @@ -0,0 +1,102 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "oiiocommon.h" + +OLIVE_NAMESPACE_ENTER + +void OIIOCommon::FrameToBuffer(FramePtr frame, OIIO::ImageBuf *buf) +{ +#if OIIO_VERSION < 20112 + // + // Workaround for OIIO bug that ignores destination stride in versions OLDER than 2.1.12 + // + // See more: https://github.com/OpenImageIO/oiio/pull/2487 + // + int width_in_bytes = frame->width() * PixelFormat::BytesPerPixel(frame->format()); + + for (int i=0;ispec().height;i++) { + memcpy( +#if OIIO_VERSION < 10903 + reinterpret_cast(buf->localpixels()) + i * width_in_bytes, +#else + reinterpret_cast(buf->localpixels()) + i * buf->scanline_stride(), +#endif + frame->data() + i * frame->linesize_bytes(), + width_in_bytes); + } +#else + buf->set_pixels(OIIO::ROI(), + buf->spec().format, + frame->data(), + OIIO::AutoStride, + frame->linesize_bytes()); +#endif +} + +void OIIOCommon::BufferToFrame(OIIO::ImageBuf *buf, FramePtr frame) +{ +#if OIIO_VERSION < 20112 + // + // Workaround for OIIO bug that ignores destination stride in versions OLDER than 2.1.12 + // + // See more: https://github.com/OpenImageIO/oiio/pull/2487 + // + int width_in_bytes = frame->width() * PixelFormat::BytesPerPixel(frame->format()); + + for (int i=0;ispec().height;i++) { + memcpy(frame->data() + i * frame->linesize_bytes(), +#if OIIO_VERSION < 10903 + reinterpret_cast(buf->localpixels()) + i * width_in_bytes, +#else + reinterpret_cast(buf->localpixels()) + i * buf->scanline_stride(), +#endif + width_in_bytes); + } +#else + buf->get_pixels(OIIO::ROI(), + buf->spec().format, + frame->data(), + OIIO::AutoStride, + frame->linesize_bytes()); +#endif +} + +PixelFormat::Format OIIOCommon::GetFormatFromOIIOBasetype(const OIIO::ImageSpec& spec) +{ + if (spec.format == OIIO::TypeDesc::UINT8) { + return PixelFormat::PIX_FMT_RGBA8; + } else if (spec.format == OIIO::TypeDesc::UINT16) { + return PixelFormat::PIX_FMT_RGBA16U; + } else if (spec.format == OIIO::TypeDesc::HALF) { + return PixelFormat::PIX_FMT_RGBA16F; + } else if (spec.format == OIIO::TypeDesc::FLOAT) { + return PixelFormat::PIX_FMT_RGBA32F; + } else { + return PixelFormat::PIX_FMT_INVALID; + } +} + +rational OIIOCommon::GetPixelAspectRatioFromOIIO(const OIIO::ImageSpec &spec) +{ + return rational::fromDouble(spec.get_float_attribute("PixelAspectRatio", 1)); +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/codec/oiio/oiiocommon.h b/app/codec/oiio/oiiocommon.h new file mode 100644 index 000000000..aeccc2e0d --- /dev/null +++ b/app/codec/oiio/oiiocommon.h @@ -0,0 +1,47 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef OIIOCOMMON_H +#define OIIOCOMMON_H + +#include +#include + +#include "codec/frame.h" +#include "render/pixelformat.h" + +OLIVE_NAMESPACE_ENTER + +class OIIOCommon +{ +public: + static void FrameToBuffer(FramePtr frame, OIIO::ImageBuf* buf); + + static void BufferToFrame(OIIO::ImageBuf* buf, FramePtr frame); + + static PixelFormat::Format GetFormatFromOIIOBasetype(const OIIO::ImageSpec& spec); + + static rational GetPixelAspectRatioFromOIIO(const OIIO::ImageSpec& spec); + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // OIIOCOMMON_H diff --git a/app/codec/oiio/oiiodecoder.cpp b/app/codec/oiio/oiiodecoder.cpp index 4ddbf0ca5..632220189 100644 --- a/app/codec/oiio/oiiodecoder.cpp +++ b/app/codec/oiio/oiiodecoder.cpp @@ -29,6 +29,7 @@ #include "common/define.h" #include "config/config.h" #include "core.h" +#include "oiiocommon.h" OLIVE_NAMESPACE_ENTER @@ -40,6 +41,11 @@ OIIODecoder::OIIODecoder() : { } +OIIODecoder::~OIIODecoder() +{ + CloseInternal(); +} + QString OIIODecoder::id() { return QStringLiteral("oiio"); @@ -47,6 +53,10 @@ QString OIIODecoder::id() FootagePtr OIIODecoder::Probe(const QString& filename, const QAtomicInt* cancelled) const { + Q_UNUSED(cancelled) + + // Filter out any file extensions that aren't expected to work - sometimes OIIO will crash trying + // to open a file that it can't if it's given one if (!FileTypeIsSupported(filename)) { return nullptr; } @@ -59,8 +69,9 @@ FootagePtr OIIODecoder::Probe(const QString& filename, const QAtomicInt* cancell return nullptr; } + // Filter out OIIO detecting an "FFmpeg movie", we have a native FFmpeg decoder that can handle + // it better if (!strcmp(in->format_name(), "FFmpeg movie")) { - // If this is FFmpeg via OIIO, fall-through to our native FFmpeg decoder return nullptr; } @@ -70,8 +81,8 @@ FootagePtr OIIODecoder::Probe(const QString& filename, const QAtomicInt* cancell image_stream->set_width(in->spec().width); image_stream->set_height(in->spec().height); - image_stream->set_format(GetFormatFromOIIOBasetype(in->spec())); - image_stream->set_pixel_aspect_ratio(GetPixelAspectRatioFromOIIO(in->spec())); + image_stream->set_format(OIIOCommon::GetFormatFromOIIOBasetype(in->spec())); + image_stream->set_pixel_aspect_ratio(OIIOCommon::GetPixelAspectRatioFromOIIO(in->spec())); image_stream->set_video_type(VideoStream::kVideoTypeStill); // Images will always have just one stream @@ -95,45 +106,40 @@ FootagePtr OIIODecoder::Probe(const QString& filename, const QAtomicInt* cancell return footage; } -bool OIIODecoder::Open() +bool OIIODecoder::OpenInternal() { - Q_ASSERT(stream()); + // If we can open the filename provided, assume everything is working (even if this is an image + // sequence with potentially missing frame) + if (OpenImageHandler(stream()->footage()->filename())) { + VideoStreamPtr video_stream = std::static_pointer_cast(stream()); - if (stream()->type() != Stream::kVideo) { - // Guard against non-video types - return false; + if (video_stream->video_type() == VideoStream::kVideoTypeStill) { + last_sequence_index_ = 0; + } else { + last_sequence_index_ = GetImageSequenceIndex(stream()->footage()->filename()); + } + + return true; } - - VideoStreamPtr video_stream = std::static_pointer_cast(stream()); - - if (video_stream->video_type() == VideoStream::kVideoTypeVideo) { - // This decoder only handles kVideoTypeImageSequence and kVideoTypeStill - return false; - } - - if (video_stream->video_type() == VideoStream::kVideoTypeStill - && !OpenImageHandler(stream()->footage()->filename())) { - return false; - } - - open_ = true; - - return true; + return false; } -FramePtr OIIODecoder::RetrieveVideo(const rational &timecode, const int& divider) +FramePtr OIIODecoder::RetrieveVideoInternal(const rational &timecode, const int& divider) { - if (!open_) { - qWarning() << "Tried to retrieve video on a decoder that's still closed"; - return nullptr; - } - VideoStreamPtr video_stream = std::static_pointer_cast(stream()); - if (video_stream->video_type() == VideoStream::kVideoTypeImageSequence) { - int64_t ts = video_stream->get_time_in_timebase_units(timecode); + int64_t sequence_index; - if (!OpenImageHandler(TransformImageSequenceFileName(stream()->footage()->filename(), ts))) { + if (video_stream->video_type() == VideoStream::kVideoTypeStill) { + sequence_index = 0; + } else { + sequence_index = video_stream->get_time_in_timebase_units(timecode); + } + + if (last_sequence_index_ != sequence_index) { + CloseImageHandle(); + + if (!OpenImageHandler(TransformImageSequenceFileName(stream()->footage()->filename(), sequence_index))) { return nullptr; } } @@ -143,14 +149,14 @@ FramePtr OIIODecoder::RetrieveVideo(const rational &timecode, const int& divider frame->set_video_params(VideoParams(buffer_->spec().width, buffer_->spec().height, pix_fmt_, - GetPixelAspectRatioFromOIIO(buffer_->spec()), + OIIOCommon::GetPixelAspectRatioFromOIIO(buffer_->spec()), VideoParams::kInterlaceNone, // FIXME: Does OIIO deinterlace for us? divider)); frame->allocate(); if (divider == 1) { - BufferToFrame(buffer_, frame); + OIIOCommon::BufferToFrame(buffer_, frame); } else { @@ -161,106 +167,18 @@ FramePtr OIIODecoder::RetrieveVideo(const rational &timecode, const int& divider qWarning() << "OIIO resize failed"; } - BufferToFrame(&dst, frame); + OIIOCommon::BufferToFrame(&dst, frame); } - if (video_stream->video_type() == VideoStream::kVideoTypeImageSequence) { - CloseImageHandle(); - } - return frame; } -void OIIODecoder::Close() +void OIIODecoder::CloseInternal() { CloseImageHandle(); } -bool OIIODecoder::SupportsVideo() -{ - return true; -} - -void OIIODecoder::FrameToBuffer(FramePtr frame, OIIO::ImageBuf *buf) -{ -#if OIIO_VERSION < 20112 - // - // Workaround for OIIO bug that ignores destination stride in versions OLDER than 2.1.12 - // - // See more: https://github.com/OpenImageIO/oiio/pull/2487 - // - int width_in_bytes = frame->width() * PixelFormat::BytesPerPixel(frame->format()); - - for (int i=0;ispec().height;i++) { - memcpy( -#if OIIO_VERSION < 10903 - reinterpret_cast(buf->localpixels()) + i * width_in_bytes, -#else - reinterpret_cast(buf->localpixels()) + i * buf->scanline_stride(), -#endif - frame->data() + i * frame->linesize_bytes(), - width_in_bytes); - } -#else - buf->set_pixels(OIIO::ROI(), - buf->spec().format, - frame->data(), - OIIO::AutoStride, - frame->linesize_bytes()); -#endif -} - -void OIIODecoder::BufferToFrame(OIIO::ImageBuf *buf, FramePtr frame) -{ -#if OIIO_VERSION < 20112 - // - // Workaround for OIIO bug that ignores destination stride in versions OLDER than 2.1.12 - // - // See more: https://github.com/OpenImageIO/oiio/pull/2487 - // - int width_in_bytes = frame->width() * PixelFormat::BytesPerPixel(frame->format()); - - for (int i=0;ispec().height;i++) { - memcpy(frame->data() + i * frame->linesize_bytes(), -#if OIIO_VERSION < 10903 - reinterpret_cast(buf->localpixels()) + i * width_in_bytes, -#else - reinterpret_cast(buf->localpixels()) + i * buf->scanline_stride(), -#endif - width_in_bytes); - } -#else - buf->get_pixels(OIIO::ROI(), - buf->spec().format, - frame->data(), - OIIO::AutoStride, - frame->linesize_bytes()); -#endif -} - -PixelFormat::Format OIIODecoder::GetFormatFromOIIOBasetype(const OIIO::ImageSpec& spec) -{ - bool has_alpha = (spec.nchannels == kRGBAChannels); - - if (spec.format == OIIO::TypeDesc::UINT8) { - return has_alpha ? PixelFormat::PIX_FMT_RGBA8 : PixelFormat::PIX_FMT_RGB8; - } else if (spec.format == OIIO::TypeDesc::UINT16) { - return has_alpha ? PixelFormat::PIX_FMT_RGBA16U : PixelFormat::PIX_FMT_RGB16U; - } else if (spec.format == OIIO::TypeDesc::HALF) { - return has_alpha ? PixelFormat::PIX_FMT_RGBA16F : PixelFormat::PIX_FMT_RGB16F; - } else if (spec.format == OIIO::TypeDesc::FLOAT) { - return has_alpha ? PixelFormat::PIX_FMT_RGBA32F : PixelFormat::PIX_FMT_RGB32F; - } else { - return PixelFormat::PIX_FMT_INVALID; - } -} - -rational OIIODecoder::GetPixelAspectRatioFromOIIO(const OIIO::ImageSpec &spec) -{ - return rational::fromDouble(spec.get_float_attribute("PixelAspectRatio", 1)); -} - bool OIIODecoder::FileTypeIsSupported(const QString& fn) { // We prioritize OIIO over FFmpeg to pick up still images more effectively, but some OIIO decoders (notably OpenJPEG) @@ -299,7 +217,7 @@ bool OIIODecoder::OpenImageHandler(const QString &fn) is_rgba_ = (spec.nchannels == kRGBAChannels); - pix_fmt_ = GetFormatFromOIIOBasetype(spec); + pix_fmt_ = OIIOCommon::GetFormatFromOIIOBasetype(spec); if (pix_fmt_ == PixelFormat::PIX_FMT_INVALID) { qWarning() << "Failed to convert OIIO::ImageDesc to native pixel format"; diff --git a/app/codec/oiio/oiiodecoder.h b/app/codec/oiio/oiiodecoder.h index 11e7638ab..328b54a30 100644 --- a/app/codec/oiio/oiiodecoder.h +++ b/app/codec/oiio/oiiodecoder.h @@ -35,23 +35,18 @@ class OIIODecoder : public Decoder public: OIIODecoder(); + virtual ~OIIODecoder() override; + virtual QString id() override; + virtual bool SupportsVideo() override{return true;} + virtual FootagePtr Probe(const QString& filename, const QAtomicInt* cancelled) const override; - virtual bool Open() override; - virtual FramePtr RetrieveVideo(const rational &timecode, const int& divider) override; - virtual void Close() override; - - virtual bool SupportsVideo() override; - - static void FrameToBuffer(FramePtr frame, OIIO::ImageBuf* buf); - - static void BufferToFrame(OIIO::ImageBuf* buf, FramePtr frame); - - static PixelFormat::Format GetFormatFromOIIOBasetype(const OIIO::ImageSpec& spec); - - static rational GetPixelAspectRatioFromOIIO(const OIIO::ImageSpec& spec); +protected: + virtual bool OpenInternal() override; + virtual FramePtr RetrieveVideoInternal(const rational &timecode, const int& divider) override; + virtual void CloseInternal() override; private: #if OIIO_VERSION < 10903 @@ -66,6 +61,8 @@ private: void CloseImageHandle(); + int64_t last_sequence_index_; + PixelFormat::Format pix_fmt_; bool is_rgba_; diff --git a/app/project/item/footage/audiostream.cpp b/app/project/item/footage/audiostream.cpp index f824c2ec1..946fe8942 100644 --- a/app/project/item/footage/audiostream.cpp +++ b/app/project/item/footage/audiostream.cpp @@ -66,38 +66,6 @@ void AudioStream::set_sample_rate(const int &sample_rate) sample_rate_ = sample_rate; } -bool AudioStream::try_start_conforming(const AudioParams ¶ms) -{ - QMutexLocker locker(proxy_access_lock()); - - if (!currently_conforming_.contains(params) - && !conformed_.contains(params)) { - currently_conforming_.append(params); - return true; - } - - return false; -} - -bool AudioStream::has_conformed_version(const AudioParams ¶ms) -{ - QMutexLocker locker(proxy_access_lock()); - - return conformed_.contains(params); -} - -void AudioStream::append_conformed_version(const AudioParams ¶ms) -{ - { - QMutexLocker locker(proxy_access_lock()); - - currently_conforming_.removeOne(params); - conformed_.append(params); - } - - emit ConformAppended(params); -} - QIcon AudioStream::icon() const { return icon::Audio; diff --git a/app/project/item/footage/audiostream.h b/app/project/item/footage/audiostream.h index f85046839..a4990b385 100644 --- a/app/project/item/footage/audiostream.h +++ b/app/project/item/footage/audiostream.h @@ -49,10 +49,6 @@ public: const int& sample_rate() const; void set_sample_rate(const int& sample_rate); - bool try_start_conforming(const AudioParams& params); - bool has_conformed_version(const AudioParams& params); - void append_conformed_version(const AudioParams& params); - virtual QIcon icon() const override; protected: @@ -60,18 +56,11 @@ protected: virtual void SaveCustomParameters(QXmlStreamWriter* writer) const override; -signals: - void ConformAppended(OLIVE_NAMESPACE::AudioParams params); - private: int channels_; uint64_t layout_; int sample_rate_; - QList conformed_; - - QList currently_conforming_; - }; using AudioStreamPtr = std::shared_ptr; diff --git a/app/project/item/footage/footage.cpp b/app/project/item/footage/footage.cpp index cd92604c6..e30a2d382 100644 --- a/app/project/item/footage/footage.cpp +++ b/app/project/item/footage/footage.cpp @@ -308,7 +308,7 @@ bool Footage::CompareFootageToItsFilename(FootagePtr footage) } else { // Footage may have changed and we'll have to re-probe it. It also may not have, in which // case nothing needs to change. - ItemPtr item = Decoder::ProbeMedia(footage->project(), footage->filename(), nullptr); + ItemPtr item = Decoder::Probe(footage->project(), footage->filename(), nullptr); if (item && item->type() == footage->type()) { // Item is the same type, that's a good sign. Let's look for any differences. From 52b98f3fa31fd971ab2e223a9b04f742fa58f21e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 10 Nov 2020 11:24:20 +1100 Subject: [PATCH 18/72] lightened SampleFormat struct --- app/audio/sampleformat.cpp | 16 ++++++++-------- app/audio/sampleformat.h | 6 ++---- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/app/audio/sampleformat.cpp b/app/audio/sampleformat.cpp index f7af19c65..27bbbb0a4 100644 --- a/app/audio/sampleformat.cpp +++ b/app/audio/sampleformat.cpp @@ -20,7 +20,7 @@ #include "sampleformat.h" -#include "core.h" +#include OLIVE_NAMESPACE_ENTER @@ -30,23 +30,23 @@ QString SampleFormat::GetSampleFormatName(const SampleFormat::Format &f) { switch (f) { case SAMPLE_FMT_U8: - return tr("Unsigned 8-bit"); + return QCoreApplication::translate("SampleFormat", "Unsigned 8-bit"); case SAMPLE_FMT_S16: - return tr("Signed 16-bit"); + return QCoreApplication::translate("SampleFormat", "Signed 16-bit"); case SAMPLE_FMT_S32: - return tr("Signed 32-bit"); + return QCoreApplication::translate("SampleFormat", "Signed 32-bit"); case SAMPLE_FMT_S64: - return tr("Signed 64-bit"); + return QCoreApplication::translate("SampleFormat", "Signed 64-bit"); case SAMPLE_FMT_FLT: - return tr("32-bit Float"); + return QCoreApplication::translate("SampleFormat", "32-bit Float"); case SAMPLE_FMT_DBL: - return tr("64-bit Float"); + return QCoreApplication::translate("SampleFormat", "64-bit Float"); case SAMPLE_FMT_COUNT: case SAMPLE_FMT_INVALID: break; } - return tr("Invalid"); + return QCoreApplication::translate("SampleFormat", "Invalid"); } OLIVE_NAMESPACE_EXIT diff --git a/app/audio/sampleformat.h b/app/audio/sampleformat.h index 8b4dd5a9f..1261d04a1 100644 --- a/app/audio/sampleformat.h +++ b/app/audio/sampleformat.h @@ -21,16 +21,14 @@ #ifndef SAMPLEFORMAT_H #define SAMPLEFORMAT_H -#include +#include #include "common/define.h" -#include "render/rendermodes.h" OLIVE_NAMESPACE_ENTER -class SampleFormat : public QObject +class SampleFormat { - Q_OBJECT public: SampleFormat() = default; From 1d61f8992019e09d200b6de329aeeb5392af14a4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 10 Nov 2020 11:24:51 +1100 Subject: [PATCH 19/72] large scale renderer rework - Abstracts all OpenGL functionality including UI objects - Cleans up several rendering codepaths - Improves threading functionality - Removes old code and problematic functions --- .../sequence/sequencedialogparametertab.cpp | 2 +- app/render/backend/opengl/openglrenderer.cpp | 205 ++++++++++++------ app/render/backend/opengl/openglrenderer.h | 31 ++- app/render/backend/renderer.h | 53 +++-- app/render/backend/rendererthreadwrapper.cpp | 120 ++++++---- app/render/backend/rendererthreadwrapper.h | 39 ++-- app/render/color.cpp | 12 +- app/render/colormanager.cpp | 9 - app/render/colorprocessor.cpp | 2 +- app/render/decodercache.h | 13 +- app/render/framehashcache.cpp | 27 +-- app/render/pixelformat.cpp | 113 +--------- app/render/pixelformat.h | 20 +- app/render/previewautocacher.cpp | 54 +++-- app/render/previewautocacher.h | 4 +- app/render/rendermanager.cpp | 56 ++++- app/render/rendermanager.h | 18 +- app/render/renderprocessor.cpp | 153 ++++++------- app/render/renderprocessor.h | 17 +- app/render/videoparams.h | 51 ++++- app/shaders/rgbhistogram.frag | 6 +- app/shaders/rgbhistogram.vert | 3 +- app/shaders/rgbhistogram_secondary.frag | 7 +- app/shaders/rgbwaveform.frag | 6 +- app/task/conform/conform.cpp | 9 +- app/task/export/export.cpp | 13 +- app/task/project/import/import.cpp | 4 +- app/threading/threadpool.cpp | 2 - app/threading/threadticket.cpp | 7 +- app/threading/threadticketwatcher.cpp | 11 +- app/widget/manageddisplay/manageddisplay.cpp | 102 ++++++--- app/widget/manageddisplay/manageddisplay.h | 86 +++++++- app/widget/nodetableview/nodetableview.cpp | 5 +- app/widget/scope/histogram/histogram.cpp | 143 ++++-------- app/widget/scope/histogram/histogram.h | 17 +- app/widget/scope/scopebase/scopebase.cpp | 102 +++------ app/widget/scope/scopebase/scopebase.h | 37 ++-- app/widget/scope/waveform/waveform.cpp | 77 ++++--- app/widget/scope/waveform/waveform.h | 8 +- .../standardcombos/pixelformatcombobox.h | 5 +- app/widget/viewer/viewerdisplay.cpp | 83 +++---- app/widget/viewer/viewerdisplay.h | 15 +- 42 files changed, 927 insertions(+), 820 deletions(-) diff --git a/app/dialog/sequence/sequencedialogparametertab.cpp b/app/dialog/sequence/sequencedialogparametertab.cpp index 98689b16c..7487ba294 100644 --- a/app/dialog/sequence/sequencedialogparametertab.cpp +++ b/app/dialog/sequence/sequencedialogparametertab.cpp @@ -75,7 +75,7 @@ SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence* sequence, QWidg preview_layout->addWidget(preview_resolution_label_, row, 2); row++; preview_layout->addWidget(new QLabel(tr("Format:")), row, 0); - preview_format_field_ = new PixelFormatComboBox(true, true); + preview_format_field_ = new PixelFormatComboBox(true); preview_layout->addWidget(preview_format_field_, row, 1, 1, 2); layout->addWidget(preview_group); diff --git a/app/render/backend/opengl/openglrenderer.cpp b/app/render/backend/opengl/openglrenderer.cpp index 8280f6518..533408e01 100644 --- a/app/render/backend/opengl/openglrenderer.cpp +++ b/app/render/backend/opengl/openglrenderer.cpp @@ -62,6 +62,7 @@ OpenGLRenderer::OpenGLRenderer(QObject* parent) : OpenGLRenderer::~OpenGLRenderer() { + Destroy(); } void OpenGLRenderer::Init(QOpenGLContext *existing_ctx) @@ -97,13 +98,14 @@ bool OpenGLRenderer::Init() void OpenGLRenderer::PostInit() { // Make context current on that surface - if (!context_->makeCurrent(&surface_)) { + if (context_->parent() == this && !context_->makeCurrent(&surface_)) { qCritical() << "Failed to makeCurrent() on offscreen surface in thread" << thread(); return; } - // Store OpenGL functions instance functions_ = context_->functions(); + + // Store OpenGL functions instance functions_->glBlendFunc(GL_ONE, GL_ZERO); // Set up framebuffer used for various things @@ -127,29 +129,58 @@ void OpenGLRenderer::PostInit() void OpenGLRenderer::Destroy() { - // Delete vertex array object - vao_.destroy(); + if (context_) { + // Delete buffers + vert_vbo_.destroy(); + frag_vbo_.destroy(); - // Delete framebuffer - functions_->glDeleteFramebuffers(1, &framebuffer_); + // Delete vertex array object + vao_.destroy(); - // Delete all shaders - qDeleteAll(shader_cache_); - shader_cache_.clear(); + // Delete framebuffer + functions_->glDeleteFramebuffers(1, &framebuffer_); - // Delete context if it belongs to us - if (context_->parent() == this) { - delete context_; - } - context_ = nullptr; + // Delete all shaders + qDeleteAll(shader_cache_); + shader_cache_.clear(); - // Destroy surface if we created it - if (surface_.isValid()) { - surface_.destroy(); + // Delete context if it belongs to us + if (context_->parent() == this) { + delete context_; + } + context_ = nullptr; + + // Destroy surface if we created it + if (surface_.isValid()) { + surface_.destroy(); + } } } -QVariant OpenGLRenderer::CreateNativeTexture(const VideoParams &p, void *data, int linesize) +void OpenGLRenderer::ClearDestination(double r, double g, double b, double a) +{ + functions_->glClearColor(r, g, b, a); + functions_->glClear(GL_COLOR_BUFFER_BIT); +} + +void OpenGLRenderer::AttachTextureAsDestination(Renderer::Texture* texture) +{ + functions_->glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_); + functions_->glFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + texture->id().value(), + 0); + + SetViewport(texture->width(), texture->height()); +} + +void OpenGLRenderer::DetachTextureAsDestination() +{ + functions_->glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +QVariant OpenGLRenderer::CreateNativeTexture(VideoParams p, void *data, int linesize) { GLuint texture; functions_->glGenTextures(1, &texture); @@ -157,7 +188,7 @@ QVariant OpenGLRenderer::CreateNativeTexture(const VideoParams &p, void *data, i functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); functions_->glTexImage2D(GL_TEXTURE_2D, 0, GetInternalFormat(p.format()), - p.width(), p.height(), 0, GetPixelFormat(p.format()), + p.width(), p.height(), 0, GL_RGBA, GetPixelType(p.format()), data); functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); @@ -171,6 +202,37 @@ void OpenGLRenderer::DestroyNativeTexture(QVariant texture) functions_->glDeleteTextures(1, &t); } +QVariant OpenGLRenderer::CreateNativeShader(ShaderCode code) +{ + QOpenGLShaderProgram* program = new QOpenGLShaderProgram(context_); + + if (!program->addShaderFromSourceCode(QOpenGLShader::Vertex, code.vert_code())) { + qCritical() << "Failed to add vertex code to shader"; + goto error; + } + + if (!program->addShaderFromSourceCode(QOpenGLShader::Fragment, code.frag_code())) { + qCritical() << "Failed to add fragment code to shader"; + goto error; + } + + if (!program->link()) { + qCritical() << "Failed to link shader"; + goto error; + } + + return Node::PtrToValue(program); + +error: + delete program; + return QVariant(); +} + +void OpenGLRenderer::DestroyNativeShader(QVariant shader) +{ + delete Node::ValueToPtr(shader); +} + void OpenGLRenderer::UploadToTexture(Texture *texture, void *data, int linesize) { GLuint t = texture->id().value(); @@ -186,7 +248,7 @@ void OpenGLRenderer::UploadToTexture(Texture *texture, void *data, int linesize) functions_->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, p.effective_width(), p.effective_height(), - GetPixelFormat(p.format()), GetPixelType(p.format()), + GL_RGBA, GetPixelType(p.format()), data); functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); @@ -210,7 +272,7 @@ void OpenGLRenderer::DownloadFromTexture(Texture* texture, void *data, int lines 0, p.width(), p.height(), - GetPixelFormat(p.format()), + GL_RGBA, GetPixelType(p.format()), data); @@ -219,7 +281,7 @@ void OpenGLRenderer::DownloadFromTexture(Texture* texture, void *data, int lines functions_->glBindTexture(GL_TEXTURE_2D, current_tex); } -Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeRange &range, const ShaderJob &job, const VideoParams ¶ms) +Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, ShaderJob job, VideoParams params) { // If this node is iterative, we'll pick up which input here GLuint iterative_input = 0; @@ -342,12 +404,6 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR { TexturePtr texture = value.value(); - if (texture) { - if (PixelFormat::FormatHasAlphaChannel(texture->format())) { - input_textures_have_alpha = true; - } - } - // Set value to bound texture shader->setUniformValue(variable_location, textures_to_bind.size()); @@ -359,6 +415,10 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR GLuint tex_id = texture ? texture->id().value() : 0; textures_to_bind.append(tex_id); + if (texture && texture->has_meaningful_alpha()) { + input_textures_have_alpha = true; + } + // Set enable flag if shader wants it int enable_param_location = shader->uniformLocation(QStringLiteral("%1_enabled").arg(it.key())); if (enable_param_location > -1) { @@ -412,17 +472,6 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR static_cast(params.height())); // Create the output textures - PixelFormat::Format output_format = (input_textures_have_alpha || job.GetAlphaChannelRequired()) - ? PixelFormat::GetFormatWithAlphaChannel(params.format()) - : PixelFormat::GetFormatWithoutAlphaChannel(params.format()); - VideoParams output_params(params.width(), - params.height(), - params.time_base(), - output_format, - params.pixel_aspect_ratio(), - params.interlacing(), - params.divider()); - int real_iteration_count; if (job.GetIterationCount() > 1 && job.GetIterativeInput()) { real_iteration_count = job.GetIterationCount(); @@ -431,11 +480,11 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR } TexturePtr dst_refs[2]; - dst_refs[0] = CreateTexture(output_params); + dst_refs[0] = CreateTexture(params); // If this node requires multiple iterations, get a texture for it too if (real_iteration_count > 1) { - dst_refs[1] = CreateTexture(output_params); + dst_refs[1] = CreateTexture(params); } // Some nodes use multiple iterations for optimization @@ -483,20 +532,15 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR PrepareInputTexture(job.GetBilinearFiltering()); } - functions_->glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_); - functions_->glFramebufferTexture2D(GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - output_tex->id().value(), - 0); + AttachTextureAsDestination(output_tex.get()); // Blit this texture through this shader functions_->glDrawArrays(GL_TRIANGLES, 0, blit_vertices.size() / 3); - - // Reset framebuffer to default - functions_->glBindFramebuffer(GL_FRAMEBUFFER, 0); } + // Reset framebuffer to default + DetachTextureAsDestination(); + // Release any textures we bound before for (int i=textures_to_bind.size()-1; i>=0; i--) { functions_->glActiveTexture(GL_TEXTURE0 + i); @@ -509,26 +553,58 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, const TimeR // Release shader shader->release(); + output_tex->set_has_meaningful_alpha((input_textures_have_alpha || job.GetAlphaChannelRequired())); + return output_tex; } +void OpenGLRenderer::SetViewport(int width, int height) +{ + functions_->glViewport(0, 0, width, height); +} + +void OpenGLRenderer::BlitColorManaged(ColorProcessorPtr color_processor, Texture *source, Renderer::Texture* destination) +{ + qCritical() << "OpenGLRenderer::BlitColorMangaed is a stub!"; +} + +void OpenGLRenderer::Blit(Renderer::Texture *source, QVariant shader, Renderer::ShaderUniformMap parameters, Renderer::Texture *destination) +{ + QOpenGLShaderProgram* program = Node::ValueToPtr(shader); + + if (!program) { + qCritical() << "Attempted to blit with a null shader"; + return; + } + + if (destination) { + AttachTextureAsDestination(destination); + } + + functions_->glBindTexture(GL_TEXTURE_2D, source->id().value()); + + program->bind(); + + qCritical() << "OpenGLRenderer::Blit is a stub!"; + + program->release(); + + functions_->glBindTexture(GL_TEXTURE_2D, 0); + + if (destination) { + DetachTextureAsDestination(); + } +} + GLint OpenGLRenderer::GetInternalFormat(PixelFormat::Format format) { switch (format) { - case PixelFormat::PIX_FMT_RGB8: - return GL_RGB8; case PixelFormat::PIX_FMT_RGBA8: return GL_RGBA8; - case PixelFormat::PIX_FMT_RGB16U: - return GL_RGB16; case PixelFormat::PIX_FMT_RGBA16U: return GL_RGBA16; - case PixelFormat::PIX_FMT_RGB16F: - return GL_RGB16F; case PixelFormat::PIX_FMT_RGBA16F: return GL_RGBA16F; - case PixelFormat::PIX_FMT_RGB32F: - return GL_RGB32F; case PixelFormat::PIX_FMT_RGBA32F: return GL_RGBA32F; @@ -540,28 +616,15 @@ GLint OpenGLRenderer::GetInternalFormat(PixelFormat::Format format) return GL_INVALID_VALUE; } -GLenum OpenGLRenderer::GetPixelFormat(PixelFormat::Format format) -{ - if (PixelFormat::FormatHasAlphaChannel(format)) { - return GL_RGBA; - } else { - return GL_RGB; - } -} - GLenum OpenGLRenderer::GetPixelType(PixelFormat::Format format) { switch (format) { - case PixelFormat::PIX_FMT_RGB8: case PixelFormat::PIX_FMT_RGBA8: return GL_UNSIGNED_BYTE; - case PixelFormat::PIX_FMT_RGB16U: case PixelFormat::PIX_FMT_RGBA16U: return GL_UNSIGNED_SHORT; - case PixelFormat::PIX_FMT_RGB16F: case PixelFormat::PIX_FMT_RGBA16F: return GL_HALF_FLOAT; - case PixelFormat::PIX_FMT_RGB32F: case PixelFormat::PIX_FMT_RGBA32F: return GL_FLOAT; diff --git a/app/render/backend/opengl/openglrenderer.h b/app/render/backend/opengl/openglrenderer.h index 00cf5275d..d0358a680 100644 --- a/app/render/backend/opengl/openglrenderer.h +++ b/app/render/backend/opengl/openglrenderer.h @@ -49,26 +49,37 @@ public slots: virtual void Destroy() override; - virtual QVariant CreateNativeTexture(const VideoParams& p, void* data = nullptr, int linesize = 0) override; + virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; + + virtual void AttachTextureAsDestination(OLIVE_NAMESPACE::Renderer::Texture* texture) override; + + virtual void DetachTextureAsDestination() override; + + virtual QVariant CreateNativeTexture(OLIVE_NAMESPACE::VideoParams param, void* data = nullptr, int linesize = 0) override; virtual void DestroyNativeTexture(QVariant texture) override; - virtual void UploadToTexture(Texture* texture, void* data, int linesize) override; + virtual QVariant CreateNativeShader(OLIVE_NAMESPACE::ShaderCode code) override; - virtual void DownloadFromTexture(Texture* texture, void* data, int linesize) override; + virtual void DestroyNativeShader(QVariant shader) override; + + virtual void UploadToTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; + + virtual void DownloadFromTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; virtual TexturePtr ProcessShader(const OLIVE_NAMESPACE::Node* node, - const OLIVE_NAMESPACE::TimeRange &range, - const OLIVE_NAMESPACE::ShaderJob &job, - const OLIVE_NAMESPACE::VideoParams ¶ms) override; + OLIVE_NAMESPACE::ShaderJob job, + OLIVE_NAMESPACE::VideoParams params) override; - virtual TexturePtr TransformColor(Texture* texture, OLIVE_NAMESPACE::ColorProcessorPtr processor) override; + virtual void SetViewport(int width, int height) override; + + virtual void BlitColorManaged(OLIVE_NAMESPACE::ColorProcessorPtr color_processor, OLIVE_NAMESPACE::Renderer::Texture* source, OLIVE_NAMESPACE::Renderer::Texture *destination = nullptr) override; + + virtual void Blit(OLIVE_NAMESPACE::Renderer::Texture* source, QVariant shader, OLIVE_NAMESPACE::Renderer::ShaderUniformMap parameters, OLIVE_NAMESPACE::Renderer::Texture* destination = nullptr) override; private: static GLint GetInternalFormat(PixelFormat::Format format); - static GLenum GetPixelFormat(PixelFormat::Format format); - static GLenum GetPixelType(PixelFormat::Format format); void PrepareInputTexture(bool bilinear); @@ -93,6 +104,4 @@ private: OLIVE_NAMESPACE_EXIT -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::OpenGLRenderer::TexturePtr); - #endif // OPENGLCONTEXT_H diff --git a/app/render/backend/renderer.h b/app/render/backend/renderer.h index e30bb0c9d..0d8088af8 100644 --- a/app/render/backend/renderer.h +++ b/app/render/backend/renderer.h @@ -38,8 +38,6 @@ class Renderer : public QObject public: Renderer(QObject* parent = nullptr); - virtual ~Renderer() override; - virtual bool Init() = 0; class Texture @@ -48,7 +46,8 @@ public: Texture(Renderer* renderer, const QVariant& native, const VideoParams& param) : renderer_(renderer), params_(param), - id_(native) + id_(native), + meaningful_alpha_(true) { } @@ -67,7 +66,7 @@ public: return params_; } - void Upload(void* data, int linesize = 0) + void Upload(void* data, int linesize) { renderer_->UploadToTexture(this, data, linesize); } @@ -97,6 +96,16 @@ public: return params_.pixel_aspect_ratio(); } + bool has_meaningful_alpha() const + { + return meaningful_alpha_; + } + + void set_has_meaningful_alpha(bool e) + { + meaningful_alpha_ = e; + } + private: Renderer* renderer_; @@ -104,39 +113,53 @@ public: QVariant id_; + bool meaningful_alpha_; + }; using TexturePtr = std::shared_ptr; TexturePtr CreateTexture(const VideoParams& param, void* data = nullptr, int linesize = 0); + struct ShaderValue { + QVariant data; + NodeParam::DataType type; + }; + + using ShaderUniformMap = QHash; + public slots: virtual void PostInit() = 0; virtual void Destroy() = 0; - virtual QVariant CreateNativeTexture(const VideoParams& param, void* data = nullptr, int linesize = 0) = 0; + virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) = 0; + + virtual void AttachTextureAsDestination(OLIVE_NAMESPACE::Renderer::Texture* texture) = 0; + + virtual void DetachTextureAsDestination() = 0; + + virtual QVariant CreateNativeTexture(OLIVE_NAMESPACE::VideoParams param, void* data = nullptr, int linesize = 0) = 0; virtual void DestroyNativeTexture(QVariant texture) = 0; - virtual QVariant CreateNativeShader(const ShaderCode& code) = 0; + virtual QVariant CreateNativeShader(OLIVE_NAMESPACE::ShaderCode code) = 0; virtual void DestroyNativeShader(QVariant shader) = 0; - virtual void UploadToTexture(Texture* texture, void* data, int linesize) = 0; + virtual void UploadToTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) = 0; - virtual void DownloadFromTexture(Texture* texture, void* data, int linesize) = 0; + virtual void DownloadFromTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) = 0; virtual TexturePtr ProcessShader(const OLIVE_NAMESPACE::Node* node, - const OLIVE_NAMESPACE::TimeRange &range, - const OLIVE_NAMESPACE::ShaderJob &job, - const OLIVE_NAMESPACE::VideoParams ¶ms) = 0; + OLIVE_NAMESPACE::ShaderJob job, + OLIVE_NAMESPACE::VideoParams params) = 0; - virtual TexturePtr TransformColor(Texture* texture, OLIVE_NAMESPACE::ColorProcessorPtr processor) = 0; + virtual void SetViewport(int width, int height) = 0; - virtual void Render() = 0; + virtual void BlitColorManaged(OLIVE_NAMESPACE::ColorProcessorPtr color_processor, OLIVE_NAMESPACE::Renderer::Texture* source, OLIVE_NAMESPACE::Renderer::Texture *destination = nullptr) = 0; - virtual void RenderToTexture(Texture* destination) = 0; + virtual void Blit(OLIVE_NAMESPACE::Renderer::Texture* source, QVariant shader, OLIVE_NAMESPACE::Renderer::ShaderUniformMap parameters, OLIVE_NAMESPACE::Renderer::Texture* destination = nullptr) = 0; private: @@ -145,4 +168,6 @@ private: OLIVE_NAMESPACE_EXIT +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::Renderer::TexturePtr); + #endif // RENDERCONTEXT_H diff --git a/app/render/backend/rendererthreadwrapper.cpp b/app/render/backend/rendererthreadwrapper.cpp index d344b16c5..eed470ec7 100644 --- a/app/render/backend/rendererthreadwrapper.cpp +++ b/app/render/backend/rendererthreadwrapper.cpp @@ -22,12 +22,11 @@ OLIVE_NAMESPACE_ENTER -/*RendererThreadWrapper::RendererThreadWrapper(Renderer *inner, QObject *parent) : +RendererThreadWrapper::RendererThreadWrapper(Renderer *inner, QObject *parent) : Renderer(parent), inner_(inner), thread_(nullptr) { - inner_->setParent(this); } bool RendererThreadWrapper::Init() @@ -38,11 +37,11 @@ bool RendererThreadWrapper::Init() } // Create thread - QThread* thread = new QThread(this); - thread->start(QThread::IdlePriority); + thread_ = new QThread(this); + thread_->start(QThread::IdlePriority); // Move context to thread - inner_->moveToThread(thread); + inner_->moveToThread(thread_); // Queue post-init in new thread QMetaObject::invokeMethod(inner_, "PostInit", Qt::BlockingQueuedConnection); @@ -50,10 +49,16 @@ bool RendererThreadWrapper::Init() return true; } +void RendererThreadWrapper::PostInit() +{ + // Do nothing +} + void RendererThreadWrapper::Destroy() { if (thread_) { QMetaObject::invokeMethod(inner_, "Destroy", Qt::BlockingQueuedConnection); + inner_ = nullptr; thread_->quit(); thread_->wait(); @@ -62,76 +67,113 @@ void RendererThreadWrapper::Destroy() } } -QVariant RendererThreadWrapper::CreateTexture(const VideoParams ¶m, void *data, int linesize) +void RendererThreadWrapper::ClearDestination(double r, double g, double b, double a) +{ + QMetaObject::invokeMethod(inner_, "ClearDestination", Qt::BlockingQueuedConnection, + Q_ARG(double, r), + Q_ARG(double, g), + Q_ARG(double, b), + Q_ARG(double, a)); +} + +void RendererThreadWrapper::AttachTextureAsDestination(Renderer::Texture *texture) +{ + QMetaObject::invokeMethod(inner_, "AttachTextureAsDestination", Qt::BlockingQueuedConnection, + OLIVE_NS_ARG(Renderer::Texture*, texture)); +} + +void RendererThreadWrapper::DetachTextureAsDestination() +{ + QMetaObject::invokeMethod(inner_, "DetachTextureAsDestination", Qt::BlockingQueuedConnection); +} + +QVariant RendererThreadWrapper::CreateNativeTexture(VideoParams param, void *data, int linesize) { QVariant v; - QMetaObject::invokeMethod(inner_, "CreateTexture", Qt::BlockingQueuedConnection, + QMetaObject::invokeMethod(inner_, "CreateNativeTexture", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, v), - OLIVE_NS_CONST_ARG(VideoParams&, param), + OLIVE_NS_ARG(VideoParams, param), Q_ARG(void*, data), Q_ARG(int, linesize)); return v; } -void RendererThreadWrapper::DestroyTexture(QVariant texture) +void RendererThreadWrapper::DestroyNativeTexture(QVariant texture) { - QMetaObject::invokeMethod(inner_, "DestroyTexture", Qt::BlockingQueuedConnection, + QMetaObject::invokeMethod(inner_, "DestroyNativeTexture", Qt::BlockingQueuedConnection, Q_ARG(QVariant, texture)); } -void RendererThreadWrapper::UploadToTexture(QVariant texture, void *data, int linesize) +QVariant RendererThreadWrapper::CreateNativeShader(ShaderCode code) +{ + QVariant v; + + QMetaObject::invokeMethod(inner_, "CreateNativeShader", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QVariant, v), + OLIVE_NS_ARG(ShaderCode, code)); + + return v; +} + +void RendererThreadWrapper::DestroyNativeShader(QVariant shader) +{ + QMetaObject::invokeMethod(inner_, "DestroyNativeShader", Qt::BlockingQueuedConnection, + Q_ARG(QVariant, shader)); +} + +void RendererThreadWrapper::UploadToTexture(Renderer::Texture *texture, void *data, int linesize) { QMetaObject::invokeMethod(inner_, "UploadToTexture", Qt::BlockingQueuedConnection, - Q_ARG(QVariant, texture), + OLIVE_NS_ARG(Renderer::Texture*, texture), Q_ARG(void*, data), Q_ARG(int, linesize)); } -void RendererThreadWrapper::DownloadFromTexture(QVariant texture, void *data, int linesize) +void RendererThreadWrapper::DownloadFromTexture(Renderer::Texture *texture, void *data, int linesize) { QMetaObject::invokeMethod(inner_, "DownloadFromTexture", Qt::BlockingQueuedConnection, - Q_ARG(QVariant, texture), + OLIVE_NS_ARG(Renderer::Texture*, texture), Q_ARG(void*, data), Q_ARG(int, linesize)); } -QVariant RendererThreadWrapper::ProcessShader(const Node *node, const TimeRange &range, const ShaderJob &job, const VideoParams ¶ms) +Renderer::TexturePtr RendererThreadWrapper::ProcessShader(const Node *node, ShaderJob job, VideoParams params) { - QVariant v; + Renderer::TexturePtr tex; - QMetaObject::invokeMethod(inner_, "ProcessShader", Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QVariant, v), + QMetaObject::invokeMethod(inner_, "Blit", Qt::BlockingQueuedConnection, + OLIVE_NS_RETURN_ARG(Renderer::TexturePtr, tex), OLIVE_NS_CONST_ARG(Node*, node), - OLIVE_NS_CONST_ARG(TimeRange&, range), - OLIVE_NS_CONST_ARG(ShaderJob&, job), - OLIVE_NS_CONST_ARG(VideoParams&, params)); + OLIVE_NS_ARG(ShaderJob, job), + OLIVE_NS_ARG(VideoParams, params)); - return v; + return tex; } -QVariant RendererThreadWrapper::TransformColor(QVariant texture, ColorProcessorPtr processor) +void RendererThreadWrapper::SetViewport(int width, int height) { - QVariant v; - - QMetaObject::invokeMethod(inner_, "ProcessShader", Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QVariant, v), - Q_ARG(QVariant, texture), - OLIVE_NS_ARG(ColorProcessorPtr, processor)); - - return v; + QMetaObject::invokeMethod(inner_, "SetViewport", Qt::BlockingQueuedConnection, + Q_ARG(int, width), + Q_ARG(int, height)); } -VideoParams RendererThreadWrapper::GetParamsFromTexture(QVariant texture) +void RendererThreadWrapper::BlitColorManaged(ColorProcessorPtr color_processor, Renderer::Texture *source, Renderer::Texture *destination) { - VideoParams p; + QMetaObject::invokeMethod(inner_, "BlitColorManaged", Qt::BlockingQueuedConnection, + OLIVE_NS_ARG(ColorProcessorPtr, color_processor), + OLIVE_NS_ARG(Renderer::Texture*, source), + OLIVE_NS_ARG(Renderer::Texture*, destination)); +} - QMetaObject::invokeMethod(inner_, "GetParamsFromTexture", Qt::BlockingQueuedConnection, - Q_RETURN_ARG(VideoParams, p), - Q_ARG(QVariant, texture)); - - return p; -}*/ +void RendererThreadWrapper::Blit(Renderer::Texture *source, QVariant shader, Renderer::ShaderUniformMap parameters, Renderer::Texture *destination) +{ + QMetaObject::invokeMethod(inner_, "Blit", Qt::BlockingQueuedConnection, + OLIVE_NS_ARG(Renderer::Texture*, source), + Q_ARG(QVariant, shader), + Q_ARG(Renderer::ShaderUniformMap, parameters), + OLIVE_NS_ARG(Renderer::Texture*, destination)); +} OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/rendererthreadwrapper.h b/app/render/backend/rendererthreadwrapper.h index 5a0e8d5cb..d8bd05bb0 100644 --- a/app/render/backend/rendererthreadwrapper.h +++ b/app/render/backend/rendererthreadwrapper.h @@ -27,7 +27,7 @@ OLIVE_NAMESPACE_ENTER -/*class RendererThreadWrapper : public Renderer +class RendererThreadWrapper : public Renderer { public: RendererThreadWrapper(Renderer* inner, QObject* parent = nullptr); @@ -35,39 +35,50 @@ public: virtual ~RendererThreadWrapper() override { Destroy(); + delete inner_; } virtual bool Init() override; public slots: - virtual void PostInit() override{} + virtual void PostInit() override; virtual void Destroy() override; - virtual QVariant CreateTexture(const VideoParams& param, void* data, int linesize) override; + virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; - virtual void DestroyTexture(QVariant texture) override; + virtual void AttachTextureAsDestination(OLIVE_NAMESPACE::Renderer::Texture* texture) override; - virtual void UploadToTexture(QVariant texture, void* data, int linesize) override; + virtual void DetachTextureAsDestination() override; - virtual void DownloadFromTexture(QVariant texture, void* data, int linesize) override; + virtual QVariant CreateNativeTexture(OLIVE_NAMESPACE::VideoParams param, void* data = nullptr, int linesize = 0) override; - virtual QVariant ProcessShader(const OLIVE_NAMESPACE::Node* node, - const OLIVE_NAMESPACE::TimeRange &range, - const OLIVE_NAMESPACE::ShaderJob &job, - const OLIVE_NAMESPACE::VideoParams ¶ms) override; + virtual void DestroyNativeTexture(QVariant texture) override; - virtual QVariant TransformColor(QVariant texture, - OLIVE_NAMESPACE::ColorProcessorPtr processor) override; + virtual QVariant CreateNativeShader(OLIVE_NAMESPACE::ShaderCode code) override; - //virtual VideoParams GetParamsFromTexture(QVariant texture) override; + virtual void DestroyNativeShader(QVariant shader) override; + + virtual void UploadToTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; + + virtual void DownloadFromTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; + + virtual TexturePtr ProcessShader(const OLIVE_NAMESPACE::Node* node, + OLIVE_NAMESPACE::ShaderJob job, + OLIVE_NAMESPACE::VideoParams params) override; + + virtual void SetViewport(int width, int height) override; + + virtual void BlitColorManaged(OLIVE_NAMESPACE::ColorProcessorPtr color_processor, OLIVE_NAMESPACE::Renderer::Texture* source, OLIVE_NAMESPACE::Renderer::Texture *destination = nullptr) override; + + virtual void Blit(OLIVE_NAMESPACE::Renderer::Texture* source, QVariant shader, OLIVE_NAMESPACE::Renderer::ShaderUniformMap parameters, OLIVE_NAMESPACE::Renderer::Texture* destination = nullptr) override; private: Renderer* inner_; QThread* thread_; -};*/ +}; OLIVE_NAMESPACE_EXIT diff --git a/app/render/color.cpp b/app/render/color.cpp index e8e4cbfca..3c47f7e81 100644 --- a/app/render/color.cpp +++ b/app/render/color.cpp @@ -196,11 +196,11 @@ float Color::lightness() const void Color::toData(char *data, const PixelFormat::Format &format) const { - OIIO::convert_types(PixelFormat::GetOIIOTypeDesc(PixelFormat::PIX_FMT_RGB32F), + OIIO::convert_types(OIIO::TypeDesc::FLOAT, data_, PixelFormat::GetOIIOTypeDesc(format), data, - PixelFormat::FormatHasAlphaChannel(format) ? kRGBAChannels : kRGBChannels); + kRGBAChannels); } Color Color::fromData(const char *data, const PixelFormat::Format &format) @@ -209,13 +209,9 @@ Color Color::fromData(const char *data, const PixelFormat::Format &format) OIIO::convert_types(PixelFormat::GetOIIOTypeDesc(format), data, - PixelFormat::GetOIIOTypeDesc(PixelFormat::PIX_FMT_RGB32F), + OIIO::TypeDesc::FLOAT, c.data_, - PixelFormat::FormatHasAlphaChannel(format) ? kRGBAChannels : kRGBChannels); - - if (!PixelFormat::FormatHasAlphaChannel(format)) { - c.set_alpha(1.0f); - } + kRGBAChannels); return c; } diff --git a/app/render/colormanager.cpp b/app/render/colormanager.cpp index 2e4f496dd..b6fb12e1c 100644 --- a/app/render/colormanager.cpp +++ b/app/render/colormanager.cpp @@ -332,11 +332,6 @@ void ColorManager::SetOCIOMethodForMode(RenderMode::Mode mode, ColorManager::OCI void ColorManager::AssociateAlphaPixFmtFilter(ColorManager::AlphaAction action, FramePtr f) { - if (!PixelFormat::FormatHasAlphaChannel(f->format())) { - // This frame has no alpha channel, do nothing - return; - } - int pixel_count = f->width() * f->height() * kRGBAChannels; switch (static_cast(f->format())) { @@ -344,19 +339,15 @@ void ColorManager::AssociateAlphaPixFmtFilter(ColorManager::AlphaAction action, case PixelFormat::PIX_FMT_COUNT: qWarning() << "Alpha association functions received an invalid pixel format"; break; - case PixelFormat::PIX_FMT_RGB8: case PixelFormat::PIX_FMT_RGBA8: - case PixelFormat::PIX_FMT_RGB16U: case PixelFormat::PIX_FMT_RGBA16U: qWarning() << "Alpha association functions only works on float-based pixel formats at this time"; break; - case PixelFormat::PIX_FMT_RGB16F: case PixelFormat::PIX_FMT_RGBA16F: { AssociateAlphaInternal(action, reinterpret_cast(f->data()), pixel_count); break; } - case PixelFormat::PIX_FMT_RGB32F: case PixelFormat::PIX_FMT_RGBA32F: { AssociateAlphaInternal(action, reinterpret_cast(f->data()), pixel_count); diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index 4b98a5133..cee97fb43 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -61,7 +61,7 @@ void ColorProcessor::ConvertFrame(Frame *f) OCIO::PackedImageDesc img(reinterpret_cast(f->data()), f->width(), f->height(), - PixelFormat::ChannelCount(f->format()), + kRGBAChannels, OCIO::AutoStride, OCIO::AutoStride, f->linesize_bytes()); diff --git a/app/render/decodercache.h b/app/render/decodercache.h index 6e0890f43..e43023274 100644 --- a/app/render/decodercache.h +++ b/app/render/decodercache.h @@ -26,7 +26,18 @@ OLIVE_NAMESPACE_ENTER -using DecoderCache = QHash; +class DecoderCache : public QHash +{ +public: + QMutex *mutex() + { + return &mutex_; + } + +private: + QMutex mutex_; + +}; OLIVE_NAMESPACE_EXIT diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index 37a656acf..d555d2a38 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -245,17 +245,9 @@ FramePtr FrameHashCache::LoadCacheFrame(const QString &fn) PixelFormat::Format image_format; if (pix_type == Imf::HALF) { - if (has_alpha) { - image_format = PixelFormat::PIX_FMT_RGBA16F; - } else { - image_format = PixelFormat::PIX_FMT_RGB16F; - } + image_format = PixelFormat::PIX_FMT_RGBA16F; } else { - if (has_alpha) { - image_format = PixelFormat::PIX_FMT_RGBA32F; - } else { - image_format = PixelFormat::PIX_FMT_RGB32F; - } + image_format = PixelFormat::PIX_FMT_RGBA32F; } frame = Frame::Create(); @@ -268,7 +260,7 @@ FramePtr FrameHashCache::LoadCacheFrame(const QString &fn) int bpc = PixelFormat::BytesPerChannel(image_format); - size_t xs = PixelFormat::ChannelCount(image_format) * bpc; + size_t xs = kRGBAChannels * bpc; size_t ys = frame->linesize_bytes(); Imf::FrameBuffer framebuffer; @@ -411,8 +403,7 @@ bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const V // Floating point types are stored in EXR Imf::PixelType pix_type; - if (vparam.format() == PixelFormat::PIX_FMT_RGB16F - || vparam.format() == PixelFormat::PIX_FMT_RGBA16F) { + if (vparam.format() == PixelFormat::PIX_FMT_RGBA16F) { pix_type = Imf::HALF; } else { pix_type = Imf::FLOAT; @@ -423,9 +414,7 @@ bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const V header.channels().insert("R", Imf::Channel(pix_type)); header.channels().insert("G", Imf::Channel(pix_type)); header.channels().insert("B", Imf::Channel(pix_type)); - if (PixelFormat::FormatHasAlphaChannel(vparam.format())) { - header.channels().insert("A", Imf::Channel(pix_type)); - } + header.channels().insert("A", Imf::Channel(pix_type)); header.compression() = Imf::DWAA_COMPRESSION; header.insert("dwaCompressionLevel", Imf::FloatAttribute(200.0f)); @@ -435,16 +424,14 @@ bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const V int bpc = PixelFormat::BytesPerChannel(vparam.format()); - size_t xs = PixelFormat::ChannelCount(vparam.format()) * bpc; + size_t xs = kRGBAChannels * bpc; size_t ys = linesize_bytes; Imf::FrameBuffer framebuffer; framebuffer.insert("R", Imf::Slice(pix_type, data, xs, ys)); framebuffer.insert("G", Imf::Slice(pix_type, data + bpc, xs, ys)); framebuffer.insert("B", Imf::Slice(pix_type, data + 2*bpc, xs, ys)); - if (PixelFormat::FormatHasAlphaChannel(vparam.format())) { - framebuffer.insert("A", Imf::Slice(pix_type, data + 3*bpc, xs, ys)); - } + framebuffer.insert("A", Imf::Slice(pix_type, data + 3*bpc, xs, ys)); out.setFrameBuffer(framebuffer); out.writePixels(vparam.effective_height()); diff --git a/app/render/pixelformat.cpp b/app/render/pixelformat.cpp index 01abf0aff..9cde0a269 100644 --- a/app/render/pixelformat.cpp +++ b/app/render/pixelformat.cpp @@ -25,44 +25,20 @@ #include #include -#include "codec/oiio/oiiodecoder.h" +#include "codec/oiio/oiiocommon.h" #include "common/define.h" #include "core.h" OLIVE_NAMESPACE_ENTER -bool PixelFormat::FormatHasAlphaChannel(const PixelFormat::Format &format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGBA8: - case PixelFormat::PIX_FMT_RGBA16U: - case PixelFormat::PIX_FMT_RGBA16F: - case PixelFormat::PIX_FMT_RGBA32F: - return true; - case PixelFormat::PIX_FMT_RGB8: - case PixelFormat::PIX_FMT_RGB16U: - case PixelFormat::PIX_FMT_RGB16F: - case PixelFormat::PIX_FMT_RGB32F: - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return false; -} - bool PixelFormat::FormatIsFloat(const PixelFormat::Format &format) { switch (format) { - case PixelFormat::PIX_FMT_RGB16F: case PixelFormat::PIX_FMT_RGBA16F: - case PixelFormat::PIX_FMT_RGB32F: case PixelFormat::PIX_FMT_RGBA32F: return true; - case PixelFormat::PIX_FMT_RGB8: case PixelFormat::PIX_FMT_RGBA8: - case PixelFormat::PIX_FMT_RGB16U: case PixelFormat::PIX_FMT_RGBA16U: case PixelFormat::PIX_FMT_INVALID: case PixelFormat::PIX_FMT_COUNT: @@ -75,16 +51,12 @@ bool PixelFormat::FormatIsFloat(const PixelFormat::Format &format) OIIO::TypeDesc::BASETYPE PixelFormat::GetOIIOTypeDesc(const PixelFormat::Format &format) { switch (format) { - case PixelFormat::PIX_FMT_RGB8: case PixelFormat::PIX_FMT_RGBA8: return OIIO::TypeDesc::UINT8; - case PixelFormat::PIX_FMT_RGB16U: case PixelFormat::PIX_FMT_RGBA16U: return OIIO::TypeDesc::UINT16; - case PixelFormat::PIX_FMT_RGB16F: case PixelFormat::PIX_FMT_RGBA16F: return OIIO::TypeDesc::HALF; - case PixelFormat::PIX_FMT_RGB32F: case PixelFormat::PIX_FMT_RGBA32F: return OIIO::TypeDesc::FLOAT; case PixelFormat::PIX_FMT_INVALID: @@ -98,16 +70,12 @@ OIIO::TypeDesc::BASETYPE PixelFormat::GetOIIOTypeDesc(const PixelFormat::Format QString PixelFormat::GetName(const PixelFormat::Format &format) { switch (format) { - case PixelFormat::PIX_FMT_RGB8: case PixelFormat::PIX_FMT_RGBA8: return tr("8-bit"); - case PixelFormat::PIX_FMT_RGB16U: case PixelFormat::PIX_FMT_RGBA16U: return tr("16-bit Integer"); - case PixelFormat::PIX_FMT_RGB16F: case PixelFormat::PIX_FMT_RGBA16F: return tr("Half-Float (16-bit)"); - case PixelFormat::PIX_FMT_RGB32F: case PixelFormat::PIX_FMT_RGBA32F: return tr("Full-Float (32-bit)"); case PixelFormat::PIX_FMT_INVALID: @@ -149,67 +117,21 @@ void PixelFormat::SetConfiguredFormatForMode(RenderMode::Mode mode, PixelFormat: } } -PixelFormat::Format PixelFormat::OIIOFormatToOliveFormat(OIIO::TypeDesc desc, bool has_alpha) +PixelFormat::Format PixelFormat::OIIOFormatToOliveFormat(OIIO::TypeDesc desc) { if (desc == OIIO::TypeDesc::UINT8) { - return has_alpha ? PixelFormat::PIX_FMT_RGBA8 : PixelFormat::PIX_FMT_RGB8; + return PixelFormat::PIX_FMT_RGBA8; } else if (desc == OIIO::TypeDesc::UINT16) { - return has_alpha ? PixelFormat::PIX_FMT_RGBA16U : PixelFormat::PIX_FMT_RGB16U; + return PixelFormat::PIX_FMT_RGBA16U; } else if (desc == OIIO::TypeDesc::HALF) { - return has_alpha ? PixelFormat::PIX_FMT_RGBA16F : PixelFormat::PIX_FMT_RGB16F; + return PixelFormat::PIX_FMT_RGBA16F; } else if (desc == OIIO::TypeDesc::FLOAT) { - return has_alpha ? PixelFormat::PIX_FMT_RGBA32F : PixelFormat::PIX_FMT_RGB32F; + return PixelFormat::PIX_FMT_RGBA32F; } return PixelFormat::PIX_FMT_INVALID; } -PixelFormat::Format PixelFormat::GetFormatWithAlphaChannel(PixelFormat::Format f) -{ - switch (f) { - case PIX_FMT_INVALID: - case PIX_FMT_COUNT: - break; - case PIX_FMT_RGB8: - case PIX_FMT_RGBA8: - return PIX_FMT_RGBA8; - case PIX_FMT_RGB16U: - case PIX_FMT_RGBA16U: - return PIX_FMT_RGBA16U; - case PIX_FMT_RGB16F: - case PIX_FMT_RGBA16F: - return PIX_FMT_RGBA16F; - case PIX_FMT_RGB32F: - case PIX_FMT_RGBA32F: - return PIX_FMT_RGBA32F; - } - - return PIX_FMT_INVALID; -} - -PixelFormat::Format PixelFormat::GetFormatWithoutAlphaChannel(PixelFormat::Format f) -{ - switch (f) { - case PIX_FMT_INVALID: - case PIX_FMT_COUNT: - break; - case PIX_FMT_RGB8: - case PIX_FMT_RGBA8: - return PIX_FMT_RGB8; - case PIX_FMT_RGB16U: - case PIX_FMT_RGBA16U: - return PIX_FMT_RGB16U; - case PIX_FMT_RGB16F: - case PIX_FMT_RGBA16F: - return PIX_FMT_RGB16F; - case PIX_FMT_RGB32F: - case PIX_FMT_RGBA32F: - return PIX_FMT_RGB32F; - } - - return PIX_FMT_INVALID; -} - int PixelFormat::GetBufferSize(const PixelFormat::Format &format, const int &width, const int &height) { return BytesPerPixel(format) * width * height; @@ -217,21 +139,17 @@ int PixelFormat::GetBufferSize(const PixelFormat::Format &format, const int &wid int PixelFormat::BytesPerPixel(const PixelFormat::Format &format) { - return BytesPerChannel(format) * ChannelCount(format); + return BytesPerChannel(format) * kRGBAChannels; } int PixelFormat::BytesPerChannel(const PixelFormat::Format &format) { switch (format) { - case PixelFormat::PIX_FMT_RGB8: case PixelFormat::PIX_FMT_RGBA8: return 1; - case PixelFormat::PIX_FMT_RGB16U: - case PixelFormat::PIX_FMT_RGB16F: case PixelFormat::PIX_FMT_RGBA16U: case PixelFormat::PIX_FMT_RGBA16F: return 2; - case PixelFormat::PIX_FMT_RGB32F: case PixelFormat::PIX_FMT_RGBA32F: return 4; case PixelFormat::PIX_FMT_INVALID: @@ -245,15 +163,6 @@ int PixelFormat::BytesPerChannel(const PixelFormat::Format &format) return 0; } -int PixelFormat::ChannelCount(const PixelFormat::Format &format) -{ - if (PixelFormat::FormatHasAlphaChannel(format)) { - return kRGBAChannels; - } else { - return kRGBChannels; - } -} - FramePtr PixelFormat::ConvertPixelFormat(FramePtr frame, const PixelFormat::Format &dest_format) { if (frame->format() == dest_format) { @@ -271,23 +180,23 @@ FramePtr PixelFormat::ConvertPixelFormat(FramePtr frame, const PixelFormat::Form // Do the conversion through OIIO - create a buffer for the source image OIIO::ImageBuf src(OIIO::ImageSpec(frame->width(), frame->height(), - ChannelCount(frame->format()), + kRGBAChannels, GetOIIOTypeDesc(frame->format()))); // Set the pixels (this is necessary as opposed to an OIIO buffer wrapper since Frame has // linesizes) - OIIODecoder::FrameToBuffer(frame, &src); + OIIOCommon::FrameToBuffer(frame, &src); // Create a destination OIIO buffer with our destination format OIIO::ImageBuf dst(OIIO::ImageSpec(converted->width(), converted->height(), - ChannelCount(converted->format()), + kRGBAChannels, GetOIIOTypeDesc(converted->format()))); if (dst.copy_pixels(src)) { // Convert our buffer back to a frame - OIIODecoder::BufferToFrame(&dst, converted); + OIIOCommon::BufferToFrame(&dst, converted); return converted; } else { diff --git a/app/render/pixelformat.h b/app/render/pixelformat.h index cb7c53fae..4808aa35a 100644 --- a/app/render/pixelformat.h +++ b/app/render/pixelformat.h @@ -48,11 +48,6 @@ public: PIX_FMT_RGBA16F, PIX_FMT_RGBA32F, - PIX_FMT_RGB8, - PIX_FMT_RGB16U, - PIX_FMT_RGB16F, - PIX_FMT_RGB32F, - PIX_FMT_COUNT }; @@ -66,10 +61,7 @@ public: Format GetConfiguredFormatForMode(RenderMode::Mode mode); void SetConfiguredFormatForMode(RenderMode::Mode mode, PixelFormat::Format format); - static Format OIIOFormatToOliveFormat(OIIO::TypeDesc desc, bool has_alpha); - - static Format GetFormatWithAlphaChannel(Format f); - static Format GetFormatWithoutAlphaChannel(Format f); + static Format OIIOFormatToOliveFormat(OIIO::TypeDesc desc); /** * @brief Returns the minimum buffer size (in bytes) necessary for a given format, width, and height. @@ -102,11 +94,6 @@ public: */ static int BytesPerChannel(const Format& format); - /** - * @brief Return the number of channels in this format - */ - static int ChannelCount(const Format& format); - /** * @brief Convert a frame to a pixel format * @@ -114,11 +101,6 @@ public: */ static FramePtr ConvertPixelFormat(FramePtr frame, const Format &dest_format); - /** - * @brief Simple convenience function returning whether a pixel format has an alpha channel or not - */ - static bool FormatHasAlphaChannel(const Format& format); - /** * @brief Simple convenience function returning whether a pixel format is float-based or integer-based */ diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index b0945e611..e8e4d72eb 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -3,6 +3,8 @@ #include #include +#include "project/item/sequence/sequence.h" +#include "project/project.h" #include "render/rendermanager.h" #include "render/renderprocessor.h" @@ -13,6 +15,7 @@ PreviewAutoCacher::PreviewAutoCacher() : paused_(false), has_changed_(false), use_custom_range_(false), + single_frame_render_(nullptr), last_update_time_(0), ignore_next_mouse_button_(false), video_params_changed_(false), @@ -24,13 +27,20 @@ PreviewAutoCacher::PreviewAutoCacher() : RenderTicketPtr PreviewAutoCacher::GetSingleFrame(const rational &t) { - RenderTicketPtr ticket = std::make_shared(); + if (single_frame_render_) { + single_frame_render_->Cancel(); + } - ticket->setProperty("time", QVariant::fromValue(t)); + single_frame_render_ = std::make_shared(); + + single_frame_render_->setProperty("time", QVariant::fromValue(t)); + + // Copy because TryRender() might set this to null and we still want to return a handle to this + RenderTicketPtr copy = single_frame_render_; TryRender(); - return ticket; + return copy; } void PreviewAutoCacher::SetPaused(bool paused) @@ -299,6 +309,14 @@ void PreviewAutoCacher::AudioParamsChanged() TryRender(); } +void PreviewAutoCacher::SingleFrameFinished() +{ + RenderTicketWatcher* watcher = static_cast(sender()); + RenderTicketPtr passthrough = watcher->property("passthrough").value(); + passthrough->Finish(watcher->GetTicket()->Get(), watcher->GetTicket()->WasCancelled()); + delete watcher; +} + //#define PRINT_UPDATE_QUEUE_INFO void PreviewAutoCacher::ProcessUpdateQueue() { @@ -554,23 +572,21 @@ void PreviewAutoCacher::TryRender() invalidated_audio_.clear(); } - if (!single_frame_renders_.isEmpty()) { - foreach (RenderTicketPtr ticket, single_frame_renders_) { - RenderTicketWatcher* watcher = new RenderTicketWatcher(); + if (single_frame_render_) { + RenderTicketWatcher* watcher = new RenderTicketWatcher(); - watcher->setProperty("passthrough", QVariant::fromValue(ticket)); + watcher->setProperty("passthrough", QVariant::fromValue(single_frame_render_)); - connect(watcher, &RenderTicketWatcher::Finished, watcher, [watcher]{ - RenderTicketPtr passthrough = watcher->property("passthrough").value(); - passthrough->Finish(watcher->GetTicket()->Get(), watcher->GetTicket()->WasCancelled()); - watcher->deleteLater(); - }); + connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::SingleFrameFinished); - watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, - ticket->property("time").value(), - RenderMode::kOffline, true)); - } - single_frame_renders_.clear(); + single_frame_render_->Start(); + + watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, + static_cast(viewer_node_->parent())->project()->color_manager(), + single_frame_render_->property("time").value(), + RenderMode::kOffline, true)); + + single_frame_render_ = nullptr; } } @@ -607,7 +623,9 @@ void PreviewAutoCacher::RequeueFrames() watcher->setProperty("hash", hash); connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::VideoRendered); video_tasks_.insert(watcher, hash); - watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, t, RenderMode::kOffline, false)); + watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, + static_cast(viewer_node_->parent())->project()->color_manager(), + t, RenderMode::kOffline, false)); } } diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index 0190a4e00..c6b993b5d 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -131,7 +131,7 @@ private: TimeRangeList invalidated_video_; TimeRangeList invalidated_audio_; - QVector single_frame_renders_; + RenderTicketPtr single_frame_render_; QList*> hash_tasks_; QMap audio_tasks_; @@ -192,6 +192,8 @@ private slots: void AudioParamsChanged(); + void SingleFrameFinished(); + }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 99f7f47be..cacf1ed90 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -39,10 +39,36 @@ OLIVE_NAMESPACE_ENTER RenderManager* RenderManager::instance_ = nullptr; RenderManager::RenderManager(QObject *parent) : - ThreadPool(QThread::IdlePriority, 0, parent) + ThreadPool(QThread::IdlePriority, 0, parent), + backend_(kOpenGL) { - context_ = new RendererThreadWrapper(new OpenGLRenderer(), this); - context_->Init(); + Renderer* graphics_renderer = nullptr; + + if (backend_ == kOpenGL) { + graphics_renderer = new OpenGLRenderer(); + } + + if (graphics_renderer) { + context_ = new RendererThreadWrapper(graphics_renderer, this); + context_->Init(); + context_->PostInit(); + + still_cache_ = new StillImageCache(); + decoder_cache_ = new DecoderCache(); + } else { + qCritical() << "Tried to initialize unknown graphics backend"; + still_cache_ = nullptr; + decoder_cache_ = nullptr; + } +} + +RenderManager::~RenderManager() +{ + delete decoder_cache_; + delete still_cache_; + + context_->Destroy(); + delete context_; } QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const rational &time) @@ -50,9 +76,13 @@ QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const r QCryptographicHash hasher(QCryptographicHash::Sha1); // Embed video parameters into this hash - hasher.addData(reinterpret_cast(¶ms.effective_width()), sizeof(int)); - hasher.addData(reinterpret_cast(¶ms.effective_height()), sizeof(int)); - hasher.addData(reinterpret_cast(¶ms.format()), sizeof(PixelFormat::Format)); + int width = params.effective_width(); + int height = params.effective_height(); + PixelFormat::Format format = params.format(); + + hasher.addData(reinterpret_cast(&width), sizeof(int)); + hasher.addData(reinterpret_cast(&height), sizeof(int)); + hasher.addData(reinterpret_cast(&format), sizeof(PixelFormat::Format)); if (n) { n->Hash(hasher, time); @@ -61,15 +91,18 @@ QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const r return hasher.result(); } -RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, const rational &time, RenderMode::Mode mode, bool prioritize) +RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager *color_manager, const rational &time, RenderMode::Mode mode, bool prioritize) { - return RenderFrame(viewer, time, mode, - QSize(), + return RenderFrame(viewer, + color_manager, + time, + mode, + QSize(0, 0), QMatrix4x4(), prioritize); } -RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, const rational &time, RenderMode::Mode mode, const QSize &force_size, const QMatrix4x4 &matrix, bool prioritize) +RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational &time, RenderMode::Mode mode, const QSize &force_size, const QMatrix4x4 &matrix, bool prioritize) { // Create ticket RenderTicketPtr ticket = std::make_shared(); @@ -81,6 +114,7 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, const rational ticket->setProperty("mode", mode); ticket->setProperty("type", kTypeVideo); ticket->setProperty("cache", viewer->video_frame_cache()->GetCacheDirectory()); + ticket->setProperty("colormanager", Node::PtrToValue(color_manager)); // Queue appending the ticket and running the next job on our thread to make this function thread-safe QMetaObject::invokeMethod(this, "AddTicket", Qt::AutoConnection, @@ -128,7 +162,7 @@ RenderTicketPtr RenderManager::SaveFrameToCache(FrameHashCache *cache, FramePtr void RenderManager::RunTicket(RenderTicketPtr ticket) const { - RenderProcessor::Process(ticket, context_); + RenderProcessor::Process(ticket, context_, still_cache_, decoder_cache_); } OLIVE_NAMESPACE_EXIT diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index f00b6d2b0..b04935b40 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -31,6 +31,7 @@ #include "node/output/viewer/viewer.h" #include "node/traverser.h" #include "render/backend/renderer.h" +#include "stillimagecache.h" #include "threading/threadpool.h" OLIVE_NAMESPACE_ENTER @@ -79,8 +80,8 @@ public: * * This function is thread-safe. */ - RenderTicketPtr RenderFrame(ViewerOutput* viewer, const rational& time, RenderMode::Mode mode, bool prioritize = false); - RenderTicketPtr RenderFrame(ViewerOutput* viewer, const rational& time, RenderMode::Mode mode, const QSize& force_size, const QMatrix4x4& matrix, bool prioritize = false); + RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, bool prioritize = false); + RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, const QSize& force_size, const QMatrix4x4& matrix, bool prioritize = false); /** * @brief Asynchronously generate a chunk of audio @@ -104,15 +105,28 @@ public: kTypeVideoDownload }; + Backend backend() const + { + return backend_; + } + signals: private: RenderManager(QObject* parent = nullptr); + virtual ~RenderManager() override; + static RenderManager* instance_; Renderer* context_; + Backend backend_; + + StillImageCache* still_cache_; + + DecoderCache* decoder_cache_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 8c194b358..1f4c61837 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -24,13 +24,16 @@ #include #include +#include "project/project.h" #include "rendermanager.h" OLIVE_NAMESPACE_ENTER -RenderProcessor::RenderProcessor(RenderTicketPtr ticket, Renderer *render_ctx) : +RenderProcessor::RenderProcessor(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache) : ticket_(ticket), - render_ctx_(render_ctx) + render_ctx_(render_ctx), + still_image_cache_(still_image_cache), + decoder_cache_(decoder_cache) { } @@ -52,21 +55,17 @@ void RenderProcessor::Run() Renderer::TexturePtr texture = table.Get(NodeParam::kTexture).value(); + VideoParams frame_params = viewer->video_params(); + QSize frame_size = ticket_->property("size").value(); - if (frame_size.isNull()) { - frame_size = QSize(viewer->video_params().effective_width(), - viewer->video_params().effective_height()); + if (!frame_size.isNull()) { + frame_params.set_width(frame_size.width()); + frame_params.set_height(frame_size.height()); } FramePtr frame = Frame::Create(); frame->set_timestamp(time); - frame->set_video_params(VideoParams(frame_size.width(), - frame_size.height(), - viewer->video_params().time_base(), - viewer->video_params().format(), - viewer->video_params().pixel_aspect_ratio(), - viewer->video_params().interlacing(), - viewer->video_params().divider())); + frame->set_video_params(frame_params); frame->allocate(); if (!texture) { @@ -109,13 +108,38 @@ void RenderProcessor::Run() // Fail ticket_->Cancel(); } - - this->deleteLater(); } -void RenderProcessor::Process(RenderTicketPtr ticket, Renderer *render_ctx) +DecoderPtr RenderProcessor::ResolveDecoderFromInput(StreamPtr stream) { - RenderProcessor p(ticket, render_ctx); + if (!stream) { + qWarning() << "Attempted to resolve the decoder of a null stream"; + return nullptr; + } + + QMutexLocker locker(decoder_cache_->mutex()); + + DecoderPtr decoder = decoder_cache_->value(stream.get()); + + if (!decoder) { + // No decoder + decoder = Decoder::CreateFromID(stream->footage()->decoder()); + + if (decoder->Open(stream)) { + decoder_cache_->insert(stream.get(), decoder); + } else { + qWarning() << "Failed to open decoder for" << stream->footage()->filename() + << "::" << stream->index(); + return nullptr; + } + } + + return decoder; +} + +void RenderProcessor::Process(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache *still_image_cache, DecoderCache *decoder_cache) +{ + RenderProcessor p(ticket, render_ctx, still_image_cache, decoder_cache); p.Run(); } @@ -259,11 +283,24 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & if (frame) { // Return a texture from the derived class - Renderer::TexturePtr unmanaged_texture = render_ctx_->CreateTexture(frame->video_params(), frame->data(), frame->linesize_pixels()); + Renderer::TexturePtr unmanaged_texture = render_ctx_->CreateTexture(frame->video_params(), + frame->data(), + frame->linesize_pixels()); - Renderer::TexturePtr managed_texture = render_ctx_->TransformColor(unmanaged_texture, ) + // We convert to our rendering pixel format, since that will always be float-based which + // is necessary for correct color conversion + VideoParams managed_params = frame->video_params(); + managed_params.set_format(video_params.format()); + value = render_ctx_->CreateTexture(managed_params); - value = FootageFrameToTexture(stream, frame); + // FIXME: Accessing video_stream->colorspace() + + ColorManager* color_manager = video_stream->footage()->project()->color_manager(); + ColorProcessorPtr processor = ColorProcessor::Create(color_manager, + video_stream->colorspace(), + ColorTransform(OCIO::ROLE_SCENE_LINEAR)); + + render_ctx_->BlitColorManaged(processor, unmanaged_texture.get(), value.get()); still_image_cache_->mutex()->lock(); @@ -290,38 +327,10 @@ QVariant RenderProcessor::ProcessAudioFootage(StreamPtr stream, const TimeRange if (decoder) { const AudioParams& audio_params = Node::ValueToPtr(ticket_->property("viewer"))->audio_params(); - // See if we have a conformed version of this audio - if (!decoder->HasConformedVersion(audio_params)) { + SampleBufferPtr frame = decoder->RetrieveAudio(input_time, audio_params, &IsCancelled()); - // If not, the audio needs to be conformed - // For online rendering/export, it's a waste of time to render the audio until we have - // all we need, so we try to handle the conform ourselves - AudioStreamPtr as = std::static_pointer_cast(stream); - - // Check if any other threads are conforming this audio - if (as->try_start_conforming(audio_params)) { - - // If not, conform it ourselves - decoder->ConformAudio(&IsCancelled(), audio_params); - - } else { - - // If another thread is conforming already, hackily try to wait until it's done. - do { - QThread::msleep(1000); - } while (!as->has_conformed_version(audio_params) && !IsCancelled()); - - } - - } - - if (decoder->HasConformedVersion(audio_params)) { - SampleBufferPtr frame = decoder->RetrieveAudio(input_time.in(), input_time.length(), - audio_params); - - if (frame) { - value = QVariant::fromValue(frame); - } + if (frame) { + value = QVariant::fromValue(frame); } } @@ -330,9 +339,11 @@ QVariant RenderProcessor::ProcessAudioFootage(StreamPtr stream, const TimeRange QVariant RenderProcessor::ProcessShader(const Node *node, const TimeRange &range, const ShaderJob &job) { + Q_UNUSED(range) + const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); - render_ctx_->ProcessShader(node, range, job, video_params); + return QVariant::fromValue(render_ctx_->ProcessShader(node, job, video_params)); } QVariant RenderProcessor::ProcessSamples(const Node *node, const TimeRange &range, const SampleJob &job) @@ -384,49 +395,39 @@ QVariant RenderProcessor::ProcessFrameGeneration(const Node *node, const Generat const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); - PixelFormat::Format output_fmt; - if (job.GetAlphaChannelRequired()) { - output_fmt = PixelFormat::GetFormatWithAlphaChannel(video_params.format()); - } else { - output_fmt = PixelFormat::GetFormatWithoutAlphaChannel(video_params.format()); - } - - frame->set_video_params(VideoParams(video_params.width(), - video_params.height(), - video_params.time_base(), - output_fmt, - video_params.pixel_aspect_ratio(), - video_params.interlacing(), - video_params.divider())); + frame->set_video_params(video_params); frame->allocate(); node->GenerateFrame(frame, job); - Renderer::TexturePtr texture = render_ctx_->CreateTexture(frame->video_params(), frame->data(), frame->linesize_pixels()); + Renderer::TexturePtr texture = render_ctx_->CreateTexture(frame->video_params(), + frame->data(), + frame->linesize_pixels()); + + texture->set_has_meaningful_alpha(job.GetAlphaChannelRequired()); return QVariant::fromValue(texture); } QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) { - if (ticket_->property("mode").value() == RenderMode::kOffline - && !cache_path_.isEmpty() + if (ticket_->property("mode").toInt() == RenderMode::kOffline && node->id() == QStringLiteral("org.olivevideoeditor.Olive.videoinput")) { const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); QByteArray hash = RenderManager::Hash(node, video_params, time); - FramePtr f = FrameHashCache::LoadCacheFrame(cache_path_, hash); + FramePtr f = FrameHashCache::LoadCacheFrame(ticket_->property("cache").toString(), hash); if (f) { // The cached frame won't load with the correct divider by default, so we enforce it here - f->set_video_params(VideoParams(f->width() * video_params.divider(), - f->height() * video_params.divider(), - f->video_params().time_base(), - f->video_params().format(), - f->video_params().pixel_aspect_ratio(), - f->video_params().interlacing(), - video_params.divider())); + VideoParams p = f->video_params(); + + p.set_width(f->width() * video_params.divider()); + p.set_height(f->height() * video_params.divider()); + p.set_divider(video_params.divider()); + + f->set_video_params(p); Renderer::TexturePtr texture = render_ctx_->CreateTexture(f->video_params(), f->data(), f->linesize_pixels()); return QVariant::fromValue(texture); diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index bf6942770..2b85315bd 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -21,6 +21,7 @@ #ifndef RENDERPROCESSOR_H #define RENDERPROCESSOR_H +#include "decodercache.h" #include "node/traverser.h" #include "render/backend/renderer.h" #include "stillimagecache.h" @@ -28,11 +29,10 @@ OLIVE_NAMESPACE_ENTER -class RenderProcessor : public QObject, public NodeTraverser +class RenderProcessor : public NodeTraverser { - Q_OBJECT public: - static void Process(RenderTicketPtr ticket, Renderer* render_ctx); + static void Process(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache); struct RenderedWaveform { const TrackOutput* track; @@ -40,11 +40,6 @@ public: TimeRange range; }; -signals: - void GeneratedFrame(FramePtr frame); - - void GeneratedAudio(SampleBufferPtr audio); - protected: virtual NodeValueTable GenerateBlockTable(const TrackOutput *track, const TimeRange &range) override; @@ -61,16 +56,20 @@ protected: virtual QVariant GetCachedFrame(const Node *node, const rational &time) override; private: - RenderProcessor(RenderTicketPtr ticket, Renderer* render_ctx); + RenderProcessor(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache); void Run(); + DecoderPtr ResolveDecoderFromInput(StreamPtr stream); + RenderTicketPtr ticket_; Renderer* render_ctx_; StillImageCache* still_image_cache_; + DecoderCache* decoder_cache_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/videoparams.h b/app/render/videoparams.h index fa24e2027..dab019254 100644 --- a/app/render/videoparams.h +++ b/app/render/videoparams.h @@ -43,51 +43,90 @@ public: const PixelFormat::Format& format, const rational& pixel_aspect_ratio = 1, const Interlacing& interlacing = kInterlaceNone, const int& divider = 1); - const int& width() const + int width() const { return width_; } - const int& height() const + void set_width(int width) + { + width_ = width; + calculate_effective_size(); + } + + int height() const { return height_; } + void set_height(int height) + { + height_ = height; + calculate_effective_size(); + } + const rational& time_base() const { return time_base_; } - const int& divider() const + void set_time_base(const rational& r) + { + time_base_ = r; + } + + int divider() const { return divider_; } - const int& effective_width() const + void set_divider(int d) + { + divider_ = d; + calculate_effective_size(); + } + + int effective_width() const { return effective_width_; } - const int& effective_height() const + int effective_height() const { return effective_height_; } - const PixelFormat::Format& format() const + PixelFormat::Format format() const { return format_; } + void set_format(PixelFormat::Format f) + { + format_ = f; + } + const rational& pixel_aspect_ratio() const { return pixel_aspect_ratio_; } + void set_pixel_aspect_ratio(const rational& r) + { + pixel_aspect_ratio_ = r; + validate_pixel_aspect_ratio(); + } + Interlacing interlacing() const { return interlacing_; } + void set_interlacing(Interlacing i) + { + interlacing_ = i; + } + static int generate_auto_divider(qint64 width, qint64 height); bool is_valid() const; diff --git a/app/shaders/rgbhistogram.frag b/app/shaders/rgbhistogram.frag index 435949138..a593caaed 100644 --- a/app/shaders/rgbhistogram.frag +++ b/app/shaders/rgbhistogram.frag @@ -1,9 +1,7 @@ #version 150 uniform sampler2D ove_maintex; -uniform vec2 ove_resolution; -uniform vec2 ove_viewport; - +uniform vec2 viewport; uniform float histogram_scale; in vec2 ove_texcoord; @@ -11,7 +9,7 @@ in vec2 ove_texcoord; out vec4 fragColor; void main(void) { - float histogram_width = ceil(histogram_scale * ove_viewport.y); + float histogram_width = ceil(histogram_scale * viewport.y); float quantisation = 1.0 / (histogram_width - 1.0); vec3 cur_col = vec3(0.0); vec3 sum = vec3(0.0); diff --git a/app/shaders/rgbhistogram.vert b/app/shaders/rgbhistogram.vert index 92536144c..a8e53d253 100644 --- a/app/shaders/rgbhistogram.vert +++ b/app/shaders/rgbhistogram.vert @@ -1,7 +1,6 @@ #version 150 uniform float histogram_scale; -uniform vec2 ove_resolution; in vec4 a_position; in vec2 a_texcoord; @@ -26,4 +25,4 @@ void main() { gl_Position = transform * a_position; ove_texcoord = a_texcoord; -} \ No newline at end of file +} diff --git a/app/shaders/rgbhistogram_secondary.frag b/app/shaders/rgbhistogram_secondary.frag index 474db6b74..0bb8ac75a 100644 --- a/app/shaders/rgbhistogram_secondary.frag +++ b/app/shaders/rgbhistogram_secondary.frag @@ -1,8 +1,7 @@ #version 150 uniform sampler2D ove_maintex; -uniform vec2 ove_resolution; -uniform vec2 ove_viewport; +uniform vec2 viewport; uniform float histogram_scale; uniform float histogram_power; @@ -13,11 +12,11 @@ out vec4 fragColor; void main(void) { vec3 col = vec3(0.0); - float histogram_height = ceil(ove_viewport.y * histogram_scale); + float histogram_height = ceil(viewport.y * histogram_scale); vec3 histogram_ratio = vec3(0.0); vec3 sum = vec3(0.0); float ratio = 0.0; - vec3 total_pixels = vec3(ceil(ove_viewport.x * ove_resolution.y * + vec3 total_pixels = vec3(ceil(viewport.x * viewport.y * histogram_scale)); for (int i = 0; i < histogram_height; i++) { diff --git a/app/shaders/rgbwaveform.frag b/app/shaders/rgbwaveform.frag index e568b37cd..38b41a1f5 100644 --- a/app/shaders/rgbwaveform.frag +++ b/app/shaders/rgbwaveform.frag @@ -1,8 +1,8 @@ #version 150 uniform sampler2D ove_maintex; -uniform vec2 ove_resolution; -uniform vec2 ove_viewport; + +uniform vec2 viewport; uniform vec3 luma_coeffs; uniform float waveform_scale; @@ -12,7 +12,7 @@ in vec2 ove_texcoord; out vec4 fragColor; void main(void) { - float waveform_height = ceil(waveform_scale * ove_viewport.y); + float waveform_height = ceil(waveform_scale * viewport.y); float quantisation = 1.0 / (waveform_height - 1.0); float intensity = 0.10; vec4 col = vec4(0.0); diff --git a/app/task/conform/conform.cpp b/app/task/conform/conform.cpp index fa131be8c..4ddc322f7 100644 --- a/app/task/conform/conform.cpp +++ b/app/task/conform/conform.cpp @@ -33,7 +33,10 @@ ConformTask::ConformTask(AudioStreamPtr stream, const AudioParams& params) : bool ConformTask::Run() { - if (stream_->footage()->decoder().isEmpty()) { + // Conforming is done by the renderer now, but I would like to use something like this just to + // show progress + + /*if (stream_->footage()->decoder().isEmpty()) { SetError(tr("Failed to find decoder to conform audio stream")); return false; } else { @@ -49,7 +52,9 @@ bool ConformTask::Run() } else { return true; } - } + }*/ + + return true; } OLIVE_NAMESPACE_EXIT diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index 210d1cb23..a74445eab 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -115,17 +115,8 @@ bool ExportTask::Run() void FrameColorConvert(ColorProcessorPtr processor, FramePtr frame) { // OCIO conversion requires a frame in 32F format - if (frame->format() != PixelFormat::PIX_FMT_RGBA32F - && frame->format() != PixelFormat::PIX_FMT_RGB32F) { - PixelFormat::Format dst; - - if (PixelFormat::FormatHasAlphaChannel(frame->format())) { - dst = PixelFormat::PIX_FMT_RGBA32F; - } else { - dst = PixelFormat::PIX_FMT_RGB32F; - } - - frame = PixelFormat::ConvertPixelFormat(frame, dst); + if (frame->format() != PixelFormat::PIX_FMT_RGBA32F) { + frame = PixelFormat::ConvertPixelFormat(frame, PixelFormat::PIX_FMT_RGBA32F); } // Color conversion must be done with unassociated alpha, and the pipeline is always associated diff --git a/app/task/project/import/import.cpp b/app/task/project/import/import.cpp index 5a94e2d38..ab30be115 100644 --- a/app/task/project/import/import.cpp +++ b/app/task/project/import/import.cpp @@ -110,8 +110,8 @@ void ProjectImportTask::Import(Folder *folder, QFileInfoList import, int &counte } else { - FootagePtr item = Decoder::ProbeMedia(model_->project(), file_info.absoluteFilePath(), - &IsCancelled()); + FootagePtr item = Decoder::Probe(model_->project(), file_info.absoluteFilePath(), + &IsCancelled()); if (item) { // See if this footage is an image sequence diff --git a/app/threading/threadpool.cpp b/app/threading/threadpool.cpp index ccd139a3c..b89a00ee9 100644 --- a/app/threading/threadpool.cpp +++ b/app/threading/threadpool.cpp @@ -52,8 +52,6 @@ ThreadPool::~ThreadPool() thread->wait(); delete thread; } - - RunNext(); } void ThreadPool::AddTicket(RenderTicketPtr ticket, bool prioritize) diff --git a/app/threading/threadticket.cpp b/app/threading/threadticket.cpp index 30ae3b5e1..e87b1c57e 100644 --- a/app/threading/threadticket.cpp +++ b/app/threading/threadticket.cpp @@ -83,7 +83,12 @@ void RenderTicket::Finish(QVariant result, bool cancelled) { QMutexLocker locker(&lock_); - if (started_ && !finished_) { + if (!started_) { + qWarning() << "Tried to finish a ticket that hadn't started"; + } else if (finished_) { + // Do nothing + return; + } else { finished_ = true; cancelled_ = cancelled; diff --git a/app/threading/threadticketwatcher.cpp b/app/threading/threadticketwatcher.cpp index 13940668e..804aaef99 100644 --- a/app/threading/threadticketwatcher.cpp +++ b/app/threading/threadticketwatcher.cpp @@ -30,8 +30,15 @@ RenderTicketWatcher::RenderTicketWatcher(QObject *parent) : void RenderTicketWatcher::SetTicket(RenderTicketPtr ticket) { - // Ensure that a ticket has NOT already been set and that this ticket is NOT NULL - Q_ASSERT(!ticket_ && ticket); + if (ticket_) { + qCritical() << "Tried to set a ticket on a RenderTicketWatcher twice"; + return; + } + + if (!ticket) { + qCritical() << "Tried to set a null ticket on a RenderTicketWatcher"; + return; + } ticket_ = ticket; diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index 52ba3f356..27b4b3a9d 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -20,25 +20,59 @@ #include "manageddisplay.h" +#include #include #include "render/backend/opengl/openglrenderer.h" +#include "render/rendermanager.h" OLIVE_NAMESPACE_ENTER ManagedDisplayWidget::ManagedDisplayWidget(QWidget *parent) : - QOpenGLWidget(parent), + QWidget(parent), color_manager_(nullptr), color_service_(nullptr) { setContextMenuPolicy(Qt::CustomContextMenu); - attached_renderer_ = new OpenGLRenderer(); + QHBoxLayout* layout = new QHBoxLayout(this); + layout->setSpacing(0); + layout->setMargin(0); + + if (RenderManager::instance()->backend() == RenderManager::kOpenGL) { + // Create OpenGL widget + inner_widget_ = new ManagedDisplayWidgetOpenGL(); + connect(static_cast(inner_widget_), + &ManagedDisplayWidgetOpenGL::OnInit, + this, &ManagedDisplayWidget::OnInit, Qt::DirectConnection); + connect(static_cast(inner_widget_), + &ManagedDisplayWidgetOpenGL::OnDestroy, + this, &ManagedDisplayWidget::OnDestroy, Qt::DirectConnection); + connect(static_cast(inner_widget_), + &ManagedDisplayWidgetOpenGL::OnPaint, + this, &ManagedDisplayWidget::OnPaint, Qt::DirectConnection); + connect(static_cast(inner_widget_), + &ManagedDisplayWidgetOpenGL::frameSwapped, + this, &ManagedDisplayWidget::frameSwapped, Qt::DirectConnection); + + // Create OpenGL renderer + attached_renderer_ = new OpenGLRenderer(this); + } else { + inner_widget_ = nullptr; + } + + layout->addWidget(inner_widget_); } ManagedDisplayWidget::~ManagedDisplayWidget() { - ContextCleanup(); + OnDestroy(); + + if (RenderManager::instance()->backend() == RenderManager::kOpenGL) { + disconnect(static_cast(inner_widget_), + &ManagedDisplayWidgetOpenGL::OnDestroy, + this, &ManagedDisplayWidget::OnDestroy); + } } void ManagedDisplayWidget::ConnectColorManager(ColorManager *color_manager) @@ -111,17 +145,6 @@ ColorProcessorPtr ManagedDisplayWidget::color_service() return color_service_; } -void ManagedDisplayWidget::ContextCleanup() -{ - makeCurrent(); - - color_service_ = nullptr; - - attached_renderer_->Destroy(); - - doneCurrent(); -} - void ManagedDisplayWidget::ShowDefaultContextMenu() { Menu m(this); @@ -178,24 +201,27 @@ void ManagedDisplayWidget::MenuColorspaceSelect(QAction *action) SetColorTransform(color_manager()->GetCompliantColorSpace(ColorTransform(action->data().toString()))); } -void ManagedDisplayWidget::SetColorTransform(const ColorTransform &transform) +void ManagedDisplayWidget::OnDestroy() { - makeCurrent(); - - color_transform_ = transform; - SetupColorProcessor(); - ColorProcessorChangedEvent(); - - doneCurrent(); + attached_renderer_->Destroy(); } -void ManagedDisplayWidget::initializeGL() +void ManagedDisplayWidget::SetColorTransform(const ColorTransform &transform) { + color_transform_ = transform; + SetupColorProcessor(); - connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &ManagedDisplayWidget::ContextCleanup, Qt::DirectConnection); + ColorProcessorChangedEvent(); +} - static_cast(attached_renderer_)->Init(context()); +void ManagedDisplayWidget::OnInit() +{ + if (RenderManager::instance()->backend() == RenderManager::kOpenGL) { + QOpenGLContext* context = static_cast(inner_widget_)->context(); + static_cast(attached_renderer_)->Init(context); + static_cast(attached_renderer_)->PostInit(); + } } void ManagedDisplayWidget::EnableDefaultContextMenu() @@ -208,6 +234,20 @@ void ManagedDisplayWidget::ColorProcessorChangedEvent() update(); } +void ManagedDisplayWidget::makeCurrent() +{ + if (RenderManager::instance()->backend() == RenderManager::kOpenGL) { + static_cast(inner_widget_)->makeCurrent(); + } +} + +void ManagedDisplayWidget::doneCurrent() +{ + if (RenderManager::instance()->backend() == RenderManager::kOpenGL) { + static_cast(inner_widget_)->doneCurrent(); + } +} + Menu* ManagedDisplayWidget::GetDisplayMenu(QMenu* parent, bool auto_connect) { QStringList displays = color_manager()->ListAvailableDisplays(); @@ -277,35 +317,25 @@ Menu* ManagedDisplayWidget::GetLookMenu(QMenu* parent, bool auto_connect) void ManagedDisplayWidget::SetupColorProcessor() { - if (!context()) { - return; - } - color_service_ = nullptr; if (color_manager_) { // (Re)create color processor - try { - color_service_ = ColorProcessor::Create(color_manager_, color_manager_->GetReferenceColorSpace(), color_transform_); - } catch (OCIO::Exception& e) { - QMessageBox::critical(this, tr("OpenColorIO Error"), tr("Failed to set color configuration: %1").arg(e.what()), QMessageBox::Ok); - } - } else { color_service_ = nullptr; } - emit ColorProcessorChanged(std::static_pointer_cast(color_service_)); + emit ColorProcessorChanged(color_service_); } OLIVE_NAMESPACE_EXIT diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index ec524faeb..ae73dc30e 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -29,7 +29,49 @@ OLIVE_NAMESPACE_ENTER -class ManagedDisplayWidget : public QOpenGLWidget +class ManagedDisplayWidgetOpenGL : public QOpenGLWidget +{ + Q_OBJECT +public: + ManagedDisplayWidgetOpenGL(QWidget* parent = nullptr) : + QOpenGLWidget(parent) + { + } + +signals: + void OnInit(); + + void OnPaint(); + + void OnDestroy(); + +protected: + virtual void initializeGL() override + { + connect(context(), &QOpenGLContext::aboutToBeDestroyed, + this, &ManagedDisplayWidgetOpenGL::OnDestroy); + + emit OnInit(); + } + + virtual void paintGL() override + { + emit OnPaint(); + } + +private slots: + void DestroyListener() + { + makeCurrent(); + + emit OnDestroy(); + + doneCurrent(); + } + +}; + +class ManagedDisplayWidget : public QWidget { Q_OBJECT public: @@ -94,17 +136,14 @@ signals: */ void ColorManagerChanged(ColorManager* color_manager); + void frameSwapped(); + protected: /** * @brief Provides access to the color processor (nullptr if none is set) */ ColorProcessorPtr color_service(); - /** - * @brief Override when setting up OpenGL context - */ - virtual void initializeGL() override; - /** * @brief Enables a context menu that allows simple access to the DVL pipeline */ @@ -117,6 +156,31 @@ protected: */ virtual void ColorProcessorChangedEvent(); + Renderer* renderer() const + { + return attached_renderer_; + } + + void makeCurrent(); + + void doneCurrent(); + +protected slots: + /** + * @brief Called whenever the internal rendering context has been created + */ + virtual void OnInit(); + + /** + * @brief Called while the internal rendering context is being rendered + */ + virtual void OnPaint() = 0; + + /** + * @brief Called just before the internal rendering context is destroyed + */ + virtual void OnDestroy(); + private: /** * @brief Call this if this user has selected a different display/view/look to recreate the processor @@ -128,6 +192,11 @@ private: */ void ClearOCIOLutTexture(); + /** + * @brief Main drawing surface abstraction + */ + QWidget* inner_widget_; + /** * @brief Renderer abstraction */ @@ -154,11 +223,6 @@ private slots: */ void ColorConfigChanged(); - /** - * @brief Cleans up resources if context is about to be destroyed - */ - void ContextCleanup(); - /** * @brief The default context menu shown */ diff --git a/app/widget/nodetableview/nodetableview.cpp b/app/widget/nodetableview/nodetableview.cpp index 7696ace3b..722ff0a96 100644 --- a/app/widget/nodetableview/nodetableview.cpp +++ b/app/widget/nodetableview/nodetableview.cpp @@ -145,10 +145,7 @@ void NodeTableView::SetTime(const rational &time) case NodeParam::kTexture: { // NodeTableTraverser puts video params in here - VideoParams p = value.data().value(); - int channel_count = PixelFormat::ChannelCount(p.format()); - - for (int k=0;ksetItemWidget(sub_item, 2 + k, new QCheckBox()); } break; diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index b88c3996d..44f6a95e8 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -22,6 +22,7 @@ #include #include +#include #include "common/qtutils.h" #include "node/node.h" @@ -35,74 +36,33 @@ HistogramScope::HistogramScope(QWidget* parent) : HistogramScope::~HistogramScope() { - CleanUp(); - - if (context()) { - disconnect(context(), &QOpenGLContext::aboutToBeDestroyed, this, - &HistogramScope::CleanUp); - } + OnDestroy(); } -void HistogramScope::initializeGL() +void HistogramScope::OnInit() { - ScopeBase::initializeGL(); + ScopeBase::OnInit(); - pipeline_secondary_ = CreateSecondaryShader(); - - connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, - &HistogramScope::CleanUp, Qt::DirectConnection); + ShaderCode secondary_code(Node::ReadFileAsString(":/shaders/rgbhistogram_secondary.frag"), + Node::ReadFileAsString(":/shaders/rgbhistogram.vert")); + pipeline_secondary_ = renderer()->CreateNativeShader(secondary_code); } -void HistogramScope::AssertAdditionalTextures() +void HistogramScope::OnDestroy() { - if (!texture_row_sums_.IsCreated() - || texture_row_sums_.width() != width() - || texture_row_sums_.height() != height()) { - texture_row_sums_.Destroy(); - texture_row_sums_.Create(context(), VideoParams(width(), - height(), managed_tex().format())); - } + ScopeBase::OnDestroy(); + + pipeline_secondary_.clear(); + texture_row_sums_ = nullptr; } -void HistogramScope::CleanUp() +ShaderCode HistogramScope::GenerateShaderCode() { - makeCurrent(); - - pipeline_secondary_ = nullptr; - texture_row_sums_.Destroy(); - - doneCurrent(); + return ShaderCode(Node::ReadFileAsString(":/shaders/rgbhistogram.frag"), + Node::ReadFileAsString(":/shaders/default.vert")); } -QVariant HistogramScope::CreateShader() -{ - OpenGLShaderPtr pipeline = OpenGLShader::Create(); - - pipeline->create(); - pipeline->addShaderFromSourceCode(QOpenGLShader::Vertex, - OpenGLShader::CodeDefaultVertex()); - pipeline->addShaderFromSourceCode(QOpenGLShader::Fragment, - Node::ReadFileAsString(":/shaders/rgbhistogram.frag")); - pipeline->link(); - - return pipeline; -} - -OpenGLShaderPtr HistogramScope::CreateSecondaryShader() -{ - OpenGLShaderPtr shader = OpenGLShader::Create(); - - shader->create(); - shader->addShaderFromSourceCode(QOpenGLShader::Vertex, - Node::ReadFileAsString(":/shaders/rgbhistogram.vert")); - shader->addShaderFromSourceCode(QOpenGLShader::Fragment, - Node::ReadFileAsString(":/shaders/rgbhistogram_secondary.frag")); - shader->link(); - - return shader; -} - -void HistogramScope::DrawScope() +void HistogramScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) { float histogram_scale = 0.80f; // This value is eyeballed for usefulness. Until we have a geometry @@ -111,40 +71,21 @@ void HistogramScope::DrawScope() float histogram_base = 2.5f; float histogram_power = 1.0f / histogram_base; - pipeline()->bind(); - pipeline()->setUniformValue("ove_resolution", managed_tex().width(), - managed_tex().height()); - pipeline()->setUniformValue("ove_viewport", width(), height()); - pipeline()->setUniformValue("histogram_scale", histogram_scale); - pipeline()->release(); + Renderer::ShaderUniformMap value_map; - AssertAdditionalTextures(); + value_map.insert(QStringLiteral("viewport"), {QVector2D(width(), height()), NodeParam::kVec2}); + value_map.insert(QStringLiteral("histogram_scale"), {histogram_scale, NodeParam::kFloat}); + value_map.insert(QStringLiteral("histogram_power"), {histogram_power, NodeParam::kFloat}); - framebuffer().Attach(&texture_row_sums_, true); - framebuffer().Bind(); + if (!texture_row_sums_ + || texture_row_sums_->width() != this->width() + || texture_row_sums_->height() != this->height()) { + texture_row_sums_ = renderer()->CreateTexture(VideoParams(width(), height(), managed_tex->format())); + } - managed_tex().Bind(); + renderer()->Blit(managed_tex.get(), pipeline, value_map, texture_row_sums_.get()); - OpenGLRenderFunctions::Blit(pipeline()); - - managed_tex().Release(); - - framebuffer().Release(); - framebuffer().Detach(); - - pipeline_secondary_->bind(); - pipeline_secondary_->setUniformValue("ove_resolution", - texture_row_sums_.width(), texture_row_sums_.height()); - pipeline_secondary_->setUniformValue("ove_viewport", width(), height()); - pipeline_secondary_->setUniformValue("histogram_scale", histogram_scale); - pipeline_secondary_->setUniformValue("histogram_power", histogram_power); - pipeline_secondary_->release(); - - texture_row_sums_.Bind(); - - OpenGLRenderFunctions::Blit(pipeline_secondary_); - - texture_row_sums_.Release(); + renderer()->Blit(texture_row_sums_.get(), pipeline_secondary_, value_map); // Draw line overlays QPainter p(this); @@ -172,28 +113,28 @@ void HistogramScope::DrawScope() float histogram_dim_x = ceil((width() - 1.0) * histogram_scale); float histogram_dim_y = ceil((height() - 1.0) * histogram_scale); float histogram_start_dim_x = - ((width() - 1.0) - histogram_dim_x) / 2.0f; + ((width() - 1.0) - histogram_dim_x) / 2.0f; float histogram_start_dim_y = - ((height() - 1.0) - histogram_dim_y) / 2.0f; + ((height() - 1.0) - histogram_dim_y) / 2.0f; float histogram_end_dim_x = (width() - 1.0) - histogram_start_dim_x; // for (int i=0; i <= histogram_steps; i++) { for(std::vector::iterator it = histogram_increments.begin(); - it != histogram_increments.end(); it++) { + it != histogram_increments.end(); it++) { histogram_lines[it - histogram_increments.begin()].setLine( - histogram_start_dim_x, - (histogram_dim_y * pow(1.0 - *it, histogram_base)) + - histogram_start_dim_y, - histogram_end_dim_x, - (histogram_dim_y * pow(1.0 - *it, histogram_base)) + - histogram_start_dim_y); - label = QString::number( - *it * 100, 'f', 1) + "%"; - font_x_offset = QFontMetricsWidth(font_metrics, label) + 4; + histogram_start_dim_x, + (histogram_dim_y * pow(1.0 - *it, histogram_base)) + + histogram_start_dim_y, + histogram_end_dim_x, + (histogram_dim_y * pow(1.0 - *it, histogram_base)) + + histogram_start_dim_y); + label = QString::number( + *it * 100, 'f', 1) + "%"; + font_x_offset = QFontMetricsWidth(font_metrics, label) + 4; - p.drawText( - histogram_start_dim_x - font_x_offset, - (histogram_dim_y * pow(1.0 - *it, histogram_base)) + + p.drawText( + histogram_start_dim_x - font_x_offset, + (histogram_dim_y * pow(1.0 - *it, histogram_base)) + histogram_start_dim_y + font_y_offset, label); } p.drawLines(histogram_lines); diff --git a/app/widget/scope/histogram/histogram.h b/app/widget/scope/histogram/histogram.h index 8de6e4da4..d0ab83958 100644 --- a/app/widget/scope/histogram/histogram.h +++ b/app/widget/scope/histogram/histogram.h @@ -33,22 +33,21 @@ public: virtual ~HistogramScope() override; -protected: - virtual void initializeGL() override; +protected slots: + virtual void OnInit() override; - virtual QVariant CreateShader() override; + virtual void OnDestroy() override; + +protected: + virtual ShaderCode GenerateShaderCode() override; QVariant CreateSecondaryShader(); - void AssertAdditionalTextures(); - - virtual void DrawScope() override; + virtual void DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) override; private: QVariant pipeline_secondary_; - QVariant texture_row_sums_; + Renderer::TexturePtr texture_row_sums_; -private slots: - void CleanUp(); }; OLIVE_NAMESPACE_EXIT diff --git a/app/widget/scope/scopebase/scopebase.cpp b/app/widget/scope/scopebase/scopebase.cpp index 38aa84e13..60aff3da6 100644 --- a/app/widget/scope/scopebase/scopebase.cpp +++ b/app/widget/scope/scopebase/scopebase.cpp @@ -20,8 +20,6 @@ #include "scopebase.h" -#include "render/backend/opengl/openglrenderfunctions.h" - OLIVE_NAMESPACE_ENTER ScopeBase::ScopeBase(QWidget* parent) : @@ -33,11 +31,7 @@ ScopeBase::ScopeBase(QWidget* parent) : ScopeBase::~ScopeBase() { - CleanUp(); - - if (context()) { - disconnect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &ScopeBase::CleanUp); - } + OnDestroy(); } void ScopeBase::SetBuffer(Frame *frame) @@ -54,18 +48,9 @@ void ScopeBase::showEvent(QShowEvent* e) UploadTextureFromBuffer(); } -QVariant ScopeBase::CreateShader() +void ScopeBase::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) { - return OpenGLShader::CreateDefault(); -} - -void ScopeBase::DrawScope() -{ - managed_tex().Bind(); - - OpenGLRenderFunctions::Blit(pipeline()); - - managed_tex().Release(); + renderer()->Blit(managed_tex.get(), pipeline, Renderer::ShaderUniformMap()); } void ScopeBase::UploadTextureFromBuffer() @@ -77,17 +62,18 @@ void ScopeBase::UploadTextureFromBuffer() if (buffer_) { makeCurrent(); - if (!texture_.IsCreated() - || texture_.width() != buffer_->width() - || texture_.height() != buffer_->height() - || texture_.format() != buffer_->format()) { - texture_.Destroy(); - managed_tex_.Destroy(); + if (!texture_ + || texture_->width() != buffer_->width() + || texture_->height() != buffer_->height() + || texture_->format() != buffer_->format()) { + texture_ = nullptr; + managed_tex_ = nullptr; - texture_.Create(context(), buffer_); - managed_tex_.Create(context(), buffer_->video_params()); + texture_ = renderer()->CreateTexture(buffer_->video_params(), + buffer_->data(), buffer_->linesize_pixels()); + managed_tex_ = renderer()->CreateTexture(buffer_->video_params()); } else { - texture_.Upload(buffer_); + texture_->Upload(buffer_->data(), buffer_->linesize_pixels()); } doneCurrent(); @@ -96,58 +82,36 @@ void ScopeBase::UploadTextureFromBuffer() update(); } -void ScopeBase::CleanUp() +void ScopeBase::OnInit() { - makeCurrent(); - - pipeline_ = nullptr; - texture_.Destroy(); - managed_tex_.Destroy(); - framebuffer_.Destroy(); - - doneCurrent(); -} - -void ScopeBase::initializeGL() -{ - ManagedDisplayWidget::initializeGL(); - - pipeline_ = CreateShader(); - - framebuffer_.Create(context()); - - connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &ScopeBase::CleanUp, Qt::DirectConnection); + ManagedDisplayWidget::OnInit(); UploadTextureFromBuffer(); + + pipeline_ = renderer()->CreateNativeShader(GenerateShaderCode()); } -void ScopeBase::paintGL() +void ScopeBase::OnPaint() { - QOpenGLFunctions* f = context()->functions(); + // Clear display surface + renderer()->ClearDestination(); - f->glClearColor(0, 0, 0, 0); - f->glClear(GL_COLOR_BUFFER_BIT); - - if (buffer_ && pipeline() && texture_.IsCreated()) { + if (buffer_) { // Convert reference frame to display space - framebuffer_.Attach(&managed_tex_); - framebuffer_.Bind(); + renderer()->BlitColorManaged(color_service(), texture_.get(), managed_tex_.get()); - texture_.Bind(); - - f->glViewport(0, 0, texture_.width(), texture_.height()); - - color_service()->ProcessOpenGL(); - - texture_.Release(); - - framebuffer_.Release(); - framebuffer_.Detach(); - - f->glViewport(0, 0, width(), height()); - - DrawScope(); + renderer()->SetViewport(width(), height()); + DrawScope(managed_tex_, pipeline_); } } +void ScopeBase::OnDestroy() +{ + ManagedDisplayWidget::OnDestroy(); + + managed_tex_ = nullptr; + texture_ = nullptr; + pipeline_.clear(); +} + OLIVE_NAMESPACE_EXIT diff --git a/app/widget/scope/scopebase/scopebase.h b/app/widget/scope/scopebase/scopebase.h index dc48c20f3..8cde613f8 100644 --- a/app/widget/scope/scopebase/scopebase.h +++ b/app/widget/scope/scopebase/scopebase.h @@ -37,41 +37,36 @@ public: public slots: void SetBuffer(Frame* frame); +protected slots: + virtual void OnInit() override; + + virtual void OnPaint() override; + + virtual void OnDestroy() override; + protected: - virtual void initializeGL() override; - - virtual void paintGL() override; - virtual void showEvent(QShowEvent* e) override; - virtual QVariant CreateShader(); + virtual ShaderCode GenerateShaderCode() = 0; - virtual void DrawScope(); - - QVariant pipeline() - { - return pipeline_; - } - - QVariant managed_tex() - { - return managed_tex_; - } + /** + * @brief Draw function + * + * Override this if your sub-class scope needs extra drawing. + */ + virtual void DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline); private: void UploadTextureFromBuffer(); QVariant pipeline_; - QVariant texture_; + Renderer::TexturePtr texture_; - QVariant managed_tex_; + Renderer::TexturePtr managed_tex_; Frame* buffer_; -private slots: - void CleanUp(); - }; OLIVE_NAMESPACE_EXIT diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index 16e8b260b..f1da05fce 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -24,10 +24,11 @@ #include #include #include +#include +#include #include "common/qtutils.h" #include "node/node.h" -#include "render/backend/opengl/openglrenderfunctions.h" OLIVE_NAMESPACE_ENTER @@ -36,49 +37,46 @@ WaveformScope::WaveformScope(QWidget* parent) : { } -QVariant WaveformScope::CreateShader() +WaveformScope::~WaveformScope() { - OpenGLShaderPtr pipeline = OpenGLShader::Create(); - - pipeline->create(); - pipeline->addShaderFromSourceCode(QOpenGLShader::Vertex, - Node::ReadFileAsString(":/shaders/rgbwaveform.vert")); - pipeline->addShaderFromSourceCode(QOpenGLShader::Fragment, - Node::ReadFileAsString(":/shaders/rgbwaveform.frag")); - pipeline->link(); - - return pipeline; + OnDestroy(); } -void WaveformScope::DrawScope() +ShaderCode WaveformScope::GenerateShaderCode() +{ + return ShaderCode(Node::ReadFileAsString(":/shaders/rgbwaveform.frag"), + Node::ReadFileAsString(":/shaders/rgbwaveform.vert")); +} + +void WaveformScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) { float waveform_scale = 0.80f; // Draw waveform through shader - pipeline()->bind(); - pipeline()->setUniformValue("ove_resolution", managed_tex().width(), managed_tex().height()); - pipeline()->setUniformValue("ove_viewport", width(), height()); - GLfloat luma[3] = {0.0, 0.0, 0.0}; - color_manager()->GetDefaultLumaCoefs(luma); - pipeline()->setUniformValue("luma_coeffs", luma[0], luma[1], luma[2]); + Renderer::ShaderUniformMap value_map; + + // Set viewport size + value_map.insert(QStringLiteral("viewport"), + {QVector2D(width(), height()), NodeParam::kVec2}); + + // Set luma coefficients + float luma_coeffs[3] = {0.0f, 0.0f, 0.0f}; + color_manager()->GetDefaultLumaCoefs(luma_coeffs); + value_map.insert(QStringLiteral("luma_coeffs"), + {QVector3D(luma_coeffs[0], luma_coeffs[1], luma_coeffs[2]), NodeParam::kVec3}); + // Scale of the waveform relative to the viewport surface. - pipeline()->setUniformValue("waveform_scale", waveform_scale); + value_map.insert(QStringLiteral("waveform_scale"), {waveform_scale, NodeParam::kFloat}); - pipeline()->release(); - - managed_tex().Bind(); - - OpenGLRenderFunctions::Blit(pipeline()); - - managed_tex().Release(); + renderer()->Blit(managed_tex.get(), pipeline, value_map); float waveform_dim_x = ceil((width() - 1.0) * waveform_scale); float waveform_dim_y = ceil((height() - 1.0) * waveform_scale); float waveform_start_dim_x = - ((width() - 1.0) - waveform_dim_x) / 2.0f; + ((width() - 1.0) - waveform_dim_x) / 2.0f; float waveform_start_dim_y = - ((height() - 1.0) - waveform_dim_y) / 2.0f; + ((height() - 1.0) - waveform_dim_y) / 2.0f; float waveform_end_dim_x = (width() - 1.0) - waveform_start_dim_x; // Draw line overlays @@ -100,18 +98,19 @@ void WaveformScope::DrawScope() for (int i=0; i <= ire_steps; i++) { ire_lines[i].setLine( - waveform_start_dim_x, - (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y, - waveform_end_dim_x, - (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y); - label = QString::number(1.0 - (i * ire_increment), 'f', 1); - font_x_offset = QFontMetricsWidth(font_metrics, label) + 4; + waveform_start_dim_x, + (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y, + waveform_end_dim_x, + (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y); + label = QString::number(1.0 - (i * ire_increment), 'f', 1); + font_x_offset = QFontMetricsWidth(font_metrics, label) + 4; - p.drawText( - waveform_start_dim_x - font_x_offset, - (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y + font_y_offset, - label); + p.drawText( + waveform_start_dim_x - font_x_offset, + (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y + font_y_offset, + label); } + p.drawLines(ire_lines); } diff --git a/app/widget/scope/waveform/waveform.h b/app/widget/scope/waveform/waveform.h index 4aeebc105..2640f9cf3 100644 --- a/app/widget/scope/waveform/waveform.h +++ b/app/widget/scope/waveform/waveform.h @@ -31,10 +31,12 @@ class WaveformScope : public ScopeBase public: WaveformScope(QWidget* parent = nullptr); -protected: - virtual QVariant CreateShader() override; + virtual ~WaveformScope() override; - virtual void DrawScope() override; +protected: + virtual ShaderCode GenerateShaderCode() override; + + virtual void DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) override; }; diff --git a/app/widget/standardcombos/pixelformatcombobox.h b/app/widget/standardcombos/pixelformatcombobox.h index 48638a14b..88ad74f29 100644 --- a/app/widget/standardcombos/pixelformatcombobox.h +++ b/app/widget/standardcombos/pixelformatcombobox.h @@ -31,15 +31,14 @@ class PixelFormatComboBox : public QComboBox { Q_OBJECT public: - PixelFormatComboBox(bool alpha_only, bool float_only, QWidget* parent = nullptr) : + PixelFormatComboBox(bool float_only, QWidget* parent = nullptr) : QComboBox(parent) { // Set up preview formats for (int i=0;i(i); - if ((!alpha_only || PixelFormat::FormatHasAlphaChannel(pix_fmt)) - && (!float_only || PixelFormat::FormatIsFloat(pix_fmt))) { + if (!float_only || PixelFormat::FormatIsFloat(pix_fmt)) { this->addItem(PixelFormat::GetName(pix_fmt), pix_fmt); } } diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 983f422e1..f0dec4726 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -32,8 +32,6 @@ #include "common/define.h" #include "common/functiontimer.h" #include "gizmotraverser.h" -#include "render/backend/opengl/openglrenderfunctions.h" -#include "render/backend/opengl/openglshader.h" #include "render/pixelformat.h" #include "core.h" @@ -56,7 +54,7 @@ ViewerDisplayWidget::ViewerDisplayWidget(QWidget *parent) : ViewerDisplayWidget::~ViewerDisplayWidget() { - ContextCleanup(); + OnDestroy(); } void ViewerDisplayWidget::SetMatrixTranslate(const QMatrix4x4 &mat) @@ -104,13 +102,13 @@ void ViewerDisplayWidget::SetImage(FramePtr in_buffer) if (last_loaded_buffer_) { makeCurrent(); - if (!texture_.IsCreated() - || texture_.width() != in_buffer->width() - || texture_.height() != in_buffer->height() - || texture_.format() != in_buffer->format()) { - texture_.Create(context(), in_buffer->video_params(), in_buffer->data(), in_buffer->linesize_pixels()); + if (!texture_ + || texture_->width() != in_buffer->width() + || texture_->height() != in_buffer->height() + || texture_->format() != in_buffer->format()) { + texture_ = renderer()->CreateTexture(in_buffer->video_params(), in_buffer->data(), in_buffer->linesize_pixels()); } else { - texture_.Upload(in_buffer); + texture_->Upload(in_buffer->data(), in_buffer->linesize_bytes()); } doneCurrent(); @@ -205,7 +203,7 @@ void ViewerDisplayWidget::mousePressEvent(QMouseEvent *event) emit DragStarted(); } - QOpenGLWidget::mousePressEvent(event); + ManagedDisplayWidget::mousePressEvent(event); } } @@ -252,7 +250,7 @@ void ViewerDisplayWidget::mouseMoveEvent(QMouseEvent *event) } else { // Default behavior - QOpenGLWidget::mouseMoveEvent(event); + ManagedDisplayWidget::mouseMoveEvent(event); } } @@ -275,49 +273,33 @@ void ViewerDisplayWidget::mouseReleaseEvent(QMouseEvent *event) } else { // Default behavior - QOpenGLWidget::mouseReleaseEvent(event); + ManagedDisplayWidget::mouseReleaseEvent(event); } } -QMatrix4x4 ViewerDisplayWidget::GetMatrixTranslate() +void ViewerDisplayWidget::OnInit() { - return translate_matrix_; + ManagedDisplayWidget::OnInit(); } -void ViewerDisplayWidget::initializeGL() +void ViewerDisplayWidget::OnPaint() { - ManagedDisplayWidget::initializeGL(); - - connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &ViewerDisplayWidget::ContextCleanup, Qt::DirectConnection); -} - -void ViewerDisplayWidget::paintGL() -{ - // Get functions attached to this context (they will already be initialized) - QOpenGLFunctions* f = context()->functions(); - // Clear background to empty - f->glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - f->glClear(GL_COLOR_BUFFER_BIT); + renderer()->ClearDestination(); // We only draw if we have a pipeline if (last_loaded_buffer_ && color_service()) { + if (deinterlace_) { + qDebug() << "FIXME: Deinterlacing is currently broken, we're working on this..."; + //color_service()->pipeline()->setUniformValue("ove_resolution", texture_.width(), texture_.height()); + //color_service()->pipeline()->setUniformValue("ove_deinterlace", deinterlace_); + } + // Bind retrieved texture - f->glBindTexture(GL_TEXTURE_2D, texture_.texture()); - - // Set some parameters - color_service()->pipeline()->bind(); - color_service()->pipeline()->setUniformValue("ove_resolution", texture_.width(), texture_.height()); - color_service()->pipeline()->setUniformValue("ove_deinterlace", deinterlace_); - color_service()->pipeline()->release(); - - // Blit using the color service - color_service()->ProcessOpenGL(true, GetCompleteMatrixFlippedYTranslation()); - - // Release retrieved texture - f->glBindTexture(GL_TEXTURE_2D, 0); + renderer()->SetViewport(width(), height()); + renderer()->BlitColorManaged(color_service(), texture_.get()); } @@ -371,6 +353,18 @@ void ViewerDisplayWidget::paintGL() } } +void ViewerDisplayWidget::OnDestroy() +{ + ManagedDisplayWidget::OnDestroy(); + + texture_ = nullptr; +} + +QMatrix4x4 ViewerDisplayWidget::GetMatrixTranslate() +{ + return translate_matrix_; +} + QPointF ViewerDisplayWidget::GetTexturePosition(const QPoint &screen_pos) { return GetTexturePosition(screen_pos.x(), screen_pos.y()); @@ -426,13 +420,4 @@ QTransform ViewerDisplayWidget::GenerateWorldTransform() return world; } -void ViewerDisplayWidget::ContextCleanup() -{ - makeCurrent(); - - texture_.Destroy(); - - doneCurrent(); -} - OLIVE_NAMESPACE_EXIT diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 354d622cf..d61d16c20 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -178,19 +178,22 @@ protected: */ virtual void mouseReleaseEvent(QMouseEvent* event) override; +protected: /** * @brief Initialize function to set up the OpenGL context upon its construction * * Currently primarily used to regenerate the pipeline shader used for drawing. */ - virtual void initializeGL() override; + virtual void OnInit() override; /** * @brief Paint function to display the texture (received in SetTexture()) on screen. * * Simple OpenGL drawing function for painting the texture on screen. Standardized around OpenGL ES 3.2 Core. */ - virtual void paintGL() override; + virtual void OnPaint() override; + + virtual void OnDestroy() override; private: QPointF GetTexturePosition(const QPoint& screen_pos); @@ -208,7 +211,7 @@ private: /** * @brief Internal reference to the OpenGL texture to draw. Set in SetTexture() and used in paintGL(). */ - QVariant texture_; + Renderer::TexturePtr texture_; /** * @brief Translation only matrix (defaults to identity). @@ -247,12 +250,6 @@ private: bool deinterlace_; -private slots: - /** - * @brief Slot to connect just before the OpenGL context is destroyed to clean up resources - */ - void ContextCleanup(); - }; OLIVE_NAMESPACE_EXIT From 0429e70fe072d32465fc04f78fdd9bc8c119c922 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 10 Nov 2020 15:50:13 +1100 Subject: [PATCH 20/72] merged all drawing functions into a single shader processing function --- app/common/filefunctions.cpp | 12 ++ app/common/filefunctions.h | 2 + app/node/audio/pan/pan.cpp | 2 +- .../crossdissolve/crossdissolvetransition.cpp | 2 +- .../diptocolor/diptocolortransition.cpp | 2 +- app/node/block/transition/transition.cpp | 6 +- app/node/filter/blur/blur.cpp | 14 +- app/node/filter/stroke/stroke.cpp | 10 +- app/node/generator/polygon/polygon.cpp | 2 +- app/node/generator/solid/solid.cpp | 2 +- app/node/generator/text/text.cpp | 12 +- app/node/math/math/mathbase.cpp | 4 +- app/node/math/merge/merge.cpp | 12 +- app/node/node.cpp | 12 -- app/node/node.h | 2 - app/node/value.cpp | 60 ------ app/node/value.h | 80 +++++-- app/project/item/footage/videostream.cpp | 6 - app/project/item/footage/videostream.h | 2 - app/render/CMakeLists.txt | 3 +- app/render/backend/opengl/openglrenderer.cpp | 203 ++++++++---------- app/render/backend/opengl/openglrenderer.h | 24 +-- app/render/backend/renderer.cpp | 94 ++++++++ app/render/backend/renderer.h | 43 ++-- app/render/backend/rendererthreadwrapper.cpp | 45 +--- app/render/backend/rendererthreadwrapper.h | 18 +- app/render/colorprocessor.cpp | 11 + app/render/colorprocessor.h | 9 + app/render/colortransform.h | 1 - app/render/previewautocacher.cpp | 7 +- app/render/previewautocacher.h | 8 + app/render/{decodercache.h => rendercache.h} | 12 +- app/render/rendermanager.cpp | 4 +- app/render/rendermanager.h | 4 +- app/render/renderprocessor.cpp | 41 +++- app/render/renderprocessor.h | 8 +- app/render/shaderinfo.h | 57 +++-- app/render/shadervalue.h | 53 +++++ app/shaders/default.frag | 3 +- app/widget/manageddisplay/manageddisplay.cpp | 7 + app/widget/manageddisplay/manageddisplay.h | 5 + app/widget/scope/histogram/histogram.cpp | 24 ++- app/widget/scope/scopebase/scopebase.cpp | 9 +- app/widget/scope/waveform/waveform.cpp | 23 +- app/widget/viewer/viewer.cpp | 3 + app/widget/viewer/viewerdisplay.cpp | 5 +- 46 files changed, 570 insertions(+), 398 deletions(-) rename app/render/{decodercache.h => rendercache.h} (78%) create mode 100644 app/render/shadervalue.h diff --git a/app/common/filefunctions.cpp b/app/common/filefunctions.cpp index 23f3abf99..acb9ee8c3 100644 --- a/app/common/filefunctions.cpp +++ b/app/common/filefunctions.cpp @@ -187,4 +187,16 @@ QString FileFunctions::EnsureFilenameExtension(QString fn, const QString &extens return fn; } +QString FileFunctions::ReadFileAsString(const QString &filename) +{ + QFile f(filename); + QString file_data; + if (f.open(QFile::ReadOnly | QFile::Text)) { + QTextStream text_stream(&f); + file_data = text_stream.readAll(); + f.close(); + } + return file_data; +} + OLIVE_NAMESPACE_EXIT diff --git a/app/common/filefunctions.h b/app/common/filefunctions.h index 87bcc6375..1251dfad6 100644 --- a/app/common/filefunctions.h +++ b/app/common/filefunctions.h @@ -65,6 +65,8 @@ public: */ static QString EnsureFilenameExtension(QString fn, const QString& extension); + static QString ReadFileAsString(const QString& filename); + }; diff --git a/app/node/audio/pan/pan.cpp b/app/node/audio/pan/pan.cpp index dad795d02..d8b7f5183 100644 --- a/app/node/audio/pan/pan.cpp +++ b/app/node/audio/pan/pan.cpp @@ -69,7 +69,7 @@ NodeValueTable PanNode::Value(NodeValueDatabase &value) const NodeValueTable table = value.Merge(); if (job.HasSamples()) { - float pan_volume = job.GetValue(panning_input_).data().toFloat(); + float pan_volume = job.GetValue(panning_input_).data.toFloat(); if (panning_input_->is_static()) { if (!qIsNull(pan_volume) && job.samples()->audio_params().channel_count() == 2) { if (pan_volume > 0) { diff --git a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp index 2dfe7ace4..2073594b2 100644 --- a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp +++ b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp @@ -56,7 +56,7 @@ ShaderCode CrossDissolveTransition::GetShaderCode(const QString &shader_id) cons { Q_UNUSED(shader_id) - return ShaderCode(Node::ReadFileAsString(":/shaders/crossdissolve.frag"), QString()); + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/crossdissolve.frag"), QString()); } void CrossDissolveTransition::SampleJobEvent(SampleBufferPtr from_samples, SampleBufferPtr to_samples, SampleBufferPtr out_samples, double time_in) const diff --git a/app/node/block/transition/diptocolor/diptocolortransition.cpp b/app/node/block/transition/diptocolor/diptocolortransition.cpp index 816c75011..eda0b4ef2 100644 --- a/app/node/block/transition/diptocolor/diptocolortransition.cpp +++ b/app/node/block/transition/diptocolor/diptocolortransition.cpp @@ -57,7 +57,7 @@ ShaderCode DipToColorTransition::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) - return ShaderCode(Node::ReadFileAsString(":/shaders/diptoblack.frag"), QString()); + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/diptoblack.frag"), QString()); } void DipToColorTransition::ShaderJobEvent(NodeValueDatabase &value, ShaderJob &job) const diff --git a/app/node/block/transition/transition.cpp b/app/node/block/transition/transition.cpp index 3b339f536..5fc6a863a 100644 --- a/app/node/block/transition/transition.cpp +++ b/app/node/block/transition/transition.cpp @@ -161,15 +161,15 @@ void TransitionBlock::InsertTransitionTimes(AcceleratedJob *job, const double &t { // Provides total transition progress from 0.0 (start) - 1.0 (end) job->InsertValue(QStringLiteral("ove_tprog_all"), - NodeValue(NodeParam::kFloat, GetTotalProgress(time), this)); + ShaderValue(GetTotalProgress(time), NodeParam::kFloat)); // Provides progress of out section from 1.0 (start) - 0.0 (end) job->InsertValue(QStringLiteral("ove_tprog_out"), - NodeValue(NodeParam::kFloat, GetOutProgress(time), this)); + ShaderValue(GetOutProgress(time), NodeParam::kFloat)); // Provides progress of in section from 0.0 (start) - 1.0 (end) job->InsertValue(QStringLiteral("ove_tprog_in"), - NodeValue(NodeParam::kFloat, GetInProgress(time), this)); + ShaderValue(GetInProgress(time), NodeParam::kFloat)); } void TransitionBlock::BlockConnected(NodeEdgePtr edge) diff --git a/app/node/filter/blur/blur.cpp b/app/node/filter/blur/blur.cpp index 7950f77e9..e9e0005bf 100644 --- a/app/node/filter/blur/blur.cpp +++ b/app/node/filter/blur/blur.cpp @@ -83,7 +83,7 @@ void BlurFilterNode::Retranslate() ShaderCode BlurFilterNode::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) - return ShaderCode(ReadFileAsString(":/shaders/blur.frag"), QString()); + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/blur.frag"), QString()); } NodeValueTable BlurFilterNode::Value(NodeValueDatabase &value) const @@ -100,19 +100,19 @@ NodeValueTable BlurFilterNode::Value(NodeValueDatabase &value) const NodeValueTable table = value.Merge(); // If there's no texture, no need to run an operation - if (!job.GetValue(texture_input_).data().isNull()) { + if (!job.GetValue(texture_input_).data.isNull()) { // Check if radius > 0, and both "horiz" and/or "vert" are enabled - if ((job.GetValue(horiz_input_).data().toBool() || job.GetValue(vert_input_).data().toBool()) - && job.GetValue(radius_input_).data().toDouble() > 0.0) { + if ((job.GetValue(horiz_input_).data.toBool() || job.GetValue(vert_input_).data.toBool()) + && job.GetValue(radius_input_).data.toDouble() > 0.0) { // Set iteration count to 2 if we're blurring both horizontally and vertically - if (job.GetValue(horiz_input_).data().toBool() && job.GetValue(vert_input_).data().toBool()) { + if (job.GetValue(horiz_input_).data.toBool() && job.GetValue(vert_input_).data.toBool()) { job.SetIterations(2, texture_input_); } // If we're not repeating pixels, expect an alpha channel to appear - if (!job.GetValue(repeat_edge_pixels_input_).data().toBool()) { + if (!job.GetValue(repeat_edge_pixels_input_).data.toBool()) { job.SetAlphaChannelRequired(true); } @@ -120,7 +120,7 @@ NodeValueTable BlurFilterNode::Value(NodeValueDatabase &value) const } else { // If we're not performing the blur job, just push the texture - table.Push(job.GetValue(texture_input_)); + table.Push(job.GetValue(texture_input_), this); } } diff --git a/app/node/filter/stroke/stroke.cpp b/app/node/filter/stroke/stroke.cpp index d62c99b37..2cea51f75 100644 --- a/app/node/filter/stroke/stroke.cpp +++ b/app/node/filter/stroke/stroke.cpp @@ -94,12 +94,12 @@ NodeValueTable StrokeFilterNode::Value(NodeValueDatabase &value) const NodeValueTable table = value.Merge(); - if (!job.GetValue(tex_input_).data().isNull()) { - if (job.GetValue(radius_input_).data().toDouble() > 0.0 - && job.GetValue(opacity_input_).data().toDouble() > 0.0) { + if (!job.GetValue(tex_input_).data.isNull()) { + if (job.GetValue(radius_input_).data.toDouble() > 0.0 + && job.GetValue(opacity_input_).data.toDouble() > 0.0) { table.Push(NodeParam::kShaderJob, QVariant::fromValue(job), this); } else { - table.Push(job.GetValue(tex_input_)); + table.Push(job.GetValue(tex_input_), this); } } @@ -110,7 +110,7 @@ ShaderCode StrokeFilterNode::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) - return ShaderCode(ReadFileAsString(":/shaders/stroke.frag"), QString()); + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/stroke.frag"), QString()); } OLIVE_NAMESPACE_EXIT diff --git a/app/node/generator/polygon/polygon.cpp b/app/node/generator/polygon/polygon.cpp index 870488cc0..c11324bef 100644 --- a/app/node/generator/polygon/polygon.cpp +++ b/app/node/generator/polygon/polygon.cpp @@ -89,7 +89,7 @@ ShaderCode PolygonGenerator::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) - return ShaderCode(Node::ReadFileAsString(":/shaders/polygon.frag"), QString()); + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/polygon.frag"), QString()); } NodeValueTable PolygonGenerator::Value(NodeValueDatabase &value) const diff --git a/app/node/generator/solid/solid.cpp b/app/node/generator/solid/solid.cpp index abcf6491f..0fdafc143 100644 --- a/app/node/generator/solid/solid.cpp +++ b/app/node/generator/solid/solid.cpp @@ -77,7 +77,7 @@ ShaderCode SolidGenerator::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) - return ShaderCode(ReadFileAsString(":/shaders/solid.frag"), QString()); + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/solid.frag"), QString()); } OLIVE_NAMESPACE_EXIT diff --git a/app/node/generator/text/text.cpp b/app/node/generator/text/text.cpp index de38f08bd..1ff7c7a95 100644 --- a/app/node/generator/text/text.cpp +++ b/app/node/generator/text/text.cpp @@ -104,7 +104,7 @@ NodeValueTable TextGenerator::Value(NodeValueDatabase &value) const NodeValueTable table = value.Merge(); - if (!job.GetValue(text_input_).data().toString().isEmpty()) { + if (!job.GetValue(text_input_).data.toString().isEmpty()) { table.Push(NodeParam::kGenerateJob, QVariant::fromValue(job), this); } @@ -124,14 +124,14 @@ void TextGenerator::GenerateFrame(FramePtr frame, const GenerateJob& job) const // Set default font QFont default_font; - default_font.setFamily(job.GetValue(font_input_).data().toString()); - default_font.setPointSizeF(job.GetValue(font_size_input_).data().toFloat()); + default_font.setFamily(job.GetValue(font_input_).data.toString()); + default_font.setPointSizeF(job.GetValue(font_size_input_).data.toFloat()); text_doc.setDefaultFont(default_font); // Center by default text_doc.setDefaultTextOption(QTextOption(Qt::AlignCenter)); - text_doc.setHtml(job.GetValue(text_input_).data().toString()); + text_doc.setHtml(job.GetValue(text_input_).data.toString()); // Align to 80% width because that's considered the "title safe" area int tenth_of_width = frame->video_params().width() / 10; @@ -144,7 +144,7 @@ void TextGenerator::GenerateFrame(FramePtr frame, const GenerateJob& job) const // Push 10% inwards to compensate for title safe area p.translate(tenth_of_width, 0); - TextVerticalAlign valign = static_cast(job.GetValue(valign_input_).data().toInt()); + TextVerticalAlign valign = static_cast(job.GetValue(valign_input_).data.toInt()); int doc_height = text_doc.size().height(); switch (valign) { @@ -165,7 +165,7 @@ void TextGenerator::GenerateFrame(FramePtr frame, const GenerateJob& job) const text_doc.drawContents(&p); // Transplant alpha channel to frame - Color rgb = job.GetValue(color_input_).data().value(); + Color rgb = job.GetValue(color_input_).data.value(); for (int x=0; xwidth(); x++) { for (int y=0; yheight(); y++) { uchar src_alpha = img.bits()[img.bytesPerLine() * y + x]; diff --git a/app/node/math/math/mathbase.cpp b/app/node/math/math/mathbase.cpp index 731a750da..e6b980c66 100644 --- a/app/node/math/math/mathbase.cpp +++ b/app/node/math/math/mathbase.cpp @@ -48,7 +48,7 @@ ShaderCode MathNodeBase::GetShaderCodeInternal(const QString &shader_id, NodeInp // No-op frag shader (can we return QString() instead?) operation = QStringLiteral("texture(%1, ove_texcoord)").arg(tex_in->id()); - vert = ReadFileAsString(":/shaders/matrix.vert").arg(mat_in->id(), tex_in->id()); + vert = FileFunctions::ReadFileAsString(":/shaders/matrix.vert").arg(mat_in->id(), tex_in->id()); } else { switch (op) { @@ -329,7 +329,7 @@ NodeValueTable MathNodeBase::ValueInternal(NodeValueDatabase &value, Operation o float number = RetrieveNumber(number_val); SampleJob job(val_a.type() == NodeParam::kSamples ? val_a : val_b); - job.InsertValue(number_param, NodeValue(NodeParam::kFloat, number, this)); + job.InsertValue(number_param, ShaderValue(number, NodeParam::kFloat)); if (job.HasSamples()) { if (number_param->is_static()) { diff --git a/app/node/math/merge/merge.cpp b/app/node/math/merge/merge.cpp index 092b69455..7c02cc375 100644 --- a/app/node/math/merge/merge.cpp +++ b/app/node/math/merge/merge.cpp @@ -66,7 +66,7 @@ ShaderCode MergeNode::GetShaderCode(const QString &shader_id) const { Q_UNUSED(shader_id) - return ShaderCode(ReadFileAsString(":/shaders/alphaover.frag"), QString()); + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/alphaover.frag"), QString()); } NodeValueTable MergeNode::Value(NodeValueDatabase &value) const @@ -79,13 +79,13 @@ NodeValueTable MergeNode::Value(NodeValueDatabase &value) const NodeValueTable table = value.Merge(); - if (!job.GetValue(base_in_).data().isNull() || !job.GetValue(blend_in_).data().isNull()) { - if (job.GetValue(base_in_).data().isNull()) { + if (!job.GetValue(base_in_).data.isNull() || !job.GetValue(blend_in_).data.isNull()) { + if (job.GetValue(base_in_).data.isNull()) { // We only have a blend texture, no need to alpha over - table.Push(job.GetValue(blend_in_)); - } else if (job.GetValue(blend_in_).data().isNull()) { + table.Push(job.GetValue(blend_in_), this); + } else if (job.GetValue(blend_in_).data.isNull()) { // We only have a base texture, no need to alpha over - table.Push(job.GetValue(base_in_)); + table.Push(job.GetValue(base_in_), this); } else { // We have both textures, push the job table.Push(NodeParam::kShaderJob, QVariant::fromValue(job), this); diff --git a/app/node/node.cpp b/app/node/node.cpp index 148c41ee5..c1b90e950 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -270,18 +270,6 @@ QList Node::GetInputsToHash() const return GetInputsIncludingArrays(); } -QString Node::ReadFileAsString(const QString &filename) -{ - QFile f(filename); - QString file_data; - if (f.open(QFile::ReadOnly | QFile::Text)) { - QTextStream text_stream(&f); - file_data = text_stream.readAll(); - f.close(); - } - return file_data; -} - void GetInputsIncludingArraysInternal(NodeInputArray* array, QList& list) { foreach (NodeInput* input, array->sub_params()) { diff --git a/app/node/node.h b/app/node/node.h index 5ed6826b7..bcc168c15 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -404,8 +404,6 @@ public: void SetPosition(const QPointF& pos); - static QString ReadFileAsString(const QString& filename); - QList GetInputsIncludingArrays() const; QList GetOutputs() const; diff --git a/app/node/value.cpp b/app/node/value.cpp index ef5ac05bd..fb337253e 100644 --- a/app/node/value.cpp +++ b/app/node/value.cpp @@ -22,26 +22,6 @@ OLIVE_NAMESPACE_ENTER -NodeValueTable& NodeValueDatabase::operator[](const QString &input_id) -{ - return tables_[input_id]; -} - -NodeValueTable& NodeValueDatabase::operator[](const NodeInput *input) -{ - return tables_[input->id()]; -} - -void NodeValueDatabase::Insert(const QString &key, const NodeValueTable &value) -{ - tables_.insert(key, value); -} - -void NodeValueDatabase::Insert(const NodeInput *key, const NodeValueTable &value) -{ - tables_.insert(key->id(), value); -} - NodeValueTable NodeValueDatabase::Merge() const { QHash copy = tables_; @@ -103,41 +83,6 @@ NodeValue NodeValueTable::TakeWithMeta(const NodeParam::DataType &type, const QS return NodeValue(); } -void NodeValueTable::Push(const NodeValue &value) -{ - values_.append(value); -} - -void NodeValueTable::Push(const NodeParam::DataType &type, const QVariant &data, const Node* from, const QString &tag) -{ - Push(NodeValue(type, data, from, tag)); -} - -void NodeValueTable::Prepend(const NodeValue &value) -{ - values_.prepend(value); -} - -void NodeValueTable::Prepend(const NodeParam::DataType &type, const QVariant &data, const Node* from, const QString &tag) -{ - Prepend(NodeValue(type, data, from, tag)); -} - -const NodeValue &NodeValueTable::at(int index) const -{ - return values_.at(index); -} - -NodeValue NodeValueTable::TakeAt(int index) -{ - return values_.takeAt(index); -} - -int NodeValueTable::Count() const -{ - return values_.size(); -} - bool NodeValueTable::Has(const NodeParam::DataType &type) const { for (int i=values_.size() - 1;i>=0;i--) { @@ -163,11 +108,6 @@ void NodeValueTable::Remove(const NodeValue &v) } } -bool NodeValueTable::isEmpty() const -{ - return values_.isEmpty(); -} - NodeValueTable NodeValueTable::Merge(QList tables) { diff --git a/app/node/value.h b/app/node/value.h index 448c1c54d..448291d9a 100644 --- a/app/node/value.h +++ b/app/node/value.h @@ -24,6 +24,7 @@ #include #include "input.h" +#include "render/shadervalue.h" OLIVE_NAMESPACE_ENTER @@ -72,17 +73,58 @@ public: NodeValue GetWithMeta(const NodeParam::DataType& type, const QString& tag = QString()) const; QVariant Take(const NodeParam::DataType& type, const QString& tag = QString()); NodeValue TakeWithMeta(const NodeParam::DataType& type, const QString& tag = QString()); - void Push(const NodeValue& value); - void Push(const NodeParam::DataType& type, const QVariant& data, const Node *from, const QString& tag = QString()); - void Prepend(const NodeValue& value); - void Prepend(const NodeParam::DataType& type, const QVariant& data, const Node *from, const QString& tag = QString()); - const NodeValue& at(int index) const; - NodeValue TakeAt(int index); - int Count() const; + + void Push(const NodeValue& value) + { + values_.append(value); + } + + void Push(const NodeParam::DataType& type, const QVariant& data, const Node *from, const QString& tag = QString()) + { + Push(NodeValue(type, data, from, tag)); + } + + void Push(const ShaderValue &value, const Node *from) + { + Push(value.type, value.data, from, value.tag); + } + + void Prepend(const NodeValue& value) + { + values_.prepend(value); + } + + void Prepend(const NodeParam::DataType& type, const QVariant& data, const Node *from, const QString& tag = QString()) + { + Prepend(NodeValue(type, data, from, tag)); + } + + void Prepend(const ShaderValue &value, const Node *from) + { + Prepend(value.type, value.data, from, value.tag); + } + + const NodeValue& at(int index) const + { + return values_.at(index); + } + NodeValue TakeAt(int index) + { + return values_.takeAt(index); + } + + int Count() const + { + return values_.size(); + } + bool Has(const NodeParam::DataType& type) const; void Remove(const NodeValue& v); - bool isEmpty() const; + bool isEmpty() const + { + return values_.isEmpty(); + } static NodeValueTable Merge(QList tables); @@ -98,11 +140,25 @@ class NodeValueDatabase public: NodeValueDatabase() = default; - NodeValueTable& operator[](const QString& input_id); - NodeValueTable& operator[](const NodeInput* input); + NodeValueTable& operator[](const QString& input_id) + { + return tables_[input_id]; + } - void Insert(const QString& key, const NodeValueTable &value); - void Insert(const NodeInput* key, const NodeValueTable& value); + NodeValueTable& operator[](const NodeInput* input) + { + return tables_[input->id()]; + } + + void Insert(const QString& key, const NodeValueTable &value) + { + tables_.insert(key, value); + } + + void Insert(const NodeInput* key, const NodeValueTable& value) + { + tables_.insert(key->id(), value); + } NodeValueTable Merge() const; diff --git a/app/project/item/footage/videostream.cpp b/app/project/item/footage/videostream.cpp index 98cbfd1fc..d96f319c7 100644 --- a/app/project/item/footage/videostream.cpp +++ b/app/project/item/footage/videostream.cpp @@ -159,12 +159,6 @@ void VideoStream::set_colorspace(const QString &color) emit ParametersChanged(); } -QString VideoStream::get_colorspace_match_string() const -{ - return QStringLiteral("%1:%2").arg(footage()->project()->color_manager()->GetConfigFilename(), - colorspace()); -} - void VideoStream::ColorConfigChanged() { ColorManager* color_manager = footage()->project()->color_manager(); diff --git a/app/project/item/footage/videostream.h b/app/project/item/footage/videostream.h index 7fe6ba773..aa91707a2 100644 --- a/app/project/item/footage/videostream.h +++ b/app/project/item/footage/videostream.h @@ -90,8 +90,6 @@ public: const QString& colorspace(bool default_if_empty = true) const; void set_colorspace(const QString& color); - QString get_colorspace_match_string() const; - VideoParams::Interlacing interlacing() const { return interlacing_; diff --git a/app/render/CMakeLists.txt b/app/render/CMakeLists.txt index c569c0293..6e8f1e43d 100644 --- a/app/render/CMakeLists.txt +++ b/app/render/CMakeLists.txt @@ -30,7 +30,6 @@ set(OLIVE_SOURCES render/colorprocessor.h render/colorprocessorcache.h render/colorprocessor.cpp - render/decodercache.h render/diskmanager.h render/diskmanager.cpp render/framehashcache.h @@ -43,12 +42,14 @@ set(OLIVE_SOURCES render/playbackcache.cpp render/previewautocacher.h render/previewautocacher.cpp + render/rendercache.h render/rendermanager.h render/rendermanager.cpp render/rendermodes.h render/renderprocessor.h render/renderprocessor.cpp render/shaderinfo.h + render/shadervalue.h render/stillimagecache.h render/videoparams.h render/videoparams.cpp diff --git a/app/render/backend/opengl/openglrenderer.cpp b/app/render/backend/opengl/openglrenderer.cpp index 533408e01..117ffdeae 100644 --- a/app/render/backend/opengl/openglrenderer.cpp +++ b/app/render/backend/opengl/openglrenderer.cpp @@ -140,10 +140,6 @@ void OpenGLRenderer::Destroy() // Delete framebuffer functions_->glDeleteFramebuffers(1, &framebuffer_); - // Delete all shaders - qDeleteAll(shader_cache_); - shader_cache_.clear(); - // Delete context if it belongs to us if (context_->parent() == this) { delete context_; @@ -171,8 +167,6 @@ void OpenGLRenderer::AttachTextureAsDestination(Renderer::Texture* texture) GL_TEXTURE_2D, texture->id().value(), 0); - - SetViewport(texture->width(), texture->height()); } void OpenGLRenderer::DetachTextureAsDestination() @@ -221,6 +215,8 @@ QVariant OpenGLRenderer::CreateNativeShader(ShaderCode code) goto error; } + qDebug() << "Shader created successfully"; + return Node::PtrToValue(program); error: @@ -281,51 +277,14 @@ void OpenGLRenderer::DownloadFromTexture(Texture* texture, void *data, int lines functions_->glBindTexture(GL_TEXTURE_2D, current_tex); } -Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, ShaderJob job, VideoParams params) +void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destination, VideoParams destination_params) { // If this node is iterative, we'll pick up which input here GLuint iterative_input = 0; QList textures_to_bind; bool input_textures_have_alpha = false; - QString full_shader_id = QStringLiteral("%1:%2").arg(node->id(), job.GetShaderID()); - QOpenGLShaderProgram* shader = shader_cache_.value(full_shader_id); - - if (!shader) { - // Since we have shader code, compile it now - ShaderCode code = node->GetShaderCode(job.GetShaderID()); - QString vert_code = code.vert_code(); - QString frag_code = code.frag_code(); - - if (frag_code.isEmpty() && vert_code.isEmpty()) { - qWarning() << "No shader code found for" << node->id() << "- operation will be a no-op"; - } - - if (frag_code.isEmpty()) { - frag_code = Node::ReadFileAsString(QStringLiteral(":/shaders/default.frag")); - } - - if (vert_code.isEmpty()) { - vert_code = Node::ReadFileAsString(QStringLiteral(":/shaders/default.vert")); - } - - shader = new QOpenGLShaderProgram(this); - if (shader - && shader->create() - && shader->addShaderFromSourceCode(QOpenGLShader::Fragment, frag_code) - && shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vert_code) - && shader->link()) { - shader_cache_.insert(full_shader_id, shader); - } else { - qWarning() << "Failed to compile shader for" << node->id(); - shader = nullptr; - } - - if (!shader) { - // Couldn't find or build the shader required - return nullptr; - } - } + QOpenGLShaderProgram* shader = Node::ValueToPtr(s); shader->bind(); @@ -338,28 +297,25 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, ShaderJob j continue; } - // See if this value corresponds to an input (NOTE: it may not and this may be null) - NodeInput* corresponding_input = node->GetInputWithID(it.key()); - // This variable is used in the shader, let's set it - const QVariant& value = it.value().data(); + const ShaderValue& value = it.value(); - NodeParam::DataType data_type = (it.value().type() != NodeParam::kNone) - ? it.value().type() - : corresponding_input->data_type(); + if (value.array) { + qWarning() << "FIXME: Array support is currently a stub"; + } - switch (data_type) { + switch (value.type) { case NodeInput::kInt: // kInt technically specifies a LongLong, but OpenGL doesn't support those. This may lead to // over/underflows if the number is large enough, but the likelihood of that is quite low. - shader->setUniformValue(variable_location, value.toInt()); + shader->setUniformValue(variable_location, value.data.toInt()); break; case NodeInput::kFloat: // kFloat technically specifies a double but as above, OpenGL doesn't support those. - shader->setUniformValue(variable_location, value.toFloat()); + shader->setUniformValue(variable_location, value.data.toFloat()); break; case NodeInput::kVec2: - if (corresponding_input && corresponding_input->IsArray()) { + /*if (corresponding_input && corresponding_input->IsArray()) { QVector nv = value.value< QVector >(); QVector a(nv.size()); @@ -374,41 +330,42 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, ShaderJob j shader->setUniformValue(count_location, a.size()); } } else { - shader->setUniformValue(variable_location, value.value()); - } + + }*/ + shader->setUniformValue(variable_location, value.data.value()); break; case NodeInput::kVec3: - shader->setUniformValue(variable_location, value.value()); + shader->setUniformValue(variable_location, value.data.value()); break; case NodeInput::kVec4: - shader->setUniformValue(variable_location, value.value()); + shader->setUniformValue(variable_location, value.data.value()); break; case NodeInput::kMatrix: - shader->setUniformValue(variable_location, value.value()); + shader->setUniformValue(variable_location, value.data.value()); break; case NodeInput::kCombo: - shader->setUniformValue(variable_location, value.value()); + shader->setUniformValue(variable_location, value.data.value()); break; case NodeInput::kColor: { - Color color = value.value(); + Color color = value.data.value(); shader->setUniformValue(variable_location, color.red(), color.green(), color.blue(), color.alpha()); break; } case NodeInput::kBoolean: - shader->setUniformValue(variable_location, value.toBool()); + shader->setUniformValue(variable_location, value.data.toBool()); break; case NodeInput::kBuffer: case NodeInput::kTexture: { - TexturePtr texture = value.value(); + TexturePtr texture = value.data.value(); // Set value to bound texture shader->setUniformValue(variable_location, textures_to_bind.size()); // If this texture binding is the iterative input, set it here - if (corresponding_input && corresponding_input == job.GetIterativeInput()) { + if (it.key() == job.GetIterativeInput()) { iterative_input = textures_to_bind.size(); } @@ -434,8 +391,8 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, ShaderJob j // Adjust virtual width by pixel aspect if necessary if (texture->params().pixel_aspect_ratio() != 1 - || params.pixel_aspect_ratio() != 1) { - double relative_pixel_aspect = texture->params().pixel_aspect_ratio().toDouble() / params.pixel_aspect_ratio().toDouble(); + || destination_params.pixel_aspect_ratio() != 1) { + double relative_pixel_aspect = texture->params().pixel_aspect_ratio().toDouble() / destination_params.pixel_aspect_ratio().toDouble(); adjusted_width = qRound(static_cast(adjusted_width) * relative_pixel_aspect); } @@ -466,32 +423,13 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, ShaderJob j } } - // Provide some standard args + // Set ove_resolution to the destination to the "logical" resolution of the destination shader->setUniformValue("ove_resolution", - static_cast(params.width()), - static_cast(params.height())); + static_cast(destination_params.width()), + static_cast(destination_params.height())); - // Create the output textures - int real_iteration_count; - if (job.GetIterationCount() > 1 && job.GetIterativeInput()) { - real_iteration_count = job.GetIterationCount(); - } else { - real_iteration_count = 1; - } - - TexturePtr dst_refs[2]; - dst_refs[0] = CreateTexture(params); - - // If this node requires multiple iterations, get a texture for it too - if (real_iteration_count > 1) { - dst_refs[1] = CreateTexture(params); - } - - // Some nodes use multiple iterations for optimization - TexturePtr input_tex, output_tex; - - // Set up OpenGL parameters as necessary - functions_->glViewport(0, 0, params.effective_width(), params.effective_height()); + // Set the viewport to the "physical" resolution of the destination + functions_->glViewport(0, 0, destination_params.effective_width(), destination_params.effective_height()); // Bind all textures for (int i=0; iglVertexAttribPointer(tex_location, 2, GL_FLOAT, GL_FALSE, 0, nullptr); frag_vbo_.release(); + // Some shaders optimize through multiple iterations which requires ping-ponging textures + // - If there are only two iterations, we can just create one backend texture and then the + // destination can be the second + // - If there are more than two iterations, we need to ping pong back and forth between two + // textures. We can still use the destination as the last iteration, but we'll need textures + // for the iterative process. + int real_iteration_count; + if (job.GetIterationCount() > 1 && !job.GetIterativeInput().isEmpty()) { + real_iteration_count = job.GetIterationCount(); + } else { + real_iteration_count = 1; + } + + TexturePtr output_tex, input_tex; + if (real_iteration_count > 1) { + // Create one texture to bounce off + output_tex = CreateTexture(destination_params); + + if (real_iteration_count > 2) { + // Create a second texture bounce off + input_tex = CreateTexture(destination_params); + } + } + for (int iteration=0; iterationsetUniformValue("ove_iteration", iteration); // Replace iterative input - if (iteration == 0) { - output_tex = dst_refs[0]; + if (iteration == real_iteration_count-1) { + // This is the last iteration, draw to the destination + if (destination) { + // If we have a destination texture, draw to it + AttachTextureAsDestination(destination); + } else if (iteration > 0) { + // Otherwise, if we were iterating before, detach texture now + DetachTextureAsDestination(); + } } else { - input_tex = dst_refs[(iteration+1)%2]; - output_tex = dst_refs[iteration%2]; + // Always draw to output_tex + AttachTextureAsDestination(output_tex.get()); - functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); - functions_->glBindTexture(GL_TEXTURE_2D, input_tex->id().value()); - PrepareInputTexture(job.GetBilinearFiltering()); + if (iteration > 0) { + // If this is not the first iteration, replace the iterative texture with the one we + // last drew + functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); + functions_->glBindTexture(GL_TEXTURE_2D, input_tex->id().value()); + PrepareInputTexture(job.GetBilinearFiltering()); + } + + // Swap so that the next iteration, the texture we draw now will be the input texture next + std::swap(output_tex, input_tex); } - AttachTextureAsDestination(output_tex.get()); - // Blit this texture through this shader functions_->glDrawArrays(GL_TRIANGLES, 0, blit_vertices.size() / 3); } - // Reset framebuffer to default - DetachTextureAsDestination(); + if (destination) { + // Reset framebuffer to default if we were drawing to a texture + DetachTextureAsDestination(); + + // Set metadata for whether this texture has a meaningful alpha channel + destination->set_has_meaningful_alpha((input_textures_have_alpha || job.GetAlphaChannelRequired())); + } // Release any textures we bound before for (int i=textures_to_bind.size()-1; i>=0; i--) { @@ -552,23 +531,9 @@ Renderer::TexturePtr OpenGLRenderer::ProcessShader(const Node *node, ShaderJob j // Release shader shader->release(); - - output_tex->set_has_meaningful_alpha((input_textures_have_alpha || job.GetAlphaChannelRequired())); - - return output_tex; } -void OpenGLRenderer::SetViewport(int width, int height) -{ - functions_->glViewport(0, 0, width, height); -} - -void OpenGLRenderer::BlitColorManaged(ColorProcessorPtr color_processor, Texture *source, Renderer::Texture* destination) -{ - qCritical() << "OpenGLRenderer::BlitColorMangaed is a stub!"; -} - -void OpenGLRenderer::Blit(Renderer::Texture *source, QVariant shader, Renderer::ShaderUniformMap parameters, Renderer::Texture *destination) +/*void OpenGLRenderer::Blit(Renderer::Texture *source, QVariant shader, Renderer::ShaderUniformMap parameters, Renderer::Texture *destination) { QOpenGLShaderProgram* program = Node::ValueToPtr(shader); @@ -594,7 +559,7 @@ void OpenGLRenderer::Blit(Renderer::Texture *source, QVariant shader, Renderer:: if (destination) { DetachTextureAsDestination(); } -} +}*/ GLint OpenGLRenderer::GetInternalFormat(PixelFormat::Format format) { diff --git a/app/render/backend/opengl/openglrenderer.h b/app/render/backend/opengl/openglrenderer.h index d0358a680..7634efc4f 100644 --- a/app/render/backend/opengl/openglrenderer.h +++ b/app/render/backend/opengl/openglrenderer.h @@ -51,10 +51,6 @@ public slots: virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; - virtual void AttachTextureAsDestination(OLIVE_NAMESPACE::Renderer::Texture* texture) override; - - virtual void DetachTextureAsDestination() override; - virtual QVariant CreateNativeTexture(OLIVE_NAMESPACE::VideoParams param, void* data = nullptr, int linesize = 0) override; virtual void DestroyNativeTexture(QVariant texture) override; @@ -67,21 +63,21 @@ public slots: virtual void DownloadFromTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; - virtual TexturePtr ProcessShader(const OLIVE_NAMESPACE::Node* node, - OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::VideoParams params) override; - - virtual void SetViewport(int width, int height) override; - - virtual void BlitColorManaged(OLIVE_NAMESPACE::ColorProcessorPtr color_processor, OLIVE_NAMESPACE::Renderer::Texture* source, OLIVE_NAMESPACE::Renderer::Texture *destination = nullptr) override; - - virtual void Blit(OLIVE_NAMESPACE::Renderer::Texture* source, QVariant shader, OLIVE_NAMESPACE::Renderer::ShaderUniformMap parameters, OLIVE_NAMESPACE::Renderer::Texture* destination = nullptr) override; +protected slots: + virtual void Blit(QVariant shader, + OLIVE_NAMESPACE::ShaderJob job, + OLIVE_NAMESPACE::Renderer::Texture* destination, + OLIVE_NAMESPACE::VideoParams destination_params) override; private: static GLint GetInternalFormat(PixelFormat::Format format); static GLenum GetPixelType(PixelFormat::Format format); + void AttachTextureAsDestination(OLIVE_NAMESPACE::Renderer::Texture* texture); + + void DetachTextureAsDestination(); + void PrepareInputTexture(bool bilinear); QOpenGLContext* context_; @@ -98,8 +94,6 @@ private: GLuint framebuffer_; - QHash shader_cache_; - }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/renderer.cpp b/app/render/backend/renderer.cpp index a1ddaa924..33897c7b1 100644 --- a/app/render/backend/renderer.cpp +++ b/app/render/backend/renderer.cpp @@ -20,6 +20,13 @@ #include "renderer.h" +#include +namespace OCIO = OCIO_NAMESPACE::v1; + +#include + +#include "render/colormanager.h" + OLIVE_NAMESPACE_ENTER Renderer::Renderer(QObject *parent) : @@ -39,4 +46,91 @@ Renderer::TexturePtr Renderer::CreateTexture(const VideoParams ¶m, void *dat return std::make_shared(this, v, param); } +// copied from source code to OCIODisplay +/*const int OCIO_LUT3D_EDGE_SIZE = 64; + +const int OCIO_LUT3D_PIXEL_COUNT = OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE; +const int OCIO_LUT3D_ENTRY_COUNT = 3 * OCIO_LUT3D_PIXEL_COUNT; +const int OCIO_LUT3D_ENTRY_COUNT_WITH_ALPHA = 4 * OCIO_LUT3D_PIXEL_COUNT; +const int OCIO_LUT2D_EDGE_SIZE = 512;*/ + +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination) +{ + /*ColorContext color_ctx; + + if (color_cache_.contains(color_processor->id())) { + color_ctx = color_cache_.value(color_processor->id()); + } else { + // Generate OCIO color context + + // Generate OCIO shader descriptor + const char* ocio_func_name = "OCIODisplay"; + OCIO::GpuShaderDesc shader_desc; + shader_desc.setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_0); + shader_desc.setFunctionName(ocio_func_name); + shader_desc.setLut3DEdgeLen(OCIO_LUT3D_EDGE_SIZE); + + // Generate LUT + QVector lut_data(OCIO_LUT3D_ENTRY_COUNT); + color_processor->GetProcessor()->getGpuLut3D(lut_data.data(), shader_desc); + + // Convert to half float RGBA + QVector texture_ready_lut_data(OCIO_LUT3D_ENTRY_COUNT_WITH_ALPHA); + for (int i=0; iGetProcessor()->getGpuShaderText(shader_desc); + ocio_code.replace(QStringLiteral("texture3D"), QStringLiteral("texture2D")); + ocio_code.replace(QStringLiteral("sampler3D"), QStringLiteral("sampler2D")); + + + + qDebug() << frag_code; + + //qDebug() << "FIXME: GPU doesn't handle associated alpha yet"; + }*/ + + qDebug() << "BlitColorManaged is a partial stub"; + + QVariant shader = CreateNativeShader(ShaderCode(FileFunctions::ReadFileAsString(":/shaders/default.frag"), FileFunctions::ReadFileAsString(":/shaders/default.vert"))); + + ShaderJob job; + job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); + + BlitToTexture(shader, job, destination); +} + +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params) +{ + qDebug() << "BlitColorManaged is a partial stub"; + + QVariant shader = CreateNativeShader(ShaderCode(FileFunctions::ReadFileAsString(":/shaders/default.frag"), FileFunctions::ReadFileAsString(":/shaders/default.vert"))); + + ShaderJob job; + job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); + + Blit(shader, job, params); +} + OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/renderer.h b/app/render/backend/renderer.h index 0d8088af8..382228244 100644 --- a/app/render/backend/renderer.h +++ b/app/render/backend/renderer.h @@ -121,12 +121,22 @@ public: TexturePtr CreateTexture(const VideoParams& param, void* data = nullptr, int linesize = 0); - struct ShaderValue { - QVariant data; - NodeParam::DataType type; - }; + void BlitToTexture(QVariant shader, + OLIVE_NAMESPACE::ShaderJob job, + OLIVE_NAMESPACE::Renderer::Texture* destination) + { + Blit(shader, job, destination, destination->params()); + } - using ShaderUniformMap = QHash; + void Blit(QVariant shader, + OLIVE_NAMESPACE::ShaderJob job, + OLIVE_NAMESPACE::VideoParams params) + { + Blit(shader, job, nullptr, params); + } + + void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture* destination); + void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params); public slots: virtual void PostInit() = 0; @@ -135,10 +145,6 @@ public slots: virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) = 0; - virtual void AttachTextureAsDestination(OLIVE_NAMESPACE::Renderer::Texture* texture) = 0; - - virtual void DetachTextureAsDestination() = 0; - virtual QVariant CreateNativeTexture(OLIVE_NAMESPACE::VideoParams param, void* data = nullptr, int linesize = 0) = 0; virtual void DestroyNativeTexture(QVariant texture) = 0; @@ -151,18 +157,19 @@ public slots: virtual void DownloadFromTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) = 0; - virtual TexturePtr ProcessShader(const OLIVE_NAMESPACE::Node* node, - OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::VideoParams params) = 0; - - virtual void SetViewport(int width, int height) = 0; - - virtual void BlitColorManaged(OLIVE_NAMESPACE::ColorProcessorPtr color_processor, OLIVE_NAMESPACE::Renderer::Texture* source, OLIVE_NAMESPACE::Renderer::Texture *destination = nullptr) = 0; - - virtual void Blit(OLIVE_NAMESPACE::Renderer::Texture* source, QVariant shader, OLIVE_NAMESPACE::Renderer::ShaderUniformMap parameters, OLIVE_NAMESPACE::Renderer::Texture* destination = nullptr) = 0; +protected slots: + virtual void Blit(QVariant shader, + OLIVE_NAMESPACE::ShaderJob job, + OLIVE_NAMESPACE::Renderer::Texture* destination, + OLIVE_NAMESPACE::VideoParams destination_params) = 0; private: + struct ColorContext { + QVariant shader; + TexturePtr lut; + }; + QHash color_cache_; }; diff --git a/app/render/backend/rendererthreadwrapper.cpp b/app/render/backend/rendererthreadwrapper.cpp index eed470ec7..8b024054e 100644 --- a/app/render/backend/rendererthreadwrapper.cpp +++ b/app/render/backend/rendererthreadwrapper.cpp @@ -76,17 +76,6 @@ void RendererThreadWrapper::ClearDestination(double r, double g, double b, doubl Q_ARG(double, a)); } -void RendererThreadWrapper::AttachTextureAsDestination(Renderer::Texture *texture) -{ - QMetaObject::invokeMethod(inner_, "AttachTextureAsDestination", Qt::BlockingQueuedConnection, - OLIVE_NS_ARG(Renderer::Texture*, texture)); -} - -void RendererThreadWrapper::DetachTextureAsDestination() -{ - QMetaObject::invokeMethod(inner_, "DetachTextureAsDestination", Qt::BlockingQueuedConnection); -} - QVariant RendererThreadWrapper::CreateNativeTexture(VideoParams param, void *data, int linesize) { QVariant v; @@ -139,41 +128,15 @@ void RendererThreadWrapper::DownloadFromTexture(Renderer::Texture *texture, void Q_ARG(int, linesize)); } -Renderer::TexturePtr RendererThreadWrapper::ProcessShader(const Node *node, ShaderJob job, VideoParams params) +void RendererThreadWrapper::Blit(QVariant shader, ShaderJob job, Renderer::Texture *destination, VideoParams destination_params) { Renderer::TexturePtr tex; QMetaObject::invokeMethod(inner_, "Blit", Qt::BlockingQueuedConnection, - OLIVE_NS_RETURN_ARG(Renderer::TexturePtr, tex), - OLIVE_NS_CONST_ARG(Node*, node), - OLIVE_NS_ARG(ShaderJob, job), - OLIVE_NS_ARG(VideoParams, params)); - - return tex; -} - -void RendererThreadWrapper::SetViewport(int width, int height) -{ - QMetaObject::invokeMethod(inner_, "SetViewport", Qt::BlockingQueuedConnection, - Q_ARG(int, width), - Q_ARG(int, height)); -} - -void RendererThreadWrapper::BlitColorManaged(ColorProcessorPtr color_processor, Renderer::Texture *source, Renderer::Texture *destination) -{ - QMetaObject::invokeMethod(inner_, "BlitColorManaged", Qt::BlockingQueuedConnection, - OLIVE_NS_ARG(ColorProcessorPtr, color_processor), - OLIVE_NS_ARG(Renderer::Texture*, source), - OLIVE_NS_ARG(Renderer::Texture*, destination)); -} - -void RendererThreadWrapper::Blit(Renderer::Texture *source, QVariant shader, Renderer::ShaderUniformMap parameters, Renderer::Texture *destination) -{ - QMetaObject::invokeMethod(inner_, "Blit", Qt::BlockingQueuedConnection, - OLIVE_NS_ARG(Renderer::Texture*, source), Q_ARG(QVariant, shader), - Q_ARG(Renderer::ShaderUniformMap, parameters), - OLIVE_NS_ARG(Renderer::Texture*, destination)); + OLIVE_NS_ARG(ShaderJob, job), + OLIVE_NS_ARG(Renderer::Texture*, destination), + OLIVE_NS_ARG(VideoParams, destination_params)); } OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/rendererthreadwrapper.h b/app/render/backend/rendererthreadwrapper.h index d8bd05bb0..95445bc25 100644 --- a/app/render/backend/rendererthreadwrapper.h +++ b/app/render/backend/rendererthreadwrapper.h @@ -47,10 +47,6 @@ public slots: virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; - virtual void AttachTextureAsDestination(OLIVE_NAMESPACE::Renderer::Texture* texture) override; - - virtual void DetachTextureAsDestination() override; - virtual QVariant CreateNativeTexture(OLIVE_NAMESPACE::VideoParams param, void* data = nullptr, int linesize = 0) override; virtual void DestroyNativeTexture(QVariant texture) override; @@ -63,15 +59,11 @@ public slots: virtual void DownloadFromTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; - virtual TexturePtr ProcessShader(const OLIVE_NAMESPACE::Node* node, - OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::VideoParams params) override; - - virtual void SetViewport(int width, int height) override; - - virtual void BlitColorManaged(OLIVE_NAMESPACE::ColorProcessorPtr color_processor, OLIVE_NAMESPACE::Renderer::Texture* source, OLIVE_NAMESPACE::Renderer::Texture *destination = nullptr) override; - - virtual void Blit(OLIVE_NAMESPACE::Renderer::Texture* source, QVariant shader, OLIVE_NAMESPACE::Renderer::ShaderUniformMap parameters, OLIVE_NAMESPACE::Renderer::Texture* destination = nullptr) override; +protected slots: + virtual void Blit(QVariant shader, + OLIVE_NAMESPACE::ShaderJob job, + OLIVE_NAMESPACE::Renderer::Texture* destination, + OLIVE_NAMESPACE::VideoParams destination_params) override; private: Renderer* inner_; diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index cee97fb43..e33942fd2 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -54,6 +54,8 @@ ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const output.toUtf8()); } + + id_ = GenerateID(config, input, transform); } void ColorProcessor::ConvertFrame(Frame *f) @@ -75,6 +77,15 @@ Color ColorProcessor::ConvertColor(Color in) return in; } +QString ColorProcessor::GenerateID(ColorManager *config, const QString &input, const ColorTransform &transform) +{ + return QStringLiteral("%1:%2:%3:%4:%5").arg(config->GetConfigFilename(), + input, + transform.display(), + transform.view(), + transform.look()); +} + ColorProcessorPtr ColorProcessor::Create(ColorManager *config, const QString& input, const ColorTransform &transform) { return std::make_shared(config, input, transform); diff --git a/app/render/colorprocessor.h b/app/render/colorprocessor.h index 6912cd66d..f2c2e6a2e 100644 --- a/app/render/colorprocessor.h +++ b/app/render/colorprocessor.h @@ -53,9 +53,18 @@ public: Color ConvertColor(Color in); + const QString& id() const + { + return id_; + } + + static QString GenerateID(ColorManager* config, const QString& input, const ColorTransform& dest_space); + private: OCIO::ConstProcessorRcPtr processor_; + QString id_; + }; using ColorProcessorChain = QList; diff --git a/app/render/colortransform.h b/app/render/colortransform.h index cd183dda3..45e605c8d 100644 --- a/app/render/colortransform.h +++ b/app/render/colortransform.h @@ -22,7 +22,6 @@ #define COLORTRANSFORM_H #include -namespace OCIO = OCIO_NAMESPACE::v1; #include diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index e8e4d72eb..cbf09a06f 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -19,7 +19,8 @@ PreviewAutoCacher::PreviewAutoCacher() : last_update_time_(0), ignore_next_mouse_button_(false), video_params_changed_(false), - audio_params_changed_(false) + audio_params_changed_(false), + color_manager_(nullptr) { // Set default autocache range SetPlayhead(rational()); @@ -582,7 +583,7 @@ void PreviewAutoCacher::TryRender() single_frame_render_->Start(); watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, - static_cast(viewer_node_->parent())->project()->color_manager(), + color_manager_, single_frame_render_->property("time").value(), RenderMode::kOffline, true)); @@ -624,7 +625,7 @@ void PreviewAutoCacher::RequeueFrames() connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::VideoRendered); video_tasks_.insert(watcher, hash); watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, - static_cast(viewer_node_->parent())->project()->color_manager(), + color_manager_, t, RenderMode::kOffline, false)); } } diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index c6b993b5d..663ee7bc2 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -6,6 +6,7 @@ #include "config/config.h" #include "node/node.h" #include "node/output/viewer/viewer.h" +#include "render/colormanager.h" #include "threading/threadticketwatcher.h" OLIVE_NAMESPACE_ENTER @@ -83,6 +84,11 @@ public: void ClearAudioQueue(bool wait = false); void ClearVideoDownloadQueue(bool wait = false); + void SetColorManager(ColorManager* manager) + { + color_manager_ = manager; + } + public slots: /** * @brief Main handler for when the NodeGraph changes @@ -148,6 +154,8 @@ private: bool audio_params_changed_; + ColorManager* color_manager_; + private slots: /** * @brief Handler for when the NodeGraph reports a video change over a certain time range diff --git a/app/render/decodercache.h b/app/render/rendercache.h similarity index 78% rename from app/render/decodercache.h rename to app/render/rendercache.h index e43023274..2c9745083 100644 --- a/app/render/decodercache.h +++ b/app/render/rendercache.h @@ -18,15 +18,16 @@ ***/ -#ifndef DECODERCACHE_H -#define DECODERCACHE_H +#ifndef RENDERCACHE_H +#define RENDERCACHE_H #include "codec/decoder.h" #include "project/item/footage/stream.h" OLIVE_NAMESPACE_ENTER -class DecoderCache : public QHash +template +class RenderCache : public QHash { public: QMutex *mutex() @@ -39,6 +40,9 @@ private: }; +using DecoderCache = RenderCache; +using ShaderCache = RenderCache; + OLIVE_NAMESPACE_EXIT -#endif // DECODERCACHE_H +#endif // RENDERCACHE_H diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index cacf1ed90..9ad31cd65 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -55,6 +55,7 @@ RenderManager::RenderManager(QObject *parent) : still_cache_ = new StillImageCache(); decoder_cache_ = new DecoderCache(); + shader_cache_ = new ShaderCache(); } else { qCritical() << "Tried to initialize unknown graphics backend"; still_cache_ = nullptr; @@ -64,6 +65,7 @@ RenderManager::RenderManager(QObject *parent) : RenderManager::~RenderManager() { + delete shader_cache_; delete decoder_cache_; delete still_cache_; @@ -162,7 +164,7 @@ RenderTicketPtr RenderManager::SaveFrameToCache(FrameHashCache *cache, FramePtr void RenderManager::RunTicket(RenderTicketPtr ticket) const { - RenderProcessor::Process(ticket, context_, still_cache_, decoder_cache_); + RenderProcessor::Process(ticket, context_, still_cache_, decoder_cache_, shader_cache_); } OLIVE_NAMESPACE_EXIT diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index b04935b40..5277c83bd 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -26,11 +26,11 @@ #include "config/config.h" #include "colorprocessorcache.h" #include "dialog/rendercancel/rendercancel.h" -#include "decodercache.h" #include "node/graph.h" #include "node/output/viewer/viewer.h" #include "node/traverser.h" #include "render/backend/renderer.h" +#include "rendercache.h" #include "stillimagecache.h" #include "threading/threadpool.h" @@ -127,6 +127,8 @@ private: DecoderCache* decoder_cache_; + ShaderCache* shader_cache_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 1f4c61837..e18712446 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -29,11 +29,12 @@ OLIVE_NAMESPACE_ENTER -RenderProcessor::RenderProcessor(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache) : +RenderProcessor::RenderProcessor(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache *shader_cache) : ticket_(ticket), render_ctx_(render_ctx), still_image_cache_(still_image_cache), - decoder_cache_(decoder_cache) + decoder_cache_(decoder_cache), + shader_cache_(shader_cache) { } @@ -137,9 +138,9 @@ DecoderPtr RenderProcessor::ResolveDecoderFromInput(StreamPtr stream) return decoder; } -void RenderProcessor::Process(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache *still_image_cache, DecoderCache *decoder_cache) +void RenderProcessor::Process(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache *still_image_cache, DecoderCache *decoder_cache, ShaderCache *shader_cache) { - RenderProcessor p(ticket, render_ctx, still_image_cache, decoder_cache); + RenderProcessor p(ticket, render_ctx, still_image_cache, decoder_cache, shader_cache); p.Run(); } @@ -228,9 +229,10 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & // to optimize such a situation VideoStreamPtr video_stream = std::static_pointer_cast(stream); const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); + StillImageCache::Entry want_entry = {nullptr, stream, - video_stream->get_colorspace_match_string(), + ColorProcessor::GenerateID(Node::ValueToPtr(ticket_->property("colormanager")), video_stream->colorspace(), ColorTransform(OCIO::ROLE_SCENE_LINEAR)), video_stream->premultiplied_alpha(), video_params.divider(), (video_stream->video_type() == VideoStream::kVideoTypeStill) ? 0 : input_time}; @@ -293,14 +295,14 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & managed_params.set_format(video_params.format()); value = render_ctx_->CreateTexture(managed_params); - // FIXME: Accessing video_stream->colorspace() + qDebug() << "FIXME: Accessing video_stream->colorspace() may cause race conditions"; ColorManager* color_manager = video_stream->footage()->project()->color_manager(); ColorProcessorPtr processor = ColorProcessor::Create(color_manager, video_stream->colorspace(), ColorTransform(OCIO::ROLE_SCENE_LINEAR)); - render_ctx_->BlitColorManaged(processor, unmanaged_texture.get(), value.get()); + render_ctx_->BlitColorManaged(processor, unmanaged_texture, value.get()); still_image_cache_->mutex()->lock(); @@ -341,9 +343,30 @@ QVariant RenderProcessor::ProcessShader(const Node *node, const TimeRange &range { Q_UNUSED(range) + QString full_shader_id = QStringLiteral("%1:%2").arg(node->id(), job.GetShaderID()); + + QMutexLocker locker(shader_cache_->mutex()); + + QVariant shader = shader_cache_->value(full_shader_id); + + if (shader.isNull()) { + // Since we have shader code, compile it now + shader = render_ctx_->CreateNativeShader(node->GetShaderCode(job.GetShaderID())); + + if (shader.isNull()) { + // Couldn't find or build the shader required + return QVariant(); + } + } + const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); - return QVariant::fromValue(render_ctx_->ProcessShader(node, job, video_params)); + Renderer::TexturePtr destination = render_ctx_->CreateTexture(video_params); + + // Run shader + render_ctx_->BlitToTexture(shader, job, destination.get()); + + return QVariant::fromValue(destination); } QVariant RenderProcessor::ProcessSamples(const Node *node, const TimeRange &range, const SampleJob &job) @@ -372,7 +395,7 @@ QVariant RenderProcessor::ProcessSamples(const Node *node, const TimeRange &rang if (corresponding_input) { value = ProcessInput(corresponding_input, TimeRange(this_sample_time, this_sample_time)); } else { - value.Push(j.value()); + value.Push(j.value(), node); } value_db.Insert(j.key(), value); diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index 2b85315bd..e2be6eb61 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -21,9 +21,9 @@ #ifndef RENDERPROCESSOR_H #define RENDERPROCESSOR_H -#include "decodercache.h" #include "node/traverser.h" #include "render/backend/renderer.h" +#include "rendercache.h" #include "stillimagecache.h" #include "threading/threadticket.h" @@ -32,7 +32,7 @@ OLIVE_NAMESPACE_ENTER class RenderProcessor : public NodeTraverser { public: - static void Process(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache); + static void Process(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache* shader_cache); struct RenderedWaveform { const TrackOutput* track; @@ -56,7 +56,7 @@ protected: virtual QVariant GetCachedFrame(const Node *node, const rational &time) override; private: - RenderProcessor(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache); + RenderProcessor(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache* shader_cache); void Run(); @@ -70,6 +70,8 @@ private: DecoderCache* decoder_cache_; + ShaderCache* shader_cache_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/shaderinfo.h b/app/render/shaderinfo.h index 8af331d9a..680b32bef 100644 --- a/app/render/shaderinfo.h +++ b/app/render/shaderinfo.h @@ -2,56 +2,73 @@ #define SHADERINFO_H #include "codec/samplebuffer.h" +#include "common/filefunctions.h" #include "node/input.h" #include "node/inputarray.h" #include "node/value.h" OLIVE_NAMESPACE_ENTER -using NodeValueMap = QHash; +using NodeValueMap = QHash; class AcceleratedJob { public: AcceleratedJob() = default; - NodeValue GetValue(NodeInput* input) const + ShaderValue GetValue(NodeInput* input) const { return value_map_.value(input->id()); } - NodeValue GetValue(const QString& input) const + ShaderValue GetValue(const QString& input) const { return value_map_.value(input); } void InsertValue(NodeInput* input, NodeValueDatabase& value) { + ShaderValue shader_val; + + shader_val.type = input->data_type(); + shader_val.array = input->IsArray(); + if (input->IsArray()) { NodeInputArray* array = static_cast(input); - QVector values(array->GetSize()); + QVector values(array->GetSize()); for (int j=0;jGetSize();j++) { NodeInput* subparam = array->At(j); - values[j] = value[subparam].TakeWithMeta(subparam->data_type()); + values[j] = value[subparam].Take(subparam->data_type()); } - InsertValue(input->id(), NodeValue(NodeParam::kVec2, QVariant::fromValue(values), input->parentNode())); + shader_val.data = QVariant::fromValue(values); } else { - InsertValue(input->id(), value[input].TakeWithMeta(input->data_type())); + NodeValue node_val = value[input].TakeWithMeta(input->data_type()); + shader_val.data = node_val.data(); + shader_val.tag = node_val.tag(); } + + InsertValue(input->id(), shader_val); } - void InsertValue(const QString& input, const NodeValue& value) + void InsertValue(const QString& input, const ShaderValue& value) { value_map_.insert(input, value); } - void InsertValue(NodeInput* input, const NodeValue& value) + void InsertValue(NodeInput* input, const ShaderValue& value) { value_map_.insert(input->id(), value); } + void InsertValue(NodeInput* input, const NodeValue& value) + { + ShaderValue s(value.data(), value.type()); + s.tag = value.tag(); + value_map_.insert(input->id(), s); + } + const NodeValueMap &GetValues() const { return value_map_; @@ -127,15 +144,20 @@ public: const QString& GetShaderID() const { - return id_; + return shader_id_; } void SetShaderID(const QString& id) { - id_ = id; + shader_id_ = id; } void SetIterations(int iterations, NodeInput* iterative_input) + { + SetIterations(iterations, iterative_input->id()); + } + + void SetIterations(int iterations, const QString& iterative_input) { iterations_ = iterations; iterative_input_ = iterative_input; @@ -146,7 +168,7 @@ public: return iterations_; } - NodeInput* GetIterativeInput() const + const QString& GetIterativeInput() const { return iterative_input_; } @@ -162,11 +184,11 @@ public: } private: - QString id_; + QString shader_id_; int iterations_; - NodeInput* iterative_input_; + QString iterative_input_; bool bilinear_; @@ -178,6 +200,13 @@ public: frag_code_(frag_code), vert_code_(vert_code) { + if (frag_code_.isEmpty()) { + frag_code_ = FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/default.frag")); + } + + if (vert_code_.isEmpty()) { + vert_code_ = FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/default.vert")); + } } const QString& frag_code() const diff --git a/app/render/shadervalue.h b/app/render/shadervalue.h new file mode 100644 index 000000000..5d4e8dbfb --- /dev/null +++ b/app/render/shadervalue.h @@ -0,0 +1,53 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef SHADERVALUE_H +#define SHADERVALUE_H + +#include "node/param.h" + +OLIVE_NAMESPACE_ENTER + +struct ShaderValue +{ + ShaderValue() + { + type = NodeParam::kNone; + array = false; + } + + ShaderValue(QVariant data_in, NodeParam::DataType type_in, bool array_in = false) + { + data = data_in; + type = type_in; + array = array_in; + } + + NodeParam::DataType type; + QVariant data; + bool array; + + QString tag; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // SHADERVALUE_H diff --git a/app/shaders/default.frag b/app/shaders/default.frag index 62a34b668..181773f5c 100644 --- a/app/shaders/default.frag +++ b/app/shaders/default.frag @@ -15,7 +15,6 @@ in vec2 ove_texcoord; out vec4 fragColor; void main() { - vec2 using_texcoord = ove_texcoord; vec4 color = texture(ove_maintex, ove_texcoord); fragColor = color; -} \ No newline at end of file +} diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index 27b4b3a9d..cd0636b6d 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -248,6 +248,13 @@ void ManagedDisplayWidget::doneCurrent() } } +void ManagedDisplayWidget::update() +{ + if (RenderManager::instance()->backend() == RenderManager::kOpenGL) { + static_cast(inner_widget_)->update(); + } +} + Menu* ManagedDisplayWidget::GetDisplayMenu(QMenu* parent, bool auto_connect) { QStringList displays = color_manager()->ListAvailableDisplays(); diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index ae73dc30e..26c122df7 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -114,6 +114,11 @@ public: */ Menu* GetLookMenu(QMenu* parent, bool auto_connect = true); + /** + * @brief Passes update signal through to inner widget + */ + void update(); + public slots: /** * @brief Replaces the color transform with a new one diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index 44f6a95e8..04255a275 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -43,8 +43,8 @@ void HistogramScope::OnInit() { ScopeBase::OnInit(); - ShaderCode secondary_code(Node::ReadFileAsString(":/shaders/rgbhistogram_secondary.frag"), - Node::ReadFileAsString(":/shaders/rgbhistogram.vert")); + ShaderCode secondary_code(FileFunctions::ReadFileAsString(":/shaders/rgbhistogram_secondary.frag"), + FileFunctions::ReadFileAsString(":/shaders/rgbhistogram.vert")); pipeline_secondary_ = renderer()->CreateNativeShader(secondary_code); } @@ -58,8 +58,8 @@ void HistogramScope::OnDestroy() ShaderCode HistogramScope::GenerateShaderCode() { - return ShaderCode(Node::ReadFileAsString(":/shaders/rgbhistogram.frag"), - Node::ReadFileAsString(":/shaders/default.vert")); + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/rgbhistogram.frag"), + FileFunctions::ReadFileAsString(":/shaders/default.vert")); } void HistogramScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) @@ -71,11 +71,11 @@ void HistogramScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeli float histogram_base = 2.5f; float histogram_power = 1.0f / histogram_base; - Renderer::ShaderUniformMap value_map; + ShaderJob shader_job; - value_map.insert(QStringLiteral("viewport"), {QVector2D(width(), height()), NodeParam::kVec2}); - value_map.insert(QStringLiteral("histogram_scale"), {histogram_scale, NodeParam::kFloat}); - value_map.insert(QStringLiteral("histogram_power"), {histogram_power, NodeParam::kFloat}); + shader_job.InsertValue(QStringLiteral("viewport"), ShaderValue(QVector2D(width(), height()), NodeParam::kVec2)); + shader_job.InsertValue(QStringLiteral("histogram_scale"), ShaderValue(histogram_scale, NodeParam::kFloat)); + shader_job.InsertValue(QStringLiteral("histogram_power"), ShaderValue(histogram_power, NodeParam::kFloat)); if (!texture_row_sums_ || texture_row_sums_->width() != this->width() @@ -83,9 +83,13 @@ void HistogramScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeli texture_row_sums_ = renderer()->CreateTexture(VideoParams(width(), height(), managed_tex->format())); } - renderer()->Blit(managed_tex.get(), pipeline, value_map, texture_row_sums_.get()); + // Draw managed texture to a sums texture + shader_job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(managed_tex), NodeParam::kTexture)); + renderer()->BlitToTexture(pipeline, shader_job, texture_row_sums_.get()); - renderer()->Blit(texture_row_sums_.get(), pipeline_secondary_, value_map); + // Draw sums into a histogram + shader_job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(texture_row_sums_), NodeParam::kTexture)); + renderer()->Blit(pipeline_secondary_, shader_job, texture_row_sums_->params()); // Draw line overlays QPainter p(this); diff --git a/app/widget/scope/scopebase/scopebase.cpp b/app/widget/scope/scopebase/scopebase.cpp index 60aff3da6..89644e589 100644 --- a/app/widget/scope/scopebase/scopebase.cpp +++ b/app/widget/scope/scopebase/scopebase.cpp @@ -50,7 +50,11 @@ void ScopeBase::showEvent(QShowEvent* e) void ScopeBase::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) { - renderer()->Blit(managed_tex.get(), pipeline, Renderer::ShaderUniformMap()); + ShaderJob job; + + job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(managed_tex), NodeParam::kTexture)); + + renderer()->Blit(pipeline, job, VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F)); } void ScopeBase::UploadTextureFromBuffer() @@ -98,9 +102,8 @@ void ScopeBase::OnPaint() if (buffer_) { // Convert reference frame to display space - renderer()->BlitColorManaged(color_service(), texture_.get(), managed_tex_.get()); + renderer()->BlitColorManaged(color_service(), texture_, managed_tex_.get()); - renderer()->SetViewport(width(), height()); DrawScope(managed_tex_, pipeline_); } } diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index f1da05fce..618ed64b8 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -44,8 +44,8 @@ WaveformScope::~WaveformScope() ShaderCode WaveformScope::GenerateShaderCode() { - return ShaderCode(Node::ReadFileAsString(":/shaders/rgbwaveform.frag"), - Node::ReadFileAsString(":/shaders/rgbwaveform.vert")); + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/rgbwaveform.frag"), + FileFunctions::ReadFileAsString(":/shaders/rgbwaveform.vert")); } void WaveformScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) @@ -53,23 +53,28 @@ void WaveformScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipelin float waveform_scale = 0.80f; // Draw waveform through shader - Renderer::ShaderUniformMap value_map; + ShaderJob job; // Set viewport size - value_map.insert(QStringLiteral("viewport"), - {QVector2D(width(), height()), NodeParam::kVec2}); + job.InsertValue(QStringLiteral("viewport"), + ShaderValue(QVector2D(width(), height()), NodeParam::kVec2)); // Set luma coefficients float luma_coeffs[3] = {0.0f, 0.0f, 0.0f}; color_manager()->GetDefaultLumaCoefs(luma_coeffs); - value_map.insert(QStringLiteral("luma_coeffs"), - {QVector3D(luma_coeffs[0], luma_coeffs[1], luma_coeffs[2]), NodeParam::kVec3}); + job.InsertValue(QStringLiteral("luma_coeffs"), + ShaderValue(QVector3D(luma_coeffs[0], luma_coeffs[1], luma_coeffs[2]), NodeParam::kVec3)); // Scale of the waveform relative to the viewport surface. - value_map.insert(QStringLiteral("waveform_scale"), {waveform_scale, NodeParam::kFloat}); + job.InsertValue(QStringLiteral("waveform_scale"), + ShaderValue(waveform_scale, NodeParam::kFloat)); - renderer()->Blit(managed_tex.get(), pipeline, value_map); + // Insert source texture + job.InsertValue(QStringLiteral("ove_maintex"), + ShaderValue(QVariant::fromValue(managed_tex), NodeParam::kTexture)); + + renderer()->Blit(pipeline, job, VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F)); float waveform_dim_x = ceil((width() - 1.0) * waveform_scale); float waveform_dim_y = ceil((height() - 1.0) * waveform_scale); diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index b46619cbc..8e47ee9c9 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -202,6 +202,8 @@ void ViewerWidget::ConnectNodeInternal(ViewerOutput *n) using_manager = nullptr; } + auto_cacher_.SetColorManager(using_manager); + display_widget_->ConnectColorManager(using_manager); foreach (ViewerWindow* window, windows_) { window->display_widget()->ConnectColorManager(using_manager); @@ -244,6 +246,7 @@ void ViewerWidget::DisconnectNodeInternal(ViewerOutput *n) foreach (ViewerWindow* window, windows_) { window->display_widget()->DisconnectColorManager(); } + auto_cacher_.SetColorManager(nullptr); waveform_view_->SetViewer(nullptr); waveform_view_->ConnectTimelinePoints(nullptr); diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index f0dec4726..b4fb272f7 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -297,9 +297,8 @@ void ViewerDisplayWidget::OnPaint() //color_service()->pipeline()->setUniformValue("ove_deinterlace", deinterlace_); } - // Bind retrieved texture - renderer()->SetViewport(width(), height()); - renderer()->BlitColorManaged(color_service(), texture_.get()); + // Draw texture through color transform + renderer()->BlitColorManaged(color_service(), texture_, VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F)); } From 3c1ac3eeba95d573925e5af8b0534db58f16e0a5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 11 Nov 2020 21:53:24 +1100 Subject: [PATCH 21/72] upgraded to ocio v2 --- CMakeLists.txt | 2 +- app/codec/ffmpeg/ffmpegdecoder.cpp | 57 +++--- app/codec/ffmpeg/ffmpegdecoder.h | 2 +- app/codec/frame.cpp | 12 +- app/codec/frame.h | 2 +- app/common/CMakeLists.txt | 1 + app/common/ocioutils.h | 27 +++ app/config/config.cpp | 2 - .../videostreamproperties.cpp | 3 +- .../projectproperties/projectproperties.cpp | 3 +- app/render/audioplaybackcache.cpp | 2 +- app/render/backend/opengl/openglrenderer.cpp | 166 +++++++----------- app/render/backend/opengl/openglrenderer.h | 6 - app/render/backend/renderer.cpp | 101 ++++------- app/render/backend/renderer.h | 4 +- app/render/color.cpp | 94 +++++----- app/render/color.h | 56 +++--- app/render/colormanager.cpp | 12 +- app/render/colormanager.h | 11 +- app/render/colorprocessor.cpp | 55 ++++-- app/render/colorprocessor.h | 5 +- app/render/colortransform.h | 3 +- app/render/pixelformat.cpp | 22 +++ app/render/pixelformat.h | 3 + app/render/previewautocacher.cpp | 8 +- app/render/rendermanager.cpp | 7 +- app/render/rendermanager.h | 4 +- app/render/renderprocessor.cpp | 10 +- app/render/shaderinfo.h | 14 ++ app/task/export/export.cpp | 5 - app/task/project/loadotio/loadotio.cpp | 2 +- app/threading/threadpool.cpp | 8 +- app/widget/colorwheel/colorgradientwidget.cpp | 4 +- app/widget/colorwheel/colorgradientwidget.h | 2 +- app/widget/colorwheel/colorwheelwidget.cpp | 4 +- app/widget/manageddisplay/manageddisplay.h | 5 + app/widget/scope/histogram/histogram.cpp | 2 +- app/widget/scope/waveform/waveform.cpp | 4 +- app/widget/viewer/viewer.cpp | 1 + app/widget/viewer/viewerdisplay.cpp | 9 +- 40 files changed, 378 insertions(+), 362 deletions(-) create mode 100644 app/common/ocioutils.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b1f3471a..337ca5784 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,7 @@ endif() find_package(OpenGL REQUIRED) -find_package(OpenColorIO REQUIRED) +find_package(OpenColorIO 2.0.0 REQUIRED) find_package(OpenImageIO 1.6 REQUIRED) diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index 9b3ae55cd..ac4e402b7 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -51,7 +51,7 @@ OLIVE_NAMESPACE_ENTER FFmpegDecoder::FFmpegDecoder() : scale_ctx_(nullptr), scale_divider_(0), - pool_(QThread::idealThreadCount()), + pool_(QThread::idealThreadCount()*2), is_working_(false), cache_at_zero_(false), cache_at_eof_(false) @@ -120,21 +120,20 @@ FramePtr FFmpegDecoder::RetrieveStillImage(const rational &timecode, const int & if (ret >= 0) { // Create frame to return - FramePtr copy = Frame::Create(); - copy->set_video_params(VideoParams(frame->width, - frame->height, - native_pix_fmt_, - std::static_pointer_cast(stream())->pixel_aspect_ratio(), - std::static_pointer_cast(stream())->interlacing(), - divider)); - copy->set_timestamp(timecode); - copy->allocate(); + output_frame = Frame::Create(); + output_frame->set_video_params(VideoParams(frame->width, + frame->height, + native_pix_fmt_, + std::static_pointer_cast(stream())->pixel_aspect_ratio(), + std::static_pointer_cast(stream())->interlacing(), + divider)); + output_frame->set_timestamp(timecode); + output_frame->allocate(); - uint8_t* copy_data = reinterpret_cast(copy->data()); - int copy_linesize = copy->linesize_bytes(); - FFmpegFrameToNativeBuffer(frame->data, frame->linesize, ©_data, ©_linesize); + uint8_t* copy_data = reinterpret_cast(output_frame->data()); + int copy_linesize = output_frame->linesize_bytes(); - return copy; + FFmpegBufferToNativeBuffer(frame->data, frame->linesize, ©_data, ©_linesize); } else { qWarning() << "Failed to retrieve still image from decoder"; } @@ -151,6 +150,11 @@ FramePtr FFmpegDecoder::RetrieveVideoInternal(const rational &timecode, const in { VideoStreamPtr vs = std::static_pointer_cast(stream()); + if (scale_divider_ != divider) { + FreeScaler(); + InitScaler(divider); + } + if (vs->video_type() == VideoStream::kVideoTypeStill || vs->video_type() == VideoStream::kVideoTypeImageSequence) { @@ -158,8 +162,6 @@ FramePtr FFmpegDecoder::RetrieveVideoInternal(const rational &timecode, const in } else { - FFmpegFramePool::ElementPtr return_frame = nullptr; - int64_t target_ts = vs->get_time_in_timebase_units(timecode); int divided_width = VideoParams::GetScaledDimension(vs->width(), divider); @@ -171,12 +173,10 @@ FramePtr FFmpegDecoder::RetrieveVideoInternal(const rational &timecode, const in // Set new frame pool parameters pool_.SetParameters(divided_width, divided_height, native_pix_fmt_); - } else { - return_frame = GetFrameFromCache(target_ts); } // Retrieve frame - return_frame = RetrieveFrame(target_ts, divider); + FFmpegFramePool::ElementPtr return_frame = RetrieveFrame(target_ts, divider); // We found the frame, we'll return a copy if (return_frame) { @@ -563,7 +563,7 @@ uint64_t FFmpegDecoder::ValidateChannelLayout(AVStream* stream) return av_get_default_channel_layout(stream->codecpar->channels); } -void FFmpegDecoder::FFmpegFrameToNativeBuffer(uint8_t **input_data, int *input_linesize, uint8_t** output_buffer, int* output_linesize) +void FFmpegDecoder::FFmpegBufferToNativeBuffer(uint8_t **input_data, int *input_linesize, uint8_t** output_buffer, int* output_linesize) { sws_scale(scale_ctx_, input_data, @@ -640,17 +640,12 @@ void FFmpegDecoder::ClearFrameCache() FFmpegFramePool::ElementPtr FFmpegDecoder::RetrieveFrame(const int64_t& target_ts, int divider) { - if (scale_divider_ != divider) { - FreeScaler(); - InitScaler(divider); - } - int64_t seek_ts = target_ts; bool still_seeking = false; // If the frame wasn't in the frame cache, see if this frame cache is too old to use if (cached_frames_.isEmpty() - || (target_ts < cached_frames_.first()->timestamp() && target_ts > cached_frames_.last()->timestamp() + 2*second_ts_)) { + || (target_ts < cached_frames_.first()->timestamp() || target_ts > cached_frames_.last()->timestamp() + 2*second_ts_)) { ClearFrameCache(); instance_.Seek(seek_ts); @@ -659,6 +654,12 @@ FFmpegFramePool::ElementPtr FFmpegDecoder::RetrieveFrame(const int64_t& target_t } still_seeking = true; + } else { + // Search cache for frame + FFmpegFramePool::ElementPtr cached_frame = GetFrameFromCache(target_ts); + if (cached_frame) { + return cached_frame; + } } int ret; @@ -727,9 +728,9 @@ FFmpegFramePool::ElementPtr FFmpegDecoder::RetrieveFrame(const int64_t& target_t } // Store in queue, converting to native format - int destination_linesize = Frame::generate_linesize_bytes(VideoParams::GetScaledDimension(instance_.avstream()->codecpar->width, divider), native_pix_fmt_); uint8_t* destination_data = cached->data(); - FFmpegFrameToNativeBuffer(working_frame->data, working_frame->linesize, &destination_data, &destination_linesize); + int destination_linesize = Frame::generate_linesize_bytes(VideoParams::GetScaledDimension(instance_.avstream()->codecpar->width, divider), native_pix_fmt_); + FFmpegBufferToNativeBuffer(working_frame->data, working_frame->linesize, &destination_data, &destination_linesize); // Set timestamp so this frame can be identified later cached->set_timestamp(working_frame->pts); diff --git a/app/codec/ffmpeg/ffmpegdecoder.h b/app/codec/ffmpeg/ffmpegdecoder.h index 4dcb5992b..b74aa5bde 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.h +++ b/app/codec/ffmpeg/ffmpegdecoder.h @@ -130,7 +130,7 @@ private: static uint64_t ValidateChannelLayout(AVStream *stream); - void FFmpegFrameToNativeBuffer(uint8_t** input_data, int* input_linesize, uint8_t **output_buffer, int *output_linesize); + void FFmpegBufferToNativeBuffer(uint8_t** input_data, int* input_linesize, uint8_t **output_buffer, int *output_linesize); FFmpegFramePool::ElementPtr GetFrameFromCache(const int64_t& t) const; diff --git a/app/codec/frame.cpp b/app/codec/frame.cpp index 8b06cfbe6..9abdac922 100644 --- a/app/codec/frame.cpp +++ b/app/codec/frame.cpp @@ -45,14 +45,14 @@ void Frame::set_video_params(const VideoParams ¶ms) { params_ = params; - linesize_ = generate_linesize_bytes(params_.width(), params_.format()); + linesize_ = generate_linesize_bytes(width(), params_.format()); linesize_pixels_ = linesize_ / PixelFormat::BytesPerPixel(params_.format()); } int Frame::generate_linesize_bytes(int width, PixelFormat::Format format) { // Align to 32 bytes (not sure if this is necessary?) - return ((PixelFormat::BytesPerPixel(format) * width) + 31) & ~31; + return PixelFormat::BytesPerPixel(format) * ((width + 31) & ~31); } Color Frame::get_pixel(int x, int y) const @@ -82,15 +82,17 @@ void Frame::set_pixel(int x, int y, const Color &c) c.toData(data_.data() + byte_offset, video_params().format()); } -void Frame::allocate() +bool Frame::allocate() { // Assume this frame is intended to be a video frame if (!params_.is_valid()) { qWarning() << "Tried to allocate a frame with invalid parameters"; - return; + return false; } - data_.resize(PixelFormat::GetBufferSize(params_.format(), linesize_, params_.height())); + data_.resize(PixelFormat::GetBufferSize(params_.format(), linesize_, height())); + + return true; } OLIVE_NAMESPACE_EXIT diff --git a/app/codec/frame.h b/app/codec/frame.h index 57938096d..8c89902b9 100644 --- a/app/codec/frame.h +++ b/app/codec/frame.h @@ -116,7 +116,7 @@ public: * * If a memory buffer has been previously allocated without destroying, this function will destroy it. */ - void allocate(); + bool allocate(); /** * @brief Return whether the frame is allocated or not diff --git a/app/common/CMakeLists.txt b/app/common/CMakeLists.txt index 847d6e426..553af7017 100644 --- a/app/common/CMakeLists.txt +++ b/app/common/CMakeLists.txt @@ -37,6 +37,7 @@ set(OLIVE_SOURCES common/lerp.h common/memorypool.h common/memorypool.cpp + common/ocioutils.h common/qtutils.h common/qtutils.cpp common/range.h diff --git a/app/common/ocioutils.h b/app/common/ocioutils.h new file mode 100644 index 000000000..a290a1e50 --- /dev/null +++ b/app/common/ocioutils.h @@ -0,0 +1,27 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef OCIOUTILS_H +#define OCIOUTILS_H + +#include +namespace OCIO = OpenColorIO_v2_0dev; + +#endif // OCIOUTILS_H diff --git a/app/config/config.cpp b/app/config/config.cpp index f2db463d7..a40718a8d 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -121,8 +121,6 @@ void Config::SetDefaults() // Online/offline settings SetEntryInternal(QStringLiteral("OnlinePixelFormat"), NodeParam::kInt, PixelFormat::PIX_FMT_RGBA32F); SetEntryInternal(QStringLiteral("OfflinePixelFormat"), NodeParam::kInt, PixelFormat::PIX_FMT_RGBA16F); - SetEntryInternal(QStringLiteral("OnlineOCIOMethod"), NodeParam::kInt, ColorManager::kOCIOAccurate); - SetEntryInternal(QStringLiteral("OfflineOCIOMethod"), NodeParam::kInt, ColorManager::kOCIOFast); } void Config::Load() diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index 0aaca3a43..b9bf9112d 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -25,9 +25,8 @@ #include #include #include -#include -namespace OCIO = OCIO_NAMESPACE::v1; +#include "common/ocioutils.h" #include "core.h" #include "project/item/footage/footage.h" #include "project/project.h" diff --git a/app/dialog/projectproperties/projectproperties.cpp b/app/dialog/projectproperties/projectproperties.cpp index 5a8713f5c..509a47e61 100644 --- a/app/dialog/projectproperties/projectproperties.cpp +++ b/app/dialog/projectproperties/projectproperties.cpp @@ -27,10 +27,9 @@ #include #include #include -#include -namespace OCIO = OCIO_NAMESPACE::v1; #include "common/filefunctions.h" +#include "common/ocioutils.h" #include "config/config.h" #include "core.h" #include "render/colormanager.h" diff --git a/app/render/audioplaybackcache.cpp b/app/render/audioplaybackcache.cpp index 595b76620..a4997c035 100644 --- a/app/render/audioplaybackcache.cpp +++ b/app/render/audioplaybackcache.cpp @@ -157,7 +157,7 @@ void AudioPlaybackCache::WriteSilence(const TimeRange &range, qint64 job_time) void AudioPlaybackCache::ShiftEvent(const rational &from_in_time, const rational &to_in_time) { - if (from_in_time == to_in_time) { + if (from_in_time == to_in_time || GetLength().isNull()) { // Nothing to be done return; } diff --git a/app/render/backend/opengl/openglrenderer.cpp b/app/render/backend/opengl/openglrenderer.cpp index 117ffdeae..a435bfd75 100644 --- a/app/render/backend/opengl/openglrenderer.cpp +++ b/app/render/backend/opengl/openglrenderer.cpp @@ -21,6 +21,7 @@ #include "openglrenderer.h" #include +#include OLIVE_NAMESPACE_ENTER @@ -44,16 +45,6 @@ const QVector blit_texcoords = { 1.0f, 1.0f }; -const QVector flipped_blit_texcoords = { - 0.0f, 1.0f, - 1.0f, 1.0f, - 1.0f, 0.0f, - - 0.0f, 1.0f, - 0.0f, 0.0f, - 1.0f, 0.0f -}; - OpenGLRenderer::OpenGLRenderer(QObject* parent) : Renderer(parent), context_(nullptr) @@ -110,33 +101,11 @@ void OpenGLRenderer::PostInit() // Set up framebuffer used for various things functions_->glGenFramebuffers(1, &framebuffer_); - - // Set up vertex array object - vao_.create(); - - // Set up vertex buffer - vert_vbo_.create(); - vert_vbo_.bind(); - vert_vbo_.allocate(blit_vertices.constData(), blit_vertices.size() * sizeof(GLfloat)); - vert_vbo_.release(); - - // Set up fragment buffer - frag_vbo_.create(); - frag_vbo_.bind(); - frag_vbo_.allocate(blit_texcoords.constData(), blit_texcoords.size() * sizeof(GLfloat)); - frag_vbo_.release(); } void OpenGLRenderer::Destroy() { if (context_) { - // Delete buffers - vert_vbo_.destroy(); - frag_vbo_.destroy(); - - // Delete vertex array object - vao_.destroy(); - // Delete framebuffer functions_->glDeleteFramebuffers(1, &framebuffer_); @@ -181,12 +150,19 @@ QVariant OpenGLRenderer::CreateNativeTexture(VideoParams p, void *data, int line functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); + GLint current_tex; + functions_->glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_tex); + + functions_->glBindTexture(GL_TEXTURE_2D, texture); + functions_->glTexImage2D(GL_TEXTURE_2D, 0, GetInternalFormat(p.format()), - p.width(), p.height(), 0, GL_RGBA, + p.effective_width(), p.effective_height(), 0, GL_RGBA, GetPixelType(p.format()), data); functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + functions_->glBindTexture(GL_TEXTURE_2D, current_tex); + return texture; } @@ -215,8 +191,6 @@ QVariant OpenGLRenderer::CreateNativeShader(ShaderCode code) goto error; } - qDebug() << "Shader created successfully"; - return Node::PtrToValue(program); error: @@ -254,13 +228,12 @@ void OpenGLRenderer::UploadToTexture(Texture *texture, void *data, int linesize) void OpenGLRenderer::DownloadFromTexture(Texture* texture, void *data, int linesize) { - GLuint t = texture->id().value(); const VideoParams& p = texture->params(); GLint current_tex; functions_->glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_tex); - functions_->glBindTexture(GL_TEXTURE_2D, t); + AttachTextureAsDestination(texture); functions_->glPixelStorei(GL_PACK_ROW_LENGTH, linesize); @@ -274,6 +247,8 @@ void OpenGLRenderer::DownloadFromTexture(Texture* texture, void *data, int lines functions_->glPixelStorei(GL_PACK_ROW_LENGTH, 0); + DetachTextureAsDestination(); + functions_->glBindTexture(GL_TEXTURE_2D, current_tex); } @@ -315,23 +290,6 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat shader->setUniformValue(variable_location, value.data.toFloat()); break; case NodeInput::kVec2: - /*if (corresponding_input && corresponding_input->IsArray()) { - QVector nv = value.value< QVector >(); - QVector a(nv.size()); - - for (int j=0;j(); - } - - shader->setUniformValueArray(variable_location, a.constData(), a.size()); - - int count_location = shader->uniformLocation(QStringLiteral("%1_count").arg(it.key())); - if (count_location > -1) { - shader->setUniformValue(count_location, a.size()); - } - } else { - - }*/ shader->setUniformValue(variable_location, value.data.value()); break; case NodeInput::kVec3: @@ -349,8 +307,8 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat case NodeInput::kColor: { Color color = value.data.value(); - - shader->setUniformValue(variable_location, color.red(), color.green(), color.blue(), color.alpha()); + shader->setUniformValue(variable_location, + color.red(), color.green(), color.blue(), color.alpha()); break; } case NodeInput::kBoolean: @@ -423,14 +381,6 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat } } - // Set ove_resolution to the destination to the "logical" resolution of the destination - shader->setUniformValue("ove_resolution", - static_cast(destination_params.width()), - static_cast(destination_params.height())); - - // Set the viewport to the "physical" resolution of the destination - functions_->glViewport(0, 0, destination_params.effective_width(), destination_params.effective_height()); - // Bind all textures for (int i=0; iglActiveTexture(GL_TEXTURE0 + i); @@ -438,10 +388,37 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat PrepareInputTexture(job.GetBilinearFiltering()); } + // Set ove_resolution to the destination to the "logical" resolution of the destination + shader->setUniformValue("ove_resolution", + static_cast(destination_params.width()), + static_cast(destination_params.height())); + + // Set matrix to identity + shader->setUniformValue("ove_mvpmat", job.GetMatrix()); + + // Set the viewport to the "physical" resolution of the destination + functions_->glViewport(0, 0, + destination_params.effective_width(), + destination_params.effective_height()); + // Bind vertex array object + QOpenGLVertexArrayObject vao_; + vao_.create(); vao_.bind(); // Set buffers + QOpenGLBuffer vert_vbo_; + vert_vbo_.create(); + vert_vbo_.bind(); + vert_vbo_.allocate(blit_vertices.constData(), blit_vertices.size() * sizeof(GLfloat)); + vert_vbo_.release(); + + QOpenGLBuffer frag_vbo_; + frag_vbo_.create(); + frag_vbo_.bind(); + frag_vbo_.allocate(blit_texcoords.constData(), blit_texcoords.size() * sizeof(GLfloat)); + frag_vbo_.release(); + int vertex_location = shader->attributeLocation("a_position"); vert_vbo_.bind(); functions_->glEnableVertexAttribArray(vertex_location); @@ -493,21 +470,21 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat DetachTextureAsDestination(); } } else { - // Always draw to output_tex + // Always draw to output_tex, which gets swapped with input_tex every iteration AttachTextureAsDestination(output_tex.get()); - - if (iteration > 0) { - // If this is not the first iteration, replace the iterative texture with the one we - // last drew - functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); - functions_->glBindTexture(GL_TEXTURE_2D, input_tex->id().value()); - PrepareInputTexture(job.GetBilinearFiltering()); - } - - // Swap so that the next iteration, the texture we draw now will be the input texture next - std::swap(output_tex, input_tex); } + if (iteration > 0) { + // If this is not the first iteration, replace the iterative texture with the one we + // last drew + functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); + functions_->glBindTexture(GL_TEXTURE_2D, input_tex->id().value()); + PrepareInputTexture(job.GetBilinearFiltering()); + } + + // Swap so that the next iteration, the texture we draw now will be the input texture next + std::swap(output_tex, input_tex); + // Blit this texture through this shader functions_->glDrawArrays(GL_TRIANGLES, 0, blit_vertices.size() / 3); } @@ -526,41 +503,16 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat functions_->glBindTexture(GL_TEXTURE_2D, 0); } - // Release vertex array object - vao_.release(); - // Release shader shader->release(); + + // Release vertex array object + frag_vbo_.destroy(); + vert_vbo_.destroy(); + vao_.release(); + vao_.destroy(); } -/*void OpenGLRenderer::Blit(Renderer::Texture *source, QVariant shader, Renderer::ShaderUniformMap parameters, Renderer::Texture *destination) -{ - QOpenGLShaderProgram* program = Node::ValueToPtr(shader); - - if (!program) { - qCritical() << "Attempted to blit with a null shader"; - return; - } - - if (destination) { - AttachTextureAsDestination(destination); - } - - functions_->glBindTexture(GL_TEXTURE_2D, source->id().value()); - - program->bind(); - - qCritical() << "OpenGLRenderer::Blit is a stub!"; - - program->release(); - - functions_->glBindTexture(GL_TEXTURE_2D, 0); - - if (destination) { - DetachTextureAsDestination(); - } -}*/ - GLint OpenGLRenderer::GetInternalFormat(PixelFormat::Format format) { switch (format) { diff --git a/app/render/backend/opengl/openglrenderer.h b/app/render/backend/opengl/openglrenderer.h index 7634efc4f..12b6e2a40 100644 --- a/app/render/backend/opengl/openglrenderer.h +++ b/app/render/backend/opengl/openglrenderer.h @@ -86,12 +86,6 @@ private: QOffscreenSurface surface_; - QOpenGLVertexArrayObject vao_; - - QOpenGLBuffer vert_vbo_; - - QOpenGLBuffer frag_vbo_; - GLuint framebuffer_; }; diff --git a/app/render/backend/renderer.cpp b/app/render/backend/renderer.cpp index 33897c7b1..b2bf0ee04 100644 --- a/app/render/backend/renderer.cpp +++ b/app/render/backend/renderer.cpp @@ -20,11 +20,9 @@ #include "renderer.h" -#include -namespace OCIO = OCIO_NAMESPACE::v1; - #include +#include "common/ocioutils.h" #include "render/colormanager.h" OLIVE_NAMESPACE_ENTER @@ -54,83 +52,62 @@ const int OCIO_LUT3D_ENTRY_COUNT = 3 * OCIO_LUT3D_PIXEL_COUNT; const int OCIO_LUT3D_ENTRY_COUNT_WITH_ALPHA = 4 * OCIO_LUT3D_PIXEL_COUNT; const int OCIO_LUT2D_EDGE_SIZE = 512;*/ -void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination) +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, bool flipped) { + qDebug() << "BlitColorManaged is a partial stub"; + + QVariant shader = CreateNativeShader(ShaderCode(FileFunctions::ReadFileAsString(":/shaders/default.frag"), FileFunctions::ReadFileAsString(":/shaders/default.vert"))); + + ShaderJob job; + job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); + + if (flipped) { + QMatrix4x4 mat; + mat.scale(1, -1, 1); + job.SetMatrix(mat); + } + + BlitToTexture(shader, job, destination); + + DestroyNativeShader(shader); +} + +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, bool flipped) +{ + qDebug() << "BlitColorManaged is a partial stub"; + /*ColorContext color_ctx; if (color_cache_.contains(color_processor->id())) { color_ctx = color_cache_.value(color_processor->id()); } else { - // Generate OCIO color context - - // Generate OCIO shader descriptor + // Create shader description const char* ocio_func_name = "OCIODisplay"; - OCIO::GpuShaderDesc shader_desc; - shader_desc.setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_0); - shader_desc.setFunctionName(ocio_func_name); - shader_desc.setLut3DEdgeLen(OCIO_LUT3D_EDGE_SIZE); + OCIO::GpuShaderDescRcPtr shader_desc = OCIO::GpuShaderDesc::CreateShaderDesc(); + shader_desc->setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_2); + shader_desc->setFunctionName(ocio_func_name); + shader_desc->setResourcePrefix("ocio_"); - // Generate LUT - QVector lut_data(OCIO_LUT3D_ENTRY_COUNT); - color_processor->GetProcessor()->getGpuLut3D(lut_data.data(), shader_desc); + // Generate shader + color_processor->GetProcessor()->getDefaultGPUProcessor()->extractGpuShaderInfo(shader_desc); - // Convert to half float RGBA - QVector texture_ready_lut_data(OCIO_LUT3D_ENTRY_COUNT_WITH_ALPHA); - for (int i=0; iGetProcessor()->getGpuShaderText(shader_desc); - ocio_code.replace(QStringLiteral("texture3D"), QStringLiteral("texture2D")); - ocio_code.replace(QStringLiteral("sampler3D"), QStringLiteral("sampler2D")); - - - - qDebug() << frag_code; - - //qDebug() << "FIXME: GPU doesn't handle associated alpha yet"; + qDebug() << "Shader:" << shader_desc->getShaderText(); }*/ - qDebug() << "BlitColorManaged is a partial stub"; - QVariant shader = CreateNativeShader(ShaderCode(FileFunctions::ReadFileAsString(":/shaders/default.frag"), FileFunctions::ReadFileAsString(":/shaders/default.vert"))); ShaderJob job; job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); - BlitToTexture(shader, job, destination); -} - -void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params) -{ - qDebug() << "BlitColorManaged is a partial stub"; - - QVariant shader = CreateNativeShader(ShaderCode(FileFunctions::ReadFileAsString(":/shaders/default.frag"), FileFunctions::ReadFileAsString(":/shaders/default.vert"))); - - ShaderJob job; - job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); + if (flipped) { + QMatrix4x4 mat; + mat.scale(1, -1, 1); + job.SetMatrix(mat); + } Blit(shader, job, params); + + DestroyNativeShader(shader); } OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/renderer.h b/app/render/backend/renderer.h index 382228244..356299fcb 100644 --- a/app/render/backend/renderer.h +++ b/app/render/backend/renderer.h @@ -135,8 +135,8 @@ public: Blit(shader, job, nullptr, params); } - void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture* destination); - void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params); + void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture* destination, bool flipped = false); + void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, bool flipped = false); public slots: virtual void PostInit() = 0; diff --git a/app/render/color.cpp b/app/render/color.cpp index 3c47f7e81..67151413e 100644 --- a/app/render/color.cpp +++ b/app/render/color.cpp @@ -24,41 +24,41 @@ OLIVE_NAMESPACE_ENTER -Color Color::fromHsv(const float &h, const float &s, const float &v) +Color Color::fromHsv(const double &h, const double &s, const double &v) { - float C = s * v; - float X = C * (1.0f - abs(fmod(h / 60.0f, 2.0f) - 1.0f)); - float m = v - C; - float Rs, Gs, Bs; + double C = s * v; + double X = C * (1.0 - abs(fmod(h / 60.0, 2.0) - 1.0)); + double m = v - C; + double Rs, Gs, Bs; - if(h >= 0.0f && h < 60.0f) { + if(h >= 0.0 && h < 60.0) { Rs = C; Gs = X; - Bs = 0.0f; + Bs = 0.0; } - else if(h >= 60.0f && h < 120.0f) { + else if(h >= 60.0 && h < 120.0) { Rs = X; Gs = C; - Bs = 0.0f; + Bs = 0.0; } - else if(h >= 120.0f && h < 180.0f) { - Rs = 0.0f; + else if(h >= 120.0 && h < 180.0) { + Rs = 0.0; Gs = C; Bs = X; } - else if(h >= 180.0f && h < 240.0f) { - Rs = 0.0f; + else if(h >= 180.0 && h < 240.0) { + Rs = 0.0; Gs = X; Bs = C; } - else if(h >= 240.0f && h < 300.0f) { + else if(h >= 240.0 && h < 300.0) { Rs = X; - Gs = 0.0f; + Gs = 0.0; Bs = C; } else { Rs = C; - Gs = 0.0f; + Gs = 0.0; Bs = X; } @@ -78,11 +78,11 @@ Color::Color(const QColor &c) set_alpha(c.alphaF()); } -void Color::toHsv(float *hue, float *sat, float *val) const +void Color::toHsv(double *hue, double *sat, double *val) const { - float fCMax = qMax(qMax(red(), green()), blue()); - float fCMin = qMin(qMin(red(), green()), blue()); - float fDelta = fCMax - fCMin; + double fCMax = qMax(qMax(red(), green()), blue()); + double fCMin = qMin(qMin(red(), green()), blue()); + double fDelta = fCMax - fCMin; if(fDelta > 0) { if(fCMax == red()) { @@ -111,31 +111,31 @@ void Color::toHsv(float *hue, float *sat, float *val) const } } -float Color::hsv_hue() const +double Color::hsv_hue() const { - float h, s, v; + double h, s, v; toHsv(&h, &s, &v); return h; } -float Color::hsv_saturation() const +double Color::hsv_saturation() const { - float h, s, v; + double h, s, v; toHsv(&h, &s, &v); return s; } -float Color::value() const +double Color::value() const { - float h, s, v; + double h, s, v; toHsv(&h, &s, &v); return v; } -void Color::toHsl(float *hue, float *sat, float *lightness) const +void Color::toHsl(double *hue, double *sat, double *lightness) const { - float fCMin = qMin(red(), qMin(green(), blue())); - float fCMax = qMax(red(), qMax(green(), blue())); + double fCMin = qMin(red(), qMin(green(), blue())); + double fCMax = qMax(red(), qMax(green(), blue())); *lightness = 0.5 * (fCMin + fCMax); @@ -173,30 +173,30 @@ void Color::toHsl(float *hue, float *sat, float *lightness) const } } -float Color::hsl_hue() const +double Color::hsl_hue() const { - float h, s, l; + double h, s, l; toHsl(&h, &s, &l); return h; } -float Color::hsl_saturation() const +double Color::hsl_saturation() const { - float h, s, l; + double h, s, l; toHsl(&h, &s, &l); return s; } -float Color::lightness() const +double Color::lightness() const { - float h, s, l; + double h, s, l; toHsl(&h, &s, &l); return l; } void Color::toData(char *data, const PixelFormat::Format &format) const { - OIIO::convert_types(OIIO::TypeDesc::FLOAT, + OIIO::convert_types(OIIO::TypeDesc::DOUBLE, data_, PixelFormat::GetOIIOTypeDesc(format), data, @@ -209,7 +209,7 @@ Color Color::fromData(const char *data, const PixelFormat::Format &format) OIIO::convert_types(PixelFormat::GetOIIOTypeDesc(format), data, - OIIO::TypeDesc::FLOAT, + OIIO::TypeDesc::DOUBLE, c.data_, kRGBAChannels); @@ -221,17 +221,17 @@ QColor Color::toQColor() const QColor c; // QColor only supports values from 0.0 to 1.0 and are only used for UI representations - c.setRedF(clamp(red(), 0.0f, 1.0f)); - c.setGreenF(clamp(green(), 0.0f, 1.0f)); - c.setBlueF(clamp(blue(), 0.0f, 1.0f)); - c.setAlphaF(clamp(alpha(), 0.0f, 1.0f)); + c.setRedF(clamp(red(), 0.0, 1.0)); + c.setGreenF(clamp(green(), 0.0, 1.0)); + c.setBlueF(clamp(blue(), 0.0, 1.0)); + c.setAlphaF(clamp(alpha(), 0.0, 1.0)); return c; } -float Color::GetRoughLuminance() const +double Color::GetRoughLuminance() const { - return (2*red()+blue()+3*green())/6.0f; + return (2*red()+blue()+3*green())/6.0; } const Color &Color::operator+=(const Color &rhs) @@ -252,7 +252,7 @@ const Color &Color::operator-=(const Color &rhs) return *this; } -const Color &Color::operator*=(const float &rhs) +const Color &Color::operator*=(const double &rhs) { for (int i=0;igetDefaultLumaCoefs(rgb); } @@ -320,16 +320,6 @@ Color ColorManager::GetDefaultLumaCoefs() const return c; } -ColorManager::OCIOMethod ColorManager::GetOCIOMethodForMode(RenderMode::Mode mode) -{ - return static_cast(Core::GetPreferenceForRenderMode(mode, QStringLiteral("OCIOMethod")).toInt()); -} - -void ColorManager::SetOCIOMethodForMode(RenderMode::Mode mode, ColorManager::OCIOMethod method) -{ - Core::SetPreferenceForRenderMode(mode, QStringLiteral("OCIOMethod"), method); -} - void ColorManager::AssociateAlphaPixFmtFilter(ColorManager::AlphaAction action, FramePtr f) { int pixel_count = f->width() * f->height() * kRGBAChannels; diff --git a/app/render/colormanager.h b/app/render/colormanager.h index b8eecdda3..c0ffab26d 100644 --- a/app/render/colormanager.h +++ b/app/render/colormanager.h @@ -82,18 +82,9 @@ public: static QStringList ListAvailableColorspaces(OCIO::ConstConfigRcPtr config); - void GetDefaultLumaCoefs(float* rgb) const; + void GetDefaultLumaCoefs(double *rgb) const; Color GetDefaultLumaCoefs() const; - enum OCIOMethod { - kOCIOFast, - kOCIOAccurate - }; - - static OCIOMethod GetOCIOMethodForMode(RenderMode::Mode mode); - - static void SetOCIOMethodForMode(RenderMode::Mode mode, OCIOMethod method); - class SetLocale { public: diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index e33942fd2..6ea08ff41 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -33,19 +33,35 @@ ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const const QString& view = (transform.view().isEmpty()) ? config->GetDefaultView(output) : transform.view(); - OCIO::DisplayTransformRcPtr display_transform = OCIO::DisplayTransform::Create(); + auto display_transform = OCIO::DisplayViewTransform::Create(); - display_transform->setInputColorSpaceName(input.toUtf8()); + display_transform->setSrc(input.toUtf8()); display_transform->setDisplay(output.toUtf8()); display_transform->setView(view.toUtf8()); - if (!transform.look().isEmpty()) { - display_transform->setLooksOverride(transform.look().toUtf8()); - display_transform->setLooksOverrideEnabled(true); - } - OCIO_SET_C_LOCALE_FOR_SCOPE; - processor_ = config->GetConfig()->getProcessor(display_transform); + + if (transform.look().isEmpty()) { + processor_ = config->GetConfig()->getProcessor(display_transform); + } else { + auto group = OCIO::GroupTransform::Create(); + + const char* out_cs = OCIO::LookTransform::GetLooksResultColorSpace(config->GetConfig(), + config->GetConfig()->getCurrentContext(), + transform.look().toUtf8()); + + auto lt = OCIO::LookTransform::Create(); + lt->setSrc(input.toUtf8()); + lt->setDst(out_cs); + lt->setLooks(transform.look().toUtf8()); + lt->setSkipColorSpaceConversion(false); + group->appendTransform(lt); + + display_transform->setSrc(out_cs); + group->appendTransform(display_transform); + + processor_ = config->GetConfig()->getProcessor(group); + } } else { @@ -55,26 +71,39 @@ ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const } + cpu_processor_ = processor_->getDefaultCPUProcessor(); id_ = GenerateID(config, input, transform); } void ColorProcessor::ConvertFrame(Frame *f) { - OCIO::PackedImageDesc img(reinterpret_cast(f->data()), + OCIO::BitDepth ocio_bit_depth = PixelFormat::GetOCIOBitDepthFromPixelFormat(f->format()); + + if (ocio_bit_depth == OCIO::BIT_DEPTH_UNKNOWN) { + qCritical() << "Tried to color convert frame with no format"; + return; + } + + OCIO::PackedImageDesc img(f->data(), f->width(), f->height(), kRGBAChannels, + ocio_bit_depth, OCIO::AutoStride, OCIO::AutoStride, f->linesize_bytes()); - processor_->apply(img); + cpu_processor_->apply(img); } -Color ColorProcessor::ConvertColor(Color in) +Color ColorProcessor::ConvertColor(const Color& in) { - processor_->applyRGBA(in.data()); - return in; + // I've been bamboozled + float c[4] = {float(in.red()), float(in.green()), float(in.blue()), float(in.alpha())}; + + cpu_processor_->applyRGBA(c); + + return Color(c[0], c[1], c[2], c[3]); } QString ColorProcessor::GenerateID(ColorManager *config, const QString &input, const ColorTransform &transform) diff --git a/app/render/colorprocessor.h b/app/render/colorprocessor.h index f2c2e6a2e..5d0b9a8f1 100644 --- a/app/render/colorprocessor.h +++ b/app/render/colorprocessor.h @@ -22,6 +22,7 @@ #define COLORPROCESSOR_H #include "codec/frame.h" +#include "common/ocioutils.h" #include "render/color.h" #include "render/colortransform.h" @@ -51,7 +52,7 @@ public: void ConvertFrame(FramePtr f); void ConvertFrame(Frame* f); - Color ConvertColor(Color in); + Color ConvertColor(const Color &in); const QString& id() const { @@ -63,6 +64,8 @@ public: private: OCIO::ConstProcessorRcPtr processor_; + OCIO::ConstCPUProcessorRcPtr cpu_processor_; + QString id_; }; diff --git a/app/render/colortransform.h b/app/render/colortransform.h index 45e605c8d..e0aa67f83 100644 --- a/app/render/colortransform.h +++ b/app/render/colortransform.h @@ -21,11 +21,10 @@ #ifndef COLORTRANSFORM_H #define COLORTRANSFORM_H -#include - #include #include "common/define.h" +#include "common/ocioutils.h" OLIVE_NAMESPACE_ENTER diff --git a/app/render/pixelformat.cpp b/app/render/pixelformat.cpp index 9cde0a269..9aee69783 100644 --- a/app/render/pixelformat.cpp +++ b/app/render/pixelformat.cpp @@ -86,6 +86,28 @@ QString PixelFormat::GetName(const PixelFormat::Format &format) return tr("Unknown (%1)").arg(format); } +OCIO::BitDepth PixelFormat::GetOCIOBitDepthFromPixelFormat(PixelFormat::Format format) +{ + switch (format) { + case PixelFormat::PIX_FMT_RGBA8: + return OCIO::BIT_DEPTH_UINT8; + case PixelFormat::PIX_FMT_RGBA16U: + return OCIO::BIT_DEPTH_UINT16; + break; + case PixelFormat::PIX_FMT_RGBA16F: + return OCIO::BIT_DEPTH_F16; + break; + case PixelFormat::PIX_FMT_RGBA32F: + return OCIO::BIT_DEPTH_F32; + break; + case PixelFormat::PIX_FMT_INVALID: + case PixelFormat::PIX_FMT_COUNT: + break; + } + + return OCIO::BIT_DEPTH_UNKNOWN; +} + PixelFormat* PixelFormat::instance_ = nullptr; void PixelFormat::CreateInstance() diff --git a/app/render/pixelformat.h b/app/render/pixelformat.h index 4808aa35a..c60027c93 100644 --- a/app/render/pixelformat.h +++ b/app/render/pixelformat.h @@ -26,6 +26,7 @@ #include #include +#include "common/ocioutils.h" #include "render/rendermodes.h" OLIVE_NAMESPACE_ENTER @@ -116,6 +117,8 @@ public: */ static QString GetName(const Format& format); + static OCIO::BitDepth GetOCIOBitDepthFromPixelFormat(PixelFormat::Format format); + signals: void FormatChanged(); diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index cbf09a06f..eb673f8c8 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -585,7 +585,9 @@ void PreviewAutoCacher::TryRender() watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, color_manager_, single_frame_render_->property("time").value(), - RenderMode::kOffline, true)); + RenderMode::kOffline, + viewer_node_->video_frame_cache(), + true)); single_frame_render_ = nullptr; } @@ -626,7 +628,9 @@ void PreviewAutoCacher::RequeueFrames() video_tasks_.insert(watcher, hash); watcher->SetTicket(RenderManager::instance()->RenderFrame(copied_viewer_node_, color_manager_, - t, RenderMode::kOffline, false)); + t, RenderMode::kOffline, + viewer_node_->video_frame_cache(), + false)); } } diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 9ad31cd65..2aa648fd5 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -93,7 +93,7 @@ QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const r return hasher.result(); } -RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager *color_manager, const rational &time, RenderMode::Mode mode, bool prioritize) +RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager *color_manager, const rational &time, RenderMode::Mode mode, FrameHashCache *cache, bool prioritize) { return RenderFrame(viewer, color_manager, @@ -101,10 +101,11 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager *c mode, QSize(0, 0), QMatrix4x4(), + cache, prioritize); } -RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational &time, RenderMode::Mode mode, const QSize &force_size, const QMatrix4x4 &matrix, bool prioritize) +RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational &time, RenderMode::Mode mode, const QSize &force_size, const QMatrix4x4 &matrix, FrameHashCache *cache, bool prioritize) { // Create ticket RenderTicketPtr ticket = std::make_shared(); @@ -115,7 +116,7 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* c ticket->setProperty("matrix", matrix); ticket->setProperty("mode", mode); ticket->setProperty("type", kTypeVideo); - ticket->setProperty("cache", viewer->video_frame_cache()->GetCacheDirectory()); + ticket->setProperty("cache", cache->GetCacheDirectory()); ticket->setProperty("colormanager", Node::PtrToValue(color_manager)); // Queue appending the ticket and running the next job on our thread to make this function thread-safe diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 5277c83bd..f170e2aa2 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -80,8 +80,8 @@ public: * * This function is thread-safe. */ - RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, bool prioritize = false); - RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, const QSize& force_size, const QMatrix4x4& matrix, bool prioritize = false); + RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, FrameHashCache* cache = nullptr, bool prioritize = false); + RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, const QSize& force_size, const QMatrix4x4& matrix, FrameHashCache* cache = nullptr, bool prioritize = false); /** * @brief Asynchronously generate a chunk of audio diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index e18712446..34b612ec6 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -297,7 +297,7 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & qDebug() << "FIXME: Accessing video_stream->colorspace() may cause race conditions"; - ColorManager* color_manager = video_stream->footage()->project()->color_manager(); + ColorManager* color_manager = Node::ValueToPtr(ticket_->property("colormanager")); ColorProcessorPtr processor = ColorProcessor::Create(color_manager, video_stream->colorspace(), ColorTransform(OCIO::ROLE_SCENE_LINEAR)); @@ -434,7 +434,7 @@ QVariant RenderProcessor::ProcessFrameGeneration(const Node *node, const Generat QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) { - if (ticket_->property("mode").toInt() == RenderMode::kOffline + if (!ticket_->property("cache").toString().isEmpty() && node->id() == QStringLiteral("org.olivevideoeditor.Olive.videoinput")) { const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); @@ -442,6 +442,8 @@ QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) FramePtr f = FrameHashCache::LoadCacheFrame(ticket_->property("cache").toString(), hash); + qDebug() << ticket_->property("cache").toString() << hash.toHex(); + if (f) { // The cached frame won't load with the correct divider by default, so we enforce it here VideoParams p = f->video_params(); @@ -452,8 +454,12 @@ QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) f->set_video_params(p); + qDebug() << "Using cached frame!"; + Renderer::TexturePtr texture = render_ctx_->CreateTexture(f->video_params(), f->data(), f->linesize_pixels()); return QVariant::fromValue(texture); + } else { + qDebug() << "Not using cached frame because frame is null"; } } diff --git a/app/render/shaderinfo.h b/app/render/shaderinfo.h index 680b32bef..3dc69f681 100644 --- a/app/render/shaderinfo.h +++ b/app/render/shaderinfo.h @@ -1,6 +1,8 @@ #ifndef SHADERINFO_H #define SHADERINFO_H +#include + #include "codec/samplebuffer.h" #include "common/filefunctions.h" #include "node/input.h" @@ -142,6 +144,16 @@ public: bilinear_ = true; } + const QMatrix4x4& GetMatrix() const + { + return matrix_; + } + + void SetMatrix(const QMatrix4x4& matrix) + { + matrix_ = matrix; + } + const QString& GetShaderID() const { return shader_id_; @@ -192,6 +204,8 @@ private: bool bilinear_; + QMatrix4x4 matrix_; + }; class ShaderCode { diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index a74445eab..d5da32ae5 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -114,11 +114,6 @@ bool ExportTask::Run() void FrameColorConvert(ColorProcessorPtr processor, FramePtr frame) { - // OCIO conversion requires a frame in 32F format - if (frame->format() != PixelFormat::PIX_FMT_RGBA32F) { - frame = PixelFormat::ConvertPixelFormat(frame, PixelFormat::PIX_FMT_RGBA32F); - } - // Color conversion must be done with unassociated alpha, and the pipeline is always associated ColorManager::DisassociateAlpha(frame); diff --git a/app/task/project/loadotio/loadotio.cpp b/app/task/project/loadotio/loadotio.cpp index 78799e389..8efcc91aa 100644 --- a/app/task/project/loadotio/loadotio.cpp +++ b/app/task/project/loadotio/loadotio.cpp @@ -166,7 +166,7 @@ bool LoadOTIOTask::Run() if (imported_footage.contains(footage_url)) { probed_item = imported_footage.value(footage_url); } else { - probed_item = Decoder::ProbeMedia(project_.get(), footage_url, &IsCancelled()); + probed_item = Decoder::Probe(project_.get(), footage_url, &IsCancelled()); imported_footage.insert(footage_url, probed_item); project_->root()->add_child(probed_item); } diff --git a/app/threading/threadpool.cpp b/app/threading/threadpool.cpp index b89a00ee9..9e7f26206 100644 --- a/app/threading/threadpool.cpp +++ b/app/threading/threadpool.cpp @@ -114,7 +114,7 @@ void ThreadPoolThread::RunTicket(RenderTicketPtr ticket) void ThreadPoolThread::run() { - while (!IsCancelled()) { + while (true) { wait_cond_.wait(&mutex_); if (ticket_) { @@ -122,7 +122,11 @@ void ThreadPoolThread::run() ticket_ = nullptr; } - emit Done(); + if (IsCancelled()) { + break; + } else { + emit Done(); + } } } diff --git a/app/widget/colorwheel/colorgradientwidget.cpp b/app/widget/colorwheel/colorgradientwidget.cpp index 82883eb69..e7b0579d9 100644 --- a/app/widget/colorwheel/colorgradientwidget.cpp +++ b/app/widget/colorwheel/colorgradientwidget.cpp @@ -76,7 +76,7 @@ void ColorGradientWidget::paintEvent(QPaintEvent *e) p.setPen(QPen(GetUISelectorColor(), qMax(1, selector_radius / 2))); p.setBrush(Qt::NoBrush); - float clamped_val = clamp(val_, 0.0f, 1.0f); + double clamped_val = clamp(val_, 0.0, 1.0); if (orientation_ == Qt::Horizontal) { p.drawRect(qRound(width() * (1.0 - clamped_val)) - selector_radius, 0, selector_radius * 2, height() - 1); @@ -87,7 +87,7 @@ void ColorGradientWidget::paintEvent(QPaintEvent *e) void ColorGradientWidget::SelectedColorChangedEvent(const Color &c, bool external) { - float hue, sat; + double hue, sat; c.toHsv(&hue, &sat, &val_); diff --git a/app/widget/colorwheel/colorgradientwidget.h b/app/widget/colorwheel/colorgradientwidget.h index 725b662fe..26f162912 100644 --- a/app/widget/colorwheel/colorgradientwidget.h +++ b/app/widget/colorwheel/colorgradientwidget.h @@ -50,7 +50,7 @@ private: Color end_; - float val_; + double val_; }; diff --git a/app/widget/colorwheel/colorwheelwidget.cpp b/app/widget/colorwheel/colorwheelwidget.cpp index 4edf774f3..f5e5e2a32 100644 --- a/app/widget/colorwheel/colorwheelwidget.cpp +++ b/app/widget/colorwheel/colorwheelwidget.cpp @@ -121,7 +121,7 @@ void ColorWheelWidget::SelectedColorChangedEvent(const Color &c, bool external) { if (external) { force_redraw_ = true; - val_ = clamp(c.value(), 0.0f, 1.0f); + val_ = clamp(c.value(), 0.0, 1.0); } } @@ -159,7 +159,7 @@ Color ColorWheelWidget::GetColorFromTriangle(const ColorWheelWidget::Triangle &t QPoint ColorWheelWidget::GetCoordsFromColor(const Color &c) const { - float hue, sat, val; + double hue, sat, val; c.toHsv(&hue, &sat, &val); qreal hypotenuse = sat * GetRadius(); diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index 26c122df7..55da88103 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -170,6 +170,11 @@ protected: void doneCurrent(); + QWidget* inner_widget() const + { + return inner_widget_; + } + protected slots: /** * @brief Called whenever the internal rendering context has been created diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index 04255a275..aed0d6988 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -92,7 +92,7 @@ void HistogramScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeli renderer()->Blit(pipeline_secondary_, shader_job, texture_row_sums_->params()); // Draw line overlays - QPainter p(this); + QPainter p(inner_widget()); QFont font = p.font(); font.setPixelSize(10); QFontMetrics font_metrics = QFontMetrics(font); diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index 618ed64b8..3f9f85afc 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -60,7 +60,7 @@ void WaveformScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipelin ShaderValue(QVector2D(width(), height()), NodeParam::kVec2)); // Set luma coefficients - float luma_coeffs[3] = {0.0f, 0.0f, 0.0f}; + double luma_coeffs[3] = {0.0f, 0.0f, 0.0f}; color_manager()->GetDefaultLumaCoefs(luma_coeffs); job.InsertValue(QStringLiteral("luma_coeffs"), ShaderValue(QVector3D(luma_coeffs[0], luma_coeffs[1], luma_coeffs[2]), NodeParam::kVec3)); @@ -85,7 +85,7 @@ void WaveformScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipelin float waveform_end_dim_x = (width() - 1.0) - waveform_start_dim_x; // Draw line overlays - QPainter p(this); + QPainter p(inner_widget()); QFont font; font.setPixelSize(10); QFontMetrics font_metrics = QFontMetrics(font); diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 8e47ee9c9..ed83de293 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -392,6 +392,7 @@ FramePtr ViewerWidget::DecodeCachedImage(const QString &fn, const rational& time void ViewerWidget::DecodeCachedImage(RenderTicketPtr ticket, const QString &fn, const rational& time) const { + ticket->Start(); ticket->Finish(QVariant::fromValue(DecodeCachedImage(fn, time)), false); } diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index b4fb272f7..1e8400ba6 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -108,7 +108,7 @@ void ViewerDisplayWidget::SetImage(FramePtr in_buffer) || texture_->format() != in_buffer->format()) { texture_ = renderer()->CreateTexture(in_buffer->video_params(), in_buffer->data(), in_buffer->linesize_pixels()); } else { - texture_->Upload(in_buffer->data(), in_buffer->linesize_bytes()); + texture_->Upload(in_buffer->data(), in_buffer->linesize_pixels()); } doneCurrent(); @@ -298,8 +298,7 @@ void ViewerDisplayWidget::OnPaint() } // Draw texture through color transform - renderer()->BlitColorManaged(color_service(), texture_, VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F)); - + renderer()->BlitColorManaged(color_service(), texture_, VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F), true); } QTransform world_transform = GenerateWorldTransform(); @@ -312,14 +311,14 @@ void ViewerDisplayWidget::OnPaint() gizmo_db_ = gt.GenerateDatabase(gizmos_, TimeRange(node_time, node_time)); - QPainter p(this); + QPainter p(inner_widget()); p.setWorldTransform(world_transform); gizmos_->DrawGizmos(gizmo_db_, &p, QVector2D(GetTexturePosition(size())), size()); } // Draw action/title safe areas if (safe_margin_.is_enabled()) { - QPainter p(this); + QPainter p(inner_widget()); p.setWorldTransform(world_transform); p.setPen(Qt::lightGray); From 04e27e8e7fb8238a063e13419697d26c2665101b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 12 Nov 2020 09:38:49 +1100 Subject: [PATCH 22/72] otio: use item rather than first of array --- app/task/project/saveotio/saveotio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/task/project/saveotio/saveotio.cpp b/app/task/project/saveotio/saveotio.cpp index 0fdb91b61..e1c94ef19 100644 --- a/app/task/project/saveotio/saveotio.cpp +++ b/app/task/project/saveotio/saveotio.cpp @@ -49,7 +49,7 @@ bool SaveOTIOTask::Run() std::vector serialized; foreach (ItemPtr item, sequences) { - SequencePtr seq = std::static_pointer_cast(sequences.first()); + SequencePtr seq = std::static_pointer_cast(item); auto otio_timeline = SerializeTimeline(seq); From 8776bb9c4ae19212dc30ed1350d7b26f73056b7e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 12 Nov 2020 15:36:29 +1100 Subject: [PATCH 23/72] finished upgrade to ocio v2 --- app/codec/oiio/oiiodecoder.cpp | 3 +- app/codec/oiio/oiiodecoder.h | 2 +- app/config/config.cpp | 6 +- app/core.cpp | 1 - app/node/node.h | 5 +- app/render/CMakeLists.txt | 39 +-- app/render/backend/renderer.cpp | 113 -------- app/render/{backend => job}/CMakeLists.txt | 10 +- app/render/job/acceleratedjob.h | 101 +++++++ app/render/job/generatejob.h | 54 ++++ app/render/job/samplejob.h | 65 +++++ app/render/job/shaderjob.h | 112 ++++++++ .../{backend => }/opengl/CMakeLists.txt | 4 +- .../{backend => }/opengl/openglrenderer.cpp | 160 +++++++---- .../{backend => }/opengl/openglrenderer.h | 21 +- app/render/renderer.cpp | 229 ++++++++++++++++ app/render/{backend => }/renderer.h | 119 ++------- .../{backend => }/rendererthreadwrapper.cpp | 48 ++-- .../{backend => }/rendererthreadwrapper.h | 11 +- app/render/rendermanager.cpp | 4 +- app/render/rendermanager.h | 2 +- app/render/renderprocessor.cpp | 20 +- app/render/renderprocessor.h | 2 +- app/render/shadercode.h | 62 +++++ app/render/shaderinfo.h | 249 ------------------ app/render/shadervalue.h | 2 + app/render/stillimagecache.h | 4 +- app/render/texture.cpp | 39 +++ app/render/texture.h | 134 ++++++++++ app/render/videoparams.cpp | 19 +- app/render/videoparams.h | 22 ++ app/widget/manageddisplay/manageddisplay.cpp | 2 +- app/widget/manageddisplay/manageddisplay.h | 2 +- app/widget/scope/histogram/histogram.cpp | 2 +- app/widget/scope/histogram/histogram.h | 4 +- app/widget/scope/scopebase/scopebase.cpp | 2 +- app/widget/scope/scopebase/scopebase.h | 6 +- app/widget/scope/waveform/waveform.cpp | 2 +- app/widget/scope/waveform/waveform.h | 2 +- app/widget/viewer/viewerdisplay.h | 2 +- 40 files changed, 1095 insertions(+), 591 deletions(-) delete mode 100644 app/render/backend/renderer.cpp rename app/render/{backend => job}/CMakeLists.txt (81%) create mode 100644 app/render/job/acceleratedjob.h create mode 100644 app/render/job/generatejob.h create mode 100644 app/render/job/samplejob.h create mode 100644 app/render/job/shaderjob.h rename app/render/{backend => }/opengl/CMakeLists.txt (90%) rename app/render/{backend => }/opengl/openglrenderer.cpp (80%) rename app/render/{backend => }/opengl/openglrenderer.h (64%) create mode 100644 app/render/renderer.cpp rename app/render/{backend => }/renderer.h (54%) rename app/render/{backend => }/rendererthreadwrapper.cpp (63%) rename app/render/{backend => }/rendererthreadwrapper.h (69%) create mode 100644 app/render/shadercode.h delete mode 100644 app/render/shaderinfo.h create mode 100644 app/render/texture.cpp create mode 100644 app/render/texture.h diff --git a/app/codec/oiio/oiiodecoder.cpp b/app/codec/oiio/oiiodecoder.cpp index 632220189..1728c04d2 100644 --- a/app/codec/oiio/oiiodecoder.cpp +++ b/app/codec/oiio/oiiodecoder.cpp @@ -215,8 +215,9 @@ bool OIIODecoder::OpenImageHandler(const QString &fn) // Check if we can work with this pixel format const OIIO::ImageSpec& spec = image_->spec(); - is_rgba_ = (spec.nchannels == kRGBAChannels); + //is_rgba_ = (spec.nchannels == kRGBAChannels); + // We use RGBA frames because that tends to be the native format of GPUs pix_fmt_ = OIIOCommon::GetFormatFromOIIOBasetype(spec); if (pix_fmt_ == PixelFormat::PIX_FMT_INVALID) { diff --git a/app/codec/oiio/oiiodecoder.h b/app/codec/oiio/oiiodecoder.h index 328b54a30..820057d3e 100644 --- a/app/codec/oiio/oiiodecoder.h +++ b/app/codec/oiio/oiiodecoder.h @@ -65,7 +65,7 @@ private: PixelFormat::Format pix_fmt_; - bool is_rgba_; + //bool is_rgba_; OIIO::ImageBuf* buffer_; diff --git a/app/config/config.cpp b/app/config/config.cpp index a40718a8d..40f53240f 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -231,10 +231,10 @@ void Config::Save() QString value = NodeInput::ValueToString(iterator.value().type, iterator.value().data, false); - writer.writeTextElement(iterator.key(), value); - if (iterator.value().type == NodeParam::kNone) { - qWarning() << "Config key" << iterator.key() << "had null type"; + qWarning() << "Config key" << iterator.key() << "had null type and was discarded"; + } else { + writer.writeTextElement(iterator.key(), value); } } diff --git a/app/core.cpp b/app/core.cpp index 608b79da7..b60591b88 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -53,7 +53,6 @@ #include "render/diskmanager.h" #include "render/pixelformat.h" #include "render/rendermanager.h" -#include "render/shaderinfo.h" #ifdef USE_OTIO #include "task/project/loadotio/loadotio.h" #include "task/project/saveotio/saveotio.h" diff --git a/app/node/node.h b/app/node/node.h index bcc168c15..6da128f51 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -36,7 +36,10 @@ #include "node/output.h" #include "node/value.h" #include "render/audioparams.h" -#include "render/shaderinfo.h" +#include "render/job/generatejob.h" +#include "render/job/samplejob.h" +#include "render/job/shaderjob.h" +#include "render/shadercode.h" OLIVE_NAMESPACE_ENTER diff --git a/app/render/CMakeLists.txt b/app/render/CMakeLists.txt index 6e8f1e43d..abb4bda59 100644 --- a/app/render/CMakeLists.txt +++ b/app/render/CMakeLists.txt @@ -14,45 +14,52 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -add_subdirectory(backend) +add_subdirectory(job) add_subdirectory(ocioconf) +add_subdirectory(opengl) set(OLIVE_SOURCES ${OLIVE_SOURCES} - render/audioparams.h render/audioparams.cpp - render/audioplaybackcache.h + render/audioparams.h render/audioplaybackcache.cpp - render/color.h + render/audioplaybackcache.h render/color.cpp - render/colormanager.h + render/color.h render/colormanager.cpp + render/colormanager.h + render/colorprocessor.cpp render/colorprocessor.h render/colorprocessorcache.h - render/colorprocessor.cpp - render/diskmanager.h render/diskmanager.cpp - render/framehashcache.h + render/diskmanager.h render/framehashcache.cpp - render/managedcolor.h + render/framehashcache.h render/managedcolor.cpp - render/pixelformat.h + render/managedcolor.h render/pixelformat.cpp - render/playbackcache.h + render/pixelformat.h render/playbackcache.cpp - render/previewautocacher.h + render/playbackcache.h render/previewautocacher.cpp + render/previewautocacher.h + render/renderer.cpp + render/renderer.h render/rendercache.h - render/rendermanager.h + render/rendererthreadwrapper.cpp + render/rendererthreadwrapper.h render/rendermanager.cpp + render/rendermanager.h render/rendermodes.h - render/renderprocessor.h render/renderprocessor.cpp - render/shaderinfo.h + render/renderprocessor.h + render/shadercode.h render/shadervalue.h render/stillimagecache.h - render/videoparams.h + render/texture.cpp + render/texture.h render/videoparams.cpp + render/videoparams.h PARENT_SCOPE ) diff --git a/app/render/backend/renderer.cpp b/app/render/backend/renderer.cpp deleted file mode 100644 index b2bf0ee04..000000000 --- a/app/render/backend/renderer.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "renderer.h" - -#include - -#include "common/ocioutils.h" -#include "render/colormanager.h" - -OLIVE_NAMESPACE_ENTER - -Renderer::Renderer(QObject *parent) : - QObject(parent) -{ - -} - -Renderer::TexturePtr Renderer::CreateTexture(const VideoParams ¶m, void *data, int linesize) -{ - QVariant v = CreateNativeTexture(param, data, linesize); - - if (v.isNull()) { - return nullptr; - } - - return std::make_shared(this, v, param); -} - -// copied from source code to OCIODisplay -/*const int OCIO_LUT3D_EDGE_SIZE = 64; - -const int OCIO_LUT3D_PIXEL_COUNT = OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE*OCIO_LUT3D_EDGE_SIZE; -const int OCIO_LUT3D_ENTRY_COUNT = 3 * OCIO_LUT3D_PIXEL_COUNT; -const int OCIO_LUT3D_ENTRY_COUNT_WITH_ALPHA = 4 * OCIO_LUT3D_PIXEL_COUNT; -const int OCIO_LUT2D_EDGE_SIZE = 512;*/ - -void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, bool flipped) -{ - qDebug() << "BlitColorManaged is a partial stub"; - - QVariant shader = CreateNativeShader(ShaderCode(FileFunctions::ReadFileAsString(":/shaders/default.frag"), FileFunctions::ReadFileAsString(":/shaders/default.vert"))); - - ShaderJob job; - job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); - - if (flipped) { - QMatrix4x4 mat; - mat.scale(1, -1, 1); - job.SetMatrix(mat); - } - - BlitToTexture(shader, job, destination); - - DestroyNativeShader(shader); -} - -void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, bool flipped) -{ - qDebug() << "BlitColorManaged is a partial stub"; - - /*ColorContext color_ctx; - - if (color_cache_.contains(color_processor->id())) { - color_ctx = color_cache_.value(color_processor->id()); - } else { - // Create shader description - const char* ocio_func_name = "OCIODisplay"; - OCIO::GpuShaderDescRcPtr shader_desc = OCIO::GpuShaderDesc::CreateShaderDesc(); - shader_desc->setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_2); - shader_desc->setFunctionName(ocio_func_name); - shader_desc->setResourcePrefix("ocio_"); - - // Generate shader - color_processor->GetProcessor()->getDefaultGPUProcessor()->extractGpuShaderInfo(shader_desc); - - qDebug() << "Shader:" << shader_desc->getShaderText(); - }*/ - - QVariant shader = CreateNativeShader(ShaderCode(FileFunctions::ReadFileAsString(":/shaders/default.frag"), FileFunctions::ReadFileAsString(":/shaders/default.vert"))); - - ShaderJob job; - job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); - - if (flipped) { - QMatrix4x4 mat; - mat.scale(1, -1, 1); - job.SetMatrix(mat); - } - - Blit(shader, job, params); - - DestroyNativeShader(shader); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/CMakeLists.txt b/app/render/job/CMakeLists.txt similarity index 81% rename from app/render/backend/CMakeLists.txt rename to app/render/job/CMakeLists.txt index de34bd6b3..d71defccf 100644 --- a/app/render/backend/CMakeLists.txt +++ b/app/render/job/CMakeLists.txt @@ -14,13 +14,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -add_subdirectory(opengl) - set(OLIVE_SOURCES ${OLIVE_SOURCES} - render/backend/renderer.cpp - render/backend/renderer.h - render/backend/rendererthreadwrapper.cpp - render/backend/rendererthreadwrapper.h + render/job/acceleratedjob.h + render/job/generatejob.h + render/job/samplejob.h + render/job/shaderjob.h PARENT_SCOPE ) diff --git a/app/render/job/acceleratedjob.h b/app/render/job/acceleratedjob.h new file mode 100644 index 000000000..71fb1a838 --- /dev/null +++ b/app/render/job/acceleratedjob.h @@ -0,0 +1,101 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef ACCELERATEDJOB_H +#define ACCELERATEDJOB_H + +#include "node/input.h" +#include "node/inputarray.h" +#include "render/shadervalue.h" +#include "node/value.h" + +OLIVE_NAMESPACE_ENTER + +class AcceleratedJob { +public: + AcceleratedJob() = default; + + ShaderValue GetValue(NodeInput* input) const + { + return value_map_.value(input->id()); + } + + ShaderValue GetValue(const QString& input) const + { + return value_map_.value(input); + } + + void InsertValue(NodeInput* input, NodeValueDatabase& value) + { + ShaderValue shader_val; + + shader_val.type = input->data_type(); + shader_val.array = input->IsArray(); + + if (input->IsArray()) { + NodeInputArray* array = static_cast(input); + QVector values(array->GetSize()); + + for (int j=0;jGetSize();j++) { + NodeInput* subparam = array->At(j); + + values[j] = value[subparam].Take(subparam->data_type()); + } + + shader_val.data = QVariant::fromValue(values); + } else { + NodeValue node_val = value[input].TakeWithMeta(input->data_type()); + shader_val.data = node_val.data(); + shader_val.tag = node_val.tag(); + } + + InsertValue(input->id(), shader_val); + } + + void InsertValue(const QString& input, const ShaderValue& value) + { + value_map_.insert(input, value); + } + + void InsertValue(NodeInput* input, const ShaderValue& value) + { + value_map_.insert(input->id(), value); + } + + void InsertValue(NodeInput* input, const NodeValue& value) + { + ShaderValue s(value.data(), value.type()); + s.tag = value.tag(); + value_map_.insert(input->id(), s); + } + + const NodeValueMap &GetValues() const + { + return value_map_; + } + +private: + NodeValueMap value_map_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // ACCELERATEDJOB_H diff --git a/app/render/job/generatejob.h b/app/render/job/generatejob.h new file mode 100644 index 000000000..e2ab45c72 --- /dev/null +++ b/app/render/job/generatejob.h @@ -0,0 +1,54 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef GENERATEJOB_H +#define GENERATEJOB_H + +#include "acceleratedjob.h" + +OLIVE_NAMESPACE_ENTER + +class GenerateJob : public AcceleratedJob { +public: + GenerateJob() + { + alpha_channel_required_ = false; + } + + bool GetAlphaChannelRequired() const + { + return alpha_channel_required_; + } + + void SetAlphaChannelRequired(bool e) + { + alpha_channel_required_ = e; + } + +private: + bool alpha_channel_required_; + +}; + +OLIVE_NAMESPACE_EXIT + +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::GenerateJob) + +#endif // GENERATEJOB_H diff --git a/app/render/job/samplejob.h b/app/render/job/samplejob.h new file mode 100644 index 000000000..f46e6a3eb --- /dev/null +++ b/app/render/job/samplejob.h @@ -0,0 +1,65 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef SAMPLEJOB_H +#define SAMPLEJOB_H + +#include "acceleratedjob.h" +#include "codec/samplebuffer.h" + +OLIVE_NAMESPACE_ENTER + +class SampleJob : public AcceleratedJob { +public: + SampleJob() + { + samples_ = nullptr; + } + + SampleJob(const NodeValue& value) + { + samples_ = value.data().value(); + } + + SampleJob(NodeInput* from, NodeValueDatabase& db) + { + samples_ = db[from].Take(NodeParam::kSamples).value(); + } + + SampleBufferPtr samples() const + { + return samples_; + } + + bool HasSamples() const + { + return samples_ && samples_->is_allocated(); + } + +private: + SampleBufferPtr samples_; + +}; + +OLIVE_NAMESPACE_EXIT + +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::SampleJob) + +#endif // SAMPLEJOB_H diff --git a/app/render/job/shaderjob.h b/app/render/job/shaderjob.h new file mode 100644 index 000000000..c6fc66cd9 --- /dev/null +++ b/app/render/job/shaderjob.h @@ -0,0 +1,112 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef SHADERJOB_H +#define SHADERJOB_H + +#include + +#include "generatejob.h" +#include "render/texture.h" + +OLIVE_NAMESPACE_ENTER + +class ShaderJob : public GenerateJob { +public: + ShaderJob() + { + iterations_ = 1; + iterative_input_ = nullptr; + } + + const QMatrix4x4& GetMatrix() const + { + return matrix_; + } + + void SetMatrix(const QMatrix4x4& matrix) + { + matrix_ = matrix; + } + + const QString& GetShaderID() const + { + return shader_id_; + } + + void SetShaderID(const QString& id) + { + shader_id_ = id; + } + + void SetIterations(int iterations, NodeInput* iterative_input) + { + SetIterations(iterations, iterative_input->id()); + } + + void SetIterations(int iterations, const QString& iterative_input) + { + iterations_ = iterations; + iterative_input_ = iterative_input; + } + + int GetIterationCount() const + { + return iterations_; + } + + const QString& GetIterativeInput() const + { + return iterative_input_; + } + + Texture::Interpolation GetInterpolation(const QString& id) + { + return interpolation_.value(id, Texture::kDefaultInterpolation); + } + + void SetInterpolation(NodeInput* input, Texture::Interpolation interp) + { + interpolation_.insert(input->id(), interp); + } + + void SetInterpolation(const QString& id, Texture::Interpolation interp) + { + interpolation_.insert(id, interp); + } + +private: + QString shader_id_; + + int iterations_; + + QString iterative_input_; + + QHash interpolation_; + + QMatrix4x4 matrix_; + +}; + +OLIVE_NAMESPACE_EXIT + +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::ShaderJob) + +#endif // SHADERJOB_H diff --git a/app/render/backend/opengl/CMakeLists.txt b/app/render/opengl/CMakeLists.txt similarity index 90% rename from app/render/backend/opengl/CMakeLists.txt rename to app/render/opengl/CMakeLists.txt index e2df52f90..72662cb31 100644 --- a/app/render/backend/opengl/CMakeLists.txt +++ b/app/render/opengl/CMakeLists.txt @@ -16,7 +16,7 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} - render/backend/opengl/openglrenderer.cpp - render/backend/opengl/openglrenderer.h + render/opengl/openglrenderer.cpp + render/opengl/openglrenderer.h PARENT_SCOPE ) diff --git a/app/render/backend/opengl/openglrenderer.cpp b/app/render/opengl/openglrenderer.cpp similarity index 80% rename from app/render/backend/opengl/openglrenderer.cpp rename to app/render/opengl/openglrenderer.cpp index a435bfd75..25a1c9fb0 100644 --- a/app/render/backend/opengl/openglrenderer.cpp +++ b/app/render/opengl/openglrenderer.cpp @@ -103,7 +103,7 @@ void OpenGLRenderer::PostInit() functions_->glGenFramebuffers(1, &framebuffer_); } -void OpenGLRenderer::Destroy() +void OpenGLRenderer::DestroyInternal() { if (context_) { // Delete framebuffer @@ -128,7 +128,53 @@ void OpenGLRenderer::ClearDestination(double r, double g, double b, double a) functions_->glClear(GL_COLOR_BUFFER_BIT); } -void OpenGLRenderer::AttachTextureAsDestination(Renderer::Texture* texture) +QVariant OpenGLRenderer::CreateNativeTexture2D(int width, int height, PixelFormat::Format format, Texture::ChannelFormat channel_format, const void *data, int linesize) +{ + GLuint texture; + functions_->glGenTextures(1, &texture); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); + + GLint current_tex; + functions_->glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_tex); + + functions_->glBindTexture(GL_TEXTURE_2D, texture); + + functions_->glTexImage2D(GL_TEXTURE_2D, 0, GetInternalFormat(format, channel_format), + width, height, 0, GetPixelFormat(channel_format), + GetPixelType(format), data); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + functions_->glBindTexture(GL_TEXTURE_2D, current_tex); + + return texture; +} + +QVariant OpenGLRenderer::CreateNativeTexture3D(int width, int height, int depth, PixelFormat::Format format, Texture::ChannelFormat channel_format, const void *data, int linesize) +{ + GLuint texture; + functions_->glGenTextures(1, &texture); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); + + GLint current_tex; + functions_->glGetIntegerv(GL_TEXTURE_BINDING_3D, ¤t_tex); + + functions_->glBindTexture(GL_TEXTURE_3D, texture); + + context_->extraFunctions()->glTexImage3D(GL_TEXTURE_3D, 0, GetInternalFormat(format, channel_format), + width, height, depth, 0, GetPixelFormat(channel_format), + GetPixelType(format), data); + + functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + functions_->glBindTexture(GL_TEXTURE_3D, current_tex); + + return texture; +} + +void OpenGLRenderer::AttachTextureAsDestination(Texture* texture) { functions_->glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_); functions_->glFramebufferTexture2D(GL_FRAMEBUFFER, @@ -143,29 +189,6 @@ void OpenGLRenderer::DetachTextureAsDestination() functions_->glBindFramebuffer(GL_FRAMEBUFFER, 0); } -QVariant OpenGLRenderer::CreateNativeTexture(VideoParams p, void *data, int linesize) -{ - GLuint texture; - functions_->glGenTextures(1, &texture); - - functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); - - GLint current_tex; - functions_->glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_tex); - - functions_->glBindTexture(GL_TEXTURE_2D, texture); - - functions_->glTexImage2D(GL_TEXTURE_2D, 0, GetInternalFormat(p.format()), - p.effective_width(), p.effective_height(), 0, GL_RGBA, - GetPixelType(p.format()), data); - - functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - - functions_->glBindTexture(GL_TEXTURE_2D, current_tex); - - return texture; -} - void OpenGLRenderer::DestroyNativeTexture(QVariant texture) { GLuint t = texture.value(); @@ -203,7 +226,7 @@ void OpenGLRenderer::DestroyNativeShader(QVariant shader) delete Node::ValueToPtr(shader); } -void OpenGLRenderer::UploadToTexture(Texture *texture, void *data, int linesize) +void OpenGLRenderer::UploadToTexture(Texture *texture, const void *data, int linesize) { GLuint t = texture->id().value(); const VideoParams& p = texture->params(); @@ -252,11 +275,17 @@ void OpenGLRenderer::DownloadFromTexture(Texture* texture, void *data, int lines functions_->glBindTexture(GL_TEXTURE_2D, current_tex); } -void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destination, VideoParams destination_params) +struct TextureToBind { + TexturePtr texture; + Texture::Interpolation interpolation; +}; + +void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, VideoParams destination_params) { // If this node is iterative, we'll pick up which input here + QString iterative_name; GLuint iterative_input = 0; - QList textures_to_bind; + QVector textures_to_bind; bool input_textures_have_alpha = false; QOpenGLShaderProgram* shader = Node::ValueToPtr(s); @@ -325,10 +354,11 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat // If this texture binding is the iterative input, set it here if (it.key() == job.GetIterativeInput()) { iterative_input = textures_to_bind.size(); + iterative_name = it.key(); } GLuint tex_id = texture ? texture->id().value() : 0; - textures_to_bind.append(tex_id); + textures_to_bind.append({texture, job.GetInterpolation(it.key())}); if (texture && texture->has_meaningful_alpha()) { input_textures_have_alpha = true; @@ -383,9 +413,17 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat // Bind all textures for (int i=0; iid().value() : 0; + functions_->glActiveTexture(GL_TEXTURE0 + i); - functions_->glBindTexture(GL_TEXTURE_2D, textures_to_bind.at(i)); - PrepareInputTexture(job.GetBilinearFiltering()); + + GLenum target = (texture->type() == Texture::k3D) ? GL_TEXTURE_3D : GL_TEXTURE_2D; + functions_->glBindTexture(target, tex_id); + + PrepareInputTexture(target, t.interpolation); } // Set ove_resolution to the destination to the "logical" resolution of the destination @@ -479,7 +517,9 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat // last drew functions_->glActiveTexture(GL_TEXTURE0 + iterative_input); functions_->glBindTexture(GL_TEXTURE_2D, input_tex->id().value()); - PrepareInputTexture(job.GetBilinearFiltering()); + + // At this time, we only support iterating 2D textures + PrepareInputTexture(GL_TEXTURE_2D, job.GetInterpolation(iterative_name)); } // Swap so that the next iteration, the texture we draw now will be the input texture next @@ -499,8 +539,9 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat // Release any textures we bound before for (int i=textures_to_bind.size()-1; i>=0; i--) { + GLenum target = (textures_to_bind.at(i).texture->type() == Texture::k3D) ? GL_TEXTURE_3D : GL_TEXTURE_2D; functions_->glActiveTexture(GL_TEXTURE0 + i); - functions_->glBindTexture(GL_TEXTURE_2D, 0); + functions_->glBindTexture(target, 0); } // Release shader @@ -513,17 +554,17 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Renderer::Texture *destinat vao_.destroy(); } -GLint OpenGLRenderer::GetInternalFormat(PixelFormat::Format format) +GLint OpenGLRenderer::GetInternalFormat(PixelFormat::Format format, bool with_alpha) { switch (format) { case PixelFormat::PIX_FMT_RGBA8: - return GL_RGBA8; + return with_alpha ? GL_RGBA8 : GL_RGB8; case PixelFormat::PIX_FMT_RGBA16U: - return GL_RGBA16; + return with_alpha ? GL_RGBA16 : GL_RGB16; case PixelFormat::PIX_FMT_RGBA16F: - return GL_RGBA16F; + return with_alpha ? GL_RGBA16F : GL_RGB16F; case PixelFormat::PIX_FMT_RGBA32F: - return GL_RGBA32F; + return with_alpha ? GL_RGBA32F : GL_RGB32F; case PixelFormat::PIX_FMT_INVALID: case PixelFormat::PIX_FMT_COUNT: @@ -553,21 +594,40 @@ GLenum OpenGLRenderer::GetPixelType(PixelFormat::Format format) return GL_INVALID_VALUE; } -void OpenGLRenderer::PrepareInputTexture(bool bilinear) +GLenum OpenGLRenderer::GetPixelFormat(Texture::ChannelFormat format) { - if (bilinear) { - // Use mipmapped bilinear - functions_->glGenerateMipmap(GL_TEXTURE_2D); - functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } else { - // Use nearest - functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + switch (format) { + case Texture::kRGBA: + return GL_RGBA; + case Texture::kRGB: + return GL_RGB; + case Texture::kRedOnly: + return GL_RED; } - functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - functions_->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + return GL_INVALID_ENUM; +} + +void OpenGLRenderer::PrepareInputTexture(GLenum target, Texture::Interpolation interp) +{ + switch (interp) { + case Texture::kNearest: + functions_->glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + functions_->glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + break; + case Texture::kLinear: + functions_->glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + functions_->glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + break; + case Texture::kMipmappedLinear: + functions_->glGenerateMipmap(target); + functions_->glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + functions_->glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + break; + } + + functions_->glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + functions_->glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglrenderer.h b/app/render/opengl/openglrenderer.h similarity index 64% rename from app/render/backend/opengl/openglrenderer.h rename to app/render/opengl/openglrenderer.h index 12b6e2a40..ce1f5d795 100644 --- a/app/render/backend/opengl/openglrenderer.h +++ b/app/render/opengl/openglrenderer.h @@ -28,7 +28,7 @@ #include #include -#include "render/backend/renderer.h" +#include "render/renderer.h" OLIVE_NAMESPACE_ENTER @@ -47,11 +47,12 @@ public: public slots: virtual void PostInit() override; - virtual void Destroy() override; + virtual void DestroyInternal() override; virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; - virtual QVariant CreateNativeTexture(OLIVE_NAMESPACE::VideoParams param, void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) override; virtual void DestroyNativeTexture(QVariant texture) override; @@ -59,26 +60,28 @@ public slots: virtual void DestroyNativeShader(QVariant shader) override; - virtual void UploadToTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; + virtual void UploadToTexture(OLIVE_NAMESPACE::Texture* texture, const void* data, int linesize) override; - virtual void DownloadFromTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; + virtual void DownloadFromTexture(OLIVE_NAMESPACE::Texture* texture, void* data, int linesize) override; protected slots: virtual void Blit(QVariant shader, OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::Renderer::Texture* destination, + OLIVE_NAMESPACE::Texture* destination, OLIVE_NAMESPACE::VideoParams destination_params) override; private: - static GLint GetInternalFormat(PixelFormat::Format format); + static GLint GetInternalFormat(PixelFormat::Format format, bool with_alpha); static GLenum GetPixelType(PixelFormat::Format format); - void AttachTextureAsDestination(OLIVE_NAMESPACE::Renderer::Texture* texture); + static GLenum GetPixelFormat(Texture::ChannelFormat format); + + void AttachTextureAsDestination(OLIVE_NAMESPACE::Texture* texture); void DetachTextureAsDestination(); - void PrepareInputTexture(bool bilinear); + void PrepareInputTexture(GLenum target, Texture::Interpolation interp); QOpenGLContext* context_; diff --git a/app/render/renderer.cpp b/app/render/renderer.cpp new file mode 100644 index 000000000..ffebfa072 --- /dev/null +++ b/app/render/renderer.cpp @@ -0,0 +1,229 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "renderer.h" + +#include + +#include "common/ocioutils.h" +#include "render/colormanager.h" + +OLIVE_NAMESPACE_ENTER + +Renderer::Renderer(QObject *parent) : + QObject(parent) +{ + +} + +TexturePtr Renderer::CreateTexture(const VideoParams ¶ms, Texture::Type type, Texture::ChannelFormat channel_format, const void *data, int linesize) +{ + QVariant v; + + if (type == Texture::k3D) { + v = CreateNativeTexture3D(params.effective_width(), params.effective_height(), + params.effective_depth(), params.format(), channel_format, data, linesize); + } else { + v = CreateNativeTexture2D(params.effective_width(), params.effective_height(), params.format(), + channel_format, data, linesize); + } + + if (v.isNull()) { + return nullptr; + } + + return std::make_shared(this, v, params, type); +} + +TexturePtr Renderer::CreateTexture(const VideoParams ¶ms, const void *data, int linesize) +{ + return CreateTexture(params, Texture::k2D, Texture::kRGBA, data, linesize); +} + +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, bool flipped) +{ + BlitColorManagedInternal(color_processor, source, destination, destination->params(), flipped); +} + +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, bool flipped) +{ + BlitColorManagedInternal(color_processor, source, nullptr, params, flipped); +} + +void Renderer::Destroy() +{ + color_cache_.clear(); + + DestroyInternal(); +} + +bool Renderer::GetColorContext(ColorProcessorPtr color_processor, Renderer::ColorContext *ctx) +{ + ColorContext& color_ctx = *ctx; + + if (color_cache_.contains(color_processor->id())) { + color_ctx = color_cache_.value(color_processor->id()); + return true; + } else { + // Create shader description + const char* ocio_func_name = "OCIODisplay"; + auto shader_desc = OCIO::GpuShaderDesc::CreateShaderDesc(); + shader_desc->setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_3); + shader_desc->setFunctionName(ocio_func_name); + shader_desc->setResourcePrefix("ocio_"); + + // Generate shader + color_processor->GetProcessor()->getDefaultGPUProcessor()->extractGpuShaderInfo(shader_desc); + + QString shader_frag; + shader_frag.append(QStringLiteral("#version 150\n" + "\n" + "#ifdef GL_ES\n" + "precision highp int;\n" + "precision highp float;\n" + "#endif\n" + "\n" + "// Main texture input\n" + "uniform sampler2D ove_maintex;\n" + "\n" + "// Macros so OCIO's shaders work on this GLSL version\n" + "#define texture2D texture\n" + "#define texture3D texture\n" + "\n" + "// Main texture coordinate\n" + "in vec2 ove_texcoord;\n" + "\n" + "// Texture output\n" + "out vec4 fragColor;\n")); + shader_frag.append(shader_desc->getShaderText()); + shader_frag.append(QStringLiteral("\n" + "void main() {\n" + " fragColor = %1(texture(ove_maintex, ove_texcoord));\n" + "}\n").arg(ocio_func_name)); + + // Try to compile shader + color_ctx.compiled_shader = CreateNativeShader(ShaderCode(shader_frag, + FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/default.vert")))); + + if (color_ctx.compiled_shader.isNull()) { + return false; + } + + color_ctx.lut3d_textures.resize(shader_desc->getNum3DTextures()); + for (unsigned int i=0; igetNum3DTextures(); i++) { + const char* tex_name = nullptr; + const char* sampler_name = nullptr; + unsigned int edge_len = 0; + OCIO::Interpolation interpolation = OCIO::INTERP_LINEAR; + + shader_desc->get3DTexture(i, tex_name, sampler_name, edge_len, interpolation); + + if (!tex_name || !*tex_name + || !sampler_name || !*sampler_name + || !edge_len) { + qCritical() << "3D LUT texture data is corrupted"; + return false; + } + + const float* values = nullptr; + shader_desc->get3DTextureValues(i, values); + if (!values) { + qCritical() << "3D LUT texture values are missing"; + return false; + } + + // Allocate 3D LUT + color_ctx.lut3d_textures[i].texture = CreateTexture(VideoParams(edge_len, edge_len, edge_len, PixelFormat::PIX_FMT_RGBA32F), + Texture::k3D, Texture::kRGB, values); + color_ctx.lut3d_textures[i].name = sampler_name; + color_ctx.lut3d_textures[i].interpolation = (interpolation == OCIO::INTERP_NEAREST) ? Texture::kNearest : Texture::kLinear; + } + + color_ctx.lut1d_textures.resize(shader_desc->getNumTextures()); + for (unsigned int i=0; igetNumTextures(); i++) { + const char* tex_name = nullptr; + const char* sampler_name = nullptr; + unsigned int width = 0, height = 0; + OCIO::GpuShaderDesc::TextureType channel = OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL; + OCIO::Interpolation interpolation = OCIO::INTERP_LINEAR; + + shader_desc->getTexture(i, tex_name, sampler_name, width, height, channel, interpolation); + + if (!tex_name || !*tex_name + || !sampler_name || !*sampler_name + || !width) { + qCritical() << "1D LUT texture data is corrupted"; + return false; + } + + const float* values = nullptr; + shader_desc->getTextureValues(i, values); + if (!values) { + qCritical() << "1D LUT texture values are missing"; + return false; + } + + // Allocate 1D LUT + color_ctx.lut1d_textures[i].texture = CreateTexture(VideoParams(width, height, PixelFormat::PIX_FMT_RGBA32F), + Texture::k2D, + (channel == OCIO::GpuShaderDesc::TEXTURE_RED_CHANNEL) ? Texture::kRedOnly : Texture::kRGB, + values); + color_ctx.lut1d_textures[i].name = sampler_name; + color_ctx.lut1d_textures[i].interpolation = (interpolation == OCIO::INTERP_NEAREST) ? Texture::kNearest : Texture::kLinear; + } + + color_cache_.insert(color_processor->id(), color_ctx); + + return true; + } +} + +void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, VideoParams params, bool flipped) +{ + ColorContext color_ctx; + if (!GetColorContext(color_processor, &color_ctx)) { + return; + } + + ShaderJob job; + job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); + foreach (const ColorContext::LUT& l, color_ctx.lut3d_textures) { + job.InsertValue(l.name, ShaderValue(QVariant::fromValue(l.texture), NodeParam::kTexture)); + job.SetInterpolation(l.name, l.interpolation); + } + foreach (const ColorContext::LUT& l, color_ctx.lut1d_textures) { + job.InsertValue(l.name, ShaderValue(QVariant::fromValue(l.texture), NodeParam::kTexture)); + job.SetInterpolation(l.name, l.interpolation); + } + + if (flipped) { + QMatrix4x4 mat; + mat.scale(1, -1, 1); + job.SetMatrix(mat); + } + + if (destination) { + BlitToTexture(color_ctx.compiled_shader, job, destination); + } else { + Blit(color_ctx.compiled_shader, job, params); + } +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/renderer.h b/app/render/renderer.h similarity index 54% rename from app/render/backend/renderer.h rename to app/render/renderer.h index 356299fcb..2da550fa1 100644 --- a/app/render/backend/renderer.h +++ b/app/render/renderer.h @@ -29,9 +29,12 @@ #include "node/node.h" #include "render/colorprocessor.h" #include "render/videoparams.h" +#include "texture.h" OLIVE_NAMESPACE_ENTER +class ShaderJob; + class Renderer : public QObject { Q_OBJECT @@ -40,90 +43,12 @@ public: virtual bool Init() = 0; - class Texture - { - public: - Texture(Renderer* renderer, const QVariant& native, const VideoParams& param) : - renderer_(renderer), - params_(param), - id_(native), - meaningful_alpha_(true) - { - } - - ~Texture() - { - renderer_->DestroyNativeTexture(id_); - } - - QVariant id() const - { - return id_; - } - - const VideoParams& params() const - { - return params_; - } - - void Upload(void* data, int linesize) - { - renderer_->UploadToTexture(this, data, linesize); - } - - int width() const - { - return params_.width(); - } - - int height() const - { - return params_.height(); - } - - PixelFormat::Format format() const - { - return params_.format(); - } - - int divider() const - { - return params_.divider(); - } - - const rational& pixel_aspect_ratio() const - { - return params_.pixel_aspect_ratio(); - } - - bool has_meaningful_alpha() const - { - return meaningful_alpha_; - } - - void set_has_meaningful_alpha(bool e) - { - meaningful_alpha_ = e; - } - - private: - Renderer* renderer_; - - VideoParams params_; - - QVariant id_; - - bool meaningful_alpha_; - - }; - - using TexturePtr = std::shared_ptr; - - TexturePtr CreateTexture(const VideoParams& param, void* data = nullptr, int linesize = 0); + TexturePtr CreateTexture(const VideoParams& params, Texture::Type type, Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0); + TexturePtr CreateTexture(const VideoParams& params, const void *data = nullptr, int linesize = 0); void BlitToTexture(QVariant shader, OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::Renderer::Texture* destination) + OLIVE_NAMESPACE::Texture* destination) { Blit(shader, job, destination, destination->params()); } @@ -138,14 +63,17 @@ public: void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture* destination, bool flipped = false); void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, bool flipped = false); + void Destroy(); + public slots: virtual void PostInit() = 0; - virtual void Destroy() = 0; + virtual void DestroyInternal() = 0; virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) = 0; - virtual QVariant CreateNativeTexture(OLIVE_NAMESPACE::VideoParams param, void* data = nullptr, int linesize = 0) = 0; + virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) = 0; + virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) = 0; virtual void DestroyNativeTexture(QVariant texture) = 0; @@ -153,28 +81,39 @@ public slots: virtual void DestroyNativeShader(QVariant shader) = 0; - virtual void UploadToTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) = 0; + virtual void UploadToTexture(OLIVE_NAMESPACE::Texture* texture, const void* data, int linesize) = 0; - virtual void DownloadFromTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) = 0; + virtual void DownloadFromTexture(OLIVE_NAMESPACE::Texture* texture, void* data, int linesize) = 0; protected slots: virtual void Blit(QVariant shader, OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::Renderer::Texture* destination, + OLIVE_NAMESPACE::Texture* destination, OLIVE_NAMESPACE::VideoParams destination_params) = 0; private: struct ColorContext { - QVariant shader; - TexturePtr lut; + struct LUT { + TexturePtr texture; + Texture::Interpolation interpolation; + QString name; + }; + + QVariant compiled_shader; + QVector lut3d_textures; + QVector lut1d_textures; + }; + bool GetColorContext(ColorProcessorPtr color_processor, ColorContext* ctx); + + void BlitColorManagedInternal(ColorProcessorPtr color_processor, TexturePtr source, + Texture* destination, VideoParams params, bool flipped); + QHash color_cache_; }; OLIVE_NAMESPACE_EXIT -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::Renderer::TexturePtr); - #endif // RENDERCONTEXT_H diff --git a/app/render/backend/rendererthreadwrapper.cpp b/app/render/rendererthreadwrapper.cpp similarity index 63% rename from app/render/backend/rendererthreadwrapper.cpp rename to app/render/rendererthreadwrapper.cpp index 8b024054e..2024fd377 100644 --- a/app/render/backend/rendererthreadwrapper.cpp +++ b/app/render/rendererthreadwrapper.cpp @@ -54,10 +54,10 @@ void RendererThreadWrapper::PostInit() // Do nothing } -void RendererThreadWrapper::Destroy() +void RendererThreadWrapper::DestroyInternal() { if (thread_) { - QMetaObject::invokeMethod(inner_, "Destroy", Qt::BlockingQueuedConnection); + QMetaObject::invokeMethod(inner_, "DestroyInternal", Qt::BlockingQueuedConnection); inner_ = nullptr; thread_->quit(); @@ -76,14 +76,34 @@ void RendererThreadWrapper::ClearDestination(double r, double g, double b, doubl Q_ARG(double, a)); } -QVariant RendererThreadWrapper::CreateNativeTexture(VideoParams param, void *data, int linesize) +QVariant RendererThreadWrapper::CreateNativeTexture2D(int width, int height, PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void *data, int linesize) { QVariant v; - QMetaObject::invokeMethod(inner_, "CreateNativeTexture", Qt::BlockingQueuedConnection, + QMetaObject::invokeMethod(inner_, "CreateNativeTexture2D", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, v), - OLIVE_NS_ARG(VideoParams, param), - Q_ARG(void*, data), + Q_ARG(int, width), + Q_ARG(int, height), + OLIVE_NS_ARG(PixelFormat::Format, format), + OLIVE_NS_ARG(Texture::ChannelFormat, channel_format), + Q_ARG(const void*, data), + Q_ARG(int, linesize)); + + return v; +} + +QVariant RendererThreadWrapper::CreateNativeTexture3D(int width, int height, int depth, PixelFormat::Format format, Texture::ChannelFormat channel_format, const void *data, int linesize) +{ + QVariant v; + + QMetaObject::invokeMethod(inner_, "CreateNativeTexture3D", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QVariant, v), + Q_ARG(int, width), + Q_ARG(int, height), + Q_ARG(int, depth), + OLIVE_NS_ARG(PixelFormat::Format, format), + OLIVE_NS_ARG(Texture::ChannelFormat, channel_format), + Q_ARG(const void*, data), Q_ARG(int, linesize)); return v; @@ -112,30 +132,28 @@ void RendererThreadWrapper::DestroyNativeShader(QVariant shader) Q_ARG(QVariant, shader)); } -void RendererThreadWrapper::UploadToTexture(Renderer::Texture *texture, void *data, int linesize) +void RendererThreadWrapper::UploadToTexture(Texture *texture, const void *data, int linesize) { QMetaObject::invokeMethod(inner_, "UploadToTexture", Qt::BlockingQueuedConnection, - OLIVE_NS_ARG(Renderer::Texture*, texture), - Q_ARG(void*, data), + OLIVE_NS_ARG(Texture*, texture), + Q_ARG(const void*, data), Q_ARG(int, linesize)); } -void RendererThreadWrapper::DownloadFromTexture(Renderer::Texture *texture, void *data, int linesize) +void RendererThreadWrapper::DownloadFromTexture(Texture *texture, void *data, int linesize) { QMetaObject::invokeMethod(inner_, "DownloadFromTexture", Qt::BlockingQueuedConnection, - OLIVE_NS_ARG(Renderer::Texture*, texture), + OLIVE_NS_ARG(Texture*, texture), Q_ARG(void*, data), Q_ARG(int, linesize)); } -void RendererThreadWrapper::Blit(QVariant shader, ShaderJob job, Renderer::Texture *destination, VideoParams destination_params) +void RendererThreadWrapper::Blit(QVariant shader, ShaderJob job, Texture *destination, VideoParams destination_params) { - Renderer::TexturePtr tex; - QMetaObject::invokeMethod(inner_, "Blit", Qt::BlockingQueuedConnection, Q_ARG(QVariant, shader), OLIVE_NS_ARG(ShaderJob, job), - OLIVE_NS_ARG(Renderer::Texture*, destination), + OLIVE_NS_ARG(Texture*, destination), OLIVE_NS_ARG(VideoParams, destination_params)); } diff --git a/app/render/backend/rendererthreadwrapper.h b/app/render/rendererthreadwrapper.h similarity index 69% rename from app/render/backend/rendererthreadwrapper.h rename to app/render/rendererthreadwrapper.h index 95445bc25..a3b9e5cda 100644 --- a/app/render/backend/rendererthreadwrapper.h +++ b/app/render/rendererthreadwrapper.h @@ -43,11 +43,12 @@ public: public slots: virtual void PostInit() override; - virtual void Destroy() override; + virtual void DestroyInternal() override; virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; - virtual QVariant CreateNativeTexture(OLIVE_NAMESPACE::VideoParams param, void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) override; virtual void DestroyNativeTexture(QVariant texture) override; @@ -55,14 +56,14 @@ public slots: virtual void DestroyNativeShader(QVariant shader) override; - virtual void UploadToTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; + virtual void UploadToTexture(OLIVE_NAMESPACE::Texture* texture, const void* data, int linesize) override; - virtual void DownloadFromTexture(OLIVE_NAMESPACE::Renderer::Texture* texture, void* data, int linesize) override; + virtual void DownloadFromTexture(OLIVE_NAMESPACE::Texture* texture, void* data, int linesize) override; protected slots: virtual void Blit(QVariant shader, OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::Renderer::Texture* destination, + OLIVE_NAMESPACE::Texture* destination, OLIVE_NAMESPACE::VideoParams destination_params) override; private: diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 2aa648fd5..de9b4b408 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -27,8 +27,8 @@ #include "config/config.h" #include "core.h" -#include "render/backend/opengl/openglrenderer.h" -#include "render/backend/rendererthreadwrapper.h" +#include "render/opengl/openglrenderer.h" +#include "render/rendererthreadwrapper.h" #include "renderprocessor.h" #include "task/conform/conform.h" #include "task/taskmanager.h" diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index f170e2aa2..0f73ca53d 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -29,7 +29,7 @@ #include "node/graph.h" #include "node/output/viewer/viewer.h" #include "node/traverser.h" -#include "render/backend/renderer.h" +#include "render/renderer.h" #include "rendercache.h" #include "stillimagecache.h" #include "threading/threadpool.h" diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 34b612ec6..6587c6d0c 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -54,7 +54,7 @@ void RenderProcessor::Run() NodeValueTable table = ProcessInput(viewer->texture_input(), TimeRange(time, time + viewer->video_params().time_base())); - Renderer::TexturePtr texture = table.Get(NodeParam::kTexture).value(); + TexturePtr texture = table.Get(NodeParam::kTexture).value(); VideoParams frame_params = viewer->video_params(); @@ -222,7 +222,7 @@ NodeValueTable RenderProcessor::GenerateBlockTable(const TrackOutput *track, con QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational &input_time) { - Renderer::TexturePtr value = nullptr; + TexturePtr value = nullptr; // Check the still frame cache. On large frames such as high resolution still images, uploading // and color managing them for every frame is a waste of time, so we implement a small cache here @@ -285,9 +285,9 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & if (frame) { // Return a texture from the derived class - Renderer::TexturePtr unmanaged_texture = render_ctx_->CreateTexture(frame->video_params(), - frame->data(), - frame->linesize_pixels()); + TexturePtr unmanaged_texture = render_ctx_->CreateTexture(frame->video_params(), + frame->data(), + frame->linesize_pixels()); // We convert to our rendering pixel format, since that will always be float-based which // is necessary for correct color conversion @@ -361,7 +361,7 @@ QVariant RenderProcessor::ProcessShader(const Node *node, const TimeRange &range const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); - Renderer::TexturePtr destination = render_ctx_->CreateTexture(video_params); + TexturePtr destination = render_ctx_->CreateTexture(video_params); // Run shader render_ctx_->BlitToTexture(shader, job, destination.get()); @@ -423,9 +423,9 @@ QVariant RenderProcessor::ProcessFrameGeneration(const Node *node, const Generat node->GenerateFrame(frame, job); - Renderer::TexturePtr texture = render_ctx_->CreateTexture(frame->video_params(), - frame->data(), - frame->linesize_pixels()); + TexturePtr texture = render_ctx_->CreateTexture(frame->video_params(), + frame->data(), + frame->linesize_pixels()); texture->set_has_meaningful_alpha(job.GetAlphaChannelRequired()); @@ -456,7 +456,7 @@ QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) qDebug() << "Using cached frame!"; - Renderer::TexturePtr texture = render_ctx_->CreateTexture(f->video_params(), f->data(), f->linesize_pixels()); + TexturePtr texture = render_ctx_->CreateTexture(f->video_params(), f->data(), f->linesize_pixels()); return QVariant::fromValue(texture); } else { qDebug() << "Not using cached frame because frame is null"; diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index e2be6eb61..ed5bf38ae 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -22,7 +22,7 @@ #define RENDERPROCESSOR_H #include "node/traverser.h" -#include "render/backend/renderer.h" +#include "render/renderer.h" #include "rendercache.h" #include "stillimagecache.h" #include "threading/threadticket.h" diff --git a/app/render/shadercode.h b/app/render/shadercode.h new file mode 100644 index 000000000..59d5a59de --- /dev/null +++ b/app/render/shadercode.h @@ -0,0 +1,62 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef SHADERCODE_H +#define SHADERCODE_H + +#include "common/filefunctions.h" + +OLIVE_NAMESPACE_ENTER + +class ShaderCode { +public: + ShaderCode(const QString& frag_code, const QString& vert_code) : + frag_code_(frag_code), + vert_code_(vert_code) + { + if (frag_code_.isEmpty()) { + frag_code_ = FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/default.frag")); + } + + if (vert_code_.isEmpty()) { + vert_code_ = FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/default.vert")); + } + } + + const QString& frag_code() const + { + return frag_code_; + } + + const QString& vert_code() const + { + return vert_code_; + } + +private: + QString frag_code_; + + QString vert_code_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // SHADERCODE_H diff --git a/app/render/shaderinfo.h b/app/render/shaderinfo.h deleted file mode 100644 index 3dc69f681..000000000 --- a/app/render/shaderinfo.h +++ /dev/null @@ -1,249 +0,0 @@ -#ifndef SHADERINFO_H -#define SHADERINFO_H - -#include - -#include "codec/samplebuffer.h" -#include "common/filefunctions.h" -#include "node/input.h" -#include "node/inputarray.h" -#include "node/value.h" - -OLIVE_NAMESPACE_ENTER - -using NodeValueMap = QHash; - -class AcceleratedJob { -public: - AcceleratedJob() = default; - - ShaderValue GetValue(NodeInput* input) const - { - return value_map_.value(input->id()); - } - - ShaderValue GetValue(const QString& input) const - { - return value_map_.value(input); - } - - void InsertValue(NodeInput* input, NodeValueDatabase& value) - { - ShaderValue shader_val; - - shader_val.type = input->data_type(); - shader_val.array = input->IsArray(); - - if (input->IsArray()) { - NodeInputArray* array = static_cast(input); - QVector values(array->GetSize()); - - for (int j=0;jGetSize();j++) { - NodeInput* subparam = array->At(j); - - values[j] = value[subparam].Take(subparam->data_type()); - } - - shader_val.data = QVariant::fromValue(values); - } else { - NodeValue node_val = value[input].TakeWithMeta(input->data_type()); - shader_val.data = node_val.data(); - shader_val.tag = node_val.tag(); - } - - InsertValue(input->id(), shader_val); - } - - void InsertValue(const QString& input, const ShaderValue& value) - { - value_map_.insert(input, value); - } - - void InsertValue(NodeInput* input, const ShaderValue& value) - { - value_map_.insert(input->id(), value); - } - - void InsertValue(NodeInput* input, const NodeValue& value) - { - ShaderValue s(value.data(), value.type()); - s.tag = value.tag(); - value_map_.insert(input->id(), s); - } - - const NodeValueMap &GetValues() const - { - return value_map_; - } - -private: - NodeValueMap value_map_; - -}; - -class SampleJob : public AcceleratedJob { -public: - SampleJob() - { - samples_ = nullptr; - } - - SampleJob(const NodeValue& value) - { - samples_ = value.data().value(); - } - - SampleJob(NodeInput* from, NodeValueDatabase& db) - { - samples_ = db[from].Take(NodeParam::kSamples).value(); - } - - SampleBufferPtr samples() const - { - return samples_; - } - - bool HasSamples() const - { - return samples_ && samples_->is_allocated(); - } - -private: - SampleBufferPtr samples_; - -}; - -class GenerateJob : public AcceleratedJob { -public: - GenerateJob() - { - alpha_channel_required_ = false; - } - - bool GetAlphaChannelRequired() const - { - return alpha_channel_required_; - } - - void SetAlphaChannelRequired(bool e) - { - alpha_channel_required_ = e; - } - -private: - bool alpha_channel_required_; - -}; - -class ShaderJob : public GenerateJob { -public: - ShaderJob() - { - iterations_ = 1; - iterative_input_ = nullptr; - bilinear_ = true; - } - - const QMatrix4x4& GetMatrix() const - { - return matrix_; - } - - void SetMatrix(const QMatrix4x4& matrix) - { - matrix_ = matrix; - } - - const QString& GetShaderID() const - { - return shader_id_; - } - - void SetShaderID(const QString& id) - { - shader_id_ = id; - } - - void SetIterations(int iterations, NodeInput* iterative_input) - { - SetIterations(iterations, iterative_input->id()); - } - - void SetIterations(int iterations, const QString& iterative_input) - { - iterations_ = iterations; - iterative_input_ = iterative_input; - } - - int GetIterationCount() const - { - return iterations_; - } - - const QString& GetIterativeInput() const - { - return iterative_input_; - } - - bool GetBilinearFiltering() const - { - return bilinear_; - } - - void SetBilinearFiltering(bool e) - { - bilinear_ = e; - } - -private: - QString shader_id_; - - int iterations_; - - QString iterative_input_; - - bool bilinear_; - - QMatrix4x4 matrix_; - -}; - -class ShaderCode { -public: - ShaderCode(const QString& frag_code, const QString& vert_code) : - frag_code_(frag_code), - vert_code_(vert_code) - { - if (frag_code_.isEmpty()) { - frag_code_ = FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/default.frag")); - } - - if (vert_code_.isEmpty()) { - vert_code_ = FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/default.vert")); - } - } - - const QString& frag_code() const - { - return frag_code_; - } - - const QString& vert_code() const - { - return vert_code_; - } - -private: - QString frag_code_; - - QString vert_code_; - -}; - -OLIVE_NAMESPACE_EXIT - -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::ShaderJob) -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::SampleJob) -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::GenerateJob) - -#endif // SHADERINFO_H diff --git a/app/render/shadervalue.h b/app/render/shadervalue.h index 5d4e8dbfb..dd8412b30 100644 --- a/app/render/shadervalue.h +++ b/app/render/shadervalue.h @@ -48,6 +48,8 @@ struct ShaderValue }; +using NodeValueMap = QHash; + OLIVE_NAMESPACE_EXIT #endif // SHADERVALUE_H diff --git a/app/render/stillimagecache.h b/app/render/stillimagecache.h index 9a0b17cb7..efd7ac515 100644 --- a/app/render/stillimagecache.h +++ b/app/render/stillimagecache.h @@ -5,7 +5,7 @@ #include "common/rational.h" #include "project/item/footage/stream.h" -#include "render/backend/renderer.h" +#include "render/texture.h" OLIVE_NAMESPACE_ENTER @@ -13,7 +13,7 @@ class StillImageCache { public: struct Entry { - Renderer::TexturePtr texture; + TexturePtr texture; StreamPtr stream; QString colorspace; bool alpha_is_associated; diff --git a/app/render/texture.cpp b/app/render/texture.cpp new file mode 100644 index 000000000..66bd9dc77 --- /dev/null +++ b/app/render/texture.cpp @@ -0,0 +1,39 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "texture.h" + +#include "renderer.h" + +OLIVE_NAMESPACE_ENTER + +const Texture::Interpolation Texture::kDefaultInterpolation = Texture::kMipmappedLinear; + +Texture::~Texture() +{ + renderer_->DestroyNativeTexture(id_); +} + +void Texture::Upload(void *data, int linesize) +{ + renderer_->UploadToTexture(this, data, linesize); +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/render/texture.h b/app/render/texture.h new file mode 100644 index 000000000..abf4e7e2e --- /dev/null +++ b/app/render/texture.h @@ -0,0 +1,134 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef RENDERTEXTURE_H +#define RENDERTEXTURE_H + +#include "render/videoparams.h" + +OLIVE_NAMESPACE_ENTER + +class Renderer; + +class Texture +{ +public: + enum Type { + k2D, + k3D + }; + + enum Interpolation { + kNearest, + kLinear, + kMipmappedLinear + }; + + enum ChannelFormat { + kRGBA, + kRGB, + kRedOnly + }; + + static const Interpolation kDefaultInterpolation; + + Texture(Renderer* renderer, const QVariant& native, const VideoParams& param, Type type) : + renderer_(renderer), + params_(param), + id_(native), + meaningful_alpha_(true), + type_(type) + { + } + + ~Texture(); + + QVariant id() const + { + return id_; + } + + const VideoParams& params() const + { + return params_; + } + + void Upload(void* data, int linesize); + + int width() const + { + return params_.width(); + } + + int height() const + { + return params_.height(); + } + + PixelFormat::Format format() const + { + return params_.format(); + } + + int divider() const + { + return params_.divider(); + } + + const rational& pixel_aspect_ratio() const + { + return params_.pixel_aspect_ratio(); + } + + bool has_meaningful_alpha() const + { + return meaningful_alpha_; + } + + void set_has_meaningful_alpha(bool e) + { + meaningful_alpha_ = e; + } + + Type type() const + { + return type_; + } + +private: + Renderer* renderer_; + + VideoParams params_; + + QVariant id_; + + bool meaningful_alpha_; + + Type type_; + +}; + +using TexturePtr = std::shared_ptr; + +OLIVE_NAMESPACE_EXIT + +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::TexturePtr); + +#endif // RENDERTEXTURE_H diff --git a/app/render/videoparams.cpp b/app/render/videoparams.cpp index 00167c63a..c9609701e 100644 --- a/app/render/videoparams.cpp +++ b/app/render/videoparams.cpp @@ -62,6 +62,7 @@ const QVector VideoParams::kStandardPixelAspects = { VideoParams::VideoParams() : width_(0), height_(0), + depth_(0), format_(PixelFormat::PIX_FMT_INVALID), interlacing_(Interlacing::kInterlaceNone) { @@ -70,6 +71,20 @@ VideoParams::VideoParams() : VideoParams::VideoParams(const int &width, const int &height, const PixelFormat::Format &format, const rational& pixel_aspect_ratio, const Interlacing &interlacing, const int& divider) : width_(width), height_(height), + depth_(0), + format_(format), + pixel_aspect_ratio_(pixel_aspect_ratio), + interlacing_(interlacing), + divider_(divider) +{ + calculate_effective_size(); + validate_pixel_aspect_ratio(); +} + +VideoParams::VideoParams(const int &width, const int &height, const int &depth, const PixelFormat::Format &format, const rational &pixel_aspect_ratio, const VideoParams::Interlacing &interlacing, const int ÷r) : + width_(width), + height_(height), + depth_(depth), format_(format), pixel_aspect_ratio_(pixel_aspect_ratio), interlacing_(interlacing), @@ -82,6 +97,7 @@ VideoParams::VideoParams(const int &width, const int &height, const PixelFormat: VideoParams::VideoParams(const int &width, const int &height, const rational &time_base, const PixelFormat::Format &format, const rational& pixel_aspect_ratio, const Interlacing &interlacing, const int ÷r) : width_(width), height_(height), + depth_(0), time_base_(time_base), format_(format), pixel_aspect_ratio_(pixel_aspect_ratio), @@ -147,6 +163,7 @@ void VideoParams::calculate_effective_size() { effective_width_ = GetScaledDimension(width(), divider_); effective_height_ = GetScaledDimension(height(), divider_); + effective_depth_ = GetScaledDimension(depth(), divider_); } void VideoParams::validate_pixel_aspect_ratio() @@ -196,7 +213,7 @@ QString VideoParams::FormatPixelAspectRatioString(const QString &format, const r int VideoParams::GetScaledDimension(int dim, int divider) { - return qCeil(dim / divider * 0.5) * 2; + return dim / divider; } OLIVE_NAMESPACE_EXIT diff --git a/app/render/videoparams.h b/app/render/videoparams.h index dab019254..3d7102e9f 100644 --- a/app/render/videoparams.h +++ b/app/render/videoparams.h @@ -39,6 +39,10 @@ public: VideoParams(const int& width, const int& height, const PixelFormat::Format& format, const rational& pixel_aspect_ratio = 1, const Interlacing& interlacing = kInterlaceNone, const int& divider = 1); + VideoParams(const int& width, const int& height, const int& depth, + const PixelFormat::Format& format, + const rational& pixel_aspect_ratio = 1, + const Interlacing& interlacing = kInterlaceNone, const int& divider = 1); VideoParams(const int& width, const int& height, const rational& time_base, const PixelFormat::Format& format, const rational& pixel_aspect_ratio = 1, const Interlacing& interlacing = kInterlaceNone, const int& divider = 1); @@ -65,6 +69,17 @@ public: calculate_effective_size(); } + int depth() const + { + return depth_; + } + + void set_depth(int depth) + { + depth_ = depth; + calculate_effective_size(); + } + const rational& time_base() const { return time_base_; @@ -96,6 +111,11 @@ public: return effective_height_; } + int effective_depth() const + { + return effective_depth_; + } + PixelFormat::Format format() const { return format_; @@ -162,6 +182,7 @@ private: int width_; int height_; + int depth_; rational time_base_; PixelFormat::Format format_; @@ -173,6 +194,7 @@ private: int divider_; int effective_width_; int effective_height_; + int effective_depth_; }; OLIVE_NAMESPACE_EXIT diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index cd0636b6d..ce1528f7b 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -23,7 +23,7 @@ #include #include -#include "render/backend/opengl/openglrenderer.h" +#include "render/opengl/openglrenderer.h" #include "render/rendermanager.h" OLIVE_NAMESPACE_ENTER diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index 55da88103..86f82113a 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -23,8 +23,8 @@ #include -#include "render/backend/renderer.h" #include "render/colormanager.h" +#include "render/renderer.h" #include "widget/menu/menu.h" OLIVE_NAMESPACE_ENTER diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index aed0d6988..87def5cc3 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -62,7 +62,7 @@ ShaderCode HistogramScope::GenerateShaderCode() FileFunctions::ReadFileAsString(":/shaders/default.vert")); } -void HistogramScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) +void HistogramScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) { float histogram_scale = 0.80f; // This value is eyeballed for usefulness. Until we have a geometry diff --git a/app/widget/scope/histogram/histogram.h b/app/widget/scope/histogram/histogram.h index d0ab83958..30895f93d 100644 --- a/app/widget/scope/histogram/histogram.h +++ b/app/widget/scope/histogram/histogram.h @@ -42,11 +42,11 @@ protected: virtual ShaderCode GenerateShaderCode() override; QVariant CreateSecondaryShader(); - virtual void DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) override; + virtual void DrawScope(TexturePtr managed_tex, QVariant pipeline) override; private: QVariant pipeline_secondary_; - Renderer::TexturePtr texture_row_sums_; + TexturePtr texture_row_sums_; }; diff --git a/app/widget/scope/scopebase/scopebase.cpp b/app/widget/scope/scopebase/scopebase.cpp index 89644e589..76a717112 100644 --- a/app/widget/scope/scopebase/scopebase.cpp +++ b/app/widget/scope/scopebase/scopebase.cpp @@ -48,7 +48,7 @@ void ScopeBase::showEvent(QShowEvent* e) UploadTextureFromBuffer(); } -void ScopeBase::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) +void ScopeBase::DrawScope(TexturePtr managed_tex, QVariant pipeline) { ShaderJob job; diff --git a/app/widget/scope/scopebase/scopebase.h b/app/widget/scope/scopebase/scopebase.h index 8cde613f8..2bcd415c5 100644 --- a/app/widget/scope/scopebase/scopebase.h +++ b/app/widget/scope/scopebase/scopebase.h @@ -54,16 +54,16 @@ protected: * * Override this if your sub-class scope needs extra drawing. */ - virtual void DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline); + virtual void DrawScope(TexturePtr managed_tex, QVariant pipeline); private: void UploadTextureFromBuffer(); QVariant pipeline_; - Renderer::TexturePtr texture_; + TexturePtr texture_; - Renderer::TexturePtr managed_tex_; + TexturePtr managed_tex_; Frame* buffer_; diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index 3f9f85afc..9abd47458 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -48,7 +48,7 @@ ShaderCode WaveformScope::GenerateShaderCode() FileFunctions::ReadFileAsString(":/shaders/rgbwaveform.vert")); } -void WaveformScope::DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) +void WaveformScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) { float waveform_scale = 0.80f; diff --git a/app/widget/scope/waveform/waveform.h b/app/widget/scope/waveform/waveform.h index 2640f9cf3..687d5b038 100644 --- a/app/widget/scope/waveform/waveform.h +++ b/app/widget/scope/waveform/waveform.h @@ -36,7 +36,7 @@ public: protected: virtual ShaderCode GenerateShaderCode() override; - virtual void DrawScope(Renderer::TexturePtr managed_tex, QVariant pipeline) override; + virtual void DrawScope(TexturePtr managed_tex, QVariant pipeline) override; }; diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index d61d16c20..a8d8b3ade 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -211,7 +211,7 @@ private: /** * @brief Internal reference to the OpenGL texture to draw. Set in SetTexture() and used in paintGL(). */ - Renderer::TexturePtr texture_; + TexturePtr texture_; /** * @brief Translation only matrix (defaults to identity). From c9a8b96c896fd2e36627c6b6e485f36572fca151 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 13 Nov 2020 21:57:32 +1100 Subject: [PATCH 24/72] reimplemented export process --- app/codec/encoder.cpp | 2 +- app/codec/encoder.h | 5 + app/codec/ffmpeg/ffmpegencoder.h | 5 + app/common/filefunctions.cpp | 43 ++- app/common/filefunctions.h | 17 + app/config/config.cpp | 10 +- app/dialog/export/export.cpp | 47 +-- app/dialog/export/export.h | 4 +- app/dialog/export/exportvideotab.cpp | 7 + app/dialog/export/exportvideotab.h | 6 + .../sequence/sequencedialogparametertab.cpp | 2 +- app/render/colorprocessor.h | 4 +- app/render/job/shaderjob.h | 12 - app/render/opengl/openglrenderer.cpp | 5 +- app/render/pixelformat.cpp | 3 +- app/render/renderer.cpp | 20 +- app/render/renderer.h | 6 +- app/render/rendermanager.cpp | 53 ++- app/render/rendermanager.h | 15 +- app/render/renderprocessor.cpp | 66 +++- app/render/renderprocessor.h | 6 +- app/task/export/export.cpp | 88 +++-- app/task/export/export.h | 11 +- app/task/precache/precachetask.cpp | 18 +- app/task/precache/precachetask.h | 6 +- app/task/project/save/save.cpp | 11 +- app/task/render/render.cpp | 322 +++++++++--------- app/task/render/render.h | 40 ++- app/threading/threadticketwatcher.cpp | 9 +- app/threading/threadticketwatcher.h | 4 +- app/widget/viewer/viewerdisplay.cpp | 6 +- 31 files changed, 535 insertions(+), 318 deletions(-) diff --git a/app/codec/encoder.cpp b/app/codec/encoder.cpp index 0f648884e..b328e3135 100644 --- a/app/codec/encoder.cpp +++ b/app/codec/encoder.cpp @@ -232,7 +232,7 @@ void EncodingParams::Save(QXmlStreamWriter *writer) const Encoder* Encoder::CreateFromID(const QString &id, const EncodingParams& params) { Q_UNUSED(id) - + return new FFmpegEncoder(params); } diff --git a/app/codec/encoder.h b/app/codec/encoder.h index 4acf38bde..2d4e2d245 100644 --- a/app/codec/encoder.h +++ b/app/codec/encoder.h @@ -122,6 +122,11 @@ public: virtual void Close() = 0; + virtual PixelFormat::Format GetDesiredPixelFormat() const + { + return PixelFormat::PIX_FMT_INVALID; + } + private: EncodingParams params_; diff --git a/app/codec/ffmpeg/ffmpegencoder.h b/app/codec/ffmpeg/ffmpegencoder.h index 4efc76754..e42d8137a 100644 --- a/app/codec/ffmpeg/ffmpegencoder.h +++ b/app/codec/ffmpeg/ffmpegencoder.h @@ -47,6 +47,11 @@ public: virtual void Close() override; + virtual PixelFormat::Format GetDesiredPixelFormat() const override + { + return video_conversion_fmt_; + } + private: /** * @brief Handle an error diff --git a/app/common/filefunctions.cpp b/app/common/filefunctions.cpp index acb9ee8c3..513d781ea 100644 --- a/app/common/filefunctions.cpp +++ b/app/common/filefunctions.cpp @@ -75,7 +75,7 @@ QString FileFunctions::GetTempFilePath() { QString temp_path = QDir(QDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation)) .filePath(QCoreApplication::organizationName())) - .filePath(QCoreApplication::applicationName()); + .filePath(QCoreApplication::applicationName()); // Ensure it exists QDir(temp_path).mkpath("."); @@ -199,4 +199,45 @@ QString FileFunctions::ReadFileAsString(const QString &filename) return file_data; } +QString FileFunctions::GetSafeTemporaryFilename(const QString &original) +{ + int counter = 0; + + QFileInfo original_info(original); + QString basename = original_info.baseName(); + QString complete_suffix = original_info.completeSuffix(); + + // If we have a complete suffix, make sure there's a period in it + if (!complete_suffix.isEmpty()) { + complete_suffix.prepend('.'); + } + + QString temp_abs_path; + do { + temp_abs_path = original_info.dir().filePath( + QStringLiteral("%1.tmp%2%3").arg(basename, + QString::number(counter), + complete_suffix)); + counter++; + } while (QFileInfo::exists(temp_abs_path)); + + return temp_abs_path; +} + +bool FileFunctions::RenameFileAllowOverwrite(const QString &from, const QString &to) +{ + if (QFileInfo::exists(to) && !QFile::remove(to)) { + qCritical() << "Couldn't remove existing file" << to << "for overwrite"; + return false; + } + + // By this point, we can assume `to` either never existed or has now been deleted + if (!QFile::rename(from, to)) { + qCritical() << "Failed to rename file" << from << "to" << to; + return false; + } + + return true; +} + OLIVE_NAMESPACE_EXIT diff --git a/app/common/filefunctions.h b/app/common/filefunctions.h index 1251dfad6..f19aac9b9 100644 --- a/app/common/filefunctions.h +++ b/app/common/filefunctions.h @@ -67,6 +67,23 @@ public: static QString ReadFileAsString(const QString& filename); + /** + * @brief Returns a temporary filename that can be used while writing rather than the original + * + * If overwriting a file, it's safest to write to a new file first and then only replace it at + * the end so that if the program crashes or the user cancels the save half way through, the + * original file is still intact. + * + * This function returns a slight variant of the filename provided that's guaranteed to not exist + * and therefore won't overwrite anything important. + */ + static QString GetSafeTemporaryFilename(const QString& original); + + /** + * @brief Renames a file from `from` to `to`, deleting `to` if such a file already exists first + */ + static bool RenameFileAllowOverwrite(const QString& from, const QString& to); + }; diff --git a/app/config/config.cpp b/app/config/config.cpp index 40f53240f..2feb40578 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -204,7 +204,10 @@ void Config::Load() void Config::Save() { - QFile config_file(GetConfigFilePath()); + QString real_filename = GetConfigFilePath(); + QString temp_filename = FileFunctions::GetSafeTemporaryFilename(real_filename); + + QFile config_file(temp_filename); if (!config_file.open(QFile::WriteOnly)) { QMessageBox::critical(Core::instance()->main_window(), @@ -243,6 +246,11 @@ void Config::Save() writer.writeEndDocument(); config_file.close(); + + if (!FileFunctions::RenameFileAllowOverwrite(temp_filename, real_filename)) { + qWarning() << QStringLiteral("Failed to overwrite \"%1\". Config has been saved as \"%2\" instead.") + .arg(real_filename, temp_filename); + } } QVariant Config::operator[](const QString &key) const diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index 2d3250be9..c14aff1f3 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -179,6 +179,7 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : video_tab_->height_slider()->SetDefaultValue(viewer_node_->video_params().height()); video_tab_->frame_rate_combobox()->SetFrameRate(viewer_node_->video_params().time_base().flipped()); video_tab_->pixel_aspect_combobox()->SetPixelAspectRatio(viewer_node_->video_params().pixel_aspect_ratio()); + video_tab_->pixel_format_field()->SetPixelFormat(PixelFormat::instance()->GetConfiguredFormatForMode(RenderMode::kOnline)); video_tab_->interlaced_combobox()->SetInterlaceMode(viewer_node_->video_params().interlacing()); audio_tab_->sample_rate_combobox()->SetSampleRate(viewer_node_->audio_params().sample_rate()); audio_tab_->channel_layout_combobox()->SetChannelLayout(viewer_node_->audio_params().channel_layout()); @@ -285,25 +286,36 @@ void ExportDialog::StartExport() } // Validate video resolution - if (video_enabled_->isChecked()) { - if (video_tab_->width_slider()->GetValue() % 2 != 0 - || video_tab_->height_slider()->GetValue() % 2 != 0) { - QMessageBox b(this); - b.setIcon(QMessageBox::Critical); - b.setWindowModality(Qt::WindowModal); - b.setWindowTitle(tr("Invalid parameters")); - b.setText(tr("Width and height must be multiples of 2.")); - b.exec(); - return; - } + if (video_enabled_->isChecked() + && video_tab_->GetSelectedCodec() == ExportCodec::kCodecH264 + && (video_tab_->width_slider()->GetValue()%2 != 0 || video_tab_->height_slider()->GetValue()%2 != 0)) { + QMessageBox b(this); + b.setIcon(QMessageBox::Critical); + b.setWindowModality(Qt::WindowModal); + b.setWindowTitle(tr("Invalid Parameters")); + b.setText(tr("Width and height must be multiples of 2.")); + b.exec(); + return; } ExportTask* task = new ExportTask(viewer_node_, color_manager_, GenerateParams()); TaskDialog* td = new TaskDialog(task, tr("Export"), this); - connect(td, &TaskDialog::TaskSucceeded, this, &QDialog::accept); + connect(td, &TaskDialog::TaskSucceeded, this, &ExportDialog::ExportFinished); td->open(); } +void ExportDialog::ExportFinished() +{ + TaskDialog* td = static_cast(sender()); + + if (td->GetTask()->IsCancelled()) { + // If this task was cancelled, we stay open so the user can potentially queue another export + } else { + // Accept this dialog and close + this->accept(); + } +} + void ExportDialog::closeEvent(QCloseEvent *e) { preview_viewer_->ConnectViewerNode(nullptr); @@ -373,7 +385,7 @@ void ExportDialog::ResolutionChanged() new_width *= video_aspect_ratio_; // Align to even number and set - video_tab_->width_slider()->SetValue(AlignEvenNumber(new_width)); + video_tab_->width_slider()->SetValue(new_width); } else { @@ -384,7 +396,7 @@ void ExportDialog::ResolutionChanged() new_height /= video_aspect_ratio_; // Align to even number and set - video_tab_->height_slider()->SetValue(AlignEvenNumber(new_height)); + video_tab_->height_slider()->SetValue(new_height); } } @@ -414,17 +426,12 @@ void ExportDialog::SetDefaultFilename() filename_edit_->setText(file_location); } -int ExportDialog::AlignEvenNumber(double d) -{ - return qCeil(d * 0.5) * 2; -} - ExportParams ExportDialog::GenerateParams() const { VideoParams video_render_params(static_cast(video_tab_->width_slider()->GetValue()), static_cast(video_tab_->height_slider()->GetValue()), video_tab_->frame_rate_combobox()->GetFrameRate().flipped(), - PixelFormat::instance()->GetConfiguredFormatForMode(RenderMode::kOnline), + video_tab_->pixel_format_field()->GetPixelFormat(), video_tab_->pixel_aspect_combobox()->GetPixelAspectRatio(), video_tab_->interlaced_combobox()->GetInterlaceMode(), 1); diff --git a/app/dialog/export/export.h b/app/dialog/export/export.h index 8313e59cf..d92eaba3e 100644 --- a/app/dialog/export/export.h +++ b/app/dialog/export/export.h @@ -49,8 +49,6 @@ private: void LoadPresets(); void SetDefaultFilename(); - static int AlignEvenNumber(double d); - ExportParams GenerateParams() const; ViewerOutput* viewer_node_; @@ -85,6 +83,8 @@ private slots: void StartExport(); + void ExportFinished(); + }; OLIVE_NAMESPACE_EXIT diff --git a/app/dialog/export/exportvideotab.cpp b/app/dialog/export/exportvideotab.cpp index 9d62c360f..617f67269 100644 --- a/app/dialog/export/exportvideotab.cpp +++ b/app/dialog/export/exportvideotab.cpp @@ -115,6 +115,13 @@ QWidget* ExportVideoTab::SetupResolutionSection() interlaced_combobox_ = new InterlacedComboBox(); layout->addWidget(interlaced_combobox_, row, 1); + row++; + + layout->addWidget(new QLabel(tr("Quality:")), row, 0); + + pixel_format_field_ = new PixelFormatComboBox(true); + layout->addWidget(pixel_format_field_, row, 1); + return resolution_group; } diff --git a/app/dialog/export/exportvideotab.h b/app/dialog/export/exportvideotab.h index fe35d884b..ffbac3e19 100644 --- a/app/dialog/export/exportvideotab.h +++ b/app/dialog/export/exportvideotab.h @@ -111,6 +111,11 @@ public: return pixel_aspect_combobox_; } + PixelFormatComboBox* pixel_format_field() const + { + return pixel_format_field_; + } + const int& threads() const { return threads_; @@ -149,6 +154,7 @@ private: InterlacedComboBox* interlaced_combobox_; PixelAspectRatioComboBox* pixel_aspect_combobox_; + PixelFormatComboBox* pixel_format_field_; int threads_; diff --git a/app/dialog/sequence/sequencedialogparametertab.cpp b/app/dialog/sequence/sequencedialogparametertab.cpp index 7487ba294..cd744eefc 100644 --- a/app/dialog/sequence/sequencedialogparametertab.cpp +++ b/app/dialog/sequence/sequencedialogparametertab.cpp @@ -74,7 +74,7 @@ SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence* sequence, QWidg preview_resolution_label_ = new QLabel(); preview_layout->addWidget(preview_resolution_label_, row, 2); row++; - preview_layout->addWidget(new QLabel(tr("Format:")), row, 0); + preview_layout->addWidget(new QLabel(tr("Quality:")), row, 0); preview_format_field_ = new PixelFormatComboBox(true); preview_layout->addWidget(preview_format_field_, row, 1, 1, 2); layout->addWidget(preview_group); diff --git a/app/render/colorprocessor.h b/app/render/colorprocessor.h index 5d0b9a8f1..531f0ce3f 100644 --- a/app/render/colorprocessor.h +++ b/app/render/colorprocessor.h @@ -70,8 +70,10 @@ private: }; -using ColorProcessorChain = QList; +using ColorProcessorChain = QVector; OLIVE_NAMESPACE_EXIT +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::ColorProcessorPtr); + #endif // COLORPROCESSOR_H diff --git a/app/render/job/shaderjob.h b/app/render/job/shaderjob.h index c6fc66cd9..72b8c9270 100644 --- a/app/render/job/shaderjob.h +++ b/app/render/job/shaderjob.h @@ -36,16 +36,6 @@ public: iterative_input_ = nullptr; } - const QMatrix4x4& GetMatrix() const - { - return matrix_; - } - - void SetMatrix(const QMatrix4x4& matrix) - { - matrix_ = matrix; - } - const QString& GetShaderID() const { return shader_id_; @@ -101,8 +91,6 @@ private: QHash interpolation_; - QMatrix4x4 matrix_; - }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/opengl/openglrenderer.cpp b/app/render/opengl/openglrenderer.cpp index 25a1c9fb0..e6e304099 100644 --- a/app/render/opengl/openglrenderer.cpp +++ b/app/render/opengl/openglrenderer.cpp @@ -431,8 +431,9 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video static_cast(destination_params.width()), static_cast(destination_params.height())); - // Set matrix to identity - shader->setUniformValue("ove_mvpmat", job.GetMatrix()); + // Ensure matrix is set, at least to identity + shader->setUniformValue("ove_mvpmat", + job.GetValue(QStringLiteral("ove_mvpmat")).data.value()); // Set the viewport to the "physical" resolution of the destination functions_->glViewport(0, 0, diff --git a/app/render/pixelformat.cpp b/app/render/pixelformat.cpp index 9aee69783..92c0ebd46 100644 --- a/app/render/pixelformat.cpp +++ b/app/render/pixelformat.cpp @@ -127,7 +127,8 @@ PixelFormat *PixelFormat::instance() PixelFormat::Format PixelFormat::GetConfiguredFormatForMode(RenderMode::Mode mode) { - return static_cast(Core::GetPreferenceForRenderMode(mode, QStringLiteral("PixelFormat")).toInt()); + return static_cast( + Core::GetPreferenceForRenderMode(mode, QStringLiteral("PixelFormat")).toInt()); } void PixelFormat::SetConfiguredFormatForMode(RenderMode::Mode mode, PixelFormat::Format format) diff --git a/app/render/renderer.cpp b/app/render/renderer.cpp index ffebfa072..acd9885eb 100644 --- a/app/render/renderer.cpp +++ b/app/render/renderer.cpp @@ -23,7 +23,6 @@ #include #include "common/ocioutils.h" -#include "render/colormanager.h" OLIVE_NAMESPACE_ENTER @@ -57,14 +56,14 @@ TexturePtr Renderer::CreateTexture(const VideoParams ¶ms, const void *data, return CreateTexture(params, Texture::k2D, Texture::kRGBA, data, linesize); } -void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, bool flipped) +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, const QMatrix4x4 &matrix) { - BlitColorManagedInternal(color_processor, source, destination, destination->params(), flipped); + BlitColorManagedInternal(color_processor, source, destination, destination->params(), matrix); } -void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, bool flipped) +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, const QMatrix4x4& matrix) { - BlitColorManagedInternal(color_processor, source, nullptr, params, flipped); + BlitColorManagedInternal(color_processor, source, nullptr, params, matrix); } void Renderer::Destroy() @@ -195,7 +194,7 @@ bool Renderer::GetColorContext(ColorProcessorPtr color_processor, Renderer::Colo } } -void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, VideoParams params, bool flipped) +void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, VideoParams params, const QMatrix4x4& matrix) { ColorContext color_ctx; if (!GetColorContext(color_processor, &color_ctx)) { @@ -203,7 +202,10 @@ void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, Textu } ShaderJob job; + job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); + job.InsertValue(QStringLiteral("ove_mvpmat"), ShaderValue(matrix, NodeParam::kMatrix)); + foreach (const ColorContext::LUT& l, color_ctx.lut3d_textures) { job.InsertValue(l.name, ShaderValue(QVariant::fromValue(l.texture), NodeParam::kTexture)); job.SetInterpolation(l.name, l.interpolation); @@ -213,12 +215,6 @@ void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, Textu job.SetInterpolation(l.name, l.interpolation); } - if (flipped) { - QMatrix4x4 mat; - mat.scale(1, -1, 1); - job.SetMatrix(mat); - } - if (destination) { BlitToTexture(color_ctx.compiled_shader, job, destination); } else { diff --git a/app/render/renderer.h b/app/render/renderer.h index 2da550fa1..bee5dc21b 100644 --- a/app/render/renderer.h +++ b/app/render/renderer.h @@ -60,8 +60,8 @@ public: Blit(shader, job, nullptr, params); } - void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture* destination, bool flipped = false); - void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, bool flipped = false); + void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture* destination, const QMatrix4x4& matrix = QMatrix4x4()); + void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, const QMatrix4x4& matrix = QMatrix4x4()); void Destroy(); @@ -108,7 +108,7 @@ private: bool GetColorContext(ColorProcessorPtr color_processor, ColorContext* ctx); void BlitColorManagedInternal(ColorProcessorPtr color_processor, TexturePtr source, - Texture* destination, VideoParams params, bool flipped); + Texture* destination, VideoParams params, const QMatrix4x4 &matrix); QHash color_cache_; diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index de9b4b408..2f6401a06 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -56,8 +56,10 @@ RenderManager::RenderManager(QObject *parent) : still_cache_ = new StillImageCache(); decoder_cache_ = new DecoderCache(); shader_cache_ = new ShaderCache(); + default_shader_ = context_->CreateNativeShader(ShaderCode(QString(), QString())); } else { qCritical() << "Tried to initialize unknown graphics backend"; + context_ = nullptr; still_cache_ = nullptr; decoder_cache_ = nullptr; } @@ -65,12 +67,16 @@ RenderManager::RenderManager(QObject *parent) : RenderManager::~RenderManager() { - delete shader_cache_; - delete decoder_cache_; - delete still_cache_; + if (context_) { + context_->DestroyNativeShader(default_shader_); - context_->Destroy(); - delete context_; + delete shader_cache_; + delete decoder_cache_; + delete still_cache_; + + context_->Destroy(); + delete context_; + } } QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const rational &time) @@ -93,19 +99,31 @@ QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const r return hasher.result(); } -RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager *color_manager, const rational &time, RenderMode::Mode mode, FrameHashCache *cache, bool prioritize) +RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, + const rational& time, RenderMode::Mode mode, + FrameHashCache* cache, bool prioritize) { return RenderFrame(viewer, color_manager, time, mode, + viewer->video_params(), + viewer->audio_params(), QSize(0, 0), QMatrix4x4(), + PixelFormat::PIX_FMT_INVALID, + nullptr, cache, prioritize); } -RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational &time, RenderMode::Mode mode, const QSize &force_size, const QMatrix4x4 &matrix, FrameHashCache *cache, bool prioritize) +RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, + const rational& time, RenderMode::Mode mode, + const VideoParams &video_params, const AudioParams &audio_params, + const QSize& force_size, + const QMatrix4x4& force_matrix, PixelFormat::Format force_format, + ColorProcessorPtr force_color_output, + FrameHashCache* cache, bool prioritize) { // Create ticket RenderTicketPtr ticket = std::make_shared(); @@ -113,11 +131,18 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* c ticket->setProperty("viewer", Node::PtrToValue(viewer)); ticket->setProperty("time", QVariant::fromValue(time)); ticket->setProperty("size", force_size); - ticket->setProperty("matrix", matrix); + ticket->setProperty("matrix", force_matrix); + ticket->setProperty("format", force_format); ticket->setProperty("mode", mode); ticket->setProperty("type", kTypeVideo); - ticket->setProperty("cache", cache->GetCacheDirectory()); ticket->setProperty("colormanager", Node::PtrToValue(color_manager)); + ticket->setProperty("coloroutput", QVariant::fromValue(force_color_output)); + ticket->setProperty("vparam", QVariant::fromValue(video_params)); + ticket->setProperty("aparam", QVariant::fromValue(audio_params)); + + if (cache) { + ticket->setProperty("cache", cache->GetCacheDirectory()); + } // Queue appending the ticket and running the next job on our thread to make this function thread-safe QMetaObject::invokeMethod(this, "AddTicket", Qt::AutoConnection, @@ -127,7 +152,12 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* c return ticket; } -RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange &r, bool generate_waveforms, bool prioritize) +RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange& r, bool generate_waveforms, bool prioritize) +{ + return RenderAudio(viewer, r, viewer->audio_params(), generate_waveforms, prioritize); +} + +RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange &r, const AudioParams ¶ms, bool generate_waveforms, bool prioritize) { // Create ticket RenderTicketPtr ticket = std::make_shared(); @@ -136,6 +166,7 @@ RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange ticket->setProperty("time", QVariant::fromValue(r)); ticket->setProperty("type", kTypeAudio); ticket->setProperty("waveforms", generate_waveforms); + ticket->setProperty("aparam", QVariant::fromValue(params)); // Queue appending the ticket and running the next job on our thread to make this function thread-safe QMetaObject::invokeMethod(this, "AddTicket", Qt::AutoConnection, @@ -165,7 +196,7 @@ RenderTicketPtr RenderManager::SaveFrameToCache(FrameHashCache *cache, FramePtr void RenderManager::RunTicket(RenderTicketPtr ticket) const { - RenderProcessor::Process(ticket, context_, still_cache_, decoder_cache_, shader_cache_); + RenderProcessor::Process(ticket, context_, still_cache_, decoder_cache_, shader_cache_, default_shader_); } OLIVE_NAMESPACE_EXIT diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 0f73ca53d..702356023 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -80,8 +80,16 @@ public: * * This function is thread-safe. */ - RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, FrameHashCache* cache = nullptr, bool prioritize = false); - RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, const QSize& force_size, const QMatrix4x4& matrix, FrameHashCache* cache = nullptr, bool prioritize = false); + RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, + const rational& time, RenderMode::Mode mode, + FrameHashCache* cache = nullptr, bool prioritize = false); + RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, + const rational& time, RenderMode::Mode mode, + const VideoParams& video_params, const AudioParams& audio_params, + const QSize& force_size, + const QMatrix4x4& force_matrix, PixelFormat::Format force_format, + ColorProcessorPtr force_color_output, + FrameHashCache* cache = nullptr, bool prioritize = false); /** * @brief Asynchronously generate a chunk of audio @@ -93,6 +101,7 @@ public: * * This function is thread-safe. */ + RenderTicketPtr RenderAudio(ViewerOutput* viewer, const TimeRange& r, const AudioParams& params, bool generate_waveforms, bool prioritize = false); RenderTicketPtr RenderAudio(ViewerOutput* viewer, const TimeRange& r, bool generate_waveforms, bool prioritize = false); RenderTicketPtr SaveFrameToCache(FrameHashCache* cache, FramePtr frame, const QByteArray& hash, bool prioritize = false); @@ -129,6 +138,8 @@ private: ShaderCache* shader_cache_; + QVariant default_shader_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 6587c6d0c..146cb5d7a 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -29,12 +29,13 @@ OLIVE_NAMESPACE_ENTER -RenderProcessor::RenderProcessor(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache *shader_cache) : +RenderProcessor::RenderProcessor(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache *shader_cache, QVariant default_shader) : ticket_(ticket), render_ctx_(render_ctx), still_image_cache_(still_image_cache), decoder_cache_(decoder_cache), - shader_cache_(shader_cache) + shader_cache_(shader_cache), + default_shader_(default_shader) { } @@ -49,14 +50,16 @@ void RenderProcessor::Run() case RenderManager::kTypeVideo: { ViewerOutput* viewer = Node::ValueToPtr(ticket_->property("viewer")); + const VideoParams& video_params = ticket_->property("vparam").value(); rational time = ticket_->property("time").value(); NodeValueTable table = ProcessInput(viewer->texture_input(), - TimeRange(time, time + viewer->video_params().time_base())); + TimeRange(time, time + video_params.time_base())); TexturePtr texture = table.Get(NodeParam::kTexture).value(); - VideoParams frame_params = viewer->video_params(); + // Set up output frame parameters + VideoParams frame_params = ticket_->property("vparam").value(); QSize frame_size = ticket_->property("size").value(); if (!frame_size.isNull()) { @@ -64,6 +67,11 @@ void RenderProcessor::Run() frame_params.set_height(frame_size.height()); } + PixelFormat::Format frame_format = static_cast(ticket_->property("format").toInt()); + if (frame_format != PixelFormat::PIX_FMT_INVALID) { + frame_params.set_format(frame_format); + } + FramePtr frame = Frame::Create(); frame->set_timestamp(time); frame->set_video_params(frame_params); @@ -74,10 +82,31 @@ void RenderProcessor::Run() memset(frame->data(), 0, frame->allocated_size()); } else { // Dump texture contents to frame + ColorProcessorPtr output_color_transform = ticket_->property("coloroutput").value(); const VideoParams& tex_params = texture->params(); - if (tex_params.width() != frame->width() || tex_params.height() != frame->height()) { - // FIXME: Blit this shit + if (tex_params.effective_width() != frame_params.effective_width() + || tex_params.effective_height() != frame_params.effective_height() + || tex_params.format() != frame_params.format() + || output_color_transform) { + TexturePtr blit_tex = render_ctx_->CreateTexture(frame_params); + + QMatrix4x4 matrix = ticket_->property("matrix").value(); + + if (output_color_transform) { + // Yes color transform, blit color managed + render_ctx_->BlitColorManaged(output_color_transform, texture, blit_tex.get(), matrix); + } else { + // No color transform, just blit + ShaderJob job; + job.InsertValue(QStringLiteral("ove_maintex"), {QVariant::fromValue(texture), NodeParam::kTexture}); + job.InsertValue(QStringLiteral("ove_mvpmat"), {matrix, NodeParam::kMatrix}); + + render_ctx_->BlitToTexture(default_shader_, job, blit_tex.get()); + } + + // Replace texture that we're going to download in the next step + texture = blit_tex; } render_ctx_->DownloadFromTexture(texture.get(), frame->data(), frame->linesize_pixels()); @@ -138,9 +167,9 @@ DecoderPtr RenderProcessor::ResolveDecoderFromInput(StreamPtr stream) return decoder; } -void RenderProcessor::Process(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache *still_image_cache, DecoderCache *decoder_cache, ShaderCache *shader_cache) +void RenderProcessor::Process(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache *still_image_cache, DecoderCache *decoder_cache, ShaderCache *shader_cache, QVariant default_shader) { - RenderProcessor p(ticket, render_ctx, still_image_cache, decoder_cache, shader_cache); + RenderProcessor p(ticket, render_ctx, still_image_cache, decoder_cache, shader_cache, default_shader); p.Run(); } @@ -148,7 +177,7 @@ NodeValueTable RenderProcessor::GenerateBlockTable(const TrackOutput *track, con { if (track->track_type() == Timeline::kTrackTypeAudio) { - const AudioParams& audio_params = Node::ValueToPtr(ticket_->property("viewer"))->audio_params(); + const AudioParams& audio_params = ticket_->property("aparam").value(); QList active_blocks = track->BlocksAtTimeRange(range); @@ -228,11 +257,13 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & // and color managing them for every frame is a waste of time, so we implement a small cache here // to optimize such a situation VideoStreamPtr video_stream = std::static_pointer_cast(stream); - const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); + const VideoParams& video_params = ticket_->property("vparam").value(); + + ColorManager* color_manager = Node::ValueToPtr(ticket_->property("colormanager")); StillImageCache::Entry want_entry = {nullptr, stream, - ColorProcessor::GenerateID(Node::ValueToPtr(ticket_->property("colormanager")), video_stream->colorspace(), ColorTransform(OCIO::ROLE_SCENE_LINEAR)), + ColorProcessor::GenerateID(color_manager, video_stream->colorspace(), color_manager->GetReferenceColorSpace()), video_stream->premultiplied_alpha(), video_params.divider(), (video_stream->video_type() == VideoStream::kVideoTypeStill) ? 0 : input_time}; @@ -297,10 +328,9 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & qDebug() << "FIXME: Accessing video_stream->colorspace() may cause race conditions"; - ColorManager* color_manager = Node::ValueToPtr(ticket_->property("colormanager")); ColorProcessorPtr processor = ColorProcessor::Create(color_manager, video_stream->colorspace(), - ColorTransform(OCIO::ROLE_SCENE_LINEAR)); + color_manager->GetReferenceColorSpace()); render_ctx_->BlitColorManaged(processor, unmanaged_texture, value.get()); @@ -327,7 +357,7 @@ QVariant RenderProcessor::ProcessAudioFootage(StreamPtr stream, const TimeRange DecoderPtr decoder = ResolveDecoderFromInput(stream); if (decoder) { - const AudioParams& audio_params = Node::ValueToPtr(ticket_->property("viewer"))->audio_params(); + const AudioParams& audio_params = ticket_->property("aparam").value(); SampleBufferPtr frame = decoder->RetrieveAudio(input_time, audio_params, &IsCancelled()); @@ -359,7 +389,7 @@ QVariant RenderProcessor::ProcessShader(const Node *node, const TimeRange &range } } - const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); + const VideoParams& video_params = ticket_->property("vparam").value(); TexturePtr destination = render_ctx_->CreateTexture(video_params); @@ -378,7 +408,7 @@ QVariant RenderProcessor::ProcessSamples(const Node *node, const TimeRange &rang SampleBufferPtr output_buffer = SampleBuffer::CreateAllocated(job.samples()->audio_params(), job.samples()->sample_count()); NodeValueDatabase value_db; - const AudioParams& audio_params = Node::ValueToPtr(ticket_->property("viewer"))->audio_params(); + const AudioParams& audio_params = ticket_->property("aparam").value(); for (int i=0;isample_count();i++) { // Calculate the exact rational time at this sample @@ -416,7 +446,7 @@ QVariant RenderProcessor::ProcessFrameGeneration(const Node *node, const Generat { FramePtr frame = Frame::Create(); - const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); + const VideoParams& video_params = ticket_->property("vparam").value(); frame->set_video_params(video_params); frame->allocate(); @@ -436,7 +466,7 @@ QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) { if (!ticket_->property("cache").toString().isEmpty() && node->id() == QStringLiteral("org.olivevideoeditor.Olive.videoinput")) { - const VideoParams& video_params = Node::ValueToPtr(ticket_->property("viewer"))->video_params(); + const VideoParams& video_params = ticket_->property("vparam").value(); QByteArray hash = RenderManager::Hash(node, video_params, time); diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index ed5bf38ae..17098179d 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -32,7 +32,7 @@ OLIVE_NAMESPACE_ENTER class RenderProcessor : public NodeTraverser { public: - static void Process(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache* shader_cache); + static void Process(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache* shader_cache, QVariant default_shader); struct RenderedWaveform { const TrackOutput* track; @@ -56,7 +56,7 @@ protected: virtual QVariant GetCachedFrame(const Node *node, const rational &time) override; private: - RenderProcessor(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache* shader_cache); + RenderProcessor(RenderTicketPtr ticket, Renderer* render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache* shader_cache, QVariant default_shader); void Run(); @@ -72,6 +72,8 @@ private: ShaderCache* shader_cache_; + QVariant default_shader_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index d5da32ae5..e7e53b0a1 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -39,7 +39,16 @@ bool ExportTask::Run() { TimeRange range; + // For safety, if we're overwriting, we save to a temporary filename and then only overwrite it + // at the end + QString real_filename = params_.filename(); + if (QFileInfo::exists(params_.filename())) { + // Generate a filename that definitely doesn't exist + params_.SetFilename(FileFunctions::GetSafeTemporaryFilename(real_filename)); + } + encoder_ = Encoder::CreateFromID(params_.encoder(), params_); + if (!encoder_) { SetError(tr("Failed to create encoder")); return false; @@ -61,17 +70,26 @@ bool ExportTask::Run() frame_time_ = Timecode::time_to_timestamp(range.in(), viewer()->video_params().time_base()); + QSize video_force_size; + QMatrix4x4 video_force_matrix; + if (params_.video_enabled()) { // If a transformation matrix is applied to this video, create it here - if (params_.video_scaling_method() != ExportParams::kStretch) { - // FIXME: Re-implement this + if (viewer()->video_params().width() != params_.video_params().width() + || params_.video_params().height() != params_.video_params().height()) { + video_force_size = QSize(params_.video_params().width(), params_.video_params().height()); - /*QMatrix4x4 mat = ExportParams::GenerateMatrix(params_.video_scaling_method(), - viewer()->video_params().width(), - viewer()->video_params().height(), - params_.video_params().width(), - params_.video_params().height());*/ + if (params_.video_scaling_method() != ExportParams::kStretch) { + video_force_matrix = ExportParams::GenerateMatrix(params_.video_scaling_method(), + viewer()->video_params().width(), + viewer()->video_params().height(), + params_.video_params().width(), + params_.video_params().height()); + } + } else { + // Disables forcing size in the renderer + video_force_size = QSize(0, 0); } // Create color processor @@ -96,7 +114,9 @@ bool ExportTask::Run() audio_data_.SetLength(range.length()); } - Render(video_range, audio_range, RenderMode::kOnline, false); + Render(color_manager_, video_range, audio_range, RenderMode::kOnline, nullptr, + video_force_size, video_force_matrix, encoder_->GetDesiredPixelFormat(), + color_processor_); bool success = true; @@ -107,35 +127,28 @@ bool ExportTask::Run() encoder_->Close(); - encoder_->deleteLater(); + delete encoder_; + + // If cancelled, delete the file we made, which is always a file we created since we write to a + // temp file during the actual encoding process + if (IsCancelled()) { + QFile::remove(params_.filename()); + } else if (params_.filename() != real_filename) { + // If we were writing to a temp file, overwrite now + if (!FileFunctions::RenameFileAllowOverwrite(params_.filename(), real_filename)) { + SetError(tr("Failed to overwrite \"%1\". Export has been saved as \"%2\" instead.") + .arg(real_filename, params_.filename())); + success = false; + } + } return success; } -void FrameColorConvert(ColorProcessorPtr processor, FramePtr frame) -{ - // Color conversion must be done with unassociated alpha, and the pipeline is always associated - ColorManager::DisassociateAlpha(frame); - - // Convert color space - processor->ConvertFrame(frame); - - // Re-associate alpha - ColorManager::ReassociateAlpha(frame); -} - -QFuture ExportTask::DownloadFrame(FramePtr frame, const QByteArray &hash) -{ - rendered_frame_.insert(hash, frame); - - return QtConcurrent::run(FrameColorConvert, color_processor_, frame); -} - -void ExportTask::FrameDownloaded(const QByteArray &hash, const std::list ×, qint64 job_time) +void ExportTask::FrameDownloaded(FramePtr f, const QByteArray &hash, const QVector ×, qint64 job_time) { Q_UNUSED(job_time) - - FramePtr f = rendered_frame_.value(hash); + Q_UNUSED(hash) foreach (const rational& t, times) { time_map_.insert(t, f); @@ -154,10 +167,21 @@ void ExportTask::FrameDownloaded(const QByteArray &hash, const std::listWriteFrame(time_map_.take(real_time), real_time); frame_time_++; - } } +void FrameColorConvert(ColorProcessorPtr processor, FramePtr frame) +{ + // Color conversion must be done with unassociated alpha, and the pipeline is always associated + ColorManager::DisassociateAlpha(frame); + + // Convert color space + processor->ConvertFrame(frame); + + // Re-associate alpha + ColorManager::ReassociateAlpha(frame); +} + void ExportTask::AudioDownloaded(const TimeRange &range, SampleBufferPtr samples, qint64 job_time) { Q_UNUSED(job_time) diff --git a/app/task/export/export.h b/app/task/export/export.h index 58e392ad5..4829f02c3 100644 --- a/app/task/export/export.h +++ b/app/task/export/export.h @@ -38,15 +38,16 @@ public: protected: virtual bool Run() override; - virtual QFuture DownloadFrame(FramePtr frame, const QByteArray &hash) override; - - virtual void FrameDownloaded(const QByteArray& hash, const std::list& times, qint64 job_time) override; + virtual void FrameDownloaded(FramePtr frame, const QByteArray& hash, const QVector& times, qint64 job_time) override; virtual void AudioDownloaded(const TimeRange& range, SampleBufferPtr samples, qint64 job_time) override; -private: - QHash rendered_frame_; + virtual bool TwoStepFrameRendering() const override + { + return false; + } +private: QHash time_map_; ColorManager* color_manager_; diff --git a/app/task/precache/precachetask.cpp b/app/task/precache/precachetask.cpp index 8250c2d01..5d96f5978 100644 --- a/app/task/precache/precachetask.cpp +++ b/app/task/precache/precachetask.cpp @@ -20,6 +20,8 @@ #include "precachetask.h" +#include "project/project.h" + OLIVE_NAMESPACE_ENTER PreCacheTask::PreCacheTask(VideoStreamPtr footage, Sequence* sequence) : @@ -61,23 +63,21 @@ bool PreCacheTask::Run() } */ - Render(video_range, TimeRangeList(), RenderMode::kOnline, true); - - download_threads_.waitForDone(); + Render(footage_->footage()->project()->color_manager(), + video_range, + TimeRangeList(), + RenderMode::kOnline, + viewer()->video_frame_cache()); return true; } -QFuture PreCacheTask::DownloadFrame(FramePtr frame, const QByteArray &hash) -{ - return QtConcurrent::run(&download_threads_, viewer()->video_frame_cache(), &FrameHashCache::SaveCacheFrame, hash, frame); -} - -void PreCacheTask::FrameDownloaded(const QByteArray &hash, const std::list ×, qint64 job_time) +void PreCacheTask::FrameDownloaded(FramePtr frame, const QByteArray &hash, const QVector ×, qint64 job_time) { // Do nothing. Pre-cache essentially just creates more frames in the cache, it doesn't need to do // anything else. + Q_UNUSED(frame) Q_UNUSED(hash) Q_UNUSED(times) Q_UNUSED(job_time) diff --git a/app/task/precache/precachetask.h b/app/task/precache/precachetask.h index 090fedd44..960d2fa02 100644 --- a/app/task/precache/precachetask.h +++ b/app/task/precache/precachetask.h @@ -38,9 +38,7 @@ public: protected: virtual bool Run() override; - virtual QFuture DownloadFrame(FramePtr frame, const QByteArray &hash) override; - - virtual void FrameDownloaded(const QByteArray& hash, const std::list& times, qint64 job_time) override; + virtual void FrameDownloaded(FramePtr frame, const QByteArray& hash, const QVector& times, qint64 job_time) override; virtual void AudioDownloaded(const TimeRange& range, SampleBufferPtr samples, qint64 job_time) override; @@ -49,8 +47,6 @@ private: VideoInput* video_node_; - QThreadPool download_threads_; - }; OLIVE_NAMESPACE_EXIT diff --git a/app/task/project/save/save.cpp b/app/task/project/save/save.cpp index 4ee1b1fc0..a196d38f7 100644 --- a/app/task/project/save/save.cpp +++ b/app/task/project/save/save.cpp @@ -38,7 +38,7 @@ ProjectSaveTask::ProjectSaveTask(ProjectPtr project) : bool ProjectSaveTask::Run() { // File to temporarily save to (ensures we can't half-write the user's main file and crash) - QString temp_save = QDir(FileFunctions::GetTempFilePath()).filePath(QStringLiteral("tempsv")); + QString temp_save = FileFunctions::GetSafeTemporaryFilename(project_->filename()); QFile project_file(temp_save); @@ -74,16 +74,15 @@ bool ProjectSaveTask::Run() } // Save was successful, we can now rewrite the original file - QFile original(project_->filename()); - if ((!original.exists() || original.remove()) - && QFile::copy(temp_save, project_->filename())) { + if (FileFunctions::RenameFileAllowOverwrite(temp_save, project_->filename())) { return true; } else { - SetError(tr("Failed to write to \"%1\".").arg(project_->filename())); + SetError(tr("Failed to overwrite \"%1\". Project has been saved as \"%2\" instead.") + .arg(project_->filename(), temp_save)); return false; } } else { - SetError(tr("Failed to open file \"%1\" for writing.").arg(project_->filename())); + SetError(tr("Failed to open temporary file \"%1\" for writing.").arg(temp_save)); return false; } } diff --git a/app/task/render/render.cpp b/app/task/render/render.cpp index d0b88d0c1..6b90dd1e4 100644 --- a/app/task/render/render.cpp +++ b/app/task/render/render.cpp @@ -22,14 +22,14 @@ #include "common/timecodefunctions.h" #include "render/rendermanager.h" -#include "threading/threadticket.h" OLIVE_NAMESPACE_ENTER RenderTask::RenderTask(ViewerOutput* viewer, const VideoParams &vparams, const AudioParams &aparams) : viewer_(viewer), video_params_(vparams), - audio_params_(aparams) + audio_params_(aparams), + running_tickets_(0) { } @@ -37,207 +37,205 @@ RenderTask::~RenderTask() { } -struct TimeHashFuturePair { - rational time; - RenderTicketPtr hash_future; -}; - -struct HashTimePair { - rational time; - QByteArray hash; -}; - -struct HashFrameFuturePair { - QByteArray hash; - RenderTicketPtr frame_future; -}; - -struct RangeSampleFuturePair { - TimeRange range; - RenderTicketPtr sample_future; -}; - -struct HashDownloadFuturePair { - QByteArray hash; - QFuture download_future; - qint64 job_time; -}; - -void RenderTask::Render(const TimeRangeList& video_range, +bool RenderTask::Render(ColorManager* manager, + const TimeRangeList& video_range, const TimeRangeList &audio_range, RenderMode::Mode mode, - bool use_disk_cache) + FrameHashCache* cache, const QSize &force_size, + const QMatrix4x4 &force_matrix, PixelFormat::Format force_format, + ColorProcessorPtr force_color_output) { - /* + // Run watchers in another thread so they can accept signals even while this thread is blocked + QThread watcher_thread; + watcher_thread.start(); + double progress_counter = 0; double total_length = 0; double video_frame_sz = video_params().time_base().toDouble(); - std::list audio_queue; - std::list audio_lookup_table; - if (!audio_range.isEmpty()) { - foreach (const TimeRange& r, audio_range) { - total_length += r.length().toDouble(); + // Store real time before any rendering takes place + qint64 job_time = QDateTime::currentMSecsSinceEpoch(); - std::list ranges = r.Split(2); - audio_queue.insert(audio_queue.end(), ranges.begin(), ranges.end()); - } + // Queue audio jobs + foreach (const TimeRange& r, audio_range) { + // Don't count audio progress, since it's generally a lot faster than video and is weighted at + // 50%, which makes the progress bar look weird to the uninitiated + //total_length += r.length().toDouble(); + + IncrementRunningTickets(); + + RenderTicketWatcher* watcher = CreateWatcher(&watcher_thread); + watcher->setProperty("range", QVariant::fromValue(r)); + watcher->SetTicket(RenderManager::instance()->RenderAudio(viewer_, r, audio_params_, false)); } - std::list render_lookup_table; - QVector times; - QVector hashes; - std::list frame_queue; - qint64 hash_job_time = 0; + // Look up hashes + QMap > time_map; if (!video_range.isEmpty()) { - times = viewer()->video_frame_cache()->GetFrameListFromTimeRange(video_range); + // Get list of discrete frames from range + QVector times = viewer()->video_frame_cache()->GetFrameListFromTimeRange(video_range); + QVector hashes(times.size()); + // Add to "total progress" total_length += video_frame_sz * times.size(); - RenderTicketPtr hash_future = RenderManager::instance()->Hash(viewer(), times); - hashes = hash_future->Get().value >(); - hash_job_time = hash_future->GetJobTime(); + // Generate hashes + for (int i=0; iWasCancelled()) { - for (int i=0;iHash(viewer(), video_params_, times.at(i)); + } + + // Filter out duplicates + for (int i=0; isetProperty("hash", hash); + + IncrementRunningTickets(); + + watcher->SetTicket(RenderManager::instance()->RenderFrame(viewer_, manager, times.at(i), + mode, video_params_, audio_params_, + force_size, force_matrix, + force_format, force_color_output, + cache)); } } } - // Start downloading frames that have finished - std::list download_futures; + finished_watcher_mutex_.lock(); - // Iterators - std::list::iterator i; - std::list::iterator j; - std::list::iterator k; + while (!IsCancelled()) { + while (!finished_watchers_.empty() && !IsCancelled()) { + RenderTicketWatcher* watcher = finished_watchers_.front(); + finished_watchers_.pop_front(); - std::list running_hashes; - std::list existing_hashes; + finished_watcher_mutex_.unlock(); - while (!IsCancelled() - && (!render_lookup_table.empty() - || !frame_queue.empty() - || !audio_queue.empty() - || !download_futures.empty() - || !audio_lookup_table.empty())) { + // Analyze watcher here + RenderManager::TicketType ticket_type = watcher->GetTicket()->property("type").value(); - while (!IsCancelled() && !frame_queue.empty()) { + if (ticket_type == RenderManager::kTypeAudio) { - // Pop another frame off the frame queue - const HashTimePair& p = frame_queue.front(); + TimeRange range = watcher->property("range").value(); - // Check if we're already rendering this hash - bool rendering_hash = (std::find(running_hashes.begin(), running_hashes.end(), p.hash) != running_hashes.end()); + AudioDownloaded(range, + watcher->Get().value(), + job_time); - // Skip this hash if we're already rendering it - if (!rendering_hash) { - // Check if this frame already exists (has already been rendered previously or during this job) - bool hash_exists = false; + // Don't count audio progress, since it's generally a lot faster than video and is weighted at + // 50%, which makes the progress bar look weird to the uninitiated + //progress_counter += range.length().toDouble(); + //emit ProgressChanged(progress_counter / total_length); - if (use_disk_cache) { - // Check if this hash is in our "existing hashes" list - hash_exists = (std::find(existing_hashes.begin(), existing_hashes.end(), p.hash) != existing_hashes.end()); + } else if (ticket_type == RenderManager::kTypeVideo && TwoStepFrameRendering()) { - // If not, check if it's in the filesystem - if (!hash_exists) { - hash_exists = QFileInfo::exists(viewer()->video_frame_cache()->CachePathName(p.hash)); + DownloadFrame(&watcher_thread, + watcher->Get().value(), + watcher->property("hash").toByteArray()); - // If so, add it to the list so we don't have to check the filesystem again later - if (hash_exists) { - existing_hashes.push_back(p.hash); - } - } - - if (hash_exists) { - // Already exists, no need to render it again - FrameDownloaded(p.hash, {p.time}, hash_job_time); - progress_counter += video_frame_sz; - emit ProgressChanged(progress_counter / total_length); - } - } - - // If no existing disk cache was found, queue it now - if (!hash_exists) { - render_lookup_table.push_back({p.hash, RenderManager::instance()->RenderFrame(viewer(), p.time, mode)}); - running_hashes.push_back(p.hash); - } - } - - // Remove first element - frame_queue.pop_front(); - } - - while (!IsCancelled() && !audio_queue.empty()) { - audio_lookup_table.push_back({audio_queue.front(), RenderManager::instance()->RenderAudio(viewer(), audio_queue.front())}); - audio_queue.pop_front(); - } - - i = render_lookup_table.begin(); - - while (!IsCancelled() && i != render_lookup_table.end()) { - if (i->frame_future->IsFinished()) { - if (!i->frame_future->WasCancelled()) { - FramePtr f = i->frame_future->Get().value(); - - // Start multithreaded download here - download_futures.push_back({i->hash, DownloadFrame(f, i->hash), i->frame_future->GetJobTime()}); - } - - i = render_lookup_table.erase(i); - } else { - i++; - } - } - - j = download_futures.begin(); - - while (!IsCancelled() && j != download_futures.end()) { - if (j->download_future.isFinished()) { - // Place it in the cache - std::list times_with_hash; - - for (int hash_index=0;hash_indexhash) { - times_with_hash.push_back(times.at(hash_index)); - } - } - - FrameDownloaded(j->hash, times_with_hash, j->job_time); - - existing_hashes.push_back(j->hash); - - // Signal process - progress_counter += times_with_hash.size() * video_frame_sz; + progress_counter += video_frame_sz * 0.5; emit ProgressChanged(progress_counter / total_length); - j = download_futures.erase(j); - } else { - j++; - } - } - k = audio_lookup_table.begin(); + // Assume single-step video or video download ticket + QByteArray rendered_hash = watcher->property("hash").toByteArray(); + FrameDownloaded(watcher->Get().value(), rendered_hash, time_map.value(rendered_hash), job_time); - while (!IsCancelled() && k != audio_lookup_table.end()) { - if (k->sample_future->IsFinished()) { - AudioDownloaded(k->range, - k->sample_future->Get().value(), - k->sample_future->GetJobTime()); + double progress_to_add = video_frame_sz; + if (TwoStepFrameRendering()) { + progress_to_add *= 0.5; + } + progress_counter += progress_to_add; - progress_counter += k->range.length().toDouble(); emit ProgressChanged(progress_counter / total_length); - k = audio_lookup_table.erase(k); - } else { - k++; } + + delete watcher; + running_watchers_.removeOne(watcher); + + finished_watcher_mutex_.lock(); + } + + if (IsCancelled()) { + break; + } + + // Run out of finished watchers. If we still have running tickets, wait for the next one to finish. + if (running_tickets_ > 0) { + finished_watcher_wait_cond_.wait(&finished_watcher_mutex_); + } else { + // No more running tickets or finished tickets, wem ust be + break; } } - */ + + finished_watcher_mutex_.unlock(); + + if (IsCancelled()) { + // Cancel every watcher we created + foreach (RenderTicketWatcher* watcher, running_watchers_) { + disconnect(watcher, &RenderTicketWatcher::Finished, this, &RenderTask::TicketDone); + watcher->Cancel(); + } + } + + watcher_thread.quit(); + watcher_thread.wait(); + + return true; +} + +void RenderTask::DownloadFrame(QThread *thread, FramePtr frame, const QByteArray &hash) +{ + RenderTicketWatcher* watcher = CreateWatcher(thread); + + watcher->setProperty("hash", hash); + + IncrementRunningTickets(); + + watcher->SetTicket(RenderManager::instance()->SaveFrameToCache(viewer_->video_frame_cache(), + frame, + hash)); +} + +RenderTicketWatcher *RenderTask::CreateWatcher(QThread *thread) +{ + RenderTicketWatcher* watcher = new RenderTicketWatcher(); + watcher->moveToThread(thread); + connect(watcher, &RenderTicketWatcher::Finished, this, &RenderTask::TicketDone, Qt::DirectConnection); + running_watchers_.append(watcher); + return watcher; +} + +void RenderTask::IncrementRunningTickets() +{ + finished_watcher_mutex_.lock(); + running_tickets_++; + finished_watcher_mutex_.unlock(); +} + +void RenderTask::TicketDone(RenderTicketWatcher* watcher) +{ + finished_watcher_mutex_.lock(); + finished_watchers_.push_back(watcher); + finished_watcher_wait_cond_.wakeAll(); + running_tickets_--; + finished_watcher_mutex_.unlock(); } OLIVE_NAMESPACE_EXIT diff --git a/app/task/render/render.h b/app/task/render/render.h index c70e40468..9f8c1ea17 100644 --- a/app/task/render/render.h +++ b/app/task/render/render.h @@ -24,25 +24,32 @@ #include #include "node/output/viewer/viewer.h" +#include "render/colormanager.h" #include "task/task.h" +#include "threading/threadticket.h" +#include "threading/threadticketwatcher.h" OLIVE_NAMESPACE_ENTER class RenderTask : public Task { + Q_OBJECT public: RenderTask(ViewerOutput* viewer, const VideoParams &vparams, const AudioParams &aparams); virtual ~RenderTask() override; protected: - void Render(const TimeRangeList &video_range, + bool Render(ColorManager *manager, const TimeRangeList &video_range, const TimeRangeList &audio_range, RenderMode::Mode mode, - bool use_disk_cache); + FrameHashCache *cache, const QSize& force_size = QSize(0, 0), + const QMatrix4x4& force_matrix = QMatrix4x4(), + PixelFormat::Format force_format = PixelFormat::PIX_FMT_INVALID, + ColorProcessorPtr force_color_output = nullptr); - virtual QFuture DownloadFrame(FramePtr frame, const QByteArray &hash) = 0; + virtual void DownloadFrame(QThread* thread, FramePtr frame, const QByteArray &hash); - virtual void FrameDownloaded(const QByteArray& hash, const std::list& times, qint64 job_time) = 0; + virtual void FrameDownloaded(FramePtr frame, const QByteArray& hash, const QVector& times, qint64 job_time) = 0; virtual void AudioDownloaded(const TimeRange& range, SampleBufferPtr samples, qint64 job_time) = 0; @@ -61,13 +68,38 @@ protected: return audio_params_; } + virtual void CancelEvent() override + { + finished_watcher_mutex_.lock(); + finished_watcher_wait_cond_.wakeAll(); + finished_watcher_mutex_.unlock(); + } + + virtual bool TwoStepFrameRendering() const + { + return true; + } + private: + RenderTicketWatcher* CreateWatcher(QThread *thread); + + void IncrementRunningTickets(); + ViewerOutput* viewer_; VideoParams video_params_; AudioParams audio_params_; + QVector running_watchers_; + std::list finished_watchers_; + int running_tickets_; + QMutex finished_watcher_mutex_; + QWaitCondition finished_watcher_wait_cond_; + +private slots: + void TicketDone(RenderTicketWatcher *watcher); + }; OLIVE_NAMESPACE_EXIT diff --git a/app/threading/threadticketwatcher.cpp b/app/threading/threadticketwatcher.cpp index 804aaef99..247e9b69a 100644 --- a/app/threading/threadticketwatcher.cpp +++ b/app/threading/threadticketwatcher.cpp @@ -46,9 +46,9 @@ void RenderTicketWatcher::SetTicket(RenderTicketPtr ticket) if (ticket_->IsFinished(false)) { locker.unlock(); - emit Finished(); + emit Finished(this); } else { - connect(ticket_.get(), &RenderTicket::Finished, this, &RenderTicketWatcher::Finished); + connect(ticket_.get(), &RenderTicket::Finished, this, &RenderTicketWatcher::TicketFinished); } } @@ -93,4 +93,9 @@ void RenderTicketWatcher::Cancel() } } +void RenderTicketWatcher::TicketFinished() +{ + emit Finished(this); +} + OLIVE_NAMESPACE_EXIT diff --git a/app/threading/threadticketwatcher.h b/app/threading/threadticketwatcher.h index 6bbe979c2..7684f64b6 100644 --- a/app/threading/threadticketwatcher.h +++ b/app/threading/threadticketwatcher.h @@ -49,9 +49,11 @@ public: QVariant Get(); signals: - void Finished(); + void Finished(RenderTicketWatcher* watcher); private: + void TicketFinished(); + RenderTicketPtr ticket_; }; diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 1e8400ba6..9832f9727 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -84,7 +84,7 @@ QMatrix4x4 ViewerDisplayWidget::GetCompleteMatrixFlippedYTranslation() { QMatrix4x4 mat = combined_matrix_; - mat.data()[13] *= -1.0f; + mat.scale(1, -1, 1); return mat; } @@ -298,7 +298,9 @@ void ViewerDisplayWidget::OnPaint() } // Draw texture through color transform - renderer()->BlitColorManaged(color_service(), texture_, VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F), true); + renderer()->BlitColorManaged(color_service(), texture_, + VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F), + GetCompleteMatrixFlippedYTranslation()); } QTransform world_transform = GenerateWorldTransform(); From 8a949a31537e5c674264d6e01fca2203d7b1d992 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sun, 15 Nov 2020 00:59:33 +1100 Subject: [PATCH 25/72] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9291d1b77..eda479b1c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Olive is a free non-linear video editor for Windows, macOS, and Linux. ![screen](https://olivevideoeditor.org/img/020-2.png) -**Discover more:** [Website](https://www.olivevideoeditor.org/) | [Binaries](https://olivevideoeditor.org/download.php) | [Twitter](https://twitter.com/oliveteam) | [Discord](https://discord.gg/4Ae9KZn) | [Patreon](https://www.patreon.com/olivevideoeditor) | [Tutorials](https://github.com/olive-editor/olive/wiki/Overview-Guide) +**Discover more:** [Website](https://www.olivevideoeditor.org/) | [Binaries](https://olivevideoeditor.org/download.php) | [Patreon](https://www.patreon.com/olivevideoeditor) | [Twitter](https://twitter.com/oliveteam) | [Wiki](https://github.com/olive-editor/olive/wiki/Overview-Guide) | [Community Discord (Unofficial)](https://discord.gg/4Ae9KZn) **NOTE: Olive is alpha software and is considered highly unstable. While we highly appreciate users testing and providing usage information, please use at your own risk.** From ee5307336ef1c95bbc6a37977fd1c8b2be9d21df Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 15 Nov 2020 10:41:29 +1100 Subject: [PATCH 26/72] re-implemented alpha assoc/deassoc when color managing --- app/render/renderer.cpp | 50 +++++++++++++++++++++--- app/render/renderer.h | 5 ++- app/render/renderprocessor.cpp | 8 ++-- app/widget/scope/scopebase/scopebase.cpp | 2 +- app/widget/viewer/viewerdisplay.cpp | 2 +- 5 files changed, 54 insertions(+), 13 deletions(-) diff --git a/app/render/renderer.cpp b/app/render/renderer.cpp index acd9885eb..83107935b 100644 --- a/app/render/renderer.cpp +++ b/app/render/renderer.cpp @@ -56,14 +56,14 @@ TexturePtr Renderer::CreateTexture(const VideoParams ¶ms, const void *data, return CreateTexture(params, Texture::k2D, Texture::kRGBA, data, linesize); } -void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, const QMatrix4x4 &matrix) +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, bool source_is_premultiplied, Texture *destination, const QMatrix4x4 &matrix) { - BlitColorManagedInternal(color_processor, source, destination, destination->params(), matrix); + BlitColorManagedInternal(color_processor, source, source_is_premultiplied, destination, destination->params(), matrix); } -void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, const QMatrix4x4& matrix) +void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, bool source_is_premultiplied, VideoParams params, const QMatrix4x4& matrix) { - BlitColorManagedInternal(color_processor, source, nullptr, params, matrix); + BlitColorManagedInternal(color_processor, source, source_is_premultiplied, nullptr, params, matrix); } void Renderer::Destroy() @@ -101,6 +101,12 @@ bool Renderer::GetColorContext(ColorProcessorPtr color_processor, Renderer::Colo "\n" "// Main texture input\n" "uniform sampler2D ove_maintex;\n" + "uniform int ove_maintex_alpha;\n" + "\n" + "// Macros defining `ove_maintex_alpha` state\n" + "#define ALPHA_NONE 0\n" + "#define ALPHA_UNASSOC 1\n" + "#define ALPHA_ASSOC 2\n" "\n" "// Macros so OCIO's shaders work on this GLSL version\n" "#define texture2D texture\n" @@ -113,8 +119,38 @@ bool Renderer::GetColorContext(ColorProcessorPtr color_processor, Renderer::Colo "out vec4 fragColor;\n")); shader_frag.append(shader_desc->getShaderText()); shader_frag.append(QStringLiteral("\n" + "// Alpha association functions\n" + "vec4 assoc(vec4 c) {\n" + " return vec4(c.rgb * c.a, c.a);\n" + "}\n" + "\n" + "vec4 reassoc(vec4 c) {\n" + " return (c.a == 0.0) ? c : assoc(c);\n" + "}\n" + "\n" + "vec4 deassoc(vec4 c) {\n" + " return (c.a == 0.0) ? c : vec4(c.rgb / c.a, c.a);\n" + "}\n" + "\n" "void main() {\n" - " fragColor = %1(texture(ove_maintex, ove_texcoord));\n" + " vec4 col = texture(ove_maintex, ove_texcoord);\n" + "\n" + " // If alpha is associated, de-associate now\n" + " if (ove_maintex_alpha == ALPHA_ASSOC) {\n" + " col = deassoc(col);\n" + " }\n" + "\n" + " // Perform color conversion\n" + " col = %1(col);\n" + "\n" + " // Associate or re-associate here\n" + " if (ove_maintex_alpha == ALPHA_ASSOC) {\n" + " col = reassoc(col);\n" + " } else if (ove_maintex_alpha == ALPHA_UNASSOC) {\n" + " col = assoc(col);\n" + " }\n" + "\n" + " fragColor = col;\n" "}\n").arg(ocio_func_name)); // Try to compile shader @@ -194,7 +230,9 @@ bool Renderer::GetColorContext(ColorProcessorPtr color_processor, Renderer::Colo } } -void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, TexturePtr source, Texture *destination, VideoParams params, const QMatrix4x4& matrix) +void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, TexturePtr source, + bool source_is_premultiplied, Texture *destination, + VideoParams params, const QMatrix4x4& matrix) { ColorContext color_ctx; if (!GetColorContext(color_processor, &color_ctx)) { diff --git a/app/render/renderer.h b/app/render/renderer.h index bee5dc21b..fdea3da57 100644 --- a/app/render/renderer.h +++ b/app/render/renderer.h @@ -60,8 +60,8 @@ public: Blit(shader, job, nullptr, params); } - void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, Texture* destination, const QMatrix4x4& matrix = QMatrix4x4()); - void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, VideoParams params, const QMatrix4x4& matrix = QMatrix4x4()); + void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, bool source_is_premultiplied, Texture* destination, const QMatrix4x4& matrix = QMatrix4x4()); + void BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, bool source_is_premultiplied, VideoParams params, const QMatrix4x4& matrix = QMatrix4x4()); void Destroy(); @@ -108,6 +108,7 @@ private: bool GetColorContext(ColorProcessorPtr color_processor, ColorContext* ctx); void BlitColorManagedInternal(ColorProcessorPtr color_processor, TexturePtr source, + bool source_is_premultiplied, Texture* destination, VideoParams params, const QMatrix4x4 &matrix); QHash color_cache_; diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 146cb5d7a..a9bdca01a 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -95,7 +95,7 @@ void RenderProcessor::Run() if (output_color_transform) { // Yes color transform, blit color managed - render_ctx_->BlitColorManaged(output_color_transform, texture, blit_tex.get(), matrix); + render_ctx_->BlitColorManaged(output_color_transform, texture, true, blit_tex.get(), matrix); } else { // No color transform, just blit ShaderJob job; @@ -326,13 +326,15 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & managed_params.set_format(video_params.format()); value = render_ctx_->CreateTexture(managed_params); - qDebug() << "FIXME: Accessing video_stream->colorspace() may cause race conditions"; + qDebug() << "FIXME: Accessing video_stream->colorspace() and video_stream->premultiplied_alpha() may cause race conditions"; ColorProcessorPtr processor = ColorProcessor::Create(color_manager, video_stream->colorspace(), color_manager->GetReferenceColorSpace()); - render_ctx_->BlitColorManaged(processor, unmanaged_texture, value.get()); + render_ctx_->BlitColorManaged(processor, unmanaged_texture, + video_stream->premultiplied_alpha(), + value.get()); still_image_cache_->mutex()->lock(); diff --git a/app/widget/scope/scopebase/scopebase.cpp b/app/widget/scope/scopebase/scopebase.cpp index 76a717112..9cf864a24 100644 --- a/app/widget/scope/scopebase/scopebase.cpp +++ b/app/widget/scope/scopebase/scopebase.cpp @@ -102,7 +102,7 @@ void ScopeBase::OnPaint() if (buffer_) { // Convert reference frame to display space - renderer()->BlitColorManaged(color_service(), texture_, managed_tex_.get()); + renderer()->BlitColorManaged(color_service(), texture_, true, managed_tex_.get()); DrawScope(managed_tex_, pipeline_); } diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 9832f9727..84e9487bf 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -298,7 +298,7 @@ void ViewerDisplayWidget::OnPaint() } // Draw texture through color transform - renderer()->BlitColorManaged(color_service(), texture_, + renderer()->BlitColorManaged(color_service(), texture_, true, VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F), GetCompleteMatrixFlippedYTranslation()); } From 0d0766e4fbefd9a00732333e0938f600debf78a2 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 15 Nov 2020 22:16:40 +1100 Subject: [PATCH 27/72] improved render channel count system --- app/audio/CMakeLists.txt | 2 - app/audio/audiomanager.cpp | 32 +-- app/audio/sampleformat.cpp | 52 ---- app/audio/tempoprocessor.cpp | 6 +- app/codec/decoder.cpp | 2 +- app/codec/encoder.h | 4 +- app/codec/ffmpeg/CMakeLists.txt | 2 - app/codec/ffmpeg/ffmpegcommon.cpp | 125 ---------- app/codec/ffmpeg/ffmpegdecoder.cpp | 48 +++- app/codec/ffmpeg/ffmpegdecoder.h | 7 +- app/codec/ffmpeg/ffmpegencoder.cpp | 72 ++++-- app/codec/ffmpeg/ffmpegencoder.h | 7 +- app/codec/ffmpeg/ffmpegframepool.cpp | 8 +- app/codec/ffmpeg/ffmpegframepool.h | 7 +- app/codec/frame.cpp | 52 +++- app/codec/frame.h | 12 +- app/codec/oiio/CMakeLists.txt | 2 - app/codec/oiio/oiiocommon.h | 47 ---- app/codec/oiio/oiiodecoder.cpp | 29 ++- app/codec/oiio/oiiodecoder.h | 5 +- app/codec/waveinput.cpp | 14 +- app/codec/waveoutput.cpp | 18 +- app/codec/waveoutput.h | 1 - app/common/CMakeLists.txt | 31 ++- app/common/define.h | 4 - app/common/ffmpegutils.cpp | 141 +++++++++++ .../ffmpegcommon.h => common/ffmpegutils.h} | 14 +- .../sampleformat.h => common/ocioutils.cpp} | 49 ++-- app/common/ocioutils.h | 12 + .../oiiocommon.cpp => common/oiioutils.cpp} | 58 +++-- app/common/oiioutils.h | 65 +++++ app/config/config.cpp | 5 +- app/core.cpp | 6 - app/dialog/export/export.cpp | 6 +- app/dialog/sequence/sequence.cpp | 3 +- .../sequence/sequencedialogparametertab.cpp | 3 +- .../sequence/sequencedialogparametertab.h | 2 +- .../sequence/sequencedialogpresettab.cpp | 19 +- app/dialog/sequence/sequencepreset.h | 11 +- app/node/input/media/video/video.cpp | 3 +- app/project/item/footage/videostream.cpp | 5 +- app/project/item/footage/videostream.h | 19 +- app/project/item/sequence/sequence.cpp | 21 +- app/render/CMakeLists.txt | 2 - app/render/audioparams.cpp | 42 +++- app/render/audioparams.h | 40 ++- app/render/color.cpp | 39 +-- app/render/color.h | 12 +- app/render/colormanager.cpp | 59 ----- app/render/colormanager.h | 17 -- app/render/colorprocessor.cpp | 5 +- app/render/framehashcache.cpp | 32 ++- app/render/framehashcache.h | 2 +- app/render/managedcolor.cpp | 6 +- app/render/managedcolor.h | 4 +- app/render/opengl/openglrenderer.cpp | 125 ++++++---- app/render/opengl/openglrenderer.h | 10 +- app/render/pixelformat.cpp | 230 ------------------ app/render/pixelformat.h | 134 ---------- app/render/renderer.cpp | 31 ++- app/render/renderer.h | 12 +- app/render/rendererthreadwrapper.cpp | 12 +- app/render/rendererthreadwrapper.h | 4 +- app/render/rendermanager.cpp | 8 +- app/render/rendermanager.h | 2 +- app/render/renderprocessor.cpp | 19 +- app/render/texture.h | 26 +- app/render/videoparams.cpp | 78 +++++- app/render/videoparams.h | 90 ++++++- app/task/export/export.cpp | 12 - app/task/render/render.cpp | 2 +- app/task/render/render.h | 2 +- app/widget/manageddisplay/manageddisplay.h | 1 + .../nodetableview/nodetabletraverser.cpp | 3 +- app/widget/nodetableview/nodetableview.cpp | 2 +- app/widget/scope/histogram/histogram.cpp | 4 +- app/widget/scope/scopebase/scopebase.cpp | 6 +- app/widget/scope/waveform/waveform.cpp | 5 +- .../standardcombos/pixelformatcombobox.h | 16 +- app/widget/timelinewidget/tool/import.cpp | 4 +- app/widget/viewer/viewer.cpp | 9 - app/widget/viewer/viewer.h | 2 - app/widget/viewer/viewerdisplay.cpp | 9 +- 83 files changed, 1017 insertions(+), 1132 deletions(-) delete mode 100644 app/audio/sampleformat.cpp delete mode 100644 app/codec/ffmpeg/ffmpegcommon.cpp delete mode 100644 app/codec/oiio/oiiocommon.h create mode 100644 app/common/ffmpegutils.cpp rename app/{codec/ffmpeg/ffmpegcommon.h => common/ffmpegutils.h} (77%) rename app/{audio/sampleformat.h => common/ocioutils.cpp} (57%) rename app/{codec/oiio/oiiocommon.cpp => common/oiioutils.cpp} (68%) create mode 100644 app/common/oiioutils.h delete mode 100644 app/render/pixelformat.cpp delete mode 100644 app/render/pixelformat.h diff --git a/app/audio/CMakeLists.txt b/app/audio/CMakeLists.txt index b8b8e49a2..5b0976dc0 100644 --- a/app/audio/CMakeLists.txt +++ b/app/audio/CMakeLists.txt @@ -24,8 +24,6 @@ set(OLIVE_SOURCES audio/outputdeviceproxy.cpp audio/outputmanager.h audio/outputmanager.cpp - audio/sampleformat.h - audio/sampleformat.cpp audio/tempoprocessor.h audio/tempoprocessor.cpp PARENT_SCOPE diff --git a/app/audio/audiomanager.cpp b/app/audio/audiomanager.cpp index a0afa7cce..48daa0c9b 100644 --- a/app/audio/audiomanager.cpp +++ b/app/audio/audiomanager.cpp @@ -124,36 +124,8 @@ void AudioManager::SetOutputDevice(const QAudioDeviceInfo &info) format.setChannelCount(output_params_.channel_count()); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); - - switch (output_params_.format()) { - case SampleFormat::SAMPLE_FMT_U8: - format.setSampleSize(8); - format.setSampleType(QAudioFormat::UnSignedInt); - break; - case SampleFormat::SAMPLE_FMT_S16: - format.setSampleSize(16); - format.setSampleType(QAudioFormat::SignedInt); - break; - case SampleFormat::SAMPLE_FMT_S32: - format.setSampleSize(32); - format.setSampleType(QAudioFormat::SignedInt); - break; - case SampleFormat::SAMPLE_FMT_S64: - format.setSampleSize(64); - format.setSampleType(QAudioFormat::SignedInt); - break; - case SampleFormat::SAMPLE_FMT_FLT: - format.setSampleSize(32); - format.setSampleType(QAudioFormat::Float); - break; - case SampleFormat::SAMPLE_FMT_DBL: - format.setSampleSize(64); - format.setSampleType(QAudioFormat::Float); - break; - case SampleFormat::SAMPLE_FMT_COUNT: - case SampleFormat::SAMPLE_FMT_INVALID: - abort(); - } + format.setSampleSize(output_params_.bits_per_sample()); + format.setSampleType(AudioParams::GetQtSampleType(output_params_.format())); if (info.isFormatSupported(format)) { QMetaObject::invokeMethod(output_manager_, diff --git a/app/audio/sampleformat.cpp b/app/audio/sampleformat.cpp deleted file mode 100644 index 27bbbb0a4..000000000 --- a/app/audio/sampleformat.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "sampleformat.h" - -#include - -OLIVE_NAMESPACE_ENTER - -const SampleFormat::Format SampleFormat::kInternalFormat = SAMPLE_FMT_FLT; - -QString SampleFormat::GetSampleFormatName(const SampleFormat::Format &f) -{ - switch (f) { - case SAMPLE_FMT_U8: - return QCoreApplication::translate("SampleFormat", "Unsigned 8-bit"); - case SAMPLE_FMT_S16: - return QCoreApplication::translate("SampleFormat", "Signed 16-bit"); - case SAMPLE_FMT_S32: - return QCoreApplication::translate("SampleFormat", "Signed 32-bit"); - case SAMPLE_FMT_S64: - return QCoreApplication::translate("SampleFormat", "Signed 64-bit"); - case SAMPLE_FMT_FLT: - return QCoreApplication::translate("SampleFormat", "32-bit Float"); - case SAMPLE_FMT_DBL: - return QCoreApplication::translate("SampleFormat", "64-bit Float"); - case SAMPLE_FMT_COUNT: - case SAMPLE_FMT_INVALID: - break; - } - - return QCoreApplication::translate("SampleFormat", "Invalid"); -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/audio/tempoprocessor.cpp b/app/audio/tempoprocessor.cpp index 2deda4f33..1cb56b468 100644 --- a/app/audio/tempoprocessor.cpp +++ b/app/audio/tempoprocessor.cpp @@ -28,7 +28,7 @@ extern "C" { #include -#include "codec/ffmpeg/ffmpegcommon.h" +#include "common/ffmpegutils.h" OLIVE_NAMESPACE_ENTER @@ -75,7 +75,7 @@ bool TempoProcessor::Open(const AudioParams ¶ms, const double& speed) 1, params_.sample_rate(), params_.sample_rate(), - FFmpegCommon::GetFFmpegSampleFormat(params_.format()), + FFmpegUtils::GetFFmpegSampleFormat(params_.format()), params.channel_layout()); // Create buffer and buffersink @@ -171,7 +171,7 @@ void TempoProcessor::Push(const char *data, int length) // Allocate a buffer for the number of samples we got src_frame->sample_rate = params_.sample_rate(); - src_frame->format = FFmpegCommon::GetFFmpegSampleFormat(params_.format()); + src_frame->format = FFmpegUtils::GetFFmpegSampleFormat(params_.format()); src_frame->channel_layout = params_.channel_layout(); src_frame->nb_samples = params_.bytes_to_samples(length); src_frame->pts = timestamp_; diff --git a/app/codec/decoder.cpp b/app/codec/decoder.cpp index e8a5bf71b..9841fbf4f 100644 --- a/app/codec/decoder.cpp +++ b/app/codec/decoder.cpp @@ -24,11 +24,11 @@ #include #include -#include "codec/ffmpeg/ffmpegcommon.h" #include "codec/ffmpeg/ffmpegdecoder.h" #include "codec/oiio/oiiodecoder.h" #include "codec/waveinput.h" #include "codec/waveoutput.h" +#include "common/ffmpegutils.h" #include "common/filefunctions.h" #include "common/timecodefunctions.h" #ifdef USE_OTIO diff --git a/app/codec/encoder.h b/app/codec/encoder.h index 2d4e2d245..9cd9547a0 100644 --- a/app/codec/encoder.h +++ b/app/codec/encoder.h @@ -122,9 +122,9 @@ public: virtual void Close() = 0; - virtual PixelFormat::Format GetDesiredPixelFormat() const + virtual VideoParams::Format GetDesiredPixelFormat() const { - return PixelFormat::PIX_FMT_INVALID; + return VideoParams::kFormatInvalid; } private: diff --git a/app/codec/ffmpeg/CMakeLists.txt b/app/codec/ffmpeg/CMakeLists.txt index 12267fe76..7c26e24bf 100644 --- a/app/codec/ffmpeg/CMakeLists.txt +++ b/app/codec/ffmpeg/CMakeLists.txt @@ -17,8 +17,6 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} codec/ffmpeg/avframeptr.h - codec/ffmpeg/ffmpegcommon.h - codec/ffmpeg/ffmpegcommon.cpp codec/ffmpeg/ffmpegdecoder.h codec/ffmpeg/ffmpegdecoder.cpp codec/ffmpeg/ffmpegencoder.h diff --git a/app/codec/ffmpeg/ffmpegcommon.cpp b/app/codec/ffmpeg/ffmpegcommon.cpp deleted file mode 100644 index cdc2554e1..000000000 --- a/app/codec/ffmpeg/ffmpegcommon.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "ffmpegcommon.h" - -OLIVE_NAMESPACE_ENTER - -AVPixelFormat FFmpegCommon::GetCompatiblePixelFormat(const AVPixelFormat &pix_fmt) -{ - AVPixelFormat possible_pix_fmts[] = { - AV_PIX_FMT_RGBA, - AV_PIX_FMT_RGBA64, - AV_PIX_FMT_NONE - }; - - return avcodec_find_best_pix_fmt_of_list(possible_pix_fmts, - pix_fmt, - 1, - nullptr); -} - -SampleFormat::Format FFmpegCommon::GetNativeSampleFormat(const AVSampleFormat &smp_fmt) -{ - switch (smp_fmt) { - case AV_SAMPLE_FMT_U8: - return SampleFormat::SAMPLE_FMT_U8; - case AV_SAMPLE_FMT_S16: - return SampleFormat::SAMPLE_FMT_S16; - case AV_SAMPLE_FMT_S32: - return SampleFormat::SAMPLE_FMT_S32; - case AV_SAMPLE_FMT_S64: - return SampleFormat::SAMPLE_FMT_S64; - case AV_SAMPLE_FMT_FLT: - return SampleFormat::SAMPLE_FMT_FLT; - case AV_SAMPLE_FMT_DBL: - return SampleFormat::SAMPLE_FMT_DBL; - case AV_SAMPLE_FMT_U8P : - case AV_SAMPLE_FMT_S16P: - case AV_SAMPLE_FMT_S32P: - case AV_SAMPLE_FMT_S64P: - case AV_SAMPLE_FMT_FLTP: - case AV_SAMPLE_FMT_DBLP: - case AV_SAMPLE_FMT_NONE: - case AV_SAMPLE_FMT_NB: - break; - } - - return SampleFormat::SAMPLE_FMT_INVALID; -} - -AVSampleFormat FFmpegCommon::GetFFmpegSampleFormat(const SampleFormat::Format &smp_fmt) -{ - switch (smp_fmt) { - case SampleFormat::SAMPLE_FMT_U8: - return AV_SAMPLE_FMT_U8; - case SampleFormat::SAMPLE_FMT_S16: - return AV_SAMPLE_FMT_S16; - case SampleFormat::SAMPLE_FMT_S32: - return AV_SAMPLE_FMT_S32; - case SampleFormat::SAMPLE_FMT_S64: - return AV_SAMPLE_FMT_S64; - case SampleFormat::SAMPLE_FMT_FLT: - return AV_SAMPLE_FMT_FLT; - case SampleFormat::SAMPLE_FMT_DBL: - return AV_SAMPLE_FMT_DBL; - case SampleFormat::SAMPLE_FMT_INVALID: - case SampleFormat::SAMPLE_FMT_COUNT: - break; - } - - return AV_SAMPLE_FMT_NONE; -} - -AVPixelFormat FFmpegCommon::GetFFmpegPixelFormat(const PixelFormat::Format &pix_fmt) -{ - switch (pix_fmt) { - case PixelFormat::PIX_FMT_RGBA8: - return AV_PIX_FMT_RGBA; - case PixelFormat::PIX_FMT_RGBA16U: - return AV_PIX_FMT_RGBA64; - case PixelFormat::PIX_FMT_RGBA16F: - case PixelFormat::PIX_FMT_RGBA32F: - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return AV_PIX_FMT_NONE; -} - -PixelFormat::Format FFmpegCommon::GetCompatiblePixelFormat(const PixelFormat::Format &pix_fmt) -{ - switch (pix_fmt) { - case PixelFormat::PIX_FMT_RGBA8: - return PixelFormat::PIX_FMT_RGBA8; - case PixelFormat::PIX_FMT_RGBA16U: - case PixelFormat::PIX_FMT_RGBA16F: - case PixelFormat::PIX_FMT_RGBA32F: - return PixelFormat::PIX_FMT_RGBA16U; - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return PixelFormat::PIX_FMT_INVALID; -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index ac4e402b7..cdab55a67 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -38,13 +38,12 @@ extern "C" { #include "codec/waveinput.h" #include "common/define.h" +#include "common/ffmpegutils.h" #include "common/filefunctions.h" #include "common/functiontimer.h" #include "common/timecodefunctions.h" -#include "ffmpegcommon.h" #include "render/framehashcache.h" #include "render/diskmanager.h" -#include "render/pixelformat.h" OLIVE_NAMESPACE_ENTER @@ -73,13 +72,17 @@ bool FFmpegDecoder::OpenInternal() if (stream()->type() == Stream::kVideo) { // Get an Olive compatible AVPixelFormat - ideal_pix_fmt_ = FFmpegCommon::GetCompatiblePixelFormat(static_cast(s->codecpar->format)); + ideal_pix_fmt_ = FFmpegUtils::GetCompatiblePixelFormat(static_cast(s->codecpar->format)); // Determine which Olive native pixel format we retrieved // Note that FFmpeg doesn't support float formats native_pix_fmt_ = GetNativePixelFormat(ideal_pix_fmt_); + native_channel_count_ = GetNativeChannelCount(ideal_pix_fmt_); - if (native_pix_fmt_ == PixelFormat::PIX_FMT_INVALID) { + qDebug() << "Set channel count to:" << native_channel_count_; + + if (native_pix_fmt_ == VideoParams::kFormatInvalid + || native_channel_count_ == 0) { qDebug() << "Failed to find valid native pixel format for" << ideal_pix_fmt_; return false; } @@ -124,6 +127,7 @@ FramePtr FFmpegDecoder::RetrieveStillImage(const rational &timecode, const int & output_frame->set_video_params(VideoParams(frame->width, frame->height, native_pix_fmt_, + native_channel_count_, std::static_pointer_cast(stream())->pixel_aspect_ratio(), std::static_pointer_cast(stream())->interlacing(), divider)); @@ -172,7 +176,7 @@ FramePtr FFmpegDecoder::RetrieveVideoInternal(const rational &timecode, const in ClearFrameCache(); // Set new frame pool parameters - pool_.SetParameters(divided_width, divided_height, native_pix_fmt_); + pool_.SetParameters(divided_width, divided_height, native_pix_fmt_, native_channel_count_); } // Retrieve frame @@ -184,6 +188,7 @@ FramePtr FFmpegDecoder::RetrieveVideoInternal(const rational &timecode, const in copy->set_video_params(VideoParams(vs->width(), vs->height(), native_pix_fmt_, + native_channel_count_, std::static_pointer_cast(stream())->pixel_aspect_ratio(), std::static_pointer_cast(stream())->interlacing(), divider)); @@ -328,10 +333,13 @@ FootagePtr FFmpegDecoder::Probe(const QString& filename, const QAtomicInt* cance video_stream->set_width(avstream->codecpar->width); video_stream->set_height(avstream->codecpar->height); - video_stream->set_format(GetNativePixelFormat(FFmpegCommon::GetCompatiblePixelFormat(static_cast(avstream->codecpar->format)))); video_stream->set_interlacing(interlacing); video_stream->set_pixel_aspect_ratio(pixel_aspect_ratio); + AVPixelFormat compatible_pix_fmt = FFmpegUtils::GetCompatiblePixelFormat(static_cast(avstream->codecpar->format)); + video_stream->set_format(GetNativePixelFormat(compatible_pix_fmt)); + video_stream->set_channel_count(GetNativeChannelCount(compatible_pix_fmt)); + str = video_stream; } else { @@ -460,7 +468,7 @@ bool FFmpegDecoder::ConformAudioInternal(const QString &filename, const AudioPar // Create resampling context SwrContext* resampler = swr_alloc_set_opts(nullptr, params.channel_layout(), - FFmpegCommon::GetFFmpegSampleFormat(params.format()), + FFmpegUtils::GetFFmpegSampleFormat(params.format()), params.sample_rate(), channel_layout, static_cast(instance_.avstream()->codecpar->format), @@ -542,15 +550,31 @@ bool FFmpegDecoder::ConformAudioInternal(const QString &filename, const AudioPar return success; } -PixelFormat::Format FFmpegDecoder::GetNativePixelFormat(AVPixelFormat pix_fmt) +VideoParams::Format FFmpegDecoder::GetNativePixelFormat(AVPixelFormat pix_fmt) { switch (pix_fmt) { + case AV_PIX_FMT_RGB24: case AV_PIX_FMT_RGBA: - return PixelFormat::PIX_FMT_RGBA8; + return VideoParams::kFormatUnsigned8; + case AV_PIX_FMT_RGB48: case AV_PIX_FMT_RGBA64: - return PixelFormat::PIX_FMT_RGBA16U; + return VideoParams::kFormatUnsigned16; default: - return PixelFormat::PIX_FMT_INVALID; + return VideoParams::kFormatInvalid; + } +} + +int FFmpegDecoder::GetNativeChannelCount(AVPixelFormat pix_fmt) +{ + switch (pix_fmt) { + case AV_PIX_FMT_RGB24: + case AV_PIX_FMT_RGB48: + return VideoParams::kRGBChannelCount; + case AV_PIX_FMT_RGBA: + case AV_PIX_FMT_RGBA64: + return VideoParams::kRGBAChannelCount; + default: + return 0; } } @@ -729,7 +753,7 @@ FFmpegFramePool::ElementPtr FFmpegDecoder::RetrieveFrame(const int64_t& target_t // Store in queue, converting to native format uint8_t* destination_data = cached->data(); - int destination_linesize = Frame::generate_linesize_bytes(VideoParams::GetScaledDimension(instance_.avstream()->codecpar->width, divider), native_pix_fmt_); + int destination_linesize = Frame::generate_linesize_bytes(VideoParams::GetScaledDimension(instance_.avstream()->codecpar->width, divider), native_pix_fmt_, native_channel_count_); FFmpegBufferToNativeBuffer(working_frame->data, working_frame->linesize, &destination_data, &destination_linesize); // Set timestamp so this frame can be identified later diff --git a/app/codec/ffmpeg/ffmpegdecoder.h b/app/codec/ffmpeg/ffmpegdecoder.h index b74aa5bde..1f820d746 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.h +++ b/app/codec/ffmpeg/ffmpegdecoder.h @@ -32,7 +32,6 @@ extern "C" { #include #include -#include "audio/sampleformat.h" #include "avframeptr.h" #include "codec/decoder.h" #include "codec/waveoutput.h" @@ -126,7 +125,8 @@ private: FramePtr RetrieveStillImage(const rational& timecode, const int& divider); - static PixelFormat::Format GetNativePixelFormat(AVPixelFormat pix_fmt); + static VideoParams::Format GetNativePixelFormat(AVPixelFormat pix_fmt); + static int GetNativeChannelCount(AVPixelFormat pix_fmt); static uint64_t ValidateChannelLayout(AVStream *stream); @@ -143,7 +143,8 @@ private: SwsContext* scale_ctx_; int scale_divider_; AVPixelFormat ideal_pix_fmt_; - PixelFormat::Format native_pix_fmt_; + VideoParams::Format native_pix_fmt_; + int native_channel_count_; FFmpegFramePool pool_; diff --git a/app/codec/ffmpeg/ffmpegencoder.cpp b/app/codec/ffmpeg/ffmpegencoder.cpp index c31ac6b5a..3e95937db 100644 --- a/app/codec/ffmpeg/ffmpegencoder.cpp +++ b/app/codec/ffmpeg/ffmpegencoder.cpp @@ -26,8 +26,7 @@ extern "C" { #include -#include "ffmpegcommon.h" -#include "render/pixelformat.h" +#include "common/ffmpegutils.h" OLIVE_NAMESPACE_ENTER @@ -36,7 +35,8 @@ FFmpegEncoder::FFmpegEncoder(const EncodingParams ¶ms) : fmt_ctx_(nullptr), video_stream_(nullptr), video_codec_ctx_(nullptr), - video_scale_ctx_(nullptr), + video_alpha_scale_ctx_(nullptr), + video_noalpha_scale_ctx_(nullptr), audio_stream_(nullptr), audio_codec_ctx_(nullptr), audio_resample_ctx_(nullptr), @@ -72,29 +72,49 @@ bool FFmpegEncoder::Open() } // This is the format we will expect frames received in Write() to be in - PixelFormat::Format native_pixel_fmt = params().video_params().format(); + VideoParams::Format native_pixel_fmt = params().video_params().format(); // This is the format we will need to convert the frame to for swscale to understand it - video_conversion_fmt_ = FFmpegCommon::GetCompatiblePixelFormat(native_pixel_fmt); + video_conversion_fmt_ = FFmpegUtils::GetCompatiblePixelFormat(native_pixel_fmt); // This is the equivalent pixel format above as an AVPixelFormat that swscale can understand - AVPixelFormat src_pix_fmt = FFmpegCommon::GetFFmpegPixelFormat(video_conversion_fmt_); + AVPixelFormat src_alpha_pix_fmt = FFmpegUtils::GetFFmpegPixelFormat(video_conversion_fmt_, + VideoParams::kRGBAChannelCount); + + AVPixelFormat src_noalpha_pix_fmt = FFmpegUtils::GetFFmpegPixelFormat(video_conversion_fmt_, + VideoParams::kRGBChannelCount); + + if (src_alpha_pix_fmt == AV_PIX_FMT_NONE || src_noalpha_pix_fmt == AV_PIX_FMT_NONE) { + Error(QStringLiteral("Failed to find suitable pixel format for this buffer")); + return false; + } // This is the pixel format the encoder wants to encode to AVPixelFormat encoder_pix_fmt = video_codec_ctx_->pix_fmt; // Set up a scaling context - if the native pixel format is not equal to the encoder's, we'll need to convert it // before encoding. Even if we don't, this may be useful for converting between linesizes, etc. - video_scale_ctx_ = sws_getContext(params().video_params().width(), - params().video_params().height(), - src_pix_fmt, - params().video_params().width(), - params().video_params().height(), - encoder_pix_fmt, - 0, - nullptr, - nullptr, - nullptr); + video_alpha_scale_ctx_ = sws_getContext(params().video_params().width(), + params().video_params().height(), + src_alpha_pix_fmt, + params().video_params().width(), + params().video_params().height(), + encoder_pix_fmt, + 0, + nullptr, + nullptr, + nullptr); + + video_noalpha_scale_ctx_ = sws_getContext(params().video_params().width(), + params().video_params().height(), + src_noalpha_pix_fmt, + params().video_params().width(), + params().video_params().height(), + encoder_pix_fmt, + 0, + nullptr, + nullptr, + nullptr); } // Initialize an audio stream if it's enabled @@ -157,19 +177,22 @@ bool FFmpegEncoder::WriteFrame(FramePtr frame, rational time) // We may need to convert this frame to a frame that swscale will understand if (frame->format() != video_conversion_fmt_) { - frame = PixelFormat::ConvertPixelFormat(frame, video_conversion_fmt_); + frame = frame->convert(video_conversion_fmt_); } // Use swscale context to convert formats/linesizes input_data = frame->const_data(); input_linesize = frame->linesize_bytes(); - error_code = sws_scale(video_scale_ctx_, + + error_code = sws_scale((frame->channel_count() == VideoParams::kRGBAChannelCount) ? video_alpha_scale_ctx_ : video_noalpha_scale_ctx_, reinterpret_cast(&input_data), &input_linesize, 0, frame->height(), encoded_frame->data, encoded_frame->linesize); + + if (error_code < 0) { FFmpegError("Failed to scale frame", error_code); goto fail; @@ -208,7 +231,7 @@ void FFmpegEncoder::WriteAudio(AudioParams pcm_info, QIODevice* file) audio_codec_ctx_->sample_fmt, audio_codec_ctx_->sample_rate, static_cast(pcm_info.channel_layout()), - FFmpegCommon::GetFFmpegSampleFormat(pcm_info.format()), + FFmpegUtils::GetFFmpegSampleFormat(pcm_info.format()), pcm_info.sample_rate(), 0, nullptr); @@ -300,9 +323,14 @@ void FFmpegEncoder::Close() open_ = false; } - if (video_scale_ctx_) { - sws_freeContext(video_scale_ctx_); - video_scale_ctx_ = nullptr; + if (video_alpha_scale_ctx_) { + sws_freeContext(video_alpha_scale_ctx_); + video_alpha_scale_ctx_ = nullptr; + } + + if (video_noalpha_scale_ctx_) { + sws_freeContext(video_noalpha_scale_ctx_); + video_noalpha_scale_ctx_ = nullptr; } if (video_codec_ctx_) { diff --git a/app/codec/ffmpeg/ffmpegencoder.h b/app/codec/ffmpeg/ffmpegencoder.h index e42d8137a..6b28fb62f 100644 --- a/app/codec/ffmpeg/ffmpegencoder.h +++ b/app/codec/ffmpeg/ffmpegencoder.h @@ -47,7 +47,7 @@ public: virtual void Close() override; - virtual PixelFormat::Format GetDesiredPixelFormat() const override + virtual VideoParams::Format GetDesiredPixelFormat() const override { return video_conversion_fmt_; } @@ -85,8 +85,9 @@ private: AVStream* video_stream_; AVCodecContext* video_codec_ctx_; - SwsContext* video_scale_ctx_; - PixelFormat::Format video_conversion_fmt_; + SwsContext* video_alpha_scale_ctx_; + SwsContext* video_noalpha_scale_ctx_; + VideoParams::Format video_conversion_fmt_; AVStream* audio_stream_; AVCodecContext* audio_codec_ctx_; diff --git a/app/codec/ffmpeg/ffmpegframepool.cpp b/app/codec/ffmpeg/ffmpegframepool.cpp index ac114ba12..520f5d0ac 100644 --- a/app/codec/ffmpeg/ffmpegframepool.cpp +++ b/app/codec/ffmpeg/ffmpegframepool.cpp @@ -28,22 +28,24 @@ FFmpegFramePool::FFmpegFramePool(int element_count) : MemoryPool(element_count), width_(0), height_(0), - format_(PixelFormat::PIX_FMT_INVALID) + format_(VideoParams::kFormatInvalid), + channel_count_(0) { } -void FFmpegFramePool::SetParameters(int width, int height, PixelFormat::Format format) +void FFmpegFramePool::SetParameters(int width, int height, VideoParams::Format format, int channel_count) { Clear(); width_ = width; height_ = height; format_ = format; + channel_count_ = channel_count; } size_t FFmpegFramePool::GetElementSize() { - return Frame::generate_linesize_bytes(width_, format_) * height_; + return Frame::generate_linesize_bytes(width_, format_, channel_count_) * height_; } OLIVE_NAMESPACE_EXIT diff --git a/app/codec/ffmpeg/ffmpegframepool.h b/app/codec/ffmpeg/ffmpegframepool.h index 8a72bb61e..f97a948d0 100644 --- a/app/codec/ffmpeg/ffmpegframepool.h +++ b/app/codec/ffmpeg/ffmpegframepool.h @@ -22,7 +22,6 @@ #define FFMPEGFRAMEPOOL_H #include "common/memorypool.h" -#include "render/pixelformat.h" #include "render/videoparams.h" OLIVE_NAMESPACE_ENTER @@ -32,7 +31,7 @@ class FFmpegFramePool : public MemoryPool public: FFmpegFramePool(int element_count); - void SetParameters(int width, int height, PixelFormat::Format format); + void SetParameters(int width, int height, VideoParams::Format format, int channel_count); const int& width() const { @@ -52,7 +51,9 @@ private: int height_; - PixelFormat::Format format_; + VideoParams::Format format_; + + int channel_count_; }; diff --git a/app/codec/frame.cpp b/app/codec/frame.cpp index 9abdac922..7d474a1c5 100644 --- a/app/codec/frame.cpp +++ b/app/codec/frame.cpp @@ -20,10 +20,13 @@ #include "frame.h" +#include #include #include #include +#include "common/oiioutils.h" + OLIVE_NAMESPACE_ENTER Frame::Frame() : @@ -45,14 +48,14 @@ void Frame::set_video_params(const VideoParams ¶ms) { params_ = params; - linesize_ = generate_linesize_bytes(width(), params_.format()); - linesize_pixels_ = linesize_ / PixelFormat::BytesPerPixel(params_.format()); + linesize_ = generate_linesize_bytes(width(), params_.format(), params_.channel_count()); + linesize_pixels_ = linesize_ / params_.GetBytesPerPixel(); } -int Frame::generate_linesize_bytes(int width, PixelFormat::Format format) +int Frame::generate_linesize_bytes(int width, VideoParams::Format format, int channel_count) { // Align to 32 bytes (not sure if this is necessary?) - return PixelFormat::BytesPerPixel(format) * ((width + 31) & ~31); + return VideoParams::GetBytesPerPixel(format, channel_count) * ((width + 31) & ~31); } Color Frame::get_pixel(int x, int y) const @@ -61,9 +64,9 @@ Color Frame::get_pixel(int x, int y) const return Color(); } - int byte_offset = y * linesize_bytes() + x * PixelFormat::BytesPerPixel(video_params().format()); + int byte_offset = y * linesize_bytes() + x * video_params().GetBytesPerPixel(); - return Color(data_.data() + byte_offset, video_params().format()); + return Color(data_.data() + byte_offset, video_params().format(), video_params().channel_count()); } bool Frame::contains_pixel(int x, int y) const @@ -77,9 +80,9 @@ void Frame::set_pixel(int x, int y, const Color &c) return; } - int byte_offset = y * linesize_bytes() + x * PixelFormat::BytesPerPixel(video_params().format()); + int byte_offset = y * linesize_bytes() + x * video_params().GetBytesPerPixel(); - c.toData(data_.data() + byte_offset, video_params().format()); + c.toData(data_.data() + byte_offset, video_params().format(), video_params().channel_count()); } bool Frame::allocate() @@ -90,9 +93,40 @@ bool Frame::allocate() return false; } - data_.resize(PixelFormat::GetBufferSize(params_.format(), linesize_, height())); + data_.resize(VideoParams::GetBufferSize(linesize_, height(), params_.format(), params_.channel_count())); return true; } +FramePtr Frame::convert(VideoParams::Format format) const +{ + // Create new params with destination format + VideoParams params = params_; + params.set_format(format); + + // Create new frame + FramePtr converted = Frame::Create(); + converted->set_video_params(params); + converted->set_timestamp(timestamp_); + converted->allocate(); + + // Do the conversion through OIIO for convenience + OIIO::ImageBuf src(OIIO::ImageSpec(width(), height(), + channel_count(), + OIIOUtils::GetOIIOBaseTypeFromFormat(this->format()))); + + OIIOUtils::FrameToBuffer(this, &src); + + OIIO::ImageBuf dst(OIIO::ImageSpec(converted->width(), converted->height(), + channel_count(), + OIIOUtils::GetOIIOBaseTypeFromFormat(format))); + + if (dst.copy_pixels(src)) { + OIIOUtils::BufferToFrame(&dst, converted.get()); + return converted; + } else { + return nullptr; + } +} + OLIVE_NAMESPACE_EXIT diff --git a/app/codec/frame.h b/app/codec/frame.h index 8c89902b9..29fbdaac1 100644 --- a/app/codec/frame.h +++ b/app/codec/frame.h @@ -26,7 +26,6 @@ #include "common/rational.h" #include "render/color.h" -#include "render/pixelformat.h" #include "render/videoparams.h" OLIVE_NAMESPACE_ENTER @@ -47,7 +46,7 @@ public: const VideoParams& video_params() const; void set_video_params(const VideoParams& params); - static int generate_linesize_bytes(int width, PixelFormat::Format format); + static int generate_linesize_bytes(int width, VideoParams::Format format, int channel_count); int linesize_pixels() const { @@ -69,11 +68,16 @@ public: return params_.effective_height(); } - PixelFormat::Format format() const + VideoParams::Format format() const { return params_.format(); } + int channel_count() const + { + return params_.channel_count(); + } + Color get_pixel(int x, int y) const; bool contains_pixel(int x, int y) const; void set_pixel(int x, int y, const Color& c); @@ -144,6 +148,8 @@ public: return data_.size(); } + FramePtr convert(VideoParams::Format format) const; + private: VideoParams params_; diff --git a/app/codec/oiio/CMakeLists.txt b/app/codec/oiio/CMakeLists.txt index 4843b25b1..201fd3ee7 100644 --- a/app/codec/oiio/CMakeLists.txt +++ b/app/codec/oiio/CMakeLists.txt @@ -16,8 +16,6 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} - codec/oiio/oiiocommon.cpp - codec/oiio/oiiocommon.h codec/oiio/oiiodecoder.cpp codec/oiio/oiiodecoder.h PARENT_SCOPE diff --git a/app/codec/oiio/oiiocommon.h b/app/codec/oiio/oiiocommon.h deleted file mode 100644 index aeccc2e0d..000000000 --- a/app/codec/oiio/oiiocommon.h +++ /dev/null @@ -1,47 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef OIIOCOMMON_H -#define OIIOCOMMON_H - -#include -#include - -#include "codec/frame.h" -#include "render/pixelformat.h" - -OLIVE_NAMESPACE_ENTER - -class OIIOCommon -{ -public: - static void FrameToBuffer(FramePtr frame, OIIO::ImageBuf* buf); - - static void BufferToFrame(OIIO::ImageBuf* buf, FramePtr frame); - - static PixelFormat::Format GetFormatFromOIIOBasetype(const OIIO::ImageSpec& spec); - - static rational GetPixelAspectRatioFromOIIO(const OIIO::ImageSpec& spec); - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // OIIOCOMMON_H diff --git a/app/codec/oiio/oiiodecoder.cpp b/app/codec/oiio/oiiodecoder.cpp index 1728c04d2..392951240 100644 --- a/app/codec/oiio/oiiodecoder.cpp +++ b/app/codec/oiio/oiiodecoder.cpp @@ -27,9 +27,9 @@ #include #include "common/define.h" +#include "common/oiioutils.h" #include "config/config.h" #include "core.h" -#include "oiiocommon.h" OLIVE_NAMESPACE_ENTER @@ -81,8 +81,9 @@ FootagePtr OIIODecoder::Probe(const QString& filename, const QAtomicInt* cancell image_stream->set_width(in->spec().width); image_stream->set_height(in->spec().height); - image_stream->set_format(OIIOCommon::GetFormatFromOIIOBasetype(in->spec())); - image_stream->set_pixel_aspect_ratio(OIIOCommon::GetPixelAspectRatioFromOIIO(in->spec())); + image_stream->set_format(OIIOUtils::GetFormatFromOIIOBasetype(static_cast(in->spec().format.basetype))); + image_stream->set_channel_count(in->spec().nchannels); + image_stream->set_pixel_aspect_ratio(OIIOUtils::GetPixelAspectRatioFromOIIO(in->spec())); image_stream->set_video_type(VideoStream::kVideoTypeStill); // Images will always have just one stream @@ -149,14 +150,15 @@ FramePtr OIIODecoder::RetrieveVideoInternal(const rational &timecode, const int& frame->set_video_params(VideoParams(buffer_->spec().width, buffer_->spec().height, pix_fmt_, - OIIOCommon::GetPixelAspectRatioFromOIIO(buffer_->spec()), + channel_count_, + OIIOUtils::GetPixelAspectRatioFromOIIO(buffer_->spec()), VideoParams::kInterlaceNone, // FIXME: Does OIIO deinterlace for us? divider)); frame->allocate(); if (divider == 1) { - OIIOCommon::BufferToFrame(buffer_, frame); + OIIOUtils::BufferToFrame(buffer_, frame.get()); } else { @@ -167,7 +169,7 @@ FramePtr OIIODecoder::RetrieveVideoInternal(const rational &timecode, const int& qWarning() << "OIIO resize failed"; } - OIIOCommon::BufferToFrame(&dst, frame); + OIIOUtils::BufferToFrame(&dst, frame.get()); } @@ -215,18 +217,23 @@ bool OIIODecoder::OpenImageHandler(const QString &fn) // Check if we can work with this pixel format const OIIO::ImageSpec& spec = image_->spec(); - //is_rgba_ = (spec.nchannels == kRGBAChannels); + // Store channel count + channel_count_ = spec.nchannels; // We use RGBA frames because that tends to be the native format of GPUs - pix_fmt_ = OIIOCommon::GetFormatFromOIIOBasetype(spec); + pix_fmt_ = OIIOUtils::GetFormatFromOIIOBasetype(static_cast(spec.format.basetype)); - if (pix_fmt_ == PixelFormat::PIX_FMT_INVALID) { + if (pix_fmt_ == VideoParams::kFormatInvalid) { qWarning() << "Failed to convert OIIO::ImageDesc to native pixel format"; return false; } - // FIXME: Many OIIO pixel formats are not handled here - OIIO::TypeDesc type = PixelFormat::GetOIIOTypeDesc(pix_fmt_); + OIIO::TypeDesc::BASETYPE type = OIIOUtils::GetOIIOBaseTypeFromFormat(pix_fmt_); + + if (type == OIIO::TypeDesc::UNKNOWN) { + qCritical() << "Failed to determine appropriate OIIO basetype from native format"; + return false; + } #if OIIO_VERSION < 20100 buffer_ = new OIIO::ImageBuf(OIIO::ImageSpec(spec.width, spec.height, spec.nchannels, type)); diff --git a/app/codec/oiio/oiiodecoder.h b/app/codec/oiio/oiiodecoder.h index 820057d3e..f4b7e96d9 100644 --- a/app/codec/oiio/oiiodecoder.h +++ b/app/codec/oiio/oiiodecoder.h @@ -25,7 +25,6 @@ #include #include "codec/decoder.h" -#include "render/pixelformat.h" OLIVE_NAMESPACE_ENTER @@ -63,9 +62,9 @@ private: int64_t last_sequence_index_; - PixelFormat::Format pix_fmt_; + VideoParams::Format pix_fmt_; - //bool is_rgba_; + int channel_count_; OIIO::ImageBuf* buffer_; diff --git a/app/codec/waveinput.cpp b/app/codec/waveinput.cpp index 275bea1f2..06fd5f2b6 100644 --- a/app/codec/waveinput.cpp +++ b/app/codec/waveinput.cpp @@ -108,27 +108,27 @@ bool WaveInput::open() uint16_t bits_per_sample; data_stream >> bits_per_sample; - SampleFormat::Format format; + AudioParams::Format format; switch (bits_per_sample) { case 8: - format = SampleFormat::SAMPLE_FMT_U8; + format = AudioParams::kFormatUnsigned8; break; case 16: - format = SampleFormat::SAMPLE_FMT_S16; + format = AudioParams::kFormatSigned16; break; case 32: if (data_is_float) { - format = SampleFormat::SAMPLE_FMT_FLT; + format = AudioParams::kFormatFloat32; } else { - format = SampleFormat::SAMPLE_FMT_S32; + format = AudioParams::kFormatSigned32; } break; case 64: if (data_is_float) { - format = SampleFormat::SAMPLE_FMT_DBL; + format = AudioParams::kFormatFloat64; } else { - format = SampleFormat::SAMPLE_FMT_S64; + format = AudioParams::kFormatSigned64; } break; default: diff --git a/app/codec/waveoutput.cpp b/app/codec/waveoutput.cpp index 844b3ad8f..648b8c4a8 100644 --- a/app/codec/waveoutput.cpp +++ b/app/codec/waveoutput.cpp @@ -20,6 +20,8 @@ #include "waveoutput.h" +#include "render/audioparams.h" + OLIVE_NAMESPACE_ENTER const int16_t kWAVIntegerFormat = 1; @@ -60,18 +62,18 @@ bool WaveOutput::open() // Type of format switch (params_.format()) { - case SampleFormat::SAMPLE_FMT_U8: - case SampleFormat::SAMPLE_FMT_S16: - case SampleFormat::SAMPLE_FMT_S32: - case SampleFormat::SAMPLE_FMT_S64: + case AudioParams::kFormatUnsigned8: + case AudioParams::kFormatSigned16: + case AudioParams::kFormatSigned32: + case AudioParams::kFormatSigned64: write_int(&file_, kWAVIntegerFormat); break; - case SampleFormat::SAMPLE_FMT_FLT: - case SampleFormat::SAMPLE_FMT_DBL: + case AudioParams::kFormatFloat32: + case AudioParams::kFormatFloat64: write_int(&file_, kWAVFloatFormat); break; - case SampleFormat::SAMPLE_FMT_INVALID: - case SampleFormat::SAMPLE_FMT_COUNT: + case AudioParams::kFormatInvalid: + case AudioParams::kFormatCount: qWarning() << "Invalid sample format for WAVE audio"; file_.close(); return false; diff --git a/app/codec/waveoutput.h b/app/codec/waveoutput.h index a42f103e0..450fe38bc 100644 --- a/app/codec/waveoutput.h +++ b/app/codec/waveoutput.h @@ -24,7 +24,6 @@ #include #include -#include "audio/sampleformat.h" #include "render/audioparams.h" OLIVE_NAMESPACE_ENTER diff --git a/app/common/CMakeLists.txt b/app/common/CMakeLists.txt index 553af7017..06963187b 100644 --- a/app/common/CMakeLists.txt +++ b/app/common/CMakeLists.txt @@ -16,44 +16,49 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} - common/bezier.h common/bezier.cpp + common/bezier.h common/cancelableobject.h common/channellayout.h common/clamp.h - common/commandlineparser.h common/commandlineparser.cpp - common/crashpadinterface.h + common/commandlineparser.h common/crashpadinterface.cpp + common/crashpadinterface.h common/crashpadutils.h - common/debug.h common/debug.cpp + common/debug.h common/define.h - common/filefunctions.h + common/ffmpegutils.cpp + common/ffmpegutils.h common/filefunctions.cpp - common/flipmodifiers.h + common/filefunctions.h common/flipmodifiers.cpp + common/flipmodifiers.h common/functiontimer.h common/lerp.h - common/memorypool.h common/memorypool.cpp + common/memorypool.h + common/ocioutils.cpp common/ocioutils.h - common/qtutils.h + common/oiioutils.cpp + common/oiioutils.h common/qtutils.cpp + common/qtutils.h common/range.h - common/ratiodialog.h common/ratiodialog.cpp + common/ratiodialog.h common/rational.h common/rational.cpp common/threadsafemap.h - common/threadedobject.h common/threadedobject.cpp - common/timecodefunctions.h + common/threadedobject.h common/timecodefunctions.cpp - common/timerange.h + common/timecodefunctions.h common/timerange.cpp + common/timerange.h common/tohex.h - common/xmlutils.h common/xmlutils.cpp + common/xmlutils.h PARENT_SCOPE ) diff --git a/app/common/define.h b/app/common/define.h index aa968fcf7..0a29394a0 100644 --- a/app/common/define.h +++ b/app/common/define.h @@ -29,10 +29,6 @@ OLIVE_NAMESPACE_ENTER -const int kHSVChannels = 3; -const int kRGBChannels = 3; -const int kRGBAChannels = 4; - /// The minimum size an icon in ProjectExplorer can be const int kProjectIconSizeMinimum = 16; diff --git a/app/common/ffmpegutils.cpp b/app/common/ffmpegutils.cpp new file mode 100644 index 000000000..9453bd851 --- /dev/null +++ b/app/common/ffmpegutils.cpp @@ -0,0 +1,141 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "common/ffmpegutils.h" + +OLIVE_NAMESPACE_ENTER + +AVPixelFormat FFmpegUtils::GetCompatiblePixelFormat(const AVPixelFormat &pix_fmt) +{ + AVPixelFormat possible_pix_fmts[] = { + AV_PIX_FMT_RGB24, + AV_PIX_FMT_RGBA, + AV_PIX_FMT_RGB48, + AV_PIX_FMT_RGBA64, + AV_PIX_FMT_NONE + }; + + return avcodec_find_best_pix_fmt_of_list(possible_pix_fmts, + pix_fmt, + 1, + nullptr); +} + +AudioParams::Format FFmpegUtils::GetNativeSampleFormat(const AVSampleFormat &smp_fmt) +{ + switch (smp_fmt) { + case AV_SAMPLE_FMT_U8: + return AudioParams::kFormatUnsigned8; + case AV_SAMPLE_FMT_S16: + return AudioParams::kFormatSigned16; + case AV_SAMPLE_FMT_S32: + return AudioParams::kFormatSigned32; + case AV_SAMPLE_FMT_S64: + return AudioParams::kFormatSigned64; + case AV_SAMPLE_FMT_FLT: + return AudioParams::kFormatFloat32; + case AV_SAMPLE_FMT_DBL: + return AudioParams::kFormatFloat64; + case AV_SAMPLE_FMT_U8P : + case AV_SAMPLE_FMT_S16P: + case AV_SAMPLE_FMT_S32P: + case AV_SAMPLE_FMT_S64P: + case AV_SAMPLE_FMT_FLTP: + case AV_SAMPLE_FMT_DBLP: + case AV_SAMPLE_FMT_NONE: + case AV_SAMPLE_FMT_NB: + break; + } + + return AudioParams::kFormatInvalid; +} + +AVSampleFormat FFmpegUtils::GetFFmpegSampleFormat(const AudioParams::Format &smp_fmt) +{ + switch (smp_fmt) { + case AudioParams::kFormatUnsigned8: + return AV_SAMPLE_FMT_U8; + case AudioParams::kFormatSigned16: + return AV_SAMPLE_FMT_S16; + case AudioParams::kFormatSigned32: + return AV_SAMPLE_FMT_S32; + case AudioParams::kFormatSigned64: + return AV_SAMPLE_FMT_S64; + case AudioParams::kFormatFloat32: + return AV_SAMPLE_FMT_FLT; + case AudioParams::kFormatFloat64: + return AV_SAMPLE_FMT_DBL; + case AudioParams::kFormatInvalid: + case AudioParams::kFormatCount: + break; + } + + return AV_SAMPLE_FMT_NONE; +} + +AVPixelFormat FFmpegUtils::GetFFmpegPixelFormat(const VideoParams::Format &pix_fmt, int channel_layout) +{ + if (channel_layout == VideoParams::kRGBChannelCount) { + switch (pix_fmt) { + case VideoParams::kFormatUnsigned8: + return AV_PIX_FMT_RGB24; + case VideoParams::kFormatUnsigned16: + return AV_PIX_FMT_RGB48; + case VideoParams::kFormatFloat16: + case VideoParams::kFormatFloat32: + case VideoParams::kFormatInvalid: + case VideoParams::kFormatCount: + break; + } + } else if (channel_layout == VideoParams::kRGBAChannelCount) { + switch (pix_fmt) { + case VideoParams::kFormatUnsigned8: + return AV_PIX_FMT_RGBA; + case VideoParams::kFormatUnsigned16: + return AV_PIX_FMT_RGBA64; + case VideoParams::kFormatFloat16: + case VideoParams::kFormatFloat32: + case VideoParams::kFormatInvalid: + case VideoParams::kFormatCount: + break; + } + } + + return AV_PIX_FMT_NONE; +} + +VideoParams::Format FFmpegUtils::GetCompatiblePixelFormat(const VideoParams::Format &pix_fmt) +{ + switch (pix_fmt) { + case VideoParams::kFormatUnsigned8: + return VideoParams::kFormatUnsigned8; + case VideoParams::kFormatUnsigned16: + case VideoParams::kFormatFloat16: + case VideoParams::kFormatFloat32: + return VideoParams::kFormatUnsigned16; + case VideoParams::kFormatInvalid: + case VideoParams::kFormatCount: + break; + } + + return VideoParams::kFormatInvalid; +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/codec/ffmpeg/ffmpegcommon.h b/app/common/ffmpegutils.h similarity index 77% rename from app/codec/ffmpeg/ffmpegcommon.h rename to app/common/ffmpegutils.h index 106452fad..6e9fb002a 100644 --- a/app/codec/ffmpeg/ffmpegcommon.h +++ b/app/common/ffmpegutils.h @@ -25,12 +25,12 @@ extern "C" { #include } -#include "audio/sampleformat.h" -#include "render/pixelformat.h" +#include "render/audioparams.h" +#include "render/videoparams.h" OLIVE_NAMESPACE_ENTER -class FFmpegCommon { +class FFmpegUtils { public: /** * @brief Returns an AVPixelFormat that can be used to convert a frame to a data type Olive supports with minimal data loss @@ -40,22 +40,22 @@ public: /** * @brief Returns a native pixel format that can be used to convert from a native frame to an AVFrame with minimal data loss */ - static PixelFormat::Format GetCompatiblePixelFormat(const PixelFormat::Format& pix_fmt); + static VideoParams::Format GetCompatiblePixelFormat(const VideoParams::Format& pix_fmt); /** * @brief Returns an FFmpeg pixel format for a given native pixel format */ - static AVPixelFormat GetFFmpegPixelFormat(const PixelFormat::Format& pix_fmt); + static AVPixelFormat GetFFmpegPixelFormat(const VideoParams::Format& pix_fmt, int channel_layout); /** * @brief Returns a native sample format type for a given AVSampleFormat */ - static SampleFormat::Format GetNativeSampleFormat(const AVSampleFormat& smp_fmt); + static AudioParams::Format GetNativeSampleFormat(const AVSampleFormat& smp_fmt); /** * @brief Returns an FFmpeg sample format type for a given native type */ - static AVSampleFormat GetFFmpegSampleFormat(const SampleFormat::Format &smp_fmt); + static AVSampleFormat GetFFmpegSampleFormat(const AudioParams::Format &smp_fmt); }; OLIVE_NAMESPACE_EXIT diff --git a/app/audio/sampleformat.h b/app/common/ocioutils.cpp similarity index 57% rename from app/audio/sampleformat.h rename to app/common/ocioutils.cpp index 1261d04a1..c5f182450 100644 --- a/app/audio/sampleformat.h +++ b/app/common/ocioutils.cpp @@ -18,39 +18,30 @@ ***/ -#ifndef SAMPLEFORMAT_H -#define SAMPLEFORMAT_H - -#include - -#include "common/define.h" +#include "ocioutils.h" OLIVE_NAMESPACE_ENTER -class SampleFormat +OCIO::BitDepth OCIOUtils::GetOCIOBitDepthFromPixelFormat(VideoParams::Format format) { -public: - SampleFormat() = default; + switch (format) { + case VideoParams::kFormatUnsigned8: + return OCIO::BIT_DEPTH_UINT8; + case VideoParams::kFormatUnsigned16: + return OCIO::BIT_DEPTH_UINT16; + break; + case VideoParams::kFormatFloat16: + return OCIO::BIT_DEPTH_F16; + break; + case VideoParams::kFormatFloat32: + return OCIO::BIT_DEPTH_F32; + break; + case VideoParams::kFormatInvalid: + case VideoParams::kFormatCount: + break; + } - enum Format { - SAMPLE_FMT_INVALID = -1, - - SAMPLE_FMT_U8, - SAMPLE_FMT_S16, - SAMPLE_FMT_S32, - SAMPLE_FMT_S64, - SAMPLE_FMT_FLT, - SAMPLE_FMT_DBL, - - SAMPLE_FMT_COUNT - }; - - static const Format kInternalFormat; - - static QString GetSampleFormatName(const Format& f); - -}; + return OCIO::BIT_DEPTH_UNKNOWN; +} OLIVE_NAMESPACE_EXIT - -#endif // SAMPLEFORMAT_H diff --git a/app/common/ocioutils.h b/app/common/ocioutils.h index a290a1e50..edbaa9fef 100644 --- a/app/common/ocioutils.h +++ b/app/common/ocioutils.h @@ -24,4 +24,16 @@ #include namespace OCIO = OpenColorIO_v2_0dev; +#include "render/videoparams.h" + +OLIVE_NAMESPACE_ENTER + +class OCIOUtils +{ +public: + static OCIO::BitDepth GetOCIOBitDepthFromPixelFormat(VideoParams::Format format); +}; + +OLIVE_NAMESPACE_EXIT + #endif // OCIOUTILS_H diff --git a/app/codec/oiio/oiiocommon.cpp b/app/common/oiioutils.cpp similarity index 68% rename from app/codec/oiio/oiiocommon.cpp rename to app/common/oiioutils.cpp index f51f82aa2..8381ba904 100644 --- a/app/codec/oiio/oiiocommon.cpp +++ b/app/common/oiioutils.cpp @@ -18,11 +18,11 @@ ***/ -#include "oiiocommon.h" +#include "oiioutils.h" OLIVE_NAMESPACE_ENTER -void OIIOCommon::FrameToBuffer(FramePtr frame, OIIO::ImageBuf *buf) +void OIIOUtils::FrameToBuffer(const Frame* frame, OIIO::ImageBuf *buf) { #if OIIO_VERSION < 20112 // @@ -45,13 +45,13 @@ void OIIOCommon::FrameToBuffer(FramePtr frame, OIIO::ImageBuf *buf) #else buf->set_pixels(OIIO::ROI(), buf->spec().format, - frame->data(), + frame->const_data(), OIIO::AutoStride, frame->linesize_bytes()); #endif } -void OIIOCommon::BufferToFrame(OIIO::ImageBuf *buf, FramePtr frame) +void OIIOUtils::BufferToFrame(OIIO::ImageBuf *buf, Frame* frame) { #if OIIO_VERSION < 20112 // @@ -79,24 +79,42 @@ void OIIOCommon::BufferToFrame(OIIO::ImageBuf *buf, FramePtr frame) #endif } -PixelFormat::Format OIIOCommon::GetFormatFromOIIOBasetype(const OIIO::ImageSpec& spec) -{ - if (spec.format == OIIO::TypeDesc::UINT8) { - return PixelFormat::PIX_FMT_RGBA8; - } else if (spec.format == OIIO::TypeDesc::UINT16) { - return PixelFormat::PIX_FMT_RGBA16U; - } else if (spec.format == OIIO::TypeDesc::HALF) { - return PixelFormat::PIX_FMT_RGBA16F; - } else if (spec.format == OIIO::TypeDesc::FLOAT) { - return PixelFormat::PIX_FMT_RGBA32F; - } else { - return PixelFormat::PIX_FMT_INVALID; - } -} - -rational OIIOCommon::GetPixelAspectRatioFromOIIO(const OIIO::ImageSpec &spec) +rational OIIOUtils::GetPixelAspectRatioFromOIIO(const OIIO::ImageSpec &spec) { return rational::fromDouble(spec.get_float_attribute("PixelAspectRatio", 1)); } +VideoParams::Format OIIOUtils::GetFormatFromOIIOBasetype(OIIO::TypeDesc::BASETYPE type) +{ + switch (type) { + case OIIO::TypeDesc::UNKNOWN: + case OIIO::TypeDesc::NONE: + break; + + case OIIO::TypeDesc::INT8: + case OIIO::TypeDesc::INT16: + case OIIO::TypeDesc::INT32: + case OIIO::TypeDesc::UINT32: + case OIIO::TypeDesc::INT64: + case OIIO::TypeDesc::UINT64: + case OIIO::TypeDesc::STRING: + case OIIO::TypeDesc::PTR: + case OIIO::TypeDesc::LASTBASE: + case OIIO::TypeDesc::DOUBLE: + qDebug() << "Tried to use unknown OIIO base type"; + break; + + case OIIO::TypeDesc::UINT8: + return VideoParams::kFormatUnsigned8; + case OIIO::TypeDesc::UINT16: + return VideoParams::kFormatUnsigned16; + case OIIO::TypeDesc::HALF: + return VideoParams::kFormatFloat16; + case OIIO::TypeDesc::FLOAT: + return VideoParams::kFormatFloat32; + } + + return VideoParams::kFormatInvalid; +} + OLIVE_NAMESPACE_EXIT diff --git a/app/common/oiioutils.h b/app/common/oiioutils.h new file mode 100644 index 000000000..a9dca5baa --- /dev/null +++ b/app/common/oiioutils.h @@ -0,0 +1,65 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef OIIOUTILS_H +#define OIIOUTILS_H + +#include +#include + +#include "codec/frame.h" +#include "render/videoparams.h" + +OLIVE_NAMESPACE_ENTER + +class OIIOUtils { +public: + static OIIO::TypeDesc::BASETYPE GetOIIOBaseTypeFromFormat(VideoParams::Format format) + { + switch (format) { + case VideoParams::kFormatUnsigned8: + return OIIO::TypeDesc::UINT8; + case VideoParams::kFormatUnsigned16: + return OIIO::TypeDesc::UINT16; + case VideoParams::kFormatFloat16: + return OIIO::TypeDesc::HALF; + case VideoParams::kFormatFloat32: + return OIIO::TypeDesc::FLOAT; + case VideoParams::kFormatInvalid: + case VideoParams::kFormatCount: + break; + } + + return OIIO::TypeDesc::UNKNOWN; + } + + static void FrameToBuffer(const Frame *frame, OIIO::ImageBuf* buf); + + static void BufferToFrame(OIIO::ImageBuf* buf, Frame* frame); + + static VideoParams::Format GetFormatFromOIIOBasetype(OIIO::TypeDesc::BASETYPE type); + + static rational GetPixelAspectRatioFromOIIO(const OIIO::ImageSpec& spec); + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // OIIOUTILS_H diff --git a/app/config/config.cpp b/app/config/config.cpp index 2feb40578..3c818f084 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -116,11 +116,10 @@ void Config::SetDefaults() SetEntryInternal(QStringLiteral("DefaultSequenceInterlacing"), NodeParam::kInt, VideoParams::kInterlaceNone); SetEntryInternal(QStringLiteral("DefaultSequenceAudioFrequency"), NodeParam::kInt, 48000); SetEntryInternal(QStringLiteral("DefaultSequenceAudioLayout"), NodeParam::kInt, QVariant::fromValue(static_cast(AV_CH_LAYOUT_STEREO))); - SetEntryInternal(QStringLiteral("DefaultSequencePreviewFormat"), NodeParam::kInt, PixelFormat::PIX_FMT_RGBA16F); // Online/offline settings - SetEntryInternal(QStringLiteral("OnlinePixelFormat"), NodeParam::kInt, PixelFormat::PIX_FMT_RGBA32F); - SetEntryInternal(QStringLiteral("OfflinePixelFormat"), NodeParam::kInt, PixelFormat::PIX_FMT_RGBA16F); + SetEntryInternal(QStringLiteral("OnlinePixelFormat"), NodeParam::kInt, VideoParams::kFormatFloat32); + SetEntryInternal(QStringLiteral("OfflinePixelFormat"), NodeParam::kInt, VideoParams::kFormatFloat16); } void Config::Load() diff --git a/app/core.cpp b/app/core.cpp index b60591b88..5a7f179bf 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -51,7 +51,6 @@ #include "panel/viewer/viewer.h" #include "render/colormanager.h" #include "render/diskmanager.h" -#include "render/pixelformat.h" #include "render/rendermanager.h" #ifdef USE_OTIO #include "task/project/loadotio/loadotio.h" @@ -189,8 +188,6 @@ void Core::Stop() DiskManager::DestroyInstance(); - PixelFormat::DestroyInstance(); - NodeFactory::Destroy(); delete main_window_; @@ -646,9 +643,6 @@ void Core::StartGUI(bool full_screen) // Initialize disk service DiskManager::CreateInstance(); - // Initialize pixel service - PixelFormat::CreateInstance(); - // Connect the PanelFocusManager to the application's focus change signal connect(qApp, &QApplication::focusChanged, diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index c14aff1f3..ccc3df207 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -34,7 +34,6 @@ #include "dialog/task/task.h" #include "project/item/sequence/sequence.h" #include "project/project.h" -#include "render/pixelformat.h" #include "ui/icons/icons.h" OLIVE_NAMESPACE_ENTER @@ -179,7 +178,7 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : video_tab_->height_slider()->SetDefaultValue(viewer_node_->video_params().height()); video_tab_->frame_rate_combobox()->SetFrameRate(viewer_node_->video_params().time_base().flipped()); video_tab_->pixel_aspect_combobox()->SetPixelAspectRatio(viewer_node_->video_params().pixel_aspect_ratio()); - video_tab_->pixel_format_field()->SetPixelFormat(PixelFormat::instance()->GetConfiguredFormatForMode(RenderMode::kOnline)); + video_tab_->pixel_format_field()->SetPixelFormat(static_cast(Config::Current()["OnlinePixelFormat"].toInt())); video_tab_->interlaced_combobox()->SetInterlaceMode(viewer_node_->video_params().interlacing()); audio_tab_->sample_rate_combobox()->SetSampleRate(viewer_node_->audio_params().sample_rate()); audio_tab_->channel_layout_combobox()->SetChannelLayout(viewer_node_->audio_params().channel_layout()); @@ -432,13 +431,14 @@ ExportParams ExportDialog::GenerateParams() const static_cast(video_tab_->height_slider()->GetValue()), video_tab_->frame_rate_combobox()->GetFrameRate().flipped(), video_tab_->pixel_format_field()->GetPixelFormat(), + VideoParams::kInternalChannelCount, video_tab_->pixel_aspect_combobox()->GetPixelAspectRatio(), video_tab_->interlaced_combobox()->GetInterlaceMode(), 1); AudioParams audio_render_params(audio_tab_->sample_rate_combobox()->currentData().toInt(), audio_tab_->channel_layout_combobox()->GetChannelLayout(), - SampleFormat::kInternalFormat); + AudioParams::kInternalFormat); ExportParams params; params.SetFilename(filename_edit_->text()); diff --git a/app/dialog/sequence/sequence.cpp b/app/dialog/sequence/sequence.cpp index 3006c2b73..0df85621e 100644 --- a/app/dialog/sequence/sequence.cpp +++ b/app/dialog/sequence/sequence.cpp @@ -107,13 +107,14 @@ void SequenceDialog::accept() parameter_tab_->GetSelectedVideoHeight(), parameter_tab_->GetSelectedVideoFrameRate().flipped(), parameter_tab_->GetSelectedPreviewFormat(), + VideoParams::kInternalChannelCount, parameter_tab_->GetSelectedVideoPixelAspect(), parameter_tab_->GetSelectedVideoInterlacingMode(), parameter_tab_->GetSelectedPreviewResolution()); AudioParams audio_params = AudioParams(parameter_tab_->GetSelectedAudioSampleRate(), parameter_tab_->GetSelectedAudioChannelLayout(), - SampleFormat::kInternalFormat); + AudioParams::kInternalFormat); if (make_undoable_) { diff --git a/app/dialog/sequence/sequencedialogparametertab.cpp b/app/dialog/sequence/sequencedialogparametertab.cpp index cd744eefc..326df8b11 100644 --- a/app/dialog/sequence/sequencedialogparametertab.cpp +++ b/app/dialog/sequence/sequencedialogparametertab.cpp @@ -133,7 +133,8 @@ void SequenceDialogParameterTab::UpdatePreviewResolutionLabel() { VideoParams test_param(video_width_field_->GetValue(), video_height_field_->GetValue(), - PixelFormat::PIX_FMT_INVALID, + VideoParams::kFormatInvalid, + VideoParams::kInternalChannelCount, rational(1), VideoParams::kInterlaceNone, preview_resolution_field_->currentData().toInt()); diff --git a/app/dialog/sequence/sequencedialogparametertab.h b/app/dialog/sequence/sequencedialogparametertab.h index 794abe505..d2dabdea1 100644 --- a/app/dialog/sequence/sequencedialogparametertab.h +++ b/app/dialog/sequence/sequencedialogparametertab.h @@ -58,7 +58,7 @@ public: return preview_resolution_field_->GetDivider(); } - PixelFormat::Format GetSelectedPreviewFormat() const + VideoParams::Format GetSelectedPreviewFormat() const { return preview_format_field_->GetPixelFormat(); } diff --git a/app/dialog/sequence/sequencedialogpresettab.cpp b/app/dialog/sequence/sequencedialogpresettab.cpp index 18c9419db..1f25a29fb 100644 --- a/app/dialog/sequence/sequencedialogpresettab.cpp +++ b/app/dialog/sequence/sequencedialogpresettab.cpp @@ -30,6 +30,7 @@ #include #include "common/filefunctions.h" +#include "config/config.h" #include "node/input.h" #include "render/videoparams.h" #include "ui/icons/icons.h" @@ -41,8 +42,6 @@ const int kDataIsPreset = Qt::UserRole; const int kDataPresetIsCustomRole = Qt::UserRole + 1; const int kDataPresetDataRole = Qt::UserRole + 2; -const PixelFormat::Format kDefaultPreviewFormat = PixelFormat::PIX_FMT_RGBA16F; - SequenceDialogPresetTab::SequenceDialogPresetTab(QWidget* parent) : QWidget(parent), PresetManager(this, QStringLiteral("sequencepresets")) @@ -100,6 +99,7 @@ QTreeWidgetItem* SequenceDialogPresetTab::CreateFolder(const QString &name) QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &name, int width, int height, int divider) { + VideoParams::Format default_format = static_cast(Config::Current()["OfflinePixelFormat"].toInt()); QTreeWidgetItem* parent = CreateFolder(name); AddStandardItem(parent, SequencePreset::Create(tr("%1 23.976 FPS").arg(name), width, @@ -110,7 +110,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na 48000, AV_CH_LAYOUT_STEREO, divider, - kDefaultPreviewFormat)); + default_format)); AddStandardItem(parent, SequencePreset::Create(tr("%1 25 FPS").arg(name), width, height, @@ -120,7 +120,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na 48000, AV_CH_LAYOUT_STEREO, divider, - kDefaultPreviewFormat)); + default_format)); AddStandardItem(parent, SequencePreset::Create(tr("%1 29.97 FPS").arg(name), width, height, @@ -130,7 +130,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na 48000, AV_CH_LAYOUT_STEREO, divider, - kDefaultPreviewFormat)); + default_format)); AddStandardItem(parent, SequencePreset::Create(tr("%1 50 FPS").arg(name), width, height, @@ -140,7 +140,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na 48000, AV_CH_LAYOUT_STEREO, divider, - kDefaultPreviewFormat)); + default_format)); AddStandardItem(parent, SequencePreset::Create(tr("%1 59.94 FPS").arg(name), width, height, @@ -150,12 +150,13 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na 48000, AV_CH_LAYOUT_STEREO, divider, - kDefaultPreviewFormat)); + default_format)); return parent; } QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &name, int width, int height, const rational& frame_rate, const rational &standard_par, const rational &wide_par, int divider) { + VideoParams::Format default_format = static_cast(Config::Current()["OfflinePixelFormat"].toInt()); QTreeWidgetItem* parent = CreateFolder(name); preset_tree_->addTopLevelItem(parent); AddStandardItem(parent, SequencePreset::Create(tr("%1 Standard").arg(name), @@ -167,7 +168,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &na 48000, AV_CH_LAYOUT_STEREO, divider, - kDefaultPreviewFormat)); + default_format)); AddStandardItem(parent, SequencePreset::Create(tr("%1 Widescreen").arg(name), width, height, @@ -177,7 +178,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &na 48000, AV_CH_LAYOUT_STEREO, divider, - kDefaultPreviewFormat)); + default_format)); return parent; } diff --git a/app/dialog/sequence/sequencepreset.h b/app/dialog/sequence/sequencepreset.h index 6b134b8f1..59db546fd 100644 --- a/app/dialog/sequence/sequencepreset.h +++ b/app/dialog/sequence/sequencepreset.h @@ -26,7 +26,6 @@ #include "common/rational.h" #include "common/xmlutils.h" #include "dialog/sequence/presetmanager.h" -#include "render/pixelformat.h" #include "render/videoparams.h" OLIVE_NAMESPACE_ENTER @@ -44,7 +43,7 @@ public: int sample_rate, uint64_t channel_layout, int preview_divider, - PixelFormat::Format preview_format) : + VideoParams::Format preview_format) : width_(width), height_(height), frame_rate_(frame_rate), @@ -67,7 +66,7 @@ public: int sample_rate, uint64_t channel_layout, int preview_divider, - PixelFormat::Format preview_format) + VideoParams::Format preview_format) { return std::make_shared(name, width, height, frame_rate, pixel_aspect, interlacing, sample_rate, channel_layout, @@ -96,7 +95,7 @@ public: } else if (reader->name() == QStringLiteral("divider")) { preview_divider_ = reader->readElementText().toInt(); } else if (reader->name() == QStringLiteral("format")) { - preview_format_ = static_cast(reader->readElementText().toInt()); + preview_format_ = static_cast(reader->readElementText().toInt()); } else { reader->skipCurrentElement(); } @@ -157,7 +156,7 @@ public: return preview_divider_; } - PixelFormat::Format preview_format() const + VideoParams::Format preview_format() const { return preview_format_; } @@ -171,7 +170,7 @@ private: int sample_rate_; uint64_t channel_layout_; int preview_divider_; - PixelFormat::Format preview_format_; + VideoParams::Format preview_format_; }; diff --git a/app/node/input/media/video/video.cpp b/app/node/input/media/video/video.cpp index c02aeaf39..5507bc12c 100644 --- a/app/node/input/media/video/video.cpp +++ b/app/node/input/media/video/video.cpp @@ -27,7 +27,6 @@ #include "codec/ffmpeg/ffmpegdecoder.h" #include "core.h" #include "project/item/footage/footage.h" -#include "render/pixelformat.h" OLIVE_NAMESPACE_ENTER @@ -38,7 +37,7 @@ Node *VideoInput::copy() const Stream::Type VideoInput::type() const { - return Stream::kVideo; + return Stream::kVideo; } QString VideoInput::Name() const diff --git a/app/project/item/footage/videostream.cpp b/app/project/item/footage/videostream.cpp index d96f319c7..9a0094e4f 100644 --- a/app/project/item/footage/videostream.cpp +++ b/app/project/item/footage/videostream.cpp @@ -104,7 +104,9 @@ void VideoStream::LoadCustomParameters(QXmlStreamReader *reader) } else if (reader->name() == QStringLiteral("type")) { set_video_type(static_cast(reader->readElementText().toInt())); } else if (reader->name() == QStringLiteral("format")) { - set_format(static_cast(reader->readElementText().toInt())); + set_format(static_cast(reader->readElementText().toInt())); + } else if (reader->name() == QStringLiteral("channels")) { + set_channel_count(reader->readElementText().toInt()); } else if (reader->name() == QStringLiteral("pixelaspect")) { set_pixel_aspect_ratio(rational::fromString(reader->readElementText())); } else if (reader->name() == QStringLiteral("framerate")) { @@ -126,6 +128,7 @@ void VideoStream::SaveCustomParameters(QXmlStreamWriter *writer) const writer->writeTextElement(QStringLiteral("interlacing"), QString::number(interlacing_)); writer->writeTextElement(QStringLiteral("type"), QString::number(video_type_)); writer->writeTextElement(QStringLiteral("format"), QString::number(format_)); + writer->writeTextElement(QStringLiteral("channels"), QString::number(channel_count_)); writer->writeTextElement(QStringLiteral("pixelaspect"), pixel_aspect_ratio_.toString()); writer->writeTextElement(QStringLiteral("framerate"), frame_rate_.toString()); writer->writeTextElement(QStringLiteral("starttime"), QString::number(start_time_)); diff --git a/app/project/item/footage/videostream.h b/app/project/item/footage/videostream.h index aa91707a2..59fb8956c 100644 --- a/app/project/item/footage/videostream.h +++ b/app/project/item/footage/videostream.h @@ -21,7 +21,6 @@ #ifndef VIDEOSTREAM_H #define VIDEOSTREAM_H -#include "render/pixelformat.h" #include "render/videoparams.h" #include "stream.h" @@ -74,16 +73,26 @@ public: height_ = height; } - const PixelFormat::Format& format() const + const VideoParams::Format& format() const { return format_; } - void set_format(const PixelFormat::Format& format) + void set_format(const VideoParams::Format& format) { format_ = format; } + int channel_count() const + { + return channel_count_; + } + + void set_channel_count(int c) + { + channel_count_ = c; + } + bool premultiplied_alpha() const; void set_premultiplied_alpha(bool e); @@ -153,7 +162,9 @@ private: VideoType video_type_; - PixelFormat::Format format_; + VideoParams::Format format_; + + int channel_count_; rational pixel_aspect_ratio_; diff --git a/app/project/item/sequence/sequence.cpp b/app/project/item/sequence/sequence.cpp index 91042e555..8b7c4d534 100644 --- a/app/project/item/sequence/sequence.cpp +++ b/app/project/item/sequence/sequence.cpp @@ -70,7 +70,7 @@ void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const int video_width = 0, video_height = 0, preview_div = 1; rational video_timebase, video_pixel_aspect; VideoParams::Interlacing video_interlacing = VideoParams::kInterlaceNone; - PixelFormat::Format preview_format = PixelFormat::PIX_FMT_INVALID; + VideoParams::Format preview_format = VideoParams::kFormatInvalid; while (XMLReadNextStartElement(reader)) { if (cancelled && *cancelled) { @@ -86,7 +86,7 @@ void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const } else if (reader->name() == QStringLiteral("divider")) { preview_div = reader->readElementText().toInt(); } else if (reader->name() == QStringLiteral("format")) { - preview_format = static_cast(reader->readElementText().toInt()); + preview_format = static_cast(reader->readElementText().toInt()); } else if (reader->name() == QStringLiteral("pixelaspect")) { video_pixel_aspect = rational::fromString(reader->readElementText()); } else if (reader->name() == QStringLiteral("interlacing")) { @@ -97,11 +97,12 @@ void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const } set_video_params(VideoParams(video_width, video_height, video_timebase, preview_format, - video_pixel_aspect, video_interlacing, preview_div)); + VideoParams::kInternalChannelCount, video_pixel_aspect, + video_interlacing, preview_div)); } else if (reader->name() == QStringLiteral("audio")) { int rate = 0; uint64_t layout = 0; - SampleFormat::Format format = SampleFormat::SAMPLE_FMT_INVALID; + AudioParams::Format format = AudioParams::kFormatInvalid; while (XMLReadNextStartElement(reader)) { if (reader->name() == QStringLiteral("rate")) { @@ -109,7 +110,7 @@ void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const } else if (reader->name() == QStringLiteral("layout")) { layout = reader->readElementText().toULongLong(); } else if (reader->name() == QStringLiteral("format")) { - format = static_cast(reader->readElementText().toInt()); + format = static_cast(reader->readElementText().toInt()); } else { reader->skipCurrentElement(); } @@ -268,13 +269,14 @@ void Sequence::set_default_parameters() set_video_params(VideoParams(width, height, Config::Current()["DefaultSequenceFrameRate"].value(), - static_cast(Config::Current()["DefaultSequencePreviewFormat"].toInt()), + static_cast(Config::Current()["OfflinePixelFormat"].toInt()), + VideoParams::kInternalChannelCount, Config::Current()["DefaultSequencePixelAspect"].value(), Config::Current()["DefaultSequenceInterlacing"].value(), VideoParams::generate_auto_divider(width, height))); set_audio_params(AudioParams(Config::Current()["DefaultSequenceAudioFrequency"].toInt(), Config::Current()["DefaultSequenceAudioLayout"].toULongLong(), - SampleFormat::kInternalFormat)); + AudioParams::kInternalFormat)); } void Sequence::set_parameters_from_footage(const QList footage) @@ -310,7 +312,8 @@ void Sequence::set_parameters_from_footage(const QList footage) set_video_params(VideoParams(vs->width(), vs->height(), using_timebase, - static_cast(Config::Current()["DefaultSequencePreviewFormat"].toInt()), + static_cast(Config::Current()["OfflinePixelFormat"].toInt()), + VideoParams::kInternalChannelCount, vs->pixel_aspect_ratio(), vs->interlacing(), VideoParams::generate_auto_divider(vs->width(), vs->height()))); @@ -320,7 +323,7 @@ void Sequence::set_parameters_from_footage(const QList footage) case Stream::kAudio: if (!found_audio_params) { AudioStream* as = static_cast(s.get()); - set_audio_params(AudioParams(as->sample_rate(), as->channel_layout(), SampleFormat::kInternalFormat)); + set_audio_params(AudioParams(as->sample_rate(), as->channel_layout(), AudioParams::kInternalFormat)); found_audio_params = true; } break; diff --git a/app/render/CMakeLists.txt b/app/render/CMakeLists.txt index abb4bda59..7f0bae3c7 100644 --- a/app/render/CMakeLists.txt +++ b/app/render/CMakeLists.txt @@ -37,8 +37,6 @@ set(OLIVE_SOURCES render/framehashcache.h render/managedcolor.cpp render/managedcolor.h - render/pixelformat.cpp - render/pixelformat.h render/playbackcache.cpp render/playbackcache.h render/previewautocacher.cpp diff --git a/app/render/audioparams.cpp b/app/render/audioparams.cpp index 9fb1ec2e1..5ea10389e 100644 --- a/app/render/audioparams.cpp +++ b/app/render/audioparams.cpp @@ -49,6 +49,8 @@ const QVector AudioParams::kSupportedChannelLayouts = { AV_CH_LAYOUT_7POINT1 }; +const AudioParams::Format AudioParams::kInternalFormat = AudioParams::kFormatFloat32; + qint64 AudioParams::time_to_bytes(const double &time) const { Q_ASSERT(is_valid()); @@ -68,6 +70,26 @@ bool AudioParams::operator!=(const AudioParams &other) const return !(*this == other); } +QAudioFormat::SampleType AudioParams::GetQtSampleType(AudioParams::Format format) +{ + switch (format) { + case kFormatUnsigned8: + return QAudioFormat::UnSignedInt; + case kFormatSigned16: + case kFormatSigned32: + case kFormatSigned64: + return QAudioFormat::SignedInt; + case kFormatFloat32: + case kFormatFloat64: + return QAudioFormat::Float; + case kFormatInvalid: + case kFormatCount: + break; + } + + return QAudioFormat::Unknown; +} + qint64 AudioParams::time_to_bytes(const rational &time) const { return time_to_bytes(time.toDouble()); @@ -119,18 +141,18 @@ int AudioParams::channel_count() const int AudioParams::bytes_per_sample_per_channel() const { switch (format_) { - case SampleFormat::SAMPLE_FMT_U8: + case kFormatUnsigned8: return 1; - case SampleFormat::SAMPLE_FMT_S16: + case kFormatSigned16: return 2; - case SampleFormat::SAMPLE_FMT_S32: - case SampleFormat::SAMPLE_FMT_FLT: + case kFormatSigned32: + case kFormatFloat32: return 4; - case SampleFormat::SAMPLE_FMT_DBL: - case SampleFormat::SAMPLE_FMT_S64: + case kFormatSigned64: + case kFormatFloat64: return 8; - case SampleFormat::SAMPLE_FMT_INVALID: - case SampleFormat::SAMPLE_FMT_COUNT: + case kFormatInvalid: + case kFormatCount: break; } @@ -146,8 +168,8 @@ bool AudioParams::is_valid() const { return (sample_rate() > 0 && channel_layout() > 0 - && format_ != SampleFormat::SAMPLE_FMT_INVALID - && format_ != SampleFormat::SAMPLE_FMT_COUNT); + && format_ > kFormatInvalid + && format_ < kFormatCount); } QString AudioParams::SampleRateToString(const int &sample_rate) diff --git a/app/render/audioparams.h b/app/render/audioparams.h index 521218e0e..db9c0aa86 100644 --- a/app/render/audioparams.h +++ b/app/render/audioparams.h @@ -21,23 +21,51 @@ #ifndef AUDIOPARAMS_H #define AUDIOPARAMS_H +#include #include -#include "audio/sampleformat.h" #include "common/rational.h" OLIVE_NAMESPACE_ENTER class AudioParams { public: + enum Format { + /// Invalid + kFormatInvalid = -1, + + /// 8-bit unsigned integer + kFormatUnsigned8, + + /// 16-bit signed integer + kFormatSigned16, + + /// 32-bit signed integer + kFormatSigned32, + + /// 64-bit signed integer + kFormatSigned64, + + /// 32-bit float + kFormatFloat32, + + /// 64-bit float + kFormatFloat64, + + /// Total format count + kFormatCount + }; + + static const Format kInternalFormat; + AudioParams() : sample_rate_(0), channel_layout_(0), - format_(SampleFormat::SAMPLE_FMT_INVALID) + format_(kFormatInvalid) { } - AudioParams(const int& sample_rate, const uint64_t& channel_layout, const SampleFormat::Format& format) : + AudioParams(const int& sample_rate, const uint64_t& channel_layout, const Format& format) : sample_rate_(sample_rate), channel_layout_(channel_layout), format_(format) @@ -59,7 +87,7 @@ public: return rational(1, sample_rate()); } - const SampleFormat::Format &format() const + const Format &format() const { return format_; } @@ -80,6 +108,8 @@ public: bool operator==(const AudioParams& other) const; bool operator!=(const AudioParams& other) const; + static QAudioFormat::SampleType GetQtSampleType(Format format); + static const QVector kSupportedChannelLayouts; static const QVector kSupportedSampleRates; @@ -98,7 +128,7 @@ private: uint64_t channel_layout_; - SampleFormat::Format format_; + Format format_; }; diff --git a/app/render/color.cpp b/app/render/color.cpp index 67151413e..55181d83f 100644 --- a/app/render/color.cpp +++ b/app/render/color.cpp @@ -20,7 +20,10 @@ #include "color.h" +#include + #include "common/clamp.h" +#include "common/oiioutils.h" OLIVE_NAMESPACE_ENTER @@ -65,9 +68,9 @@ Color Color::fromHsv(const double &h, const double &s, const double &v) return Color(Rs + m, Gs + m, Bs + m); } -Color::Color(const char *data, const PixelFormat::Format &format) +Color::Color(const char *data, const VideoParams::Format &format, int ch_layout) { - *this = fromData(data, format); + *this = fromData(data, format, ch_layout); } Color::Color(const QColor &c) @@ -194,24 +197,24 @@ double Color::lightness() const return l; } -void Color::toData(char *data, const PixelFormat::Format &format) const +void Color::toData(char *data, const VideoParams::Format &format, int ch_layout) const { - OIIO::convert_types(OIIO::TypeDesc::DOUBLE, - data_, - PixelFormat::GetOIIOTypeDesc(format), - data, - kRGBAChannels); + OIIO::convert_pixel_values(OIIO::TypeDesc::DOUBLE, + data_, + OIIOUtils::GetOIIOBaseTypeFromFormat(format), + data, + ch_layout); } -Color Color::fromData(const char *data, const PixelFormat::Format &format) +Color Color::fromData(const char *data, const VideoParams::Format &format, int ch_layout) { Color c; - OIIO::convert_types(PixelFormat::GetOIIOTypeDesc(format), - data, - OIIO::TypeDesc::DOUBLE, - c.data_, - kRGBAChannels); + OIIO::convert_pixel_values(OIIOUtils::GetOIIOBaseTypeFromFormat(format), + data, + OIIO::TypeDesc::DOUBLE, + c.data_, + ch_layout); return c; } @@ -236,7 +239,7 @@ double Color::GetRoughLuminance() const const Color &Color::operator+=(const Color &rhs) { - for (int i=0;i #include "common/define.h" -#include "render/pixelformat.h" +#include "render/videoparams.h" OLIVE_NAMESPACE_ENTER @@ -37,7 +37,7 @@ class Color public: Color() { - for (int i=0;iwidth() * f->height() * kRGBAChannels; - - switch (static_cast(f->format())) { - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - qWarning() << "Alpha association functions received an invalid pixel format"; - break; - case PixelFormat::PIX_FMT_RGBA8: - case PixelFormat::PIX_FMT_RGBA16U: - qWarning() << "Alpha association functions only works on float-based pixel formats at this time"; - break; - case PixelFormat::PIX_FMT_RGBA16F: - { - AssociateAlphaInternal(action, reinterpret_cast(f->data()), pixel_count); - break; - } - case PixelFormat::PIX_FMT_RGBA32F: - { - AssociateAlphaInternal(action, reinterpret_cast(f->data()), pixel_count); - break; - } - } -} - -template -void ColorManager::AssociateAlphaInternal(ColorManager::AlphaAction action, T *data, int pix_count) -{ - for (int i=0;i 0) { - for (int j=0;j - static void AssociateAlphaInternal(AlphaAction action, T* data, int pix_count); - QString config_filename_; QString default_input_color_space_; diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index 6ea08ff41..cc249c977 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -21,6 +21,7 @@ #include "colorprocessor.h" #include "common/define.h" +#include "common/ocioutils.h" #include "colormanager.h" OLIVE_NAMESPACE_ENTER @@ -77,7 +78,7 @@ ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const void ColorProcessor::ConvertFrame(Frame *f) { - OCIO::BitDepth ocio_bit_depth = PixelFormat::GetOCIOBitDepthFromPixelFormat(f->format()); + OCIO::BitDepth ocio_bit_depth = OCIOUtils::GetOCIOBitDepthFromPixelFormat(f->format()); if (ocio_bit_depth == OCIO::BIT_DEPTH_UNKNOWN) { qCritical() << "Tried to color convert frame with no format"; @@ -87,7 +88,7 @@ void ColorProcessor::ConvertFrame(Frame *f) OCIO::PackedImageDesc img(f->data(), f->width(), f->height(), - kRGBAChannels, + VideoParams::kRGBAChannelCount, ocio_bit_depth, OCIO::AutoStride, OCIO::AutoStride, diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index d555d2a38..d88e407f2 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -243,24 +243,27 @@ FramePtr FrameHashCache::LoadCacheFrame(const QString &fn) int height = dw.max.y - dw.min.y + 1; bool has_alpha = file.header().channels().findChannel("A"); - PixelFormat::Format image_format; + VideoParams::Format image_format; if (pix_type == Imf::HALF) { - image_format = PixelFormat::PIX_FMT_RGBA16F; + image_format = VideoParams::kFormatFloat16; } else { - image_format = PixelFormat::PIX_FMT_RGBA32F; + image_format = VideoParams::kFormatFloat32; } + int channel_count = has_alpha ? VideoParams::kRGBAChannelCount : VideoParams::kRGBChannelCount; + frame = Frame::Create(); frame->set_video_params(VideoParams(width, height, image_format, + channel_count, rational::fromDouble(file.header().pixelAspectRatio()))); frame->allocate(); - int bpc = PixelFormat::BytesPerChannel(image_format); + int bpc = VideoParams::GetBytesPerChannel(image_format); - size_t xs = kRGBAChannels * bpc; + size_t xs = channel_count * bpc; size_t ys = frame->linesize_bytes(); Imf::FrameBuffer framebuffer; @@ -398,12 +401,15 @@ QString FrameHashCache::CachePathName(const QString &cache_path, const QByteArra bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const VideoParams &vparam, int linesize_bytes) const { - Q_ASSERT(PixelFormat::FormatIsFloat(vparam.format())); + if (!VideoParams::FormatIsFloat(vparam.format())) { + qCritical() << "Tried to cache frame with non-float pixel format"; + return false; + } // Floating point types are stored in EXR Imf::PixelType pix_type; - if (vparam.format() == PixelFormat::PIX_FMT_RGBA16F) { + if (vparam.format() == VideoParams::kFormatFloat16) { pix_type = Imf::HALF; } else { pix_type = Imf::FLOAT; @@ -414,7 +420,9 @@ bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const V header.channels().insert("R", Imf::Channel(pix_type)); header.channels().insert("G", Imf::Channel(pix_type)); header.channels().insert("B", Imf::Channel(pix_type)); - header.channels().insert("A", Imf::Channel(pix_type)); + if (vparam.channel_count() == VideoParams::kRGBAChannelCount) { + header.channels().insert("A", Imf::Channel(pix_type)); + } header.compression() = Imf::DWAA_COMPRESSION; header.insert("dwaCompressionLevel", Imf::FloatAttribute(200.0f)); @@ -422,16 +430,18 @@ bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const V Imf::OutputFile out(filename.toUtf8(), header, 0); - int bpc = PixelFormat::BytesPerChannel(vparam.format()); + int bpc = VideoParams::GetBytesPerChannel(vparam.format()); - size_t xs = kRGBAChannels * bpc; + size_t xs = vparam.channel_count() * bpc; size_t ys = linesize_bytes; Imf::FrameBuffer framebuffer; framebuffer.insert("R", Imf::Slice(pix_type, data, xs, ys)); framebuffer.insert("G", Imf::Slice(pix_type, data + bpc, xs, ys)); framebuffer.insert("B", Imf::Slice(pix_type, data + 2*bpc, xs, ys)); - framebuffer.insert("A", Imf::Slice(pix_type, data + 3*bpc, xs, ys)); + if (vparam.channel_count() == VideoParams::kRGBAChannelCount) { + framebuffer.insert("A", Imf::Slice(pix_type, data + 3*bpc, xs, ys)); + } out.setFrameBuffer(framebuffer); out.writePixels(vparam.effective_height()); diff --git a/app/render/framehashcache.h b/app/render/framehashcache.h index 1d8360043..17009dabf 100644 --- a/app/render/framehashcache.h +++ b/app/render/framehashcache.h @@ -25,7 +25,7 @@ #include "common/rational.h" #include "common/timerange.h" -#include "render/pixelformat.h" +#include "codec/frame.h" #include "render/playbackcache.h" #include "render/videoparams.h" diff --git a/app/render/managedcolor.cpp b/app/render/managedcolor.cpp index f4d86e197..042478cf2 100644 --- a/app/render/managedcolor.cpp +++ b/app/render/managedcolor.cpp @@ -26,13 +26,13 @@ ManagedColor::ManagedColor() { } -ManagedColor::ManagedColor(const float &r, const float &g, const float &b, const float &a) : +ManagedColor::ManagedColor(const double &r, const double &g, const double &b, const double &a) : Color(r, g, b, a) { } -ManagedColor::ManagedColor(const char *data, const PixelFormat::Format &format) : - Color(data, format) +ManagedColor::ManagedColor(const char *data, const VideoParams::Format &format, int channel_layout) : + Color(data, format, channel_layout) { } diff --git a/app/render/managedcolor.h b/app/render/managedcolor.h index c214f57b4..707218903 100644 --- a/app/render/managedcolor.h +++ b/app/render/managedcolor.h @@ -30,8 +30,8 @@ class ManagedColor : public Color { public: ManagedColor(); - ManagedColor(const float& r, const float& g, const float& b, const float& a = 1.0f); - ManagedColor(const char *data, const PixelFormat::Format &format); + ManagedColor(const double& r, const double& g, const double& b, const double& a = 1.0); + ManagedColor(const char *data, const VideoParams::Format &format, int channel_layout); ManagedColor(const Color& c); const QString& color_input() const; diff --git a/app/render/opengl/openglrenderer.cpp b/app/render/opengl/openglrenderer.cpp index e6e304099..8020affe9 100644 --- a/app/render/opengl/openglrenderer.cpp +++ b/app/render/opengl/openglrenderer.cpp @@ -21,7 +21,7 @@ #include "openglrenderer.h" #include -#include +#include OLIVE_NAMESPACE_ENTER @@ -128,7 +128,7 @@ void OpenGLRenderer::ClearDestination(double r, double g, double b, double a) functions_->glClear(GL_COLOR_BUFFER_BIT); } -QVariant OpenGLRenderer::CreateNativeTexture2D(int width, int height, PixelFormat::Format format, Texture::ChannelFormat channel_format, const void *data, int linesize) +QVariant OpenGLRenderer::CreateNativeTexture2D(int width, int height, VideoParams::Format format, int channel_count, const void *data, int linesize) { GLuint texture; functions_->glGenTextures(1, &texture); @@ -140,8 +140,8 @@ QVariant OpenGLRenderer::CreateNativeTexture2D(int width, int height, PixelForma functions_->glBindTexture(GL_TEXTURE_2D, texture); - functions_->glTexImage2D(GL_TEXTURE_2D, 0, GetInternalFormat(format, channel_format), - width, height, 0, GetPixelFormat(channel_format), + functions_->glTexImage2D(GL_TEXTURE_2D, 0, GetInternalFormat(format, channel_count), + width, height, 0, GetPixelFormat(channel_count), GetPixelType(format), data); functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); @@ -151,7 +151,7 @@ QVariant OpenGLRenderer::CreateNativeTexture2D(int width, int height, PixelForma return texture; } -QVariant OpenGLRenderer::CreateNativeTexture3D(int width, int height, int depth, PixelFormat::Format format, Texture::ChannelFormat channel_format, const void *data, int linesize) +QVariant OpenGLRenderer::CreateNativeTexture3D(int width, int height, int depth, VideoParams::Format format, int channel_count, const void *data, int linesize) { GLuint texture; functions_->glGenTextures(1, &texture); @@ -163,8 +163,8 @@ QVariant OpenGLRenderer::CreateNativeTexture3D(int width, int height, int depth, functions_->glBindTexture(GL_TEXTURE_3D, texture); - context_->extraFunctions()->glTexImage3D(GL_TEXTURE_3D, 0, GetInternalFormat(format, channel_format), - width, height, depth, 0, GetPixelFormat(channel_format), + context_->extraFunctions()->glTexImage3D(GL_TEXTURE_3D, 0, GetInternalFormat(format, channel_count), + width, height, depth, 0, GetPixelFormat(channel_count), GetPixelType(format), data); functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); @@ -241,7 +241,7 @@ void OpenGLRenderer::UploadToTexture(Texture *texture, const void *data, int lin functions_->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, p.effective_width(), p.effective_height(), - GL_RGBA, GetPixelType(p.format()), + GetPixelFormat(p.channel_count()), GetPixelType(p.format()), data); functions_->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); @@ -264,7 +264,7 @@ void OpenGLRenderer::DownloadFromTexture(Texture* texture, void *data, int lines 0, p.width(), p.height(), - GL_RGBA, + GetPixelFormat(p.channel_count()), GetPixelType(p.format()), data); @@ -360,7 +360,7 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video GLuint tex_id = texture ? texture->id().value() : 0; textures_to_bind.append({texture, job.GetInterpolation(it.key())}); - if (texture && texture->has_meaningful_alpha()) { + if (texture && texture->channel_count() == VideoParams::kRGBAChannelCount) { input_textures_have_alpha = true; } @@ -440,6 +440,13 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video destination_params.effective_width(), destination_params.effective_height()); + // Set whether our destination texture needs an alpha channel + if (input_textures_have_alpha || job.GetAlphaChannelRequired()) { + destination_params.set_channel_count(VideoParams::kRGBAChannelCount); + } else { + destination_params.set_channel_count(VideoParams::kRGBChannelCount); + } + // Bind vertex array object QOpenGLVertexArrayObject vao_; vao_.create(); @@ -533,9 +540,6 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video if (destination) { // Reset framebuffer to default if we were drawing to a texture DetachTextureAsDestination(); - - // Set metadata for whether this texture has a meaningful alpha channel - destination->set_has_meaningful_alpha((input_textures_have_alpha || job.GetAlphaChannelRequired())); } // Release any textures we bound before @@ -555,58 +559,97 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video vao_.destroy(); } -GLint OpenGLRenderer::GetInternalFormat(PixelFormat::Format format, bool with_alpha) +GLint OpenGLRenderer::GetInternalFormat(VideoParams::Format format, int channel_layout) { switch (format) { - case PixelFormat::PIX_FMT_RGBA8: - return with_alpha ? GL_RGBA8 : GL_RGB8; - case PixelFormat::PIX_FMT_RGBA16U: - return with_alpha ? GL_RGBA16 : GL_RGB16; - case PixelFormat::PIX_FMT_RGBA16F: - return with_alpha ? GL_RGBA16F : GL_RGB16F; - case PixelFormat::PIX_FMT_RGBA32F: - return with_alpha ? GL_RGBA32F : GL_RGB32F; - - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: + case VideoParams::kFormatUnsigned8: + switch (channel_layout) { + case 1: + return GL_R8; + case 2: + return GL_RG8; + case 3: + return GL_RGB8; + case 4: + return GL_RGBA8; + } + break; + case VideoParams::kFormatUnsigned16: + switch (channel_layout) { + case 1: + return GL_R16; + case 2: + return GL_RG16; + case 3: + return GL_RGB16; + case 4: + return GL_RGBA16; + } + break; + case VideoParams::kFormatFloat16: + switch (channel_layout) { + case 1: + return GL_R16F; + case 2: + return GL_RG16F; + case 3: + return GL_RGB16F; + case 4: + return GL_RGBA16F; + } + break; + case VideoParams::kFormatFloat32: + switch (channel_layout) { + case 1: + return GL_R32F; + case 2: + return GL_RG32F; + case 3: + return GL_RGB32F; + case 4: + return GL_RGBA32F; + } + break; + case VideoParams::kFormatInvalid: + case VideoParams::kFormatCount: break; } return GL_INVALID_VALUE; } -GLenum OpenGLRenderer::GetPixelType(PixelFormat::Format format) +GLenum OpenGLRenderer::GetPixelType(VideoParams::Format format) { switch (format) { - case PixelFormat::PIX_FMT_RGBA8: + case VideoParams::kFormatUnsigned8: return GL_UNSIGNED_BYTE; - case PixelFormat::PIX_FMT_RGBA16U: + case VideoParams::kFormatUnsigned16: return GL_UNSIGNED_SHORT; - case PixelFormat::PIX_FMT_RGBA16F: + case VideoParams::kFormatFloat16: return GL_HALF_FLOAT; - case PixelFormat::PIX_FMT_RGBA32F: + case VideoParams::kFormatFloat32: return GL_FLOAT; - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: + case VideoParams::kFormatInvalid: + case VideoParams::kFormatCount: break; } return GL_INVALID_VALUE; } -GLenum OpenGLRenderer::GetPixelFormat(Texture::ChannelFormat format) +GLenum OpenGLRenderer::GetPixelFormat(int channel_count) { - switch (format) { - case Texture::kRGBA: - return GL_RGBA; - case Texture::kRGB: - return GL_RGB; - case Texture::kRedOnly: + switch (channel_count) { + case 1: return GL_RED; + case 3: + return GL_RGB; + case 4: + return GL_RGBA; + default: + return GL_INVALID_VALUE; } - - return GL_INVALID_ENUM; } void OpenGLRenderer::PrepareInputTexture(GLenum target, Texture::Interpolation interp) diff --git a/app/render/opengl/openglrenderer.h b/app/render/opengl/openglrenderer.h index ce1f5d795..d212a111a 100644 --- a/app/render/opengl/openglrenderer.h +++ b/app/render/opengl/openglrenderer.h @@ -51,8 +51,8 @@ public slots: virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; - virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) override; - virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; virtual void DestroyNativeTexture(QVariant texture) override; @@ -71,11 +71,11 @@ protected slots: OLIVE_NAMESPACE::VideoParams destination_params) override; private: - static GLint GetInternalFormat(PixelFormat::Format format, bool with_alpha); + static GLint GetInternalFormat(VideoParams::Format format, int channel_layout); - static GLenum GetPixelType(PixelFormat::Format format); + static GLenum GetPixelType(VideoParams::Format format); - static GLenum GetPixelFormat(Texture::ChannelFormat format); + static GLenum GetPixelFormat(int channel_count); void AttachTextureAsDestination(OLIVE_NAMESPACE::Texture* texture); diff --git a/app/render/pixelformat.cpp b/app/render/pixelformat.cpp deleted file mode 100644 index 92c0ebd46..000000000 --- a/app/render/pixelformat.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "pixelformat.h" - -#include "OpenImageIO/imagebuf.h" -#include -#include -#include - -#include "codec/oiio/oiiocommon.h" -#include "common/define.h" -#include "core.h" - -OLIVE_NAMESPACE_ENTER - -bool PixelFormat::FormatIsFloat(const PixelFormat::Format &format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGBA16F: - case PixelFormat::PIX_FMT_RGBA32F: - return true; - - case PixelFormat::PIX_FMT_RGBA8: - case PixelFormat::PIX_FMT_RGBA16U: - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return false; -} - -OIIO::TypeDesc::BASETYPE PixelFormat::GetOIIOTypeDesc(const PixelFormat::Format &format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGBA8: - return OIIO::TypeDesc::UINT8; - case PixelFormat::PIX_FMT_RGBA16U: - return OIIO::TypeDesc::UINT16; - case PixelFormat::PIX_FMT_RGBA16F: - return OIIO::TypeDesc::HALF; - case PixelFormat::PIX_FMT_RGBA32F: - return OIIO::TypeDesc::FLOAT; - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return OIIO::TypeDesc::UNKNOWN; -} - -QString PixelFormat::GetName(const PixelFormat::Format &format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGBA8: - return tr("8-bit"); - case PixelFormat::PIX_FMT_RGBA16U: - return tr("16-bit Integer"); - case PixelFormat::PIX_FMT_RGBA16F: - return tr("Half-Float (16-bit)"); - case PixelFormat::PIX_FMT_RGBA32F: - return tr("Full-Float (32-bit)"); - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return tr("Unknown (%1)").arg(format); -} - -OCIO::BitDepth PixelFormat::GetOCIOBitDepthFromPixelFormat(PixelFormat::Format format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGBA8: - return OCIO::BIT_DEPTH_UINT8; - case PixelFormat::PIX_FMT_RGBA16U: - return OCIO::BIT_DEPTH_UINT16; - break; - case PixelFormat::PIX_FMT_RGBA16F: - return OCIO::BIT_DEPTH_F16; - break; - case PixelFormat::PIX_FMT_RGBA32F: - return OCIO::BIT_DEPTH_F32; - break; - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - return OCIO::BIT_DEPTH_UNKNOWN; -} - -PixelFormat* PixelFormat::instance_ = nullptr; - -void PixelFormat::CreateInstance() -{ - instance_ = new PixelFormat(); -} - -void PixelFormat::DestroyInstance() -{ - delete instance_; -} - -PixelFormat *PixelFormat::instance() -{ - return instance_; -} - -PixelFormat::Format PixelFormat::GetConfiguredFormatForMode(RenderMode::Mode mode) -{ - return static_cast( - Core::GetPreferenceForRenderMode(mode, QStringLiteral("PixelFormat")).toInt()); -} - -void PixelFormat::SetConfiguredFormatForMode(RenderMode::Mode mode, PixelFormat::Format format) -{ - if (format != GetConfiguredFormatForMode(mode)) { - Core::SetPreferenceForRenderMode(mode, QStringLiteral("PixelFormat"), format); - - emit FormatChanged(); - } -} - -PixelFormat::Format PixelFormat::OIIOFormatToOliveFormat(OIIO::TypeDesc desc) -{ - if (desc == OIIO::TypeDesc::UINT8) { - return PixelFormat::PIX_FMT_RGBA8; - } else if (desc == OIIO::TypeDesc::UINT16) { - return PixelFormat::PIX_FMT_RGBA16U; - } else if (desc == OIIO::TypeDesc::HALF) { - return PixelFormat::PIX_FMT_RGBA16F; - } else if (desc == OIIO::TypeDesc::FLOAT) { - return PixelFormat::PIX_FMT_RGBA32F; - } - - return PixelFormat::PIX_FMT_INVALID; -} - -int PixelFormat::GetBufferSize(const PixelFormat::Format &format, const int &width, const int &height) -{ - return BytesPerPixel(format) * width * height; -} - -int PixelFormat::BytesPerPixel(const PixelFormat::Format &format) -{ - return BytesPerChannel(format) * kRGBAChannels; -} - -int PixelFormat::BytesPerChannel(const PixelFormat::Format &format) -{ - switch (format) { - case PixelFormat::PIX_FMT_RGBA8: - return 1; - case PixelFormat::PIX_FMT_RGBA16U: - case PixelFormat::PIX_FMT_RGBA16F: - return 2; - case PixelFormat::PIX_FMT_RGBA32F: - return 4; - case PixelFormat::PIX_FMT_INVALID: - case PixelFormat::PIX_FMT_COUNT: - break; - } - - qFatal("Invalid pixel format requested"); - - // qFatal will abort so we won't get here, but this suppresses compiler warnings - return 0; -} - -FramePtr PixelFormat::ConvertPixelFormat(FramePtr frame, const PixelFormat::Format &dest_format) -{ - if (frame->format() == dest_format) { - return frame; - } - - // Create a destination frame with the same parameters - FramePtr converted = Frame::Create(); - converted->set_video_params(VideoParams(frame->video_params().width(), - frame->video_params().height(), - dest_format)); - converted->set_timestamp(frame->timestamp()); - converted->allocate(); - - // Do the conversion through OIIO - create a buffer for the source image - OIIO::ImageBuf src(OIIO::ImageSpec(frame->width(), - frame->height(), - kRGBAChannels, - GetOIIOTypeDesc(frame->format()))); - - // Set the pixels (this is necessary as opposed to an OIIO buffer wrapper since Frame has - // linesizes) - OIIOCommon::FrameToBuffer(frame, &src); - - // Create a destination OIIO buffer with our destination format - OIIO::ImageBuf dst(OIIO::ImageSpec(converted->width(), - converted->height(), - kRGBAChannels, - GetOIIOTypeDesc(converted->format()))); - - if (dst.copy_pixels(src)) { - - // Convert our buffer back to a frame - OIIOCommon::BufferToFrame(&dst, converted); - - return converted; - } else { - return nullptr; - } -} - -OLIVE_NAMESPACE_EXIT diff --git a/app/render/pixelformat.h b/app/render/pixelformat.h deleted file mode 100644 index c60027c93..000000000 --- a/app/render/pixelformat.h +++ /dev/null @@ -1,134 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef BITDEPTHS_H -#define BITDEPTHS_H - -#include -#include -#include -#include - -#include "common/ocioutils.h" -#include "render/rendermodes.h" - -OLIVE_NAMESPACE_ENTER - -class Frame; -using FramePtr = std::shared_ptr; - -class PixelFormat : public QObject -{ - Q_OBJECT -public: - /** - * @brief Olive's internal supported pixel formats. - */ - enum Format { - PIX_FMT_INVALID = -1, - - PIX_FMT_RGBA8, - PIX_FMT_RGBA16U, - PIX_FMT_RGBA16F, - PIX_FMT_RGBA32F, - - PIX_FMT_COUNT - }; - - static void CreateInstance(); - static void DestroyInstance(); - static PixelFormat* instance(); - - /** - * @brief Returns the configured pixel format for a given mode - */ - Format GetConfiguredFormatForMode(RenderMode::Mode mode); - void SetConfiguredFormatForMode(RenderMode::Mode mode, PixelFormat::Format format); - - static Format OIIOFormatToOliveFormat(OIIO::TypeDesc desc); - - /** - * @brief Returns the minimum buffer size (in bytes) necessary for a given format, width, and height. - * - * @param format - * - * The format of the data the buffer should contain. Must be a member of the olive::PixelFormat enum. - * - * @param width - * - * The width (in pixels) of the buffer. - * - * @param height - * - * The height (in pixels) of the buffer. - */ - static int GetBufferSize(const Format &format, const int& width, const int& height); - - /** - * @brief Returns the number of bytes per pixel for a certain format - * - * Different formats use different sizes of data for pixels. Use this function to determine how many bytes a pixel - * requires for a certain format. The number of bytes will always be a multiple of 4 since all formats use RGBA and - * are at least 1 bpc. - */ - static int BytesPerPixel(const Format &format); - - /** - * @brief Returns the number of bytes per channel for a certain format - */ - static int BytesPerChannel(const Format& format); - - /** - * @brief Convert a frame to a pixel format - * - * If the frame's pixel format == the destination format, this just returns `frame`. - */ - static FramePtr ConvertPixelFormat(FramePtr frame, const Format &dest_format); - - /** - * @brief Simple convenience function returning whether a pixel format is float-based or integer-based - */ - static bool FormatIsFloat(const Format& format); - - /** - * @brief Get corresponding OpenImageIO TypeDesc for a given pixel format - */ - static OIIO::TypeDesc::BASETYPE GetOIIOTypeDesc(const Format& format); - - /** - * @brief Get format name - */ - static QString GetName(const Format& format); - - static OCIO::BitDepth GetOCIOBitDepthFromPixelFormat(PixelFormat::Format format); - -signals: - void FormatChanged(); - -private: - PixelFormat() = default; - - static PixelFormat* instance_; - -}; - -OLIVE_NAMESPACE_EXIT - -#endif // BITDEPTHS_H diff --git a/app/render/renderer.cpp b/app/render/renderer.cpp index 83107935b..e3aad5fd4 100644 --- a/app/render/renderer.cpp +++ b/app/render/renderer.cpp @@ -32,16 +32,16 @@ Renderer::Renderer(QObject *parent) : } -TexturePtr Renderer::CreateTexture(const VideoParams ¶ms, Texture::Type type, Texture::ChannelFormat channel_format, const void *data, int linesize) +TexturePtr Renderer::CreateTexture(const VideoParams ¶ms, Texture::Type type, const void *data, int linesize) { QVariant v; if (type == Texture::k3D) { v = CreateNativeTexture3D(params.effective_width(), params.effective_height(), - params.effective_depth(), params.format(), channel_format, data, linesize); + params.effective_depth(), params.format(), params.channel_count(), data, linesize); } else { v = CreateNativeTexture2D(params.effective_width(), params.effective_height(), params.format(), - channel_format, data, linesize); + params.channel_count(), data, linesize); } if (v.isNull()) { @@ -53,7 +53,7 @@ TexturePtr Renderer::CreateTexture(const VideoParams ¶ms, Texture::Type type TexturePtr Renderer::CreateTexture(const VideoParams ¶ms, const void *data, int linesize) { - return CreateTexture(params, Texture::k2D, Texture::kRGBA, data, linesize); + return CreateTexture(params, Texture::k2D, data, linesize); } void Renderer::BlitColorManaged(ColorProcessorPtr color_processor, TexturePtr source, bool source_is_premultiplied, Texture *destination, const QMatrix4x4 &matrix) @@ -104,6 +104,7 @@ bool Renderer::GetColorContext(ColorProcessorPtr color_processor, Renderer::Colo "uniform int ove_maintex_alpha;\n" "\n" "// Macros defining `ove_maintex_alpha` state\n" + "// Matches `AlphaAssociated` C++ enum\n" "#define ALPHA_NONE 0\n" "#define ALPHA_UNASSOC 1\n" "#define ALPHA_ASSOC 2\n" @@ -185,8 +186,8 @@ bool Renderer::GetColorContext(ColorProcessorPtr color_processor, Renderer::Colo } // Allocate 3D LUT - color_ctx.lut3d_textures[i].texture = CreateTexture(VideoParams(edge_len, edge_len, edge_len, PixelFormat::PIX_FMT_RGBA32F), - Texture::k3D, Texture::kRGB, values); + color_ctx.lut3d_textures[i].texture = CreateTexture(VideoParams(edge_len, edge_len, edge_len, VideoParams::kFormatFloat32, VideoParams::kRGBChannelCount), + Texture::k3D, values); color_ctx.lut3d_textures[i].name = sampler_name; color_ctx.lut3d_textures[i].interpolation = (interpolation == OCIO::INTERP_NEAREST) ? Texture::kNearest : Texture::kLinear; } @@ -216,9 +217,8 @@ bool Renderer::GetColorContext(ColorProcessorPtr color_processor, Renderer::Colo } // Allocate 1D LUT - color_ctx.lut1d_textures[i].texture = CreateTexture(VideoParams(width, height, PixelFormat::PIX_FMT_RGBA32F), + color_ctx.lut1d_textures[i].texture = CreateTexture(VideoParams(width, height, VideoParams::kFormatFloat32, (channel == OCIO::GpuShaderDesc::TEXTURE_RED_CHANNEL) ? 1 : VideoParams::kRGBChannelCount), Texture::k2D, - (channel == OCIO::GpuShaderDesc::TEXTURE_RED_CHANNEL) ? Texture::kRedOnly : Texture::kRGB, values); color_ctx.lut1d_textures[i].name = sampler_name; color_ctx.lut1d_textures[i].interpolation = (interpolation == OCIO::INTERP_NEAREST) ? Texture::kNearest : Texture::kLinear; @@ -244,6 +244,21 @@ void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, Textu job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(source), NodeParam::kTexture)); job.InsertValue(QStringLiteral("ove_mvpmat"), ShaderValue(matrix, NodeParam::kMatrix)); + AlphaAssociated associated; + if (source->channel_count() == VideoParams::kRGBAChannelCount) { + if (source_is_premultiplied) { + // De-assoc/re-assoc required for color management + associated = kAlphaAssociated; + } else { + // Just assoc at the end + associated = kAlphaUnassociated; + } + } else { + // No assoc/deassoc required + associated = kAlphaNone; + } + job.InsertValue(QStringLiteral("ove_maintex_alpha"), ShaderValue(associated, NodeParam::kInt)); + foreach (const ColorContext::LUT& l, color_ctx.lut3d_textures) { job.InsertValue(l.name, ShaderValue(QVariant::fromValue(l.texture), NodeParam::kTexture)); job.SetInterpolation(l.name, l.interpolation); diff --git a/app/render/renderer.h b/app/render/renderer.h index fdea3da57..99bcf6374 100644 --- a/app/render/renderer.h +++ b/app/render/renderer.h @@ -43,7 +43,7 @@ public: virtual bool Init() = 0; - TexturePtr CreateTexture(const VideoParams& params, Texture::Type type, Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0); + TexturePtr CreateTexture(const VideoParams& params, Texture::Type type, const void* data = nullptr, int linesize = 0); TexturePtr CreateTexture(const VideoParams& params, const void *data = nullptr, int linesize = 0); void BlitToTexture(QVariant shader, @@ -72,8 +72,8 @@ public slots: virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) = 0; - virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) = 0; - virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) = 0; + virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) = 0; + virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) = 0; virtual void DestroyNativeTexture(QVariant texture) = 0; @@ -105,6 +105,12 @@ private: }; + enum AlphaAssociated { + kAlphaNone, + kAlphaUnassociated, + kAlphaAssociated + }; + bool GetColorContext(ColorProcessorPtr color_processor, ColorContext* ctx); void BlitColorManagedInternal(ColorProcessorPtr color_processor, TexturePtr source, diff --git a/app/render/rendererthreadwrapper.cpp b/app/render/rendererthreadwrapper.cpp index 2024fd377..483304575 100644 --- a/app/render/rendererthreadwrapper.cpp +++ b/app/render/rendererthreadwrapper.cpp @@ -76,7 +76,7 @@ void RendererThreadWrapper::ClearDestination(double r, double g, double b, doubl Q_ARG(double, a)); } -QVariant RendererThreadWrapper::CreateNativeTexture2D(int width, int height, PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void *data, int linesize) +QVariant RendererThreadWrapper::CreateNativeTexture2D(int width, int height, VideoParams::Format format, int channel_count, const void *data, int linesize) { QVariant v; @@ -84,15 +84,15 @@ QVariant RendererThreadWrapper::CreateNativeTexture2D(int width, int height, Pix Q_RETURN_ARG(QVariant, v), Q_ARG(int, width), Q_ARG(int, height), - OLIVE_NS_ARG(PixelFormat::Format, format), - OLIVE_NS_ARG(Texture::ChannelFormat, channel_format), + OLIVE_NS_ARG(VideoParams::Format, format), + Q_ARG(int, channel_count), Q_ARG(const void*, data), Q_ARG(int, linesize)); return v; } -QVariant RendererThreadWrapper::CreateNativeTexture3D(int width, int height, int depth, PixelFormat::Format format, Texture::ChannelFormat channel_format, const void *data, int linesize) +QVariant RendererThreadWrapper::CreateNativeTexture3D(int width, int height, int depth, VideoParams::Format format, int channel_count, const void *data, int linesize) { QVariant v; @@ -101,8 +101,8 @@ QVariant RendererThreadWrapper::CreateNativeTexture3D(int width, int height, int Q_ARG(int, width), Q_ARG(int, height), Q_ARG(int, depth), - OLIVE_NS_ARG(PixelFormat::Format, format), - OLIVE_NS_ARG(Texture::ChannelFormat, channel_format), + OLIVE_NS_ARG(VideoParams::Format, format), + Q_ARG(int, channel_count), Q_ARG(const void*, data), Q_ARG(int, linesize)); diff --git a/app/render/rendererthreadwrapper.h b/app/render/rendererthreadwrapper.h index a3b9e5cda..1c682161a 100644 --- a/app/render/rendererthreadwrapper.h +++ b/app/render/rendererthreadwrapper.h @@ -47,8 +47,8 @@ public slots: virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; - virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) override; - virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::PixelFormat::Format format, OLIVE_NAMESPACE::Texture::ChannelFormat channel_format, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; virtual void DestroyNativeTexture(QVariant texture) override; diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 2f6401a06..ba84737b0 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -86,11 +86,11 @@ QByteArray RenderManager::Hash(const Node *n, const VideoParams ¶ms, const r // Embed video parameters into this hash int width = params.effective_width(); int height = params.effective_height(); - PixelFormat::Format format = params.format(); + VideoParams::Format format = params.format(); hasher.addData(reinterpret_cast(&width), sizeof(int)); hasher.addData(reinterpret_cast(&height), sizeof(int)); - hasher.addData(reinterpret_cast(&format), sizeof(PixelFormat::Format)); + hasher.addData(reinterpret_cast(&format), sizeof(VideoParams::Format)); if (n) { n->Hash(hasher, time); @@ -111,7 +111,7 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* c viewer->audio_params(), QSize(0, 0), QMatrix4x4(), - PixelFormat::PIX_FMT_INVALID, + VideoParams::kFormatInvalid, nullptr, cache, prioritize); @@ -121,7 +121,7 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput* viewer, ColorManager* c const rational& time, RenderMode::Mode mode, const VideoParams &video_params, const AudioParams &audio_params, const QSize& force_size, - const QMatrix4x4& force_matrix, PixelFormat::Format force_format, + const QMatrix4x4& force_matrix, VideoParams::Format force_format, ColorProcessorPtr force_color_output, FrameHashCache* cache, bool prioritize) { diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 702356023..06b23c59d 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -87,7 +87,7 @@ public: const rational& time, RenderMode::Mode mode, const VideoParams& video_params, const AudioParams& audio_params, const QSize& force_size, - const QMatrix4x4& force_matrix, PixelFormat::Format force_format, + const QMatrix4x4& force_matrix, VideoParams::Format force_format, ColorProcessorPtr force_color_output, FrameHashCache* cache = nullptr, bool prioritize = false); diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index a9bdca01a..d3c0480e8 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -67,11 +67,15 @@ void RenderProcessor::Run() frame_params.set_height(frame_size.height()); } - PixelFormat::Format frame_format = static_cast(ticket_->property("format").toInt()); - if (frame_format != PixelFormat::PIX_FMT_INVALID) { + VideoParams::Format frame_format = static_cast(ticket_->property("format").toInt()); + if (frame_format != VideoParams::kFormatInvalid) { frame_params.set_format(frame_format); } + if (texture) { + frame_params.set_channel_count(texture->channel_count()); + } + FramePtr frame = Frame::Create(); frame->set_timestamp(time); frame->set_video_params(frame_params); @@ -448,9 +452,14 @@ QVariant RenderProcessor::ProcessFrameGeneration(const Node *node, const Generat { FramePtr frame = Frame::Create(); - const VideoParams& video_params = ticket_->property("vparam").value(); + VideoParams frame_params = ticket_->property("vparam").value(); + if (job.GetAlphaChannelRequired()) { + frame_params.set_channel_count(VideoParams::kRGBAChannelCount); + } else { + frame_params.set_channel_count(VideoParams::kRGBChannelCount); + } - frame->set_video_params(video_params); + frame->set_video_params(frame_params); frame->allocate(); node->GenerateFrame(frame, job); @@ -459,8 +468,6 @@ QVariant RenderProcessor::ProcessFrameGeneration(const Node *node, const Generat frame->data(), frame->linesize_pixels()); - texture->set_has_meaningful_alpha(job.GetAlphaChannelRequired()); - return QVariant::fromValue(texture); } diff --git a/app/render/texture.h b/app/render/texture.h index abf4e7e2e..4aaf01f62 100644 --- a/app/render/texture.h +++ b/app/render/texture.h @@ -41,19 +41,12 @@ public: kMipmappedLinear }; - enum ChannelFormat { - kRGBA, - kRGB, - kRedOnly - }; - static const Interpolation kDefaultInterpolation; Texture(Renderer* renderer, const QVariant& native, const VideoParams& param, Type type) : renderer_(renderer), params_(param), id_(native), - meaningful_alpha_(true), type_(type) { } @@ -82,11 +75,16 @@ public: return params_.height(); } - PixelFormat::Format format() const + VideoParams::Format format() const { return params_.format(); } + int channel_count() const + { + return params_.channel_count(); + } + int divider() const { return params_.divider(); @@ -97,16 +95,6 @@ public: return params_.pixel_aspect_ratio(); } - bool has_meaningful_alpha() const - { - return meaningful_alpha_; - } - - void set_has_meaningful_alpha(bool e) - { - meaningful_alpha_ = e; - } - Type type() const { return type_; @@ -119,8 +107,6 @@ private: QVariant id_; - bool meaningful_alpha_; - Type type_; }; diff --git a/app/render/videoparams.cpp b/app/render/videoparams.cpp index c9609701e..e7c500f6f 100644 --- a/app/render/videoparams.cpp +++ b/app/render/videoparams.cpp @@ -24,7 +24,9 @@ #include "core.h" -OLIVE_NAMESPACE_ENTER +OLIVE_NAMESPACE_ENTER; + +const int VideoParams::kInternalChannelCount = kRGBAChannelCount; const rational VideoParams::kPixelAspectSquare(1); const rational VideoParams::kPixelAspectNTSCStandard(8, 9); @@ -63,16 +65,18 @@ VideoParams::VideoParams() : width_(0), height_(0), depth_(0), - format_(PixelFormat::PIX_FMT_INVALID), + format_(kFormatInvalid), + channel_count_(0), interlacing_(Interlacing::kInterlaceNone) { } -VideoParams::VideoParams(const int &width, const int &height, const PixelFormat::Format &format, const rational& pixel_aspect_ratio, const Interlacing &interlacing, const int& divider) : +VideoParams::VideoParams(int width, int height, Format format, int nb_channels, const rational& pixel_aspect_ratio, Interlacing interlacing, int divider) : width_(width), height_(height), depth_(0), format_(format), + channel_count_(nb_channels), pixel_aspect_ratio_(pixel_aspect_ratio), interlacing_(interlacing), divider_(divider) @@ -81,11 +85,12 @@ VideoParams::VideoParams(const int &width, const int &height, const PixelFormat: validate_pixel_aspect_ratio(); } -VideoParams::VideoParams(const int &width, const int &height, const int &depth, const PixelFormat::Format &format, const rational &pixel_aspect_ratio, const VideoParams::Interlacing &interlacing, const int ÷r) : +VideoParams::VideoParams(int width, int height, int depth, Format format, int nb_channels, const rational &pixel_aspect_ratio, VideoParams::Interlacing interlacing, int divider) : width_(width), height_(height), depth_(depth), format_(format), + channel_count_(nb_channels), pixel_aspect_ratio_(pixel_aspect_ratio), interlacing_(interlacing), divider_(divider) @@ -94,12 +99,13 @@ VideoParams::VideoParams(const int &width, const int &height, const int &depth, validate_pixel_aspect_ratio(); } -VideoParams::VideoParams(const int &width, const int &height, const rational &time_base, const PixelFormat::Format &format, const rational& pixel_aspect_ratio, const Interlacing &interlacing, const int ÷r) : +VideoParams::VideoParams(int width, int height, const rational &time_base, Format format, int nb_channels, const rational& pixel_aspect_ratio, Interlacing interlacing, int divider) : width_(width), height_(height), depth_(0), time_base_(time_base), format_(format), + channel_count_(nb_channels), pixel_aspect_ratio_(pixel_aspect_ratio), interlacing_(interlacing), divider_(divider) @@ -159,6 +165,64 @@ bool VideoParams::operator!=(const VideoParams &rhs) const return !(*this == rhs); } +int VideoParams::GetBytesPerChannel(VideoParams::Format format) +{ + switch (format) { + case kFormatInvalid: + case kFormatCount: + break; + case kFormatUnsigned8: + return 1; + case kFormatUnsigned16: + case kFormatFloat16: + return 2; + case kFormatFloat32: + return 4; + } + + return 0; +} + +int VideoParams::GetBytesPerPixel(VideoParams::Format format, int channels) +{ + return GetBytesPerChannel(format) * channels; +} + +bool VideoParams::FormatIsFloat(VideoParams::Format format) +{ + switch (format) { + case kFormatFloat16: + case kFormatFloat32: + return true; + case kFormatUnsigned8: + case kFormatUnsigned16: + case kFormatInvalid: + case kFormatCount: + break; + } + + return false; +} + +QString VideoParams::GetFormatName(VideoParams::Format format) +{ + switch (format) { + case kFormatUnsigned8: + return QCoreApplication::translate("VideoParams", "8-bit"); + case kFormatUnsigned16: + return QCoreApplication::translate("VideoParams", "16-bit Integer"); + case kFormatFloat16: + return QCoreApplication::translate("VideoParams", "Half-Float (16-bit)"); + case kFormatFloat32: + return QCoreApplication::translate("VideoParams", "Full-Float (32-bit)"); + case kFormatInvalid: + case kFormatCount: + break; + } + + return QCoreApplication::translate("VideoParams", "Unknown (0x%1)").arg(format, 0, 16); +} + void VideoParams::calculate_effective_size() { effective_width_ = GetScaledDimension(width(), divider_); @@ -178,8 +242,8 @@ bool VideoParams::is_valid() const return (width() > 0 && height() > 0 && !pixel_aspect_ratio_.isNull() - && format_ != PixelFormat::PIX_FMT_INVALID - && format_ != PixelFormat::PIX_FMT_COUNT); + && format_ > kFormatInvalid && format_ < kFormatCount + && channel_count_ > 0); } QString VideoParams::FrameRateToString(const rational &frame_rate) diff --git a/app/render/videoparams.h b/app/render/videoparams.h index 3d7102e9f..7cd4ef7c1 100644 --- a/app/render/videoparams.h +++ b/app/render/videoparams.h @@ -22,13 +22,35 @@ #define VIDEOPARAMS_H #include "common/rational.h" -#include "pixelformat.h" #include "rendermodes.h" OLIVE_NAMESPACE_ENTER class VideoParams { public: + enum Format { + /// Invalid or no format + kFormatInvalid = -1, + + /// 8-bit unsigned integer + kFormatUnsigned8, + + /// 16-bit unsigned integer + kFormatUnsigned16, + + /// 16-bit half float + kFormatFloat16, + + /// 32-bit full float + kFormatFloat32, + + /// 64-bit double float - disabled since very, very few libs support 64-bit buffers + //kFormatFloat64, + + /// Total format count + kFormatCount + }; + enum Interlacing { kInterlaceNone, kInterlacedTopFirst, @@ -36,16 +58,17 @@ public: }; VideoParams(); - VideoParams(const int& width, const int& height, const PixelFormat::Format& format, + VideoParams(int width, int height, Format format, int nb_channels, const rational& pixel_aspect_ratio = 1, - const Interlacing& interlacing = kInterlaceNone, const int& divider = 1); - VideoParams(const int& width, const int& height, const int& depth, - const PixelFormat::Format& format, + Interlacing interlacing = kInterlaceNone, int divider = 1); + VideoParams(int width, int height, int depth, + Format format, int nb_channels, const rational& pixel_aspect_ratio = 1, - const Interlacing& interlacing = kInterlaceNone, const int& divider = 1); - VideoParams(const int& width, const int& height, const rational& time_base, - const PixelFormat::Format& format, const rational& pixel_aspect_ratio = 1, - const Interlacing& interlacing = kInterlaceNone, const int& divider = 1); + Interlacing interlacing = kInterlaceNone, int divider = 1); + VideoParams(int width, int height, const rational& time_base, + Format format, int nb_channels, + const rational& pixel_aspect_ratio = 1, + Interlacing interlacing = kInterlaceNone, int divider = 1); int width() const { @@ -116,16 +139,26 @@ public: return effective_depth_; } - PixelFormat::Format format() const + Format format() const { return format_; } - void set_format(PixelFormat::Format f) + void set_format(Format f) { format_ = f; } + int channel_count() const + { + return channel_count_; + } + + void set_channel_count(int c) + { + channel_count_ = c; + } + const rational& pixel_aspect_ratio() const { return pixel_aspect_ratio_; @@ -154,6 +187,33 @@ public: bool operator==(const VideoParams& rhs) const; bool operator!=(const VideoParams& rhs) const; + static int GetBytesPerChannel(Format format); + int GetBytesPerChannel() const + { + return GetBytesPerChannel(format_); + } + + static int GetBytesPerPixel(Format format, int channels); + int GetBytesPerPixel() const + { + return GetBytesPerPixel(format_, channel_count_); + } + + static int GetBufferSize(int width, int height, Format format, int channels) + { + return width * height * GetBytesPerPixel(format, channels); + } + int GetBufferSize() const + { + return GetBufferSize(width_, height_, format_, channel_count_); + } + + static bool FormatIsFloat(Format format); + + static QString GetFormatName(Format format); + + static const int kInternalChannelCount; + static const rational kPixelAspectSquare; static const rational kPixelAspectNTSCStandard; static const rational kPixelAspectNTSCWidescreen; @@ -165,6 +225,10 @@ public: static const QVector kStandardPixelAspects; static const QVector kSupportedDividers; + static const int kHSVChannelCount = 3; + static const int kRGBChannelCount = 3; + static const int kRGBAChannelCount = 4; + /** * @brief Convert rational frame rate (i.e. flipped timebase) to a user-friendly string */ @@ -185,7 +249,9 @@ private: int depth_; rational time_base_; - PixelFormat::Format format_; + Format format_; + + int channel_count_; rational pixel_aspect_ratio_; diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index e7e53b0a1..1f5d4df38 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -170,18 +170,6 @@ void ExportTask::FrameDownloaded(FramePtr f, const QByteArray &hash, const QVect } } -void FrameColorConvert(ColorProcessorPtr processor, FramePtr frame) -{ - // Color conversion must be done with unassociated alpha, and the pipeline is always associated - ColorManager::DisassociateAlpha(frame); - - // Convert color space - processor->ConvertFrame(frame); - - // Re-associate alpha - ColorManager::ReassociateAlpha(frame); -} - void ExportTask::AudioDownloaded(const TimeRange &range, SampleBufferPtr samples, qint64 job_time) { Q_UNUSED(job_time) diff --git a/app/task/render/render.cpp b/app/task/render/render.cpp index 6b90dd1e4..65821d777 100644 --- a/app/task/render/render.cpp +++ b/app/task/render/render.cpp @@ -42,7 +42,7 @@ bool RenderTask::Render(ColorManager* manager, const TimeRangeList &audio_range, RenderMode::Mode mode, FrameHashCache* cache, const QSize &force_size, - const QMatrix4x4 &force_matrix, PixelFormat::Format force_format, + const QMatrix4x4 &force_matrix, VideoParams::Format force_format, ColorProcessorPtr force_color_output) { // Run watchers in another thread so they can accept signals even while this thread is blocked diff --git a/app/task/render/render.h b/app/task/render/render.h index 9f8c1ea17..428e4e243 100644 --- a/app/task/render/render.h +++ b/app/task/render/render.h @@ -44,7 +44,7 @@ protected: const TimeRangeList &audio_range, RenderMode::Mode mode, FrameHashCache *cache, const QSize& force_size = QSize(0, 0), const QMatrix4x4& force_matrix = QMatrix4x4(), - PixelFormat::Format force_format = PixelFormat::PIX_FMT_INVALID, + VideoParams::Format force_format = VideoParams::kFormatInvalid, ColorProcessorPtr force_color_output = nullptr); virtual void DownloadFrame(QThread* thread, FramePtr frame, const QByteArray &hash); diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index 86f82113a..dc10913dd 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -21,6 +21,7 @@ #ifndef MANAGEDDISPLAYOBJECT_H #define MANAGEDDISPLAYOBJECT_H +#include #include #include "render/colormanager.h" diff --git a/app/widget/nodetableview/nodetabletraverser.cpp b/app/widget/nodetableview/nodetabletraverser.cpp index 156409224..69df8e142 100644 --- a/app/widget/nodetableview/nodetabletraverser.cpp +++ b/app/widget/nodetableview/nodetabletraverser.cpp @@ -30,6 +30,7 @@ QVariant NodeTableTraverser::ProcessVideoFootage(StreamPtr stream, const rationa video_stream->height(), video_stream->timebase(), video_stream->format(), + video_stream->channel_count(), video_stream->pixel_aspect_ratio())); } @@ -39,7 +40,7 @@ QVariant NodeTableTraverser::ProcessAudioFootage(StreamPtr stream, const TimeRan return QVariant::fromValue(AudioParams(audio_stream->sample_rate(), audio_stream->channel_layout(), - SampleFormat::kInternalFormat)); + AudioParams::kInternalFormat)); } OLIVE_NAMESPACE_EXIT diff --git a/app/widget/nodetableview/nodetableview.cpp b/app/widget/nodetableview/nodetableview.cpp index 722ff0a96..4f5116b7f 100644 --- a/app/widget/nodetableview/nodetableview.cpp +++ b/app/widget/nodetableview/nodetableview.cpp @@ -145,7 +145,7 @@ void NodeTableView::SetTime(const rational &time) case NodeParam::kTexture: { // NodeTableTraverser puts video params in here - for (int k=0;ksetItemWidget(sub_item, 2 + k, new QCheckBox()); } break; diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index 87def5cc3..f292ccc29 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -80,7 +80,9 @@ void HistogramScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) if (!texture_row_sums_ || texture_row_sums_->width() != this->width() || texture_row_sums_->height() != this->height()) { - texture_row_sums_ = renderer()->CreateTexture(VideoParams(width(), height(), managed_tex->format())); + texture_row_sums_ = renderer()->CreateTexture(VideoParams(width(), height(), + managed_tex->format(), + managed_tex->channel_count())); } // Draw managed texture to a sums texture diff --git a/app/widget/scope/scopebase/scopebase.cpp b/app/widget/scope/scopebase/scopebase.cpp index 9cf864a24..ebeb1c7a7 100644 --- a/app/widget/scope/scopebase/scopebase.cpp +++ b/app/widget/scope/scopebase/scopebase.cpp @@ -20,6 +20,8 @@ #include "scopebase.h" +#include "config/config.h" + OLIVE_NAMESPACE_ENTER ScopeBase::ScopeBase(QWidget* parent) : @@ -54,7 +56,9 @@ void ScopeBase::DrawScope(TexturePtr managed_tex, QVariant pipeline) job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(managed_tex), NodeParam::kTexture)); - renderer()->Blit(pipeline, job, VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F)); + renderer()->Blit(pipeline, job, VideoParams(width(), height(), + static_cast(Config::Current()["OfflinePixelFormat"].toInt()), + VideoParams::kInternalChannelCount)); } void ScopeBase::UploadTextureFromBuffer() diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index 9abd47458..ac4964624 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -28,6 +28,7 @@ #include #include "common/qtutils.h" +#include "config/config.h" #include "node/node.h" OLIVE_NAMESPACE_ENTER @@ -74,7 +75,9 @@ void WaveformScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) job.InsertValue(QStringLiteral("ove_maintex"), ShaderValue(QVariant::fromValue(managed_tex), NodeParam::kTexture)); - renderer()->Blit(pipeline, job, VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F)); + renderer()->Blit(pipeline, job, VideoParams(width(), height(), + static_cast(Config::Current()["OfflinePixelFormat"].toInt()), + VideoParams::kInternalChannelCount)); float waveform_dim_x = ceil((width() - 1.0) * waveform_scale); float waveform_dim_y = ceil((height() - 1.0) * waveform_scale); diff --git a/app/widget/standardcombos/pixelformatcombobox.h b/app/widget/standardcombos/pixelformatcombobox.h index 88ad74f29..7fc29dc94 100644 --- a/app/widget/standardcombos/pixelformatcombobox.h +++ b/app/widget/standardcombos/pixelformatcombobox.h @@ -23,7 +23,7 @@ #include -#include "render/pixelformat.h" +#include "render/videoparams.h" OLIVE_NAMESPACE_ENTER @@ -35,21 +35,21 @@ public: QComboBox(parent) { // Set up preview formats - for (int i=0;i(i); + for (int i=0;i(i); - if (!float_only || PixelFormat::FormatIsFloat(pix_fmt)) { - this->addItem(PixelFormat::GetName(pix_fmt), pix_fmt); + if (!float_only || VideoParams::FormatIsFloat(pix_fmt)) { + this->addItem(VideoParams::GetFormatName(pix_fmt), pix_fmt); } } } - PixelFormat::Format GetPixelFormat() const + VideoParams::Format GetPixelFormat() const { - return static_cast(this->currentData().toInt()); + return static_cast(this->currentData().toInt()); } - void SetPixelFormat(PixelFormat::Format fmt) + void SetPixelFormat(VideoParams::Format fmt) { for (int i=0; icount(); i++) { if (this->itemData(i).toInt() == fmt) { diff --git a/app/widget/timelinewidget/tool/import.cpp b/app/widget/timelinewidget/tool/import.cpp index a2c77b7d4..a1552839e 100644 --- a/app/widget/timelinewidget/tool/import.cpp +++ b/app/widget/timelinewidget/tool/import.cpp @@ -397,8 +397,8 @@ void ImportTool::DropGhosts(bool insert) QVector block_items(parent()->GetGhostItems().size()); - // Check if we're inserting - if (insert) { + // Check if we're inserting (only valid if we're not creating this sequence ourselves) + if (insert && !open_sequence) { InsertGapsAtGhostDestination(command); } diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index ed83de293..d2b584722 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -37,7 +37,6 @@ #include "config/config.h" #include "project/item/sequence/sequence.h" #include "project/project.h" -#include "render/pixelformat.h" #include "render/rendermanager.h" #include "task/taskmanager.h" #include "widget/menu/menu.h" @@ -113,9 +112,6 @@ ViewerWidget::ViewerWidget(QWidget *parent) : connect(waveform_view_, &AudioWaveformView::TimeChanged, this, &ViewerWidget::TimeChangedFromWaveform); connect(waveform_view_, &AudioWaveformView::customContextMenuRequested, this, &ViewerWidget::ShowContextMenu); - // Ensures renderer is updated if the global pixel format is changed - connect(PixelFormat::instance(), &PixelFormat::FormatChanged, this, &ViewerWidget::UpdateRendererVideoParameters); - connect(&playback_backup_timer_, &QTimer::timeout, this, &ViewerWidget::PlaybackTimerUpdate); SetAutoMaxScrollBar(true); @@ -616,11 +612,6 @@ void ViewerWidget::RequestNextFrameForQueue() watcher->SetTicket(GetFrame(next_time, false)); } -PixelFormat::Format ViewerWidget::GetCurrentPixelFormat() const -{ - return PixelFormat::instance()->GetConfiguredFormatForMode(RenderMode::kOffline); -} - RenderTicketPtr ViewerWidget::GetFrame(const rational &t, bool clear_render_queue) { QByteArray cached_hash = GetConnectedNode()->video_frame_cache()->GetHash(t); diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 887f92b06..838dc4f4f 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -191,8 +191,6 @@ private: void RequestNextFrameForQueue(); - PixelFormat::Format GetCurrentPixelFormat() const; - RenderTicketPtr GetFrame(const rational& t, bool clear_render_queue); void FinishPlayPreprocess(); diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 84e9487bf..68fe1d505 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -31,9 +31,9 @@ #include "common/define.h" #include "common/functiontimer.h" -#include "gizmotraverser.h" -#include "render/pixelformat.h" +#include "config/config.h" #include "core.h" +#include "gizmotraverser.h" OLIVE_NAMESPACE_ENTER @@ -105,7 +105,8 @@ void ViewerDisplayWidget::SetImage(FramePtr in_buffer) if (!texture_ || texture_->width() != in_buffer->width() || texture_->height() != in_buffer->height() - || texture_->format() != in_buffer->format()) { + || texture_->format() != in_buffer->format() + || texture_->channel_count() != in_buffer->channel_count()) { texture_ = renderer()->CreateTexture(in_buffer->video_params(), in_buffer->data(), in_buffer->linesize_pixels()); } else { texture_->Upload(in_buffer->data(), in_buffer->linesize_pixels()); @@ -299,7 +300,7 @@ void ViewerDisplayWidget::OnPaint() // Draw texture through color transform renderer()->BlitColorManaged(color_service(), texture_, true, - VideoParams(width(), height(), PixelFormat::PIX_FMT_RGBA16F), + VideoParams(width(), height(), static_cast(Config::Current()["OfflinePixelFormat"].toInt()), VideoParams::kInternalChannelCount), GetCompleteMatrixFlippedYTranslation()); } From bb1f16c8e1fcca3d98d5e30c80be9b60f3c2df5d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 15 Nov 2020 22:47:10 +1100 Subject: [PATCH 28/72] merge: don't merge if the blend texture is RGB --- app/node/math/merge/merge.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/node/math/merge/merge.cpp b/app/node/math/merge/merge.cpp index 7c02cc375..d91374147 100644 --- a/app/node/math/merge/merge.cpp +++ b/app/node/math/merge/merge.cpp @@ -75,15 +75,19 @@ NodeValueTable MergeNode::Value(NodeValueDatabase &value) const job.InsertValue(base_in_, value); job.InsertValue(blend_in_, value); - // FIXME: Check if "blend" is RGB-only, in which case it's a no-op - NodeValueTable table = value.Merge(); - if (!job.GetValue(base_in_).data.isNull() || !job.GetValue(blend_in_).data.isNull()) { - if (job.GetValue(base_in_).data.isNull()) { - // We only have a blend texture, no need to alpha over + TexturePtr base_tex = job.GetValue(base_in_).data.value(); + TexturePtr blend_tex = job.GetValue(blend_in_).data.value(); + + if (base_tex || blend_tex) { + if (!base_tex || (blend_tex && blend_tex->channel_count() < VideoParams::kRGBAChannelCount)) { + // We only have a blend texture or the blend texture is RGB only, no need to alpha over + if (base_tex) { + qDebug() << "Ignored merge because blend texture was RGB only"; + } table.Push(job.GetValue(blend_in_), this); - } else if (job.GetValue(blend_in_).data.isNull()) { + } else if (!blend_tex) { // We only have a base texture, no need to alpha over table.Push(job.GetValue(base_in_), this); } else { From c3c1fa6f2842038a5cb801092448b1715121e735 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 15 Nov 2020 22:47:58 +1100 Subject: [PATCH 29/72] project: don't try to retrieve duration of a still image --- app/project/item/footage/footage.cpp | 31 +++++++++++++++------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/app/project/item/footage/footage.cpp b/app/project/item/footage/footage.cpp index e30a2d382..a9fa04527 100644 --- a/app/project/item/footage/footage.cpp +++ b/app/project/item/footage/footage.cpp @@ -180,7 +180,6 @@ QIcon Footage::icon() QString Footage::duration() { // Find longest stream duration - StreamPtr longest_stream = nullptr; rational longest; @@ -200,18 +199,20 @@ QString Footage::duration() if (longest_stream->type() == Stream::kVideo) { VideoStreamPtr video_stream = std::static_pointer_cast(longest_stream); - int64_t duration = video_stream->duration(); - rational frame_rate_timebase = video_stream->frame_rate().flipped(); + if (video_stream->video_type() != VideoStream::kVideoTypeStill) { + int64_t duration = video_stream->duration(); + rational frame_rate_timebase = video_stream->frame_rate().flipped(); - if (video_stream->timebase() != frame_rate_timebase) { - // Convert from timebase to frame rate - rational duration_time = Timecode::timestamp_to_time(duration, video_stream->timebase()); - duration = Timecode::time_to_timestamp(duration_time, frame_rate_timebase); + if (video_stream->timebase() != frame_rate_timebase) { + // Convert from timebase to frame rate + rational duration_time = Timecode::timestamp_to_time(duration, video_stream->timebase()); + duration = Timecode::time_to_timestamp(duration_time, frame_rate_timebase); + } + + return Timecode::timestamp_to_timecode(duration, + frame_rate_timebase, + Core::instance()->GetTimecodeDisplay()); } - - return Timecode::timestamp_to_timecode(duration, - frame_rate_timebase, - Core::instance()->GetTimecodeDisplay()); } else if (longest_stream->type() == Stream::kAudio) { AudioStreamPtr audio_stream = std::static_pointer_cast(longest_stream); @@ -237,11 +238,13 @@ QString Footage::rate() return QString(); } - if (HasStreamsOfType(Stream::kVideo) - && std::static_pointer_cast(get_first_stream_of_type(Stream::kVideo))->video_type() != VideoStream::kVideoTypeStill) { + if (HasStreamsOfType(Stream::kVideo)) { // This is a video editor, prioritize video streams VideoStreamPtr video_stream = std::static_pointer_cast(get_first_stream_of_type(Stream::kVideo)); - return QCoreApplication::translate("Footage", "%1 FPS").arg(video_stream->frame_rate().toDouble()); + + if (video_stream->video_type() != VideoStream::kVideoTypeStill) { + return QCoreApplication::translate("Footage", "%1 FPS").arg(video_stream->frame_rate().toDouble()); + } } else if (HasStreamsOfType(Stream::kAudio)) { // No video streams, return audio AudioStreamPtr audio_stream = std::static_pointer_cast(streams_.first()); From fbfa3e13482e243bde8dbd69907a6a69e3ea1699 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 15 Nov 2020 23:02:20 +1100 Subject: [PATCH 30/72] use virtual texture size rather than physical and clear destination when running shaders --- app/render/opengl/openglrenderer.cpp | 9 ++++++--- app/render/texture.h | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/render/opengl/openglrenderer.cpp b/app/render/opengl/openglrenderer.cpp index 8020affe9..66233d6f1 100644 --- a/app/render/opengl/openglrenderer.cpp +++ b/app/render/opengl/openglrenderer.cpp @@ -375,18 +375,18 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video // Set texture resolution if shader wants it int res_param_location = shader->uniformLocation(QStringLiteral("%1_resolution").arg(it.key())); if (res_param_location > -1) { - int adjusted_width = texture->width() * texture->divider(); + int virtual_width = texture->params().width(); // Adjust virtual width by pixel aspect if necessary if (texture->params().pixel_aspect_ratio() != 1 || destination_params.pixel_aspect_ratio() != 1) { double relative_pixel_aspect = texture->params().pixel_aspect_ratio().toDouble() / destination_params.pixel_aspect_ratio().toDouble(); - adjusted_width = qRound(static_cast(adjusted_width) * relative_pixel_aspect); + virtual_width = qRound(static_cast(virtual_width) * relative_pixel_aspect); } shader->setUniformValue(res_param_location, - adjusted_width, + virtual_width, static_cast(texture->height() * texture->divider())); } } @@ -515,6 +515,9 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video // Otherwise, if we were iterating before, detach texture now DetachTextureAsDestination(); } + + // Clear the destination, whatever it is + ClearDestination(); } else { // Always draw to output_tex, which gets swapped with input_tex every iteration AttachTextureAsDestination(output_tex.get()); diff --git a/app/render/texture.h b/app/render/texture.h index 4aaf01f62..b06af89d3 100644 --- a/app/render/texture.h +++ b/app/render/texture.h @@ -67,12 +67,12 @@ public: int width() const { - return params_.width(); + return params_.effective_width(); } int height() const { - return params_.height(); + return params_.effective_height(); } VideoParams::Format format() const From c0b710b8c00005e3a280c190219e44706c3f35ea Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 15 Nov 2020 23:51:12 +1100 Subject: [PATCH 31/72] use round instead of floor to convert time to samples --- app/render/audioparams.cpp | 14 +++++++------- app/render/audioparams.h | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/render/audioparams.cpp b/app/render/audioparams.cpp index 5ea10389e..24c308a33 100644 --- a/app/render/audioparams.cpp +++ b/app/render/audioparams.cpp @@ -95,38 +95,38 @@ qint64 AudioParams::time_to_bytes(const rational &time) const return time_to_bytes(time.toDouble()); } -int AudioParams::time_to_samples(const double &time) const +qint64 AudioParams::time_to_samples(const double &time) const { Q_ASSERT(is_valid()); - return qFloor(time * sample_rate()); + return qRound64(time * sample_rate()); } -int AudioParams::time_to_samples(const rational &time) const +qint64 AudioParams::time_to_samples(const rational &time) const { return time_to_samples(time.toDouble()); } -int AudioParams::samples_to_bytes(const int &samples) const +qint64 AudioParams::samples_to_bytes(const qint64 &samples) const { Q_ASSERT(is_valid()); return samples * channel_count() * bytes_per_sample_per_channel(); } -rational AudioParams::samples_to_time(const int &samples) const +rational AudioParams::samples_to_time(const qint64 &samples) const { return rational(samples, sample_rate()); } -int AudioParams::bytes_to_samples(const int &bytes) const +qint64 AudioParams::bytes_to_samples(const qint64 &bytes) const { Q_ASSERT(is_valid()); return bytes / (channel_count() * bytes_per_sample_per_channel()); } -rational AudioParams::bytes_to_time(const int &bytes) const +rational AudioParams::bytes_to_time(const qint64 &bytes) const { Q_ASSERT(is_valid()); diff --git a/app/render/audioparams.h b/app/render/audioparams.h index db9c0aa86..4ce4ccfbf 100644 --- a/app/render/audioparams.h +++ b/app/render/audioparams.h @@ -94,12 +94,12 @@ public: qint64 time_to_bytes(const double& time) const; qint64 time_to_bytes(const rational& time) const; - int time_to_samples(const double& time) const; - int time_to_samples(const rational& time) const; - int samples_to_bytes(const int& samples) const; - rational samples_to_time(const int& samples) const; - int bytes_to_samples(const int &bytes) const; - rational bytes_to_time(const int &bytes) const; + qint64 time_to_samples(const double& time) const; + qint64 time_to_samples(const rational& time) const; + qint64 samples_to_bytes(const qint64& samples) const; + rational samples_to_time(const qint64& samples) const; + qint64 bytes_to_samples(const qint64 &bytes) const; + rational bytes_to_time(const qint64 &bytes) const; int channel_count() const; int bytes_per_sample_per_channel() const; int bits_per_sample() const; From 2c086ce9fba2532502d35205f622e4d203a72a95 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 01:33:24 +1100 Subject: [PATCH 32/72] removed debug line --- app/codec/ffmpeg/ffmpegdecoder.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index cdab55a67..e6718ead5 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -79,8 +79,6 @@ bool FFmpegDecoder::OpenInternal() native_pix_fmt_ = GetNativePixelFormat(ideal_pix_fmt_); native_channel_count_ = GetNativeChannelCount(ideal_pix_fmt_); - qDebug() << "Set channel count to:" << native_channel_count_; - if (native_pix_fmt_ == VideoParams::kFormatInvalid || native_channel_count_ == 0) { qDebug() << "Failed to find valid native pixel format for" << ideal_pix_fmt_; From fe4e45e386ac1c6aac1d4e30fd718d446d5cc8ad Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 01:33:53 +1100 Subject: [PATCH 33/72] fixed timerangelist removing bug --- app/common/timerange.cpp | 25 ++++++++++++------------- app/common/timerange.h | 8 ++++++-- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/app/common/timerange.cpp b/app/common/timerange.cpp index c53524863..639b5c030 100644 --- a/app/common/timerange.cpp +++ b/app/common/timerange.cpp @@ -78,11 +78,11 @@ bool TimeRange::operator!=(const TimeRange &r) const bool TimeRange::OverlapsWith(const TimeRange &a, bool in_inclusive, bool out_inclusive) const { - bool overlaps_in = (in_inclusive) ? (a.out() < in()) : (a.out() <= in()); + bool doesnt_overlap_in = (in_inclusive) ? (a.out() < in()) : (a.out() <= in()); - bool overlaps_out = (out_inclusive) ? (a.in() > out()) : (a.in() >= out()); + bool doesnt_overlap_out = (out_inclusive) ? (a.in() > out()) : (a.in() >= out()); - return !(overlaps_in || overlaps_out); + return !doesnt_overlap_in && !doesnt_overlap_out; } TimeRange TimeRange::Combined(const TimeRange &a) const @@ -211,8 +211,10 @@ void TimeRangeList::remove(const TimeRange &remove) sz--; } else if (compare.Contains(remove, false, false)) { // The remove range is within this element, only choice is to split the element into two - array_.append(TimeRange(remove.out(), compare.out())); + TimeRange new_range(remove.out(), compare.out()); compare.set_out(remove.in()); + insert(new_range); + break; } else if (compare.in() < remove.in() && compare.out() > remove.in()) { // This element's out point overlaps the range's in, we'll trim it compare.set_out(remove.in()); @@ -289,15 +291,6 @@ TimeRangeList TimeRangeList::Intersects(const TimeRange &range) const return intersect_list; } -void TimeRangeList::PrintTimeList() -{ - qDebug() << "TimeRangeList now contains:"; - - for (int i=0;i& internal_array() const + { + return array_; + } +private: QVector array_; }; @@ -139,6 +142,7 @@ uint qHash(const TimeRange& r, uint seed); OLIVE_NAMESPACE_EXIT QDebug operator<<(QDebug debug, const OLIVE_NAMESPACE::TimeRange& r); +QDebug operator<<(QDebug debug, const OLIVE_NAMESPACE::TimeRangeList& r); Q_DECLARE_METATYPE(OLIVE_NAMESPACE::TimeRange) From a9bc1312c1b84351db7a0045d0cdf7871c759e0e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 01:34:20 +1100 Subject: [PATCH 34/72] don't show associated alpha option if footage has no alpha --- .../streamproperties/videostreamproperties.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index b9bf9112d..f6ebfcfcc 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -77,11 +77,13 @@ VideoStreamProperties::VideoStreamProperties(VideoStreamPtr stream) : video_layout->addWidget(video_color_space_, row, 1); - row++; + if (stream->channel_count() == VideoParams::kRGBAChannelCount) { + row++; - video_premultiply_alpha_ = new QCheckBox(tr("Premultiplied Alpha")); - video_premultiply_alpha_->setChecked(stream_->premultiplied_alpha()); - video_layout->addWidget(video_premultiply_alpha_, row, 0, 1, 2); + video_premultiply_alpha_ = new QCheckBox(tr("Premultiplied Alpha")); + video_premultiply_alpha_->setChecked(stream_->premultiplied_alpha()); + video_layout->addWidget(video_premultiply_alpha_, row, 0, 1, 2); + } row++; From c81bb003d37096f1a0e1d567b2fcad31a8129bef Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 01:34:57 +1100 Subject: [PATCH 35/72] framehashcache: minor code cleanup --- app/render/framehashcache.cpp | 29 +++++++++-------------------- app/render/playbackcache.cpp | 5 ++++- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index d88e407f2..b902f80eb 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -50,22 +50,16 @@ QByteArray FrameHashCache::GetHash(const rational &time) void FrameHashCache::SetHash(const rational &time, const QByteArray &hash, const qint64& job_time, bool frame_exists) { - bool is_current = false; - for (int i=jobs_.size()-1; i>=0; i--) { const JobIdentifier& job = jobs_.at(i); if (job.range.Contains(time) - && job_time >= job.job_time) { - is_current = true; - break; + && job_time < job.job_time) { + // Hash here has changed since this frame started rendering, discard it + return; } } - if (!is_current) { - return; - } - time_hash_map_.insert(time, hash); TimeRange validated_range; @@ -82,11 +76,9 @@ void FrameHashCache::SetTimebase(const rational &tb) void FrameHashCache::ValidateFramesWithHash(const QByteArray &hash) { - QMap::const_iterator iterator; - const TimeRangeList& invalidated_ranges = GetInvalidatedRanges(); - for (iterator=time_hash_map_.begin();iterator!=time_hash_map_.end();iterator++) { + for (auto iterator=time_hash_map_.begin();iterator!=time_hash_map_.end();iterator++) { if (iterator.value() == hash) { TimeRange frame_range(iterator.key(), iterator.key() + timebase_); @@ -101,9 +93,7 @@ QList FrameHashCache::GetFramesWithHash(const QByteArray &hash) { QList times; - QMap::const_iterator iterator; - - for (iterator=time_hash_map_.begin();iterator!=time_hash_map_.end();iterator++) { + for (auto iterator=time_hash_map_.begin();iterator!=time_hash_map_.end();iterator++) { if (iterator.value() == hash) { times.append(iterator.key()); } @@ -116,7 +106,7 @@ QList FrameHashCache::TakeFramesWithHash(const QByteArray &hash) { QList times; - QMap::iterator iterator = time_hash_map_.begin(); + auto iterator = time_hash_map_.begin(); while (iterator != time_hash_map_.end()) { if (iterator.value() == hash) { @@ -284,7 +274,7 @@ FramePtr FrameHashCache::LoadCacheFrame(const QString &fn) void FrameHashCache::LengthChangedEvent(const rational &old, const rational &newlen) { if (newlen < old) { - QMap::iterator i = time_hash_map_.begin(); + auto i = time_hash_map_.begin(); while (i != time_hash_map_.end()) { if (i.key() >= newlen) { @@ -303,7 +293,7 @@ struct HashTimePair { void FrameHashCache::ShiftEvent(const rational &from, const rational &to) { - QMap::iterator i = time_hash_map_.begin(); + auto i = time_hash_map_.begin(); // POSITIVE if moving forward -> // NEGATIVE if moving backward <- @@ -354,8 +344,7 @@ void FrameHashCache::HashDeleted(const QString& s, const QByteArray &hash) } TimeRangeList ranges_to_invalidate; - QMap::const_iterator i; - for (i=time_hash_map_.constBegin(); i!=time_hash_map_.constEnd(); i++) { + for (auto i=time_hash_map_.constBegin(); i!=time_hash_map_.constEnd(); i++) { if (i.value() == hash) { ranges_to_invalidate.insert(TimeRange(i.key(), i.key() + timebase_)); } diff --git a/app/render/playbackcache.cpp b/app/render/playbackcache.cpp index 72eda146d..d3bc9cb63 100644 --- a/app/render/playbackcache.cpp +++ b/app/render/playbackcache.cpp @@ -31,7 +31,10 @@ OLIVE_NAMESPACE_ENTER void PlaybackCache::Invalidate(const TimeRange &r) { - Q_ASSERT(r.in() != r.out()); + if (r.in() == r.out()) { + qWarning() << "Tried to invalidate zero-length range"; + return; + } invalidated_.insert(r); From 96d4d8847150ce6132eaa9d2339bfea00d0bf303 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 01:37:39 +1100 Subject: [PATCH 36/72] renderer: fixed bug that caused threads to hang indefinitely --- app/render/renderprocessor.cpp | 68 +++++++++++++++------------------- app/render/stillimagecache.h | 60 +++++++++++++++--------------- 2 files changed, 60 insertions(+), 68 deletions(-) diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index d3c0480e8..98935967b 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -265,39 +265,32 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & ColorManager* color_manager = Node::ValueToPtr(ticket_->property("colormanager")); - StillImageCache::Entry want_entry = {nullptr, - stream, - ColorProcessor::GenerateID(color_manager, video_stream->colorspace(), color_manager->GetReferenceColorSpace()), - video_stream->premultiplied_alpha(), - video_params.divider(), - (video_stream->video_type() == VideoStream::kVideoTypeStill) ? 0 : input_time}; + StillImageCache::EntryPtr want_entry = std::make_shared( + nullptr, + stream, + ColorProcessor::GenerateID(color_manager, video_stream->colorspace(), color_manager->GetReferenceColorSpace()), + video_stream->premultiplied_alpha(), + video_params.divider(), + (video_stream->video_type() == VideoStream::kVideoTypeStill) ? 0 : input_time, + true); + + bool found_existing = false; still_image_cache_->mutex()->lock(); - foreach (const StillImageCache::Entry& e, still_image_cache_->entries()) { + foreach (StillImageCache::EntryPtr e, still_image_cache_->entries()) { if (StillImageCache::CompareEntryMetadata(want_entry, e)) { - // Found an exact match of the texture we want in the cache, use it instead of reading it - // ourselves - value = e.texture; - break; - } - } + // Found an exact match of the texture we want in the cache. See if it's working or if it's + // ready. + want_entry = e; + found_existing = true; - if (!value) { - // Failed to find the texture, let's see if it's being generated by another processor - foreach (const StillImageCache::Entry& e, still_image_cache_->pending()) { - if (StillImageCache::CompareEntryMetadata(want_entry, e)) { - // An exact match of this texture is pending, let's wait for it - while (!value) { - // FIXME: Hacky way of waiting for other threads - still_image_cache_->mutex()->unlock(); - QThread::msleep(1); - still_image_cache_->mutex()->lock(); - - value = e.texture; - } - break; + while (want_entry->working) { + still_image_cache_->wait_cond()->wait(still_image_cache_->mutex()); } + + value = want_entry->texture; + break; } } @@ -307,8 +300,11 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & } else { // Wasn't in still image cache, so we'll have to retrieve it from the decoder - // Let other processors know we're getting this texture - still_image_cache_->PushPending(want_entry); + // Let other processors know we're getting this texture (want_entry's `working` field is + // already set to true in the initializer above) + if (!found_existing) { + still_image_cache_->PushEntry(want_entry); + } still_image_cache_->mutex()->unlock(); @@ -330,7 +326,7 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & managed_params.set_format(video_params.format()); value = render_ctx_->CreateTexture(managed_params); - qDebug() << "FIXME: Accessing video_stream->colorspace() and video_stream->premultiplied_alpha() may cause race conditions"; + //qDebug() << "FIXME: Accessing video_stream->colorspace() and video_stream->premultiplied_alpha() may cause race conditions"; ColorProcessorPtr processor = ColorProcessor::Create(color_manager, video_stream->colorspace(), @@ -342,11 +338,11 @@ QVariant RenderProcessor::ProcessVideoFootage(StreamPtr stream, const rational & still_image_cache_->mutex()->lock(); - still_image_cache_->RemovePending(want_entry); - // Put this into the image cache instead - want_entry.texture = value; - still_image_cache_->PushEntry(want_entry); + want_entry->texture = value; + want_entry->working = false; + + still_image_cache_->wait_cond()->wakeAll(); still_image_cache_->mutex()->unlock(); } @@ -481,8 +477,6 @@ QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) FramePtr f = FrameHashCache::LoadCacheFrame(ticket_->property("cache").toString(), hash); - qDebug() << ticket_->property("cache").toString() << hash.toHex(); - if (f) { // The cached frame won't load with the correct divider by default, so we enforce it here VideoParams p = f->video_params(); @@ -497,8 +491,6 @@ QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) TexturePtr texture = render_ctx_->CreateTexture(f->video_params(), f->data(), f->linesize_pixels()); return QVariant::fromValue(texture); - } else { - qDebug() << "Not using cached frame because frame is null"; } } diff --git a/app/render/stillimagecache.h b/app/render/stillimagecache.h index efd7ac515..f5b4336e7 100644 --- a/app/render/stillimagecache.h +++ b/app/render/stillimagecache.h @@ -2,6 +2,7 @@ #define STILLIMAGECACHE_H #include +#include #include "common/rational.h" #include "project/item/footage/stream.h" @@ -13,44 +14,53 @@ class StillImageCache { public: struct Entry { + Entry(TexturePtr t, StreamPtr s, const QString& cs, bool a, int d, const rational& i, bool w) + { + texture = t; + stream = s; + colorspace = cs; + alpha_is_associated = a; + divider = d; + time = i; + working = w; + } + TexturePtr texture; StreamPtr stream; QString colorspace; bool alpha_is_associated; int divider; rational time; + bool working; }; + using EntryPtr = std::shared_ptr; + QMutex* mutex() { return &mutex_; } - const QVector& entries() const + QWaitCondition* wait_cond() + { + return &wait_cond_; + } + + const QVector& entries() const { return entries_; } - const QVector& pending() const + static bool CompareEntryMetadata(EntryPtr a, EntryPtr b) { - return pending_; + return (a->stream == b->stream + && a->colorspace == b->colorspace + && a->alpha_is_associated == b->alpha_is_associated + && a->divider == b->divider + && a->time == b->time); } - static bool CompareEntryMetadata(const Entry& a, const Entry& b) - { - return (a.stream == b.stream - && a.colorspace == b.colorspace - && a.alpha_is_associated == b.alpha_is_associated - && a.divider == b.divider - && a.time == b.time); - } - - void PushPending(const Entry& e) - { - pending_.prepend(e); - } - - void PushEntry(const Entry& e) + void PushEntry(EntryPtr e) { entries_.prepend(e); @@ -59,22 +69,12 @@ public: } } - void RemovePending(const Entry& e) - { - for (int i=0; i entries_; + QWaitCondition wait_cond_; - QVector pending_; + QVector entries_; }; From 1dd7e2492029b11f4c6484d43b57c96b4d3881a6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 02:01:51 +1100 Subject: [PATCH 37/72] merge: removed debug line --- app/node/math/merge/merge.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/node/math/merge/merge.cpp b/app/node/math/merge/merge.cpp index d91374147..c9a53dc54 100644 --- a/app/node/math/merge/merge.cpp +++ b/app/node/math/merge/merge.cpp @@ -83,9 +83,6 @@ NodeValueTable MergeNode::Value(NodeValueDatabase &value) const if (base_tex || blend_tex) { if (!base_tex || (blend_tex && blend_tex->channel_count() < VideoParams::kRGBAChannelCount)) { // We only have a blend texture or the blend texture is RGB only, no need to alpha over - if (base_tex) { - qDebug() << "Ignored merge because blend texture was RGB only"; - } table.Push(job.GetValue(blend_in_), this); } else if (!blend_tex) { // We only have a base texture, no need to alpha over From 17b9a7e3ada402e895d9bbeff06405291d97e5f4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 02:02:12 +1100 Subject: [PATCH 38/72] renderer: moved alpha channel detection to where texture is actually made --- app/render/opengl/openglrenderer.cpp | 12 ------------ app/render/renderprocessor.cpp | 23 +++++++++++++++++++---- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/app/render/opengl/openglrenderer.cpp b/app/render/opengl/openglrenderer.cpp index 66233d6f1..a5578a569 100644 --- a/app/render/opengl/openglrenderer.cpp +++ b/app/render/opengl/openglrenderer.cpp @@ -286,7 +286,6 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video QString iterative_name; GLuint iterative_input = 0; QVector textures_to_bind; - bool input_textures_have_alpha = false; QOpenGLShaderProgram* shader = Node::ValueToPtr(s); @@ -360,10 +359,6 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video GLuint tex_id = texture ? texture->id().value() : 0; textures_to_bind.append({texture, job.GetInterpolation(it.key())}); - if (texture && texture->channel_count() == VideoParams::kRGBAChannelCount) { - input_textures_have_alpha = true; - } - // Set enable flag if shader wants it int enable_param_location = shader->uniformLocation(QStringLiteral("%1_enabled").arg(it.key())); if (enable_param_location > -1) { @@ -440,13 +435,6 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video destination_params.effective_width(), destination_params.effective_height()); - // Set whether our destination texture needs an alpha channel - if (input_textures_have_alpha || job.GetAlphaChannelRequired()) { - destination_params.set_channel_count(VideoParams::kRGBAChannelCount); - } else { - destination_params.set_channel_count(VideoParams::kRGBChannelCount); - } - // Bind vertex array object QOpenGLVertexArrayObject vao_; vao_.create(); diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 98935967b..74a6ee56b 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -391,9 +391,26 @@ QVariant RenderProcessor::ProcessShader(const Node *node, const TimeRange &range } } - const VideoParams& video_params = ticket_->property("vparam").value(); + VideoParams tex_params = ticket_->property("vparam").value(); - TexturePtr destination = render_ctx_->CreateTexture(video_params); + bool input_textures_have_alpha = false; + for (auto it=job.GetValues().cbegin(); it!=job.GetValues().cend(); it++) { + if (it.value().type == NodeParam::kTexture) { + TexturePtr tex = it.value().data.value(); + if (tex && tex->channel_count() == VideoParams::kRGBAChannelCount) { + input_textures_have_alpha = true; + break; + } + } + } + + if (input_textures_have_alpha || job.GetAlphaChannelRequired()) { + tex_params.set_channel_count(VideoParams::kRGBAChannelCount); + } else { + tex_params.set_channel_count(VideoParams::kRGBChannelCount); + } + + TexturePtr destination = render_ctx_->CreateTexture(tex_params); // Run shader render_ctx_->BlitToTexture(shader, job, destination.get()); @@ -487,8 +504,6 @@ QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) f->set_video_params(p); - qDebug() << "Using cached frame!"; - TexturePtr texture = render_ctx_->CreateTexture(f->video_params(), f->data(), f->linesize_pixels()); return QVariant::fromValue(texture); } From 39149d28c792250530af10ecf67835ac67e2e012 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 02:02:45 +1100 Subject: [PATCH 39/72] fixed bug that prevented cached footage from being reused --- app/render/previewautocacher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index eb673f8c8..9e5902e19 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -116,7 +116,7 @@ void PreviewAutoCacher::GenerateHashes(ViewerOutput *viewer, FrameHashCache* cac foreach (const rational& time, times) { // See if hash already exists in disk cache - QByteArray hash = RenderManager::Hash(viewer, viewer->video_params(), time); + QByteArray hash = RenderManager::Hash(viewer->texture_input()->get_connected_node(), viewer->video_params(), time); // Check memory list since disk checking is slow bool hash_exists = (std::find(existing_hashes.begin(), existing_hashes.end(), hash) != existing_hashes.end()); From 81c98e1026b5c72579aa97a7a5ad320f4f73b0b6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 08:58:51 +1100 Subject: [PATCH 40/72] timeline: made markers undoable --- app/timeline/timelinemarker.cpp | 3 ++- app/timeline/timelinemarker.h | 2 +- app/widget/timebased/timebased.cpp | 26 ++++++++++++++++++++++++- app/widget/timebased/timebased.h | 21 ++++++++++++++++++++ app/widget/timeruler/seekablewidget.cpp | 4 ++++ 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/app/timeline/timelinemarker.cpp b/app/timeline/timelinemarker.cpp index 5ee6f031d..3aa43c929 100644 --- a/app/timeline/timelinemarker.cpp +++ b/app/timeline/timelinemarker.cpp @@ -72,11 +72,12 @@ TimelineMarkerList::~TimelineMarkerList() qDeleteAll(markers_); } -void TimelineMarkerList::AddMarker(const TimeRange &time, const QString &name) +TimelineMarker* TimelineMarkerList::AddMarker(const TimeRange &time, const QString &name) { TimelineMarker* m = new TimelineMarker(time, name); markers_.append(m); emit MarkerAdded(m); + return m; } void TimelineMarkerList::RemoveMarker(TimelineMarker *marker) diff --git a/app/timeline/timelinemarker.h b/app/timeline/timelinemarker.h index 09d005c51..16a79abec 100644 --- a/app/timeline/timelinemarker.h +++ b/app/timeline/timelinemarker.h @@ -61,7 +61,7 @@ public: virtual ~TimelineMarkerList() override; - void AddMarker(const TimeRange& time = TimeRange(), const QString& name = QString()); + TimelineMarker *AddMarker(const TimeRange& time = TimeRange(), const QString& name = QString()); void RemoveMarker(TimelineMarker* marker); diff --git a/app/widget/timebased/timebased.cpp b/app/widget/timebased/timebased.cpp index 5c83206c6..b839d64aa 100644 --- a/app/widget/timebased/timebased.cpp +++ b/app/widget/timebased/timebased.cpp @@ -458,7 +458,8 @@ void TimeBasedWidget::SetMarker() } if (ok) { - points_->markers()->AddMarker(TimeRange(GetTime(), GetTime()), marker_name); + Core::instance()->undo_stack()->push(new MarkerAddCommand(static_cast(GetConnectedNode()->parent())->project(), + points_->markers(), TimeRange(GetTime(), GetTime()), marker_name)); } } @@ -517,4 +518,27 @@ void TimeBasedWidget::GoToOut() } } +TimeBasedWidget::MarkerAddCommand::MarkerAddCommand(Project *project, TimelineMarkerList *marker_list, const TimeRange &range, const QString &name) : + project_(project), + marker_list_(marker_list), + range_(range), + name_(name) +{ +} + +Project *TimeBasedWidget::MarkerAddCommand::GetRelevantProject() const +{ + return project_; +} + +void TimeBasedWidget::MarkerAddCommand::redo_internal() +{ + added_marker_ = marker_list_->AddMarker(range_, name_); +} + +void TimeBasedWidget::MarkerAddCommand::undo_internal() +{ + marker_list_->RemoveMarker(added_marker_); +} + OLIVE_NAMESPACE_EXIT diff --git a/app/widget/timebased/timebased.h b/app/widget/timebased/timebased.h index 008514d26..c31970189 100644 --- a/app/widget/timebased/timebased.h +++ b/app/widget/timebased/timebased.h @@ -139,6 +139,27 @@ signals: void TimebaseChanged(const rational&); private: + class MarkerAddCommand : public UndoCommand + { + public: + MarkerAddCommand(Project* project, TimelineMarkerList* marker_list, const TimeRange& range, const QString& name); + + virtual Project* GetRelevantProject() const override; + + protected: + virtual void redo_internal() override; + virtual void undo_internal() override; + + private: + Project* project_; + TimelineMarkerList* marker_list_; + TimeRange range_; + QString name_; + + TimelineMarker* added_marker_; + + }; + /** * @brief Set either in or out point to the current playhead * diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index 9c066acf1..13108b3cd 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -51,6 +51,8 @@ void SeekableWidget::ConnectTimelinePoints(TimelinePoints *points) if (timeline_points_) { disconnect(timeline_points_->workarea(), &TimelineWorkArea::RangeChanged, this, static_cast(&SeekableWidget::update)); disconnect(timeline_points_->workarea(), &TimelineWorkArea::EnabledChanged, this, static_cast(&SeekableWidget::update)); + disconnect(timeline_points_->markers(), &TimelineMarkerList::MarkerAdded, this, static_cast(&SeekableWidget::update)); + disconnect(timeline_points_->markers(), &TimelineMarkerList::MarkerRemoved, this, static_cast(&SeekableWidget::update)); } timeline_points_ = points; @@ -58,6 +60,8 @@ void SeekableWidget::ConnectTimelinePoints(TimelinePoints *points) if (timeline_points_) { connect(timeline_points_->workarea(), &TimelineWorkArea::RangeChanged, this, static_cast(&SeekableWidget::update)); connect(timeline_points_->workarea(), &TimelineWorkArea::EnabledChanged, this, static_cast(&SeekableWidget::update)); + connect(timeline_points_->markers(), &TimelineMarkerList::MarkerAdded, this, static_cast(&SeekableWidget::update)); + connect(timeline_points_->markers(), &TimelineMarkerList::MarkerRemoved, this, static_cast(&SeekableWidget::update)); } update(); From 9a1917d16049ab4d1b90da2efe96f373352fb4a3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 10:23:23 +1100 Subject: [PATCH 41/72] used different approach for populating open recent menu Fixes #1243 --- app/core.cpp | 16 +++++++++++----- app/core.h | 5 +++++ app/window/mainwindow/mainmenu.cpp | 12 ++++++++++-- app/window/mainwindow/mainmenu.h | 2 ++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/app/core.cpp b/app/core.cpp index 5a7f179bf..86c2f829b 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -168,9 +168,7 @@ void Core::Stop() if (recent_projects_file.open(QFile::WriteOnly | QFile::Text)) { QTextStream ts(&recent_projects_file); - foreach (const QString& s, recent_projects_) { - ts << s << "\n"; - } + ts << recent_projects_.join('\n'); recent_projects_file.close(); } @@ -254,6 +252,7 @@ void Core::SetSelectedTransitionObject(const QString &obj) void Core::ClearOpenRecentList() { recent_projects_.clear(); + emit OpenRecentListChanged(); } void Core::CreateNewProject() @@ -678,12 +677,15 @@ void Core::StartGUI(bool full_screen) if (recent_projects_file.open(QFile::ReadOnly | QFile::Text)) { QTextStream ts(&recent_projects_file); - while (!ts.atEnd()) { - recent_projects_.append(ts.readLine()); + QString s; + while (!(s = ts.readLine()).isEmpty()) { + recent_projects_.append(s); } recent_projects_file.close(); } + + emit OpenRecentListChanged(); } } @@ -953,6 +955,8 @@ void Core::PushRecentlyOpenedProject(const QString& s) } else { recent_projects_.prepend(s); } + + emit OpenRecentListChanged(); } void Core::OpenProjectInternal(const QString &filename) @@ -1089,6 +1093,8 @@ void Core::OpenProjectFromRecentList(int index) tr("The project \"%1\" doesn't exist. Would you like to remove this file from the recent list?").arg(open_fn), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { recent_projects_.removeAt(index); + + emit OpenRecentListChanged(); } } diff --git a/app/core.h b/app/core.h index 8e3b45db1..89d609a42 100644 --- a/app/core.h +++ b/app/core.h @@ -415,6 +415,11 @@ signals: */ void TimecodeDisplayChanged(Timecode::Display d); + /** + * @brief Signal emitted when a change is made to the open recent list + */ + void OpenRecentListChanged(); + private: /** * @brief Get the file filter than can be used with QFileDialog to open and save compatible projects diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp index b33a3e604..1bdbe9219 100644 --- a/app/window/mainwindow/mainmenu.cpp +++ b/app/window/mainwindow/mainmenu.cpp @@ -50,8 +50,7 @@ MainMenu::MainMenu(MainWindow *parent) : file_new_menu_ = new Menu(file_menu_); MenuShared::instance()->AddItemsForNewMenu(file_new_menu_); file_open_item_ = file_menu_->AddItem("openproj", Core::instance(), &Core::OpenProject, "Ctrl+O"); - file_open_recent_menu_ = new Menu(file_menu_, this, &MainMenu::PopulateOpenRecent); - connect(file_open_recent_menu_, &Menu::aboutToHide, this, &MainMenu::CloseOpenRecentMenu); + file_open_recent_menu_ = new Menu(file_menu_); file_open_recent_separator_ = file_open_recent_menu_->addSeparator(); file_open_recent_clear_item_ = file_open_recent_menu_->AddItem("clearopenrecent", Core::instance(), &Core::ClearOpenRecentList); file_save_item_ = file_menu_->AddItem("saveproj", Core::instance(), &Core::SaveActiveProject, "Ctrl+S"); @@ -255,6 +254,9 @@ MainMenu::MainMenu(MainWindow *parent) : help_menu_->addSeparator(); help_about_item_ = help_menu_->AddItem("about", Core::instance(), &Core::DialogAboutShow); + connect(Core::instance(), &Core::OpenRecentListChanged, this, &MainMenu::RepopulateOpenRecent); + PopulateOpenRecent(); + Retranslate(); } @@ -398,6 +400,12 @@ void MainMenu::PopulateOpenRecent() } } +void MainMenu::RepopulateOpenRecent() +{ + CloseOpenRecentMenu(); + PopulateOpenRecent(); +} + void MainMenu::CloseOpenRecentMenu() { while (file_open_recent_menu_->actions().first() != file_open_recent_separator_) { diff --git a/app/window/mainwindow/mainmenu.h b/app/window/mainwindow/mainmenu.h index 622303900..3bfb691fe 100644 --- a/app/window/mainwindow/mainmenu.h +++ b/app/window/mainwindow/mainmenu.h @@ -96,6 +96,8 @@ private slots: */ void PopulateOpenRecent(); + void RepopulateOpenRecent(); + /** * @brief Clears open recent items when menu closes */ From a0fb1981b4db08a2d82fdbb1e5e21f3a761008f3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 12:27:59 +1100 Subject: [PATCH 42/72] multi-line edit for text in paramview --- .../nodeparamview/nodeparamviewrichtext.cpp | 12 ++++++--- .../nodeparamview/nodeparamviewrichtext.h | 27 +++++++++++++------ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/app/widget/nodeparamview/nodeparamviewrichtext.cpp b/app/widget/nodeparamview/nodeparamviewrichtext.cpp index 476c7cc76..9f30be45d 100644 --- a/app/widget/nodeparamview/nodeparamviewrichtext.cpp +++ b/app/widget/nodeparamview/nodeparamviewrichtext.cpp @@ -34,19 +34,20 @@ NodeParamViewRichText::NodeParamViewRichText(QWidget *parent) : QHBoxLayout* layout = new QHBoxLayout(this); layout->setMargin(0); - line_edit_ = new QLineEdit(); - connect(line_edit_, &QLineEdit::textEdited, this, &NodeParamViewRichText::textEdited); + line_edit_ = new QTextEdit(); + connect(line_edit_, &QTextEdit::textChanged, this, &NodeParamViewRichText::InnerWidgetTextChanged); layout->addWidget(line_edit_); QPushButton* edit_btn = new QPushButton(); edit_btn->setIcon(icon::ToolEdit); + edit_btn->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding); layout->addWidget(edit_btn); connect(edit_btn, &QPushButton::clicked, this, &NodeParamViewRichText::ShowRichTextDialog); } void NodeParamViewRichText::ShowRichTextDialog() { - RichTextDialog d(line_edit_->text(), this); + RichTextDialog d(this->text(), this); if (d.exec() == QDialog::Accepted) { QString s = d.text(); @@ -55,4 +56,9 @@ void NodeParamViewRichText::ShowRichTextDialog() } } +void NodeParamViewRichText::InnerWidgetTextChanged() +{ + emit textEdited(this->text()); +} + OLIVE_NAMESPACE_EXIT diff --git a/app/widget/nodeparamview/nodeparamviewrichtext.h b/app/widget/nodeparamview/nodeparamviewrichtext.h index 974a742b4..9f09576f3 100644 --- a/app/widget/nodeparamview/nodeparamviewrichtext.h +++ b/app/widget/nodeparamview/nodeparamviewrichtext.h @@ -21,7 +21,7 @@ #ifndef NODEPARAMVIEWRICHTEXT_H #define NODEPARAMVIEWRICHTEXT_H -#include +#include #include #include "common/define.h" @@ -36,31 +36,42 @@ public: QString text() const { - return line_edit_->text(); + return line_edit_->toPlainText().replace('\n', QStringLiteral("
")); } public slots: - void setText(const QString &s) + void setText(QString s) { - line_edit_->setText(s); + line_edit_->blockSignals(true); + line_edit_->setPlainText(s.replace(QStringLiteral("
"), QStringLiteral("\n"))); + line_edit_->blockSignals(false); } void setTextPreservingCursor(const QString &s) { - int cursor_pos = line_edit_->cursorPosition(); - line_edit_->setText(s); - line_edit_->setCursorPosition(cursor_pos); + // Save cursor position + int cursor_pos = line_edit_->textCursor().position(); + + // Set text + this->setText(s); + + // Get new text cursor + QTextCursor c = line_edit_->textCursor(); + c.setPosition(cursor_pos); + line_edit_->setTextCursor(c); } signals: void textEdited(const QString &); private: - QLineEdit* line_edit_; + QTextEdit* line_edit_; private slots: void ShowRichTextDialog(); + void InnerWidgetTextChanged(); + }; OLIVE_NAMESPACE_EXIT From 1b9bf6d92cd577044f67c67144f099ccee79c916 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 16:17:43 +1100 Subject: [PATCH 43/72] switched many QLists for QVectors Minor optimization --- app/core.cpp | 2 +- app/core.h | 2 +- app/node/audio/pan/pan.cpp | 2 +- app/node/audio/pan/pan.h | 2 +- app/node/audio/volume/volume.cpp | 2 +- app/node/audio/volume/volume.h | 2 +- app/node/block/block.cpp | 6 +- app/node/block/block.h | 4 +- .../crossdissolve/crossdissolvetransition.cpp | 2 +- .../crossdissolve/crossdissolvetransition.h | 2 +- .../diptocolor/diptocolortransition.cpp | 2 +- .../diptocolor/diptocolortransition.h | 2 +- app/node/filter/blur/blur.cpp | 2 +- app/node/filter/blur/blur.h | 2 +- app/node/filter/stroke/stroke.cpp | 2 +- app/node/filter/stroke/stroke.h | 2 +- app/node/generator/matrix/matrix.cpp | 2 +- app/node/generator/matrix/matrix.h | 2 +- app/node/generator/polygon/polygon.cpp | 2 +- app/node/generator/polygon/polygon.h | 2 +- app/node/generator/solid/solid.cpp | 2 +- app/node/generator/solid/solid.h | 2 +- app/node/generator/text/text.cpp | 2 +- app/node/generator/text/text.h | 2 +- app/node/input.cpp | 12 ++-- app/node/input.h | 8 +-- app/node/input/media/media.cpp | 2 +- app/node/input/media/media.h | 2 +- app/node/input/time/timeinput.cpp | 2 +- app/node/input/time/timeinput.h | 2 +- app/node/math/math/math.cpp | 2 +- app/node/math/math/math.h | 2 +- app/node/math/merge/merge.cpp | 2 +- app/node/math/merge/merge.h | 2 +- app/node/math/trigonometry/trigonometry.cpp | 2 +- app/node/math/trigonometry/trigonometry.h | 2 +- app/node/node.cpp | 52 +++++++++--------- app/node/node.h | 44 +++++++-------- app/node/output/track/track.cpp | 2 +- app/node/output/track/track.h | 2 +- app/node/output/viewer/viewer.cpp | 2 +- app/node/output/viewer/viewer.h | 2 +- app/node/traverser.cpp | 2 +- app/panel/curve/curve.cpp | 2 +- app/panel/curve/curve.h | 2 +- app/panel/node/node.h | 12 ++-- app/panel/param/param.cpp | 4 +- app/panel/param/param.h | 8 +-- app/panel/table/table.h | 4 +- app/panel/timeline/timeline.h | 4 +- app/render/previewautocacher.cpp | 6 +- app/task/project/saveotio/saveotio.cpp | 2 +- app/widget/curvewidget/curveview.cpp | 2 +- app/widget/curvewidget/curvewidget.cpp | 4 +- app/widget/curvewidget/curvewidget.h | 6 +- app/widget/keyframeview/keyframeviewbase.cpp | 2 +- app/widget/nodecopypaste/nodecopypaste.cpp | 12 ++-- app/widget/nodecopypaste/nodecopypaste.h | 4 +- app/widget/nodeparamview/nodeparamview.cpp | 8 +-- app/widget/nodeparamview/nodeparamview.h | 12 ++-- app/widget/nodeparamview/nodeparamviewitem.h | 4 +- app/widget/nodetableview/nodetableview.cpp | 4 +- app/widget/nodetableview/nodetableview.h | 4 +- app/widget/nodetableview/nodetablewidget.h | 4 +- app/widget/nodetreeview/nodetreeview.cpp | 4 +- app/widget/nodetreeview/nodetreeview.h | 8 +-- app/widget/nodeview/nodeview.cpp | 53 +++++++++--------- app/widget/nodeview/nodeview.h | 24 ++++---- app/widget/nodeview/nodeviewscene.cpp | 16 +++--- app/widget/nodeview/nodeviewscene.h | 6 +- app/widget/nodeview/nodeviewundo.cpp | 4 +- app/widget/nodeview/nodeviewundo.h | 8 +-- .../projectexplorer/projectexplorer.cpp | 4 +- app/widget/timelinewidget/timelinewidget.cpp | 55 +++++++++---------- app/widget/timelinewidget/timelinewidget.h | 16 +++--- app/widget/timelinewidget/tool/pointer.cpp | 36 ++++++------ app/widget/timelinewidget/tool/pointer.h | 2 +- app/widget/timelinewidget/undo/undo.cpp | 2 +- app/widget/timelinewidget/undo/undo.h | 4 +- app/widget/timetarget/timetarget.cpp | 2 +- 80 files changed, 273 insertions(+), 281 deletions(-) diff --git a/app/core.cpp b/app/core.cpp index 86c2f829b..60be123ed 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -1034,7 +1034,7 @@ void Core::SetPreferenceForRenderMode(RenderMode::Mode mode, const QString &pref Config::Current()[GetRenderModePreferencePrefix(mode, preference)] = value; } -void Core::LabelNodes(const QList &nodes) const +void Core::LabelNodes(const QVector &nodes) const { if (nodes.isEmpty()) { return; diff --git a/app/core.h b/app/core.h index 89d609a42..62257a36a 100644 --- a/app/core.h +++ b/app/core.h @@ -233,7 +233,7 @@ public: /** * @brief Show a dialog to the user to rename a set of nodes */ - void LabelNodes(const QList& nodes) const; + void LabelNodes(const QVector &nodes) const; /** * @brief Create a new sequence named appropriately for the active project diff --git a/app/node/audio/pan/pan.cpp b/app/node/audio/pan/pan.cpp index d8b7f5183..7fbfd99ca 100644 --- a/app/node/audio/pan/pan.cpp +++ b/app/node/audio/pan/pan.cpp @@ -49,7 +49,7 @@ QString PanNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.pan"); } -QList PanNode::Category() const +QVector PanNode::Category() const { return {kCategoryChannels}; } diff --git a/app/node/audio/pan/pan.h b/app/node/audio/pan/pan.h index df23f9d0f..9ec58b110 100644 --- a/app/node/audio/pan/pan.h +++ b/app/node/audio/pan/pan.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual NodeValueTable Value(NodeValueDatabase &value) const override; diff --git a/app/node/audio/volume/volume.cpp b/app/node/audio/volume/volume.cpp index 4b403118b..b6d48e764 100644 --- a/app/node/audio/volume/volume.cpp +++ b/app/node/audio/volume/volume.cpp @@ -49,7 +49,7 @@ QString VolumeNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.volume"); } -QList VolumeNode::Category() const +QVector VolumeNode::Category() const { return {kCategoryFilter}; } diff --git a/app/node/audio/volume/volume.h b/app/node/audio/volume/volume.h index e408e3be7..c17656241 100644 --- a/app/node/audio/volume/volume.h +++ b/app/node/audio/volume/volume.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual NodeValueTable Value(NodeValueDatabase &value) const override; diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index 68b9779bd..0289e11b2 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -58,7 +58,7 @@ Block::Block() : set_length_and_media_out(1); } -QList Block::Category() const +QVector Block::Category() const { return {kCategoryTimeline}; } @@ -241,9 +241,9 @@ void Block::SaveInternal(QXmlStreamWriter *writer) const } } -QList Block::GetInputsToHash() const +QVector Block::GetInputsToHash() const { - QList inputs = Node::GetInputsToHash(); + QVector inputs = Node::GetInputsToHash(); // Ignore these inputs inputs.removeOne(media_in_input_); diff --git a/app/node/block/block.h b/app/node/block/block.h index ca5c700ee..52beed7cb 100644 --- a/app/node/block/block.h +++ b/app/node/block/block.h @@ -43,7 +43,7 @@ public: virtual Type type() const = 0; - virtual QList Category() const override; + virtual QVector Category() const override; const rational& in() const; const rational& out() const; @@ -110,7 +110,7 @@ protected: virtual void SaveInternal(QXmlStreamWriter* writer) const override; - virtual QList GetInputsToHash() const override; + virtual QVector GetInputsToHash() const override; virtual void LengthChangedEvent(const rational& old_length, const rational& new_length, diff --git a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp index 2073594b2..c85d48d3e 100644 --- a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp +++ b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp @@ -42,7 +42,7 @@ QString CrossDissolveTransition::id() const return QStringLiteral("org.olivevideoeditor.Olive.crossdissolve"); } -QList CrossDissolveTransition::Category() const +QVector CrossDissolveTransition::Category() const { return {kCategoryTransition}; } diff --git a/app/node/block/transition/crossdissolve/crossdissolvetransition.h b/app/node/block/transition/crossdissolve/crossdissolvetransition.h index e45d1de67..98daf4330 100644 --- a/app/node/block/transition/crossdissolve/crossdissolvetransition.h +++ b/app/node/block/transition/crossdissolve/crossdissolvetransition.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; //virtual void Retranslate() override; diff --git a/app/node/block/transition/diptocolor/diptocolortransition.cpp b/app/node/block/transition/diptocolor/diptocolortransition.cpp index eda0b4ef2..d75593158 100644 --- a/app/node/block/transition/diptocolor/diptocolortransition.cpp +++ b/app/node/block/transition/diptocolor/diptocolortransition.cpp @@ -43,7 +43,7 @@ QString DipToColorTransition::id() const return QStringLiteral("org.olivevideoeditor.Olive.diptocolor"); } -QList DipToColorTransition::Category() const +QVector DipToColorTransition::Category() const { return {kCategoryTransition}; } diff --git a/app/node/block/transition/diptocolor/diptocolortransition.h b/app/node/block/transition/diptocolor/diptocolortransition.h index 2c19443e1..660b5fcfc 100644 --- a/app/node/block/transition/diptocolor/diptocolortransition.h +++ b/app/node/block/transition/diptocolor/diptocolortransition.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual ShaderCode GetShaderCode(const QString& shader_id) const override; diff --git a/app/node/filter/blur/blur.cpp b/app/node/filter/blur/blur.cpp index e9e0005bf..332a31555 100644 --- a/app/node/filter/blur/blur.cpp +++ b/app/node/filter/blur/blur.cpp @@ -59,7 +59,7 @@ QString BlurFilterNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.blur"); } -QList BlurFilterNode::Category() const +QVector BlurFilterNode::Category() const { return {kCategoryFilter}; } diff --git a/app/node/filter/blur/blur.h b/app/node/filter/blur/blur.h index 6f9100605..088363991 100644 --- a/app/node/filter/blur/blur.h +++ b/app/node/filter/blur/blur.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/filter/stroke/stroke.cpp b/app/node/filter/stroke/stroke.cpp index 2cea51f75..5606c19a8 100644 --- a/app/node/filter/stroke/stroke.cpp +++ b/app/node/filter/stroke/stroke.cpp @@ -63,7 +63,7 @@ QString StrokeFilterNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.stroke"); } -QList StrokeFilterNode::Category() const +QVector StrokeFilterNode::Category() const { return {kCategoryFilter}; } diff --git a/app/node/filter/stroke/stroke.h b/app/node/filter/stroke/stroke.h index b9d1ac993..044f9ba95 100644 --- a/app/node/filter/stroke/stroke.h +++ b/app/node/filter/stroke/stroke.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/generator/matrix/matrix.cpp b/app/node/generator/matrix/matrix.cpp index b35247276..836510a3f 100644 --- a/app/node/generator/matrix/matrix.cpp +++ b/app/node/generator/matrix/matrix.cpp @@ -72,7 +72,7 @@ QString MatrixGenerator::id() const return QStringLiteral("org.olivevideoeditor.Olive.transform"); } -QList MatrixGenerator::Category() const +QVector MatrixGenerator::Category() const { return {kCategoryGenerator, kCategoryMath}; } diff --git a/app/node/generator/matrix/matrix.h b/app/node/generator/matrix/matrix.h index d6418eda8..ff1ddddb6 100644 --- a/app/node/generator/matrix/matrix.h +++ b/app/node/generator/matrix/matrix.h @@ -39,7 +39,7 @@ public: virtual QString Name() const override; virtual QString ShortName() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/generator/polygon/polygon.cpp b/app/node/generator/polygon/polygon.cpp index c11324bef..379eb659f 100644 --- a/app/node/generator/polygon/polygon.cpp +++ b/app/node/generator/polygon/polygon.cpp @@ -69,7 +69,7 @@ QString PolygonGenerator::id() const return QStringLiteral("org.olivevideoeditor.Olive.polygon"); } -QList PolygonGenerator::Category() const +QVector PolygonGenerator::Category() const { return {kCategoryGenerator}; } diff --git a/app/node/generator/polygon/polygon.h b/app/node/generator/polygon/polygon.h index 296177dea..d764ae7be 100644 --- a/app/node/generator/polygon/polygon.h +++ b/app/node/generator/polygon/polygon.h @@ -35,7 +35,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/generator/solid/solid.cpp b/app/node/generator/solid/solid.cpp index 0fdafc143..9309dcd69 100644 --- a/app/node/generator/solid/solid.cpp +++ b/app/node/generator/solid/solid.cpp @@ -48,7 +48,7 @@ QString SolidGenerator::id() const return QStringLiteral("org.olivevideoeditor.Olive.solidgenerator"); } -QList SolidGenerator::Category() const +QVector SolidGenerator::Category() const { return {kCategoryGenerator}; } diff --git a/app/node/generator/solid/solid.h b/app/node/generator/solid/solid.h index aa6fb5f79..101c8f15a 100644 --- a/app/node/generator/solid/solid.h +++ b/app/node/generator/solid/solid.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/generator/text/text.cpp b/app/node/generator/text/text.cpp index 1ff7c7a95..3c078cf34 100644 --- a/app/node/generator/text/text.cpp +++ b/app/node/generator/text/text.cpp @@ -72,7 +72,7 @@ QString TextGenerator::id() const return QStringLiteral("org.olivevideoeditor.Olive.textgenerator"); } -QList TextGenerator::Category() const +QVector TextGenerator::Category() const { return {kCategoryGenerator}; } diff --git a/app/node/generator/text/text.h b/app/node/generator/text/text.h index e4a14b868..cb80fd035 100644 --- a/app/node/generator/text/text.h +++ b/app/node/generator/text/text.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/input.cpp b/app/node/input.cpp index de31c0934..d34e777b6 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -423,7 +423,7 @@ QVariant NodeInput::StringToValue(const DataType& data_type, const QString &stri } } -void NodeInput::GetDependencies(QList &list, bool traverse, bool exclusive_only) const +void NodeInput::GetDependencies(QVector &list, bool traverse, bool exclusive_only) const { if (is_connected() && (get_connected_output()->edges().size() == 1 || !exclusive_only)) { @@ -433,7 +433,7 @@ void NodeInput::GetDependencies(QList &list, bool traverse, bool exclusi list.append(connected); if (traverse) { - QList connected_inputs = connected->GetInputsIncludingArrays(); + QVector connected_inputs = connected->GetInputsIncludingArrays(); foreach (NodeInput* i, connected_inputs) { i->GetDependencies(list, traverse, exclusive_only); @@ -461,21 +461,21 @@ QVariant NodeInput::GetDefaultValueForTrack(int track) const return default_value_.at(track); } -QList NodeInput::GetDependencies(bool traverse, bool exclusive_only) const +QVector NodeInput::GetDependencies(bool traverse, bool exclusive_only) const { - QList list; + QVector list; GetDependencies(list, traverse, exclusive_only); return list; } -QList NodeInput::GetExclusiveDependencies() const +QVector NodeInput::GetExclusiveDependencies() const { return GetDependencies(true, true); } -QList NodeInput::GetImmediateDependencies() const +QVector NodeInput::GetImmediateDependencies() const { return GetDependencies(false, false); } diff --git a/app/node/input.h b/app/node/input.h index 2a81c6d40..c7296ad3e 100644 --- a/app/node/input.h +++ b/app/node/input.h @@ -282,17 +282,17 @@ public: static QVariant StringToValue(const DataType &data_type, const QString &string, bool value_is_a_key_track); - void GetDependencies(QList& list, bool traverse, bool exclusive_only) const; + void GetDependencies(QVector &list, bool traverse, bool exclusive_only) const; QVariant GetDefaultValue() const; QVariant GetDefaultValueForTrack(int track) const; - QList GetDependencies(bool traverse = true, bool exclusive_only = false) const; + QVector GetDependencies(bool traverse = true, bool exclusive_only = false) const; - QList GetExclusiveDependencies() const; + QVector GetExclusiveDependencies() const; - QList GetImmediateDependencies() const; + QVector GetImmediateDependencies() const; signals: void ValueChanged(const OLIVE_NAMESPACE::TimeRange& range); diff --git a/app/node/input/media/media.cpp b/app/node/input/media/media.cpp index 8d5acd4b8..5469ef46c 100644 --- a/app/node/input/media/media.cpp +++ b/app/node/input/media/media.cpp @@ -35,7 +35,7 @@ MediaInput::MediaInput() : AddInput(footage_input_); } -QList MediaInput::Category() const +QVector MediaInput::Category() const { return {kCategoryInput}; } diff --git a/app/node/input/media/media.h b/app/node/input/media/media.h index 1ed9e0889..895a4ff66 100644 --- a/app/node/input/media/media.h +++ b/app/node/input/media/media.h @@ -38,7 +38,7 @@ public: virtual Stream::Type type() const = 0; - virtual QList Category() const override; + virtual QVector Category() const override; StreamPtr stream(); void SetStream(StreamPtr s); diff --git a/app/node/input/time/timeinput.cpp b/app/node/input/time/timeinput.cpp index d4df5b32b..485e90173 100644 --- a/app/node/input/time/timeinput.cpp +++ b/app/node/input/time/timeinput.cpp @@ -41,7 +41,7 @@ QString TimeInput::id() const return QStringLiteral("org.olivevideoeditor.Olive.time"); } -QList TimeInput::Category() const +QVector TimeInput::Category() const { return {kCategoryInput}; } diff --git a/app/node/input/time/timeinput.h b/app/node/input/time/timeinput.h index e79d1b333..d41492942 100644 --- a/app/node/input/time/timeinput.h +++ b/app/node/input/time/timeinput.h @@ -35,7 +35,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual NodeValueTable Value(NodeValueDatabase& value) const override; diff --git a/app/node/math/math/math.cpp b/app/node/math/math/math.cpp index 9330d64d3..fc43f7010 100644 --- a/app/node/math/math/math.cpp +++ b/app/node/math/math/math.cpp @@ -55,7 +55,7 @@ QString MathNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.math"); } -QList MathNode::Category() const +QVector MathNode::Category() const { return {kCategoryMath}; } diff --git a/app/node/math/math/math.h b/app/node/math/math/math.h index 81e5111b1..97edcdf0b 100644 --- a/app/node/math/math/math.h +++ b/app/node/math/math/math.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/math/merge/merge.cpp b/app/node/math/merge/merge.cpp index c9a53dc54..6b7ab17a6 100644 --- a/app/node/math/merge/merge.cpp +++ b/app/node/math/merge/merge.cpp @@ -46,7 +46,7 @@ QString MergeNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.merge"); } -QList MergeNode::Category() const +QVector MergeNode::Category() const { return {kCategoryMath}; } diff --git a/app/node/math/merge/merge.h b/app/node/math/merge/merge.h index 70f79369b..57182caaf 100644 --- a/app/node/math/merge/merge.h +++ b/app/node/math/merge/merge.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/math/trigonometry/trigonometry.cpp b/app/node/math/trigonometry/trigonometry.cpp index c2f0d03ff..a8649ff64 100644 --- a/app/node/math/trigonometry/trigonometry.cpp +++ b/app/node/math/trigonometry/trigonometry.cpp @@ -48,7 +48,7 @@ QString TrigonometryNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.trigonometry"); } -QList TrigonometryNode::Category() const +QVector TrigonometryNode::Category() const { return {kCategoryMath}; } diff --git a/app/node/math/trigonometry/trigonometry.h b/app/node/math/trigonometry/trigonometry.h index 9af68472f..b1524616a 100644 --- a/app/node/math/trigonometry/trigonometry.h +++ b/app/node/math/trigonometry/trigonometry.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/node.cpp b/app/node/node.cpp index c1b90e950..c531f3c14 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -265,12 +265,12 @@ void Node::SaveInternal(QXmlStreamWriter *) const { } -QList Node::GetInputsToHash() const +QVector Node::GetInputsToHash() const { return GetInputsIncludingArrays(); } -void GetInputsIncludingArraysInternal(NodeInputArray* array, QList& list) +void GetInputsIncludingArraysInternal(NodeInputArray* array, QVector& list) { foreach (NodeInput* input, array->sub_params()) { list.append(input); @@ -281,9 +281,9 @@ void GetInputsIncludingArraysInternal(NodeInputArray* array, QList& } } -QList Node::GetInputsIncludingArrays() const +QVector Node::GetInputsIncludingArrays() const { - QList inputs; + QVector inputs; foreach (NodeParam* param, params_) { if (param->type() == NodeParam::kInput) { @@ -300,7 +300,7 @@ QList Node::GetInputsIncludingArrays() const return inputs; } -QList Node::GetOutputs() const +QVector Node::GetOutputs() const { // The current design only uses one output per node. This function returns a list just in case that changes. return {output_}; @@ -347,7 +347,7 @@ void Node::Hash(QCryptographicHash &hash, const rational& time) const // Add this Node's ID hash.addData(id().toUtf8()); - QList inputs = GetInputsToHash(); + QVector inputs = GetInputsToHash(); foreach (NodeInput* input, inputs) { // For each input, try to hash its value @@ -416,8 +416,8 @@ void Node::CopyInputs(Node *source, Node *destination, bool include_connections) { Q_ASSERT(source->id() == destination->id()); - const QList& src_param = source->params_; - const QList& dst_param = destination->params_; + const QVector& src_param = source->params_; + const QVector& dst_param = destination->params_; for (int i=0;i& Node::parameters() const +const QVector& Node::parameters() const { return params_; } @@ -478,9 +478,9 @@ int Node::IndexOfParameter(NodeParam *param) const * TRUE to recursively traverse each node for a complete dependency graph. FALSE to return only the immediate * dependencies. */ -QList Node::GetDependenciesInternal(bool traverse, bool exclusive_only) const { - QList inputs = GetInputsIncludingArrays(); - QList list; +QVector Node::GetDependenciesInternal(bool traverse, bool exclusive_only) const { + QVector inputs = GetInputsIncludingArrays(); + QVector list; foreach (NodeInput* i, inputs) { i->GetDependencies(list, traverse, exclusive_only); @@ -489,17 +489,17 @@ QList Node::GetDependenciesInternal(bool traverse, bool exclusive_only) c return list; } -QList Node::GetDependencies() const +QVector Node::GetDependencies() const { return GetDependenciesInternal(true, false); } -QList Node::GetExclusiveDependencies() const +QVector Node::GetExclusiveDependencies() const { return GetDependenciesInternal(true, true); } -QList Node::GetImmediateDependencies() const +QVector Node::GetImmediateDependencies() const { return GetDependenciesInternal(false, false); } @@ -523,7 +523,7 @@ void Node::GenerateFrame(FramePtr frame, const GenerateJob &job) const NodeInput *Node::GetInputWithID(const QString &id) const { - QList inputs = GetInputsIncludingArrays(); + QVector inputs = GetInputsIncludingArrays(); foreach (NodeInput* i, inputs) { if (i->id() == id) { @@ -548,7 +548,7 @@ NodeOutput *Node::GetOutputWithID(const QString &id) const bool Node::OutputsTo(Node *n, bool recursively) const { - QList outputs = GetOutputs(); + QVector outputs = GetOutputs(); foreach (NodeOutput* output, outputs) { foreach (NodeEdgePtr edge, output->edges()) { @@ -567,7 +567,7 @@ bool Node::OutputsTo(Node *n, bool recursively) const bool Node::OutputsTo(const QString &id, bool recursively) const { - QList outputs = GetOutputs(); + QVector outputs = GetOutputs(); foreach (NodeOutput* output, outputs) { foreach (NodeEdgePtr edge, output->edges()) { @@ -586,7 +586,7 @@ bool Node::OutputsTo(const QString &id, bool recursively) const bool Node::OutputsTo(NodeInput *input, bool recursively, bool include_arrays) const { - QList outputs = GetOutputs(); + QVector outputs = GetOutputs(); foreach (NodeOutput* output, outputs) { foreach (NodeEdgePtr edge, output->edges()) { @@ -608,7 +608,7 @@ bool Node::OutputsTo(NodeInput *input, bool recursively, bool include_arrays) co bool Node::InputsFrom(Node *n, bool recursively) const { - QList inputs = GetInputsIncludingArrays(); + QVector inputs = GetInputsIncludingArrays(); foreach (NodeInput* input, inputs) { foreach (NodeEdgePtr edge, input->edges()) { @@ -627,7 +627,7 @@ bool Node::InputsFrom(Node *n, bool recursively) const bool Node::InputsFrom(const QString &id, bool recursively) const { - QList inputs = GetInputsIncludingArrays(); + QVector inputs = GetInputsIncludingArrays(); foreach (NodeInput* input, inputs) { foreach (NodeEdgePtr edge, input->edges()) { @@ -649,7 +649,7 @@ int Node::GetRoutesTo(Node *n) const bool outputs_directly = false; int routes = 0; - QList outputs = GetOutputs(); + QVector outputs = GetOutputs(); foreach (NodeOutput* o, outputs) { foreach (NodeEdgePtr edge, o->edges()) { @@ -728,13 +728,13 @@ QString Node::GetCategoryName(const CategoryID &c) return tr("Uncategorized"); } -QList Node::TransformTimeTo(const TimeRange &time, Node *target, NodeParam::Type direction) +QVector Node::TransformTimeTo(const TimeRange &time, Node *target, NodeParam::Type direction) { - QList paths_found; + QVector paths_found; if (direction == NodeParam::kInput) { // Get list of all inputs - QList inputs = GetInputsIncludingArrays(); + QVector inputs = GetInputsIncludingArrays(); // If this input is connected, traverse it to see if we stumble across the specified `node` foreach (NodeInput* input, inputs) { @@ -755,7 +755,7 @@ QList Node::TransformTimeTo(const TimeRange &time, Node *target, Node } } else { // Get list of all outputs - QList outputs = GetOutputs(); + QVector outputs = GetOutputs(); // If this input is connected, traverse it to see if we stumble across the specified `node` foreach (NodeOutput* output, outputs) { diff --git a/app/node/node.h b/app/node/node.h index 6da128f51..003b3911d 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -132,7 +132,7 @@ public: * interpreted as an empty string category. This value should be run through a translator as its largely user * oriented. */ - virtual QList Category() const = 0; + virtual QVector Category() const = 0; /** * @brief Return a description of this node's purpose (optional for subclassing, but recommended) @@ -150,7 +150,7 @@ public: /** * @brief Return a list of NodeParams */ - const QList& parameters() const; + const QVector& parameters() const; /** * @brief Return the index of a parameter @@ -161,7 +161,7 @@ public: /** * @brief Return a list of all Nodes that this Node's inputs are connected to (does not include this Node) */ - QList GetDependencies() const; + QVector GetDependencies() const; /** * @brief Returns a list of Nodes that this Node is dependent on, provided no other Nodes are dependent on them @@ -169,12 +169,12 @@ public: * * Similar to GetDependencies(), but excludes any Nodes that are used outside the dependency graph of this Node. */ - QList GetExclusiveDependencies() const; + QVector GetExclusiveDependencies() const; /** * @brief Retrieve immediate dependencies (only nodes that are directly connected to the inputs of this one) */ - QList GetImmediateDependencies() const; + QVector GetImmediateDependencies() const; /** * @brief Generate hardware accelerated code for this Node @@ -277,19 +277,19 @@ public: /** * @brief Transforms time from this node through the connections it takes to get to the specified node */ - QList TransformTimeTo(const TimeRange& time, Node* target, NodeParam::Type direction); + QVector TransformTimeTo(const TimeRange& time, Node* target, NodeParam::Type direction); /** * @brief Find nodes of a certain type that this Node takes inputs from */ template - QList FindInputNodes() const; + QVector FindInputNodes() const; template /** * @brief Find a node of a certain type that this Node outputs to */ - QList FindOutputNode(); + QVector FindOutputNode(); /** * @brief Convert a pointer to a value that can be sent between NodeParams @@ -407,9 +407,9 @@ public: void SetPosition(const QPointF& pos); - QList GetInputsIncludingArrays() const; + QVector GetInputsIncludingArrays() const; - QList GetOutputs() const; + QVector GetOutputs() const; virtual bool HasGizmos() const; @@ -435,7 +435,7 @@ protected: virtual void SaveInternal(QXmlStreamWriter* writer) const; - virtual QList GetInputsToHash() const; + virtual QVector GetInputsToHash() const; protected slots: void InputChanged(const OLIVE_NAMESPACE::TimeRange &range); @@ -488,14 +488,14 @@ private: void DisconnectInput(NodeInput* input); template - static void FindInputNodeInternal(const Node* n, QList& list); + static void FindInputNodeInternal(const Node* n, QVector& list); template - static void FindOutputNodeInternal(const Node* n, QList& list); + static void FindOutputNodeInternal(const Node* n, QVector& list); - QList GetDependenciesInternal(bool traverse, bool exclusive_only) const; + QVector GetDependenciesInternal(bool traverse, bool exclusive_only) const; - QList params_; + QVector params_; /** * @brief Internal variable for whether this Node can be deleted or not @@ -520,9 +520,9 @@ private: }; template -void Node::FindInputNodeInternal(const Node* n, QList& list) +void Node::FindInputNodeInternal(const Node* n, QVector &list) { - QList inputs = n->GetInputsIncludingArrays(); + QVector inputs = n->GetInputsIncludingArrays(); foreach (NodeInput* input, inputs) { if (input->is_connected()) { @@ -539,9 +539,9 @@ void Node::FindInputNodeInternal(const Node* n, QList& list) } template -QList Node::FindInputNodes() const +QVector Node::FindInputNodes() const { - QList list; + QVector list; FindInputNodeInternal(this, list); @@ -555,7 +555,7 @@ T* Node::ValueToPtr(const QVariant &ptr) } template -void Node::FindOutputNodeInternal(const Node* n, QList& list) { +void Node::FindOutputNodeInternal(const Node* n, QVector& list) { foreach (NodeEdgePtr edge, n->output()->edges()) { Node* connected = edge->input()->parentNode(); T* cast_test = dynamic_cast(connected); @@ -569,9 +569,9 @@ void Node::FindOutputNodeInternal(const Node* n, QList& list) { } template -QList Node::FindOutputNode() +QVector Node::FindOutputNode() { - QList list; + QVector list; FindOutputNodeInternal(this, list); diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index 1cd8de5f9..09bb92615 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -85,7 +85,7 @@ QString TrackOutput::id() const return QStringLiteral("org.olivevideoeditor.Olive.track"); } -QList TrackOutput::Category() const +QVector TrackOutput::Category() const { return {kCategoryTimeline}; } diff --git a/app/node/output/track/track.h b/app/node/output/track/track.h index b498f4b68..06296c513 100644 --- a/app/node/output/track/track.h +++ b/app/node/output/track/track.h @@ -45,7 +45,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; const double& GetTrackHeight() const; diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index b6a4753ef..b2917546d 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -82,7 +82,7 @@ QString ViewerOutput::id() const return QStringLiteral("org.olivevideoeditor.Olive.vieweroutput"); } -QList ViewerOutput::Category() const +QVector ViewerOutput::Category() const { return {kCategoryOutput}; } diff --git a/app/node/output/viewer/viewer.h b/app/node/output/viewer/viewer.h index 94185f2ac..3113c2eae 100644 --- a/app/node/output/viewer/viewer.h +++ b/app/node/output/viewer/viewer.h @@ -53,7 +53,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QList Category() const override; + virtual QVector Category() const override; virtual QString Description() const override; void ShiftVideoCache(const rational& from, const rational& to); diff --git a/app/node/traverser.cpp b/app/node/traverser.cpp index 1994d8fd5..fd6593417 100644 --- a/app/node/traverser.cpp +++ b/app/node/traverser.cpp @@ -29,7 +29,7 @@ NodeValueDatabase NodeTraverser::GenerateDatabase(const Node* node, const TimeRa NodeValueDatabase database; // We need to insert tables into the database for each input - QList inputs = node->GetInputsIncludingArrays(); + QVector inputs = node->GetInputsIncludingArrays(); foreach (NodeInput* input, inputs) { if (IsCancelled()) { diff --git a/app/panel/curve/curve.cpp b/app/panel/curve/curve.cpp index fd6e418ae..8625f111b 100644 --- a/app/panel/curve/curve.cpp +++ b/app/panel/curve/curve.cpp @@ -37,7 +37,7 @@ void CurvePanel::DeleteSelected() static_cast(GetTimeBasedWidget())->DeleteSelected(); } -void CurvePanel::SetNodes(const QList &nodes) +void CurvePanel::SetNodes(const QVector &nodes) { static_cast(GetTimeBasedWidget())->SetNodes(nodes); } diff --git a/app/panel/curve/curve.h b/app/panel/curve/curve.h index 375c42822..52903dbf0 100644 --- a/app/panel/curve/curve.h +++ b/app/panel/curve/curve.h @@ -35,7 +35,7 @@ public: virtual void DeleteSelected() override; public slots: - void SetNodes(const QList& nodes); + void SetNodes(const QVector &nodes); virtual void IncreaseTrackHeight() override; diff --git a/app/panel/node/node.h b/app/panel/node/node.h index 8580b7c1e..cba87c52c 100644 --- a/app/panel/node/node.h +++ b/app/panel/node/node.h @@ -76,30 +76,30 @@ public: } public slots: - void Select(const QList& nodes) + void Select(const QVector& nodes) { node_view_->Select(nodes); } - void SelectWithDependencies(const QList& nodes) + void SelectWithDependencies(const QVector& nodes) { node_view_->SelectWithDependencies(nodes); } - void SelectBlocks(const QList& nodes) + void SelectBlocks(const QVector& nodes) { node_view_->SelectBlocks(nodes); } - void DeselectBlocks(const QList& nodes) + void DeselectBlocks(const QVector& nodes) { node_view_->DeselectBlocks(nodes); } signals: - void NodesSelected(const QList& nodes); + void NodesSelected(const QVector& nodes); - void NodesDeselected(const QList& nodes); + void NodesDeselected(const QVector& nodes); private: virtual void Retranslate() override diff --git a/app/panel/param/param.cpp b/app/panel/param/param.cpp index 2b9df7f4c..68ae7525a 100644 --- a/app/panel/param/param.cpp +++ b/app/panel/param/param.cpp @@ -36,14 +36,14 @@ ParamPanel::ParamPanel(QWidget* parent) : Retranslate(); } -void ParamPanel::SelectNodes(const QList &nodes) +void ParamPanel::SelectNodes(const QVector &nodes) { static_cast(GetTimeBasedWidget())->SelectNodes(nodes); Retranslate(); } -void ParamPanel::DeselectNodes(const QList &nodes) +void ParamPanel::DeselectNodes(const QVector &nodes) { static_cast(GetTimeBasedWidget())->DeselectNodes(nodes); diff --git a/app/panel/param/param.h b/app/panel/param/param.h index 3c4f15354..de7a67967 100644 --- a/app/panel/param/param.h +++ b/app/panel/param/param.h @@ -34,15 +34,15 @@ public: ParamPanel(QWidget* parent); public slots: - void SelectNodes(const QList& nodes); - void DeselectNodes(const QList& nodes); + void SelectNodes(const QVector& nodes); + void DeselectNodes(const QVector& nodes); virtual void DeleteSelected() override; signals: - void RequestSelectNode(const QList& target); + void RequestSelectNode(const QVector& target); - void NodeOrderChanged(const QList& nodes); + void NodeOrderChanged(const QVector& nodes); void FocusedNodeChanged(Node* n); diff --git a/app/panel/table/table.h b/app/panel/table/table.h index 85c6ea888..10e2bc338 100644 --- a/app/panel/table/table.h +++ b/app/panel/table/table.h @@ -33,12 +33,12 @@ public: NodeTablePanel(QWidget* parent); public slots: - void SelectNodes(const QList& nodes) + void SelectNodes(const QVector& nodes) { static_cast(GetTimeBasedWidget())->SelectNodes(nodes); } - void DeselectNodes(const QList& nodes) + void DeselectNodes(const QVector& nodes) { static_cast(GetTimeBasedWidget())->DeselectNodes(nodes); } diff --git a/app/panel/timeline/timeline.h b/app/panel/timeline/timeline.h index b05f7b8bc..30bab181a 100644 --- a/app/panel/timeline/timeline.h +++ b/app/panel/timeline/timeline.h @@ -91,9 +91,9 @@ protected: virtual void Retranslate() override; signals: - void BlocksSelected(const QList& selected_blocks); + void BlocksSelected(const QVector& selected_blocks); - void BlocksDeselected(const QList& deselected_blocks); + void BlocksDeselected(const QVector& deselected_blocks); }; diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 9e5902e19..9091b720b 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -453,7 +453,7 @@ void PreviewAutoCacher::CopyNodeInputValue(NodeInput *input) // disconnecting whatever was connected to it // We start by removing all old dependencies from the map - QList old_deps = our_copy->GetExclusiveDependencies(); + QVector old_deps = our_copy->GetExclusiveDependencies(); foreach (Node* i, old_deps) { copy_map_.take(copy_map_.key(i))->deleteLater(); } @@ -496,8 +496,8 @@ Node* PreviewAutoCacher::CopyNodeConnections(Node* src_node) Node::CopyInputs(src_node, dst_node, false); // Copy all connections - QList src_node_inputs = src_node->GetInputsIncludingArrays(); - QList dst_node_inputs = dst_node->GetInputsIncludingArrays(); + QVector src_node_inputs = src_node->GetInputsIncludingArrays(); + QVector dst_node_inputs = dst_node->GetInputsIncludingArrays(); for (int i=0;iset_source_range(opentimelineio::v1_0::TimeRange(block->in().toRationalTime(), block->length().toRationalTime())); - QList media_nodes = block->FindInputNodes(); + QVector media_nodes = block->FindInputNodes(); if (!media_nodes.isEmpty()) { auto media_ref = new opentimelineio::v1_0::ExternalReference(media_nodes.first()->stream()->footage()->filename().toStdString()); otio_clip->set_media_reference(media_ref); diff --git a/app/widget/curvewidget/curveview.cpp b/app/widget/curvewidget/curveview.cpp index a9b43d4a9..c1ece5146 100644 --- a/app/widget/curvewidget/curveview.cpp +++ b/app/widget/curvewidget/curveview.cpp @@ -89,7 +89,7 @@ void CurveView::ConnectInput(NodeInput *input) void CurveView::DisconnectNode(Node *node) { - QList inputs = node->GetInputsIncludingArrays(); + QVector inputs = node->GetInputsIncludingArrays(); foreach (NodeInput* i, inputs) { DisconnectInput(i); diff --git a/app/widget/curvewidget/curvewidget.cpp b/app/widget/curvewidget/curvewidget.cpp index 41d2a88ef..7a80a8dfc 100644 --- a/app/widget/curvewidget/curvewidget.cpp +++ b/app/widget/curvewidget/curvewidget.cpp @@ -131,7 +131,7 @@ void CurveWidget::DeleteSelected() view_->DeleteSelected(); } -void CurveWidget::SetNodes(const QList &nodes) +void CurveWidget::SetNodes(const QVector &nodes) { tree_view_->SetNodes(nodes); @@ -216,7 +216,7 @@ void CurveWidget::UpdateBridgeTime(const int64_t ×tamp) void CurveWidget::ConnectNode(Node *n) { - QList inputs = n->GetInputsIncludingArrays(); + QVector inputs = n->GetInputsIncludingArrays(); foreach (NodeInput* i, inputs) { if (tree_view_->IsInputEnabled(i)) { diff --git a/app/widget/curvewidget/curvewidget.h b/app/widget/curvewidget/curvewidget.h index 253ca6a71..530da8ac2 100644 --- a/app/widget/curvewidget/curvewidget.h +++ b/app/widget/curvewidget/curvewidget.h @@ -49,7 +49,7 @@ public: void DeleteSelected(); public slots: - void SetNodes(const QList& nodes); + void SetNodes(const QVector &nodes); protected: virtual void TimeChangedEvent(const int64_t &) override; @@ -85,9 +85,7 @@ private: NodeParamViewKeyframeControl* key_control_; - QList checkboxes_; - - QList nodes_; + QVector nodes_; private slots: void SelectionChanged(); diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index b53a0c236..80c27fd91 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -76,7 +76,7 @@ void KeyframeViewBase::DeleteSelected() void KeyframeViewBase::RemoveKeyframesOfNode(Node *n) { - QList inputs = n->GetInputsIncludingArrays(); + QVector inputs = n->GetInputsIncludingArrays(); foreach (NodeInput* i, inputs) { RemoveKeyframesOfInput(i); diff --git a/app/widget/nodecopypaste/nodecopypaste.cpp b/app/widget/nodecopypaste/nodecopypaste.cpp index 914e9f32c..a35db606f 100644 --- a/app/widget/nodecopypaste/nodecopypaste.cpp +++ b/app/widget/nodecopypaste/nodecopypaste.cpp @@ -29,7 +29,7 @@ OLIVE_NAMESPACE_ENTER -void NodeCopyPasteWidget::CopyNodesToClipboard(const QList &nodes, void *userdata) +void NodeCopyPasteWidget::CopyNodesToClipboard(const QVector &nodes, void *userdata) { QString copy_str; @@ -56,17 +56,17 @@ void NodeCopyPasteWidget::CopyNodesToClipboard(const QList &nodes, void Core::CopyStringToClipboard(copy_str); } -QList NodeCopyPasteWidget::PasteNodesFromClipboard(Sequence *graph, QUndoCommand* command, void *userdata) +QVector NodeCopyPasteWidget::PasteNodesFromClipboard(Sequence *graph, QUndoCommand* command, void *userdata) { QString clipboard = Core::PasteStringFromClipboard(); if (clipboard.isEmpty()) { - return QList(); + return QVector(); } QXmlStreamReader reader(clipboard); - QList pasted_nodes; + QVector pasted_nodes; XMLNodeData xml_node_data; while (XMLReadNextStartElement(&reader)) { @@ -100,7 +100,7 @@ QList NodeCopyPasteWidget::PasteNodesFromClipboard(Sequence *graph, QUnd if (pasted_nodes.isEmpty()) { // If we passed through the whole string and there were no nodes, it must not be data for us after all - return QList(); + return QVector(); } // If we have some nodes AND the XML data was malformed, the user should probably know @@ -116,7 +116,7 @@ QList NodeCopyPasteWidget::PasteNodesFromClipboard(Sequence *graph, QUnd QCoreApplication::translate("NodeCopyPasteWidget", "Failed to paste nodes: %1").arg(reader.errorString()), QMessageBox::Ok); - return QList(); + return QVector(); } // Add all nodes to graph diff --git a/app/widget/nodecopypaste/nodecopypaste.h b/app/widget/nodecopypaste/nodecopypaste.h index 9791ae99f..0691692ef 100644 --- a/app/widget/nodecopypaste/nodecopypaste.h +++ b/app/widget/nodecopypaste/nodecopypaste.h @@ -35,9 +35,9 @@ public: NodeCopyPasteWidget() = default; protected: - void CopyNodesToClipboard(const QList& nodes, void* userdata = nullptr); + void CopyNodesToClipboard(const QVector &nodes, void* userdata = nullptr); - QList PasteNodesFromClipboard(Sequence *graph, QUndoCommand *command, void* userdata = nullptr); + QVector PasteNodesFromClipboard(Sequence *graph, QUndoCommand *command, void* userdata = nullptr); virtual void CopyNodesToClipboardInternal(QXmlStreamWriter *writer, void* userdata); diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index b07031ea6..5cdc32452 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -135,7 +135,7 @@ NodeParamView::NodeParamView(QWidget *parent) : &NodeParamView::FocusChanged); } -void NodeParamView::SelectNodes(const QList &nodes) +void NodeParamView::SelectNodes(const QVector &nodes) { active_nodes_.append(nodes); @@ -185,7 +185,7 @@ void NodeParamView::SelectNodes(const QList &nodes) } } -void NodeParamView::DeselectNodes(const QList &nodes) +void NodeParamView::DeselectNodes(const QVector &nodes) { // Remove item from map and delete the widget bool changes_made = false; @@ -283,8 +283,8 @@ void NodeParamView::QueueKeyframePositionUpdate() void NodeParamView::SignalNodeOrder() { // Sort by item Y (apparently there's no way in Qt to get the order of dock widgets) - QList nodes; - QList item_ys; + QVector nodes; + QVector item_ys; for (auto it=items_.cbegin(); it!=items_.cend(); it++) { int item_y = it.value()->pos().y(); diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index f9fee45db..a8e43b0bb 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -60,8 +60,8 @@ class NodeParamView : public TimeBasedWidget public: NodeParamView(QWidget* parent = nullptr); - void SelectNodes(const QList& nodes); - void DeselectNodes(const QList& nodes); + void SelectNodes(const QVector &nodes); + void DeselectNodes(const QVector& nodes); const QMap& GetItemMap() const { @@ -75,9 +75,9 @@ public: signals: void InputDoubleClicked(NodeInput* input); - void RequestSelectNode(const QList& target); + void RequestSelectNode(const QVector& target); - void NodeOrderChanged(const QList& nodes); + void NodeOrderChanged(const QVector& nodes); void FocusedNodeChanged(Node* n); @@ -113,9 +113,9 @@ private: // docking windows QMainWindow* param_widget_area_; - QList pinned_nodes_; + QVector pinned_nodes_; - QList active_nodes_; + QVector active_nodes_; QMap node_expanded_state_; diff --git a/app/widget/nodeparamview/nodeparamviewitem.h b/app/widget/nodeparamview/nodeparamviewitem.h index 2bc8972fa..4731ef782 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.h +++ b/app/widget/nodeparamview/nodeparamviewitem.h @@ -91,7 +91,7 @@ signals: void InputDoubleClicked(NodeInput* input); - void RequestSelectNode(const QList& node); + void RequestSelectNode(const QVector& node); private: void UpdateUIForEdgeConnection(NodeInput* input); @@ -161,7 +161,7 @@ signals: void InputDoubleClicked(NodeInput* input); - void RequestSelectNode(const QList& node); + void RequestSelectNode(const QVector& node); void PinToggled(bool e); diff --git a/app/widget/nodetableview/nodetableview.cpp b/app/widget/nodetableview/nodetableview.cpp index 4f5116b7f..80f6b8fd4 100644 --- a/app/widget/nodetableview/nodetableview.cpp +++ b/app/widget/nodetableview/nodetableview.cpp @@ -40,7 +40,7 @@ NodeTableView::NodeTableView(QWidget* parent) : tr("A/W")}); } -void NodeTableView::SelectNodes(const QList &nodes) +void NodeTableView::SelectNodes(const QVector &nodes) { foreach (Node* n, nodes) { QTreeWidgetItem* top_item = new QTreeWidgetItem(); @@ -53,7 +53,7 @@ void NodeTableView::SelectNodes(const QList &nodes) SetTime(last_time_); } -void NodeTableView::DeselectNodes(const QList &nodes) +void NodeTableView::DeselectNodes(const QVector &nodes) { foreach (Node* n, nodes) { delete top_level_item_map_.take(n); diff --git a/app/widget/nodetableview/nodetableview.h b/app/widget/nodetableview/nodetableview.h index 7aa6e3eeb..de5d920d3 100644 --- a/app/widget/nodetableview/nodetableview.h +++ b/app/widget/nodetableview/nodetableview.h @@ -32,9 +32,9 @@ class NodeTableView : public QTreeWidget public: NodeTableView(QWidget* parent = nullptr); - void SelectNodes(const QList& nodes); + void SelectNodes(const QVector &nodes); - void DeselectNodes(const QList& nodes); + void DeselectNodes(const QVector& nodes); void SetTime(const rational& time); diff --git a/app/widget/nodetableview/nodetablewidget.h b/app/widget/nodetableview/nodetablewidget.h index 1eeecbfcb..2b499b629 100644 --- a/app/widget/nodetableview/nodetablewidget.h +++ b/app/widget/nodetableview/nodetablewidget.h @@ -31,12 +31,12 @@ class NodeTableWidget : public TimeBasedWidget public: NodeTableWidget(QWidget* parent = nullptr); - void SelectNodes(const QList& nodes) + void SelectNodes(const QVector& nodes) { view_->SelectNodes(nodes); } - void DeselectNodes(const QList& nodes) + void DeselectNodes(const QVector& nodes) { view_->DeselectNodes(nodes); } diff --git a/app/widget/nodetreeview/nodetreeview.cpp b/app/widget/nodetreeview/nodetreeview.cpp index b02a707d9..324dd78c8 100644 --- a/app/widget/nodetreeview/nodetreeview.cpp +++ b/app/widget/nodetreeview/nodetreeview.cpp @@ -21,7 +21,7 @@ bool NodeTreeView::IsInputEnabled(NodeInput *i) const return !disabled_inputs_.contains(i); } -void NodeTreeView::SetNodes(const QList &nodes) +void NodeTreeView::SetNodes(const QVector &nodes) { nodes_ = nodes; @@ -34,7 +34,7 @@ void NodeTreeView::SetNodes(const QList &nodes) node_item->setData(0, kItemType, kItemTypeNode); node_item->setData(0, kItemPointer, reinterpret_cast(n)); - QList inputs = n->GetInputsIncludingArrays(); + QVector inputs = n->GetInputsIncludingArrays(); foreach (NodeInput* i, inputs) { if (only_show_keyframable_ && !i->is_keyframable()) { continue; diff --git a/app/widget/nodetreeview/nodetreeview.h b/app/widget/nodetreeview/nodetreeview.h index 2b221a68c..65d87bbda 100644 --- a/app/widget/nodetreeview/nodetreeview.h +++ b/app/widget/nodetreeview/nodetreeview.h @@ -23,7 +23,7 @@ public: } public slots: - void SetNodes(const QList& nodes); + void SetNodes(const QVector &nodes); signals: void NodeEnableChanged(Node* n, bool e); @@ -44,11 +44,11 @@ private: static const int kItemType = Qt::UserRole; static const int kItemPointer = Qt::UserRole + 1; - QList nodes_; + QVector nodes_; - QList disabled_nodes_; + QVector disabled_nodes_; - QList disabled_inputs_; + QVector disabled_inputs_; bool only_show_keyframable_; diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index d3cfdd3b9..2f40b1aa3 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -115,7 +115,7 @@ void NodeView::DeleteSelected() QUndoCommand* command = new QUndoCommand(); { - QList selected_edges = scene_.GetSelectedEdges(); + QVector selected_edges = scene_.GetSelectedEdges(); foreach (NodeEdge* edge, selected_edges) { new NodeEdgeRemoveCommand(edge->output(), edge->input(), command); @@ -124,7 +124,7 @@ void NodeView::DeleteSelected() } { - QList selected_nodes = scene_.GetSelectedNodes(); + QVector selected_nodes = scene_.GetSelectedNodes(); // Ensure no nodes are "undeletable" for (int i=0;i &nodes) +void NodeView::Select(const QVector &nodes) { if (!graph_) { return; @@ -188,7 +188,7 @@ void NodeView::Select(const QList &nodes) SceneSelectionChangedSlot(); } -void NodeView::SelectWithDependencies(QList nodes) +void NodeView::SelectWithDependencies(QVector nodes) { if (!graph_) { return; @@ -202,7 +202,7 @@ void NodeView::SelectWithDependencies(QList nodes) Select(nodes); } -void NodeView::SelectBlocks(const QList &blocks) +void NodeView::SelectBlocks(const QVector &blocks) { if (!graph_) { return; @@ -213,7 +213,7 @@ void NodeView::SelectBlocks(const QList &blocks) QueueSelectBlocksInternal(); } -void NodeView::DeselectBlocks(const QList &blocks) +void NodeView::DeselectBlocks(const QVector &blocks) { if (!graph_) { return; @@ -240,7 +240,7 @@ void NodeView::CopySelected(bool cut) return; } - QList selected = scene_.GetSelectedNodes(); + QVector selected = scene_.GetSelectedNodes(); if (selected.isEmpty()) { return; @@ -261,7 +261,7 @@ void NodeView::Paste() QUndoCommand* command = new QUndoCommand(); - QList pasted_nodes = PasteNodesFromClipboard(static_cast(graph_), command); + QVector pasted_nodes = PasteNodesFromClipboard(static_cast(graph_), command); Core::instance()->undo_stack()->pushIfHasChildren(command); @@ -280,7 +280,7 @@ void NodeView::Duplicate() return; } - QList selected = scene_.GetSelectedNodes(); + QVector selected = scene_.GetSelectedNodes(); if (selected.isEmpty()) { return; @@ -488,10 +488,10 @@ void NodeView::wheelEvent(QWheelEvent *event) void NodeView::SceneSelectionChangedSlot() { - QList current_selection = scene_.GetSelectedNodes(); + QVector current_selection = scene_.GetSelectedNodes(); - QList selected; - QList deselected; + QVector selected; + QVector deselected; // Determine which nodes are newly selected if (selected_nodes_.isEmpty()) { @@ -540,7 +540,7 @@ void NodeView::ShowContextMenu(const QPoint &pos) m.addSeparator(); - QList selected = scene_.GetSelectedItems(); + QVector selected = scene_.GetSelectedItems(); if (itemAt(pos) && !selected.isEmpty()) { @@ -636,7 +636,7 @@ void NodeView::ContextMenuSetDirection(QAction *action) void NodeView::AutoPositionDescendents() { - QList selected = scene_.GetSelectedNodes(); + QVector selected = scene_.GetSelectedNodes(); foreach (Node* n, selected) { scene_.ReorganizeFrom(n); @@ -665,18 +665,18 @@ void NodeView::ContextMenuFilterChanged(QAction *action) } } -void NodeView::AttachNodesToCursor(const QList &nodes) +void NodeView::AttachNodesToCursor(const QVector &nodes) { - QList items; + QVector items(nodes.size()); - foreach (Node* p, nodes) { - items.append(scene_.NodeToUIObject(p)); + for (int i=0; i& items) +void NodeView::AttachItemsToCursor(const QVector& items) { DetachItemsFromCursor(); @@ -731,7 +731,7 @@ void NodeView::UpdateBlockFilter() bool first = true; QPointF last_bottom_right; - QList currently_visible; + QVector currently_visible; foreach (Block* b, selected_blocks_) { // Auto-position this node's dependencies @@ -741,7 +741,7 @@ void NodeView::UpdateBlockFilter() QPointF node_pos = b->GetPosition(); QRectF anchor(node_pos, node_pos); - QList deps = b->GetDependencies(); + QVector deps = b->GetDependencies(); foreach (Node* d, deps) { QPointF dep_pos = d->GetPosition(); @@ -779,8 +779,7 @@ void NodeView::UpdateBlockFilter() // ...then add its associations deps.append(temporary_association_map_[b]); - QHash >::const_iterator i; - for (i=association_map_.begin(); i!=association_map_.end(); i++) { + for (auto i=association_map_.begin(); i!=association_map_.end(); i++) { if (i.value().contains(b)) { deps.append(i.key()); } @@ -835,7 +834,7 @@ void NodeView::SelectBlocksInternal() UpdateBlockFilter(); } - QList nodes; + QVector nodes; nodes.reserve(selected_blocks_.size()); foreach (Block* b, selected_blocks_) { @@ -888,7 +887,7 @@ void NodeView::GraphEdgeAdded(NodeEdgePtr edge) Node* input_node = edge->input()->parentNode(); if (input_node->OutputsTo(static_cast(graph_)->viewer_output(), true)) { - QHash >::const_iterator i = association_map_.begin(); + auto i = association_map_.begin(); while (i != association_map_.end()) { if (input_node->InputsFrom(i.key(), true)) { @@ -917,14 +916,14 @@ void NodeView::GraphEdgeRemoved(NodeEdgePtr edge) } } - QList disconnected_nodes; + QVector disconnected_nodes; disconnected_nodes.append(output_node); disconnected_nodes.append(output_node->GetDependencies()); if (output_node->OutputsTo(static_cast(graph_)->viewer_output(), true)) { // Check if this disconnected node still has a path to the viewer somewhere else foreach (Block* b, selected_blocks_) { - QList& temp_assocs = temporary_association_map_[b]; + QVector& temp_assocs = temporary_association_map_[b]; temp_assocs.append(disconnected_nodes); } diff --git a/app/widget/nodeview/nodeview.h b/app/widget/nodeview/nodeview.h index 5bcf7799e..d05c8f899 100644 --- a/app/widget/nodeview/nodeview.h +++ b/app/widget/nodeview/nodeview.h @@ -58,22 +58,22 @@ public: void SelectAll(); void DeselectAll(); - void Select(const QList& nodes); - void SelectWithDependencies(QList nodes); + void Select(const QVector& nodes); + void SelectWithDependencies(QVector nodes); void CopySelected(bool cut); void Paste(); void Duplicate(); - void SelectBlocks(const QList& blocks); + void SelectBlocks(const QVector& blocks); - void DeselectBlocks(const QList& blocks); + void DeselectBlocks(const QVector& blocks); signals: - void NodesSelected(const QList& nodes); + void NodesSelected(const QVector& nodes); - void NodesDeselected(const QList& nodes); + void NodesDeselected(const QVector& nodes); protected: virtual void keyPressEvent(QKeyEvent *event) override; @@ -85,9 +85,9 @@ protected: virtual void wheelEvent(QWheelEvent* event) override; private: - void AttachNodesToCursor(const QList& nodes); + void AttachNodesToCursor(const QVector &nodes); - void AttachItemsToCursor(const QList& items); + void AttachItemsToCursor(const QVector &items); void DetachItemsFromCursor(); @@ -121,13 +121,13 @@ private: NodeViewScene scene_; - QList selected_nodes_; + QVector selected_nodes_; - QList selected_blocks_; + QVector selected_blocks_; - QHash > association_map_; + QHash > association_map_; - QHash > temporary_association_map_; + QHash > temporary_association_map_; enum FilterMode { kFilterShowAll, diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index a36657b7c..1ae231b5d 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -120,10 +120,10 @@ void NodeViewScene::SetGraph(NodeGraph *graph) graph_ = graph; } -QList NodeViewScene::GetSelectedNodes() const +QVector NodeViewScene::GetSelectedNodes() const { QHash::const_iterator iterator; - QList selected; + QVector selected; for (iterator=item_map_.begin();iterator!=item_map_.end();iterator++) { if (iterator.value()->isSelected()) { @@ -134,10 +134,10 @@ QList NodeViewScene::GetSelectedNodes() const return selected; } -QList NodeViewScene::GetSelectedItems() const +QVector NodeViewScene::GetSelectedItems() const { QHash::const_iterator iterator; - QList selected; + QVector selected; for (iterator=item_map_.begin();iterator!=item_map_.end();iterator++) { if (iterator.value()->isSelected()) { @@ -148,9 +148,9 @@ QList NodeViewScene::GetSelectedItems() const return selected; } -QList NodeViewScene::GetSelectedEdges() const +QVector NodeViewScene::GetSelectedEdges() const { - QList edges; + QVector edges; QHash::const_iterator i; @@ -228,7 +228,7 @@ void NodeViewScene::RemoveEdge(NodeEdgePtr edge) int NodeViewScene::DetermineWeight(Node *n) { - QList inputs = n->GetImmediateDependencies(); + QVector inputs = n->GetImmediateDependencies(); int weight = 0; @@ -253,7 +253,7 @@ NodeViewCommon::FlowDirection NodeViewScene::GetFlowDirection() const void NodeViewScene::ReorganizeFrom(Node* n) { - QList immediates = n->GetImmediateDependencies(); + QVector immediates = n->GetImmediateDependencies(); if (immediates.isEmpty()) { // Nothing to do diff --git a/app/widget/nodeview/nodeviewscene.h b/app/widget/nodeview/nodeviewscene.h index 1cb3d1a6c..87128bb3b 100644 --- a/app/widget/nodeview/nodeviewscene.h +++ b/app/widget/nodeview/nodeviewscene.h @@ -63,9 +63,9 @@ public: void SetGraph(NodeGraph* graph); - QList GetSelectedNodes() const; - QList GetSelectedItems() const; - QList GetSelectedEdges() const; + QVector GetSelectedNodes() const; + QVector GetSelectedItems() const; + QVector GetSelectedEdges() const; const QHash& item_map() const; const QHash& edge_map() const; diff --git a/app/widget/nodeview/nodeviewundo.cpp b/app/widget/nodeview/nodeviewundo.cpp index 032cd0bcd..7e5d35170 100644 --- a/app/widget/nodeview/nodeviewundo.cpp +++ b/app/widget/nodeview/nodeviewundo.cpp @@ -131,7 +131,7 @@ Project *NodeAddCommand::GetRelevantProject() const return static_cast(graph_)->project(); } -NodeRemoveCommand::NodeRemoveCommand(NodeGraph *graph, const QList &nodes, QUndoCommand *parent) : +NodeRemoveCommand::NodeRemoveCommand(NodeGraph *graph, const QVector &nodes, QUndoCommand *parent) : UndoCommand(parent), graph_(graph), nodes_(nodes) @@ -197,7 +197,7 @@ Project *NodeRemoveCommand::GetRelevantProject() const NodeRemoveWithExclusiveDeps::NodeRemoveWithExclusiveDeps(NodeGraph *graph, Node *node, QUndoCommand *parent) : UndoCommand(parent) { - QList node_and_its_deps; + QVector node_and_its_deps; node_and_its_deps.append(node); node_and_its_deps.append(node->GetExclusiveDependencies()); diff --git a/app/widget/nodeview/nodeviewundo.h b/app/widget/nodeview/nodeviewundo.h index 6b2854e38..9fc95d717 100644 --- a/app/widget/nodeview/nodeviewundo.h +++ b/app/widget/nodeview/nodeviewundo.h @@ -98,7 +98,7 @@ private: class NodeRemoveCommand : public UndoCommand { public: NodeRemoveCommand(NodeGraph* graph, - const QList& nodes, + const QVector& nodes, QUndoCommand* parent = nullptr); virtual Project* GetRelevantProject() const override; @@ -111,9 +111,9 @@ private: QObject memory_manager_; NodeGraph* graph_; - QList nodes_; - QList edges_; - QList block_unlink_commands_; + QVector nodes_; + QVector edges_; + QVector block_unlink_commands_; }; class NodeRemoveWithExclusiveDeps : public UndoCommand { diff --git a/app/widget/projectexplorer/projectexplorer.cpp b/app/widget/projectexplorer/projectexplorer.cpp index 8a57628c9..e0bdf6ab7 100644 --- a/app/widget/projectexplorer/projectexplorer.cpp +++ b/app/widget/projectexplorer/projectexplorer.cpp @@ -637,12 +637,12 @@ void ProjectExplorer::DeleteSelected() if (msgbox.clickedButton() == delete_clip_btn) { // Delete any blocks that use this footage - QList blocks_to_remove; + QVector blocks_to_remove; foreach (Sequence* s, used_in_sequences) { foreach (TrackOutput* track, s->viewer_output()->GetTracks()) { foreach (Block* b, track->Blocks()) { - QList deps = b->GetDependencies(); + QVector deps = b->GetDependencies(); foreach (MediaInput* i, footage_nodes) { if (deps.contains(i)) { diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 68e39e7cb..bc48f0172 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -362,7 +362,7 @@ rational TimelineWidget::GetToolTipTimebase() const void TimelineWidget::SelectAll() { - QList newly_selected_blocks; + QVector newly_selected_blocks; for (auto it=block_items_.cbegin(); it!=block_items_.cend(); it++) { if (!selected_blocks_.contains(it.key())) { @@ -414,7 +414,7 @@ void TimelineWidget::SplitAtPlayhead() rational playhead_time = Timecode::timestamp_to_time(GetTimestamp(), timebase()); - QList selected_blocks = GetSelectedBlocks(); + QVector selected_blocks = GetSelectedBlocks(); // Prioritize blocks that are selected and overlap the playhead QVector blocks_to_split; @@ -459,7 +459,7 @@ void TimelineWidget::SplitAtPlayhead() } } -void TimelineWidget::ReplaceBlocksWithGaps(const QList &blocks, +void TimelineWidget::ReplaceBlocksWithGaps(const QVector &blocks, bool remove_from_graph, QUndoCommand *command) { @@ -482,8 +482,8 @@ void TimelineWidget::ReplaceBlocksWithGaps(const QList &blocks, void TimelineWidget::DeleteSelected(bool ripple) { - QList selected_list = GetSelectedBlocks(); - QList blocks_to_delete; + QVector selected_list = GetSelectedBlocks(); + QVector blocks_to_delete; foreach (TimelineViewBlockItem* item, selected_list) { Block* b = item->block(); @@ -498,8 +498,8 @@ void TimelineWidget::DeleteSelected(bool ripple) QUndoCommand* command = new QUndoCommand(); - QList clips_to_delete; - QList transitions_to_delete; + QVector clips_to_delete; + QVector transitions_to_delete; foreach (Block* b, blocks_to_delete) { if (b->type() == Block::kClip) { @@ -580,9 +580,9 @@ void TimelineWidget::OverwriteFootageAtPlayhead(const QList &footage) void TimelineWidget::ToggleLinksOnSelected() { - QList sel = GetSelectedBlocks(); + QVector sel = GetSelectedBlocks(); - QList blocks; + QVector blocks; bool link = true; foreach (TimelineViewBlockItem* item, sel) { @@ -612,20 +612,20 @@ void TimelineWidget::CopySelected(bool cut) return; } - QList selected = GetSelectedBlocks(); + QVector selected = GetSelectedBlocks(); if (selected.isEmpty()) { return; } - QList selected_nodes; + QVector selected_nodes; foreach (TimelineViewBlockItem* item, selected) { Node* block = item->block(); selected_nodes.append(block); - QList deps = block->GetDependencies(); + QVector deps = block->GetDependencies(); foreach (Node* d, deps) { if (!selected_nodes.contains(d)) { @@ -649,8 +649,8 @@ void TimelineWidget::Paste(bool insert) QUndoCommand* command = new QUndoCommand(); - QList paste_data; - QList pasted = PasteNodesFromClipboard(static_cast(GetConnectedNode()->parent()), command, &paste_data); + QVector paste_data; + QVector pasted = PasteNodesFromClipboard(static_cast(GetConnectedNode()->parent()), command, &paste_data); rational paste_start = GetTime(); @@ -731,7 +731,7 @@ void TimelineWidget::DeleteInToOut(bool ripple) void TimelineWidget::ToggleSelectedEnabled() { - QList items = GetSelectedBlocks(); + QVector items = GetSelectedBlocks(); if (items.isEmpty()) { return; @@ -748,12 +748,12 @@ void TimelineWidget::ToggleSelectedEnabled() Core::instance()->undo_stack()->pushIfHasChildren(command); } -QList TimelineWidget::GetSelectedBlocks() +QVector TimelineWidget::GetSelectedBlocks() { - QList list; + QVector list(selected_blocks_.size()); - foreach (Block* b, selected_blocks_) { - list.append(block_items_.value(b)); + for (int i=0; i &blocks) { - QList delete_items; - delete_items.reserve(blocks.size()); - - QList deselect_blocks; + QVector deselect_blocks; foreach (Block* b, blocks) { // Disconnect all signals @@ -940,8 +937,6 @@ void TimelineWidget::RemoveBlock(const QList &blocks) // through emit BlocksDeselected(deselect_blocks); } - - qDeleteAll(delete_items); } void TimelineWidget::AddTrack(TrackOutput *track, Timeline::TrackType type) @@ -1051,7 +1046,7 @@ void TimelineWidget::ShowContextMenu() { Menu menu(this); - QList selected = GetSelectedBlocks(); + QVector selected = GetSelectedBlocks(); if (!selected.isEmpty()) { MenuShared::instance()->AddItemsForEditMenu(&menu, true); @@ -1060,8 +1055,8 @@ void TimelineWidget::ShowContextMenu() QAction* properties_action = menu.addAction(tr("Properties")); connect(properties_action, &QAction::triggered, this, [this](){ - QList block_items = GetSelectedBlocks(); - QList nodes; + QVector block_items = GetSelectedBlocks(); + QVector nodes; foreach (TimelineViewBlockItem* i, block_items) { nodes.append(i->block()); @@ -1210,7 +1205,7 @@ const QRect& TimelineWidget::GetRubberBandGeometry() const return rubberband_.geometry(); } -void TimelineWidget::SignalSelectedBlocks(QList input, bool filter) +void TimelineWidget::SignalSelectedBlocks(QVector input, bool filter) { if (input.isEmpty()) { return; @@ -1233,7 +1228,7 @@ void TimelineWidget::SignalSelectedBlocks(QList input, bool filter) emit BlocksSelected(input); } -void TimelineWidget::SignalDeselectedBlocks(const QList &deselected_blocks) +void TimelineWidget::SignalDeselectedBlocks(const QVector &deselected_blocks) { if (deselected_blocks.isEmpty()) { return; diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index c1be47a75..568f42949 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -89,7 +89,7 @@ public: void ToggleSelectedEnabled(); - QList GetSelectedBlocks(); + QVector GetSelectedBlocks(); virtual bool SnapPoint(QList start_times, rational *movement, int snap_points = kSnapAll) override; @@ -99,7 +99,7 @@ public: void RestoreSplitterState(const QByteArray& state); - static void ReplaceBlocksWithGaps(const QList& blocks, bool remove_from_graph, QUndoCommand* command); + static void ReplaceBlocksWithGaps(const QVector &blocks, bool remove_from_graph, QUndoCommand* command); /** * @brief Retrieve the QGraphicsItem at a particular scene position @@ -185,12 +185,12 @@ public: * this is preferable and should only be set to FALSE if the list is guaranteed not to contain * already selected blocks (and therefore filtering can be skipped to save time). */ - void SignalSelectedBlocks(QList selected_blocks, bool filter = true); + void SignalSelectedBlocks(QVector selected_blocks, bool filter = true); /** * @brief Track blocks that have been newly deselected */ - void SignalDeselectedBlocks(const QList& deselected_blocks); + void SignalDeselectedBlocks(const QVector &deselected_blocks); /** * @brief Convenience function to deselect all blocks and signal them @@ -198,9 +198,9 @@ public: void SignalDeselectedAllBlocks(); signals: - void BlocksSelected(const QList& selected_blocks); + void BlocksSelected(const QVector& selected_blocks); - void BlocksDeselected(const QList& deselected_blocks); + void BlocksDeselected(const QVector& deselected_blocks); protected: virtual void resizeEvent(QResizeEvent *event) override; @@ -237,7 +237,7 @@ private: QRubberBand rubberband_; TimelineWidgetSelections rubberband_old_selections_; - QList rubberband_now_selected_; + QVector rubberband_now_selected_; TimelineWidgetSelections selections_; @@ -257,7 +257,7 @@ private: TimeSlider* timecode_label_; - QList selected_blocks_; + QVector selected_blocks_; int deferred_scroll_value_; diff --git a/app/widget/timelinewidget/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp index 7f4f8e772..86c501d9b 100644 --- a/app/widget/timelinewidget/tool/pointer.cpp +++ b/app/widget/timelinewidget/tool/pointer.cpp @@ -79,7 +79,7 @@ void PointerTool::MousePress(TimelineViewMouseEvent *event) if (parent()->IsBlockSelected(clicked_item_->block())) { // Collect item deselections - QList deselected_blocks; + QVector deselected_blocks; // If shift is held, deselect it if (event->GetModifiers() & Qt::ShiftModifier) { @@ -89,7 +89,7 @@ void PointerTool::MousePress(TimelineViewMouseEvent *event) // If not holding alt, deselect all links as well if (!(event->GetModifiers() & Qt::AltModifier)) { parent()->SetBlockLinksSelected(clicked_item_->block(), false); - deselected_blocks.append(clicked_item_->block()->linked_clips().toList()); + deselected_blocks.append(clicked_item_->block()->linked_clips()); } } @@ -107,7 +107,7 @@ void PointerTool::MousePress(TimelineViewMouseEvent *event) if (selectable_item) { // Collect item selections - QList selected_blocks; + QVector selected_blocks; // Select this item parent()->AddSelection(clicked_item_); @@ -116,7 +116,7 @@ void PointerTool::MousePress(TimelineViewMouseEvent *event) // If not holding alt, select all links as well if (!(event->GetModifiers() & Qt::AltModifier)) { parent()->SetBlockLinksSelected(clicked_item_->block(), true); - selected_blocks.append(clicked_item_->block()->linked_clips().toList()); + selected_blocks.append(clicked_item_->block()->linked_clips()); } parent()->SignalSelectedBlocks(selected_blocks); @@ -219,13 +219,13 @@ void SetGhostToSlideMode(TimelineViewGhostItem* g) } void PointerTool::InitiateDragInternal(TimelineViewBlockItem *clicked_item, - Timeline::MovementMode trim_mode, - bool dont_roll_trims, - bool allow_nongap_rolling, - bool slide_instead_of_moving) + Timeline::MovementMode trim_mode, + bool dont_roll_trims, + bool allow_nongap_rolling, + bool slide_instead_of_moving) { // Get list of selected blocks - QList clips = parent()->GetSelectedBlocks(); + QVector clips = parent()->GetSelectedBlocks(); if (trim_mode == Timeline::kMove) { @@ -590,10 +590,10 @@ void PointerTool::FinishDrag(TimelineViewMouseEvent *event) // If we're not duplicating, "remove" the clips and replace them with gaps if (!duplicate_clips) { - QList blocks_to_delete; + QVector blocks_to_delete(blocks_moving.size()); - foreach (const GhostBlockPair& p, blocks_moving) { - blocks_to_delete.append(p.block); + for (int i=0; iReplaceBlocksWithGaps(blocks_to_delete, false, command); @@ -724,7 +724,7 @@ Timeline::MovementMode PointerTool::IsCursorInTrimHandle(TimelineViewBlockItem * } void PointerTool::InitiateDrag(TimelineViewBlockItem* clicked_item, - Timeline::MovementMode trim_mode) + Timeline::MovementMode trim_mode) { InitiateDragInternal(clicked_item, trim_mode, false, false, false); } @@ -795,8 +795,8 @@ void PointerTool::AddGhostInternal(TimelineViewGhostItem* ghost, Timeline::Movem } bool PointerTool::IsClipTrimmable(TimelineViewBlockItem* clip, - const QList& items, - const Timeline::MovementMode& mode) + const QVector& items, + const Timeline::MovementMode& mode) { foreach (TimelineViewBlockItem* compare, items) { if (clip->Track() == compare->Track() @@ -811,9 +811,9 @@ bool PointerTool::IsClipTrimmable(TimelineViewBlockItem* clip, } bool PointerTool::AddMovingTransitionsToClipGhost(Block* block, - const TrackReference& track, - Timeline::MovementMode movement, - const QList& selected_items) + const TrackReference& track, + Timeline::MovementMode movement, + const QList& selected_items) { // Assume block is a clip and see if it has any transitions TransitionBlock* transitions[2]; diff --git a/app/widget/timelinewidget/tool/pointer.h b/app/widget/timelinewidget/tool/pointer.h index 31ec8b455..3d42fbb54 100644 --- a/app/widget/timelinewidget/tool/pointer.h +++ b/app/widget/timelinewidget/tool/pointer.h @@ -100,7 +100,7 @@ private: void AddGhostInternal(TimelineViewGhostItem* ghost, Timeline::MovementMode mode); bool IsClipTrimmable(TimelineViewBlockItem* clip, - const QList& items, + const QVector &items, const Timeline::MovementMode& mode); void ProcessGhostsForSliding(); diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index 7f968e29e..e1e59abfa 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -765,7 +765,7 @@ void BlockUnlinkAllCommand::undo_internal() unlinked_.clear(); } -BlockLinkManyCommand::BlockLinkManyCommand(const QList blocks, bool link, QUndoCommand *parent) : +BlockLinkManyCommand::BlockLinkManyCommand(const QVector blocks, bool link, QUndoCommand *parent) : UndoCommand(parent), blocks_(blocks) { diff --git a/app/widget/timelinewidget/undo/undo.h b/app/widget/timelinewidget/undo/undo.h index 220f4133d..e59255f3e 100644 --- a/app/widget/timelinewidget/undo/undo.h +++ b/app/widget/timelinewidget/undo/undo.h @@ -471,12 +471,12 @@ private: class BlockLinkManyCommand : public UndoCommand { public: - BlockLinkManyCommand(const QList blocks, bool link, QUndoCommand* parent = nullptr); + BlockLinkManyCommand(const QVector blocks, bool link, QUndoCommand* parent = nullptr); virtual Project* GetRelevantProject() const override; private: - QList blocks_; + QVector blocks_; }; diff --git a/app/widget/timetarget/timetarget.cpp b/app/widget/timetarget/timetarget.cpp index 51ec506d3..73f29746a 100644 --- a/app/widget/timetarget/timetarget.cpp +++ b/app/widget/timetarget/timetarget.cpp @@ -60,7 +60,7 @@ TimeRange TimeTargetObject::GetAdjustedTime(Node* from, Node* to, const TimeRang return r; } - QList adjusted = from->TransformTimeTo(r, to, direction); + QVector adjusted = from->TransformTimeTo(r, to, direction); if (adjusted.isEmpty()) { return r; From 81450044e0e985c69e6abd1b70ae079fe626577e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 16:32:15 +1100 Subject: [PATCH 44/72] added preference for duplicating dependencies Fixes #1320 --- app/config/config.cpp | 1 + .../tabs/preferencesbehaviortab.cpp | 5 ++ app/node/node.cpp | 61 ++++++++++++++++++ app/node/node.h | 6 ++ app/widget/nodeview/nodeview.cpp | 36 +---------- app/widget/timelinewidget/tool/pointer.cpp | 20 ++++-- app/widget/timelinewidget/undo/undo.cpp | 62 +++++++++++++++---- app/widget/timelinewidget/undo/undo.h | 6 +- 8 files changed, 145 insertions(+), 52 deletions(-) diff --git a/app/config/config.cpp b/app/config/config.cpp index 3c818f084..2b317a51c 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -89,6 +89,7 @@ void Config::SetDefaults() SetEntryInternal(QStringLiteral("RectifiedWaveforms"), NodeParam::kBoolean, false); SetEntryInternal(QStringLiteral("DropWithoutSequenceBehavior"), NodeParam::kInt, ImportTool::kDWSAsk); SetEntryInternal(QStringLiteral("Loop"), NodeParam::kBoolean, false); + SetEntryInternal(QStringLiteral("SplitClipsCopyNodes"), NodeParam::kBoolean, true); SetEntryInternal(QStringLiteral("AutoCacheInterval"), NodeParam::kInt, 250); diff --git a/app/dialog/preferences/tabs/preferencesbehaviortab.cpp b/app/dialog/preferences/tabs/preferencesbehaviortab.cpp index 6713fe81b..3feb53035 100644 --- a/app/dialog/preferences/tabs/preferencesbehaviortab.cpp +++ b/app/dialog/preferences/tabs/preferencesbehaviortab.cpp @@ -99,6 +99,11 @@ PreferencesBehaviorTab::PreferencesBehaviorTab() AddItem(tr("Auto-Scale By Default"), QStringLiteral("AutoscaleByDefault"), node_group); + AddItem(tr("Splitting Clips Copies Dependencies"), + QStringLiteral("SplitClipsCopyNodes"), + tr("Multiple clips can share the same nodes. Disable this to automatically share node " + "dependencies among clips when copying or splitting them."), + node_group); } void PreferencesBehaviorTab::Accept() diff --git a/app/node/node.cpp b/app/node/node.cpp index c531f3c14..0abc3e69d 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -29,6 +29,7 @@ #include "project/project.h" #include "project/item/footage/footage.h" #include "project/item/footage/videostream.h" +#include "widget/nodeview/nodeviewundo.h" OLIVE_NAMESPACE_ENTER @@ -239,6 +240,66 @@ TimeRange Node::OutputTimeAdjustment(NodeInput *, const TimeRange &input_time) c return input_time; } +QVector Node::CopyDependencyGraph(const QVector &nodes, QUndoCommand* command) +{ + int nb_nodes = nodes.size(); + + QVector copies(nb_nodes); + + for (int i=0; icopy();; + + // Copy the values, but NOT the connections, since we'll be connecting to our own clones later + Node::CopyInputs(nodes.at(i), c, false); + + // Add to graph + NodeGraph* graph = static_cast(nodes.at(i)->parent()); + if (command) { + new NodeAddCommand(graph, c, command); + } else { + graph->AddNode(c); + } + + // Store in array at the same index as source + copies[i] = c; + } + + CopyDependencyGraph(nodes, copies, command); + + return copies; +} + +void Node::CopyDependencyGraph(const QVector &src, const QVector &dst, QUndoCommand *command) +{ + int nb_nodes = src.size(); + + for (int i=0; i inputs = src.at(i)->GetInputsIncludingArrays(); + + for (int j=0; jget_connected_node() == src.at(j)) { + // Found a connection + NodeOutput* copy_output = dst.at(j)->GetOutputWithID(input->get_connected_output()->id()); + NodeInput* copy_input = dst.at(i)->GetInputWithID(input->id()); + + if (command) { + new NodeEdgeAddCommand(copy_output, copy_input, command); + } else { + NodeParam::ConnectEdge(copy_output, copy_input); + } + } + } + } + } +} + void Node::SendInvalidateCache(const TimeRange &range, NodeInput *source) { // Loop through all parameters (there should be no children that are not NodeParams) diff --git a/app/node/node.h b/app/node/node.h index 003b3911d..b69dde82c 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -346,6 +346,12 @@ public: */ static void CopyInputs(Node* source, Node* destination, bool include_connections = true); + /** + * @brief Clones a set of nodes and connects the new ones the way the old ones were + */ + static QVector CopyDependencyGraph(const QVector& nodes, QUndoCommand *command); + static void CopyDependencyGraph(const QVector& src, const QVector& dst, QUndoCommand *command); + /** * @brief Return whether this Node can be deleted or not */ diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index 2f40b1aa3..bfc2472aa 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -288,43 +288,11 @@ void NodeView::Duplicate() QUndoCommand* command = new QUndoCommand(); - QList duplicated_nodes; - - foreach (Node* n, selected) { - Node* copy = n->copy(); - - Node::CopyInputs(n, copy, false); - - duplicated_nodes.append(copy); - - new NodeAddCommand(graph_, copy, command); - } - - for (int i=0;ioutput()->edges()) { - if (edge->input()->parentNode() == dst) { - new NodeEdgeAddCommand(duplicated_nodes.at(i)->output(), - duplicated_nodes.at(j)->GetInputWithID(edge->input()->id()), - command); - } - } - } - } + QVector duplicated_nodes = Node::CopyDependencyGraph(selected, command); Core::instance()->undo_stack()->pushIfHasChildren(command); - if (!duplicated_nodes.isEmpty()) { - AttachNodesToCursor(duplicated_nodes); - } + AttachNodesToCursor(duplicated_nodes); } void NodeView::ItemsChanged() diff --git a/app/widget/timelinewidget/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp index 86c501d9b..d1a6a257b 100644 --- a/app/widget/timelinewidget/tool/pointer.cpp +++ b/app/widget/timelinewidget/tool/pointer.cpp @@ -610,13 +610,23 @@ void PointerTool::FinishDrag(TimelineViewMouseEvent *event) if (duplicate_clips) { // Duplicate rather than move - Node* copy = block->copy(); + Node* copy; - new NodeAddCommand(static_cast(block->parent()), - copy, - command); + if (Config::Current()[QStringLiteral("SplitClipsCopyNodes")].toBool()) { + QVector nodes_to_clone; + nodes_to_clone.append(block); + nodes_to_clone.append(block->GetDependencies()); + QVector duplicated = Node::CopyDependencyGraph(nodes_to_clone, command); + copy = duplicated.first(); + } else { + copy = block->copy(); - new NodeCopyInputsCommand(block, copy, true, command); + new NodeAddCommand(static_cast(block->parent()), + copy, + command); + + new NodeCopyInputsCommand(block, copy, true, command); + } // Place the copy instead of the original block block = static_cast(copy); diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index e1e59abfa..36f81e8e1 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -20,6 +20,7 @@ #include "undo.h" +#include "config/config.h" #include "core.h" #include "node/block/clip/clip.h" #include "node/block/transition/transition.h" @@ -209,10 +210,21 @@ void TrackRippleRemoveAreaCommand::redo_internal() if (splice_) { // Split the block here - trim_in_ = static_cast(trim_out_->copy()); + splice_split_command_ = new QUndoCommand(); - static_cast(track_->parent())->AddNode(trim_in_); - Node::CopyInputs(trim_out_, trim_in_); + if (Config::Current()[QStringLiteral("SplitClipsCopyNodes")].toBool()) { + QVector nodes_to_clone; + nodes_to_clone.append(trim_out_); + nodes_to_clone.append(trim_out_->GetDependencies()); + QVector duplicated = Node::CopyDependencyGraph(nodes_to_clone, splice_split_command_); + trim_in_ = static_cast(duplicated.first()); + } else { + trim_in_ = static_cast(trim_out_->copy()); + new NodeAddCommand(static_cast(track_->parent()), trim_in_, splice_split_command_); + new NodeCopyInputsCommand(trim_out_, trim_in_, true, splice_split_command_); + } + + splice_split_command_->redo(); trim_out_old_length_ = trim_out_->length(); trim_out_->set_length_and_media_out(in_ - trim_out_->in()); @@ -292,7 +304,8 @@ void TrackRippleRemoveAreaCommand::undo_internal() track_->RippleRemoveBlock(trim_in_); trim_out_->set_length_and_media_out(trim_out_old_length_); - TakeNodeFromParentGraph(trim_in_, &memory_manager_); + splice_split_command_->undo(); + delete splice_split_command_; } else { @@ -428,8 +441,33 @@ void BlockSplitCommand::redo_internal() { track_->BeginOperation(); - static_cast(block_->parent())->AddNode(new_block_); - Node::CopyInputs(block_, new_block_); + NodeGraph* graph = static_cast(block_->parent()); + + add_command_ = new QUndoCommand(); + new NodeAddCommand(graph, new_block_, add_command_); + new NodeCopyInputsCommand(block_, new_block_, true, add_command_); + + if (Config::Current()[QStringLiteral("SplitClipsCopyNodes")].toBool()) { + + QVector src_nodes; + QVector dst_nodes; + + src_nodes.append(block_); + src_nodes.append(block_->GetDependencies()); + + dst_nodes.resize(src_nodes.size()); + dst_nodes[0] = new_block_; + for (int i=1; icopy(); + new NodeAddCommand(graph, dst_nodes[i], add_command_); + Node::CopyInputs(src_nodes[i], dst_nodes[i], false); + } + + Node::CopyDependencyGraph(src_nodes, dst_nodes, add_command_); + + } + + add_command_->redo(); rational new_part_length = block_->length() - (point_ - block_->in()); @@ -451,16 +489,18 @@ void BlockSplitCommand::undo_internal() { track_->BeginOperation(); - block_->set_length_and_media_out(old_length_); - track_->RippleRemoveBlock(new_block_); - - TakeNodeFromParentGraph(new_block_, &memory_manager_); - foreach (NodeInput* transition, transitions_to_move_) { NodeParam::DisconnectEdge(new_block_->output(), transition); NodeParam::ConnectEdge(block_->output(), transition); } + block_->set_length_and_media_out(old_length_); + track_->RippleRemoveBlock(new_block_); + + add_command_->undo(); + new_block_->setParent(&memory_manager_); + delete add_command_; + track_->EndOperation(); } diff --git a/app/widget/timelinewidget/undo/undo.h b/app/widget/timelinewidget/undo/undo.h index e59255f3e..b8be979b2 100644 --- a/app/widget/timelinewidget/undo/undo.h +++ b/app/widget/timelinewidget/undo/undo.h @@ -192,6 +192,7 @@ protected: rational out_; bool splice_; + QUndoCommand* splice_split_command_; Block* trim_out_; Block* trim_in_; @@ -329,17 +330,18 @@ protected: private: TrackOutput* track_; Block* block_; + Block* new_block_; rational new_length_; rational old_length_; rational point_; - Block* new_block_; - QList transitions_to_move_; QObject memory_manager_; + QUndoCommand* add_command_; + }; class TrackSplitAtTimeCommand : public UndoCommand { From ea090a9215934f0a1d484b8ffc008d86fac22bda Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 16 Nov 2020 18:25:09 +1100 Subject: [PATCH 45/72] ci: combined mac dependencies --- .github/workflows/ci.yml | 30 +++--------------------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02d7fd7b5..2e51c348c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -308,35 +308,11 @@ jobs: with: version: 5.15.1 - - name: Acquire FFmpeg + - name: Acquire Dependencies shell: bash run: | - $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/ffmpeg-mac.zip - $EXTRACT_TOOL ffmpeg-mac.zip - - - name: Acquire OpenColorIO - shell: bash - run: | - $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/ocio-mac.zip - $EXTRACT_TOOL ocio-mac.zip - - - name: Acquire OpenEXR - shell: bash - run: | - $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/openexr-mac.zip - $EXTRACT_TOOL openexr-mac.zip - - - name: Acquire OpenImageIO - shell: bash - run: | - $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/oiio-mac.zip - $EXTRACT_TOOL oiio-mac.zip - - - name: Acquire Crashpad - shell: bash - run: | - $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/crashpad-mac.zip - $EXTRACT_TOOL crashpad-mac.zip + $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/dep-mac.7z + $EXTRACT_TOOL dep-mac.7z - name: Configure CMake shell: bash From a88a687b93aef1baf02b33e0eb1fa2c8b6577afc Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Mon, 16 Nov 2020 12:23:19 +0100 Subject: [PATCH 46/72] Macros already include semicolon. Fixes pedantic GCC errors. --- app/render/colorprocessor.h | 2 +- app/render/rendermanager.h | 2 +- app/render/renderprocessor.h | 2 +- app/render/texture.h | 2 +- app/render/videoparams.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/render/colorprocessor.h b/app/render/colorprocessor.h index 531f0ce3f..d5d4abc11 100644 --- a/app/render/colorprocessor.h +++ b/app/render/colorprocessor.h @@ -74,6 +74,6 @@ using ColorProcessorChain = QVector; OLIVE_NAMESPACE_EXIT -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::ColorProcessorPtr); +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::ColorProcessorPtr) #endif // COLORPROCESSOR_H diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 06b23c59d..a1083dc70 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -144,6 +144,6 @@ private: OLIVE_NAMESPACE_EXIT -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::RenderManager::TicketType); +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::RenderManager::TicketType) #endif // RENDERBACKEND_H diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index 17098179d..68627a6c2 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -78,6 +78,6 @@ private: OLIVE_NAMESPACE_EXIT -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::RenderProcessor::RenderedWaveform); +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::RenderProcessor::RenderedWaveform) #endif // RENDERPROCESSOR_H diff --git a/app/render/texture.h b/app/render/texture.h index b06af89d3..20353deea 100644 --- a/app/render/texture.h +++ b/app/render/texture.h @@ -115,6 +115,6 @@ using TexturePtr = std::shared_ptr; OLIVE_NAMESPACE_EXIT -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::TexturePtr); +Q_DECLARE_METATYPE(OLIVE_NAMESPACE::TexturePtr) #endif // RENDERTEXTURE_H diff --git a/app/render/videoparams.cpp b/app/render/videoparams.cpp index e7c500f6f..0f127014a 100644 --- a/app/render/videoparams.cpp +++ b/app/render/videoparams.cpp @@ -24,7 +24,7 @@ #include "core.h" -OLIVE_NAMESPACE_ENTER; +OLIVE_NAMESPACE_ENTER const int VideoParams::kInternalChannelCount = kRGBAChannelCount; From 21f67171876bad0e9f39e54683f38735b4d93231 Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Mon, 16 Nov 2020 12:34:39 +0100 Subject: [PATCH 47/72] Add missing includes --- app/render/texture.h | 2 ++ app/window/mainwindow/mainwindow.cpp | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/app/render/texture.h b/app/render/texture.h index 20353deea..b5f34843a 100644 --- a/app/render/texture.h +++ b/app/render/texture.h @@ -21,6 +21,8 @@ #ifndef RENDERTEXTURE_H #define RENDERTEXTURE_H +#include + #include "render/videoparams.h" OLIVE_NAMESPACE_ENTER diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index a071b3c39..440795363 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -25,6 +25,10 @@ #include #include +#ifdef Q_OS_LINUX +#include +#endif + #include "mainmenu.h" #include "mainstatusbar.h" From d17fcdaf8875a8a47a36d1327792605ca595b0b3 Mon Sep 17 00:00:00 2001 From: Simran Date: Mon, 16 Nov 2020 13:00:11 +0100 Subject: [PATCH 48/72] Docker: Add own ci-ocio image for OpenColorIO v2 (#1332) Uses Olive CI Common image as base instead of ASWF's ci-ocio build image --- docker/ci-ocio/Dockerfile | 47 ++++++++++++++++++++++++++++++++++++ docker/ci-olive/Dockerfile | 3 ++- docker/scripts/build_ocio.sh | 43 +++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 docker/ci-ocio/Dockerfile create mode 100644 docker/scripts/build_ocio.sh diff --git a/docker/ci-ocio/Dockerfile b/docker/ci-ocio/Dockerfile new file mode 100644 index 000000000..2bd88f9d3 --- /dev/null +++ b/docker/ci-ocio/Dockerfile @@ -0,0 +1,47 @@ +# Copyright (C) 2020 Olive Team +# SPDX-License-Identifier: GPL-3.0-or-later + +# Build image (default): +# docker build -t olivevideoeditor/ci-package-ocio:2021-2.0 -f ci-ocio/Dockerfile . + +ARG OLIVE_ORG=olivevideoeditor +ARG ASWF_PKG_ORG=aswftesting +ARG CI_COMMON_VERSION=2 +ARG VFXPLATFORM_VERSION=2021 +# Latest configs ~3 GB because of ACES 1.0.x. +# Upstream only copies nuke-default, therefore we also use the older configs. +ARG OCIO_CONFIGS_VERSION=1.0_r2 + +FROM ${OLIVE_ORG}/ci-common:${CI_COMMON_VERSION} as ci-ocio + +ARG OLIVE_ORG +ARG CI_COMMON_VERSION +ARG VFXPLATFORM_VERSION +ARG OCIO_CONFIGS_VERSION + +LABEL maintainer="olivevideoeditor@gmail.com" +LABEL com.vfxplatform.version=$VFXPLATFORM_VERSION +LABEL org.opencontainers.image.name="$OLIVE_ORG/ci-otio" +LABEL org.opencontainers.image.description="CentOS OpenColorIO Build Image" +LABEL org.opencontainers.image.url="http://olivevideoeditor.org" +LABEL org.opencontainers.image.source="https://github.com/olive-editor/olive" +LABEL org.opencontainers.image.vendor="Olive Team" +LABEL org.opencontainers.image.version="1.0" +LABEL org.opencontainers.image.licenses="GPL-3.0-or-later" + +ENV OLIVE_ORG=${OLIVE_ORG} \ + CI_COMMON_VERSION=${CI_COMMON_VERSION} \ + VFXPLATFORM_VERSION=${VFXPLATFORM_VERSION} \ + OCIO_CONFIGS_VERSION=${OCIO_CONFIGS_VERSION} \ + OLIVE_INSTALL_PREFIX=/usr/local + +COPY scripts/build_ocio.sh \ + /tmp/ + +RUN /tmp/before_build.sh && \ + /tmp/build_ocio.sh && \ + /tmp/copy_new_files.sh + +FROM scratch as ci-package-ocio + +COPY --from=ci-ocio /package/. / diff --git a/docker/ci-olive/Dockerfile b/docker/ci-olive/Dockerfile index 09a2703d6..4a2f033a0 100644 --- a/docker/ci-olive/Dockerfile +++ b/docker/ci-olive/Dockerfile @@ -8,6 +8,7 @@ ARG OLIVE_ORG=olivevideoeditor ARG ASWF_PKG_ORG=aswftesting ARG CI_COMMON_VERSION=2 ARG VFXPLATFORM_VERSION=2021 +ARG OCIO_VERSION=2.0 ARG FFMPEG_VERSION=4.2.4 FROM ${ASWF_PKG_ORG}/ci-package-qt:${VFXPLATFORM_VERSION} as ci-package-qt @@ -15,7 +16,7 @@ FROM ${ASWF_PKG_ORG}/ci-package-python:${VFXPLATFORM_VERSION} as ci-package-pyth FROM ${ASWF_PKG_ORG}/ci-package-boost:${VFXPLATFORM_VERSION} as ci-package-boost FROM ${ASWF_PKG_ORG}/ci-package-openexr:${VFXPLATFORM_VERSION} as ci-package-openexr FROM ${ASWF_PKG_ORG}/ci-package-oiio:${VFXPLATFORM_VERSION} as ci-package-oiio -FROM ${ASWF_PKG_ORG}/ci-package-ocio:${VFXPLATFORM_VERSION} as ci-package-ocio +FROM ${OLIVE_ORG}/ci-package-ocio:${VFXPLATFORM_VERSION}-${OCIO_VERSION} as ci-package-ocio FROM ${OLIVE_ORG}/ci-package-ffmpeg:${FFMPEG_VERSION} as ci-package-ffmpeg FROM ${OLIVE_ORG}/ci-package-crashpad:latest as ci-package-crashpad FROM ${OLIVE_ORG}/ci-package-otio:latest as ci-package-otio diff --git a/docker/scripts/build_ocio.sh b/docker/scripts/build_ocio.sh new file mode 100644 index 000000000..6f8aaaf6f --- /dev/null +++ b/docker/scripts/build_ocio.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# Copyright (C) 2020 Olive Team +# SPDX-License-Identifier: GPL-3.0-or-later + +set -ex + +mkdir ocio +cd ocio + +git clone --depth 1 https://github.com/AcademySoftwareFoundation/OpenColorIO.git +cd OpenColorIO + +mkdir build +cd build +cmake \ + -DCMAKE_INSTALL_PREFIX="${OLIVE_INSTALL_PREFIX}" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DOCIO_BUILD_APPS=OFF \ + -DOCIO_BUILD_NUKE=OFF \ + -DOCIO_BUILD_DOCS=OFF \ + -DOCIO_BUILD_TESTS=OFF \ + -DOCIO_BUILD_GPU_TESTS=OFF \ + -DOCIO_USE_HEADLESS=OFF \ + -DOCIO_BUILD_PYTHON=OFF \ + -DOCIO_BUILD_JAVA=OFF \ + -DOCIO_WARNING_AS_ERROR=OFF \ + -DOCIO_INSTALL_EXT_PACKAGES=ALL \ + .. +make -j$(nproc) +make install + +cd ../.. + +curl --location "https://github.com/imageworks/OpenColorIO-Configs/archive/v${OCIO_CONFIGS_VERSION}.tar.gz" -o "ocio-configs.tar.gz" +tar -zxf ocio-configs.tar.gz +cd "OpenColorIO-Configs-${OCIO_CONFIGS_VERSION}" + +mkdir "${OLIVE_INSTALL_PREFIX}/openColorIO" +cp nuke-default/config.ocio "${OLIVE_INSTALL_PREFIX}/openColorIO/" +cp -r nuke-default/luts "${OLIVE_INSTALL_PREFIX}/openColorIO/" + +cd ../.. +rm -rf ocio From 4aea9a3757fe7998f6b362c24f3592590004bfc8 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 00:20:56 +1100 Subject: [PATCH 49/72] timeline: pad by full width rather than half width --- app/widget/timelinewidget/view/timelineviewbase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/widget/timelinewidget/view/timelineviewbase.cpp b/app/widget/timelinewidget/view/timelineviewbase.cpp index b42978e26..883937a2d 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.cpp +++ b/app/widget/timelinewidget/view/timelineviewbase.cpp @@ -246,7 +246,7 @@ void TimelineViewBase::UpdateSceneRect() bounding_rect.setLeft(0); // Ensure the scene is always the full length of the timeline with a gap at the end to work with - bounding_rect.setRight(TimeToScene(end_time_) + width() / 2); + bounding_rect.setRight(TimeToScene(end_time_) + width()); // Any further rect processing from derivatives can be done here SceneRectUpdateEvent(bounding_rect); From a9935a6bb40a8833f0a231b0403e63eaa2358592 Mon Sep 17 00:00:00 2001 From: Simran Spiller Date: Mon, 16 Nov 2020 15:07:16 +0100 Subject: [PATCH 50/72] CI: Enable automated builds for pull requests against our master branch. This includes branches from forked repos. Packages and debug symbols are not uploaded to the website, but artifacts can be accessed by any authenticated GitHub user until they expire (current 90 days). [skip ci] --- .github/workflows/ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e51c348c..4ae08e614 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,15 @@ on: - 'docker/**' - 'CONTRIBUTING.md' - 'README.md' + pull_request: + branches: + - master + paths-ignore: + - '.github/ISSUE_TEMPLATE/**' + - '.github/FUNDING.yml' + - 'docker/**' + - 'CONTRIBUTING.md' + - 'README.md' env: DOWNLOAD_TOOL: curl -fLOSs --retry 2 --retry-delay 60 @@ -257,6 +266,7 @@ jobs: shell: bash env: GH_AUTH_KEY: ${{ secrets.GH_AUTH_KEY }} + if: github.event_name == 'push' run: | curl -fLSs --retry 2 --retry-delay 60 \ https://github.com/google/breakpad/blob/master/src/tools/windows/binaries/dump_syms.exe?raw=true > dump_syms.exe From 0e0d557b1bb9fcfbe0a1d8f8e4cf1f6ba2bb6637 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Mon, 16 Nov 2020 20:26:45 +0000 Subject: [PATCH 51/72] videostreamproperties: Fix alpha checkbox Check video_premultiply_alpha is not null before trying to access its members in VideoStreamProperties::Accept. Also initialise video_premultiply_alpha as nullptr in the constructor. app/dialog/footageproperties/streamproperties/videostreamproperties.cpp --- .../streamproperties/videostreamproperties.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index f6ebfcfcc..49f5c367f 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -35,7 +35,8 @@ OLIVE_NAMESPACE_ENTER VideoStreamProperties::VideoStreamProperties(VideoStreamPtr stream) : - stream_(stream) + stream_(stream), + video_premultiply_alpha_(nullptr) { QGridLayout* video_layout = new QGridLayout(this); video_layout->setMargin(0); @@ -131,13 +132,13 @@ void VideoStreamProperties::Accept(QUndoCommand *parent) set_colorspace = video_color_space_->currentText(); } - if (video_premultiply_alpha_->isChecked() != stream_->premultiplied_alpha() + if ((video_premultiply_alpha_ && video_premultiply_alpha_->isChecked() != stream_->premultiplied_alpha()) || set_colorspace != stream_->colorspace(false) || static_cast(video_interlace_combo_->currentIndex()) != stream_->interlacing() || pixel_aspect_combo_->GetPixelAspectRatio() != stream_->pixel_aspect_ratio()) { new VideoStreamChangeCommand(stream_, - video_premultiply_alpha_->isChecked(), + video_premultiply_alpha_ ? video_premultiply_alpha_->isChecked() : stream_->premultiplied_alpha(), set_colorspace, static_cast(video_interlace_combo_->currentIndex()), pixel_aspect_combo_->GetPixelAspectRatio(), From e2010dde83321f9dde291b0e643cfe1ac1d8f4e8 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 09:42:36 +1100 Subject: [PATCH 52/72] made formal QtUtils class --- app/common/qtutils.cpp | 10 +++++++- app/common/qtutils.h | 23 ++++++++++++------- app/dialog/color/colordialog.cpp | 2 +- app/dialog/export/codec/h264section.cpp | 2 +- app/widget/audiomonitor/audiomonitor.cpp | 2 +- .../curvewidget/beziercontrolpointitem.cpp | 2 +- app/widget/curvewidget/curveview.cpp | 4 ++-- app/widget/keyframeview/keyframeviewitem.cpp | 2 +- .../nodeparamviewconnectedlabel.cpp | 2 +- app/widget/nodeview/nodeviewitem.cpp | 6 ++--- .../projectexplorericonviewitemdelegate.cpp | 2 +- app/widget/scope/histogram/histogram.cpp | 2 +- app/widget/scope/waveform/waveform.cpp | 2 +- app/widget/slider/sliderbase.cpp | 8 +++---- app/widget/timelinewidget/tool/import.cpp | 2 +- app/widget/timelinewidget/tool/pointer.cpp | 2 +- .../view/timelineviewblockitem.cpp | 2 +- app/widget/timeruler/seekablewidget.cpp | 2 +- app/widget/timeruler/timeruler.cpp | 4 ++-- 19 files changed, 48 insertions(+), 33 deletions(-) diff --git a/app/common/qtutils.cpp b/app/common/qtutils.cpp index a745d5443..797044969 100644 --- a/app/common/qtutils.cpp +++ b/app/common/qtutils.cpp @@ -22,7 +22,7 @@ OLIVE_NAMESPACE_ENTER -int QFontMetricsWidth(QFontMetrics fm, const QString& s) { +int QtUtils::QFontMetricsWidth(QFontMetrics fm, const QString& s) { #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0) return fm.width(s); #else @@ -30,4 +30,12 @@ int QFontMetricsWidth(QFontMetrics fm, const QString& s) { #endif } +QFrame *QtUtils::CreateHorizontalLine() +{ + QFrame* horizontal_line = new QFrame(); + horizontal_line->setFrameShape(QFrame::HLine); + horizontal_line->setFrameShadow(QFrame::Sunken); + return horizontal_line; +} + OLIVE_NAMESPACE_EXIT diff --git a/app/common/qtutils.h b/app/common/qtutils.h index fb405b6b7..99ac2d289 100644 --- a/app/common/qtutils.h +++ b/app/common/qtutils.h @@ -28,19 +28,26 @@ */ #include +#include #include "common/define.h" OLIVE_NAMESPACE_ENTER -/** - * @brief Retrieves the width of a string according to certain QFontMetrics - * - * QFontMetrics::width() has been deprecatd in favor of QFontMetrics::horizontalAdvance(), but the - * latter was only introduced in 5.11+. This function wraps the latter for 5.11+ and the former for - * earlier. - */ -int QFontMetricsWidth(QFontMetrics fm, const QString& s); +class QtUtils { +public: + /** + * @brief Retrieves the width of a string according to certain QFontMetrics + * + * QFontMetrics::width() has been deprecatd in favor of QFontMetrics::horizontalAdvance(), but the + * latter was only introduced in 5.11+. This function wraps the latter for 5.11+ and the former for + * earlier. + */ + static int QFontMetricsWidth(QFontMetrics fm, const QString& s); + + static QFrame* CreateHorizontalLine(); + +}; OLIVE_NAMESPACE_EXIT diff --git a/app/dialog/color/colordialog.cpp b/app/dialog/color/colordialog.cpp index e578cfdd2..afda42bb4 100644 --- a/app/dialog/color/colordialog.cpp +++ b/app/dialog/color/colordialog.cpp @@ -48,7 +48,7 @@ ColorDialog::ColorDialog(ColorManager* color_manager, const ManagedColor& start, wheel_layout->addWidget(color_wheel_); hsv_value_gradient_ = new ColorGradientWidget(Qt::Vertical); - hsv_value_gradient_->setFixedWidth(QFontMetricsWidth(fontMetrics(), QStringLiteral("HHH"))); + hsv_value_gradient_->setFixedWidth(QtUtils::QFontMetricsWidth(fontMetrics(), QStringLiteral("HHH"))); wheel_layout->addWidget(hsv_value_gradient_); QWidget* value_area = new QWidget(); diff --git a/app/dialog/export/codec/h264section.cpp b/app/dialog/export/codec/h264section.cpp index e0e50fb55..73f723d01 100644 --- a/app/dialog/export/codec/h264section.cpp +++ b/app/dialog/export/codec/h264section.cpp @@ -117,7 +117,7 @@ H264CRFSection::H264CRFSection(QWidget *parent) : layout->addWidget(crf_slider_); IntegerSlider* crf_input = new IntegerSlider(); - crf_input->setMaximumWidth(QFontMetricsWidth(crf_input->fontMetrics(), QStringLiteral("HHHH"))); + crf_input->setMaximumWidth(QtUtils::QFontMetricsWidth(crf_input->fontMetrics(), QStringLiteral("HHHH"))); crf_input->SetMinimum(kMinimumCRF); crf_input->SetMaximum(kMaximumCRF); crf_input->SetValue(kDefaultCRF); diff --git a/app/widget/audiomonitor/audiomonitor.cpp b/app/widget/audiomonitor/audiomonitor.cpp index 2ce1f50a5..6eb972dba 100644 --- a/app/widget/audiomonitor/audiomonitor.cpp +++ b/app/widget/audiomonitor/audiomonitor.cpp @@ -124,7 +124,7 @@ void AudioMonitor::paintGL() // Create rect where decibel markings will go on the side QRect db_labels_rect = rect(); - db_labels_rect.setWidth(QFontMetricsWidth(p.fontMetrics(), "-00")); + db_labels_rect.setWidth(QtUtils::QFontMetricsWidth(p.fontMetrics(), "-00")); db_labels_rect.adjust(0, font_height, 0, 0); // Determine rect where the main meter will go diff --git a/app/widget/curvewidget/beziercontrolpointitem.cpp b/app/widget/curvewidget/beziercontrolpointitem.cpp index 363ea3aa2..5425f2818 100644 --- a/app/widget/curvewidget/beziercontrolpointitem.cpp +++ b/app/widget/curvewidget/beziercontrolpointitem.cpp @@ -47,7 +47,7 @@ BezierControlPointItem::BezierControlPointItem(NodeKeyframePtr key, NodeKeyframe } - int control_point_size = QFontMetricsWidth(qApp->fontMetrics(), "o"); + int control_point_size = QtUtils::QFontMetricsWidth(qApp->fontMetrics(), "o"); int half_sz = control_point_size / 2; setRect(-half_sz, -half_sz, control_point_size, control_point_size); } diff --git a/app/widget/curvewidget/curveview.cpp b/app/widget/curvewidget/curveview.cpp index c1ece5146..c13ff8b01 100644 --- a/app/widget/curvewidget/curveview.cpp +++ b/app/widget/curvewidget/curveview.cpp @@ -37,9 +37,9 @@ CurveView::CurveView(QWidget *parent) : setViewportUpdateMode(FullViewportUpdate); SetYAxisEnabled(true); - text_padding_ = QFontMetricsWidth(fontMetrics(), QStringLiteral("i")); + text_padding_ = QtUtils::QFontMetricsWidth(fontMetrics(), QStringLiteral("i")); - minimum_grid_space_ = QFontMetricsWidth(fontMetrics(), QStringLiteral("00000")); + minimum_grid_space_ = QtUtils::QFontMetricsWidth(fontMetrics(), QStringLiteral("00000")); connect(scene(), &QGraphicsScene::selectionChanged, this, &CurveView::SelectionChanged); } diff --git a/app/widget/keyframeview/keyframeviewitem.cpp b/app/widget/keyframeview/keyframeviewitem.cpp index c50a42743..2acc246df 100644 --- a/app/widget/keyframeview/keyframeviewitem.cpp +++ b/app/widget/keyframeview/keyframeviewitem.cpp @@ -42,7 +42,7 @@ KeyframeViewItem::KeyframeViewItem(NodeKeyframePtr key, QGraphicsItem *parent) : connect(key.get(), &NodeKeyframe::TimeChanged, this, &KeyframeViewItem::UpdatePos); connect(key.get(), &NodeKeyframe::TypeChanged, this, &KeyframeViewItem::Redraw); - int keyframe_size = QFontMetricsWidth(qApp->fontMetrics(), "Oi"); + int keyframe_size = QtUtils::QFontMetricsWidth(qApp->fontMetrics(), "Oi"); int half_sz = keyframe_size/2; setRect(-half_sz, -half_sz, keyframe_size, keyframe_size); diff --git a/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp b/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp index 43507cac6..85f88d274 100644 --- a/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp +++ b/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp @@ -35,7 +35,7 @@ NodeParamViewConnectedLabel::NodeParamViewConnectedLabel(NodeInput *input, QWidg input_(input) { QHBoxLayout* layout = new QHBoxLayout(this); - layout->setSpacing(QFontMetricsWidth(fontMetrics(), QStringLiteral(" "))); + layout->setSpacing(QtUtils::QFontMetricsWidth(fontMetrics(), QStringLiteral(" "))); layout->setMargin(0); layout->addWidget(new QLabel(tr("Connected to"))); diff --git a/app/widget/nodeview/nodeviewitem.cpp b/app/widget/nodeview/nodeviewitem.cpp index 8f637a212..637228b28 100644 --- a/app/widget/nodeview/nodeviewitem.cpp +++ b/app/widget/nodeview/nodeviewitem.cpp @@ -133,7 +133,7 @@ int NodeViewItem::DefaultItemHeight() int NodeViewItem::DefaultItemWidth() { - return QFontMetricsWidth(QFontMetrics(QFont()), "HHHHHHHHHHHH");; + return QtUtils::QFontMetricsWidth(QFontMetrics(QFont()), "HHHHHHHHHHHH");; } int NodeViewItem::DefaultItemBorder() @@ -316,7 +316,7 @@ void NodeViewItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti // Calculate how much space we have for text int item_width = title_bar_rect_.width(); int max_text_width = item_width - DefaultTextPadding() * 2 - icon_full_size; - int label_width = QFontMetricsWidth(fm, node_label); + int label_width = QtUtils::QFontMetricsWidth(fm, node_label); // Concatenate text if necessary (adds a "..." to the end and removes characters until the // string fits in the bounds) @@ -326,7 +326,7 @@ void NodeViewItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti do { node_label.chop(1); concatenated = QCoreApplication::translate("NodeViewItem", "%1...").arg(node_label); - } while ((label_width = QFontMetricsWidth(fm, concatenated)) > max_text_width); + } while ((label_width = QtUtils::QFontMetricsWidth(fm, concatenated)) > max_text_width); node_label = concatenated; } diff --git a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp index d0bb4cdd6..7ee11c917 100644 --- a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp +++ b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp @@ -66,7 +66,7 @@ void ProjectExplorerIconViewItemDelegate::paint(QPainter *painter, const QStyleO QString duration_str = index.data(Qt::UserRole).toString(); - int timecode_width = QFontMetricsWidth(fm, duration_str); + int timecode_width = QtUtils::QFontMetricsWidth(fm, duration_str); int max_name_width = option.rect.width(); diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index f292ccc29..f03b7833c 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -136,7 +136,7 @@ void HistogramScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) histogram_start_dim_y); label = QString::number( *it * 100, 'f', 1) + "%"; - font_x_offset = QFontMetricsWidth(font_metrics, label) + 4; + font_x_offset = QtUtils::QFontMetricsWidth(font_metrics, label) + 4; p.drawText( histogram_start_dim_x - font_x_offset, diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index ac4964624..e888b513e 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -111,7 +111,7 @@ void WaveformScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) waveform_end_dim_x, (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y); label = QString::number(1.0 - (i * ire_increment), 'f', 1); - font_x_offset = QFontMetricsWidth(font_metrics, label) + 4; + font_x_offset = QtUtils::QFontMetricsWidth(font_metrics, label) + 4; p.drawText( waveform_start_dim_x - font_x_offset, diff --git a/app/widget/slider/sliderbase.cpp b/app/widget/slider/sliderbase.cpp index 727b2aa01..2da0fbae5 100644 --- a/app/widget/slider/sliderbase.cpp +++ b/app/widget/slider/sliderbase.cpp @@ -143,8 +143,8 @@ void SliderBase::SetValue(const QVariant &v) UpdateLabel(value_); } -void SliderBase::SetDefaultValue(const QVariant &v) -{ +void SliderBase::SetDefaultValue(const QVariant &v) +{ default_value_ = v; } @@ -203,12 +203,12 @@ QString SliderBase::GetFormat() const void SliderBase::RepositionLadder() { QPoint label_global_pos = label_->mapToGlobal(label_->pos()); - int text_width = QFontMetricsWidth(label_->fontMetrics(), label_->text()); + int text_width = QtUtils::QFontMetricsWidth(label_->fontMetrics(), label_->text()); QPoint ladder_pos(label_global_pos.x(), label_global_pos.y() + label_->height() / 2 - drag_ladder_->height() / 2); if (ladder_element_count_ > 0) { - ladder_pos.setX(ladder_pos.x() + text_width + QFontMetricsWidth(label_->fontMetrics(), QStringLiteral("H"))); + ladder_pos.setX(ladder_pos.x() + text_width + QtUtils::QFontMetricsWidth(label_->fontMetrics(), QStringLiteral("H"))); } else { ladder_pos.setX(ladder_pos.x() + text_width / 2 - drag_ladder_->width() / 2); } diff --git a/app/widget/timelinewidget/tool/import.cpp b/app/widget/timelinewidget/tool/import.cpp index a1552839e..f1f7e83fd 100644 --- a/app/widget/timelinewidget/tool/import.cpp +++ b/app/widget/timelinewidget/tool/import.cpp @@ -63,7 +63,7 @@ ImportTool::ImportTool(TimelineWidget *parent) : TimelineTool(parent) { // Calculate width used for importing to give ghosts a slight lead-in so the ghosts aren't right on the cursor - import_pre_buffer_ = QFontMetricsWidth(parent->fontMetrics(), "HHHHHHHH"); + import_pre_buffer_ = QtUtils::QFontMetricsWidth(parent->fontMetrics(), "HHHHHHHH"); } void ImportTool::DragEnter(TimelineViewMouseEvent *event) diff --git a/app/widget/timelinewidget/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp index d1a6a257b..938f76afd 100644 --- a/app/widget/timelinewidget/tool/pointer.cpp +++ b/app/widget/timelinewidget/tool/pointer.cpp @@ -717,7 +717,7 @@ void PointerTool::FinishDrag(TimelineViewMouseEvent *event) Timeline::MovementMode PointerTool::IsCursorInTrimHandle(TimelineViewBlockItem *block, qreal cursor_x) { - double kTrimHandle = QFontMetricsWidth(parent()->fontMetrics(), "H"); + double kTrimHandle = QtUtils::QFontMetricsWidth(parent()->fontMetrics(), "H"); // Block is too narrow, no trimming allowed if (block->rect().width() <= kTrimHandle * 2) { diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.cpp b/app/widget/timelinewidget/view/timelineviewblockitem.cpp index 7b98b3630..3454f2701 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewblockitem.cpp @@ -120,7 +120,7 @@ void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsI // Linked clips are underlined if (block_->HasLinks()) { QFontMetrics fm = painter->fontMetrics(); - int text_width = qMin(qRound(rect().width()), QFontMetricsWidth(fm, block_->GetLabel())); + int text_width = qMin(qRound(rect().width()), QtUtils::QFontMetricsWidth(fm, block_->GetLabel())); QPointF underline_start = rect().topLeft() + QPointF(0, text_top + fm.height()); QPointF underline_end = underline_start + QPointF(text_width, 0); diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index 13108b3cd..bf6f8f20e 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -41,7 +41,7 @@ SeekableWidget::SeekableWidget(QWidget* parent) : text_height_ = fm.height(); // Set width of playhead marker - playhead_width_ = QFontMetricsWidth(fm, "H"); + playhead_width_ = QtUtils::QFontMetricsWidth(fm, "H"); setContextMenuPolicy(Qt::CustomContextMenu); } diff --git a/app/widget/timeruler/timeruler.cpp b/app/widget/timeruler/timeruler.cpp index c9f3d03bd..9fcbc524d 100644 --- a/app/widget/timeruler/timeruler.cpp +++ b/app/widget/timeruler/timeruler.cpp @@ -48,7 +48,7 @@ TimeRuler::TimeRuler(bool text_visible, bool cache_status_visible, QWidget* pare // Get the "minimum" space allowed between two line markers on the ruler (in screen pixels) // Mediocre but reliable way of scaling UI objects by font/DPI size - minimum_gap_between_lines_ = QFontMetricsWidth(fm, "H"); + minimum_gap_between_lines_ = QtUtils::QFontMetricsWidth(fm, "H"); // Text visibility affects height, so we set that here UpdateHeight(); @@ -209,7 +209,7 @@ void TimeRuler::paintEvent(QPaintEvent *) QRect text_rect; Qt::Alignment text_align; QString timecode_str = Timecode::timestamp_to_timecode(ScreenToUnit(i), timebase(), Core::instance()->GetTimecodeDisplay()); - int timecode_width = QFontMetricsWidth(fm, timecode_str); + int timecode_width = QtUtils::QFontMetricsWidth(fm, timecode_str); int timecode_left; if (centered_text_) { From 8a64ef75d94eb040c3564e7908bd6566d165d713 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 09:43:43 +1100 Subject: [PATCH 53/72] implemented selecting custom export range Fixes #1314 --- app/core.cpp | 8 ++++-- app/dialog/export/export.cpp | 53 ++++++++++++++++++++++++++---------- app/dialog/export/export.h | 10 ++++++- app/task/export/export.cpp | 10 +++++-- 4 files changed, 60 insertions(+), 21 deletions(-) diff --git a/app/core.cpp b/app/core.cpp index 60be123ed..791e8b174 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -358,10 +358,12 @@ void Core::DialogProjectPropertiesShow() void Core::DialogExportShow() { - ViewerOutput* sequence = GetSequenceToExport(); + ViewerOutput* viewer = GetSequenceToExport(); - if (sequence) { - ExportDialog ed(sequence, main_window_); + if (viewer) { + Sequence* sequence = dynamic_cast(viewer->parent()); + + ExportDialog ed(viewer, sequence, main_window_); ed.exec(); } } diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index ccc3df207..8134fa2cc 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -30,6 +30,7 @@ #include #include +#include "common/qtutils.h" #include "core.h" #include "dialog/task/task.h" #include "project/item/sequence/sequence.h" @@ -38,9 +39,10 @@ OLIVE_NAMESPACE_ENTER -ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : +ExportDialog::ExportDialog(ViewerOutput *viewer_node, TimelinePoints *points, QWidget *parent) : QDialog(parent), - viewer_node_(viewer_node) + viewer_node_(viewer_node), + points_(points) { QHBoxLayout* layout = new QHBoxLayout(this); @@ -94,10 +96,23 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : row++; - QFrame* horizontal_line = new QFrame(); - horizontal_line->setFrameShape(QFrame::HLine); - horizontal_line->setFrameShadow(QFrame::Sunken); - preferences_layout->addWidget(horizontal_line, row, 0, 1, 4); + preferences_layout->addWidget(QtUtils::CreateHorizontalLine(), row, 0, 1, 4); + + row++; + + preferences_layout->addWidget(new QLabel(tr("Range:")), row, 0); + + range_combobox_ = new QComboBox(); + range_combobox_->addItem(tr("Entire Sequence")); + range_combobox_->addItem(tr("In to Out")); + if (!points_) { + range_combobox_->setEnabled(false); + } + preferences_layout->addWidget(range_combobox_, row, 1, 1, 3); + + row++; + + preferences_layout->addWidget(QtUtils::CreateHorizontalLine(), row, 0, 1, 4); row++; @@ -212,6 +227,7 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : // Set viewer to view the node preview_viewer_->ConnectViewerNode(viewer_node_); + preview_viewer_->ruler()->ConnectTimelinePoints(points_); preview_viewer_->SetColorMenuEnabled(false); preview_viewer_->SetColorTransform(video_tab_->CurrentOCIOColorSpace()); } @@ -232,27 +248,28 @@ void ExportDialog::StartExport() // Validate if the entered filename contains the correct extension (the extension is necessary // for both FFmpeg and OIIO to determine the output format) QString necessary_ext = QStringLiteral(".%1").arg(ExportFormat::GetExtension(static_cast(format_combobox_->currentIndex()))); + QString proposed_filename = filename_edit_->text().trimmed(); // If it doesn't, see if the user wants to append it automatically. If not, we don't abort the export. - if (!filename_edit_->text().endsWith(necessary_ext, Qt::CaseInsensitive)) { + if (!proposed_filename.endsWith(necessary_ext, Qt::CaseInsensitive)) { QMessageBox b(this); b.setIcon(QMessageBox::Warning); b.setWindowModality(Qt::WindowModal); b.setWindowTitle(tr("Invalid filename")); - b.setText(tr("The filename must contain the extension \".%1\". Would you like to append it " - "automatically?")); + b.setText(tr("The filename must contain the extension \"%1\". Would you like to append it " + "automatically?").arg(necessary_ext)); b.addButton(QMessageBox::Yes); b.addButton(QMessageBox::No); if (b.exec() == QMessageBox::Yes) { - filename_edit_->setText(filename_edit_->text().append(necessary_ext)); + filename_edit_->setText(proposed_filename.append(necessary_ext)); } else { return; } } // Validate the intended path - QFileInfo file_info(filename_edit_->text()); + QFileInfo file_info(proposed_filename); QFileInfo dir_info(file_info.path()); // If the directory does not exist, try to create it @@ -275,7 +292,7 @@ void ExportDialog::StartExport() b.setWindowModality(Qt::WindowModal); b.setWindowTitle(tr("Confirm Overwrite")); b.setText(tr("The file \"%1\" already exists. Do you want to overwrite it?") - .arg(filename_edit_->text())); + .arg(proposed_filename)); b.addButton(QMessageBox::Yes); b.addButton(QMessageBox::No); @@ -328,7 +345,7 @@ void ExportDialog::BrowseFilename() QString browsed_fn = QFileDialog::getSaveFileName(this, "", - filename_edit_->text(), + filename_edit_->text().trimmed(), QStringLiteral("%1 (*.%2)").arg(ExportFormat::GetName(f), ExportFormat::GetExtension(f)), nullptr, @@ -342,7 +359,7 @@ void ExportDialog::BrowseFilename() void ExportDialog::FormatChanged(int index) { - QString current_filename = filename_edit_->text(); + QString current_filename = filename_edit_->text().trimmed(); QString previously_selected_ext = ExportFormat::GetExtension(previously_selected_format_); ExportFormat::Format current_format = static_cast(index); QString currently_selected_ext = ExportFormat::GetExtension(current_format); @@ -441,9 +458,15 @@ ExportParams ExportDialog::GenerateParams() const AudioParams::kInternalFormat); ExportParams params; - params.SetFilename(filename_edit_->text()); + params.SetFilename(filename_edit_->text().trimmed()); params.SetExportLength(viewer_node_->GetLength()); + if (range_combobox_->currentIndex() == kRangeInToOut + && points_ + && points_->workarea()->enabled()) { + params.set_custom_range(points_->workarea()->range()); + } + if (video_tab_->scaling_method_combobox()->isEnabled()) { params.set_video_scaling_method(static_cast(video_tab_->scaling_method_combobox()->currentData().toInt())); } diff --git a/app/dialog/export/export.h b/app/dialog/export/export.h index d92eaba3e..07eb3aa0d 100644 --- a/app/dialog/export/export.h +++ b/app/dialog/export/export.h @@ -40,7 +40,7 @@ class ExportDialog : public QDialog { Q_OBJECT public: - ExportDialog(ViewerOutput* viewer_node, QWidget* parent = nullptr); + ExportDialog(ViewerOutput* viewer_node, TimelinePoints* points = nullptr, QWidget* parent = nullptr); protected: virtual void closeEvent(QCloseEvent *e) override; @@ -52,9 +52,17 @@ private: ExportParams GenerateParams() const; ViewerOutput* viewer_node_; + TimelinePoints* points_; ExportFormat::Format previously_selected_format_; + enum RangeSelection { + kRangeEntireSequence, + kRangeInToOut + }; + + QComboBox* range_combobox_; + QCheckBox* video_enabled_; QCheckBox* audio_enabled_; diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index 1f5d4df38..0678daa76 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -68,7 +68,7 @@ bool ExportTask::Run() range = TimeRange(0, viewer()->GetLength()); } - frame_time_ = Timecode::time_to_timestamp(range.in(), viewer()->video_params().time_base()); + frame_time_ = 0; QSize video_force_size; QMatrix4x4 video_force_matrix; @@ -151,7 +151,13 @@ void ExportTask::FrameDownloaded(FramePtr f, const QByteArray &hash, const QVect Q_UNUSED(hash) foreach (const rational& t, times) { - time_map_.insert(t, f); + rational actual_time = t; + + if (params_.has_custom_range()) { + actual_time -= params_.custom_range().in(); + } + + time_map_.insert(actual_time, f); } forever { From b9724e391074e6c78c4319a6e511df6d6f22ce76 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 16:04:09 +1100 Subject: [PATCH 54/72] attempted to implement localization loading --- app/CMakeLists.txt | 27 +- app/common/commandlineparser.cpp | 16 +- app/common/commandlineparser.h | 46 +- app/config/config.cpp | 2 +- app/core.cpp | 45 + app/core.h | 28 + .../tabs/preferencesgeneraltab.cpp | 65 +- .../preferences/tabs/preferencesgeneraltab.h | 2 + app/main.cpp | 15 + app/ts/CMakeLists.txt | 20 + app/ts/en_US.ts | 4762 +++++++++++++++++ app/ts/translations.qrc.in | 5 + app/widget/panel/panel.h | 3 +- app/window/mainwindow/mainwindow.h | 3 +- 14 files changed, 4972 insertions(+), 67 deletions(-) create mode 100644 app/ts/CMakeLists.txt create mode 100644 app/ts/en_US.ts create mode 100644 app/ts/translations.qrc.in diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 7e7487ba5..f4ef97053 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -43,6 +43,7 @@ add_subdirectory(shaders) add_subdirectory(task) add_subdirectory(threading) add_subdirectory(timeline) +add_subdirectory(ts) add_subdirectory(tool) add_subdirectory(ui) add_subdirectory(undo) @@ -62,11 +63,25 @@ if(APPLE) ) endif() +# Add translations +qt5_add_translation(OLIVE_QM_FILES ${OLIVE_TS_FILES}) + +set(QRC_BODY "") +foreach(QM_FILE ${OLIVE_QM_FILES}) + get_filename_component(QM_FILENAME_COMPONENT ${QM_FILE} NAME_WE) + string(APPEND QRC_BODY "${QM_FILE}\n") +endforeach() +configure_file(ts/translations.qrc.in ts/translations.qrc @ONLY) + +set(OLIVE_RESOURCES + ${OLIVE_RESOURCES} + ${CMAKE_CURRENT_BINARY_DIR}/ts/translations.qrc +) + # Add executable add_executable(${OLIVE_TARGET} ${OLIVE_SOURCES} ${OLIVE_RESOURCES} - ${OLIVE_QM_FILES} ) if(APPLE) @@ -265,16 +280,6 @@ endif() # Set compiler definitions target_compile_definitions(${OLIVE_TARGET} PRIVATE ${OLIVE_DEFINITIONS}) -set(OLIVE_TS_FILES - # FIXME: Empty variable -) - -if(UPDATE_TS) - qt5_create_translation(OLIVE_QM_FILES ${CMAKE_SOURCE_DIR} ${OLIVE_TS_FILES}) -else() - qt5_add_translation(OLIVE_QM_FILES ${OLIVE_TS_FILES}) -endif() - add_subdirectory(packaging) if(DOXYGEN_FOUND) diff --git a/app/common/commandlineparser.cpp b/app/common/commandlineparser.cpp index 9585a0c69..ab58322b1 100644 --- a/app/common/commandlineparser.cpp +++ b/app/common/commandlineparser.cpp @@ -34,11 +34,11 @@ CommandLineParser::~CommandLineParser() } } -const CommandLineParser::Option *CommandLineParser::AddOption(const QStringList &strings, const QString &description) +const CommandLineParser::Option *CommandLineParser::AddOption(const QStringList &strings, const QString &description, bool takes_arg, const QString &arg_placeholder) { Option* o = new Option(); - options_.append({strings, description, o}); + options_.append({strings, description, o, takes_arg, arg_placeholder}); return o; } @@ -72,6 +72,12 @@ void CommandLineParser::Process(int argc, char **argv) if (!s.compare(arg_basename, Qt::CaseInsensitive)) { // Flag discovered! o.option->Set(); + + if (o.takes_arg && i+1 < argc) { + o.option->SetSetting(argv[i+1]); + i++; + } + matched_known = true; goto found_flag; } @@ -147,7 +153,11 @@ void CommandLineParser::PrintHelp(const char* filename) all_args.append(this_arg); } - printf(" %s\n", all_args.toUtf8().constData()); + if (o.arg_placeholder.isEmpty()) { + printf(" %s\n", all_args.toUtf8().constData()); + } else { + printf(" %s <%s>\n", all_args.toUtf8().constData(), o.arg_placeholder.toUtf8().constData()); + } printf(" %s\n\n", o.description.toUtf8().constData()); } diff --git a/app/common/commandlineparser.h b/app/common/commandlineparser.h index 10114d86a..6d1b3f5a3 100644 --- a/app/common/commandlineparser.h +++ b/app/common/commandlineparser.h @@ -33,7 +33,27 @@ public: DISABLE_COPY_MOVE(CommandLineParser) - class Option { + class PositionalArgument + { + public: + PositionalArgument() = default; + + const QString& GetSetting() const + { + return setting_; + } + + void SetSetting(const QString& s) + { + setting_ = s; + } + + private: + QString setting_; + + }; + + class Option : public PositionalArgument { public: Option() { @@ -55,29 +75,9 @@ public: }; - class PositionalArgument - { - public: - PositionalArgument() = default; - - const QString& GetSetting() const - { - return setting_; - } - - void SetSetting(const QString& s) - { - setting_ = s; - } - - private: - QString setting_; - - }; - CommandLineParser() = default; - const Option* AddOption(const QStringList& strings, const QString& description); + const Option* AddOption(const QStringList& strings, const QString& description, bool takes_arg = false, const QString& arg_placeholder = QString()); const PositionalArgument* AddPositionalArgument(const QString& name, const QString& description, bool required = false); @@ -90,6 +90,8 @@ private: QStringList args; QString description; Option* option; + bool takes_arg; + QString arg_placeholder; }; struct KnownPositionalArgument { diff --git a/app/config/config.cpp b/app/config/config.cpp index 2b317a51c..7eda39428 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -68,7 +68,7 @@ void Config::SetDefaults() SetEntryInternal(QStringLiteral("AudioScrubbing"), NodeParam::kBoolean, true); SetEntryInternal(QStringLiteral("AutorecoveryInterval"), NodeParam::kInt, 1); SetEntryInternal(QStringLiteral("DiskCacheSaveInterval"), NodeParam::kInt, 10000); - SetEntryInternal(QStringLiteral("Language"), NodeParam::kString, QLocale::system().name()); + SetEntryInternal(QStringLiteral("Language"), NodeParam::kString, QString()); SetEntryInternal(QStringLiteral("ScrollZooms"), NodeParam::kBoolean, false); SetEntryInternal(QStringLiteral("EnableSeekToImport"), NodeParam::kBoolean, false); SetEntryInternal(QStringLiteral("EditToolAlsoSeeks"), NodeParam::kBoolean, false); diff --git a/app/core.cpp b/app/core.cpp index 791e8b174..73177df15 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -83,6 +83,8 @@ Core::Core(const CoreParams& params) : // Store reference to this object, making the assumption that Core will only ever be made in // main(). This will obviously break if not. instance_ = this; + + translator_ = new QTranslator(this); } Core *Core::instance() @@ -119,6 +121,9 @@ void Core::Start() // Load application config Config::Load(); + // Set locale based on either startup arg, config, or auto-detect + SetStartupLocale(); + // Declare custom types for Qt signal/slot system DeclareTypesForQt(); @@ -906,6 +911,34 @@ QString Core::GetRecentProjectsFilePath() return QDir(FileFunctions::GetConfigurationLocation()).filePath(QStringLiteral("recent")); } +void Core::SetStartupLocale() +{ + // Set language + if (!core_params_.startup_language().isEmpty()) { + if (translator_->load(core_params_.startup_language())) { + if (QApplication::installTranslator(translator_)) { + qDebug() << "Successfully installed language at" << translator_->filePath(); + } else { + qDebug() << "Failed to install translator"; + } + return; + } else { + qWarning() << "Failed to load translation file. Falling back to defaults."; + } + } + + QString use_locale = Config::Current()[QStringLiteral("Language")].toString(); + + if (use_locale.isEmpty()) { + // No configured locale, auto-detect the system's locale + use_locale = QLocale::system().name(); + } + + if (!SetLanguage(use_locale)) { + qWarning() << "Trying to use locale" << use_locale << "but couldn't find a translation for it"; + } +} + bool Core::SaveProject(ProjectPtr p) { if (p->filename().isEmpty()) { @@ -1307,6 +1340,18 @@ bool Core::ValidateFootageInLoadedProject(ProjectPtr project, const QString& pro return true; } +bool Core::SetLanguage(const QString &locale) +{ + QApplication::removeTranslator(translator_); + + QString resource_path = QStringLiteral(":/ts/%1").arg(locale); + if (translator_->load(resource_path) && QApplication::installTranslator(translator_)) { + return true; + } + + return false; +} + bool Core::CloseAllProjects() { return CloseAllProjects(true); diff --git a/app/core.h b/app/core.h index 62257a36a..8e891de28 100644 --- a/app/core.h +++ b/app/core.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "common/rational.h" #include "common/timecodefunctions.h" @@ -93,11 +94,23 @@ public: startup_project_ = p; } + const QString& startup_language() const + { + return startup_language_; + } + + void set_startup_language(const QString& s) + { + startup_language_ = s; + } + private: RunMode mode_; QString startup_project_; + QString startup_language_; + bool run_fullscreen_; }; @@ -273,6 +286,11 @@ public: */ bool ValidateFootageInLoadedProject(ProjectPtr project, const QString &project_saved_url); + /** + * @brief Changes the current language + */ + bool SetLanguage(const QString& locale); + static const uint kProjectVersion; public slots: @@ -431,6 +449,11 @@ private: */ static QString GetRecentProjectsFilePath(); + /** + * @brief Called only on startup to set the locale + */ + void SetStartupLocale(); + /** * @brief Saves a specific project */ @@ -527,6 +550,11 @@ private: */ static Core* instance_; + /** + * @brief Internal translator + */ + QTranslator* translator_; + private slots: void SaveAutorecovery(); diff --git a/app/dialog/preferences/tabs/preferencesgeneraltab.cpp b/app/dialog/preferences/tabs/preferencesgeneraltab.cpp index 520728c36..bb0edc144 100644 --- a/app/dialog/preferences/tabs/preferencesgeneraltab.cpp +++ b/app/dialog/preferences/tabs/preferencesgeneraltab.cpp @@ -25,6 +25,7 @@ #include #include "common/autoscroll.h" +#include "core.h" #include "dialog/sequence/sequence.h" #include "project/item/sequence/sequence.h" @@ -46,34 +47,23 @@ PreferencesGeneralTab::PreferencesGeneralTab() language_combobox_ = new QComboBox(); // Add default language (en-US) - language_combobox_->addItem(QLocale("en_US").nativeLanguageName()); + QDir language_dir(QStringLiteral(":/ts")); + QStringList languages = language_dir.entryList(); + foreach (const QString& l, languages) { + AddLanguage(l); + } - /* - // add languages from file - QList translation_paths = get_language_paths(); + QString current_language = Config::Current()[QStringLiteral("Language")].toString(); + if (current_language.isEmpty()) { + // No configured language, use system language + current_language = QLocale::system().name(); - // iterate through all language search paths - for (int j=0;jaddItem(QLocale(locale_str).nativeLanguageName(), locale_relative_path); - - if (olive::config.language_file == locale_relative_path) { - language_combobox->setCurrentIndex(language_combobox->count() - 1); - } - } - } + // If we don't have a language for this, default to en_US + if (!languages.contains(current_language)) { + current_language = QStringLiteral("en_US"); } - */ + } + language_combobox_->setCurrentIndex(languages.indexOf(current_language)); general_layout->addWidget(language_combobox_, row, 1); @@ -112,11 +102,30 @@ PreferencesGeneralTab::PreferencesGeneralTab() void PreferencesGeneralTab::Accept() { - Config::Current()["RectifiedWaveforms"] = rectified_waveforms_->isChecked(); + Config::Current()[QStringLiteral("RectifiedWaveforms")] = rectified_waveforms_->isChecked(); - Config::Current()["Autoscroll"] = autoscroll_method_->currentData(); + Config::Current()[QStringLiteral("Autoscroll")] = autoscroll_method_->currentData(); - Config::Current()["DefaultStillLength"] = QVariant::fromValue(rational::fromDouble(default_still_length_->GetValue())); + Config::Current()[QStringLiteral("DefaultStillLength")] = QVariant::fromValue(rational::fromDouble(default_still_length_->GetValue())); + + QString set_language = language_combobox_->currentData().toString(); + if (QLocale::system().name() == set_language) { + // Language is set to the system, assume this is effectively "auto" + set_language = QString(); + } + + // If the language has changed, set it now + if (Config::Current()[QStringLiteral("Language")].toString() != set_language) { + Config::Current()[QStringLiteral("Language")] = set_language; + Core::instance()->SetLanguage(set_language.isEmpty() ? QLocale::system().name() : set_language); + } +} + +void PreferencesGeneralTab::AddLanguage(const QString &locale_name) +{ + language_combobox_->addItem(tr("%1 (%2)").arg(QLocale(locale_name).nativeLanguageName(), + locale_name));; + language_combobox_->setItemData(language_combobox_->count() - 1, locale_name); } OLIVE_NAMESPACE_EXIT diff --git a/app/dialog/preferences/tabs/preferencesgeneraltab.h b/app/dialog/preferences/tabs/preferencesgeneraltab.h index 609d182c9..f8cea3b59 100644 --- a/app/dialog/preferences/tabs/preferencesgeneraltab.h +++ b/app/dialog/preferences/tabs/preferencesgeneraltab.h @@ -40,6 +40,8 @@ public: virtual void Accept() override; private: + void AddLanguage(const QString& locale_name); + QComboBox* language_combobox_; QComboBox* autoscroll_method_; diff --git a/app/main.cpp b/app/main.cpp index 3cfa34db2..1392e816c 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -94,6 +94,12 @@ int main(int argc, char *argv[]) parser.AddOption({QStringLiteral("x"), QStringLiteral("-export")}, QCoreApplication::translate("main", "Export only (No GUI)")); + const CommandLineParser::Option* ts_option = + parser.AddOption({QStringLiteral("-ts")}, + QCoreApplication::translate("main", "Override language with file"), + true, + QCoreApplication::translate("main", "qm-file")); + const CommandLineParser::PositionalArgument* project_argument = parser.AddPositionalArgument(QStringLiteral("project"), QCoreApplication::translate("main", "Project to open on startup")); @@ -116,6 +122,14 @@ int main(int argc, char *argv[]) startup_params.set_run_mode(OLIVE_NAMESPACE::Core::CoreParams::kHeadlessExport); } + if (ts_option->IsSet()) { + if (ts_option->GetSetting().isEmpty()) { + qWarning() << "--ts was set but no translation file was provided"; + } else { + startup_params.set_startup_language(ts_option->GetSetting()); + } + } + startup_params.set_fullscreen(fullscreen_option->IsSet()); startup_params.set_startup_project(project_argument->GetSetting()); @@ -156,6 +170,7 @@ int main(int argc, char *argv[]) // Start core OLIVE_NAMESPACE::Core c(startup_params); + c.Start(); int ret = a->exec(); diff --git a/app/ts/CMakeLists.txt b/app/ts/CMakeLists.txt new file mode 100644 index 000000000..ba9b71d9c --- /dev/null +++ b/app/ts/CMakeLists.txt @@ -0,0 +1,20 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_TS_FILES + ts/en_US.ts + PARENT_SCOPE +) diff --git a/app/ts/en_US.ts b/app/ts/en_US.ts new file mode 100644 index 000000000..15dfc47ab --- /dev/null +++ b/app/ts/en_US.ts @@ -0,0 +1,4762 @@ + + + + + AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + + + + + ActionSearch + + + Search for action... + + + + + AudioInput + + + Audio Input + + + + + Audio + + + + + Import an audio footage stream. + + + + + AudioMonitorPanel + + + Audio Monitor + + + + + AudioParams + + + %1 Hz + + + + + Mono + + + + + Stereo + + + + + 2.1 + + + + + 5.1 + + + + + 7.1 + + + + + Unknown (0x%1) + + + + + Block + + + Length + + + + + Media In + + + + + Enabled + + + + + Speed + + + + + BlurFilterNode + + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + + + + + ClipBlock + + + Clip + + + + + A time-based node that represents a media source. + + + + + Buffer + + + + + ColorDialog + + + Select Color + + + + + ColorSpaceChooser + + + Color Management + + + + + Input: + + + + + Color Space: + + + + + Display: + + + + + View: + + + + + Look: + + + + + (None) + + + + + ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + Config + + + Error loading settings + + + + + Failed to load application settings. This session will use defaults. + +%1 + + + + + Error saving settings + + + + + Failed to save application settings. The application may lack write permissions to this location. + + + + + ConformTask + + + Conforming Audio %1:%2 + + + + + Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + + + + + + Error + + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + + + + + CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + CurvePanel + + + Curve Editor + + + + + CurveView + + + Zoom to Fit + + + + + CurveWidget + + + Linear + + + + + Bezier + + + + + Hold + + + + + DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + ExportAdvancedVideoDialog + + + Advanced + + + + + Pixel + + + + + Pixel Format: + + + + + Performance + + + + + Threads: + + + + + ExportAudioTab + + + Codec: + + + + + Sample Rate: + + + + + Channel Layout: + + + + + Format: + + + + + ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + ExportDialog + + + Filename: + + + + + Browse for exported file filename + + + + + Preset: + + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + + + + + Entire Sequence + + + + + In to Out + + + + + Format: + + + + + Export Video + + + + + Export Audio + + + + + Video + + + + + Audio + + + + + + Export + + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + ExportVideoTab + + + Basic + + + + + Width: + + + + + Height: + + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + + Fit + + + + + Stretch + + + + + Crop + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + + + + + Interlacing: + + + + + Quality: + + + + + Codec + + + + + Codec: + + + + + Advanced + + + + + FloatSlider + + + %1 dB + + + + + %1% + + + + + Footage + + + %1 FPS + + + + + %1 Hz + + + + + Filename: %1 + + + + + This footage is not valid for use + + + + + FootagePropertiesDialog + + + "%1" Properties + + + + + Name: + + + + + Tracks: + + + + + FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + + + + + FootageViewerPanel + + + Footage Viewer + + + + + GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + H264FileSizeSection + + + Target File Size (MB): + + + + + Two-Pass + + + + + H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + ImageSection + + + Image Sequence: + + + + + ImportTool + + + Don't ask me again + + + + + No Active Sequence + + + + + No sequence is currently open. Would you like to create one? + + + + + Automatically Detect Parameters From Footage + + + + + Set Parameters Manually + + + + + InterlacedComboBox + + + None (Progressive) + + + + + Top-Field First + + + + + Bottom-Field First + + + + + KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + + + + + Hold + + + + + Bezier + + + + + KeyframeViewBase + + + Linear + + + + + Bezier + + + + + Hold + + + + + P&roperties + + + + + LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + + + + + Save Project &As + + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + + + + + &Edit + + + + + Insert + + + + + Overwrite + + + + + Select &All + + + + + Deselect All + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Full Screen + + + + + Full Screen Viewer + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + + + Loop + + + + + &Sequence + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + + + + + Lock Panels + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Preferences + + + + + &Help + + + + + A&ction Search + + + + + Send &Feedback... + + + + + &About... + + + + + MainStatusBar + + + Welcome to %1 %2 + + + + + Running %1 background tasks + + + + + MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + + + + + Rotation + + + + + Scale + + + + + Uniform Scale + + + + + Anchor Point + + + + + MediaInput + + + Footage + + + + + MenuShared + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Cu&t + + + + + Cop&y + + + + + &Paste + + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Set In Point + + + + + Set Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Seconds + + + + + MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + Node + + + Input + + + + + Output + + + + + General + + + + + Math + + + + + Color + + + + + Filter + + + + + Timeline + + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + NodeCopyPasteWidget + + + Error pasting nodes + + + + + Failed to paste nodes: %1 + + + + + NodeFactory + + + None + + + + + NodeInput + + + Input + + + + + NodeOutput + + + Output + + + + + NodePanel + + + Node Editor + + + + + NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + + + + + Matrix + + + + + Text + + + + + Font + + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + NodeParamViewItem + + + %1 (%2) + + + + + NodeParamViewItemBody + + + %1: + + + + + NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + NodeTablePanel + + + Table View + + + + + NodeTableView + + + Type + + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + + (unknown) + + + + + NodeTreeView + + + Nodes + + + + + NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + + + + + NodeViewItem + + + %1... + + + + + PanNode + + + + Pan + + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + PanelWidget + + + %1: %2 + + + + + ParamPanel + + + Parameter Editor + + + + + (none) + + + + + (multiple) + + + + + PathWidget + + + Browse + + + + + Browse for path + + + + + PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + PixelSamplerPanel + + + Pixel Sampler + + + + + PixelSamplerWidget + + + Color + + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + + + + + PreCacheTask + + + Pre-caching %1:%2 + + + + + PreferencesAppearanceTab + + + Theme + + + + + Node Color Scheme + + + + + PreferencesAudioTab + + + Output Device: + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio Recording: + + + + + Mono + + + + + Stereo + + + + + Refresh Devices + + + + + Please wait... + + + + + Default + + + + + PreferencesBehaviorTab + + + Behavior + + + + + General + + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + + + + + Enable audio scrubbing + + + + + Timeline + + + + + Auto-Seek to Imported Clips + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Enable Drag Files to Timeline + + + + + Invert Timeline Scroll Axes + + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Selecting Also Seeks + + + + + Playback + + + + + Ask For Name When Setting Marker + + + + + Automatically rewind at the end of a sequence + + + + + Project + + + + + Drop Files on Media to Replace + + + + + Nodes + + + + + Add Default Effects to New Clips + + + + + Auto-Scale By Default + + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + PreferencesDialog + + + Preferences + + + + + General + + + + + Appearance + + + + + Behavior + + + + + Disk + + + + + Audio + + + + + Keyboard + + + + + PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + PreferencesGeneralTab + + + Language: + + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + PreferencesKeyboardTab + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + PresetManager + + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + + + + + ProgressDialog + + + Cancel + + + + + Project + + + + (untitled) + + + + + ProjectExplorer + + + &New + + + + + &Import... + + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + ProjectExplorerNavigation + + + Go to parent folder + + + + + ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + ProjectImportTask + + + Importing %1 files + + + + + ProjectLoadBaseTask + + + Loading '%1' + + + + + ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + ProjectPanel + + + Folder + + + + + Project + + + + + (none) + + + + + ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + ProjectToolbar + + + New... + + + + + Open Project + + + + + Save Project + + + + + Undo + + + + + Redo + + + + + Search media, markers, etc. + + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + ProjectViewModel + + + Name + + + + + Duration + + + + + Rate + + + + + Move Items + + + + + ProjectViewModel::MoveItemCommand + + + Move Item + + + + + ProjectViewModel::RenameItemCommand + + + Rename Item + + + + + RatioDialog + + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + + + + + Invalid custom ratio + + + + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + + + + + RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + RichTextDialog + + + B + + + + + Bold + + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + Sequence + + + %1 FPS + + + + + SequenceDialog + + + Name: + + + + + New Sequence + + + + + Editing "%1" + + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + SequenceDialogParameterTab + + + Video + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + + + + + Interlacing: + + + + + Audio + + + + + Sample Rate: + + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + + + + + 720p + + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + SequenceViewerPanel + + + Sequence Viewer + + + + + SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + + + + + Stream + + + %1: Audio - %2 Channels, %3Hz + + + + + %1: Unknown + + + + + %1: Image - %2x%3 + + + + + %1: Video - %2x%3 + + + + + StringSlider + + + (none) + + + + + StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + + + + + Radius + + + + + Opacity + + + + + Inner + + + + + Task + + + Task + + + + + Unknown error + + + + + TaskDialog + + + Task Failed + + + + + TaskManagerPanel + + + Task Manager + + + + + TaskViewItem + + + Error: %1 + + + + + TextGenerator + + + Sample Text + + + + + + Text + + + + + Generate rich text. + + + + + Font + + + + + Font Size + + + + + Color + + + + + Vertical Align + + + + + Top + + + + + Center + + + + + Bottom + + + + + TimeBasedPanel + + + (none) + + + + + TimeBasedWidget + + + Set Marker + + + + + Marker name: + + + + + TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + TimelinePanel + + + Timeline + + + + + TimelineViewBlockItem + + + %1 + +In: %2 +Out: %3 +Length: %4 + + + + + TimelineWidget + + + + Properties + + + + + Use Audio Time Units + + + + + Tool + + + Empty + + + + + Bars + + + + + Solid + + + + + Title + + + + + Tone + + + + + Unknown + + + + + ToolPanel + + + Tools + + + + + Toolbar + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + TrackViewItem + + + M + + + + + L + + + + + TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + + + + + Exponential + + + + + Logarithmic + + + + + TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + VideoDividerComboBox + + + Full + + + + + 1/%1 + + + + + VideoInput + + + Video Input + + + + + Video + + + + + Import a video footage stream. + + + + + VideoParams + + + 8-bit + + + + + 16-bit Integer + + + + + Half-Float (16-bit) + + + + + Full-Float (32-bit) + + + + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + + + + + VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + ViewerPanel + + + Viewer + + + + + ViewerWidget + + + Error + + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + + + + + Fit + + + + + %1% + + + + + Full Screen + + + + + Screen %1: %2x%3 + + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + VolumeNode + + + + Volume + + + + + Adjusts the volume of an audio source. + + + + + Samples + + + + + main + + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + Project to open on startup + + + + diff --git a/app/ts/translations.qrc.in b/app/ts/translations.qrc.in new file mode 100644 index 000000000..c86dc346d --- /dev/null +++ b/app/ts/translations.qrc.in @@ -0,0 +1,5 @@ + + + @QRC_BODY@ + + diff --git a/app/widget/panel/panel.h b/app/widget/panel/panel.h index 1d25f5eba..ae98c464a 100644 --- a/app/widget/panel/panel.h +++ b/app/widget/panel/panel.h @@ -31,7 +31,8 @@ OLIVE_NAMESPACE_ENTER /** * @brief A widget that is always dockable within the MainWindow. */ -class PanelWidget : public QDockWidget { +class PanelWidget : public QDockWidget +{ Q_OBJECT public: /** diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h index 6846c469e..91e03a8ba 100644 --- a/app/window/mainwindow/mainwindow.h +++ b/app/window/mainwindow/mainwindow.h @@ -49,7 +49,8 @@ OLIVE_NAMESPACE_ENTER /** * @brief Olive's main window responsible for docking widgets and the main menu bar. */ -class MainWindow : public QMainWindow { +class MainWindow : public QMainWindow +{ Q_OBJECT public: MainWindow(QWidget *parent = nullptr); From 15a29288aa265225090e7ea10355a1d914102d81 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 19:13:16 +1100 Subject: [PATCH 55/72] added Q_OBJECT macro to classes that were missing it --- app/codec/exportcodec.h | 4 +++- app/codec/exportformat.h | 4 +++- app/dialog/export/codec/codecsection.h | 1 + app/dialog/export/codec/h264section.h | 4 ++++ app/dialog/export/codec/imagesection.h | 1 + app/dialog/export/exportaudiotab.h | 1 + .../streamproperties/videostreamproperties.h | 1 + app/node/audio/pan/pan.h | 1 + app/node/audio/volume/volume.h | 1 + .../crossdissolve/crossdissolvetransition.h | 1 + .../transition/diptocolor/diptocolortransition.h | 1 + app/node/block/transition/transition.h | 1 + app/node/filter/blur/blur.h | 1 + app/node/filter/stroke/stroke.h | 1 + app/node/generator/polygon/polygon.h | 1 + app/node/generator/solid/solid.h | 1 + app/node/generator/text/text.h | 1 + app/node/input/media/audio/audio.h | 1 + app/node/input/media/video/video.h | 1 + app/node/math/math/math.h | 1 + app/node/math/merge/merge.h | 1 + app/node/math/trigonometry/trigonometry.h | 1 + app/node/output.h | 1 + app/panel/audiomonitor/audiomonitor.h | 1 + app/panel/sequenceviewer/sequenceviewer.h | 1 + app/project/projectviewmodel.cpp | 4 ++-- app/project/projectviewmodel.h | 1 + app/task/conform/conform.h | 1 + app/task/precache/precachetask.h | 1 + app/widget/nodetableview/nodetableview.h | 1 + app/widget/timelinewidget/tool/import.cpp | 15 +++++---------- app/widget/timelinewidget/tool/import.h | 2 -- 32 files changed, 43 insertions(+), 16 deletions(-) diff --git a/app/codec/exportcodec.h b/app/codec/exportcodec.h index d7a41124b..0c9ee0d12 100644 --- a/app/codec/exportcodec.h +++ b/app/codec/exportcodec.h @@ -28,7 +28,9 @@ OLIVE_NAMESPACE_ENTER -class ExportCodec : public QObject { +class ExportCodec : public QObject +{ + Q_OBJECT public: enum Codec { kCodecDNxHD, diff --git a/app/codec/exportformat.h b/app/codec/exportformat.h index 566bb3175..c886f6b5c 100644 --- a/app/codec/exportformat.h +++ b/app/codec/exportformat.h @@ -29,7 +29,9 @@ OLIVE_NAMESPACE_ENTER -class ExportFormat : public QObject { +class ExportFormat : public QObject +{ + Q_OBJECT public: enum Format { kFormatDNxHD, diff --git a/app/dialog/export/codec/codecsection.h b/app/dialog/export/codec/codecsection.h index e187b0df7..77a42e84e 100644 --- a/app/dialog/export/codec/codecsection.h +++ b/app/dialog/export/codec/codecsection.h @@ -29,6 +29,7 @@ OLIVE_NAMESPACE_ENTER class CodecSection : public QWidget { + Q_OBJECT public: CodecSection(QWidget* parent = nullptr); diff --git a/app/dialog/export/codec/h264section.h b/app/dialog/export/codec/h264section.h index 6e85e632a..f357d4375 100644 --- a/app/dialog/export/codec/h264section.h +++ b/app/dialog/export/codec/h264section.h @@ -31,6 +31,7 @@ OLIVE_NAMESPACE_ENTER class H264CRFSection : public QWidget { + Q_OBJECT public: H264CRFSection(QWidget* parent = nullptr); @@ -49,6 +50,7 @@ private: class H264BitRateSection : public QWidget { + Q_OBJECT public: H264BitRateSection(QWidget* parent = nullptr); @@ -71,6 +73,7 @@ private: class H264FileSizeSection : public QWidget { + Q_OBJECT public: H264FileSizeSection(QWidget* parent = nullptr); @@ -86,6 +89,7 @@ private: class H264Section : public CodecSection { + Q_OBJECT public: enum CompressionMethod { kConstantRateFactor, diff --git a/app/dialog/export/codec/imagesection.h b/app/dialog/export/codec/imagesection.h index a40d4dd8a..5fa60dbdc 100644 --- a/app/dialog/export/codec/imagesection.h +++ b/app/dialog/export/codec/imagesection.h @@ -29,6 +29,7 @@ OLIVE_NAMESPACE_ENTER class ImageSection : public CodecSection { + Q_OBJECT public: ImageSection(QWidget* parent = nullptr); diff --git a/app/dialog/export/exportaudiotab.h b/app/dialog/export/exportaudiotab.h index 924d0b655..51aaa8f32 100644 --- a/app/dialog/export/exportaudiotab.h +++ b/app/dialog/export/exportaudiotab.h @@ -31,6 +31,7 @@ OLIVE_NAMESPACE_ENTER class ExportAudioTab : public QWidget { + Q_OBJECT public: ExportAudioTab(QWidget* parent = nullptr); diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.h b/app/dialog/footageproperties/streamproperties/videostreamproperties.h index 2b82b80d1..e83ebd8da 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.h +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.h @@ -34,6 +34,7 @@ OLIVE_NAMESPACE_ENTER class VideoStreamProperties : public StreamProperties { + Q_OBJECT public: VideoStreamProperties(VideoStreamPtr stream); diff --git a/app/node/audio/pan/pan.h b/app/node/audio/pan/pan.h index 9ec58b110..d8d9f3989 100644 --- a/app/node/audio/pan/pan.h +++ b/app/node/audio/pan/pan.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class PanNode : public Node { + Q_OBJECT public: PanNode(); diff --git a/app/node/audio/volume/volume.h b/app/node/audio/volume/volume.h index c17656241..e4c0ce5d4 100644 --- a/app/node/audio/volume/volume.h +++ b/app/node/audio/volume/volume.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class VolumeNode : public MathNodeBase { + Q_OBJECT public: VolumeNode(); diff --git a/app/node/block/transition/crossdissolve/crossdissolvetransition.h b/app/node/block/transition/crossdissolve/crossdissolvetransition.h index 98daf4330..8b6d3157c 100644 --- a/app/node/block/transition/crossdissolve/crossdissolvetransition.h +++ b/app/node/block/transition/crossdissolve/crossdissolvetransition.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class CrossDissolveTransition : public TransitionBlock { + Q_OBJECT public: CrossDissolveTransition(); diff --git a/app/node/block/transition/diptocolor/diptocolortransition.h b/app/node/block/transition/diptocolor/diptocolortransition.h index 660b5fcfc..127c5682c 100644 --- a/app/node/block/transition/diptocolor/diptocolortransition.h +++ b/app/node/block/transition/diptocolor/diptocolortransition.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class DipToColorTransition : public TransitionBlock { + Q_OBJECT public: DipToColorTransition(); diff --git a/app/node/block/transition/transition.h b/app/node/block/transition/transition.h index d8c5c6a39..4a01e6fb1 100644 --- a/app/node/block/transition/transition.h +++ b/app/node/block/transition/transition.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class TransitionBlock : public Block { + Q_OBJECT public: TransitionBlock(); diff --git a/app/node/filter/blur/blur.h b/app/node/filter/blur/blur.h index 088363991..5fd7cc12d 100644 --- a/app/node/filter/blur/blur.h +++ b/app/node/filter/blur/blur.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class BlurFilterNode : public Node { + Q_OBJECT public: BlurFilterNode(); diff --git a/app/node/filter/stroke/stroke.h b/app/node/filter/stroke/stroke.h index 044f9ba95..418647370 100644 --- a/app/node/filter/stroke/stroke.h +++ b/app/node/filter/stroke/stroke.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class StrokeFilterNode : public Node { + Q_OBJECT public: StrokeFilterNode(); diff --git a/app/node/generator/polygon/polygon.h b/app/node/generator/polygon/polygon.h index d764ae7be..fb3aeeeae 100644 --- a/app/node/generator/polygon/polygon.h +++ b/app/node/generator/polygon/polygon.h @@ -28,6 +28,7 @@ OLIVE_NAMESPACE_ENTER class PolygonGenerator : public Node { + Q_OBJECT public: PolygonGenerator(); diff --git a/app/node/generator/solid/solid.h b/app/node/generator/solid/solid.h index 101c8f15a..3572c3cd3 100644 --- a/app/node/generator/solid/solid.h +++ b/app/node/generator/solid/solid.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class SolidGenerator : public Node { + Q_OBJECT public: SolidGenerator(); diff --git a/app/node/generator/text/text.h b/app/node/generator/text/text.h index cb80fd035..89d2661a3 100644 --- a/app/node/generator/text/text.h +++ b/app/node/generator/text/text.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class TextGenerator : public Node { + Q_OBJECT public: TextGenerator(); diff --git a/app/node/input/media/audio/audio.h b/app/node/input/media/audio/audio.h index 5cebdcc3c..0af4e0267 100644 --- a/app/node/input/media/audio/audio.h +++ b/app/node/input/media/audio/audio.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class AudioInput : public MediaInput { + Q_OBJECT public: AudioInput() = default; diff --git a/app/node/input/media/video/video.h b/app/node/input/media/video/video.h index 7000ea82b..caa90c2ac 100644 --- a/app/node/input/media/video/video.h +++ b/app/node/input/media/video/video.h @@ -30,6 +30,7 @@ OLIVE_NAMESPACE_ENTER class VideoInput : public MediaInput { + Q_OBJECT public: VideoInput() = default; diff --git a/app/node/math/math/math.h b/app/node/math/math/math.h index 97edcdf0b..04bd1debe 100644 --- a/app/node/math/math/math.h +++ b/app/node/math/math/math.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class MathNode : public MathNodeBase { + Q_OBJECT public: MathNode(); diff --git a/app/node/math/merge/merge.h b/app/node/math/merge/merge.h index 57182caaf..52d59a97d 100644 --- a/app/node/math/merge/merge.h +++ b/app/node/math/merge/merge.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class MergeNode : public Node { + Q_OBJECT public: MergeNode(); diff --git a/app/node/math/trigonometry/trigonometry.h b/app/node/math/trigonometry/trigonometry.h index b1524616a..a0e4f5d71 100644 --- a/app/node/math/trigonometry/trigonometry.h +++ b/app/node/math/trigonometry/trigonometry.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class TrigonometryNode : public Node { + Q_OBJECT public: TrigonometryNode(); diff --git a/app/node/output.h b/app/node/output.h index 42c5f5ec6..10439bf0f 100644 --- a/app/node/output.h +++ b/app/node/output.h @@ -31,6 +31,7 @@ OLIVE_NAMESPACE_ENTER */ class NodeOutput : public NodeParam { + Q_OBJECT public: /** * @brief NodeOutput Constructor diff --git a/app/panel/audiomonitor/audiomonitor.h b/app/panel/audiomonitor/audiomonitor.h index 513ec2750..f9fc32667 100644 --- a/app/panel/audiomonitor/audiomonitor.h +++ b/app/panel/audiomonitor/audiomonitor.h @@ -31,6 +31,7 @@ OLIVE_NAMESPACE_ENTER */ class AudioMonitorPanel : public PanelWidget { + Q_OBJECT public: AudioMonitorPanel(QWidget* parent = nullptr); diff --git a/app/panel/sequenceviewer/sequenceviewer.h b/app/panel/sequenceviewer/sequenceviewer.h index 4182bb793..a0e0ebdca 100644 --- a/app/panel/sequenceviewer/sequenceviewer.h +++ b/app/panel/sequenceviewer/sequenceviewer.h @@ -27,6 +27,7 @@ OLIVE_NAMESPACE_ENTER class SequenceViewerPanel : public ViewerPanel { + Q_OBJECT public: SequenceViewerPanel(QWidget* parent); diff --git a/app/project/projectviewmodel.cpp b/app/project/projectviewmodel.cpp index a1ba9b481..d5ff1b552 100644 --- a/app/project/projectviewmodel.cpp +++ b/app/project/projectviewmodel.cpp @@ -509,7 +509,7 @@ ProjectViewModel::MoveItemCommand::MoveItemCommand(ProjectViewModel *model, { source_ = static_cast(item->parent()); - setText(tr("Move Item")); + setText(QCoreApplication::translate("MoveItemCommand", "Move Item")); } Project *ProjectViewModel::MoveItemCommand::GetRelevantProject() const @@ -535,7 +535,7 @@ ProjectViewModel::RenameItemCommand::RenameItemCommand(ProjectViewModel* model, { old_name_ = item->name(); - setText(tr("Rename Item")); + setText(QCoreApplication::translate("RenameItemCommand", "Rename Item")); } Project *ProjectViewModel::RenameItemCommand::GetRelevantProject() const diff --git a/app/project/projectviewmodel.h b/app/project/projectviewmodel.h index e3de6e33a..255c76d36 100644 --- a/app/project/projectviewmodel.h +++ b/app/project/projectviewmodel.h @@ -39,6 +39,7 @@ OLIVE_NAMESPACE_ENTER */ class ProjectViewModel : public QAbstractItemModel { + Q_OBJECT public: enum ColumnType { /// Media name diff --git a/app/task/conform/conform.h b/app/task/conform/conform.h index b65d2d689..99e8b7c5f 100644 --- a/app/task/conform/conform.h +++ b/app/task/conform/conform.h @@ -29,6 +29,7 @@ OLIVE_NAMESPACE_ENTER class ConformTask : public Task { + Q_OBJECT public: ConformTask(AudioStreamPtr stream, const AudioParams& params); diff --git a/app/task/precache/precachetask.h b/app/task/precache/precachetask.h index 960d2fa02..6708475a7 100644 --- a/app/task/precache/precachetask.h +++ b/app/task/precache/precachetask.h @@ -30,6 +30,7 @@ OLIVE_NAMESPACE_ENTER class PreCacheTask : public RenderTask { + Q_OBJECT public: PreCacheTask(VideoStreamPtr footage, Sequence* sequence); diff --git a/app/widget/nodetableview/nodetableview.h b/app/widget/nodetableview/nodetableview.h index de5d920d3..c049e5bb6 100644 --- a/app/widget/nodetableview/nodetableview.h +++ b/app/widget/nodetableview/nodetableview.h @@ -29,6 +29,7 @@ OLIVE_NAMESPACE_ENTER class NodeTableView : public QTreeWidget { + Q_OBJECT public: NodeTableView(QWidget* parent = nullptr); diff --git a/app/widget/timelinewidget/tool/import.cpp b/app/widget/timelinewidget/tool/import.cpp index f1f7e83fd..2a012ee5e 100644 --- a/app/widget/timelinewidget/tool/import.cpp +++ b/app/widget/timelinewidget/tool/import.cpp @@ -314,17 +314,17 @@ void ImportTool::DropGhosts(bool insert) DropWithoutSequenceBehavior behavior = static_cast(Config::Current()["DropWithoutSequenceBehavior"].toInt()); if (behavior == kDWSAsk) { - QCheckBox* dont_ask_again_box = new QCheckBox(tr("Don't ask me again")); + QCheckBox* dont_ask_again_box = new QCheckBox(QCoreApplication::translate("ImportTool", "Don't ask me again")); QMessageBox mbox(parent()); mbox.setIcon(QMessageBox::Question); - mbox.setWindowTitle(tr("No Active Sequence")); - mbox.setText(tr("No sequence is currently open. Would you like to create one?")); + mbox.setWindowTitle(QCoreApplication::translate("ImportTool", "No Active Sequence")); + mbox.setText(QCoreApplication::translate("ImportTool", "No sequence is currently open. Would you like to create one?")); mbox.setCheckBox(dont_ask_again_box); - QPushButton* auto_params_btn = mbox.addButton(tr("Automatically Detect Parameters From Footage"), QMessageBox::YesRole); - QPushButton* manual_params_btn = mbox.addButton(tr("Set Parameters Manually"), QMessageBox::NoRole); + QPushButton* auto_params_btn = mbox.addButton(QCoreApplication::translate("ImportTool", "Automatically Detect Parameters From Footage"), QMessageBox::YesRole); + QPushButton* manual_params_btn = mbox.addButton(QCoreApplication::translate("ImportTool", "Set Parameters Manually"), QMessageBox::NoRole); mbox.addButton(QMessageBox::Cancel); mbox.exec(); @@ -498,9 +498,4 @@ QList ImportTool::FootageToDraggedFootage(QList FootageToDraggedFootage(QList footage); - QString tr(const char* s); - void FootageToGhosts(rational ghost_start, const QList& footage, const rational &dest_tb, const int &track_start); void PrepGhosts(const rational &frame, const int &track_index); From d241090a9f262dad2e9bc80725368e9286f90434 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 20:13:22 +1100 Subject: [PATCH 56/72] finally updated the copyright year --- CMakeLists.txt | 2 +- app/CMakeLists.txt | 2 +- app/audio/CMakeLists.txt | 2 +- app/audio/audiomanager.cpp | 2 +- app/audio/audiomanager.h | 2 +- app/audio/audiovisualwaveform.cpp | 2 +- app/audio/audiovisualwaveform.h | 2 +- app/audio/outputdeviceproxy.cpp | 2 +- app/audio/outputdeviceproxy.h | 2 +- app/audio/outputmanager.cpp | 2 +- app/audio/outputmanager.h | 2 +- app/audio/tempoprocessor.cpp | 2 +- app/audio/tempoprocessor.h | 2 +- app/cli/CMakeLists.txt | 2 +- app/cli/cliexport/cliexportmanager.cpp | 2 +- app/cli/cliexport/cliexportmanager.h | 2 +- app/cli/cliprogress/CMakeLists.txt | 2 +- app/cli/cliprogress/cliprogressdialog.cpp | 2 +- app/cli/cliprogress/cliprogressdialog.h | 2 +- app/cli/clitask/CMakeLists.txt | 2 +- app/cli/clitask/clitaskdialog.cpp | 2 +- app/cli/clitask/clitaskdialog.h | 2 +- app/codec/CMakeLists.txt | 2 +- app/codec/decoder.cpp | 2 +- app/codec/decoder.h | 2 +- app/codec/encoder.cpp | 2 +- app/codec/encoder.h | 2 +- app/codec/exportcodec.cpp | 2 +- app/codec/exportcodec.h | 2 +- app/codec/exportformat.cpp | 2 +- app/codec/exportformat.h | 2 +- app/codec/ffmpeg/CMakeLists.txt | 2 +- app/codec/ffmpeg/avframeptr.h | 2 +- app/codec/ffmpeg/ffmpegdecoder.cpp | 2 +- app/codec/ffmpeg/ffmpegdecoder.h | 2 +- app/codec/ffmpeg/ffmpegencoder.cpp | 2 +- app/codec/ffmpeg/ffmpegencoder.h | 2 +- app/codec/ffmpeg/ffmpegframepool.cpp | 2 +- app/codec/ffmpeg/ffmpegframepool.h | 2 +- app/codec/frame.cpp | 2 +- app/codec/frame.h | 2 +- app/codec/oiio/CMakeLists.txt | 2 +- app/codec/oiio/oiiodecoder.cpp | 2 +- app/codec/oiio/oiiodecoder.h | 2 +- app/codec/samplebuffer.cpp | 2 +- app/codec/samplebuffer.h | 2 +- app/codec/waveinput.cpp | 2 +- app/codec/waveinput.h | 2 +- app/codec/waveoutput.cpp | 2 +- app/codec/waveoutput.h | 2 +- app/common/CMakeLists.txt | 2 +- app/common/autoscroll.h | 2 +- app/common/bezier.cpp | 2 +- app/common/bezier.h | 2 +- app/common/cancelableobject.h | 2 +- app/common/channellayout.h | 2 +- app/common/clamp.h | 2 +- app/common/commandlineparser.cpp | 2 +- app/common/commandlineparser.h | 2 +- app/common/crashpadinterface.cpp | 2 +- app/common/crashpadinterface.h | 2 +- app/common/crashpadutils.h | 2 +- app/common/debug.cpp | 2 +- app/common/debug.h | 2 +- app/common/define.h | 2 +- app/common/ffmpegutils.cpp | 2 +- app/common/ffmpegutils.h | 2 +- app/common/filefunctions.cpp | 2 +- app/common/filefunctions.h | 2 +- app/common/flipmodifiers.cpp | 2 +- app/common/flipmodifiers.h | 2 +- app/common/functiontimer.h | 2 +- app/common/lerp.h | 2 +- app/common/memorypool.h | 2 +- app/common/ocioutils.cpp | 2 +- app/common/ocioutils.h | 2 +- app/common/oiioutils.cpp | 2 +- app/common/oiioutils.h | 2 +- app/common/power.h | 2 +- app/common/qtutils.cpp | 2 +- app/common/qtutils.h | 2 +- app/common/range.h | 2 +- app/common/ratiodialog.cpp | 2 +- app/common/ratiodialog.h | 2 +- app/common/threadedobject.cpp | 2 +- app/common/threadedobject.h | 2 +- app/common/timecodefunctions.cpp | 2 +- app/common/timecodefunctions.h | 2 +- app/common/timerange.cpp | 2 +- app/common/timerange.h | 2 +- app/common/xmlutils.cpp | 2 +- app/common/xmlutils.h | 2 +- app/config/CMakeLists.txt | 2 +- app/config/config.cpp | 2 +- app/config/config.h | 2 +- app/core.cpp | 2 +- app/core.h | 2 +- app/dialog/CMakeLists.txt | 2 +- app/dialog/about/CMakeLists.txt | 2 +- app/dialog/about/about.cpp | 2 +- app/dialog/about/about.h | 2 +- app/dialog/actionsearch/CMakeLists.txt | 2 +- app/dialog/color/CMakeLists.txt | 2 +- app/dialog/color/colordialog.cpp | 2 +- app/dialog/color/colordialog.h | 2 +- app/dialog/crashhandler/crashhandler.cpp | 2 +- app/dialog/crashhandler/crashhandler.h | 2 +- app/dialog/crashhandler/crashhandlermain.cpp | 2 +- app/dialog/diskcache/CMakeLists.txt | 2 +- app/dialog/diskcache/diskcachedialog.cpp | 2 +- app/dialog/diskcache/diskcachedialog.h | 2 +- app/dialog/export/CMakeLists.txt | 2 +- app/dialog/export/codec/CMakeLists.txt | 2 +- app/dialog/export/codec/codecsection.cpp | 2 +- app/dialog/export/codec/codecsection.h | 2 +- app/dialog/export/codec/h264section.cpp | 2 +- app/dialog/export/codec/h264section.h | 2 +- app/dialog/export/codec/imagesection.cpp | 2 +- app/dialog/export/codec/imagesection.h | 2 +- app/dialog/export/export.cpp | 2 +- app/dialog/export/export.h | 2 +- app/dialog/export/exportaudiotab.cpp | 2 +- app/dialog/export/exportaudiotab.h | 2 +- app/dialog/export/exportvideotab.cpp | 2 +- app/dialog/export/exportvideotab.h | 2 +- app/dialog/footageproperties/CMakeLists.txt | 2 +- app/dialog/footageproperties/footageproperties.cpp | 2 +- app/dialog/footageproperties/footageproperties.h | 2 +- app/dialog/footageproperties/streamproperties/CMakeLists.txt | 2 +- .../streamproperties/audiostreamproperties.cpp | 2 +- .../footageproperties/streamproperties/audiostreamproperties.h | 2 +- .../footageproperties/streamproperties/streamproperties.cpp | 2 +- .../footageproperties/streamproperties/streamproperties.h | 2 +- .../streamproperties/videostreamproperties.cpp | 2 +- .../footageproperties/streamproperties/videostreamproperties.h | 2 +- app/dialog/footagerelink/CMakeLists.txt | 2 +- app/dialog/keyframeproperties/CMakeLists.txt | 2 +- app/dialog/keyframeproperties/keyframeproperties.cpp | 2 +- app/dialog/keyframeproperties/keyframeproperties.h | 2 +- app/dialog/preferences/CMakeLists.txt | 2 +- app/dialog/preferences/keysequenceeditor.cpp | 2 +- app/dialog/preferences/keysequenceeditor.h | 2 +- app/dialog/preferences/preferences.cpp | 2 +- app/dialog/preferences/preferences.h | 2 +- app/dialog/preferences/tabs/CMakeLists.txt | 2 +- app/dialog/preferences/tabs/preferencesappearancetab.cpp | 2 +- app/dialog/preferences/tabs/preferencesappearancetab.h | 2 +- app/dialog/preferences/tabs/preferencesaudiotab.cpp | 2 +- app/dialog/preferences/tabs/preferencesaudiotab.h | 2 +- app/dialog/preferences/tabs/preferencesbehaviortab.cpp | 2 +- app/dialog/preferences/tabs/preferencesbehaviortab.h | 2 +- app/dialog/preferences/tabs/preferencesdisktab.cpp | 2 +- app/dialog/preferences/tabs/preferencesdisktab.h | 2 +- app/dialog/preferences/tabs/preferencesgeneraltab.cpp | 2 +- app/dialog/preferences/tabs/preferencesgeneraltab.h | 2 +- app/dialog/preferences/tabs/preferenceskeyboardtab.cpp | 2 +- app/dialog/preferences/tabs/preferenceskeyboardtab.h | 2 +- app/dialog/preferences/tabs/preferencestab.cpp | 2 +- app/dialog/preferences/tabs/preferencestab.h | 2 +- app/dialog/progress/CMakeLists.txt | 2 +- app/dialog/progress/progress.cpp | 2 +- app/dialog/progress/progress.h | 2 +- app/dialog/projectproperties/CMakeLists.txt | 2 +- app/dialog/projectproperties/projectproperties.cpp | 2 +- app/dialog/projectproperties/projectproperties.h | 2 +- app/dialog/rendercancel/CMakeLists.txt | 2 +- app/dialog/rendercancel/rendercancel.cpp | 2 +- app/dialog/rendercancel/rendercancel.h | 2 +- app/dialog/richtext/CMakeLists.txt | 2 +- app/dialog/richtext/richtext.cpp | 2 +- app/dialog/richtext/richtext.h | 2 +- app/dialog/sequence/CMakeLists.txt | 2 +- app/dialog/sequence/presetmanager.h | 2 +- app/dialog/sequence/sequence.cpp | 2 +- app/dialog/sequence/sequence.h | 2 +- app/dialog/sequence/sequencedialogpresettab.cpp | 2 +- app/dialog/sequence/sequencedialogpresettab.h | 2 +- app/dialog/sequence/sequencepreset.h | 2 +- app/dialog/task/CMakeLists.txt | 2 +- app/dialog/task/task.cpp | 2 +- app/dialog/task/task.h | 2 +- app/main.cpp | 2 +- app/node/CMakeLists.txt | 2 +- app/node/audio/CMakeLists.txt | 2 +- app/node/audio/pan/CMakeLists.txt | 2 +- app/node/audio/pan/pan.cpp | 2 +- app/node/audio/pan/pan.h | 2 +- app/node/audio/volume/CMakeLists.txt | 2 +- app/node/audio/volume/volume.cpp | 2 +- app/node/audio/volume/volume.h | 2 +- app/node/block/CMakeLists.txt | 2 +- app/node/block/block.cpp | 2 +- app/node/block/block.h | 2 +- app/node/block/clip/CMakeLists.txt | 2 +- app/node/block/clip/clip.cpp | 2 +- app/node/block/clip/clip.h | 2 +- app/node/block/gap/CMakeLists.txt | 2 +- app/node/block/gap/gap.cpp | 2 +- app/node/block/gap/gap.h | 2 +- app/node/block/transition/CMakeLists.txt | 2 +- app/node/block/transition/crossdissolve/CMakeLists.txt | 2 +- .../block/transition/crossdissolve/crossdissolvetransition.cpp | 2 +- .../block/transition/crossdissolve/crossdissolvetransition.h | 2 +- app/node/block/transition/diptocolor/CMakeLists.txt | 2 +- app/node/block/transition/diptocolor/diptocolortransition.cpp | 2 +- app/node/block/transition/diptocolor/diptocolortransition.h | 2 +- app/node/block/transition/transition.cpp | 2 +- app/node/block/transition/transition.h | 2 +- app/node/edge.cpp | 2 +- app/node/edge.h | 2 +- app/node/factory.cpp | 2 +- app/node/factory.h | 2 +- app/node/filter/CMakeLists.txt | 2 +- app/node/filter/blur/CMakeLists.txt | 2 +- app/node/filter/blur/blur.cpp | 2 +- app/node/filter/blur/blur.h | 2 +- app/node/filter/stroke/CMakeLists.txt | 2 +- app/node/filter/stroke/stroke.cpp | 2 +- app/node/filter/stroke/stroke.h | 2 +- app/node/generator/CMakeLists.txt | 2 +- app/node/generator/matrix/CMakeLists.txt | 2 +- app/node/generator/matrix/matrix.cpp | 2 +- app/node/generator/matrix/matrix.h | 2 +- app/node/generator/polygon/CMakeLists.txt | 2 +- app/node/generator/polygon/polygon.cpp | 2 +- app/node/generator/polygon/polygon.h | 2 +- app/node/generator/solid/CMakeLists.txt | 2 +- app/node/generator/solid/solid.cpp | 2 +- app/node/generator/solid/solid.h | 2 +- app/node/generator/text/CMakeLists.txt | 2 +- app/node/generator/text/text.cpp | 2 +- app/node/generator/text/text.h | 2 +- app/node/graph.cpp | 2 +- app/node/graph.h | 2 +- app/node/input.cpp | 2 +- app/node/input.h | 2 +- app/node/input/CMakeLists.txt | 2 +- app/node/input/media/CMakeLists.txt | 2 +- app/node/input/media/audio/CMakeLists.txt | 2 +- app/node/input/media/audio/audio.cpp | 2 +- app/node/input/media/audio/audio.h | 2 +- app/node/input/media/media.cpp | 2 +- app/node/input/media/media.h | 2 +- app/node/input/media/video/CMakeLists.txt | 2 +- app/node/input/media/video/video.cpp | 2 +- app/node/input/media/video/video.h | 2 +- app/node/input/time/CMakeLists.txt | 2 +- app/node/input/time/timeinput.cpp | 2 +- app/node/input/time/timeinput.h | 2 +- app/node/inputarray.cpp | 2 +- app/node/inputarray.h | 2 +- app/node/inputdragger.cpp | 2 +- app/node/inputdragger.h | 2 +- app/node/keyframe.cpp | 2 +- app/node/keyframe.h | 2 +- app/node/math/CMakeLists.txt | 2 +- app/node/math/math/CMakeLists.txt | 2 +- app/node/math/math/math.cpp | 2 +- app/node/math/math/math.h | 2 +- app/node/math/math/mathbase.cpp | 2 +- app/node/math/math/mathbase.h | 2 +- app/node/math/merge/CMakeLists.txt | 2 +- app/node/math/merge/merge.cpp | 2 +- app/node/math/merge/merge.h | 2 +- app/node/math/trigonometry/CMakeLists.txt | 2 +- app/node/math/trigonometry/trigonometry.cpp | 2 +- app/node/math/trigonometry/trigonometry.h | 2 +- app/node/node.cpp | 2 +- app/node/node.h | 2 +- app/node/output.cpp | 2 +- app/node/output.h | 2 +- app/node/output/CMakeLists.txt | 2 +- app/node/output/track/CMakeLists.txt | 2 +- app/node/output/track/track.cpp | 2 +- app/node/output/track/track.h | 2 +- app/node/output/track/tracklist.cpp | 2 +- app/node/output/track/tracklist.h | 2 +- app/node/output/viewer/CMakeLists.txt | 2 +- app/node/output/viewer/viewer.cpp | 2 +- app/node/output/viewer/viewer.h | 2 +- app/node/param.cpp | 2 +- app/node/param.h | 2 +- app/node/traverser.cpp | 2 +- app/node/traverser.h | 2 +- app/node/value.cpp | 2 +- app/node/value.h | 2 +- app/packaging/CMakeLists.txt | 2 +- app/packaging/linux/CMakeLists.txt | 2 +- app/panel/CMakeLists.txt | 2 +- app/panel/audiomonitor/CMakeLists.txt | 2 +- app/panel/audiomonitor/audiomonitor.cpp | 2 +- app/panel/audiomonitor/audiomonitor.h | 2 +- app/panel/curve/CMakeLists.txt | 2 +- app/panel/curve/curve.cpp | 2 +- app/panel/curve/curve.h | 2 +- app/panel/footageviewer/CMakeLists.txt | 2 +- app/panel/footageviewer/footageviewer.cpp | 2 +- app/panel/footageviewer/footageviewer.h | 2 +- app/panel/node/CMakeLists.txt | 2 +- app/panel/node/node.cpp | 2 +- app/panel/node/node.h | 2 +- app/panel/panelmanager.cpp | 2 +- app/panel/panelmanager.h | 2 +- app/panel/param/CMakeLists.txt | 2 +- app/panel/param/param.cpp | 2 +- app/panel/param/param.h | 2 +- app/panel/pixelsampler/CMakeLists.txt | 2 +- app/panel/pixelsampler/pixelsamplerpanel.cpp | 2 +- app/panel/pixelsampler/pixelsamplerpanel.h | 2 +- app/panel/project/CMakeLists.txt | 2 +- app/panel/project/footagemanagementpanel.h | 2 +- app/panel/project/project.cpp | 2 +- app/panel/project/project.h | 2 +- app/panel/scope/CMakeLists.txt | 2 +- app/panel/scope/scope.cpp | 2 +- app/panel/scope/scope.h | 2 +- app/panel/sequenceviewer/CMakeLists.txt | 2 +- app/panel/sequenceviewer/sequenceviewer.cpp | 2 +- app/panel/sequenceviewer/sequenceviewer.h | 2 +- app/panel/table/CMakeLists.txt | 2 +- app/panel/table/table.cpp | 2 +- app/panel/table/table.h | 2 +- app/panel/taskmanager/CMakeLists.txt | 2 +- app/panel/taskmanager/taskmanager.cpp | 2 +- app/panel/taskmanager/taskmanager.h | 2 +- app/panel/timebased/CMakeLists.txt | 2 +- app/panel/timebased/timebased.cpp | 2 +- app/panel/timebased/timebased.h | 2 +- app/panel/timeline/CMakeLists.txt | 2 +- app/panel/timeline/timeline.cpp | 2 +- app/panel/timeline/timeline.h | 2 +- app/panel/tool/CMakeLists.txt | 2 +- app/panel/tool/tool.cpp | 2 +- app/panel/tool/tool.h | 2 +- app/panel/viewer/CMakeLists.txt | 2 +- app/panel/viewer/viewer.cpp | 2 +- app/panel/viewer/viewer.h | 2 +- app/panel/viewer/viewerbase.cpp | 2 +- app/panel/viewer/viewerbase.h | 2 +- app/project/CMakeLists.txt | 2 +- app/project/item/CMakeLists.txt | 2 +- app/project/item/folder/CMakeLists.txt | 2 +- app/project/item/folder/folder.cpp | 2 +- app/project/item/folder/folder.h | 2 +- app/project/item/footage/CMakeLists.txt | 2 +- app/project/item/footage/audiostream.cpp | 2 +- app/project/item/footage/audiostream.h | 2 +- app/project/item/footage/footage.cpp | 2 +- app/project/item/footage/footage.h | 2 +- app/project/item/footage/stream.cpp | 2 +- app/project/item/footage/stream.h | 2 +- app/project/item/footage/videostream.cpp | 2 +- app/project/item/footage/videostream.h | 2 +- app/project/item/item.cpp | 2 +- app/project/item/item.h | 2 +- app/project/item/sequence/CMakeLists.txt | 2 +- app/project/item/sequence/sequence.cpp | 2 +- app/project/item/sequence/sequence.h | 2 +- app/project/project.cpp | 2 +- app/project/project.h | 2 +- app/project/projectviewmodel.cpp | 2 +- app/project/projectviewmodel.h | 2 +- app/render/CMakeLists.txt | 2 +- app/render/audioparams.cpp | 2 +- app/render/audioparams.h | 2 +- app/render/audioplaybackcache.cpp | 2 +- app/render/audioplaybackcache.h | 2 +- app/render/color.cpp | 2 +- app/render/color.h | 2 +- app/render/colormanager.cpp | 2 +- app/render/colormanager.h | 2 +- app/render/colorprocessor.cpp | 2 +- app/render/colorprocessor.h | 2 +- app/render/colorprocessorcache.h | 2 +- app/render/colortransform.h | 2 +- app/render/diskmanager.cpp | 2 +- app/render/diskmanager.h | 2 +- app/render/framehashcache.cpp | 2 +- app/render/framehashcache.h | 2 +- app/render/job/CMakeLists.txt | 2 +- app/render/job/acceleratedjob.h | 2 +- app/render/job/generatejob.h | 2 +- app/render/job/samplejob.h | 2 +- app/render/job/shaderjob.h | 2 +- app/render/managedcolor.cpp | 2 +- app/render/managedcolor.h | 2 +- app/render/ocioconf/CMakeLists.txt | 2 +- app/render/opengl/CMakeLists.txt | 2 +- app/render/opengl/openglrenderer.cpp | 2 +- app/render/opengl/openglrenderer.h | 2 +- app/render/playbackcache.cpp | 2 +- app/render/playbackcache.h | 2 +- app/render/rendercache.h | 2 +- app/render/renderer.cpp | 2 +- app/render/renderer.h | 2 +- app/render/rendererthreadwrapper.cpp | 2 +- app/render/rendererthreadwrapper.h | 2 +- app/render/rendermanager.cpp | 2 +- app/render/rendermanager.h | 2 +- app/render/rendermodes.h | 2 +- app/render/renderprocessor.cpp | 2 +- app/render/renderprocessor.h | 2 +- app/render/shadercode.h | 2 +- app/render/shadervalue.h | 2 +- app/render/texture.cpp | 2 +- app/render/texture.h | 2 +- app/render/videoparams.cpp | 2 +- app/render/videoparams.h | 2 +- app/shaders/CMakeLists.txt | 2 +- app/task/CMakeLists.txt | 2 +- app/task/conform/CMakeLists.txt | 2 +- app/task/conform/conform.cpp | 2 +- app/task/conform/conform.h | 2 +- app/task/export/CMakeLists.txt | 2 +- app/task/export/export.cpp | 2 +- app/task/export/export.h | 2 +- app/task/export/exportparams.cpp | 2 +- app/task/export/exportparams.h | 2 +- app/task/precache/CMakeLists.txt | 2 +- app/task/precache/precachetask.cpp | 2 +- app/task/precache/precachetask.h | 2 +- app/task/project/CMakeLists.txt | 2 +- app/task/project/import/CMakeLists.txt | 2 +- app/task/project/import/import.cpp | 2 +- app/task/project/import/import.h | 2 +- app/task/project/import/importerrordialog.cpp | 2 +- app/task/project/import/importerrordialog.h | 2 +- app/task/project/load/CMakeLists.txt | 2 +- app/task/project/load/load.cpp | 2 +- app/task/project/load/load.h | 2 +- app/task/project/load/loadbasetask.cpp | 2 +- app/task/project/load/loadbasetask.h | 2 +- app/task/project/loadotio/CMakeLists.txt | 2 +- app/task/project/loadotio/loadotio.cpp | 2 +- app/task/project/loadotio/loadotio.h | 2 +- app/task/project/save/CMakeLists.txt | 2 +- app/task/project/save/save.cpp | 2 +- app/task/project/save/save.h | 2 +- app/task/project/saveotio/CMakeLists.txt | 2 +- app/task/project/saveotio/saveotio.cpp | 2 +- app/task/project/saveotio/saveotio.h | 2 +- app/task/render/CMakeLists.txt | 2 +- app/task/render/render.cpp | 2 +- app/task/render/render.h | 2 +- app/task/task.h | 2 +- app/task/taskmanager.cpp | 2 +- app/task/taskmanager.h | 2 +- app/threading/CMakeLists.txt | 2 +- app/threading/threadpool.cpp | 2 +- app/threading/threadpool.h | 2 +- app/threading/threadticket.cpp | 2 +- app/threading/threadticket.h | 2 +- app/threading/threadticketwatcher.cpp | 2 +- app/threading/threadticketwatcher.h | 2 +- app/timeline/CMakeLists.txt | 2 +- app/timeline/timelinecommon.h | 2 +- app/timeline/timelinecoordinate.cpp | 2 +- app/timeline/timelinecoordinate.h | 2 +- app/timeline/timelinemarker.cpp | 2 +- app/timeline/timelinemarker.h | 2 +- app/timeline/timelinepoints.cpp | 2 +- app/timeline/timelinepoints.h | 2 +- app/timeline/timelineworkarea.cpp | 2 +- app/timeline/timelineworkarea.h | 2 +- app/timeline/trackreference.cpp | 2 +- app/timeline/trackreference.h | 2 +- app/tool/CMakeLists.txt | 2 +- app/tool/tool.h | 2 +- app/ts/CMakeLists.txt | 2 +- app/ui/CMakeLists.txt | 2 +- app/ui/cursors/CMakeLists.txt | 2 +- app/ui/graphics/CMakeLists.txt | 2 +- app/ui/icons/CMakeLists.txt | 2 +- app/ui/icons/icons.cpp | 2 +- app/ui/icons/icons.h | 2 +- app/ui/style/CMakeLists.txt | 2 +- app/ui/style/generate-style.sh | 2 +- app/ui/style/olive-dark/style.css | 2 +- app/ui/style/olive-light/style.css | 2 +- app/ui/style/olive-light/svg/convert-to-dark.sh | 2 +- app/ui/style/style.cpp | 2 +- app/ui/style/style.h | 2 +- app/undo/CMakeLists.txt | 2 +- app/undo/undocommand.cpp | 2 +- app/undo/undocommand.h | 2 +- app/undo/undostack.cpp | 2 +- app/undo/undostack.h | 2 +- app/widget/CMakeLists.txt | 2 +- app/widget/audiomonitor/CMakeLists.txt | 2 +- app/widget/audiomonitor/audiomonitor.cpp | 2 +- app/widget/audiomonitor/audiomonitor.h | 2 +- app/widget/clickablelabel/CMakeLists.txt | 2 +- app/widget/clickablelabel/clickablelabel.cpp | 2 +- app/widget/clickablelabel/clickablelabel.h | 2 +- app/widget/collapsebutton/CMakeLists.txt | 2 +- app/widget/collapsebutton/collapsebutton.cpp | 2 +- app/widget/collapsebutton/collapsebutton.h | 2 +- app/widget/colorbutton/CMakeLists.txt | 2 +- app/widget/colorbutton/colorbutton.cpp | 2 +- app/widget/colorbutton/colorbutton.h | 2 +- app/widget/colorwheel/CMakeLists.txt | 2 +- app/widget/colorwheel/colorgradientwidget.cpp | 2 +- app/widget/colorwheel/colorgradientwidget.h | 2 +- app/widget/colorwheel/colorpreviewbox.cpp | 2 +- app/widget/colorwheel/colorpreviewbox.h | 2 +- app/widget/colorwheel/colorspacechooser.cpp | 2 +- app/widget/colorwheel/colorspacechooser.h | 2 +- app/widget/colorwheel/colorswatchwidget.cpp | 2 +- app/widget/colorwheel/colorswatchwidget.h | 2 +- app/widget/colorwheel/colorvalueswidget.cpp | 2 +- app/widget/colorwheel/colorvalueswidget.h | 2 +- app/widget/colorwheel/colorwheelwidget.cpp | 2 +- app/widget/colorwheel/colorwheelwidget.h | 2 +- app/widget/columnedgridlayout/CMakeLists.txt | 2 +- app/widget/columnedgridlayout/columnedgridlayout.cpp | 2 +- app/widget/columnedgridlayout/columnedgridlayout.h | 2 +- app/widget/curvewidget/CMakeLists.txt | 2 +- app/widget/curvewidget/beziercontrolpointitem.cpp | 2 +- app/widget/curvewidget/beziercontrolpointitem.h | 2 +- app/widget/curvewidget/curveview.cpp | 2 +- app/widget/curvewidget/curveview.h | 2 +- app/widget/curvewidget/curvewidget.cpp | 2 +- app/widget/curvewidget/curvewidget.h | 2 +- app/widget/flowlayout/CMakeLists.txt | 2 +- app/widget/focusablelineedit/CMakeLists.txt | 2 +- app/widget/focusablelineedit/focusablelineedit.cpp | 2 +- app/widget/focusablelineedit/focusablelineedit.h | 2 +- app/widget/footagecombobox/CMakeLists.txt | 2 +- app/widget/footagecombobox/footagecombobox.cpp | 2 +- app/widget/footagecombobox/footagecombobox.h | 2 +- app/widget/keyframeview/CMakeLists.txt | 2 +- app/widget/keyframeview/keyframeview.cpp | 2 +- app/widget/keyframeview/keyframeview.h | 2 +- app/widget/keyframeview/keyframeviewbase.cpp | 2 +- app/widget/keyframeview/keyframeviewbase.h | 2 +- app/widget/keyframeview/keyframeviewitem.cpp | 2 +- app/widget/keyframeview/keyframeviewitem.h | 2 +- app/widget/keyframeview/keyframeviewundo.cpp | 2 +- app/widget/keyframeview/keyframeviewundo.h | 2 +- app/widget/manageddisplay/CMakeLists.txt | 2 +- app/widget/manageddisplay/manageddisplay.cpp | 2 +- app/widget/manageddisplay/manageddisplay.h | 2 +- app/widget/menu/CMakeLists.txt | 2 +- app/widget/menu/menu.cpp | 2 +- app/widget/menu/menu.h | 2 +- app/widget/menu/menushared.cpp | 2 +- app/widget/menu/menushared.h | 2 +- app/widget/nodecombobox/CMakeLists.txt | 2 +- app/widget/nodecombobox/nodecombobox.cpp | 2 +- app/widget/nodecombobox/nodecombobox.h | 2 +- app/widget/nodecopypaste/CMakeLists.txt | 2 +- app/widget/nodecopypaste/nodecopypaste.cpp | 2 +- app/widget/nodecopypaste/nodecopypaste.h | 2 +- app/widget/nodeparamview/CMakeLists.txt | 2 +- app/widget/nodeparamview/nodeparamview.cpp | 2 +- app/widget/nodeparamview/nodeparamview.h | 2 +- app/widget/nodeparamview/nodeparamviewarraywidget.cpp | 2 +- app/widget/nodeparamview/nodeparamviewarraywidget.h | 2 +- app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp | 2 +- app/widget/nodeparamview/nodeparamviewconnectedlabel.h | 2 +- app/widget/nodeparamview/nodeparamviewitem.cpp | 2 +- app/widget/nodeparamview/nodeparamviewitem.h | 2 +- app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp | 2 +- app/widget/nodeparamview/nodeparamviewkeyframecontrol.h | 2 +- app/widget/nodeparamview/nodeparamviewrichtext.cpp | 2 +- app/widget/nodeparamview/nodeparamviewrichtext.h | 2 +- app/widget/nodeparamview/nodeparamviewundo.cpp | 2 +- app/widget/nodeparamview/nodeparamviewundo.h | 2 +- app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp | 2 +- app/widget/nodeparamview/nodeparamviewwidgetbridge.h | 2 +- app/widget/nodetableview/CMakeLists.txt | 2 +- app/widget/nodetableview/nodetabletraverser.cpp | 2 +- app/widget/nodetableview/nodetabletraverser.h | 2 +- app/widget/nodetableview/nodetableview.cpp | 2 +- app/widget/nodetableview/nodetableview.h | 2 +- app/widget/nodetableview/nodetablewidget.cpp | 2 +- app/widget/nodetableview/nodetablewidget.h | 2 +- app/widget/nodetreeview/CMakeLists.txt | 2 +- app/widget/nodeview/CMakeLists.txt | 2 +- app/widget/nodeview/nodeview.cpp | 2 +- app/widget/nodeview/nodeview.h | 2 +- app/widget/nodeview/nodeviewcommon.h | 2 +- app/widget/nodeview/nodeviewedge.cpp | 2 +- app/widget/nodeview/nodeviewedge.h | 2 +- app/widget/nodeview/nodeviewitem.cpp | 2 +- app/widget/nodeview/nodeviewitem.h | 2 +- app/widget/nodeview/nodeviewitemwidgetproxy.cpp | 2 +- app/widget/nodeview/nodeviewitemwidgetproxy.h | 2 +- app/widget/nodeview/nodeviewscene.cpp | 2 +- app/widget/nodeview/nodeviewscene.h | 2 +- app/widget/nodeview/nodeviewundo.cpp | 2 +- app/widget/nodeview/nodeviewundo.h | 2 +- app/widget/panel/CMakeLists.txt | 2 +- app/widget/panel/panel.cpp | 2 +- app/widget/panel/panel.h | 2 +- app/widget/path/CMakeLists.txt | 2 +- app/widget/path/pathwidget.cpp | 2 +- app/widget/path/pathwidget.h | 2 +- app/widget/pixelsampler/CMakeLists.txt | 2 +- app/widget/pixelsampler/pixelsampler.cpp | 2 +- app/widget/pixelsampler/pixelsampler.h | 2 +- app/widget/playbackcontrols/CMakeLists.txt | 2 +- app/widget/playbackcontrols/dragbutton.cpp | 2 +- app/widget/playbackcontrols/dragbutton.h | 2 +- app/widget/playbackcontrols/playbackcontrols.cpp | 2 +- app/widget/playbackcontrols/playbackcontrols.h | 2 +- app/widget/projectexplorer/CMakeLists.txt | 2 +- app/widget/projectexplorer/projectexplorer.cpp | 2 +- app/widget/projectexplorer/projectexplorer.h | 2 +- app/widget/projectexplorer/projectexplorericonview.cpp | 2 +- app/widget/projectexplorer/projectexplorericonview.h | 2 +- .../projectexplorer/projectexplorericonviewitemdelegate.cpp | 2 +- .../projectexplorer/projectexplorericonviewitemdelegate.h | 2 +- app/widget/projectexplorer/projectexplorerlistview.cpp | 2 +- app/widget/projectexplorer/projectexplorerlistview.h | 2 +- app/widget/projectexplorer/projectexplorerlistviewbase.cpp | 2 +- app/widget/projectexplorer/projectexplorerlistviewbase.h | 2 +- .../projectexplorer/projectexplorerlistviewitemdelegate.cpp | 2 +- .../projectexplorer/projectexplorerlistviewitemdelegate.h | 2 +- app/widget/projectexplorer/projectexplorernavigation.cpp | 2 +- app/widget/projectexplorer/projectexplorernavigation.h | 2 +- app/widget/projectexplorer/projectexplorertreeview.cpp | 2 +- app/widget/projectexplorer/projectexplorertreeview.h | 2 +- app/widget/projectexplorer/projectexplorerundo.cpp | 2 +- app/widget/projectexplorer/projectexplorerundo.h | 2 +- app/widget/projecttoolbar/CMakeLists.txt | 2 +- app/widget/projecttoolbar/projecttoolbar.cpp | 2 +- app/widget/projecttoolbar/projecttoolbar.h | 2 +- app/widget/resizablescrollbar/CMakeLists.txt | 2 +- app/widget/resizablescrollbar/resizablescrollbar.cpp | 2 +- app/widget/resizablescrollbar/resizablescrollbar.h | 2 +- app/widget/scope/CMakeLists.txt | 2 +- app/widget/scope/histogram/CMakeLists.txt | 2 +- app/widget/scope/histogram/histogram.cpp | 2 +- app/widget/scope/histogram/histogram.h | 2 +- app/widget/scope/scopebase/CMakeLists.txt | 2 +- app/widget/scope/scopebase/scopebase.cpp | 2 +- app/widget/scope/scopebase/scopebase.h | 2 +- app/widget/scope/waveform/CMakeLists.txt | 2 +- app/widget/scope/waveform/waveform.cpp | 2 +- app/widget/scope/waveform/waveform.h | 2 +- app/widget/slider/CMakeLists.txt | 2 +- app/widget/slider/floatslider.cpp | 2 +- app/widget/slider/floatslider.h | 2 +- app/widget/slider/integerslider.cpp | 2 +- app/widget/slider/integerslider.h | 2 +- app/widget/slider/sliderbase.cpp | 2 +- app/widget/slider/sliderbase.h | 2 +- app/widget/slider/sliderlabel.cpp | 2 +- app/widget/slider/sliderlabel.h | 2 +- app/widget/slider/sliderladder.cpp | 2 +- app/widget/slider/sliderladder.h | 2 +- app/widget/slider/stringslider.cpp | 2 +- app/widget/slider/stringslider.h | 2 +- app/widget/slider/timeslider.cpp | 2 +- app/widget/slider/timeslider.h | 2 +- app/widget/standardcombos/CMakeLists.txt | 2 +- app/widget/standardcombos/channellayoutcombobox.h | 2 +- app/widget/standardcombos/frameratecombobox.h | 2 +- app/widget/standardcombos/interlacedcombobox.h | 2 +- app/widget/standardcombos/pixelaspectratiocombobox.h | 2 +- app/widget/standardcombos/pixelformatcombobox.h | 2 +- app/widget/standardcombos/sampleratecombobox.h | 2 +- app/widget/standardcombos/standardcombos.h | 2 +- app/widget/standardcombos/videodividercombobox.h | 2 +- app/widget/taskview/CMakeLists.txt | 2 +- app/widget/taskview/elapsedcounterwidget.cpp | 2 +- app/widget/taskview/elapsedcounterwidget.h | 2 +- app/widget/taskview/taskview.cpp | 2 +- app/widget/taskview/taskview.h | 2 +- app/widget/taskview/taskviewitem.cpp | 2 +- app/widget/taskview/taskviewitem.h | 2 +- app/widget/timebased/CMakeLists.txt | 2 +- app/widget/timebased/timebased.cpp | 2 +- app/widget/timebased/timebased.h | 2 +- app/widget/timelinewidget/CMakeLists.txt | 2 +- app/widget/timelinewidget/timelineandtrackview.cpp | 2 +- app/widget/timelinewidget/timelineandtrackview.h | 2 +- app/widget/timelinewidget/timelinescaledobject.cpp | 2 +- app/widget/timelinewidget/timelinescaledobject.h | 2 +- app/widget/timelinewidget/timelinewidget.cpp | 2 +- app/widget/timelinewidget/timelinewidget.h | 2 +- app/widget/timelinewidget/timelinewidgetselections.cpp | 2 +- app/widget/timelinewidget/timelinewidgetselections.h | 2 +- app/widget/timelinewidget/tool/CMakeLists.txt | 2 +- app/widget/timelinewidget/tool/add.cpp | 2 +- app/widget/timelinewidget/tool/add.h | 2 +- app/widget/timelinewidget/tool/beam.cpp | 2 +- app/widget/timelinewidget/tool/beam.h | 2 +- app/widget/timelinewidget/tool/edit.cpp | 2 +- app/widget/timelinewidget/tool/edit.h | 2 +- app/widget/timelinewidget/tool/import.cpp | 2 +- app/widget/timelinewidget/tool/import.h | 2 +- app/widget/timelinewidget/tool/pointer.cpp | 2 +- app/widget/timelinewidget/tool/pointer.h | 2 +- app/widget/timelinewidget/tool/razor.cpp | 2 +- app/widget/timelinewidget/tool/razor.h | 2 +- app/widget/timelinewidget/tool/ripple.cpp | 2 +- app/widget/timelinewidget/tool/ripple.h | 2 +- app/widget/timelinewidget/tool/rolling.cpp | 2 +- app/widget/timelinewidget/tool/rolling.h | 2 +- app/widget/timelinewidget/tool/slide.cpp | 2 +- app/widget/timelinewidget/tool/slide.h | 2 +- app/widget/timelinewidget/tool/slip.cpp | 2 +- app/widget/timelinewidget/tool/slip.h | 2 +- app/widget/timelinewidget/tool/tool.cpp | 2 +- app/widget/timelinewidget/tool/tool.h | 2 +- app/widget/timelinewidget/tool/transition.cpp | 2 +- app/widget/timelinewidget/tool/transition.h | 2 +- app/widget/timelinewidget/tool/zoom.cpp | 2 +- app/widget/timelinewidget/tool/zoom.h | 2 +- app/widget/timelinewidget/trackview/CMakeLists.txt | 2 +- app/widget/timelinewidget/trackview/trackview.cpp | 2 +- app/widget/timelinewidget/trackview/trackview.h | 2 +- app/widget/timelinewidget/trackview/trackviewitem.cpp | 2 +- app/widget/timelinewidget/trackview/trackviewitem.h | 2 +- app/widget/timelinewidget/trackview/trackviewsplitter.cpp | 2 +- app/widget/timelinewidget/trackview/trackviewsplitter.h | 2 +- app/widget/timelinewidget/undo/CMakeLists.txt | 2 +- app/widget/timelinewidget/undo/undo.cpp | 2 +- app/widget/timelinewidget/undo/undo.h | 2 +- app/widget/timelinewidget/view/CMakeLists.txt | 2 +- app/widget/timelinewidget/view/handmovableview.cpp | 2 +- app/widget/timelinewidget/view/handmovableview.h | 2 +- app/widget/timelinewidget/view/timelineview.cpp | 2 +- app/widget/timelinewidget/view/timelineview.h | 2 +- app/widget/timelinewidget/view/timelineviewbase.cpp | 2 +- app/widget/timelinewidget/view/timelineviewbase.h | 2 +- app/widget/timelinewidget/view/timelineviewblockitem.cpp | 2 +- app/widget/timelinewidget/view/timelineviewblockitem.h | 2 +- app/widget/timelinewidget/view/timelineviewghostitem.cpp | 2 +- app/widget/timelinewidget/view/timelineviewghostitem.h | 2 +- app/widget/timelinewidget/view/timelineviewmouseevent.cpp | 2 +- app/widget/timelinewidget/view/timelineviewmouseevent.h | 2 +- app/widget/timelinewidget/view/timelineviewrect.cpp | 2 +- app/widget/timelinewidget/view/timelineviewrect.h | 2 +- app/widget/timeruler/CMakeLists.txt | 2 +- app/widget/timeruler/seekablewidget.cpp | 2 +- app/widget/timeruler/seekablewidget.h | 2 +- app/widget/timeruler/timeruler.cpp | 2 +- app/widget/timeruler/timeruler.h | 2 +- app/widget/timetarget/CMakeLists.txt | 2 +- app/widget/timetarget/timetarget.cpp | 2 +- app/widget/timetarget/timetarget.h | 2 +- app/widget/toolbar/CMakeLists.txt | 2 +- app/widget/toolbar/toolbar.cpp | 2 +- app/widget/toolbar/toolbar.h | 2 +- app/widget/toolbar/toolbarbutton.cpp | 2 +- app/widget/toolbar/toolbarbutton.h | 2 +- app/widget/viewer/CMakeLists.txt | 2 +- app/widget/viewer/audiowaveformview.cpp | 2 +- app/widget/viewer/audiowaveformview.h | 2 +- app/widget/viewer/footageviewer.cpp | 2 +- app/widget/viewer/footageviewer.h | 2 +- app/widget/viewer/gizmotraverser.cpp | 2 +- app/widget/viewer/gizmotraverser.h | 2 +- app/widget/viewer/viewer.cpp | 2 +- app/widget/viewer/viewer.h | 2 +- app/widget/viewer/viewerdisplay.cpp | 2 +- app/widget/viewer/viewerdisplay.h | 2 +- app/widget/viewer/viewerplaybacktimer.cpp | 2 +- app/widget/viewer/viewerplaybacktimer.h | 2 +- app/widget/viewer/viewerqueue.h | 2 +- app/widget/viewer/viewersafemargininfo.h | 2 +- app/widget/viewer/viewersizer.cpp | 2 +- app/widget/viewer/viewersizer.h | 2 +- app/widget/viewer/viewerwindow.cpp | 2 +- app/widget/viewer/viewerwindow.h | 2 +- app/window/CMakeLists.txt | 2 +- app/window/mainwindow/CMakeLists.txt | 2 +- app/window/mainwindow/mainmenu.cpp | 2 +- app/window/mainwindow/mainmenu.h | 2 +- app/window/mainwindow/mainstatusbar.cpp | 2 +- app/window/mainwindow/mainstatusbar.h | 2 +- app/window/mainwindow/mainwindow.cpp | 2 +- app/window/mainwindow/mainwindow.h | 2 +- cmake/FindGoogleCrashpad.cmake | 2 +- cmake/FindOpenTimelineIO.cmake | 2 +- docker/scripts/common/install_yumpackages.sh | 2 +- 779 files changed, 779 insertions(+), 779 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 337ca5784..d2d760892 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index f4ef97053..995c75d92 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/audio/CMakeLists.txt b/app/audio/CMakeLists.txt index 5b0976dc0..ec33300f0 100644 --- a/app/audio/CMakeLists.txt +++ b/app/audio/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/audio/audiomanager.cpp b/app/audio/audiomanager.cpp index 48daa0c9b..820c77add 100644 --- a/app/audio/audiomanager.cpp +++ b/app/audio/audiomanager.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/audio/audiomanager.h b/app/audio/audiomanager.h index d351e6852..381d0a533 100644 --- a/app/audio/audiomanager.h +++ b/app/audio/audiomanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index 9cba6f755..d8ba57e6c 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/audio/audiovisualwaveform.h b/app/audio/audiovisualwaveform.h index 1273c576d..fef95be1a 100644 --- a/app/audio/audiovisualwaveform.h +++ b/app/audio/audiovisualwaveform.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/audio/outputdeviceproxy.cpp b/app/audio/outputdeviceproxy.cpp index 112ee5c53..039934905 100644 --- a/app/audio/outputdeviceproxy.cpp +++ b/app/audio/outputdeviceproxy.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/audio/outputdeviceproxy.h b/app/audio/outputdeviceproxy.h index 60ef8cf3c..93ebca282 100644 --- a/app/audio/outputdeviceproxy.h +++ b/app/audio/outputdeviceproxy.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/audio/outputmanager.cpp b/app/audio/outputmanager.cpp index 8c4a059fc..415fc4487 100644 --- a/app/audio/outputmanager.cpp +++ b/app/audio/outputmanager.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/audio/outputmanager.h b/app/audio/outputmanager.h index 994b4aff7..01d11a208 100644 --- a/app/audio/outputmanager.h +++ b/app/audio/outputmanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/audio/tempoprocessor.cpp b/app/audio/tempoprocessor.cpp index 1cb56b468..1ffd1dbac 100644 --- a/app/audio/tempoprocessor.cpp +++ b/app/audio/tempoprocessor.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/audio/tempoprocessor.h b/app/audio/tempoprocessor.h index a118352e0..eff244bf4 100644 --- a/app/audio/tempoprocessor.h +++ b/app/audio/tempoprocessor.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/cli/CMakeLists.txt b/app/cli/CMakeLists.txt index 6fe09bdc8..69d74d13d 100644 --- a/app/cli/CMakeLists.txt +++ b/app/cli/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/cli/cliexport/cliexportmanager.cpp b/app/cli/cliexport/cliexportmanager.cpp index de0145729..195d9fdb2 100644 --- a/app/cli/cliexport/cliexportmanager.cpp +++ b/app/cli/cliexport/cliexportmanager.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/cli/cliexport/cliexportmanager.h b/app/cli/cliexport/cliexportmanager.h index 6d3fc346b..a9d2afed7 100644 --- a/app/cli/cliexport/cliexportmanager.h +++ b/app/cli/cliexport/cliexportmanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/cli/cliprogress/CMakeLists.txt b/app/cli/cliprogress/CMakeLists.txt index 27a57775c..c1a5e96fa 100644 --- a/app/cli/cliprogress/CMakeLists.txt +++ b/app/cli/cliprogress/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/cli/cliprogress/cliprogressdialog.cpp b/app/cli/cliprogress/cliprogressdialog.cpp index 88c0cfd57..ebd53ecf9 100644 --- a/app/cli/cliprogress/cliprogressdialog.cpp +++ b/app/cli/cliprogress/cliprogressdialog.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/cli/cliprogress/cliprogressdialog.h b/app/cli/cliprogress/cliprogressdialog.h index 40ffea6e8..ce1811e5f 100644 --- a/app/cli/cliprogress/cliprogressdialog.h +++ b/app/cli/cliprogress/cliprogressdialog.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/cli/clitask/CMakeLists.txt b/app/cli/clitask/CMakeLists.txt index d3a84091d..3ac2f602e 100644 --- a/app/cli/clitask/CMakeLists.txt +++ b/app/cli/clitask/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/cli/clitask/clitaskdialog.cpp b/app/cli/clitask/clitaskdialog.cpp index bb567f586..84f62e18b 100644 --- a/app/cli/clitask/clitaskdialog.cpp +++ b/app/cli/clitask/clitaskdialog.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/cli/clitask/clitaskdialog.h b/app/cli/clitask/clitaskdialog.h index c574b6011..69c161955 100644 --- a/app/cli/clitask/clitaskdialog.h +++ b/app/cli/clitask/clitaskdialog.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/CMakeLists.txt b/app/codec/CMakeLists.txt index bce758bfd..b3639dca8 100644 --- a/app/codec/CMakeLists.txt +++ b/app/codec/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/codec/decoder.cpp b/app/codec/decoder.cpp index 9841fbf4f..c6fcc4ece 100644 --- a/app/codec/decoder.cpp +++ b/app/codec/decoder.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/decoder.h b/app/codec/decoder.h index 68ff8dbb5..8e165b9c8 100644 --- a/app/codec/decoder.h +++ b/app/codec/decoder.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/encoder.cpp b/app/codec/encoder.cpp index b328e3135..189e4f939 100644 --- a/app/codec/encoder.cpp +++ b/app/codec/encoder.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/encoder.h b/app/codec/encoder.h index 9cd9547a0..47c9a0710 100644 --- a/app/codec/encoder.h +++ b/app/codec/encoder.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/exportcodec.cpp b/app/codec/exportcodec.cpp index 4f8aca533..09d25800d 100644 --- a/app/codec/exportcodec.cpp +++ b/app/codec/exportcodec.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/exportcodec.h b/app/codec/exportcodec.h index 0c9ee0d12..d0a57eb61 100644 --- a/app/codec/exportcodec.h +++ b/app/codec/exportcodec.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/exportformat.cpp b/app/codec/exportformat.cpp index 8f9f76973..b241168fb 100644 --- a/app/codec/exportformat.cpp +++ b/app/codec/exportformat.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/exportformat.h b/app/codec/exportformat.h index c886f6b5c..ca5ef1afe 100644 --- a/app/codec/exportformat.h +++ b/app/codec/exportformat.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/ffmpeg/CMakeLists.txt b/app/codec/ffmpeg/CMakeLists.txt index 7c26e24bf..a3d7a50d2 100644 --- a/app/codec/ffmpeg/CMakeLists.txt +++ b/app/codec/ffmpeg/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/codec/ffmpeg/avframeptr.h b/app/codec/ffmpeg/avframeptr.h index 2e7716d52..8841b7c89 100644 --- a/app/codec/ffmpeg/avframeptr.h +++ b/app/codec/ffmpeg/avframeptr.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index e6718ead5..b17ff24f7 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/ffmpeg/ffmpegdecoder.h b/app/codec/ffmpeg/ffmpegdecoder.h index 1f820d746..9861e0fdc 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.h +++ b/app/codec/ffmpeg/ffmpegdecoder.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/ffmpeg/ffmpegencoder.cpp b/app/codec/ffmpeg/ffmpegencoder.cpp index 3e95937db..2c5001d4d 100644 --- a/app/codec/ffmpeg/ffmpegencoder.cpp +++ b/app/codec/ffmpeg/ffmpegencoder.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/ffmpeg/ffmpegencoder.h b/app/codec/ffmpeg/ffmpegencoder.h index 6b28fb62f..46ddb2ae2 100644 --- a/app/codec/ffmpeg/ffmpegencoder.h +++ b/app/codec/ffmpeg/ffmpegencoder.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/ffmpeg/ffmpegframepool.cpp b/app/codec/ffmpeg/ffmpegframepool.cpp index 520f5d0ac..e7ec89238 100644 --- a/app/codec/ffmpeg/ffmpegframepool.cpp +++ b/app/codec/ffmpeg/ffmpegframepool.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/ffmpeg/ffmpegframepool.h b/app/codec/ffmpeg/ffmpegframepool.h index f97a948d0..189cec3a1 100644 --- a/app/codec/ffmpeg/ffmpegframepool.h +++ b/app/codec/ffmpeg/ffmpegframepool.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/frame.cpp b/app/codec/frame.cpp index 7d474a1c5..42733c0b9 100644 --- a/app/codec/frame.cpp +++ b/app/codec/frame.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/frame.h b/app/codec/frame.h index 29fbdaac1..5dd763110 100644 --- a/app/codec/frame.h +++ b/app/codec/frame.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/oiio/CMakeLists.txt b/app/codec/oiio/CMakeLists.txt index 201fd3ee7..671e6a33e 100644 --- a/app/codec/oiio/CMakeLists.txt +++ b/app/codec/oiio/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/codec/oiio/oiiodecoder.cpp b/app/codec/oiio/oiiodecoder.cpp index 392951240..3cc893a15 100644 --- a/app/codec/oiio/oiiodecoder.cpp +++ b/app/codec/oiio/oiiodecoder.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/oiio/oiiodecoder.h b/app/codec/oiio/oiiodecoder.h index f4b7e96d9..767ba0e01 100644 --- a/app/codec/oiio/oiiodecoder.h +++ b/app/codec/oiio/oiiodecoder.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/samplebuffer.cpp b/app/codec/samplebuffer.cpp index 8c8fdc3b9..eb615cc75 100644 --- a/app/codec/samplebuffer.cpp +++ b/app/codec/samplebuffer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/samplebuffer.h b/app/codec/samplebuffer.h index eef51ff8a..b412c171c 100644 --- a/app/codec/samplebuffer.h +++ b/app/codec/samplebuffer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/waveinput.cpp b/app/codec/waveinput.cpp index 06fd5f2b6..43130b9c5 100644 --- a/app/codec/waveinput.cpp +++ b/app/codec/waveinput.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/waveinput.h b/app/codec/waveinput.h index 5aefead27..ebb2f1fbc 100644 --- a/app/codec/waveinput.h +++ b/app/codec/waveinput.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/waveoutput.cpp b/app/codec/waveoutput.cpp index 648b8c4a8..958180f1c 100644 --- a/app/codec/waveoutput.cpp +++ b/app/codec/waveoutput.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/codec/waveoutput.h b/app/codec/waveoutput.h index 450fe38bc..f48490838 100644 --- a/app/codec/waveoutput.h +++ b/app/codec/waveoutput.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/CMakeLists.txt b/app/common/CMakeLists.txt index 06963187b..7f4d1fd76 100644 --- a/app/common/CMakeLists.txt +++ b/app/common/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/common/autoscroll.h b/app/common/autoscroll.h index b4e8e34ef..19cd0a8dc 100644 --- a/app/common/autoscroll.h +++ b/app/common/autoscroll.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/bezier.cpp b/app/common/bezier.cpp index 46d5b8e3e..926f10a49 100644 --- a/app/common/bezier.cpp +++ b/app/common/bezier.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/bezier.h b/app/common/bezier.h index b353fba95..c53838616 100644 --- a/app/common/bezier.h +++ b/app/common/bezier.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/cancelableobject.h b/app/common/cancelableobject.h index 00d5254c9..310bf9098 100644 --- a/app/common/cancelableobject.h +++ b/app/common/cancelableobject.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/channellayout.h b/app/common/channellayout.h index 0273925a4..bceace650 100644 --- a/app/common/channellayout.h +++ b/app/common/channellayout.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/clamp.h b/app/common/clamp.h index dda706505..636ecb7e6 100644 --- a/app/common/clamp.h +++ b/app/common/clamp.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/commandlineparser.cpp b/app/common/commandlineparser.cpp index ab58322b1..7013276cd 100644 --- a/app/common/commandlineparser.cpp +++ b/app/common/commandlineparser.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/commandlineparser.h b/app/common/commandlineparser.h index 6d1b3f5a3..5ae867c68 100644 --- a/app/common/commandlineparser.h +++ b/app/common/commandlineparser.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/crashpadinterface.cpp b/app/common/crashpadinterface.cpp index adc954e49..61b8f9613 100644 --- a/app/common/crashpadinterface.cpp +++ b/app/common/crashpadinterface.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/crashpadinterface.h b/app/common/crashpadinterface.h index 2388ece96..8e3a8181f 100644 --- a/app/common/crashpadinterface.h +++ b/app/common/crashpadinterface.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/crashpadutils.h b/app/common/crashpadutils.h index a2a36e49d..9b164939e 100644 --- a/app/common/crashpadutils.h +++ b/app/common/crashpadutils.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/debug.cpp b/app/common/debug.cpp index b2e79ab6e..f859c8cee 100644 --- a/app/common/debug.cpp +++ b/app/common/debug.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/debug.h b/app/common/debug.h index a916e1857..214ba376b 100644 --- a/app/common/debug.h +++ b/app/common/debug.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/define.h b/app/common/define.h index 0a29394a0..d613f1480 100644 --- a/app/common/define.h +++ b/app/common/define.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/ffmpegutils.cpp b/app/common/ffmpegutils.cpp index 9453bd851..bf335aa0c 100644 --- a/app/common/ffmpegutils.cpp +++ b/app/common/ffmpegutils.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/ffmpegutils.h b/app/common/ffmpegutils.h index 6e9fb002a..c4aa4667c 100644 --- a/app/common/ffmpegutils.h +++ b/app/common/ffmpegutils.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/filefunctions.cpp b/app/common/filefunctions.cpp index 513d781ea..d6c480abb 100644 --- a/app/common/filefunctions.cpp +++ b/app/common/filefunctions.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/filefunctions.h b/app/common/filefunctions.h index f19aac9b9..c883da0a0 100644 --- a/app/common/filefunctions.h +++ b/app/common/filefunctions.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/flipmodifiers.cpp b/app/common/flipmodifiers.cpp index d7314fd11..e43146606 100644 --- a/app/common/flipmodifiers.cpp +++ b/app/common/flipmodifiers.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/flipmodifiers.h b/app/common/flipmodifiers.h index b34727327..c8d508b65 100644 --- a/app/common/flipmodifiers.h +++ b/app/common/flipmodifiers.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/functiontimer.h b/app/common/functiontimer.h index 87735bd6e..678cccfab 100644 --- a/app/common/functiontimer.h +++ b/app/common/functiontimer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/lerp.h b/app/common/lerp.h index da1f95b8a..e0aa166fa 100644 --- a/app/common/lerp.h +++ b/app/common/lerp.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/memorypool.h b/app/common/memorypool.h index d52d24b46..b5d75bbbd 100644 --- a/app/common/memorypool.h +++ b/app/common/memorypool.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/ocioutils.cpp b/app/common/ocioutils.cpp index c5f182450..6750a6f09 100644 --- a/app/common/ocioutils.cpp +++ b/app/common/ocioutils.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/ocioutils.h b/app/common/ocioutils.h index edbaa9fef..788c4ea7c 100644 --- a/app/common/ocioutils.h +++ b/app/common/ocioutils.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/oiioutils.cpp b/app/common/oiioutils.cpp index 8381ba904..38452fd27 100644 --- a/app/common/oiioutils.cpp +++ b/app/common/oiioutils.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/oiioutils.h b/app/common/oiioutils.h index a9dca5baa..8c52a54a7 100644 --- a/app/common/oiioutils.h +++ b/app/common/oiioutils.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/power.h b/app/common/power.h index 8e574b8c3..2ecf12578 100644 --- a/app/common/power.h +++ b/app/common/power.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/qtutils.cpp b/app/common/qtutils.cpp index 797044969..a6a15b60c 100644 --- a/app/common/qtutils.cpp +++ b/app/common/qtutils.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/qtutils.h b/app/common/qtutils.h index 99ac2d289..12b70a17a 100644 --- a/app/common/qtutils.h +++ b/app/common/qtutils.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/range.h b/app/common/range.h index 96de47c74..1f40d3b22 100644 --- a/app/common/range.h +++ b/app/common/range.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/ratiodialog.cpp b/app/common/ratiodialog.cpp index cb01147e3..d1bb98449 100644 --- a/app/common/ratiodialog.cpp +++ b/app/common/ratiodialog.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/ratiodialog.h b/app/common/ratiodialog.h index 306e36d22..10c44f899 100644 --- a/app/common/ratiodialog.h +++ b/app/common/ratiodialog.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/threadedobject.cpp b/app/common/threadedobject.cpp index 4f331c710..833face4c 100644 --- a/app/common/threadedobject.cpp +++ b/app/common/threadedobject.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/threadedobject.h b/app/common/threadedobject.h index 3210378fa..9d0013386 100644 --- a/app/common/threadedobject.h +++ b/app/common/threadedobject.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/timecodefunctions.cpp b/app/common/timecodefunctions.cpp index 952601832..e18454acd 100644 --- a/app/common/timecodefunctions.cpp +++ b/app/common/timecodefunctions.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/timecodefunctions.h b/app/common/timecodefunctions.h index afaa263f3..6d4b1b2cc 100644 --- a/app/common/timecodefunctions.h +++ b/app/common/timecodefunctions.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/timerange.cpp b/app/common/timerange.cpp index 639b5c030..f314006e2 100644 --- a/app/common/timerange.cpp +++ b/app/common/timerange.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/timerange.h b/app/common/timerange.h index 5546101b5..869e90b63 100644 --- a/app/common/timerange.h +++ b/app/common/timerange.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/xmlutils.cpp b/app/common/xmlutils.cpp index ed5f8f735..54eafe7a1 100644 --- a/app/common/xmlutils.cpp +++ b/app/common/xmlutils.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/common/xmlutils.h b/app/common/xmlutils.h index 334508111..64f77bd32 100644 --- a/app/common/xmlutils.h +++ b/app/common/xmlutils.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/config/CMakeLists.txt b/app/config/CMakeLists.txt index 755e1d3dd..a8b684886 100644 --- a/app/config/CMakeLists.txt +++ b/app/config/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/config/config.cpp b/app/config/config.cpp index 7eda39428..24a827839 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/config/config.h b/app/config/config.h index dfed5a23d..727f4778b 100644 --- a/app/config/config.h +++ b/app/config/config.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/core.cpp b/app/core.cpp index 73177df15..6f4222d35 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/core.h b/app/core.h index 8e891de28..f068a388d 100644 --- a/app/core.h +++ b/app/core.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/CMakeLists.txt b/app/dialog/CMakeLists.txt index 61e5eada9..239e46b8f 100644 --- a/app/dialog/CMakeLists.txt +++ b/app/dialog/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/about/CMakeLists.txt b/app/dialog/about/CMakeLists.txt index c4a932e77..61b668baa 100644 --- a/app/dialog/about/CMakeLists.txt +++ b/app/dialog/about/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/about/about.cpp b/app/dialog/about/about.cpp index a37229a93..fb2f418bb 100644 --- a/app/dialog/about/about.cpp +++ b/app/dialog/about/about.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/about/about.h b/app/dialog/about/about.h index c430d9ee7..ed334f46a 100644 --- a/app/dialog/about/about.h +++ b/app/dialog/about/about.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/actionsearch/CMakeLists.txt b/app/dialog/actionsearch/CMakeLists.txt index 16d7e7a68..2aa104524 100644 --- a/app/dialog/actionsearch/CMakeLists.txt +++ b/app/dialog/actionsearch/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/color/CMakeLists.txt b/app/dialog/color/CMakeLists.txt index f36cd6b5d..a50056c0b 100644 --- a/app/dialog/color/CMakeLists.txt +++ b/app/dialog/color/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/color/colordialog.cpp b/app/dialog/color/colordialog.cpp index afda42bb4..f67438f0e 100644 --- a/app/dialog/color/colordialog.cpp +++ b/app/dialog/color/colordialog.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/color/colordialog.h b/app/dialog/color/colordialog.h index 356924c5b..d4c8e0274 100644 --- a/app/dialog/color/colordialog.h +++ b/app/dialog/color/colordialog.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/crashhandler/crashhandler.cpp b/app/dialog/crashhandler/crashhandler.cpp index 2b21293f9..ca15f805c 100644 --- a/app/dialog/crashhandler/crashhandler.cpp +++ b/app/dialog/crashhandler/crashhandler.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/crashhandler/crashhandler.h b/app/dialog/crashhandler/crashhandler.h index 7ec91669b..d180eb273 100644 --- a/app/dialog/crashhandler/crashhandler.h +++ b/app/dialog/crashhandler/crashhandler.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/crashhandler/crashhandlermain.cpp b/app/dialog/crashhandler/crashhandlermain.cpp index d0fe76368..7530607c3 100644 --- a/app/dialog/crashhandler/crashhandlermain.cpp +++ b/app/dialog/crashhandler/crashhandlermain.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/diskcache/CMakeLists.txt b/app/dialog/diskcache/CMakeLists.txt index 6ca59d549..077c712ca 100644 --- a/app/dialog/diskcache/CMakeLists.txt +++ b/app/dialog/diskcache/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/diskcache/diskcachedialog.cpp b/app/dialog/diskcache/diskcachedialog.cpp index 6e542b7c3..58361c40a 100644 --- a/app/dialog/diskcache/diskcachedialog.cpp +++ b/app/dialog/diskcache/diskcachedialog.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/diskcache/diskcachedialog.h b/app/dialog/diskcache/diskcachedialog.h index 69c3a20f3..1f0f3cb76 100644 --- a/app/dialog/diskcache/diskcachedialog.h +++ b/app/dialog/diskcache/diskcachedialog.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/CMakeLists.txt b/app/dialog/export/CMakeLists.txt index ef122e43d..e13b45686 100644 --- a/app/dialog/export/CMakeLists.txt +++ b/app/dialog/export/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/codec/CMakeLists.txt b/app/dialog/export/codec/CMakeLists.txt index cb8d22213..b7ccf6c22 100644 --- a/app/dialog/export/codec/CMakeLists.txt +++ b/app/dialog/export/codec/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/codec/codecsection.cpp b/app/dialog/export/codec/codecsection.cpp index 309facaba..181bc2970 100644 --- a/app/dialog/export/codec/codecsection.cpp +++ b/app/dialog/export/codec/codecsection.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/codec/codecsection.h b/app/dialog/export/codec/codecsection.h index 77a42e84e..22281dd5b 100644 --- a/app/dialog/export/codec/codecsection.h +++ b/app/dialog/export/codec/codecsection.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/codec/h264section.cpp b/app/dialog/export/codec/h264section.cpp index 73f723d01..bcbc3734d 100644 --- a/app/dialog/export/codec/h264section.cpp +++ b/app/dialog/export/codec/h264section.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/codec/h264section.h b/app/dialog/export/codec/h264section.h index f357d4375..85477a5bf 100644 --- a/app/dialog/export/codec/h264section.h +++ b/app/dialog/export/codec/h264section.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/codec/imagesection.cpp b/app/dialog/export/codec/imagesection.cpp index 8b373796e..319f7460e 100644 --- a/app/dialog/export/codec/imagesection.cpp +++ b/app/dialog/export/codec/imagesection.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/codec/imagesection.h b/app/dialog/export/codec/imagesection.h index 5fa60dbdc..e9880b626 100644 --- a/app/dialog/export/codec/imagesection.h +++ b/app/dialog/export/codec/imagesection.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index 8134fa2cc..90bc52435 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/export.h b/app/dialog/export/export.h index 07eb3aa0d..b422f3806 100644 --- a/app/dialog/export/export.h +++ b/app/dialog/export/export.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/exportaudiotab.cpp b/app/dialog/export/exportaudiotab.cpp index c6f4ae003..fb08d87d8 100644 --- a/app/dialog/export/exportaudiotab.cpp +++ b/app/dialog/export/exportaudiotab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/exportaudiotab.h b/app/dialog/export/exportaudiotab.h index 51aaa8f32..d3b7b13db 100644 --- a/app/dialog/export/exportaudiotab.h +++ b/app/dialog/export/exportaudiotab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/exportvideotab.cpp b/app/dialog/export/exportvideotab.cpp index 617f67269..82be998ee 100644 --- a/app/dialog/export/exportvideotab.cpp +++ b/app/dialog/export/exportvideotab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/export/exportvideotab.h b/app/dialog/export/exportvideotab.h index ffbac3e19..1e2bfaa57 100644 --- a/app/dialog/export/exportvideotab.h +++ b/app/dialog/export/exportvideotab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/CMakeLists.txt b/app/dialog/footageproperties/CMakeLists.txt index 84282a556..0a3d6a7e2 100644 --- a/app/dialog/footageproperties/CMakeLists.txt +++ b/app/dialog/footageproperties/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/footageproperties.cpp b/app/dialog/footageproperties/footageproperties.cpp index d1dbd0fe7..88a43b3af 100644 --- a/app/dialog/footageproperties/footageproperties.cpp +++ b/app/dialog/footageproperties/footageproperties.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/footageproperties.h b/app/dialog/footageproperties/footageproperties.h index d2018699f..513df2f03 100644 --- a/app/dialog/footageproperties/footageproperties.h +++ b/app/dialog/footageproperties/footageproperties.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/streamproperties/CMakeLists.txt b/app/dialog/footageproperties/streamproperties/CMakeLists.txt index b6952d2aa..3228e9520 100644 --- a/app/dialog/footageproperties/streamproperties/CMakeLists.txt +++ b/app/dialog/footageproperties/streamproperties/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp index d09b5cff4..5dc7a32d8 100644 --- a/app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/streamproperties/audiostreamproperties.h b/app/dialog/footageproperties/streamproperties/audiostreamproperties.h index 4afc506ba..1d8373dc5 100644 --- a/app/dialog/footageproperties/streamproperties/audiostreamproperties.h +++ b/app/dialog/footageproperties/streamproperties/audiostreamproperties.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/streamproperties/streamproperties.cpp b/app/dialog/footageproperties/streamproperties/streamproperties.cpp index 2344a1277..102ac7d70 100644 --- a/app/dialog/footageproperties/streamproperties/streamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/streamproperties.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/streamproperties/streamproperties.h b/app/dialog/footageproperties/streamproperties/streamproperties.h index 9e9e510f5..8af0934b1 100644 --- a/app/dialog/footageproperties/streamproperties/streamproperties.h +++ b/app/dialog/footageproperties/streamproperties/streamproperties.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index 49f5c367f..81ed24770 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.h b/app/dialog/footageproperties/streamproperties/videostreamproperties.h index e83ebd8da..332a00791 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.h +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/footagerelink/CMakeLists.txt b/app/dialog/footagerelink/CMakeLists.txt index 3d420d890..74f158922 100644 --- a/app/dialog/footagerelink/CMakeLists.txt +++ b/app/dialog/footagerelink/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/keyframeproperties/CMakeLists.txt b/app/dialog/keyframeproperties/CMakeLists.txt index fc3b399ec..1764bab10 100644 --- a/app/dialog/keyframeproperties/CMakeLists.txt +++ b/app/dialog/keyframeproperties/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/keyframeproperties/keyframeproperties.cpp b/app/dialog/keyframeproperties/keyframeproperties.cpp index 090902cd0..dfbfcb49e 100644 --- a/app/dialog/keyframeproperties/keyframeproperties.cpp +++ b/app/dialog/keyframeproperties/keyframeproperties.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/keyframeproperties/keyframeproperties.h b/app/dialog/keyframeproperties/keyframeproperties.h index fdf9f7076..3fada931a 100644 --- a/app/dialog/keyframeproperties/keyframeproperties.h +++ b/app/dialog/keyframeproperties/keyframeproperties.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/CMakeLists.txt b/app/dialog/preferences/CMakeLists.txt index 82201b179..85eaf5822 100644 --- a/app/dialog/preferences/CMakeLists.txt +++ b/app/dialog/preferences/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/keysequenceeditor.cpp b/app/dialog/preferences/keysequenceeditor.cpp index d0e6645d8..4c915d9d6 100644 --- a/app/dialog/preferences/keysequenceeditor.cpp +++ b/app/dialog/preferences/keysequenceeditor.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/keysequenceeditor.h b/app/dialog/preferences/keysequenceeditor.h index b3fc396b9..cb507da50 100644 --- a/app/dialog/preferences/keysequenceeditor.h +++ b/app/dialog/preferences/keysequenceeditor.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/preferences.cpp b/app/dialog/preferences/preferences.cpp index 6ca624c07..5f38750af 100644 --- a/app/dialog/preferences/preferences.cpp +++ b/app/dialog/preferences/preferences.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/preferences.h b/app/dialog/preferences/preferences.h index 6f97e2e08..9b4074e69 100644 --- a/app/dialog/preferences/preferences.h +++ b/app/dialog/preferences/preferences.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/CMakeLists.txt b/app/dialog/preferences/tabs/CMakeLists.txt index 62c3270c1..37bfe7a5a 100644 --- a/app/dialog/preferences/tabs/CMakeLists.txt +++ b/app/dialog/preferences/tabs/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesappearancetab.cpp b/app/dialog/preferences/tabs/preferencesappearancetab.cpp index 737821e48..bf3a2c468 100644 --- a/app/dialog/preferences/tabs/preferencesappearancetab.cpp +++ b/app/dialog/preferences/tabs/preferencesappearancetab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesappearancetab.h b/app/dialog/preferences/tabs/preferencesappearancetab.h index 35dc1ffac..98f04d3ef 100644 --- a/app/dialog/preferences/tabs/preferencesappearancetab.h +++ b/app/dialog/preferences/tabs/preferencesappearancetab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesaudiotab.cpp b/app/dialog/preferences/tabs/preferencesaudiotab.cpp index dfe3536a7..fb7fc7b0c 100644 --- a/app/dialog/preferences/tabs/preferencesaudiotab.cpp +++ b/app/dialog/preferences/tabs/preferencesaudiotab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesaudiotab.h b/app/dialog/preferences/tabs/preferencesaudiotab.h index dcf9252b7..b3d0dbd9c 100644 --- a/app/dialog/preferences/tabs/preferencesaudiotab.h +++ b/app/dialog/preferences/tabs/preferencesaudiotab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesbehaviortab.cpp b/app/dialog/preferences/tabs/preferencesbehaviortab.cpp index 3feb53035..5eef42c79 100644 --- a/app/dialog/preferences/tabs/preferencesbehaviortab.cpp +++ b/app/dialog/preferences/tabs/preferencesbehaviortab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesbehaviortab.h b/app/dialog/preferences/tabs/preferencesbehaviortab.h index 521f36cb4..45016b5fa 100644 --- a/app/dialog/preferences/tabs/preferencesbehaviortab.h +++ b/app/dialog/preferences/tabs/preferencesbehaviortab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesdisktab.cpp b/app/dialog/preferences/tabs/preferencesdisktab.cpp index fef948409..870c842fa 100644 --- a/app/dialog/preferences/tabs/preferencesdisktab.cpp +++ b/app/dialog/preferences/tabs/preferencesdisktab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesdisktab.h b/app/dialog/preferences/tabs/preferencesdisktab.h index 5eb7438b7..8a6fadeb2 100644 --- a/app/dialog/preferences/tabs/preferencesdisktab.h +++ b/app/dialog/preferences/tabs/preferencesdisktab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesgeneraltab.cpp b/app/dialog/preferences/tabs/preferencesgeneraltab.cpp index bb0edc144..4ec57eeb3 100644 --- a/app/dialog/preferences/tabs/preferencesgeneraltab.cpp +++ b/app/dialog/preferences/tabs/preferencesgeneraltab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencesgeneraltab.h b/app/dialog/preferences/tabs/preferencesgeneraltab.h index f8cea3b59..8fedf64dc 100644 --- a/app/dialog/preferences/tabs/preferencesgeneraltab.h +++ b/app/dialog/preferences/tabs/preferencesgeneraltab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferenceskeyboardtab.cpp b/app/dialog/preferences/tabs/preferenceskeyboardtab.cpp index f5cbe3da6..ef7e614c1 100644 --- a/app/dialog/preferences/tabs/preferenceskeyboardtab.cpp +++ b/app/dialog/preferences/tabs/preferenceskeyboardtab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferenceskeyboardtab.h b/app/dialog/preferences/tabs/preferenceskeyboardtab.h index 69b906bd6..c8c86a730 100644 --- a/app/dialog/preferences/tabs/preferenceskeyboardtab.h +++ b/app/dialog/preferences/tabs/preferenceskeyboardtab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencestab.cpp b/app/dialog/preferences/tabs/preferencestab.cpp index 883f108cb..6e3c5dd59 100644 --- a/app/dialog/preferences/tabs/preferencestab.cpp +++ b/app/dialog/preferences/tabs/preferencestab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/preferences/tabs/preferencestab.h b/app/dialog/preferences/tabs/preferencestab.h index 60e83d950..7eaebf15c 100644 --- a/app/dialog/preferences/tabs/preferencestab.h +++ b/app/dialog/preferences/tabs/preferencestab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/progress/CMakeLists.txt b/app/dialog/progress/CMakeLists.txt index 99c331702..0acb642e0 100644 --- a/app/dialog/progress/CMakeLists.txt +++ b/app/dialog/progress/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/progress/progress.cpp b/app/dialog/progress/progress.cpp index 011980cb9..96ad4e0c8 100644 --- a/app/dialog/progress/progress.cpp +++ b/app/dialog/progress/progress.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/progress/progress.h b/app/dialog/progress/progress.h index 401afe839..8b011b88b 100644 --- a/app/dialog/progress/progress.h +++ b/app/dialog/progress/progress.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/projectproperties/CMakeLists.txt b/app/dialog/projectproperties/CMakeLists.txt index 7763f8c34..b45092bf6 100644 --- a/app/dialog/projectproperties/CMakeLists.txt +++ b/app/dialog/projectproperties/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/projectproperties/projectproperties.cpp b/app/dialog/projectproperties/projectproperties.cpp index 509a47e61..be8c74756 100644 --- a/app/dialog/projectproperties/projectproperties.cpp +++ b/app/dialog/projectproperties/projectproperties.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/projectproperties/projectproperties.h b/app/dialog/projectproperties/projectproperties.h index 5c0f31347..dbabf953c 100644 --- a/app/dialog/projectproperties/projectproperties.h +++ b/app/dialog/projectproperties/projectproperties.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/rendercancel/CMakeLists.txt b/app/dialog/rendercancel/CMakeLists.txt index a9ca563e9..36c3f9cbb 100644 --- a/app/dialog/rendercancel/CMakeLists.txt +++ b/app/dialog/rendercancel/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/rendercancel/rendercancel.cpp b/app/dialog/rendercancel/rendercancel.cpp index d0f3af8a0..5bff8b315 100644 --- a/app/dialog/rendercancel/rendercancel.cpp +++ b/app/dialog/rendercancel/rendercancel.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/rendercancel/rendercancel.h b/app/dialog/rendercancel/rendercancel.h index 75ba0a563..aa23934ba 100644 --- a/app/dialog/rendercancel/rendercancel.h +++ b/app/dialog/rendercancel/rendercancel.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/richtext/CMakeLists.txt b/app/dialog/richtext/CMakeLists.txt index c434be383..28528c8b5 100644 --- a/app/dialog/richtext/CMakeLists.txt +++ b/app/dialog/richtext/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/richtext/richtext.cpp b/app/dialog/richtext/richtext.cpp index 40f2baabd..99b5ddad5 100644 --- a/app/dialog/richtext/richtext.cpp +++ b/app/dialog/richtext/richtext.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/richtext/richtext.h b/app/dialog/richtext/richtext.h index b3514df4b..bcf67877c 100644 --- a/app/dialog/richtext/richtext.h +++ b/app/dialog/richtext/richtext.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/sequence/CMakeLists.txt b/app/dialog/sequence/CMakeLists.txt index d4a05877d..294b9caeb 100644 --- a/app/dialog/sequence/CMakeLists.txt +++ b/app/dialog/sequence/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/sequence/presetmanager.h b/app/dialog/sequence/presetmanager.h index 08f88f89f..98e47763b 100644 --- a/app/dialog/sequence/presetmanager.h +++ b/app/dialog/sequence/presetmanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/sequence/sequence.cpp b/app/dialog/sequence/sequence.cpp index 0df85621e..4ce905697 100644 --- a/app/dialog/sequence/sequence.cpp +++ b/app/dialog/sequence/sequence.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/sequence/sequence.h b/app/dialog/sequence/sequence.h index acbe22a0b..29d20a328 100644 --- a/app/dialog/sequence/sequence.h +++ b/app/dialog/sequence/sequence.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/sequence/sequencedialogpresettab.cpp b/app/dialog/sequence/sequencedialogpresettab.cpp index 1f25a29fb..c6ff81b6d 100644 --- a/app/dialog/sequence/sequencedialogpresettab.cpp +++ b/app/dialog/sequence/sequencedialogpresettab.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/sequence/sequencedialogpresettab.h b/app/dialog/sequence/sequencedialogpresettab.h index a2ef8a95d..1caae8268 100644 --- a/app/dialog/sequence/sequencedialogpresettab.h +++ b/app/dialog/sequence/sequencedialogpresettab.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/sequence/sequencepreset.h b/app/dialog/sequence/sequencepreset.h index 59db546fd..e686faabe 100644 --- a/app/dialog/sequence/sequencepreset.h +++ b/app/dialog/sequence/sequencepreset.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/task/CMakeLists.txt b/app/dialog/task/CMakeLists.txt index df35aad3a..e387095d8 100644 --- a/app/dialog/task/CMakeLists.txt +++ b/app/dialog/task/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/dialog/task/task.cpp b/app/dialog/task/task.cpp index e3e1f673b..423c6b708 100644 --- a/app/dialog/task/task.cpp +++ b/app/dialog/task/task.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/dialog/task/task.h b/app/dialog/task/task.h index e796ff248..a8424f93f 100644 --- a/app/dialog/task/task.h +++ b/app/dialog/task/task.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/main.cpp b/app/main.cpp index 1392e816c..5d02a37e3 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/CMakeLists.txt b/app/node/CMakeLists.txt index 744bc7da9..7581daa25 100644 --- a/app/node/CMakeLists.txt +++ b/app/node/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/audio/CMakeLists.txt b/app/node/audio/CMakeLists.txt index e8bfe8647..e1dfd8173 100644 --- a/app/node/audio/CMakeLists.txt +++ b/app/node/audio/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/audio/pan/CMakeLists.txt b/app/node/audio/pan/CMakeLists.txt index 66384293d..56e7ed226 100644 --- a/app/node/audio/pan/CMakeLists.txt +++ b/app/node/audio/pan/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/audio/pan/pan.cpp b/app/node/audio/pan/pan.cpp index 7fbfd99ca..08770e0df 100644 --- a/app/node/audio/pan/pan.cpp +++ b/app/node/audio/pan/pan.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/audio/pan/pan.h b/app/node/audio/pan/pan.h index d8d9f3989..4ef15c702 100644 --- a/app/node/audio/pan/pan.h +++ b/app/node/audio/pan/pan.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/audio/volume/CMakeLists.txt b/app/node/audio/volume/CMakeLists.txt index 6956ebd0c..097f0f14f 100644 --- a/app/node/audio/volume/CMakeLists.txt +++ b/app/node/audio/volume/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/audio/volume/volume.cpp b/app/node/audio/volume/volume.cpp index b6d48e764..f96370ab6 100644 --- a/app/node/audio/volume/volume.cpp +++ b/app/node/audio/volume/volume.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/audio/volume/volume.h b/app/node/audio/volume/volume.h index e4c0ce5d4..d6b62447e 100644 --- a/app/node/audio/volume/volume.h +++ b/app/node/audio/volume/volume.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/CMakeLists.txt b/app/node/block/CMakeLists.txt index 97828e68b..d9d613ebd 100644 --- a/app/node/block/CMakeLists.txt +++ b/app/node/block/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index 0289e11b2..79b8a7ffe 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/block.h b/app/node/block/block.h index 52beed7cb..14a715166 100644 --- a/app/node/block/block.h +++ b/app/node/block/block.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/clip/CMakeLists.txt b/app/node/block/clip/CMakeLists.txt index 378335849..75cb1845a 100644 --- a/app/node/block/clip/CMakeLists.txt +++ b/app/node/block/clip/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/block/clip/clip.cpp b/app/node/block/clip/clip.cpp index 5143d226c..0aaf82e76 100644 --- a/app/node/block/clip/clip.cpp +++ b/app/node/block/clip/clip.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/clip/clip.h b/app/node/block/clip/clip.h index 00f6e0ba0..c8bbcde5a 100644 --- a/app/node/block/clip/clip.h +++ b/app/node/block/clip/clip.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/gap/CMakeLists.txt b/app/node/block/gap/CMakeLists.txt index f66cee93c..c4fe85a8c 100644 --- a/app/node/block/gap/CMakeLists.txt +++ b/app/node/block/gap/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/block/gap/gap.cpp b/app/node/block/gap/gap.cpp index 8d0e4fdf6..495667ca7 100644 --- a/app/node/block/gap/gap.cpp +++ b/app/node/block/gap/gap.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/gap/gap.h b/app/node/block/gap/gap.h index 4eded9d4d..245627465 100644 --- a/app/node/block/gap/gap.h +++ b/app/node/block/gap/gap.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/transition/CMakeLists.txt b/app/node/block/transition/CMakeLists.txt index 4a380bc81..70a644afa 100644 --- a/app/node/block/transition/CMakeLists.txt +++ b/app/node/block/transition/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/block/transition/crossdissolve/CMakeLists.txt b/app/node/block/transition/crossdissolve/CMakeLists.txt index 25c90ed8e..572ca510f 100644 --- a/app/node/block/transition/crossdissolve/CMakeLists.txt +++ b/app/node/block/transition/crossdissolve/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp index c85d48d3e..1614eac42 100644 --- a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp +++ b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/transition/crossdissolve/crossdissolvetransition.h b/app/node/block/transition/crossdissolve/crossdissolvetransition.h index 8b6d3157c..3a68ddea8 100644 --- a/app/node/block/transition/crossdissolve/crossdissolvetransition.h +++ b/app/node/block/transition/crossdissolve/crossdissolvetransition.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/transition/diptocolor/CMakeLists.txt b/app/node/block/transition/diptocolor/CMakeLists.txt index 7eb37f14d..cc19d8c80 100644 --- a/app/node/block/transition/diptocolor/CMakeLists.txt +++ b/app/node/block/transition/diptocolor/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/block/transition/diptocolor/diptocolortransition.cpp b/app/node/block/transition/diptocolor/diptocolortransition.cpp index d75593158..03751374a 100644 --- a/app/node/block/transition/diptocolor/diptocolortransition.cpp +++ b/app/node/block/transition/diptocolor/diptocolortransition.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/transition/diptocolor/diptocolortransition.h b/app/node/block/transition/diptocolor/diptocolortransition.h index 127c5682c..3a1dd6cc2 100644 --- a/app/node/block/transition/diptocolor/diptocolortransition.h +++ b/app/node/block/transition/diptocolor/diptocolortransition.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/transition/transition.cpp b/app/node/block/transition/transition.cpp index 5fc6a863a..554e7fd15 100644 --- a/app/node/block/transition/transition.cpp +++ b/app/node/block/transition/transition.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/block/transition/transition.h b/app/node/block/transition/transition.h index 4a01e6fb1..69dc2b2ec 100644 --- a/app/node/block/transition/transition.h +++ b/app/node/block/transition/transition.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/edge.cpp b/app/node/edge.cpp index 5f009b8f3..0fd475d9f 100644 --- a/app/node/edge.cpp +++ b/app/node/edge.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/edge.h b/app/node/edge.h index a79b8aec7..dca841edd 100644 --- a/app/node/edge.h +++ b/app/node/edge.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/factory.cpp b/app/node/factory.cpp index 7c389f443..e81bfc405 100644 --- a/app/node/factory.cpp +++ b/app/node/factory.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/factory.h b/app/node/factory.h index 6025070ef..5a0906ba7 100644 --- a/app/node/factory.h +++ b/app/node/factory.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/filter/CMakeLists.txt b/app/node/filter/CMakeLists.txt index 4d7db901d..6e3351a58 100644 --- a/app/node/filter/CMakeLists.txt +++ b/app/node/filter/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/filter/blur/CMakeLists.txt b/app/node/filter/blur/CMakeLists.txt index 50bd90ad5..a63449699 100644 --- a/app/node/filter/blur/CMakeLists.txt +++ b/app/node/filter/blur/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/filter/blur/blur.cpp b/app/node/filter/blur/blur.cpp index 332a31555..ce833f713 100644 --- a/app/node/filter/blur/blur.cpp +++ b/app/node/filter/blur/blur.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/filter/blur/blur.h b/app/node/filter/blur/blur.h index 5fd7cc12d..7539b440c 100644 --- a/app/node/filter/blur/blur.h +++ b/app/node/filter/blur/blur.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/filter/stroke/CMakeLists.txt b/app/node/filter/stroke/CMakeLists.txt index 212f3bfe2..a28916ea5 100644 --- a/app/node/filter/stroke/CMakeLists.txt +++ b/app/node/filter/stroke/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/filter/stroke/stroke.cpp b/app/node/filter/stroke/stroke.cpp index 5606c19a8..18358fac3 100644 --- a/app/node/filter/stroke/stroke.cpp +++ b/app/node/filter/stroke/stroke.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/filter/stroke/stroke.h b/app/node/filter/stroke/stroke.h index 418647370..30153ba3f 100644 --- a/app/node/filter/stroke/stroke.h +++ b/app/node/filter/stroke/stroke.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/CMakeLists.txt b/app/node/generator/CMakeLists.txt index 264d7dade..ebc18dd7c 100644 --- a/app/node/generator/CMakeLists.txt +++ b/app/node/generator/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/matrix/CMakeLists.txt b/app/node/generator/matrix/CMakeLists.txt index b986f2aca..321b4f8fa 100644 --- a/app/node/generator/matrix/CMakeLists.txt +++ b/app/node/generator/matrix/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/matrix/matrix.cpp b/app/node/generator/matrix/matrix.cpp index 836510a3f..70e77ec1b 100644 --- a/app/node/generator/matrix/matrix.cpp +++ b/app/node/generator/matrix/matrix.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/matrix/matrix.h b/app/node/generator/matrix/matrix.h index ff1ddddb6..30e21ff27 100644 --- a/app/node/generator/matrix/matrix.h +++ b/app/node/generator/matrix/matrix.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/polygon/CMakeLists.txt b/app/node/generator/polygon/CMakeLists.txt index a1a4b2cc5..8e8e77a41 100644 --- a/app/node/generator/polygon/CMakeLists.txt +++ b/app/node/generator/polygon/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/polygon/polygon.cpp b/app/node/generator/polygon/polygon.cpp index 379eb659f..dc2c6baf9 100644 --- a/app/node/generator/polygon/polygon.cpp +++ b/app/node/generator/polygon/polygon.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/polygon/polygon.h b/app/node/generator/polygon/polygon.h index fb3aeeeae..2d38fcb44 100644 --- a/app/node/generator/polygon/polygon.h +++ b/app/node/generator/polygon/polygon.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/solid/CMakeLists.txt b/app/node/generator/solid/CMakeLists.txt index df388a97d..0740bd656 100644 --- a/app/node/generator/solid/CMakeLists.txt +++ b/app/node/generator/solid/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/solid/solid.cpp b/app/node/generator/solid/solid.cpp index 9309dcd69..d82c0e903 100644 --- a/app/node/generator/solid/solid.cpp +++ b/app/node/generator/solid/solid.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/solid/solid.h b/app/node/generator/solid/solid.h index 3572c3cd3..95be72a55 100644 --- a/app/node/generator/solid/solid.h +++ b/app/node/generator/solid/solid.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/text/CMakeLists.txt b/app/node/generator/text/CMakeLists.txt index ec2049f42..7fb53b9f0 100644 --- a/app/node/generator/text/CMakeLists.txt +++ b/app/node/generator/text/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/text/text.cpp b/app/node/generator/text/text.cpp index 3c078cf34..d88e3cd1e 100644 --- a/app/node/generator/text/text.cpp +++ b/app/node/generator/text/text.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/generator/text/text.h b/app/node/generator/text/text.h index 89d2661a3..34c452251 100644 --- a/app/node/generator/text/text.h +++ b/app/node/generator/text/text.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/graph.cpp b/app/node/graph.cpp index aa7515f9a..676647e12 100644 --- a/app/node/graph.cpp +++ b/app/node/graph.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/graph.h b/app/node/graph.h index 68324eb7a..0a3e86c9f 100644 --- a/app/node/graph.h +++ b/app/node/graph.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input.cpp b/app/node/input.cpp index d34e777b6..dac383689 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input.h b/app/node/input.h index c7296ad3e..ab50925f4 100644 --- a/app/node/input.h +++ b/app/node/input.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input/CMakeLists.txt b/app/node/input/CMakeLists.txt index 5f711f39c..95e07c839 100644 --- a/app/node/input/CMakeLists.txt +++ b/app/node/input/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/input/media/CMakeLists.txt b/app/node/input/media/CMakeLists.txt index 8b674d74d..a8e7169c5 100644 --- a/app/node/input/media/CMakeLists.txt +++ b/app/node/input/media/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/input/media/audio/CMakeLists.txt b/app/node/input/media/audio/CMakeLists.txt index e3de8ae0b..02fbbb83b 100644 --- a/app/node/input/media/audio/CMakeLists.txt +++ b/app/node/input/media/audio/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/input/media/audio/audio.cpp b/app/node/input/media/audio/audio.cpp index 49463aa22..d98118880 100644 --- a/app/node/input/media/audio/audio.cpp +++ b/app/node/input/media/audio/audio.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input/media/audio/audio.h b/app/node/input/media/audio/audio.h index 0af4e0267..0690c4f42 100644 --- a/app/node/input/media/audio/audio.h +++ b/app/node/input/media/audio/audio.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input/media/media.cpp b/app/node/input/media/media.cpp index 5469ef46c..bd57ad7f9 100644 --- a/app/node/input/media/media.cpp +++ b/app/node/input/media/media.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input/media/media.h b/app/node/input/media/media.h index 895a4ff66..f0fae920d 100644 --- a/app/node/input/media/media.h +++ b/app/node/input/media/media.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input/media/video/CMakeLists.txt b/app/node/input/media/video/CMakeLists.txt index f37e07c36..7ade38f4e 100644 --- a/app/node/input/media/video/CMakeLists.txt +++ b/app/node/input/media/video/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/input/media/video/video.cpp b/app/node/input/media/video/video.cpp index 5507bc12c..3163d327c 100644 --- a/app/node/input/media/video/video.cpp +++ b/app/node/input/media/video/video.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input/media/video/video.h b/app/node/input/media/video/video.h index caa90c2ac..785634de8 100644 --- a/app/node/input/media/video/video.h +++ b/app/node/input/media/video/video.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input/time/CMakeLists.txt b/app/node/input/time/CMakeLists.txt index 0d308d952..d9a342a5f 100644 --- a/app/node/input/time/CMakeLists.txt +++ b/app/node/input/time/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/input/time/timeinput.cpp b/app/node/input/time/timeinput.cpp index 485e90173..75fa6888d 100644 --- a/app/node/input/time/timeinput.cpp +++ b/app/node/input/time/timeinput.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/input/time/timeinput.h b/app/node/input/time/timeinput.h index d41492942..1f898a98f 100644 --- a/app/node/input/time/timeinput.h +++ b/app/node/input/time/timeinput.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/inputarray.cpp b/app/node/inputarray.cpp index 94d5b4080..1203e4a4d 100644 --- a/app/node/inputarray.cpp +++ b/app/node/inputarray.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/inputarray.h b/app/node/inputarray.h index 5aac757ac..7acb192d8 100644 --- a/app/node/inputarray.h +++ b/app/node/inputarray.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/inputdragger.cpp b/app/node/inputdragger.cpp index 9c62f520c..0edb8b85b 100644 --- a/app/node/inputdragger.cpp +++ b/app/node/inputdragger.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/inputdragger.h b/app/node/inputdragger.h index f67f163a2..17038f003 100644 --- a/app/node/inputdragger.h +++ b/app/node/inputdragger.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/keyframe.cpp b/app/node/keyframe.cpp index d6839088d..1112f10ec 100644 --- a/app/node/keyframe.cpp +++ b/app/node/keyframe.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/keyframe.h b/app/node/keyframe.h index 6b12de038..f386f7fad 100644 --- a/app/node/keyframe.h +++ b/app/node/keyframe.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/math/CMakeLists.txt b/app/node/math/CMakeLists.txt index 32ad7e923..c6cad0ac0 100644 --- a/app/node/math/CMakeLists.txt +++ b/app/node/math/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/math/math/CMakeLists.txt b/app/node/math/math/CMakeLists.txt index cfd3f7ab9..81f527c58 100644 --- a/app/node/math/math/CMakeLists.txt +++ b/app/node/math/math/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/math/math/math.cpp b/app/node/math/math/math.cpp index fc43f7010..72dc8ae73 100644 --- a/app/node/math/math/math.cpp +++ b/app/node/math/math/math.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/math/math/math.h b/app/node/math/math/math.h index 04bd1debe..e516a8f21 100644 --- a/app/node/math/math/math.h +++ b/app/node/math/math/math.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/math/math/mathbase.cpp b/app/node/math/math/mathbase.cpp index e6b980c66..66bd28788 100644 --- a/app/node/math/math/mathbase.cpp +++ b/app/node/math/math/mathbase.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/math/math/mathbase.h b/app/node/math/math/mathbase.h index cdea260bf..2d563c192 100644 --- a/app/node/math/math/mathbase.h +++ b/app/node/math/math/mathbase.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/math/merge/CMakeLists.txt b/app/node/math/merge/CMakeLists.txt index a7472ded0..62a57230b 100644 --- a/app/node/math/merge/CMakeLists.txt +++ b/app/node/math/merge/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/math/merge/merge.cpp b/app/node/math/merge/merge.cpp index 6b7ab17a6..d837c3269 100644 --- a/app/node/math/merge/merge.cpp +++ b/app/node/math/merge/merge.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/math/merge/merge.h b/app/node/math/merge/merge.h index 52d59a97d..3a7af401f 100644 --- a/app/node/math/merge/merge.h +++ b/app/node/math/merge/merge.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/math/trigonometry/CMakeLists.txt b/app/node/math/trigonometry/CMakeLists.txt index 9dd5630de..ff8d4ef8f 100644 --- a/app/node/math/trigonometry/CMakeLists.txt +++ b/app/node/math/trigonometry/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/math/trigonometry/trigonometry.cpp b/app/node/math/trigonometry/trigonometry.cpp index a8649ff64..6cdb24e72 100644 --- a/app/node/math/trigonometry/trigonometry.cpp +++ b/app/node/math/trigonometry/trigonometry.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/math/trigonometry/trigonometry.h b/app/node/math/trigonometry/trigonometry.h index a0e4f5d71..148a0bb40 100644 --- a/app/node/math/trigonometry/trigonometry.h +++ b/app/node/math/trigonometry/trigonometry.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/node.cpp b/app/node/node.cpp index 0abc3e69d..4d9f227c3 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/node.h b/app/node/node.h index b69dde82c..308af12dd 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/output.cpp b/app/node/output.cpp index 47f5f398d..72bfd3340 100644 --- a/app/node/output.cpp +++ b/app/node/output.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/output.h b/app/node/output.h index 10439bf0f..bef01c7fe 100644 --- a/app/node/output.h +++ b/app/node/output.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/output/CMakeLists.txt b/app/node/output/CMakeLists.txt index 49473e6b8..6a930fbe3 100644 --- a/app/node/output/CMakeLists.txt +++ b/app/node/output/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/output/track/CMakeLists.txt b/app/node/output/track/CMakeLists.txt index 8557f7fbd..660f66b0d 100644 --- a/app/node/output/track/CMakeLists.txt +++ b/app/node/output/track/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index 09bb92615..1304ed63c 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/output/track/track.h b/app/node/output/track/track.h index 06296c513..047ca7588 100644 --- a/app/node/output/track/track.h +++ b/app/node/output/track/track.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/output/track/tracklist.cpp b/app/node/output/track/tracklist.cpp index e18332040..36178e449 100644 --- a/app/node/output/track/tracklist.cpp +++ b/app/node/output/track/tracklist.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/output/track/tracklist.h b/app/node/output/track/tracklist.h index 2589247e5..8af67abed 100644 --- a/app/node/output/track/tracklist.h +++ b/app/node/output/track/tracklist.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/output/viewer/CMakeLists.txt b/app/node/output/viewer/CMakeLists.txt index 86c82a689..71266320c 100644 --- a/app/node/output/viewer/CMakeLists.txt +++ b/app/node/output/viewer/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index b2917546d..8d26336b9 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/output/viewer/viewer.h b/app/node/output/viewer/viewer.h index 3113c2eae..886195135 100644 --- a/app/node/output/viewer/viewer.h +++ b/app/node/output/viewer/viewer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/param.cpp b/app/node/param.cpp index de6453a7d..b26df62ad 100644 --- a/app/node/param.cpp +++ b/app/node/param.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/param.h b/app/node/param.h index 553dbe248..e0cffb354 100644 --- a/app/node/param.h +++ b/app/node/param.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/traverser.cpp b/app/node/traverser.cpp index fd6593417..bd87ade63 100644 --- a/app/node/traverser.cpp +++ b/app/node/traverser.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/traverser.h b/app/node/traverser.h index e9a377ae4..b4a722813 100644 --- a/app/node/traverser.h +++ b/app/node/traverser.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/value.cpp b/app/node/value.cpp index fb337253e..fc994b125 100644 --- a/app/node/value.cpp +++ b/app/node/value.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/node/value.h b/app/node/value.h index 448291d9a..6d089ae8c 100644 --- a/app/node/value.h +++ b/app/node/value.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/packaging/CMakeLists.txt b/app/packaging/CMakeLists.txt index 776bb311e..19e4b14b1 100644 --- a/app/packaging/CMakeLists.txt +++ b/app/packaging/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/packaging/linux/CMakeLists.txt b/app/packaging/linux/CMakeLists.txt index ffef26e04..58d53a771 100644 --- a/app/packaging/linux/CMakeLists.txt +++ b/app/packaging/linux/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/CMakeLists.txt b/app/panel/CMakeLists.txt index 75c1c7738..53b8cd1aa 100644 --- a/app/panel/CMakeLists.txt +++ b/app/panel/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/audiomonitor/CMakeLists.txt b/app/panel/audiomonitor/CMakeLists.txt index 833c406d3..c52cefa75 100644 --- a/app/panel/audiomonitor/CMakeLists.txt +++ b/app/panel/audiomonitor/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/audiomonitor/audiomonitor.cpp b/app/panel/audiomonitor/audiomonitor.cpp index d15db07b0..8a33e8e6b 100644 --- a/app/panel/audiomonitor/audiomonitor.cpp +++ b/app/panel/audiomonitor/audiomonitor.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/audiomonitor/audiomonitor.h b/app/panel/audiomonitor/audiomonitor.h index f9fc32667..567213047 100644 --- a/app/panel/audiomonitor/audiomonitor.h +++ b/app/panel/audiomonitor/audiomonitor.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/curve/CMakeLists.txt b/app/panel/curve/CMakeLists.txt index 0831df991..50e8841ae 100644 --- a/app/panel/curve/CMakeLists.txt +++ b/app/panel/curve/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/curve/curve.cpp b/app/panel/curve/curve.cpp index 8625f111b..b81a99b0b 100644 --- a/app/panel/curve/curve.cpp +++ b/app/panel/curve/curve.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/curve/curve.h b/app/panel/curve/curve.h index 52903dbf0..4a5b6bb92 100644 --- a/app/panel/curve/curve.h +++ b/app/panel/curve/curve.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/footageviewer/CMakeLists.txt b/app/panel/footageviewer/CMakeLists.txt index 127fe1a00..278eb6e9b 100644 --- a/app/panel/footageviewer/CMakeLists.txt +++ b/app/panel/footageviewer/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/footageviewer/footageviewer.cpp b/app/panel/footageviewer/footageviewer.cpp index 5ca58884a..e23dad1e0 100644 --- a/app/panel/footageviewer/footageviewer.cpp +++ b/app/panel/footageviewer/footageviewer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/footageviewer/footageviewer.h b/app/panel/footageviewer/footageviewer.h index 6b483ec2b..b2925b8ed 100644 --- a/app/panel/footageviewer/footageviewer.h +++ b/app/panel/footageviewer/footageviewer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/node/CMakeLists.txt b/app/panel/node/CMakeLists.txt index 23f0f7f7a..f59514568 100644 --- a/app/panel/node/CMakeLists.txt +++ b/app/panel/node/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/node/node.cpp b/app/panel/node/node.cpp index 44aad38f6..5953893d8 100644 --- a/app/panel/node/node.cpp +++ b/app/panel/node/node.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/node/node.h b/app/panel/node/node.h index cba87c52c..7582073fa 100644 --- a/app/panel/node/node.h +++ b/app/panel/node/node.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/panelmanager.cpp b/app/panel/panelmanager.cpp index 53903f81e..a2c5d76a2 100644 --- a/app/panel/panelmanager.cpp +++ b/app/panel/panelmanager.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/panelmanager.h b/app/panel/panelmanager.h index caa7bae07..cd73c0402 100644 --- a/app/panel/panelmanager.h +++ b/app/panel/panelmanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/param/CMakeLists.txt b/app/panel/param/CMakeLists.txt index 04e3682a5..b827de128 100644 --- a/app/panel/param/CMakeLists.txt +++ b/app/panel/param/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/param/param.cpp b/app/panel/param/param.cpp index 68ae7525a..35dfba91d 100644 --- a/app/panel/param/param.cpp +++ b/app/panel/param/param.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/param/param.h b/app/panel/param/param.h index de7a67967..6f9ce30e5 100644 --- a/app/panel/param/param.h +++ b/app/panel/param/param.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/pixelsampler/CMakeLists.txt b/app/panel/pixelsampler/CMakeLists.txt index e10db4b54..74c3c2913 100644 --- a/app/panel/pixelsampler/CMakeLists.txt +++ b/app/panel/pixelsampler/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/pixelsampler/pixelsamplerpanel.cpp b/app/panel/pixelsampler/pixelsamplerpanel.cpp index f83a907ac..15281a284 100644 --- a/app/panel/pixelsampler/pixelsamplerpanel.cpp +++ b/app/panel/pixelsampler/pixelsamplerpanel.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/pixelsampler/pixelsamplerpanel.h b/app/panel/pixelsampler/pixelsamplerpanel.h index 6e91cce2f..812fec51a 100644 --- a/app/panel/pixelsampler/pixelsamplerpanel.h +++ b/app/panel/pixelsampler/pixelsamplerpanel.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/project/CMakeLists.txt b/app/panel/project/CMakeLists.txt index e274eaa22..2b2c18e3e 100644 --- a/app/panel/project/CMakeLists.txt +++ b/app/panel/project/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/project/footagemanagementpanel.h b/app/panel/project/footagemanagementpanel.h index 02474665b..c1ec1ba64 100644 --- a/app/panel/project/footagemanagementpanel.h +++ b/app/panel/project/footagemanagementpanel.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/project/project.cpp b/app/panel/project/project.cpp index 51fd9388e..928956c60 100644 --- a/app/panel/project/project.cpp +++ b/app/panel/project/project.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/project/project.h b/app/panel/project/project.h index e77511b2d..345a44d8f 100644 --- a/app/panel/project/project.h +++ b/app/panel/project/project.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/scope/CMakeLists.txt b/app/panel/scope/CMakeLists.txt index 2e456b060..1f8fdfd29 100644 --- a/app/panel/scope/CMakeLists.txt +++ b/app/panel/scope/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/scope/scope.cpp b/app/panel/scope/scope.cpp index 5daa7e9e0..936f68f9b 100644 --- a/app/panel/scope/scope.cpp +++ b/app/panel/scope/scope.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/scope/scope.h b/app/panel/scope/scope.h index 3e771af69..30622fbf3 100644 --- a/app/panel/scope/scope.h +++ b/app/panel/scope/scope.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/sequenceviewer/CMakeLists.txt b/app/panel/sequenceviewer/CMakeLists.txt index 8cba8ac6f..10cb0258f 100644 --- a/app/panel/sequenceviewer/CMakeLists.txt +++ b/app/panel/sequenceviewer/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/sequenceviewer/sequenceviewer.cpp b/app/panel/sequenceviewer/sequenceviewer.cpp index 6712a99eb..0292ae445 100644 --- a/app/panel/sequenceviewer/sequenceviewer.cpp +++ b/app/panel/sequenceviewer/sequenceviewer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/sequenceviewer/sequenceviewer.h b/app/panel/sequenceviewer/sequenceviewer.h index a0e0ebdca..9c86eb156 100644 --- a/app/panel/sequenceviewer/sequenceviewer.h +++ b/app/panel/sequenceviewer/sequenceviewer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/table/CMakeLists.txt b/app/panel/table/CMakeLists.txt index f332aa646..389ee1533 100644 --- a/app/panel/table/CMakeLists.txt +++ b/app/panel/table/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/table/table.cpp b/app/panel/table/table.cpp index 0b3c5260f..0ee975248 100644 --- a/app/panel/table/table.cpp +++ b/app/panel/table/table.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/table/table.h b/app/panel/table/table.h index 10e2bc338..7667f0294 100644 --- a/app/panel/table/table.h +++ b/app/panel/table/table.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/taskmanager/CMakeLists.txt b/app/panel/taskmanager/CMakeLists.txt index 63f6baa3c..6c27abdcf 100644 --- a/app/panel/taskmanager/CMakeLists.txt +++ b/app/panel/taskmanager/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/taskmanager/taskmanager.cpp b/app/panel/taskmanager/taskmanager.cpp index e77f4e39f..f7d9309c8 100644 --- a/app/panel/taskmanager/taskmanager.cpp +++ b/app/panel/taskmanager/taskmanager.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/taskmanager/taskmanager.h b/app/panel/taskmanager/taskmanager.h index 78e272761..6ae0daba1 100644 --- a/app/panel/taskmanager/taskmanager.h +++ b/app/panel/taskmanager/taskmanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/timebased/CMakeLists.txt b/app/panel/timebased/CMakeLists.txt index 957f3ae6a..b450fd8eb 100644 --- a/app/panel/timebased/CMakeLists.txt +++ b/app/panel/timebased/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/timebased/timebased.cpp b/app/panel/timebased/timebased.cpp index 5e95e944d..c48c111cb 100644 --- a/app/panel/timebased/timebased.cpp +++ b/app/panel/timebased/timebased.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/timebased/timebased.h b/app/panel/timebased/timebased.h index 90fb83723..8e998f02d 100644 --- a/app/panel/timebased/timebased.h +++ b/app/panel/timebased/timebased.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/timeline/CMakeLists.txt b/app/panel/timeline/CMakeLists.txt index bb7eefaf7..678db400f 100644 --- a/app/panel/timeline/CMakeLists.txt +++ b/app/panel/timeline/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index 2a36987b3..124e99a36 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/timeline/timeline.h b/app/panel/timeline/timeline.h index 30bab181a..a0ea68116 100644 --- a/app/panel/timeline/timeline.h +++ b/app/panel/timeline/timeline.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/tool/CMakeLists.txt b/app/panel/tool/CMakeLists.txt index 7244ed3ff..605393a77 100644 --- a/app/panel/tool/CMakeLists.txt +++ b/app/panel/tool/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/tool/tool.cpp b/app/panel/tool/tool.cpp index 7822ece90..9ad5cddcd 100644 --- a/app/panel/tool/tool.cpp +++ b/app/panel/tool/tool.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/tool/tool.h b/app/panel/tool/tool.h index 6b144e7d3..2e2e956cb 100644 --- a/app/panel/tool/tool.h +++ b/app/panel/tool/tool.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/viewer/CMakeLists.txt b/app/panel/viewer/CMakeLists.txt index 74bdc110a..b3b4a957c 100644 --- a/app/panel/viewer/CMakeLists.txt +++ b/app/panel/viewer/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/panel/viewer/viewer.cpp b/app/panel/viewer/viewer.cpp index d2c3853e7..4a575b910 100644 --- a/app/panel/viewer/viewer.cpp +++ b/app/panel/viewer/viewer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/viewer/viewer.h b/app/panel/viewer/viewer.h index 4e35444e2..8309a8694 100644 --- a/app/panel/viewer/viewer.h +++ b/app/panel/viewer/viewer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/viewer/viewerbase.cpp b/app/panel/viewer/viewerbase.cpp index 47ebbe0e0..028fb484e 100644 --- a/app/panel/viewer/viewerbase.cpp +++ b/app/panel/viewer/viewerbase.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/panel/viewer/viewerbase.h b/app/panel/viewer/viewerbase.h index 36ac0aa35..a8fe9c00a 100644 --- a/app/panel/viewer/viewerbase.h +++ b/app/panel/viewer/viewerbase.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/CMakeLists.txt b/app/project/CMakeLists.txt index 1b9763aba..42d59552d 100644 --- a/app/project/CMakeLists.txt +++ b/app/project/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/project/item/CMakeLists.txt b/app/project/item/CMakeLists.txt index 98dbe8b5e..801a78e72 100644 --- a/app/project/item/CMakeLists.txt +++ b/app/project/item/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/project/item/folder/CMakeLists.txt b/app/project/item/folder/CMakeLists.txt index b055fbeb5..745b4222a 100644 --- a/app/project/item/folder/CMakeLists.txt +++ b/app/project/item/folder/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/project/item/folder/folder.cpp b/app/project/item/folder/folder.cpp index 47e1a60df..7f3b97661 100644 --- a/app/project/item/folder/folder.cpp +++ b/app/project/item/folder/folder.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/folder/folder.h b/app/project/item/folder/folder.h index c2e3cbaba..cec258c44 100644 --- a/app/project/item/folder/folder.h +++ b/app/project/item/folder/folder.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/footage/CMakeLists.txt b/app/project/item/footage/CMakeLists.txt index 5482cce07..1a3d79e45 100644 --- a/app/project/item/footage/CMakeLists.txt +++ b/app/project/item/footage/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/project/item/footage/audiostream.cpp b/app/project/item/footage/audiostream.cpp index 946fe8942..58e5b6096 100644 --- a/app/project/item/footage/audiostream.cpp +++ b/app/project/item/footage/audiostream.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/footage/audiostream.h b/app/project/item/footage/audiostream.h index a4990b385..f38b9b6c9 100644 --- a/app/project/item/footage/audiostream.h +++ b/app/project/item/footage/audiostream.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/footage/footage.cpp b/app/project/item/footage/footage.cpp index a9fa04527..5a8f03388 100644 --- a/app/project/item/footage/footage.cpp +++ b/app/project/item/footage/footage.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/footage/footage.h b/app/project/item/footage/footage.h index 3348d35cb..3bc4a2b3a 100644 --- a/app/project/item/footage/footage.h +++ b/app/project/item/footage/footage.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/footage/stream.cpp b/app/project/item/footage/stream.cpp index 8598a87e8..5e8b6dd5d 100644 --- a/app/project/item/footage/stream.cpp +++ b/app/project/item/footage/stream.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/footage/stream.h b/app/project/item/footage/stream.h index 634bce7b0..e3890c6f0 100644 --- a/app/project/item/footage/stream.h +++ b/app/project/item/footage/stream.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/footage/videostream.cpp b/app/project/item/footage/videostream.cpp index 9a0094e4f..de2a846c0 100644 --- a/app/project/item/footage/videostream.cpp +++ b/app/project/item/footage/videostream.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/footage/videostream.h b/app/project/item/footage/videostream.h index 59fb8956c..9742c67f5 100644 --- a/app/project/item/footage/videostream.h +++ b/app/project/item/footage/videostream.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/item.cpp b/app/project/item/item.cpp index cfb5bd915..cd9cf8e18 100644 --- a/app/project/item/item.cpp +++ b/app/project/item/item.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/item.h b/app/project/item/item.h index 03739d0f8..9f67b5b1c 100644 --- a/app/project/item/item.h +++ b/app/project/item/item.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/sequence/CMakeLists.txt b/app/project/item/sequence/CMakeLists.txt index 0c4b43b22..de063f1e5 100644 --- a/app/project/item/sequence/CMakeLists.txt +++ b/app/project/item/sequence/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/project/item/sequence/sequence.cpp b/app/project/item/sequence/sequence.cpp index 8b7c4d534..d85b17ff4 100644 --- a/app/project/item/sequence/sequence.cpp +++ b/app/project/item/sequence/sequence.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/item/sequence/sequence.h b/app/project/item/sequence/sequence.h index 5eeee3cb5..c0c6db7e8 100644 --- a/app/project/item/sequence/sequence.h +++ b/app/project/item/sequence/sequence.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/project.cpp b/app/project/project.cpp index 6cf8342e9..9b1578ecd 100644 --- a/app/project/project.cpp +++ b/app/project/project.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/project.h b/app/project/project.h index b96dcff85..bca8872c7 100644 --- a/app/project/project.h +++ b/app/project/project.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/projectviewmodel.cpp b/app/project/projectviewmodel.cpp index d5ff1b552..b27573f98 100644 --- a/app/project/projectviewmodel.cpp +++ b/app/project/projectviewmodel.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/project/projectviewmodel.h b/app/project/projectviewmodel.h index 255c76d36..e9f032e70 100644 --- a/app/project/projectviewmodel.h +++ b/app/project/projectviewmodel.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/CMakeLists.txt b/app/render/CMakeLists.txt index 7f0bae3c7..986160959 100644 --- a/app/render/CMakeLists.txt +++ b/app/render/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/render/audioparams.cpp b/app/render/audioparams.cpp index 24c308a33..bcf4cfb3f 100644 --- a/app/render/audioparams.cpp +++ b/app/render/audioparams.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/audioparams.h b/app/render/audioparams.h index 4ce4ccfbf..8cfc43c72 100644 --- a/app/render/audioparams.h +++ b/app/render/audioparams.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/audioplaybackcache.cpp b/app/render/audioplaybackcache.cpp index a4997c035..7763ab603 100644 --- a/app/render/audioplaybackcache.cpp +++ b/app/render/audioplaybackcache.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/audioplaybackcache.h b/app/render/audioplaybackcache.h index 8b4419b9d..6cea5fb0f 100644 --- a/app/render/audioplaybackcache.h +++ b/app/render/audioplaybackcache.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/color.cpp b/app/render/color.cpp index 55181d83f..2df47ed70 100644 --- a/app/render/color.cpp +++ b/app/render/color.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/color.h b/app/render/color.h index 490ff69ef..046c88a10 100644 --- a/app/render/color.h +++ b/app/render/color.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/colormanager.cpp b/app/render/colormanager.cpp index 62a9d2e76..db49bee0f 100644 --- a/app/render/colormanager.cpp +++ b/app/render/colormanager.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/colormanager.h b/app/render/colormanager.h index 12b402900..558f9816a 100644 --- a/app/render/colormanager.h +++ b/app/render/colormanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index cc249c977..b9f663eaf 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/colorprocessor.h b/app/render/colorprocessor.h index d5d4abc11..daaf985fe 100644 --- a/app/render/colorprocessor.h +++ b/app/render/colorprocessor.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/colorprocessorcache.h b/app/render/colorprocessorcache.h index 065fc4c06..d9d41152d 100644 --- a/app/render/colorprocessorcache.h +++ b/app/render/colorprocessorcache.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/colortransform.h b/app/render/colortransform.h index e0aa67f83..882e7e5ff 100644 --- a/app/render/colortransform.h +++ b/app/render/colortransform.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/diskmanager.cpp b/app/render/diskmanager.cpp index bd75bf077..c1423d26d 100644 --- a/app/render/diskmanager.cpp +++ b/app/render/diskmanager.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/diskmanager.h b/app/render/diskmanager.h index 9064a0d33..0a3c84819 100644 --- a/app/render/diskmanager.h +++ b/app/render/diskmanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index b902f80eb..e2c5b02b3 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/framehashcache.h b/app/render/framehashcache.h index 17009dabf..276c4f1d3 100644 --- a/app/render/framehashcache.h +++ b/app/render/framehashcache.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/job/CMakeLists.txt b/app/render/job/CMakeLists.txt index d71defccf..1a3d982ca 100644 --- a/app/render/job/CMakeLists.txt +++ b/app/render/job/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/render/job/acceleratedjob.h b/app/render/job/acceleratedjob.h index 71fb1a838..4bdd87d16 100644 --- a/app/render/job/acceleratedjob.h +++ b/app/render/job/acceleratedjob.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/job/generatejob.h b/app/render/job/generatejob.h index e2ab45c72..086459abc 100644 --- a/app/render/job/generatejob.h +++ b/app/render/job/generatejob.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/job/samplejob.h b/app/render/job/samplejob.h index f46e6a3eb..0ce1163ef 100644 --- a/app/render/job/samplejob.h +++ b/app/render/job/samplejob.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/job/shaderjob.h b/app/render/job/shaderjob.h index 72b8c9270..daa1167dd 100644 --- a/app/render/job/shaderjob.h +++ b/app/render/job/shaderjob.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/managedcolor.cpp b/app/render/managedcolor.cpp index 042478cf2..611f15054 100644 --- a/app/render/managedcolor.cpp +++ b/app/render/managedcolor.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/managedcolor.h b/app/render/managedcolor.h index 707218903..d63607cb7 100644 --- a/app/render/managedcolor.h +++ b/app/render/managedcolor.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/ocioconf/CMakeLists.txt b/app/render/ocioconf/CMakeLists.txt index faa7b5e40..f325b2773 100644 --- a/app/render/ocioconf/CMakeLists.txt +++ b/app/render/ocioconf/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/render/opengl/CMakeLists.txt b/app/render/opengl/CMakeLists.txt index 72662cb31..9bed6c499 100644 --- a/app/render/opengl/CMakeLists.txt +++ b/app/render/opengl/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/render/opengl/openglrenderer.cpp b/app/render/opengl/openglrenderer.cpp index a5578a569..bade4e17c 100644 --- a/app/render/opengl/openglrenderer.cpp +++ b/app/render/opengl/openglrenderer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/opengl/openglrenderer.h b/app/render/opengl/openglrenderer.h index d212a111a..6ba883398 100644 --- a/app/render/opengl/openglrenderer.h +++ b/app/render/opengl/openglrenderer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/playbackcache.cpp b/app/render/playbackcache.cpp index d3bc9cb63..07d98eaa8 100644 --- a/app/render/playbackcache.cpp +++ b/app/render/playbackcache.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/playbackcache.h b/app/render/playbackcache.h index 73a4ee385..4d254aacf 100644 --- a/app/render/playbackcache.h +++ b/app/render/playbackcache.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/rendercache.h b/app/render/rendercache.h index 2c9745083..5aab47f59 100644 --- a/app/render/rendercache.h +++ b/app/render/rendercache.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/renderer.cpp b/app/render/renderer.cpp index e3aad5fd4..daab11df9 100644 --- a/app/render/renderer.cpp +++ b/app/render/renderer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/renderer.h b/app/render/renderer.h index 99bcf6374..50f2f9f86 100644 --- a/app/render/renderer.h +++ b/app/render/renderer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/rendererthreadwrapper.cpp b/app/render/rendererthreadwrapper.cpp index 483304575..b394a8349 100644 --- a/app/render/rendererthreadwrapper.cpp +++ b/app/render/rendererthreadwrapper.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/rendererthreadwrapper.h b/app/render/rendererthreadwrapper.h index 1c682161a..202d96e7a 100644 --- a/app/render/rendererthreadwrapper.h +++ b/app/render/rendererthreadwrapper.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index ba84737b0..04fd8156f 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index a1083dc70..0e6f5e37b 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/rendermodes.h b/app/render/rendermodes.h index 373414da8..eace6428e 100644 --- a/app/render/rendermodes.h +++ b/app/render/rendermodes.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 74a6ee56b..227ea1cd2 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index 68627a6c2..3ec743981 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/shadercode.h b/app/render/shadercode.h index 59d5a59de..6a7a86034 100644 --- a/app/render/shadercode.h +++ b/app/render/shadercode.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/shadervalue.h b/app/render/shadervalue.h index dd8412b30..6633aef5d 100644 --- a/app/render/shadervalue.h +++ b/app/render/shadervalue.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/texture.cpp b/app/render/texture.cpp index 66bd9dc77..6ed5db9f7 100644 --- a/app/render/texture.cpp +++ b/app/render/texture.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/texture.h b/app/render/texture.h index b5f34843a..ed1f1e07c 100644 --- a/app/render/texture.h +++ b/app/render/texture.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/videoparams.cpp b/app/render/videoparams.cpp index 0f127014a..7063d9588 100644 --- a/app/render/videoparams.cpp +++ b/app/render/videoparams.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/render/videoparams.h b/app/render/videoparams.h index 7cd4ef7c1..39a4d0833 100644 --- a/app/render/videoparams.h +++ b/app/render/videoparams.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/shaders/CMakeLists.txt b/app/shaders/CMakeLists.txt index a9ad28c12..78845347e 100644 --- a/app/shaders/CMakeLists.txt +++ b/app/shaders/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/CMakeLists.txt b/app/task/CMakeLists.txt index 3498e2910..775e43c86 100644 --- a/app/task/CMakeLists.txt +++ b/app/task/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/conform/CMakeLists.txt b/app/task/conform/CMakeLists.txt index a905c3269..0e8ab6e62 100644 --- a/app/task/conform/CMakeLists.txt +++ b/app/task/conform/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/conform/conform.cpp b/app/task/conform/conform.cpp index 4ddc322f7..f30c4306a 100644 --- a/app/task/conform/conform.cpp +++ b/app/task/conform/conform.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/conform/conform.h b/app/task/conform/conform.h index 99e8b7c5f..1ebb6632f 100644 --- a/app/task/conform/conform.h +++ b/app/task/conform/conform.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/export/CMakeLists.txt b/app/task/export/CMakeLists.txt index 104ca8fdf..ba76ff017 100644 --- a/app/task/export/CMakeLists.txt +++ b/app/task/export/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index 0678daa76..9041d37e3 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/export/export.h b/app/task/export/export.h index 4829f02c3..86e8aa011 100644 --- a/app/task/export/export.h +++ b/app/task/export/export.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/export/exportparams.cpp b/app/task/export/exportparams.cpp index 299c1fca3..80c3e5acd 100644 --- a/app/task/export/exportparams.cpp +++ b/app/task/export/exportparams.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/export/exportparams.h b/app/task/export/exportparams.h index ed6106d67..d76d23d4e 100644 --- a/app/task/export/exportparams.h +++ b/app/task/export/exportparams.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/precache/CMakeLists.txt b/app/task/precache/CMakeLists.txt index 872149bae..d9077fbbc 100644 --- a/app/task/precache/CMakeLists.txt +++ b/app/task/precache/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/precache/precachetask.cpp b/app/task/precache/precachetask.cpp index 5d96f5978..a538ed199 100644 --- a/app/task/precache/precachetask.cpp +++ b/app/task/precache/precachetask.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/precache/precachetask.h b/app/task/precache/precachetask.h index 6708475a7..ffa4e7caa 100644 --- a/app/task/precache/precachetask.h +++ b/app/task/precache/precachetask.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/CMakeLists.txt b/app/task/project/CMakeLists.txt index 9c7d5384b..d287a74a9 100644 --- a/app/task/project/CMakeLists.txt +++ b/app/task/project/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/project/import/CMakeLists.txt b/app/task/project/import/CMakeLists.txt index 4a25a6b03..2cafaf272 100644 --- a/app/task/project/import/CMakeLists.txt +++ b/app/task/project/import/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/project/import/import.cpp b/app/task/project/import/import.cpp index ab30be115..588d2b488 100644 --- a/app/task/project/import/import.cpp +++ b/app/task/project/import/import.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/import/import.h b/app/task/project/import/import.h index de65a3b5d..10aafc99b 100644 --- a/app/task/project/import/import.h +++ b/app/task/project/import/import.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/import/importerrordialog.cpp b/app/task/project/import/importerrordialog.cpp index c6b5e4d8c..6421df455 100644 --- a/app/task/project/import/importerrordialog.cpp +++ b/app/task/project/import/importerrordialog.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/import/importerrordialog.h b/app/task/project/import/importerrordialog.h index 8ee6bf740..d8b1c36ee 100644 --- a/app/task/project/import/importerrordialog.h +++ b/app/task/project/import/importerrordialog.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/load/CMakeLists.txt b/app/task/project/load/CMakeLists.txt index d08807a8c..0d8b16ab7 100644 --- a/app/task/project/load/CMakeLists.txt +++ b/app/task/project/load/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/project/load/load.cpp b/app/task/project/load/load.cpp index ebdc9fb5b..bb733273e 100644 --- a/app/task/project/load/load.cpp +++ b/app/task/project/load/load.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/load/load.h b/app/task/project/load/load.h index 565d3dc73..518f58fad 100644 --- a/app/task/project/load/load.h +++ b/app/task/project/load/load.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/load/loadbasetask.cpp b/app/task/project/load/loadbasetask.cpp index 1e499ca9a..2285f16be 100644 --- a/app/task/project/load/loadbasetask.cpp +++ b/app/task/project/load/loadbasetask.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/load/loadbasetask.h b/app/task/project/load/loadbasetask.h index 7825c2305..933b7588d 100644 --- a/app/task/project/load/loadbasetask.h +++ b/app/task/project/load/loadbasetask.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/loadotio/CMakeLists.txt b/app/task/project/loadotio/CMakeLists.txt index 6243a5bcb..0fcbfd16d 100644 --- a/app/task/project/loadotio/CMakeLists.txt +++ b/app/task/project/loadotio/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/project/loadotio/loadotio.cpp b/app/task/project/loadotio/loadotio.cpp index 8efcc91aa..196b1eee9 100644 --- a/app/task/project/loadotio/loadotio.cpp +++ b/app/task/project/loadotio/loadotio.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/loadotio/loadotio.h b/app/task/project/loadotio/loadotio.h index 5e44bb67d..cddbfabb7 100644 --- a/app/task/project/loadotio/loadotio.h +++ b/app/task/project/loadotio/loadotio.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/save/CMakeLists.txt b/app/task/project/save/CMakeLists.txt index 11cc7273d..930a58bb9 100644 --- a/app/task/project/save/CMakeLists.txt +++ b/app/task/project/save/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/project/save/save.cpp b/app/task/project/save/save.cpp index a196d38f7..65d44b306 100644 --- a/app/task/project/save/save.cpp +++ b/app/task/project/save/save.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/save/save.h b/app/task/project/save/save.h index 6d7f7dc14..c52553b5c 100644 --- a/app/task/project/save/save.h +++ b/app/task/project/save/save.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/saveotio/CMakeLists.txt b/app/task/project/saveotio/CMakeLists.txt index 4610ecd5f..480c621ab 100644 --- a/app/task/project/saveotio/CMakeLists.txt +++ b/app/task/project/saveotio/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/project/saveotio/saveotio.cpp b/app/task/project/saveotio/saveotio.cpp index acc70b71f..7def5a7cb 100644 --- a/app/task/project/saveotio/saveotio.cpp +++ b/app/task/project/saveotio/saveotio.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/project/saveotio/saveotio.h b/app/task/project/saveotio/saveotio.h index 2a380cddc..1a64d11e5 100644 --- a/app/task/project/saveotio/saveotio.h +++ b/app/task/project/saveotio/saveotio.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/render/CMakeLists.txt b/app/task/render/CMakeLists.txt index 71cd61d65..d2a2cf2ff 100644 --- a/app/task/render/CMakeLists.txt +++ b/app/task/render/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/task/render/render.cpp b/app/task/render/render.cpp index 65821d777..ab95bb323 100644 --- a/app/task/render/render.cpp +++ b/app/task/render/render.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/render/render.h b/app/task/render/render.h index 428e4e243..6a0f3214b 100644 --- a/app/task/render/render.h +++ b/app/task/render/render.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/task.h b/app/task/task.h index fc4118fc5..d7dce0535 100644 --- a/app/task/task.h +++ b/app/task/task.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/taskmanager.cpp b/app/task/taskmanager.cpp index ffcb82a0d..074641b01 100644 --- a/app/task/taskmanager.cpp +++ b/app/task/taskmanager.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/task/taskmanager.h b/app/task/taskmanager.h index f0cdc3501..45e11aa21 100644 --- a/app/task/taskmanager.h +++ b/app/task/taskmanager.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/threading/CMakeLists.txt b/app/threading/CMakeLists.txt index b7169048c..98627f258 100644 --- a/app/threading/CMakeLists.txt +++ b/app/threading/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/threading/threadpool.cpp b/app/threading/threadpool.cpp index 9e7f26206..05b57eb8d 100644 --- a/app/threading/threadpool.cpp +++ b/app/threading/threadpool.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/threading/threadpool.h b/app/threading/threadpool.h index 4c9f8d3af..377ae6d5b 100644 --- a/app/threading/threadpool.h +++ b/app/threading/threadpool.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/threading/threadticket.cpp b/app/threading/threadticket.cpp index e87b1c57e..30ca9bc53 100644 --- a/app/threading/threadticket.cpp +++ b/app/threading/threadticket.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/threading/threadticket.h b/app/threading/threadticket.h index 7bb644640..dca13f78d 100644 --- a/app/threading/threadticket.h +++ b/app/threading/threadticket.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/threading/threadticketwatcher.cpp b/app/threading/threadticketwatcher.cpp index 247e9b69a..a8b93ae4b 100644 --- a/app/threading/threadticketwatcher.cpp +++ b/app/threading/threadticketwatcher.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/threading/threadticketwatcher.h b/app/threading/threadticketwatcher.h index 7684f64b6..9a6ebd351 100644 --- a/app/threading/threadticketwatcher.h +++ b/app/threading/threadticketwatcher.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/CMakeLists.txt b/app/timeline/CMakeLists.txt index 58249246c..07015f985 100644 --- a/app/timeline/CMakeLists.txt +++ b/app/timeline/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/timeline/timelinecommon.h b/app/timeline/timelinecommon.h index 8bd042de0..d4dbc124f 100644 --- a/app/timeline/timelinecommon.h +++ b/app/timeline/timelinecommon.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/timelinecoordinate.cpp b/app/timeline/timelinecoordinate.cpp index aaef2415e..031b827da 100644 --- a/app/timeline/timelinecoordinate.cpp +++ b/app/timeline/timelinecoordinate.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/timelinecoordinate.h b/app/timeline/timelinecoordinate.h index ee37f3f30..26dc7e671 100644 --- a/app/timeline/timelinecoordinate.h +++ b/app/timeline/timelinecoordinate.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/timelinemarker.cpp b/app/timeline/timelinemarker.cpp index 3aa43c929..4f3e83573 100644 --- a/app/timeline/timelinemarker.cpp +++ b/app/timeline/timelinemarker.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/timelinemarker.h b/app/timeline/timelinemarker.h index 16a79abec..de99b2539 100644 --- a/app/timeline/timelinemarker.h +++ b/app/timeline/timelinemarker.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/timelinepoints.cpp b/app/timeline/timelinepoints.cpp index ba8c6e4e8..2c11f6f94 100644 --- a/app/timeline/timelinepoints.cpp +++ b/app/timeline/timelinepoints.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/timelinepoints.h b/app/timeline/timelinepoints.h index 698adb156..888aee94d 100644 --- a/app/timeline/timelinepoints.h +++ b/app/timeline/timelinepoints.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/timelineworkarea.cpp b/app/timeline/timelineworkarea.cpp index 3206d4be3..75320c5cd 100644 --- a/app/timeline/timelineworkarea.cpp +++ b/app/timeline/timelineworkarea.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/timelineworkarea.h b/app/timeline/timelineworkarea.h index 602d88b43..ce0bc0e05 100644 --- a/app/timeline/timelineworkarea.h +++ b/app/timeline/timelineworkarea.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/trackreference.cpp b/app/timeline/trackreference.cpp index 7080ea186..b77841fe1 100644 --- a/app/timeline/trackreference.cpp +++ b/app/timeline/trackreference.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/timeline/trackreference.h b/app/timeline/trackreference.h index 7ae13d444..ffeedab54 100644 --- a/app/timeline/trackreference.h +++ b/app/timeline/trackreference.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/tool/CMakeLists.txt b/app/tool/CMakeLists.txt index 47d10b945..e54b7c3e6 100644 --- a/app/tool/CMakeLists.txt +++ b/app/tool/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/tool/tool.h b/app/tool/tool.h index c67c9ba84..0285d4073 100644 --- a/app/tool/tool.h +++ b/app/tool/tool.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/ts/CMakeLists.txt b/app/ts/CMakeLists.txt index ba9b71d9c..58fee900e 100644 --- a/app/ts/CMakeLists.txt +++ b/app/ts/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/ui/CMakeLists.txt b/app/ui/CMakeLists.txt index 55ba82947..793f616e7 100644 --- a/app/ui/CMakeLists.txt +++ b/app/ui/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/ui/cursors/CMakeLists.txt b/app/ui/cursors/CMakeLists.txt index 2f77372f9..5ef1fd183 100644 --- a/app/ui/cursors/CMakeLists.txt +++ b/app/ui/cursors/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/ui/graphics/CMakeLists.txt b/app/ui/graphics/CMakeLists.txt index c1cde3598..6a4c39a84 100644 --- a/app/ui/graphics/CMakeLists.txt +++ b/app/ui/graphics/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/ui/icons/CMakeLists.txt b/app/ui/icons/CMakeLists.txt index 83cb55606..ab5b9c0bd 100644 --- a/app/ui/icons/CMakeLists.txt +++ b/app/ui/icons/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/ui/icons/icons.cpp b/app/ui/icons/icons.cpp index a7e655373..5cd7ee9d0 100644 --- a/app/ui/icons/icons.cpp +++ b/app/ui/icons/icons.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/ui/icons/icons.h b/app/ui/icons/icons.h index 51bffe5eb..a11df8778 100644 --- a/app/ui/icons/icons.h +++ b/app/ui/icons/icons.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/ui/style/CMakeLists.txt b/app/ui/style/CMakeLists.txt index 179a50687..2b6f18ee3 100644 --- a/app/ui/style/CMakeLists.txt +++ b/app/ui/style/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/ui/style/generate-style.sh b/app/ui/style/generate-style.sh index 327ae81c5..878c7504f 100755 --- a/app/ui/style/generate-style.sh +++ b/app/ui/style/generate-style.sh @@ -1,7 +1,7 @@ #!/bin/sh # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/ui/style/olive-dark/style.css b/app/ui/style/olive-dark/style.css index 96be8d2ef..34e26d7f5 100644 --- a/app/ui/style/olive-dark/style.css +++ b/app/ui/style/olive-dark/style.css @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/ui/style/olive-light/style.css b/app/ui/style/olive-light/style.css index bab366ba1..ff3a1135b 100644 --- a/app/ui/style/olive-light/style.css +++ b/app/ui/style/olive-light/style.css @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/ui/style/olive-light/svg/convert-to-dark.sh b/app/ui/style/olive-light/svg/convert-to-dark.sh index 4babf86b7..16aa5a1df 100755 --- a/app/ui/style/olive-light/svg/convert-to-dark.sh +++ b/app/ui/style/olive-light/svg/convert-to-dark.sh @@ -1,7 +1,7 @@ #!/bin/sh # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/ui/style/style.cpp b/app/ui/style/style.cpp index 26ee7d86f..7b5b43fea 100644 --- a/app/ui/style/style.cpp +++ b/app/ui/style/style.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/ui/style/style.h b/app/ui/style/style.h index dbf385db0..edb07de79 100644 --- a/app/ui/style/style.h +++ b/app/ui/style/style.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/undo/CMakeLists.txt b/app/undo/CMakeLists.txt index da2588690..aeedc4336 100644 --- a/app/undo/CMakeLists.txt +++ b/app/undo/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/undo/undocommand.cpp b/app/undo/undocommand.cpp index 38c81a851..ad880b9ca 100644 --- a/app/undo/undocommand.cpp +++ b/app/undo/undocommand.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/undo/undocommand.h b/app/undo/undocommand.h index 2da3b0c4f..3257d7ed9 100644 --- a/app/undo/undocommand.h +++ b/app/undo/undocommand.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/undo/undostack.cpp b/app/undo/undostack.cpp index eec3097d7..9a8ae4c53 100644 --- a/app/undo/undostack.cpp +++ b/app/undo/undostack.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/undo/undostack.h b/app/undo/undostack.h index 980a6875c..486cac0d8 100644 --- a/app/undo/undostack.h +++ b/app/undo/undostack.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/CMakeLists.txt b/app/widget/CMakeLists.txt index 17b954970..32c4c88cd 100644 --- a/app/widget/CMakeLists.txt +++ b/app/widget/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/audiomonitor/CMakeLists.txt b/app/widget/audiomonitor/CMakeLists.txt index 6bc5833fb..4e2e98efa 100644 --- a/app/widget/audiomonitor/CMakeLists.txt +++ b/app/widget/audiomonitor/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/audiomonitor/audiomonitor.cpp b/app/widget/audiomonitor/audiomonitor.cpp index 6eb972dba..e41354d3c 100644 --- a/app/widget/audiomonitor/audiomonitor.cpp +++ b/app/widget/audiomonitor/audiomonitor.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/audiomonitor/audiomonitor.h b/app/widget/audiomonitor/audiomonitor.h index 9a0331301..2fd782179 100644 --- a/app/widget/audiomonitor/audiomonitor.h +++ b/app/widget/audiomonitor/audiomonitor.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/clickablelabel/CMakeLists.txt b/app/widget/clickablelabel/CMakeLists.txt index 95a0c9d19..733f11d8c 100644 --- a/app/widget/clickablelabel/CMakeLists.txt +++ b/app/widget/clickablelabel/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/clickablelabel/clickablelabel.cpp b/app/widget/clickablelabel/clickablelabel.cpp index a267a1019..3b5c6bdff 100644 --- a/app/widget/clickablelabel/clickablelabel.cpp +++ b/app/widget/clickablelabel/clickablelabel.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/clickablelabel/clickablelabel.h b/app/widget/clickablelabel/clickablelabel.h index 32d5a55db..5e13ff605 100644 --- a/app/widget/clickablelabel/clickablelabel.h +++ b/app/widget/clickablelabel/clickablelabel.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/collapsebutton/CMakeLists.txt b/app/widget/collapsebutton/CMakeLists.txt index fd4f051ad..9a38da33f 100644 --- a/app/widget/collapsebutton/CMakeLists.txt +++ b/app/widget/collapsebutton/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/collapsebutton/collapsebutton.cpp b/app/widget/collapsebutton/collapsebutton.cpp index 2740d63b5..9d09738b6 100644 --- a/app/widget/collapsebutton/collapsebutton.cpp +++ b/app/widget/collapsebutton/collapsebutton.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/collapsebutton/collapsebutton.h b/app/widget/collapsebutton/collapsebutton.h index 5699b218c..7b57505f2 100644 --- a/app/widget/collapsebutton/collapsebutton.h +++ b/app/widget/collapsebutton/collapsebutton.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorbutton/CMakeLists.txt b/app/widget/colorbutton/CMakeLists.txt index b7a5da383..e785da29c 100644 --- a/app/widget/colorbutton/CMakeLists.txt +++ b/app/widget/colorbutton/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorbutton/colorbutton.cpp b/app/widget/colorbutton/colorbutton.cpp index be5dc2b69..23b2f11f4 100644 --- a/app/widget/colorbutton/colorbutton.cpp +++ b/app/widget/colorbutton/colorbutton.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorbutton/colorbutton.h b/app/widget/colorbutton/colorbutton.h index fea1ce6ca..4b3dcef3f 100644 --- a/app/widget/colorbutton/colorbutton.h +++ b/app/widget/colorbutton/colorbutton.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/CMakeLists.txt b/app/widget/colorwheel/CMakeLists.txt index 508c7ce59..d78879230 100644 --- a/app/widget/colorwheel/CMakeLists.txt +++ b/app/widget/colorwheel/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorgradientwidget.cpp b/app/widget/colorwheel/colorgradientwidget.cpp index e7b0579d9..686b924d5 100644 --- a/app/widget/colorwheel/colorgradientwidget.cpp +++ b/app/widget/colorwheel/colorgradientwidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorgradientwidget.h b/app/widget/colorwheel/colorgradientwidget.h index 26f162912..d59fe95be 100644 --- a/app/widget/colorwheel/colorgradientwidget.h +++ b/app/widget/colorwheel/colorgradientwidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorpreviewbox.cpp b/app/widget/colorwheel/colorpreviewbox.cpp index d15cfaf06..1ff67e206 100644 --- a/app/widget/colorwheel/colorpreviewbox.cpp +++ b/app/widget/colorwheel/colorpreviewbox.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorpreviewbox.h b/app/widget/colorwheel/colorpreviewbox.h index b7078e129..e8fe9266b 100644 --- a/app/widget/colorwheel/colorpreviewbox.h +++ b/app/widget/colorwheel/colorpreviewbox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorspacechooser.cpp b/app/widget/colorwheel/colorspacechooser.cpp index 6a0372566..39a668d5a 100644 --- a/app/widget/colorwheel/colorspacechooser.cpp +++ b/app/widget/colorwheel/colorspacechooser.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorspacechooser.h b/app/widget/colorwheel/colorspacechooser.h index eba0db6ce..ae3bcb4ce 100644 --- a/app/widget/colorwheel/colorspacechooser.h +++ b/app/widget/colorwheel/colorspacechooser.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorswatchwidget.cpp b/app/widget/colorwheel/colorswatchwidget.cpp index be6722a83..163b493fb 100644 --- a/app/widget/colorwheel/colorswatchwidget.cpp +++ b/app/widget/colorwheel/colorswatchwidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorswatchwidget.h b/app/widget/colorwheel/colorswatchwidget.h index dc0a43f20..9d20895a0 100644 --- a/app/widget/colorwheel/colorswatchwidget.h +++ b/app/widget/colorwheel/colorswatchwidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorvalueswidget.cpp b/app/widget/colorwheel/colorvalueswidget.cpp index 43b328949..62703b5e6 100644 --- a/app/widget/colorwheel/colorvalueswidget.cpp +++ b/app/widget/colorwheel/colorvalueswidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorvalueswidget.h b/app/widget/colorwheel/colorvalueswidget.h index 698900a17..3af8d9e95 100644 --- a/app/widget/colorwheel/colorvalueswidget.h +++ b/app/widget/colorwheel/colorvalueswidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorwheelwidget.cpp b/app/widget/colorwheel/colorwheelwidget.cpp index f5e5e2a32..6d9ce2fc5 100644 --- a/app/widget/colorwheel/colorwheelwidget.cpp +++ b/app/widget/colorwheel/colorwheelwidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/colorwheel/colorwheelwidget.h b/app/widget/colorwheel/colorwheelwidget.h index 78ddb26c6..15c6d1a61 100644 --- a/app/widget/colorwheel/colorwheelwidget.h +++ b/app/widget/colorwheel/colorwheelwidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/columnedgridlayout/CMakeLists.txt b/app/widget/columnedgridlayout/CMakeLists.txt index c23d2b8d9..ff49ef731 100644 --- a/app/widget/columnedgridlayout/CMakeLists.txt +++ b/app/widget/columnedgridlayout/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/columnedgridlayout/columnedgridlayout.cpp b/app/widget/columnedgridlayout/columnedgridlayout.cpp index 72faf93e7..aff4e5a37 100644 --- a/app/widget/columnedgridlayout/columnedgridlayout.cpp +++ b/app/widget/columnedgridlayout/columnedgridlayout.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/columnedgridlayout/columnedgridlayout.h b/app/widget/columnedgridlayout/columnedgridlayout.h index 32edb0796..e6afb6444 100644 --- a/app/widget/columnedgridlayout/columnedgridlayout.h +++ b/app/widget/columnedgridlayout/columnedgridlayout.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/curvewidget/CMakeLists.txt b/app/widget/curvewidget/CMakeLists.txt index 52cf1cdf6..b6a6a0518 100644 --- a/app/widget/curvewidget/CMakeLists.txt +++ b/app/widget/curvewidget/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/curvewidget/beziercontrolpointitem.cpp b/app/widget/curvewidget/beziercontrolpointitem.cpp index 5425f2818..f40496252 100644 --- a/app/widget/curvewidget/beziercontrolpointitem.cpp +++ b/app/widget/curvewidget/beziercontrolpointitem.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/curvewidget/beziercontrolpointitem.h b/app/widget/curvewidget/beziercontrolpointitem.h index 81ed7302c..720f7fe06 100644 --- a/app/widget/curvewidget/beziercontrolpointitem.h +++ b/app/widget/curvewidget/beziercontrolpointitem.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/curvewidget/curveview.cpp b/app/widget/curvewidget/curveview.cpp index c13ff8b01..cdc749c45 100644 --- a/app/widget/curvewidget/curveview.cpp +++ b/app/widget/curvewidget/curveview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/curvewidget/curveview.h b/app/widget/curvewidget/curveview.h index 762a015c5..4ac8d740c 100644 --- a/app/widget/curvewidget/curveview.h +++ b/app/widget/curvewidget/curveview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/curvewidget/curvewidget.cpp b/app/widget/curvewidget/curvewidget.cpp index 7a80a8dfc..05138b7e0 100644 --- a/app/widget/curvewidget/curvewidget.cpp +++ b/app/widget/curvewidget/curvewidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/curvewidget/curvewidget.h b/app/widget/curvewidget/curvewidget.h index 530da8ac2..a65f8c805 100644 --- a/app/widget/curvewidget/curvewidget.h +++ b/app/widget/curvewidget/curvewidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/flowlayout/CMakeLists.txt b/app/widget/flowlayout/CMakeLists.txt index fa325df82..c1a99ae30 100644 --- a/app/widget/flowlayout/CMakeLists.txt +++ b/app/widget/flowlayout/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/focusablelineedit/CMakeLists.txt b/app/widget/focusablelineedit/CMakeLists.txt index 7ca836d05..61ec8ac20 100644 --- a/app/widget/focusablelineedit/CMakeLists.txt +++ b/app/widget/focusablelineedit/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/focusablelineedit/focusablelineedit.cpp b/app/widget/focusablelineedit/focusablelineedit.cpp index 6c83e2fe0..cb1f0059b 100644 --- a/app/widget/focusablelineedit/focusablelineedit.cpp +++ b/app/widget/focusablelineedit/focusablelineedit.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/focusablelineedit/focusablelineedit.h b/app/widget/focusablelineedit/focusablelineedit.h index 07bf57441..6dfd21214 100644 --- a/app/widget/focusablelineedit/focusablelineedit.h +++ b/app/widget/focusablelineedit/focusablelineedit.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/footagecombobox/CMakeLists.txt b/app/widget/footagecombobox/CMakeLists.txt index e9aab3fcb..2d83039ff 100644 --- a/app/widget/footagecombobox/CMakeLists.txt +++ b/app/widget/footagecombobox/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/footagecombobox/footagecombobox.cpp b/app/widget/footagecombobox/footagecombobox.cpp index 455dd0230..7a9ddf42e 100644 --- a/app/widget/footagecombobox/footagecombobox.cpp +++ b/app/widget/footagecombobox/footagecombobox.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/footagecombobox/footagecombobox.h b/app/widget/footagecombobox/footagecombobox.h index e59952069..01eab6653 100644 --- a/app/widget/footagecombobox/footagecombobox.h +++ b/app/widget/footagecombobox/footagecombobox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/keyframeview/CMakeLists.txt b/app/widget/keyframeview/CMakeLists.txt index 713f9bb20..77ab1c808 100644 --- a/app/widget/keyframeview/CMakeLists.txt +++ b/app/widget/keyframeview/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/keyframeview/keyframeview.cpp b/app/widget/keyframeview/keyframeview.cpp index 2d6b880e9..99782b24f 100644 --- a/app/widget/keyframeview/keyframeview.cpp +++ b/app/widget/keyframeview/keyframeview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/keyframeview/keyframeview.h b/app/widget/keyframeview/keyframeview.h index 90361c8e5..b21c1e5a0 100644 --- a/app/widget/keyframeview/keyframeview.h +++ b/app/widget/keyframeview/keyframeview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index 80c27fd91..dde824e56 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/keyframeview/keyframeviewbase.h b/app/widget/keyframeview/keyframeviewbase.h index f25a66937..ecb7df990 100644 --- a/app/widget/keyframeview/keyframeviewbase.h +++ b/app/widget/keyframeview/keyframeviewbase.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/keyframeview/keyframeviewitem.cpp b/app/widget/keyframeview/keyframeviewitem.cpp index 2acc246df..8acde3ee7 100644 --- a/app/widget/keyframeview/keyframeviewitem.cpp +++ b/app/widget/keyframeview/keyframeviewitem.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/keyframeview/keyframeviewitem.h b/app/widget/keyframeview/keyframeviewitem.h index ee5c06031..d0e974920 100644 --- a/app/widget/keyframeview/keyframeviewitem.h +++ b/app/widget/keyframeview/keyframeviewitem.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/keyframeview/keyframeviewundo.cpp b/app/widget/keyframeview/keyframeviewundo.cpp index 2ad37e0de..1a0d16690 100644 --- a/app/widget/keyframeview/keyframeviewundo.cpp +++ b/app/widget/keyframeview/keyframeviewundo.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/keyframeview/keyframeviewundo.h b/app/widget/keyframeview/keyframeviewundo.h index 6c7610866..89e0799ac 100644 --- a/app/widget/keyframeview/keyframeviewundo.h +++ b/app/widget/keyframeview/keyframeviewundo.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/manageddisplay/CMakeLists.txt b/app/widget/manageddisplay/CMakeLists.txt index 0f9204b08..cf5ee7887 100644 --- a/app/widget/manageddisplay/CMakeLists.txt +++ b/app/widget/manageddisplay/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index ce1528f7b..e69731846 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index dc10913dd..100dff95f 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/menu/CMakeLists.txt b/app/widget/menu/CMakeLists.txt index 60470a2b5..c1281270b 100644 --- a/app/widget/menu/CMakeLists.txt +++ b/app/widget/menu/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/menu/menu.cpp b/app/widget/menu/menu.cpp index 9de1136f5..c58d806ef 100644 --- a/app/widget/menu/menu.cpp +++ b/app/widget/menu/menu.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/menu/menu.h b/app/widget/menu/menu.h index 142753402..af9e6d119 100644 --- a/app/widget/menu/menu.h +++ b/app/widget/menu/menu.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/menu/menushared.cpp b/app/widget/menu/menushared.cpp index a63e22fb3..b6c201924 100644 --- a/app/widget/menu/menushared.cpp +++ b/app/widget/menu/menushared.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/menu/menushared.h b/app/widget/menu/menushared.h index 414be8985..69d26ba93 100644 --- a/app/widget/menu/menushared.h +++ b/app/widget/menu/menushared.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodecombobox/CMakeLists.txt b/app/widget/nodecombobox/CMakeLists.txt index 56a597688..c8d0dd535 100644 --- a/app/widget/nodecombobox/CMakeLists.txt +++ b/app/widget/nodecombobox/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodecombobox/nodecombobox.cpp b/app/widget/nodecombobox/nodecombobox.cpp index 89e1dfeda..d2a16f011 100644 --- a/app/widget/nodecombobox/nodecombobox.cpp +++ b/app/widget/nodecombobox/nodecombobox.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodecombobox/nodecombobox.h b/app/widget/nodecombobox/nodecombobox.h index cadad971c..06f16df90 100644 --- a/app/widget/nodecombobox/nodecombobox.h +++ b/app/widget/nodecombobox/nodecombobox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodecopypaste/CMakeLists.txt b/app/widget/nodecopypaste/CMakeLists.txt index 5d21f27d8..808abbac5 100644 --- a/app/widget/nodecopypaste/CMakeLists.txt +++ b/app/widget/nodecopypaste/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodecopypaste/nodecopypaste.cpp b/app/widget/nodecopypaste/nodecopypaste.cpp index a35db606f..d25b0b151 100644 --- a/app/widget/nodecopypaste/nodecopypaste.cpp +++ b/app/widget/nodecopypaste/nodecopypaste.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodecopypaste/nodecopypaste.h b/app/widget/nodecopypaste/nodecopypaste.h index 0691692ef..a960c9d25 100644 --- a/app/widget/nodecopypaste/nodecopypaste.h +++ b/app/widget/nodecopypaste/nodecopypaste.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/CMakeLists.txt b/app/widget/nodeparamview/CMakeLists.txt index 9bac86e5a..bf423e224 100644 --- a/app/widget/nodeparamview/CMakeLists.txt +++ b/app/widget/nodeparamview/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index 5cdc32452..7b0bd36de 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index a8e43b0bb..c8f0352a4 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewarraywidget.cpp b/app/widget/nodeparamview/nodeparamviewarraywidget.cpp index 3e6df5614..dc8cf1714 100644 --- a/app/widget/nodeparamview/nodeparamviewarraywidget.cpp +++ b/app/widget/nodeparamview/nodeparamviewarraywidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewarraywidget.h b/app/widget/nodeparamview/nodeparamviewarraywidget.h index e99455140..83f9bad67 100644 --- a/app/widget/nodeparamview/nodeparamviewarraywidget.h +++ b/app/widget/nodeparamview/nodeparamviewarraywidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp b/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp index 85f88d274..bdcfcdb4e 100644 --- a/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp +++ b/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewconnectedlabel.h b/app/widget/nodeparamview/nodeparamviewconnectedlabel.h index 04103cae1..7e5b99580 100644 --- a/app/widget/nodeparamview/nodeparamviewconnectedlabel.h +++ b/app/widget/nodeparamview/nodeparamviewconnectedlabel.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewitem.cpp b/app/widget/nodeparamview/nodeparamviewitem.cpp index 0f5a88e67..7b0e558d8 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.cpp +++ b/app/widget/nodeparamview/nodeparamviewitem.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewitem.h b/app/widget/nodeparamview/nodeparamviewitem.h index 4731ef782..9bc1fef6c 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.h +++ b/app/widget/nodeparamview/nodeparamviewitem.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp b/app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp index 6c9e1306f..a41b0ff2e 100644 --- a/app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp +++ b/app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewkeyframecontrol.h b/app/widget/nodeparamview/nodeparamviewkeyframecontrol.h index 002b00fc5..c27276236 100644 --- a/app/widget/nodeparamview/nodeparamviewkeyframecontrol.h +++ b/app/widget/nodeparamview/nodeparamviewkeyframecontrol.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewrichtext.cpp b/app/widget/nodeparamview/nodeparamviewrichtext.cpp index 9f30be45d..4ff1a9da2 100644 --- a/app/widget/nodeparamview/nodeparamviewrichtext.cpp +++ b/app/widget/nodeparamview/nodeparamviewrichtext.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewrichtext.h b/app/widget/nodeparamview/nodeparamviewrichtext.h index 9f09576f3..90555111e 100644 --- a/app/widget/nodeparamview/nodeparamviewrichtext.h +++ b/app/widget/nodeparamview/nodeparamviewrichtext.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewundo.cpp b/app/widget/nodeparamview/nodeparamviewundo.cpp index ad55dd256..397ffb85f 100644 --- a/app/widget/nodeparamview/nodeparamviewundo.cpp +++ b/app/widget/nodeparamview/nodeparamviewundo.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewundo.h b/app/widget/nodeparamview/nodeparamviewundo.h index 2ce5b5150..da531bc4d 100644 --- a/app/widget/nodeparamview/nodeparamviewundo.h +++ b/app/widget/nodeparamview/nodeparamviewundo.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp index 456323238..b4a1c6492 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.h b/app/widget/nodeparamview/nodeparamviewwidgetbridge.h index 245a03171..71ea4969d 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.h +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodetableview/CMakeLists.txt b/app/widget/nodetableview/CMakeLists.txt index f12dff040..cb717d998 100644 --- a/app/widget/nodetableview/CMakeLists.txt +++ b/app/widget/nodetableview/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodetableview/nodetabletraverser.cpp b/app/widget/nodetableview/nodetabletraverser.cpp index 69df8e142..59864c9df 100644 --- a/app/widget/nodetableview/nodetabletraverser.cpp +++ b/app/widget/nodetableview/nodetabletraverser.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodetableview/nodetabletraverser.h b/app/widget/nodetableview/nodetabletraverser.h index 20dae8e2e..5eaa8b415 100644 --- a/app/widget/nodetableview/nodetabletraverser.h +++ b/app/widget/nodetableview/nodetabletraverser.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodetableview/nodetableview.cpp b/app/widget/nodetableview/nodetableview.cpp index 80f6b8fd4..972032f55 100644 --- a/app/widget/nodetableview/nodetableview.cpp +++ b/app/widget/nodetableview/nodetableview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodetableview/nodetableview.h b/app/widget/nodetableview/nodetableview.h index c049e5bb6..f2bbf6ca4 100644 --- a/app/widget/nodetableview/nodetableview.h +++ b/app/widget/nodetableview/nodetableview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodetableview/nodetablewidget.cpp b/app/widget/nodetableview/nodetablewidget.cpp index f06678d33..890899ff8 100644 --- a/app/widget/nodetableview/nodetablewidget.cpp +++ b/app/widget/nodetableview/nodetablewidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodetableview/nodetablewidget.h b/app/widget/nodetableview/nodetablewidget.h index 2b499b629..ebe892f64 100644 --- a/app/widget/nodetableview/nodetablewidget.h +++ b/app/widget/nodetableview/nodetablewidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodetreeview/CMakeLists.txt b/app/widget/nodetreeview/CMakeLists.txt index 486f03d0a..4c29e480e 100644 --- a/app/widget/nodetreeview/CMakeLists.txt +++ b/app/widget/nodetreeview/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/CMakeLists.txt b/app/widget/nodeview/CMakeLists.txt index c36c19882..00aca1075 100644 --- a/app/widget/nodeview/CMakeLists.txt +++ b/app/widget/nodeview/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index bfc2472aa..c3a79f83c 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeview.h b/app/widget/nodeview/nodeview.h index d05c8f899..afd6fe297 100644 --- a/app/widget/nodeview/nodeview.h +++ b/app/widget/nodeview/nodeview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewcommon.h b/app/widget/nodeview/nodeviewcommon.h index cc2b870fe..be731eee0 100644 --- a/app/widget/nodeview/nodeviewcommon.h +++ b/app/widget/nodeview/nodeviewcommon.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewedge.cpp b/app/widget/nodeview/nodeviewedge.cpp index e07470fdc..e783e3584 100644 --- a/app/widget/nodeview/nodeviewedge.cpp +++ b/app/widget/nodeview/nodeviewedge.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewedge.h b/app/widget/nodeview/nodeviewedge.h index be1f6a666..c29ea8fc4 100644 --- a/app/widget/nodeview/nodeviewedge.h +++ b/app/widget/nodeview/nodeviewedge.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewitem.cpp b/app/widget/nodeview/nodeviewitem.cpp index 637228b28..c1f030899 100644 --- a/app/widget/nodeview/nodeviewitem.cpp +++ b/app/widget/nodeview/nodeviewitem.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewitem.h b/app/widget/nodeview/nodeviewitem.h index 75d32ffd0..e33968785 100644 --- a/app/widget/nodeview/nodeviewitem.h +++ b/app/widget/nodeview/nodeviewitem.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewitemwidgetproxy.cpp b/app/widget/nodeview/nodeviewitemwidgetproxy.cpp index 040e755ce..b219e8b67 100644 --- a/app/widget/nodeview/nodeviewitemwidgetproxy.cpp +++ b/app/widget/nodeview/nodeviewitemwidgetproxy.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewitemwidgetproxy.h b/app/widget/nodeview/nodeviewitemwidgetproxy.h index bfd087384..91d0312f3 100644 --- a/app/widget/nodeview/nodeviewitemwidgetproxy.h +++ b/app/widget/nodeview/nodeviewitemwidgetproxy.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index 1ae231b5d..45c1b6934 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewscene.h b/app/widget/nodeview/nodeviewscene.h index 87128bb3b..b5ffa7e93 100644 --- a/app/widget/nodeview/nodeviewscene.h +++ b/app/widget/nodeview/nodeviewscene.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewundo.cpp b/app/widget/nodeview/nodeviewundo.cpp index 7e5d35170..1f2bd8c7e 100644 --- a/app/widget/nodeview/nodeviewundo.cpp +++ b/app/widget/nodeview/nodeviewundo.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/nodeview/nodeviewundo.h b/app/widget/nodeview/nodeviewundo.h index 9fc95d717..c59cba83e 100644 --- a/app/widget/nodeview/nodeviewundo.h +++ b/app/widget/nodeview/nodeviewundo.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/panel/CMakeLists.txt b/app/widget/panel/CMakeLists.txt index db88a9b47..e17aff130 100644 --- a/app/widget/panel/CMakeLists.txt +++ b/app/widget/panel/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/panel/panel.cpp b/app/widget/panel/panel.cpp index d94b54448..f9ac502d5 100644 --- a/app/widget/panel/panel.cpp +++ b/app/widget/panel/panel.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/panel/panel.h b/app/widget/panel/panel.h index ae98c464a..fba6a60cc 100644 --- a/app/widget/panel/panel.h +++ b/app/widget/panel/panel.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/path/CMakeLists.txt b/app/widget/path/CMakeLists.txt index a7bd17910..3c4598340 100644 --- a/app/widget/path/CMakeLists.txt +++ b/app/widget/path/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/path/pathwidget.cpp b/app/widget/path/pathwidget.cpp index b646e2d40..255ecb7ad 100644 --- a/app/widget/path/pathwidget.cpp +++ b/app/widget/path/pathwidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/path/pathwidget.h b/app/widget/path/pathwidget.h index c35eae30e..f6273e96b 100644 --- a/app/widget/path/pathwidget.h +++ b/app/widget/path/pathwidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/pixelsampler/CMakeLists.txt b/app/widget/pixelsampler/CMakeLists.txt index ecf7831f7..da53c06f6 100644 --- a/app/widget/pixelsampler/CMakeLists.txt +++ b/app/widget/pixelsampler/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/pixelsampler/pixelsampler.cpp b/app/widget/pixelsampler/pixelsampler.cpp index 22cde93f5..c110283a4 100644 --- a/app/widget/pixelsampler/pixelsampler.cpp +++ b/app/widget/pixelsampler/pixelsampler.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/pixelsampler/pixelsampler.h b/app/widget/pixelsampler/pixelsampler.h index 414826962..19109105d 100644 --- a/app/widget/pixelsampler/pixelsampler.h +++ b/app/widget/pixelsampler/pixelsampler.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/playbackcontrols/CMakeLists.txt b/app/widget/playbackcontrols/CMakeLists.txt index 68f3a0799..fdf35e08a 100644 --- a/app/widget/playbackcontrols/CMakeLists.txt +++ b/app/widget/playbackcontrols/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/playbackcontrols/dragbutton.cpp b/app/widget/playbackcontrols/dragbutton.cpp index ce3539ff6..345ed3f27 100644 --- a/app/widget/playbackcontrols/dragbutton.cpp +++ b/app/widget/playbackcontrols/dragbutton.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/playbackcontrols/dragbutton.h b/app/widget/playbackcontrols/dragbutton.h index 6c2eafde9..8e6d9ac19 100644 --- a/app/widget/playbackcontrols/dragbutton.h +++ b/app/widget/playbackcontrols/dragbutton.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/playbackcontrols/playbackcontrols.cpp b/app/widget/playbackcontrols/playbackcontrols.cpp index 3acb51bdc..7ae497a98 100644 --- a/app/widget/playbackcontrols/playbackcontrols.cpp +++ b/app/widget/playbackcontrols/playbackcontrols.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/playbackcontrols/playbackcontrols.h b/app/widget/playbackcontrols/playbackcontrols.h index 6940b4102..c61b08eba 100644 --- a/app/widget/playbackcontrols/playbackcontrols.h +++ b/app/widget/playbackcontrols/playbackcontrols.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/CMakeLists.txt b/app/widget/projectexplorer/CMakeLists.txt index cc8d45b76..86d399e66 100644 --- a/app/widget/projectexplorer/CMakeLists.txt +++ b/app/widget/projectexplorer/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorer.cpp b/app/widget/projectexplorer/projectexplorer.cpp index e0bdf6ab7..6a261895c 100644 --- a/app/widget/projectexplorer/projectexplorer.cpp +++ b/app/widget/projectexplorer/projectexplorer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorer.h b/app/widget/projectexplorer/projectexplorer.h index 90dd10841..93cbb8814 100644 --- a/app/widget/projectexplorer/projectexplorer.h +++ b/app/widget/projectexplorer/projectexplorer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorericonview.cpp b/app/widget/projectexplorer/projectexplorericonview.cpp index 0284dd5f5..ece2a47d5 100644 --- a/app/widget/projectexplorer/projectexplorericonview.cpp +++ b/app/widget/projectexplorer/projectexplorericonview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorericonview.h b/app/widget/projectexplorer/projectexplorericonview.h index c0b11cfd2..9cb67a113 100644 --- a/app/widget/projectexplorer/projectexplorericonview.h +++ b/app/widget/projectexplorer/projectexplorericonview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp index 7ee11c917..9073da4e7 100644 --- a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp +++ b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.h b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.h index 583ece26a..4e4b930c7 100644 --- a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.h +++ b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorerlistview.cpp b/app/widget/projectexplorer/projectexplorerlistview.cpp index 0f028dde9..ac5c7885f 100644 --- a/app/widget/projectexplorer/projectexplorerlistview.cpp +++ b/app/widget/projectexplorer/projectexplorerlistview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorerlistview.h b/app/widget/projectexplorer/projectexplorerlistview.h index 9f62925f3..6d3695337 100644 --- a/app/widget/projectexplorer/projectexplorerlistview.h +++ b/app/widget/projectexplorer/projectexplorerlistview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorerlistviewbase.cpp b/app/widget/projectexplorer/projectexplorerlistviewbase.cpp index c01e1125e..b305cb067 100644 --- a/app/widget/projectexplorer/projectexplorerlistviewbase.cpp +++ b/app/widget/projectexplorer/projectexplorerlistviewbase.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorerlistviewbase.h b/app/widget/projectexplorer/projectexplorerlistviewbase.h index 19b816f74..f71c598a2 100644 --- a/app/widget/projectexplorer/projectexplorerlistviewbase.h +++ b/app/widget/projectexplorer/projectexplorerlistviewbase.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.cpp b/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.cpp index 8414864a0..2cb01d9a5 100644 --- a/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.cpp +++ b/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.h b/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.h index 0e99869d1..152f40a4a 100644 --- a/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.h +++ b/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorernavigation.cpp b/app/widget/projectexplorer/projectexplorernavigation.cpp index a67650a19..e595a2a7b 100644 --- a/app/widget/projectexplorer/projectexplorernavigation.cpp +++ b/app/widget/projectexplorer/projectexplorernavigation.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorernavigation.h b/app/widget/projectexplorer/projectexplorernavigation.h index 3f91ec6eb..412c98d6f 100644 --- a/app/widget/projectexplorer/projectexplorernavigation.h +++ b/app/widget/projectexplorer/projectexplorernavigation.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorertreeview.cpp b/app/widget/projectexplorer/projectexplorertreeview.cpp index 65d76dfd9..40ed01ad8 100644 --- a/app/widget/projectexplorer/projectexplorertreeview.cpp +++ b/app/widget/projectexplorer/projectexplorertreeview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorertreeview.h b/app/widget/projectexplorer/projectexplorertreeview.h index c3e4668e8..74eeb3d5e 100644 --- a/app/widget/projectexplorer/projectexplorertreeview.h +++ b/app/widget/projectexplorer/projectexplorertreeview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorerundo.cpp b/app/widget/projectexplorer/projectexplorerundo.cpp index 609402caa..303029187 100644 --- a/app/widget/projectexplorer/projectexplorerundo.cpp +++ b/app/widget/projectexplorer/projectexplorerundo.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projectexplorer/projectexplorerundo.h b/app/widget/projectexplorer/projectexplorerundo.h index 8aaabdc0e..4203fbe26 100644 --- a/app/widget/projectexplorer/projectexplorerundo.h +++ b/app/widget/projectexplorer/projectexplorerundo.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projecttoolbar/CMakeLists.txt b/app/widget/projecttoolbar/CMakeLists.txt index 79846cee3..ffab1214b 100644 --- a/app/widget/projecttoolbar/CMakeLists.txt +++ b/app/widget/projecttoolbar/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/projecttoolbar/projecttoolbar.cpp b/app/widget/projecttoolbar/projecttoolbar.cpp index 056cd0ee5..d53a2ed51 100644 --- a/app/widget/projecttoolbar/projecttoolbar.cpp +++ b/app/widget/projecttoolbar/projecttoolbar.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/projecttoolbar/projecttoolbar.h b/app/widget/projecttoolbar/projecttoolbar.h index 7f5624484..cc084e0aa 100644 --- a/app/widget/projecttoolbar/projecttoolbar.h +++ b/app/widget/projecttoolbar/projecttoolbar.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/resizablescrollbar/CMakeLists.txt b/app/widget/resizablescrollbar/CMakeLists.txt index a31827510..0eb171a67 100644 --- a/app/widget/resizablescrollbar/CMakeLists.txt +++ b/app/widget/resizablescrollbar/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/resizablescrollbar/resizablescrollbar.cpp b/app/widget/resizablescrollbar/resizablescrollbar.cpp index 412f63a95..ffee074a2 100644 --- a/app/widget/resizablescrollbar/resizablescrollbar.cpp +++ b/app/widget/resizablescrollbar/resizablescrollbar.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/resizablescrollbar/resizablescrollbar.h b/app/widget/resizablescrollbar/resizablescrollbar.h index 92652a617..cba125d95 100644 --- a/app/widget/resizablescrollbar/resizablescrollbar.h +++ b/app/widget/resizablescrollbar/resizablescrollbar.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/CMakeLists.txt b/app/widget/scope/CMakeLists.txt index 91c4f0b44..2002d1a11 100644 --- a/app/widget/scope/CMakeLists.txt +++ b/app/widget/scope/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/histogram/CMakeLists.txt b/app/widget/scope/histogram/CMakeLists.txt index 3204a53d7..a2b058cfc 100644 --- a/app/widget/scope/histogram/CMakeLists.txt +++ b/app/widget/scope/histogram/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index f03b7833c..1f032a3de 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/histogram/histogram.h b/app/widget/scope/histogram/histogram.h index 30895f93d..eefaefc18 100644 --- a/app/widget/scope/histogram/histogram.h +++ b/app/widget/scope/histogram/histogram.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/scopebase/CMakeLists.txt b/app/widget/scope/scopebase/CMakeLists.txt index ca6d924c3..f49abc150 100644 --- a/app/widget/scope/scopebase/CMakeLists.txt +++ b/app/widget/scope/scopebase/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/scopebase/scopebase.cpp b/app/widget/scope/scopebase/scopebase.cpp index ebeb1c7a7..fc1a227b9 100644 --- a/app/widget/scope/scopebase/scopebase.cpp +++ b/app/widget/scope/scopebase/scopebase.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/scopebase/scopebase.h b/app/widget/scope/scopebase/scopebase.h index 2bcd415c5..2433f6a2f 100644 --- a/app/widget/scope/scopebase/scopebase.h +++ b/app/widget/scope/scopebase/scopebase.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/waveform/CMakeLists.txt b/app/widget/scope/waveform/CMakeLists.txt index 61a980b8f..c2729d17a 100644 --- a/app/widget/scope/waveform/CMakeLists.txt +++ b/app/widget/scope/waveform/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index e888b513e..ce0751f66 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -2,7 +2,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/scope/waveform/waveform.h b/app/widget/scope/waveform/waveform.h index 687d5b038..6656d3df1 100644 --- a/app/widget/scope/waveform/waveform.h +++ b/app/widget/scope/waveform/waveform.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/CMakeLists.txt b/app/widget/slider/CMakeLists.txt index 3a14e174f..ef2b3443c 100644 --- a/app/widget/slider/CMakeLists.txt +++ b/app/widget/slider/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/floatslider.cpp b/app/widget/slider/floatslider.cpp index 2793fcf17..58a741b23 100644 --- a/app/widget/slider/floatslider.cpp +++ b/app/widget/slider/floatslider.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/floatslider.h b/app/widget/slider/floatslider.h index 27b6aa007..246ab6982 100644 --- a/app/widget/slider/floatslider.h +++ b/app/widget/slider/floatslider.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/integerslider.cpp b/app/widget/slider/integerslider.cpp index 25615e2a5..08404e108 100644 --- a/app/widget/slider/integerslider.cpp +++ b/app/widget/slider/integerslider.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/integerslider.h b/app/widget/slider/integerslider.h index 01ea4f064..9a6db1860 100644 --- a/app/widget/slider/integerslider.h +++ b/app/widget/slider/integerslider.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/sliderbase.cpp b/app/widget/slider/sliderbase.cpp index 2da0fbae5..66c12a1ac 100644 --- a/app/widget/slider/sliderbase.cpp +++ b/app/widget/slider/sliderbase.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/sliderbase.h b/app/widget/slider/sliderbase.h index 7e8062694..7788ddd2c 100644 --- a/app/widget/slider/sliderbase.h +++ b/app/widget/slider/sliderbase.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/sliderlabel.cpp b/app/widget/slider/sliderlabel.cpp index ffc07fb2c..1e25177dd 100644 --- a/app/widget/slider/sliderlabel.cpp +++ b/app/widget/slider/sliderlabel.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/sliderlabel.h b/app/widget/slider/sliderlabel.h index 68d0666e3..749fba621 100644 --- a/app/widget/slider/sliderlabel.h +++ b/app/widget/slider/sliderlabel.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/sliderladder.cpp b/app/widget/slider/sliderladder.cpp index c5c0054ae..4646c4d70 100644 --- a/app/widget/slider/sliderladder.cpp +++ b/app/widget/slider/sliderladder.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/sliderladder.h b/app/widget/slider/sliderladder.h index 9fc30e511..6bad59941 100644 --- a/app/widget/slider/sliderladder.h +++ b/app/widget/slider/sliderladder.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/stringslider.cpp b/app/widget/slider/stringslider.cpp index c096eeed0..68b12609c 100644 --- a/app/widget/slider/stringslider.cpp +++ b/app/widget/slider/stringslider.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/stringslider.h b/app/widget/slider/stringslider.h index 573af0482..939191ec4 100644 --- a/app/widget/slider/stringslider.h +++ b/app/widget/slider/stringslider.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/timeslider.cpp b/app/widget/slider/timeslider.cpp index 5180819ff..911b59dcf 100644 --- a/app/widget/slider/timeslider.cpp +++ b/app/widget/slider/timeslider.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/slider/timeslider.h b/app/widget/slider/timeslider.h index d1e835dca..8083b7f1c 100644 --- a/app/widget/slider/timeslider.h +++ b/app/widget/slider/timeslider.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/standardcombos/CMakeLists.txt b/app/widget/standardcombos/CMakeLists.txt index cbfac1d51..8f4354b74 100644 --- a/app/widget/standardcombos/CMakeLists.txt +++ b/app/widget/standardcombos/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/standardcombos/channellayoutcombobox.h b/app/widget/standardcombos/channellayoutcombobox.h index 7deec22e6..8cd2e1ac6 100644 --- a/app/widget/standardcombos/channellayoutcombobox.h +++ b/app/widget/standardcombos/channellayoutcombobox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/standardcombos/frameratecombobox.h b/app/widget/standardcombos/frameratecombobox.h index 00eefe7aa..21b39dfba 100644 --- a/app/widget/standardcombos/frameratecombobox.h +++ b/app/widget/standardcombos/frameratecombobox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/standardcombos/interlacedcombobox.h b/app/widget/standardcombos/interlacedcombobox.h index 1bf54806b..d745e4da5 100644 --- a/app/widget/standardcombos/interlacedcombobox.h +++ b/app/widget/standardcombos/interlacedcombobox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/standardcombos/pixelaspectratiocombobox.h b/app/widget/standardcombos/pixelaspectratiocombobox.h index a5e2d02b9..b433dd9d6 100644 --- a/app/widget/standardcombos/pixelaspectratiocombobox.h +++ b/app/widget/standardcombos/pixelaspectratiocombobox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/standardcombos/pixelformatcombobox.h b/app/widget/standardcombos/pixelformatcombobox.h index 7fc29dc94..a6a399c38 100644 --- a/app/widget/standardcombos/pixelformatcombobox.h +++ b/app/widget/standardcombos/pixelformatcombobox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/standardcombos/sampleratecombobox.h b/app/widget/standardcombos/sampleratecombobox.h index e7300517f..c3a9bd2cc 100644 --- a/app/widget/standardcombos/sampleratecombobox.h +++ b/app/widget/standardcombos/sampleratecombobox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/standardcombos/standardcombos.h b/app/widget/standardcombos/standardcombos.h index e59aedab8..4e275bbe1 100644 --- a/app/widget/standardcombos/standardcombos.h +++ b/app/widget/standardcombos/standardcombos.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/standardcombos/videodividercombobox.h b/app/widget/standardcombos/videodividercombobox.h index 89b6c1b6a..359e467ae 100644 --- a/app/widget/standardcombos/videodividercombobox.h +++ b/app/widget/standardcombos/videodividercombobox.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/taskview/CMakeLists.txt b/app/widget/taskview/CMakeLists.txt index 26bcced3f..b9e308173 100644 --- a/app/widget/taskview/CMakeLists.txt +++ b/app/widget/taskview/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/taskview/elapsedcounterwidget.cpp b/app/widget/taskview/elapsedcounterwidget.cpp index 04cc05e39..6b82f2945 100644 --- a/app/widget/taskview/elapsedcounterwidget.cpp +++ b/app/widget/taskview/elapsedcounterwidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/taskview/elapsedcounterwidget.h b/app/widget/taskview/elapsedcounterwidget.h index fcfdff43a..e11ded5e1 100644 --- a/app/widget/taskview/elapsedcounterwidget.h +++ b/app/widget/taskview/elapsedcounterwidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/taskview/taskview.cpp b/app/widget/taskview/taskview.cpp index f3c264248..5803cf05f 100644 --- a/app/widget/taskview/taskview.cpp +++ b/app/widget/taskview/taskview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/taskview/taskview.h b/app/widget/taskview/taskview.h index 19862c6a1..a0c214c96 100644 --- a/app/widget/taskview/taskview.h +++ b/app/widget/taskview/taskview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/taskview/taskviewitem.cpp b/app/widget/taskview/taskviewitem.cpp index 49c7c8c91..3d28ec077 100644 --- a/app/widget/taskview/taskviewitem.cpp +++ b/app/widget/taskview/taskviewitem.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/taskview/taskviewitem.h b/app/widget/taskview/taskviewitem.h index 40f9c003b..49378aff7 100644 --- a/app/widget/taskview/taskviewitem.h +++ b/app/widget/taskview/taskviewitem.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timebased/CMakeLists.txt b/app/widget/timebased/CMakeLists.txt index 9711117d9..8719d0f0a 100644 --- a/app/widget/timebased/CMakeLists.txt +++ b/app/widget/timebased/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/timebased/timebased.cpp b/app/widget/timebased/timebased.cpp index b839d64aa..6c39865e4 100644 --- a/app/widget/timebased/timebased.cpp +++ b/app/widget/timebased/timebased.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timebased/timebased.h b/app/widget/timebased/timebased.h index c31970189..24bf5c851 100644 --- a/app/widget/timebased/timebased.h +++ b/app/widget/timebased/timebased.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/CMakeLists.txt b/app/widget/timelinewidget/CMakeLists.txt index 9672f1a58..86173dc1b 100644 --- a/app/widget/timelinewidget/CMakeLists.txt +++ b/app/widget/timelinewidget/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/timelineandtrackview.cpp b/app/widget/timelinewidget/timelineandtrackview.cpp index d233c25da..bf5291fe2 100644 --- a/app/widget/timelinewidget/timelineandtrackview.cpp +++ b/app/widget/timelinewidget/timelineandtrackview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/timelineandtrackview.h b/app/widget/timelinewidget/timelineandtrackview.h index 7b482cde7..7f8952d7f 100644 --- a/app/widget/timelinewidget/timelineandtrackview.h +++ b/app/widget/timelinewidget/timelineandtrackview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/timelinescaledobject.cpp b/app/widget/timelinewidget/timelinescaledobject.cpp index d12a998f8..daa5b84b6 100644 --- a/app/widget/timelinewidget/timelinescaledobject.cpp +++ b/app/widget/timelinewidget/timelinescaledobject.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/timelinescaledobject.h b/app/widget/timelinewidget/timelinescaledobject.h index 3b05f8e26..2f061b692 100644 --- a/app/widget/timelinewidget/timelinescaledobject.h +++ b/app/widget/timelinewidget/timelinescaledobject.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index bc48f0172..f836dc8fa 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index 568f42949..54beb5db8 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/timelinewidgetselections.cpp b/app/widget/timelinewidget/timelinewidgetselections.cpp index 938f2e16a..570713f51 100644 --- a/app/widget/timelinewidget/timelinewidgetselections.cpp +++ b/app/widget/timelinewidget/timelinewidgetselections.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/timelinewidgetselections.h b/app/widget/timelinewidget/timelinewidgetselections.h index 1413bbac0..3d92122fc 100644 --- a/app/widget/timelinewidget/timelinewidgetselections.h +++ b/app/widget/timelinewidget/timelinewidgetselections.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/CMakeLists.txt b/app/widget/timelinewidget/tool/CMakeLists.txt index 4e9850fc0..8f9a1d8e0 100644 --- a/app/widget/timelinewidget/tool/CMakeLists.txt +++ b/app/widget/timelinewidget/tool/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/add.cpp b/app/widget/timelinewidget/tool/add.cpp index 4ea4831f9..360cde603 100644 --- a/app/widget/timelinewidget/tool/add.cpp +++ b/app/widget/timelinewidget/tool/add.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/add.h b/app/widget/timelinewidget/tool/add.h index eabbdf3c9..83f83d03f 100644 --- a/app/widget/timelinewidget/tool/add.h +++ b/app/widget/timelinewidget/tool/add.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/beam.cpp b/app/widget/timelinewidget/tool/beam.cpp index 574f2077e..2350eadf0 100644 --- a/app/widget/timelinewidget/tool/beam.cpp +++ b/app/widget/timelinewidget/tool/beam.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/beam.h b/app/widget/timelinewidget/tool/beam.h index 7949474c2..651d82e98 100644 --- a/app/widget/timelinewidget/tool/beam.h +++ b/app/widget/timelinewidget/tool/beam.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/edit.cpp b/app/widget/timelinewidget/tool/edit.cpp index 142aca321..dc1b381d8 100644 --- a/app/widget/timelinewidget/tool/edit.cpp +++ b/app/widget/timelinewidget/tool/edit.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/edit.h b/app/widget/timelinewidget/tool/edit.h index 9f1e40be3..c83312dc0 100644 --- a/app/widget/timelinewidget/tool/edit.h +++ b/app/widget/timelinewidget/tool/edit.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/import.cpp b/app/widget/timelinewidget/tool/import.cpp index 2a012ee5e..4d2a50cb7 100644 --- a/app/widget/timelinewidget/tool/import.cpp +++ b/app/widget/timelinewidget/tool/import.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/import.h b/app/widget/timelinewidget/tool/import.h index 08a6672c1..dd3b2d49d 100644 --- a/app/widget/timelinewidget/tool/import.h +++ b/app/widget/timelinewidget/tool/import.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp index 938f76afd..83d774c50 100644 --- a/app/widget/timelinewidget/tool/pointer.cpp +++ b/app/widget/timelinewidget/tool/pointer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/pointer.h b/app/widget/timelinewidget/tool/pointer.h index 3d42fbb54..51eac9928 100644 --- a/app/widget/timelinewidget/tool/pointer.h +++ b/app/widget/timelinewidget/tool/pointer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/razor.cpp b/app/widget/timelinewidget/tool/razor.cpp index fb6244ee8..4cc3999e1 100644 --- a/app/widget/timelinewidget/tool/razor.cpp +++ b/app/widget/timelinewidget/tool/razor.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/razor.h b/app/widget/timelinewidget/tool/razor.h index d2da08ac3..5e4e952fd 100644 --- a/app/widget/timelinewidget/tool/razor.h +++ b/app/widget/timelinewidget/tool/razor.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/ripple.cpp b/app/widget/timelinewidget/tool/ripple.cpp index f9455483e..ad269353f 100644 --- a/app/widget/timelinewidget/tool/ripple.cpp +++ b/app/widget/timelinewidget/tool/ripple.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/ripple.h b/app/widget/timelinewidget/tool/ripple.h index bb946eaa3..0067e4cc4 100644 --- a/app/widget/timelinewidget/tool/ripple.h +++ b/app/widget/timelinewidget/tool/ripple.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/rolling.cpp b/app/widget/timelinewidget/tool/rolling.cpp index 4f340991a..d89f7670d 100644 --- a/app/widget/timelinewidget/tool/rolling.cpp +++ b/app/widget/timelinewidget/tool/rolling.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/rolling.h b/app/widget/timelinewidget/tool/rolling.h index f804b9118..812536f65 100644 --- a/app/widget/timelinewidget/tool/rolling.h +++ b/app/widget/timelinewidget/tool/rolling.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/slide.cpp b/app/widget/timelinewidget/tool/slide.cpp index 0dc7d1482..926ec71ab 100644 --- a/app/widget/timelinewidget/tool/slide.cpp +++ b/app/widget/timelinewidget/tool/slide.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/slide.h b/app/widget/timelinewidget/tool/slide.h index 326f78d8b..95a04d066 100644 --- a/app/widget/timelinewidget/tool/slide.h +++ b/app/widget/timelinewidget/tool/slide.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/slip.cpp b/app/widget/timelinewidget/tool/slip.cpp index e7636048f..daa93cf7b 100644 --- a/app/widget/timelinewidget/tool/slip.cpp +++ b/app/widget/timelinewidget/tool/slip.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/slip.h b/app/widget/timelinewidget/tool/slip.h index bf358e5fc..2d80df367 100644 --- a/app/widget/timelinewidget/tool/slip.h +++ b/app/widget/timelinewidget/tool/slip.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/tool.cpp b/app/widget/timelinewidget/tool/tool.cpp index 388b4edaf..dcba3a1ab 100644 --- a/app/widget/timelinewidget/tool/tool.cpp +++ b/app/widget/timelinewidget/tool/tool.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/tool.h b/app/widget/timelinewidget/tool/tool.h index a0ffce17f..e0e036ef0 100644 --- a/app/widget/timelinewidget/tool/tool.h +++ b/app/widget/timelinewidget/tool/tool.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/transition.cpp b/app/widget/timelinewidget/tool/transition.cpp index 942e7a6b2..bf89eb922 100644 --- a/app/widget/timelinewidget/tool/transition.cpp +++ b/app/widget/timelinewidget/tool/transition.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/transition.h b/app/widget/timelinewidget/tool/transition.h index 89d77253e..6dee39d17 100644 --- a/app/widget/timelinewidget/tool/transition.h +++ b/app/widget/timelinewidget/tool/transition.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/zoom.cpp b/app/widget/timelinewidget/tool/zoom.cpp index 3b4f30e54..4eda48a9f 100644 --- a/app/widget/timelinewidget/tool/zoom.cpp +++ b/app/widget/timelinewidget/tool/zoom.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/tool/zoom.h b/app/widget/timelinewidget/tool/zoom.h index a98823a20..f52316a43 100644 --- a/app/widget/timelinewidget/tool/zoom.h +++ b/app/widget/timelinewidget/tool/zoom.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/trackview/CMakeLists.txt b/app/widget/timelinewidget/trackview/CMakeLists.txt index a569b27c9..4a3186453 100644 --- a/app/widget/timelinewidget/trackview/CMakeLists.txt +++ b/app/widget/timelinewidget/trackview/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/trackview/trackview.cpp b/app/widget/timelinewidget/trackview/trackview.cpp index c079a0b9b..03fbadfd3 100644 --- a/app/widget/timelinewidget/trackview/trackview.cpp +++ b/app/widget/timelinewidget/trackview/trackview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/trackview/trackview.h b/app/widget/timelinewidget/trackview/trackview.h index 184ad51df..0801dfeac 100644 --- a/app/widget/timelinewidget/trackview/trackview.h +++ b/app/widget/timelinewidget/trackview/trackview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/trackview/trackviewitem.cpp b/app/widget/timelinewidget/trackview/trackviewitem.cpp index ed394c24e..d2e65c77c 100644 --- a/app/widget/timelinewidget/trackview/trackviewitem.cpp +++ b/app/widget/timelinewidget/trackview/trackviewitem.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/trackview/trackviewitem.h b/app/widget/timelinewidget/trackview/trackviewitem.h index f67479380..258656ecf 100644 --- a/app/widget/timelinewidget/trackview/trackviewitem.h +++ b/app/widget/timelinewidget/trackview/trackviewitem.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/trackview/trackviewsplitter.cpp b/app/widget/timelinewidget/trackview/trackviewsplitter.cpp index ea42629e2..0ee10f53e 100644 --- a/app/widget/timelinewidget/trackview/trackviewsplitter.cpp +++ b/app/widget/timelinewidget/trackview/trackviewsplitter.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/trackview/trackviewsplitter.h b/app/widget/timelinewidget/trackview/trackviewsplitter.h index 0a617e301..f0fb5435c 100644 --- a/app/widget/timelinewidget/trackview/trackviewsplitter.h +++ b/app/widget/timelinewidget/trackview/trackviewsplitter.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/undo/CMakeLists.txt b/app/widget/timelinewidget/undo/CMakeLists.txt index e88f2279e..91cf6fa71 100644 --- a/app/widget/timelinewidget/undo/CMakeLists.txt +++ b/app/widget/timelinewidget/undo/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index 36f81e8e1..97f7b8624 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/undo/undo.h b/app/widget/timelinewidget/undo/undo.h index b8be979b2..377fabb38 100644 --- a/app/widget/timelinewidget/undo/undo.h +++ b/app/widget/timelinewidget/undo/undo.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/CMakeLists.txt b/app/widget/timelinewidget/view/CMakeLists.txt index 5a57efbc1..929652ed7 100644 --- a/app/widget/timelinewidget/view/CMakeLists.txt +++ b/app/widget/timelinewidget/view/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/handmovableview.cpp b/app/widget/timelinewidget/view/handmovableview.cpp index f0995eb7b..ae06c6bc7 100644 --- a/app/widget/timelinewidget/view/handmovableview.cpp +++ b/app/widget/timelinewidget/view/handmovableview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/handmovableview.h b/app/widget/timelinewidget/view/handmovableview.h index 9224069c7..26562e00a 100644 --- a/app/widget/timelinewidget/view/handmovableview.h +++ b/app/widget/timelinewidget/view/handmovableview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index 63ae9c643..e914f55d3 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineview.h b/app/widget/timelinewidget/view/timelineview.h index 88740a93e..0096f8d88 100644 --- a/app/widget/timelinewidget/view/timelineview.h +++ b/app/widget/timelinewidget/view/timelineview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewbase.cpp b/app/widget/timelinewidget/view/timelineviewbase.cpp index 883937a2d..06a8f3dc8 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.cpp +++ b/app/widget/timelinewidget/view/timelineviewbase.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewbase.h b/app/widget/timelinewidget/view/timelineviewbase.h index f8da914e7..ac9b198c6 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.h +++ b/app/widget/timelinewidget/view/timelineviewbase.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.cpp b/app/widget/timelinewidget/view/timelineviewblockitem.cpp index 3454f2701..6313e5d14 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewblockitem.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.h b/app/widget/timelinewidget/view/timelineviewblockitem.h index fa091e78b..a9315cab8 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.h +++ b/app/widget/timelinewidget/view/timelineviewblockitem.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewghostitem.cpp b/app/widget/timelinewidget/view/timelineviewghostitem.cpp index b2a0c86e8..335c15e0c 100644 --- a/app/widget/timelinewidget/view/timelineviewghostitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewghostitem.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewghostitem.h b/app/widget/timelinewidget/view/timelineviewghostitem.h index d13ad7d7c..dbab4e782 100644 --- a/app/widget/timelinewidget/view/timelineviewghostitem.h +++ b/app/widget/timelinewidget/view/timelineviewghostitem.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewmouseevent.cpp b/app/widget/timelinewidget/view/timelineviewmouseevent.cpp index 4e4dc183c..47ae0d477 100644 --- a/app/widget/timelinewidget/view/timelineviewmouseevent.cpp +++ b/app/widget/timelinewidget/view/timelineviewmouseevent.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewmouseevent.h b/app/widget/timelinewidget/view/timelineviewmouseevent.h index b99db096f..4fc2654f3 100644 --- a/app/widget/timelinewidget/view/timelineviewmouseevent.h +++ b/app/widget/timelinewidget/view/timelineviewmouseevent.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewrect.cpp b/app/widget/timelinewidget/view/timelineviewrect.cpp index 1948b4f5e..64e38a9eb 100644 --- a/app/widget/timelinewidget/view/timelineviewrect.cpp +++ b/app/widget/timelinewidget/view/timelineviewrect.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timelinewidget/view/timelineviewrect.h b/app/widget/timelinewidget/view/timelineviewrect.h index bfd31d6ab..c56432ec1 100644 --- a/app/widget/timelinewidget/view/timelineviewrect.h +++ b/app/widget/timelinewidget/view/timelineviewrect.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timeruler/CMakeLists.txt b/app/widget/timeruler/CMakeLists.txt index 9c7882713..c1f4f8351 100644 --- a/app/widget/timeruler/CMakeLists.txt +++ b/app/widget/timeruler/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index bf6f8f20e..3bacf4ee5 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timeruler/seekablewidget.h b/app/widget/timeruler/seekablewidget.h index eabd1ccaf..a9712b05f 100644 --- a/app/widget/timeruler/seekablewidget.h +++ b/app/widget/timeruler/seekablewidget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timeruler/timeruler.cpp b/app/widget/timeruler/timeruler.cpp index 9fcbc524d..98236ce39 100644 --- a/app/widget/timeruler/timeruler.cpp +++ b/app/widget/timeruler/timeruler.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timeruler/timeruler.h b/app/widget/timeruler/timeruler.h index 131a3c6cc..7d0d6f0d9 100644 --- a/app/widget/timeruler/timeruler.h +++ b/app/widget/timeruler/timeruler.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timetarget/CMakeLists.txt b/app/widget/timetarget/CMakeLists.txt index 98f834bd1..5cbea7437 100644 --- a/app/widget/timetarget/CMakeLists.txt +++ b/app/widget/timetarget/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/timetarget/timetarget.cpp b/app/widget/timetarget/timetarget.cpp index 73f29746a..cebce4296 100644 --- a/app/widget/timetarget/timetarget.cpp +++ b/app/widget/timetarget/timetarget.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/timetarget/timetarget.h b/app/widget/timetarget/timetarget.h index 66ae3a7ca..3a4b4d0c6 100644 --- a/app/widget/timetarget/timetarget.h +++ b/app/widget/timetarget/timetarget.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/toolbar/CMakeLists.txt b/app/widget/toolbar/CMakeLists.txt index 329a59d74..ec3ebbd14 100644 --- a/app/widget/toolbar/CMakeLists.txt +++ b/app/widget/toolbar/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/toolbar/toolbar.cpp b/app/widget/toolbar/toolbar.cpp index 62bb3f5ab..2c5078561 100644 --- a/app/widget/toolbar/toolbar.cpp +++ b/app/widget/toolbar/toolbar.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/toolbar/toolbar.h b/app/widget/toolbar/toolbar.h index 74c48167d..338ef6b5d 100644 --- a/app/widget/toolbar/toolbar.h +++ b/app/widget/toolbar/toolbar.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/toolbar/toolbarbutton.cpp b/app/widget/toolbar/toolbarbutton.cpp index b1e5630db..de9e5d17c 100644 --- a/app/widget/toolbar/toolbarbutton.cpp +++ b/app/widget/toolbar/toolbarbutton.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/toolbar/toolbarbutton.h b/app/widget/toolbar/toolbarbutton.h index 0c36136bb..6cd51a606 100644 --- a/app/widget/toolbar/toolbarbutton.h +++ b/app/widget/toolbar/toolbarbutton.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/CMakeLists.txt b/app/widget/viewer/CMakeLists.txt index f745ca0d6..2c7a0a171 100644 --- a/app/widget/viewer/CMakeLists.txt +++ b/app/widget/viewer/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/audiowaveformview.cpp b/app/widget/viewer/audiowaveformview.cpp index 8d5140b16..5b24d87f1 100644 --- a/app/widget/viewer/audiowaveformview.cpp +++ b/app/widget/viewer/audiowaveformview.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/audiowaveformview.h b/app/widget/viewer/audiowaveformview.h index 13540d394..afa2a0dbf 100644 --- a/app/widget/viewer/audiowaveformview.h +++ b/app/widget/viewer/audiowaveformview.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/footageviewer.cpp b/app/widget/viewer/footageviewer.cpp index 9cdccd1b9..51a17bf94 100644 --- a/app/widget/viewer/footageviewer.cpp +++ b/app/widget/viewer/footageviewer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/footageviewer.h b/app/widget/viewer/footageviewer.h index af093eb8f..fc014ec49 100644 --- a/app/widget/viewer/footageviewer.h +++ b/app/widget/viewer/footageviewer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/gizmotraverser.cpp b/app/widget/viewer/gizmotraverser.cpp index b28128d7f..a01d61378 100644 --- a/app/widget/viewer/gizmotraverser.cpp +++ b/app/widget/viewer/gizmotraverser.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/gizmotraverser.h b/app/widget/viewer/gizmotraverser.h index af6601882..fbd8e44aa 100644 --- a/app/widget/viewer/gizmotraverser.h +++ b/app/widget/viewer/gizmotraverser.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index d2b584722..eafb0ac3d 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 838dc4f4f..4133d7bd1 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 68fe1d505..79326f8a3 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index a8d8b3ade..fcf140cf1 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewerplaybacktimer.cpp b/app/widget/viewer/viewerplaybacktimer.cpp index e07e925c9..a1abed086 100644 --- a/app/widget/viewer/viewerplaybacktimer.cpp +++ b/app/widget/viewer/viewerplaybacktimer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewerplaybacktimer.h b/app/widget/viewer/viewerplaybacktimer.h index a4669a571..4df1031dc 100644 --- a/app/widget/viewer/viewerplaybacktimer.h +++ b/app/widget/viewer/viewerplaybacktimer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewerqueue.h b/app/widget/viewer/viewerqueue.h index 8a421d05c..19fb8d908 100644 --- a/app/widget/viewer/viewerqueue.h +++ b/app/widget/viewer/viewerqueue.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewersafemargininfo.h b/app/widget/viewer/viewersafemargininfo.h index b208cfb12..a71a0b2d7 100644 --- a/app/widget/viewer/viewersafemargininfo.h +++ b/app/widget/viewer/viewersafemargininfo.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewersizer.cpp b/app/widget/viewer/viewersizer.cpp index 33a1f211c..9bc685f1a 100644 --- a/app/widget/viewer/viewersizer.cpp +++ b/app/widget/viewer/viewersizer.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewersizer.h b/app/widget/viewer/viewersizer.h index 44601e6c6..43adc0277 100644 --- a/app/widget/viewer/viewersizer.h +++ b/app/widget/viewer/viewersizer.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewerwindow.cpp b/app/widget/viewer/viewerwindow.cpp index d9a331676..ae79e6373 100644 --- a/app/widget/viewer/viewerwindow.cpp +++ b/app/widget/viewer/viewerwindow.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/widget/viewer/viewerwindow.h b/app/widget/viewer/viewerwindow.h index 289f0ea87..bc883eafa 100644 --- a/app/widget/viewer/viewerwindow.h +++ b/app/widget/viewer/viewerwindow.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/window/CMakeLists.txt b/app/window/CMakeLists.txt index 488b0686e..2ed541163 100644 --- a/app/window/CMakeLists.txt +++ b/app/window/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/window/mainwindow/CMakeLists.txt b/app/window/mainwindow/CMakeLists.txt index 4b70b8f9e..5b36cc883 100644 --- a/app/window/mainwindow/CMakeLists.txt +++ b/app/window/mainwindow/CMakeLists.txt @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp index 1bdbe9219..89e5b2b00 100644 --- a/app/window/mainwindow/mainmenu.cpp +++ b/app/window/mainwindow/mainmenu.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/window/mainwindow/mainmenu.h b/app/window/mainwindow/mainmenu.h index 3bfb691fe..d1c5e046d 100644 --- a/app/window/mainwindow/mainmenu.h +++ b/app/window/mainwindow/mainmenu.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/window/mainwindow/mainstatusbar.cpp b/app/window/mainwindow/mainstatusbar.cpp index fada2d6e7..bbc8ee455 100644 --- a/app/window/mainwindow/mainstatusbar.cpp +++ b/app/window/mainwindow/mainstatusbar.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/window/mainwindow/mainstatusbar.h b/app/window/mainwindow/mainstatusbar.h index a1bd8fb27..4f744c4c7 100644 --- a/app/window/mainwindow/mainstatusbar.h +++ b/app/window/mainwindow/mainstatusbar.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 440795363..d9faaf66b 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h index 91e03a8ba..3d0e03772 100644 --- a/app/window/mainwindow/mainwindow.h +++ b/app/window/mainwindow/mainwindow.h @@ -1,7 +1,7 @@ /*** Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team + Copyright (C) 2020 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/cmake/FindGoogleCrashpad.cmake b/cmake/FindGoogleCrashpad.cmake index 8feca7930..574e4e8b5 100644 --- a/cmake/FindGoogleCrashpad.cmake +++ b/cmake/FindGoogleCrashpad.cmake @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/cmake/FindOpenTimelineIO.cmake b/cmake/FindOpenTimelineIO.cmake index ee4131e45..04335a293 100644 --- a/cmake/FindOpenTimelineIO.cmake +++ b/cmake/FindOpenTimelineIO.cmake @@ -1,5 +1,5 @@ # Olive - Non-Linear Video Editor -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/docker/scripts/common/install_yumpackages.sh b/docker/scripts/common/install_yumpackages.sh index 064c5e1f1..c0dfe6e62 100644 --- a/docker/scripts/common/install_yumpackages.sh +++ b/docker/scripts/common/install_yumpackages.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Copyright (C) 2019 Olive Team +# Copyright (C) 2020 Olive Team # Copyright (c) Contributors to the aswf-docker Project. All rights reserved. # SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later From 75d4cd899bb27a916261fd1cbdedd532b0337678 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 20:24:42 +1100 Subject: [PATCH 57/72] use hardcoded namespace The macro defined namespaces confused the hell out of lupdate and more or less broke translations permanently. Looks like the only way we can do it is to have a hardcoded namespace, which goes against my instinct, but honestly how likely is it that we'll change the namespace anyway (I guess forks might want to do it, but that's their problem ;) ) --- app/audio/audiomanager.cpp | 4 +- app/audio/audiomanager.h | 4 +- app/audio/audiovisualwaveform.cpp | 4 +- app/audio/audiovisualwaveform.h | 6 +- app/audio/outputdeviceproxy.cpp | 4 +- app/audio/outputdeviceproxy.h | 4 +- app/audio/outputmanager.cpp | 4 +- app/audio/outputmanager.h | 6 +- app/audio/tempoprocessor.cpp | 4 +- app/audio/tempoprocessor.h | 4 +- app/cli/cliexport/cliexportmanager.cpp | 4 +- app/cli/cliexport/cliexportmanager.h | 4 +- app/cli/cliprogress/cliprogressdialog.cpp | 4 +- app/cli/cliprogress/cliprogressdialog.h | 4 +- app/cli/clitask/clitaskdialog.cpp | 4 +- app/cli/clitask/clitaskdialog.h | 4 +- app/codec/decoder.cpp | 4 +- app/codec/decoder.h | 6 +- app/codec/encoder.cpp | 4 +- app/codec/encoder.h | 10 +- app/codec/exportcodec.cpp | 4 +- app/codec/exportcodec.h | 4 +- app/codec/exportformat.cpp | 4 +- app/codec/exportformat.h | 4 +- app/codec/ffmpeg/avframeptr.h | 4 +- app/codec/ffmpeg/ffmpegdecoder.cpp | 4 +- app/codec/ffmpeg/ffmpegdecoder.h | 4 +- app/codec/ffmpeg/ffmpegencoder.cpp | 4 +- app/codec/ffmpeg/ffmpegencoder.h | 8 +- app/codec/ffmpeg/ffmpegframepool.cpp | 4 +- app/codec/ffmpeg/ffmpegframepool.h | 4 +- app/codec/frame.cpp | 4 +- app/codec/frame.h | 6 +- app/codec/oiio/oiiodecoder.cpp | 4 +- app/codec/oiio/oiiodecoder.h | 4 +- app/codec/samplebuffer.cpp | 4 +- app/codec/samplebuffer.h | 6 +- app/codec/waveinput.cpp | 4 +- app/codec/waveinput.h | 4 +- app/codec/waveoutput.cpp | 4 +- app/codec/waveoutput.h | 4 +- app/common/autoscroll.h | 4 +- app/common/bezier.cpp | 4 +- app/common/bezier.h | 4 +- app/common/cancelableobject.h | 4 +- app/common/crashpadinterface.cpp | 4 +- app/common/debug.cpp | 4 +- app/common/debug.h | 4 +- app/common/define.h | 16 +- app/common/ffmpegutils.cpp | 4 +- app/common/ffmpegutils.h | 4 +- app/common/filefunctions.cpp | 4 +- app/common/filefunctions.h | 4 +- app/common/flipmodifiers.cpp | 4 +- app/common/flipmodifiers.h | 4 +- app/common/memorypool.cpp | 4 +- app/common/memorypool.h | 4 +- app/common/ocioutils.cpp | 4 +- app/common/ocioutils.h | 4 +- app/common/oiioutils.cpp | 4 +- app/common/oiioutils.h | 4 +- app/common/power.h | 4 +- app/common/qtutils.cpp | 4 +- app/common/qtutils.h | 4 +- app/common/ratiodialog.cpp | 4 +- app/common/ratiodialog.h | 4 +- app/common/rational.cpp | 6 +- app/common/rational.h | 8 +- app/common/threadedobject.cpp | 4 +- app/common/threadedobject.h | 4 +- app/common/timecodefunctions.cpp | 4 +- app/common/timecodefunctions.h | 4 +- app/common/timerange.cpp | 6 +- app/common/timerange.h | 10 +- app/common/tohex.h | 4 +- app/common/xmlutils.cpp | 4 +- app/common/xmlutils.h | 4 +- app/config/config.cpp | 4 +- app/config/config.h | 4 +- app/core.cpp | 24 +- app/core.h | 6 +- app/dialog/about/about.cpp | 4 +- app/dialog/about/about.h | 4 +- app/dialog/actionsearch/actionsearch.cpp | 4 +- app/dialog/actionsearch/actionsearch.h | 4 +- app/dialog/color/colordialog.cpp | 4 +- app/dialog/color/colordialog.h | 4 +- app/dialog/crashhandler/crashhandler.cpp | 4 +- app/dialog/crashhandler/crashhandler.h | 4 +- app/dialog/crashhandler/crashhandlermain.cpp | 2 +- app/dialog/diskcache/diskcachedialog.cpp | 4 +- app/dialog/diskcache/diskcachedialog.h | 4 +- app/dialog/export/codec/codecsection.cpp | 4 +- app/dialog/export/codec/codecsection.h | 4 +- app/dialog/export/codec/h264section.cpp | 4 +- app/dialog/export/codec/h264section.h | 4 +- app/dialog/export/codec/imagesection.cpp | 4 +- app/dialog/export/codec/imagesection.h | 4 +- app/dialog/export/export.cpp | 4 +- app/dialog/export/export.h | 4 +- .../export/exportadvancedvideodialog.cpp | 4 +- app/dialog/export/exportadvancedvideodialog.h | 4 +- app/dialog/export/exportaudiotab.cpp | 4 +- app/dialog/export/exportaudiotab.h | 4 +- app/dialog/export/exportvideotab.cpp | 4 +- app/dialog/export/exportvideotab.h | 4 +- .../footageproperties/footageproperties.cpp | 4 +- .../footageproperties/footageproperties.h | 4 +- .../audiostreamproperties.cpp | 4 +- .../streamproperties/audiostreamproperties.h | 4 +- .../streamproperties/streamproperties.cpp | 4 +- .../streamproperties/streamproperties.h | 4 +- .../videostreamproperties.cpp | 4 +- .../streamproperties/videostreamproperties.h | 4 +- .../footagerelink/footagerelinkdialog.cpp | 4 +- .../footagerelink/footagerelinkdialog.h | 4 +- .../keyframeproperties/keyframeproperties.cpp | 4 +- .../keyframeproperties/keyframeproperties.h | 4 +- app/dialog/preferences/keysequenceeditor.cpp | 4 +- app/dialog/preferences/keysequenceeditor.h | 4 +- app/dialog/preferences/preferences.cpp | 4 +- app/dialog/preferences/preferences.h | 4 +- .../tabs/preferencesappearancetab.cpp | 4 +- .../tabs/preferencesappearancetab.h | 4 +- .../preferences/tabs/preferencesaudiotab.cpp | 4 +- .../preferences/tabs/preferencesaudiotab.h | 4 +- .../tabs/preferencesbehaviortab.cpp | 4 +- .../preferences/tabs/preferencesbehaviortab.h | 4 +- .../preferences/tabs/preferencesdisktab.cpp | 4 +- .../preferences/tabs/preferencesdisktab.h | 4 +- .../tabs/preferencesgeneraltab.cpp | 4 +- .../preferences/tabs/preferencesgeneraltab.h | 4 +- .../tabs/preferenceskeyboardtab.cpp | 4 +- .../preferences/tabs/preferenceskeyboardtab.h | 4 +- .../preferences/tabs/preferencestab.cpp | 4 +- app/dialog/preferences/tabs/preferencestab.h | 4 +- app/dialog/progress/progress.cpp | 4 +- app/dialog/progress/progress.h | 4 +- .../projectproperties/projectproperties.cpp | 4 +- .../projectproperties/projectproperties.h | 4 +- app/dialog/rendercancel/rendercancel.cpp | 4 +- app/dialog/rendercancel/rendercancel.h | 4 +- app/dialog/richtext/richtext.cpp | 4 +- app/dialog/richtext/richtext.h | 4 +- app/dialog/sequence/presetmanager.h | 4 +- app/dialog/sequence/sequence.cpp | 4 +- app/dialog/sequence/sequence.h | 4 +- .../sequence/sequencedialogparametertab.cpp | 4 +- .../sequence/sequencedialogparametertab.h | 4 +- .../sequence/sequencedialogpresettab.cpp | 4 +- app/dialog/sequence/sequencedialogpresettab.h | 4 +- app/dialog/sequence/sequencepreset.h | 4 +- app/dialog/task/task.cpp | 4 +- app/dialog/task/task.h | 4 +- app/main.cpp | 10 +- app/node/audio/pan/pan.cpp | 4 +- app/node/audio/pan/pan.h | 4 +- app/node/audio/volume/volume.cpp | 4 +- app/node/audio/volume/volume.h | 4 +- app/node/block/block.cpp | 4 +- app/node/block/block.h | 4 +- app/node/block/clip/clip.cpp | 4 +- app/node/block/clip/clip.h | 4 +- app/node/block/gap/gap.cpp | 4 +- app/node/block/gap/gap.h | 4 +- .../crossdissolve/crossdissolvetransition.cpp | 4 +- .../crossdissolve/crossdissolvetransition.h | 4 +- .../diptocolor/diptocolortransition.cpp | 4 +- .../diptocolor/diptocolortransition.h | 4 +- app/node/block/transition/transition.cpp | 4 +- app/node/block/transition/transition.h | 4 +- app/node/edge.cpp | 4 +- app/node/edge.h | 4 +- app/node/factory.cpp | 4 +- app/node/factory.h | 4 +- app/node/filter/blur/blur.cpp | 4 +- app/node/filter/blur/blur.h | 4 +- app/node/filter/stroke/stroke.cpp | 4 +- app/node/filter/stroke/stroke.h | 4 +- app/node/generator/matrix/matrix.cpp | 4 +- app/node/generator/matrix/matrix.h | 4 +- app/node/generator/polygon/polygon.cpp | 4 +- app/node/generator/polygon/polygon.h | 4 +- app/node/generator/solid/solid.cpp | 4 +- app/node/generator/solid/solid.h | 4 +- app/node/generator/text/text.cpp | 4 +- app/node/generator/text/text.h | 4 +- app/node/graph.cpp | 4 +- app/node/graph.h | 4 +- app/node/input.cpp | 4 +- app/node/input.h | 6 +- app/node/input/media/audio/audio.cpp | 4 +- app/node/input/media/audio/audio.h | 4 +- app/node/input/media/media.cpp | 4 +- app/node/input/media/media.h | 4 +- app/node/input/media/video/video.cpp | 4 +- app/node/input/media/video/video.h | 4 +- app/node/input/time/timeinput.cpp | 4 +- app/node/input/time/timeinput.h | 4 +- app/node/inputarray.cpp | 4 +- app/node/inputarray.h | 4 +- app/node/inputdragger.cpp | 4 +- app/node/inputdragger.h | 4 +- app/node/keyframe.cpp | 4 +- app/node/keyframe.h | 6 +- app/node/math/math/math.cpp | 4 +- app/node/math/math/math.h | 4 +- app/node/math/math/mathbase.cpp | 4 +- app/node/math/math/mathbase.h | 4 +- app/node/math/merge/merge.cpp | 4 +- app/node/math/merge/merge.h | 4 +- app/node/math/trigonometry/trigonometry.cpp | 4 +- app/node/math/trigonometry/trigonometry.h | 4 +- app/node/node.cpp | 4 +- app/node/node.h | 6 +- app/node/output.cpp | 4 +- app/node/output.h | 4 +- app/node/output/track/track.cpp | 4 +- app/node/output/track/track.h | 4 +- app/node/output/track/tracklist.cpp | 4 +- app/node/output/track/tracklist.h | 4 +- app/node/output/viewer/viewer.cpp | 4 +- app/node/output/viewer/viewer.h | 4 +- app/node/param.cpp | 4 +- app/node/param.h | 4 +- app/node/traverser.cpp | 4 +- app/node/traverser.h | 4 +- app/node/value.cpp | 4 +- app/node/value.h | 10 +- app/panel/audiomonitor/audiomonitor.cpp | 4 +- app/panel/audiomonitor/audiomonitor.h | 4 +- app/panel/curve/curve.cpp | 4 +- app/panel/curve/curve.h | 4 +- app/panel/footageviewer/footageviewer.cpp | 4 +- app/panel/footageviewer/footageviewer.h | 4 +- app/panel/node/node.cpp | 4 +- app/panel/node/node.h | 4 +- app/panel/panelmanager.cpp | 4 +- app/panel/panelmanager.h | 4 +- app/panel/param/param.cpp | 4 +- app/panel/param/param.h | 4 +- app/panel/pixelsampler/pixelsamplerpanel.cpp | 4 +- app/panel/pixelsampler/pixelsamplerpanel.h | 4 +- app/panel/project/footagemanagementpanel.h | 4 +- app/panel/project/project.cpp | 4 +- app/panel/project/project.h | 6 +- app/panel/scope/scope.cpp | 4 +- app/panel/scope/scope.h | 4 +- app/panel/sequenceviewer/sequenceviewer.cpp | 4 +- app/panel/sequenceviewer/sequenceviewer.h | 4 +- app/panel/table/table.cpp | 4 +- app/panel/table/table.h | 4 +- app/panel/taskmanager/taskmanager.cpp | 4 +- app/panel/taskmanager/taskmanager.h | 4 +- app/panel/timebased/timebased.cpp | 4 +- app/panel/timebased/timebased.h | 4 +- app/panel/timeline/timeline.cpp | 4 +- app/panel/timeline/timeline.h | 4 +- app/panel/tool/tool.cpp | 4 +- app/panel/tool/tool.h | 4 +- app/panel/viewer/viewer.cpp | 4 +- app/panel/viewer/viewer.h | 4 +- app/panel/viewer/viewerbase.cpp | 4 +- app/panel/viewer/viewerbase.h | 4 +- app/project/item/folder/folder.cpp | 4 +- app/project/item/folder/folder.h | 4 +- app/project/item/footage/audiostream.cpp | 4 +- app/project/item/footage/audiostream.h | 4 +- app/project/item/footage/footage.cpp | 4 +- app/project/item/footage/footage.h | 4 +- app/project/item/footage/stream.cpp | 4 +- app/project/item/footage/stream.h | 6 +- app/project/item/footage/videostream.cpp | 4 +- app/project/item/footage/videostream.h | 4 +- app/project/item/item.cpp | 4 +- app/project/item/item.h | 4 +- app/project/item/sequence/sequence.cpp | 4 +- app/project/item/sequence/sequence.h | 4 +- app/project/project.cpp | 4 +- app/project/project.h | 4 +- app/project/projectviewmodel.cpp | 4 +- app/project/projectviewmodel.h | 4 +- app/render/audioparams.cpp | 4 +- app/render/audioparams.h | 6 +- app/render/audioplaybackcache.cpp | 4 +- app/render/audioplaybackcache.h | 4 +- app/render/color.cpp | 6 +- app/render/color.h | 8 +- app/render/colormanager.cpp | 4 +- app/render/colormanager.h | 4 +- app/render/colorprocessor.cpp | 4 +- app/render/colorprocessor.h | 6 +- app/render/colorprocessorcache.h | 4 +- app/render/colortransform.h | 4 +- app/render/diskmanager.cpp | 4 +- app/render/diskmanager.h | 4 +- app/render/framehashcache.cpp | 4 +- app/render/framehashcache.h | 6 +- app/render/job/acceleratedjob.h | 4 +- app/render/job/generatejob.h | 6 +- app/render/job/samplejob.h | 6 +- app/render/job/shaderjob.h | 6 +- app/render/managedcolor.cpp | 4 +- app/render/managedcolor.h | 4 +- app/render/opengl/openglrenderer.cpp | 4 +- app/render/opengl/openglrenderer.h | 22 +- app/render/playbackcache.cpp | 4 +- app/render/playbackcache.h | 12 +- app/render/previewautocacher.cpp | 4 +- app/render/previewautocacher.h | 8 +- app/render/rendercache.h | 4 +- app/render/renderer.cpp | 4 +- app/render/renderer.h | 28 +- app/render/rendererthreadwrapper.cpp | 4 +- app/render/rendererthreadwrapper.h | 20 +- app/render/rendermanager.cpp | 4 +- app/render/rendermanager.h | 6 +- app/render/rendermodes.h | 4 +- app/render/renderprocessor.cpp | 4 +- app/render/renderprocessor.h | 6 +- app/render/shadercode.h | 4 +- app/render/shadervalue.h | 4 +- app/render/stillimagecache.h | 4 +- app/render/texture.cpp | 4 +- app/render/texture.h | 6 +- app/render/videoparams.cpp | 4 +- app/render/videoparams.h | 8 +- app/task/conform/conform.cpp | 4 +- app/task/conform/conform.h | 4 +- app/task/export/export.cpp | 4 +- app/task/export/export.h | 4 +- app/task/export/exportparams.cpp | 4 +- app/task/export/exportparams.h | 4 +- app/task/precache/precachetask.cpp | 4 +- app/task/precache/precachetask.h | 4 +- app/task/project/import/import.cpp | 4 +- app/task/project/import/import.h | 4 +- app/task/project/import/importerrordialog.cpp | 4 +- app/task/project/import/importerrordialog.h | 4 +- app/task/project/load/load.cpp | 4 +- app/task/project/load/load.h | 4 +- app/task/project/load/loadbasetask.cpp | 4 +- app/task/project/load/loadbasetask.h | 4 +- app/task/project/loadotio/loadotio.cpp | 4 +- app/task/project/loadotio/loadotio.h | 4 +- app/task/project/save/save.cpp | 4 +- app/task/project/save/save.h | 4 +- app/task/project/saveotio/saveotio.cpp | 4 +- app/task/project/saveotio/saveotio.h | 4 +- app/task/render/render.cpp | 4 +- app/task/render/render.h | 4 +- app/task/task.h | 4 +- app/task/taskmanager.cpp | 4 +- app/task/taskmanager.h | 4 +- app/threading/threadpool.cpp | 4 +- app/threading/threadpool.h | 6 +- app/threading/threadticket.cpp | 4 +- app/threading/threadticket.h | 6 +- app/threading/threadticketwatcher.cpp | 4 +- app/threading/threadticketwatcher.h | 4 +- app/timeline/timelinecommon.h | 4 +- app/timeline/timelinecoordinate.cpp | 4 +- app/timeline/timelinecoordinate.h | 4 +- app/timeline/timelinemarker.cpp | 4 +- app/timeline/timelinemarker.h | 4 +- app/timeline/timelinepoints.cpp | 4 +- app/timeline/timelinepoints.h | 4 +- app/timeline/timelineworkarea.cpp | 4 +- app/timeline/timelineworkarea.h | 4 +- app/timeline/trackreference.cpp | 4 +- app/timeline/trackreference.h | 4 +- app/tool/tool.h | 4 +- app/ts/en_US.ts | 1195 +++++++++-------- app/ui/icons/icons.cpp | 4 +- app/ui/icons/icons.h | 4 +- app/ui/style/style.cpp | 4 +- app/ui/style/style.h | 4 +- app/undo/undocommand.cpp | 4 +- app/undo/undocommand.h | 4 +- app/undo/undostack.cpp | 4 +- app/undo/undostack.h | 4 +- app/widget/audiomonitor/audiomonitor.cpp | 4 +- app/widget/audiomonitor/audiomonitor.h | 4 +- app/widget/clickablelabel/clickablelabel.cpp | 4 +- app/widget/clickablelabel/clickablelabel.h | 4 +- app/widget/collapsebutton/collapsebutton.cpp | 4 +- app/widget/collapsebutton/collapsebutton.h | 4 +- app/widget/colorbutton/colorbutton.cpp | 6 +- app/widget/colorbutton/colorbutton.h | 4 +- app/widget/colorwheel/colorgradientwidget.cpp | 4 +- app/widget/colorwheel/colorgradientwidget.h | 4 +- app/widget/colorwheel/colorpreviewbox.cpp | 4 +- app/widget/colorwheel/colorpreviewbox.h | 4 +- app/widget/colorwheel/colorspacechooser.cpp | 4 +- app/widget/colorwheel/colorspacechooser.h | 4 +- app/widget/colorwheel/colorswatchwidget.cpp | 4 +- app/widget/colorwheel/colorswatchwidget.h | 4 +- app/widget/colorwheel/colorvalueswidget.cpp | 4 +- app/widget/colorwheel/colorvalueswidget.h | 4 +- app/widget/colorwheel/colorwheelwidget.cpp | 4 +- app/widget/colorwheel/colorwheelwidget.h | 4 +- .../columnedgridlayout/columnedgridlayout.cpp | 4 +- .../columnedgridlayout/columnedgridlayout.h | 4 +- .../curvewidget/beziercontrolpointitem.cpp | 4 +- .../curvewidget/beziercontrolpointitem.h | 4 +- app/widget/curvewidget/curveview.cpp | 4 +- app/widget/curvewidget/curveview.h | 4 +- app/widget/curvewidget/curvewidget.cpp | 4 +- app/widget/curvewidget/curvewidget.h | 4 +- .../focusablelineedit/focusablelineedit.cpp | 4 +- .../focusablelineedit/focusablelineedit.h | 4 +- .../footagecombobox/footagecombobox.cpp | 4 +- app/widget/footagecombobox/footagecombobox.h | 4 +- app/widget/keyframeview/keyframeview.cpp | 4 +- app/widget/keyframeview/keyframeview.h | 4 +- app/widget/keyframeview/keyframeviewbase.cpp | 4 +- app/widget/keyframeview/keyframeviewbase.h | 4 +- app/widget/keyframeview/keyframeviewitem.cpp | 4 +- app/widget/keyframeview/keyframeviewitem.h | 4 +- app/widget/keyframeview/keyframeviewundo.cpp | 4 +- app/widget/keyframeview/keyframeviewundo.h | 4 +- app/widget/manageddisplay/manageddisplay.cpp | 4 +- app/widget/manageddisplay/manageddisplay.h | 4 +- app/widget/menu/menu.cpp | 4 +- app/widget/menu/menu.h | 4 +- app/widget/menu/menushared.cpp | 4 +- app/widget/menu/menushared.h | 4 +- app/widget/nodecombobox/nodecombobox.cpp | 4 +- app/widget/nodecombobox/nodecombobox.h | 4 +- app/widget/nodecopypaste/nodecopypaste.cpp | 4 +- app/widget/nodecopypaste/nodecopypaste.h | 4 +- app/widget/nodeparamview/nodeparamview.cpp | 4 +- app/widget/nodeparamview/nodeparamview.h | 4 +- .../nodeparamviewarraywidget.cpp | 4 +- .../nodeparamview/nodeparamviewarraywidget.h | 4 +- .../nodeparamviewconnectedlabel.cpp | 4 +- .../nodeparamviewconnectedlabel.h | 4 +- .../nodeparamview/nodeparamviewitem.cpp | 4 +- app/widget/nodeparamview/nodeparamviewitem.h | 4 +- .../nodeparamviewkeyframecontrol.cpp | 4 +- .../nodeparamviewkeyframecontrol.h | 4 +- .../nodeparamview/nodeparamviewrichtext.cpp | 4 +- .../nodeparamview/nodeparamviewrichtext.h | 4 +- .../nodeparamview/nodeparamviewundo.cpp | 4 +- app/widget/nodeparamview/nodeparamviewundo.h | 4 +- .../nodeparamviewwidgetbridge.cpp | 4 +- .../nodeparamview/nodeparamviewwidgetbridge.h | 4 +- .../nodetableview/nodetabletraverser.cpp | 4 +- app/widget/nodetableview/nodetabletraverser.h | 4 +- app/widget/nodetableview/nodetableview.cpp | 4 +- app/widget/nodetableview/nodetableview.h | 4 +- app/widget/nodetableview/nodetablewidget.cpp | 4 +- app/widget/nodetableview/nodetablewidget.h | 4 +- app/widget/nodetreeview/nodetreeview.cpp | 4 +- app/widget/nodetreeview/nodetreeview.h | 4 +- app/widget/nodeview/nodeview.cpp | 4 +- app/widget/nodeview/nodeview.h | 4 +- app/widget/nodeview/nodeviewcommon.h | 4 +- app/widget/nodeview/nodeviewedge.cpp | 4 +- app/widget/nodeview/nodeviewedge.h | 4 +- app/widget/nodeview/nodeviewitem.cpp | 4 +- app/widget/nodeview/nodeviewitem.h | 4 +- app/widget/nodeview/nodeviewscene.cpp | 4 +- app/widget/nodeview/nodeviewscene.h | 4 +- app/widget/nodeview/nodeviewundo.cpp | 4 +- app/widget/nodeview/nodeviewundo.h | 4 +- app/widget/panel/panel.cpp | 4 +- app/widget/panel/panel.h | 4 +- app/widget/path/pathwidget.cpp | 4 +- app/widget/path/pathwidget.h | 4 +- app/widget/pixelsampler/pixelsampler.cpp | 4 +- app/widget/pixelsampler/pixelsampler.h | 4 +- app/widget/playbackcontrols/dragbutton.cpp | 4 +- app/widget/playbackcontrols/dragbutton.h | 4 +- .../playbackcontrols/playbackcontrols.cpp | 4 +- .../playbackcontrols/playbackcontrols.h | 4 +- .../projectexplorer/projectexplorer.cpp | 4 +- app/widget/projectexplorer/projectexplorer.h | 4 +- .../projectexplorericonview.cpp | 4 +- .../projectexplorer/projectexplorericonview.h | 4 +- .../projectexplorericonviewitemdelegate.cpp | 4 +- .../projectexplorericonviewitemdelegate.h | 4 +- .../projectexplorerlistview.cpp | 4 +- .../projectexplorer/projectexplorerlistview.h | 4 +- .../projectexplorerlistviewbase.cpp | 4 +- .../projectexplorerlistviewbase.h | 4 +- .../projectexplorerlistviewitemdelegate.cpp | 4 +- .../projectexplorerlistviewitemdelegate.h | 4 +- .../projectexplorernavigation.cpp | 4 +- .../projectexplorernavigation.h | 4 +- .../projectexplorertreeview.cpp | 4 +- .../projectexplorer/projectexplorertreeview.h | 4 +- .../projectexplorer/projectexplorerundo.cpp | 4 +- .../projectexplorer/projectexplorerundo.h | 4 +- app/widget/projecttoolbar/projecttoolbar.cpp | 4 +- app/widget/projecttoolbar/projecttoolbar.h | 4 +- .../resizablescrollbar/resizablescrollbar.cpp | 4 +- .../resizablescrollbar/resizablescrollbar.h | 4 +- app/widget/scope/histogram/histogram.cpp | 4 +- app/widget/scope/histogram/histogram.h | 4 +- app/widget/scope/scopebase/scopebase.cpp | 4 +- app/widget/scope/scopebase/scopebase.h | 4 +- app/widget/scope/waveform/waveform.cpp | 4 +- app/widget/scope/waveform/waveform.h | 4 +- app/widget/slider/floatslider.cpp | 4 +- app/widget/slider/floatslider.h | 4 +- app/widget/slider/integerslider.cpp | 4 +- app/widget/slider/integerslider.h | 4 +- app/widget/slider/sliderbase.cpp | 4 +- app/widget/slider/sliderbase.h | 4 +- app/widget/slider/sliderlabel.cpp | 4 +- app/widget/slider/sliderlabel.h | 4 +- app/widget/slider/sliderladder.cpp | 4 +- app/widget/slider/sliderladder.h | 4 +- app/widget/slider/stringslider.cpp | 4 +- app/widget/slider/stringslider.h | 4 +- app/widget/slider/timeslider.cpp | 4 +- app/widget/slider/timeslider.h | 4 +- .../standardcombos/channellayoutcombobox.h | 4 +- app/widget/standardcombos/frameratecombobox.h | 4 +- .../standardcombos/interlacedcombobox.h | 4 +- .../standardcombos/pixelaspectratiocombobox.h | 4 +- .../standardcombos/pixelformatcombobox.h | 4 +- .../standardcombos/sampleratecombobox.h | 4 +- .../standardcombos/videodividercombobox.h | 4 +- app/widget/taskview/elapsedcounterwidget.cpp | 4 +- app/widget/taskview/elapsedcounterwidget.h | 4 +- app/widget/taskview/taskview.cpp | 4 +- app/widget/taskview/taskview.h | 4 +- app/widget/taskview/taskviewitem.cpp | 4 +- app/widget/taskview/taskviewitem.h | 4 +- app/widget/timebased/timebased.cpp | 4 +- app/widget/timebased/timebased.h | 4 +- app/widget/timelinewidget/snapservice.h | 4 +- .../timelinewidget/timelineandtrackview.cpp | 4 +- .../timelinewidget/timelineandtrackview.h | 4 +- .../timelinewidget/timelinescaledobject.cpp | 4 +- .../timelinewidget/timelinescaledobject.h | 4 +- app/widget/timelinewidget/timelinewidget.cpp | 28 +- app/widget/timelinewidget/timelinewidget.h | 4 +- .../timelinewidgetselections.cpp | 4 +- .../timelinewidget/timelinewidgetselections.h | 4 +- app/widget/timelinewidget/tool/add.cpp | 30 +- app/widget/timelinewidget/tool/add.h | 4 +- app/widget/timelinewidget/tool/beam.cpp | 4 +- app/widget/timelinewidget/tool/beam.h | 4 +- app/widget/timelinewidget/tool/edit.cpp | 4 +- app/widget/timelinewidget/tool/edit.h | 4 +- app/widget/timelinewidget/tool/import.cpp | 4 +- app/widget/timelinewidget/tool/import.h | 4 +- app/widget/timelinewidget/tool/pointer.cpp | 4 +- app/widget/timelinewidget/tool/pointer.h | 4 +- app/widget/timelinewidget/tool/razor.cpp | 4 +- app/widget/timelinewidget/tool/razor.h | 4 +- app/widget/timelinewidget/tool/ripple.cpp | 4 +- app/widget/timelinewidget/tool/ripple.h | 4 +- app/widget/timelinewidget/tool/rolling.cpp | 4 +- app/widget/timelinewidget/tool/rolling.h | 4 +- app/widget/timelinewidget/tool/slide.cpp | 4 +- app/widget/timelinewidget/tool/slide.h | 4 +- app/widget/timelinewidget/tool/slip.cpp | 4 +- app/widget/timelinewidget/tool/slip.h | 4 +- app/widget/timelinewidget/tool/tool.cpp | 4 +- app/widget/timelinewidget/tool/tool.h | 4 +- app/widget/timelinewidget/tool/transition.cpp | 4 +- app/widget/timelinewidget/tool/transition.h | 4 +- app/widget/timelinewidget/tool/zoom.cpp | 4 +- app/widget/timelinewidget/tool/zoom.h | 4 +- .../timelinewidget/trackview/trackview.cpp | 4 +- .../timelinewidget/trackview/trackview.h | 4 +- .../trackview/trackviewitem.cpp | 4 +- .../timelinewidget/trackview/trackviewitem.h | 4 +- .../trackview/trackviewsplitter.cpp | 4 +- .../trackview/trackviewsplitter.h | 4 +- app/widget/timelinewidget/undo/undo.cpp | 4 +- app/widget/timelinewidget/undo/undo.h | 4 +- .../timelinewidget/view/handmovableview.cpp | 4 +- .../timelinewidget/view/handmovableview.h | 4 +- .../timelinewidget/view/timelineview.cpp | 4 +- app/widget/timelinewidget/view/timelineview.h | 4 +- .../timelinewidget/view/timelineviewbase.cpp | 4 +- .../timelinewidget/view/timelineviewbase.h | 4 +- .../view/timelineviewblockitem.cpp | 4 +- .../view/timelineviewblockitem.h | 4 +- .../view/timelineviewghostitem.cpp | 4 +- .../view/timelineviewghostitem.h | 4 +- .../view/timelineviewmouseevent.cpp | 4 +- .../view/timelineviewmouseevent.h | 4 +- .../timelinewidget/view/timelineviewrect.cpp | 4 +- .../timelinewidget/view/timelineviewrect.h | 4 +- app/widget/timeruler/seekablewidget.cpp | 4 +- app/widget/timeruler/seekablewidget.h | 4 +- app/widget/timeruler/timeruler.cpp | 4 +- app/widget/timeruler/timeruler.h | 4 +- app/widget/timetarget/timetarget.cpp | 4 +- app/widget/timetarget/timetarget.h | 4 +- app/widget/toolbar/toolbar.cpp | 4 +- app/widget/toolbar/toolbar.h | 4 +- app/widget/toolbar/toolbarbutton.cpp | 4 +- app/widget/toolbar/toolbarbutton.h | 4 +- app/widget/viewer/audiowaveformview.cpp | 4 +- app/widget/viewer/audiowaveformview.h | 4 +- app/widget/viewer/footageviewer.cpp | 4 +- app/widget/viewer/footageviewer.h | 4 +- app/widget/viewer/gizmotraverser.cpp | 4 +- app/widget/viewer/gizmotraverser.h | 4 +- app/widget/viewer/viewer.cpp | 4 +- app/widget/viewer/viewer.h | 8 +- app/widget/viewer/viewerdisplay.cpp | 4 +- app/widget/viewer/viewerdisplay.h | 4 +- app/widget/viewer/viewerplaybacktimer.cpp | 4 +- app/widget/viewer/viewerplaybacktimer.h | 4 +- app/widget/viewer/viewerqueue.h | 4 +- app/widget/viewer/viewersafemargininfo.h | 4 +- app/widget/viewer/viewersizer.cpp | 4 +- app/widget/viewer/viewersizer.h | 4 +- app/widget/viewer/viewerwindow.cpp | 4 +- app/widget/viewer/viewerwindow.h | 4 +- app/window/mainwindow/mainmenu.cpp | 4 +- app/window/mainwindow/mainmenu.h | 4 +- app/window/mainwindow/mainstatusbar.cpp | 4 +- app/window/mainwindow/mainstatusbar.h | 4 +- app/window/mainwindow/mainwindow.cpp | 4 +- app/window/mainwindow/mainwindow.h | 4 +- .../mainwindow/mainwindowlayoutinfo.cpp | 4 +- app/window/mainwindow/mainwindowlayoutinfo.h | 6 +- 626 files changed, 1971 insertions(+), 1972 deletions(-) diff --git a/app/audio/audiomanager.cpp b/app/audio/audiomanager.cpp index 820c77add..d4716a7f9 100644 --- a/app/audio/audiomanager.cpp +++ b/app/audio/audiomanager.cpp @@ -24,7 +24,7 @@ #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { AudioManager* AudioManager::instance_ = nullptr; @@ -268,4 +268,4 @@ void AudioManager::InputDevicesRefreshed() emit InputListReady(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/audio/audiomanager.h b/app/audio/audiomanager.h index 381d0a533..26503e26c 100644 --- a/app/audio/audiomanager.h +++ b/app/audio/audiomanager.h @@ -32,7 +32,7 @@ #include "render/audioparams.h" #include "render/audioplaybackcache.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Audio input and output management class @@ -124,6 +124,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOMANAGER_H diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index d8ba57e6c..2fc07b683 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -24,7 +24,7 @@ #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const int AudioVisualWaveform::kSumSampleRate = 200; @@ -330,4 +330,4 @@ void AudioVisualWaveform::ExpandMinMax(AudioVisualWaveform::SamplePerChannel &su } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/audio/audiovisualwaveform.h b/app/audio/audiovisualwaveform.h index fef95be1a..759f71385 100644 --- a/app/audio/audiovisualwaveform.h +++ b/app/audio/audiovisualwaveform.h @@ -27,7 +27,7 @@ #include "codec/samplebuffer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A buffer of data used to store a visual representation of audio @@ -108,8 +108,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::AudioVisualWaveform) +Q_DECLARE_METATYPE(olive::AudioVisualWaveform) #endif // SUMSAMPLES_H diff --git a/app/audio/outputdeviceproxy.cpp b/app/audio/outputdeviceproxy.cpp index 039934905..d7c77caa0 100644 --- a/app/audio/outputdeviceproxy.cpp +++ b/app/audio/outputdeviceproxy.cpp @@ -22,7 +22,7 @@ #include "audiomanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { AudioOutputDeviceProxy::AudioOutputDeviceProxy(QObject *parent) : QIODevice(parent), @@ -137,4 +137,4 @@ qint64 AudioOutputDeviceProxy::ReverseAwareRead(char *data, qint64 maxlen) return read_count; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/audio/outputdeviceproxy.h b/app/audio/outputdeviceproxy.h index 93ebca282..5767d97c4 100644 --- a/app/audio/outputdeviceproxy.h +++ b/app/audio/outputdeviceproxy.h @@ -26,7 +26,7 @@ #include "common/define.h" #include "tempoprocessor.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief QIODevice wrapper that can adjust speed/reverse an audio file @@ -61,6 +61,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOOUTPUTDEVICEPROXY_H diff --git a/app/audio/outputmanager.cpp b/app/audio/outputmanager.cpp index 415fc4487..42afd5f2a 100644 --- a/app/audio/outputmanager.cpp +++ b/app/audio/outputmanager.cpp @@ -25,7 +25,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { AudioOutputManager::AudioOutputManager(QObject *parent) : QObject(parent), @@ -151,4 +151,4 @@ void AudioOutputManager::OutputStateChanged(QAudio::State state) qDebug() << state << output_->error(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/audio/outputmanager.h b/app/audio/outputmanager.h index 01d11a208..8c29ef299 100644 --- a/app/audio/outputmanager.h +++ b/app/audio/outputmanager.h @@ -30,7 +30,7 @@ #include "outputdeviceproxy.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AudioOutputManager : public QObject { @@ -59,7 +59,7 @@ public slots: void ResetToPushMode(); // Queued - void SetParameters(OLIVE_NAMESPACE::AudioParams params); + void SetParameters(olive::AudioParams params); // Queued void Close(); @@ -84,6 +84,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOHYBRIDDEVICE_H diff --git a/app/audio/tempoprocessor.cpp b/app/audio/tempoprocessor.cpp index 1ffd1dbac..444acece3 100644 --- a/app/audio/tempoprocessor.cpp +++ b/app/audio/tempoprocessor.cpp @@ -30,7 +30,7 @@ extern "C" { #include "common/ffmpegutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TempoProcessor::TempoProcessor() : filter_graph_(nullptr), @@ -274,4 +274,4 @@ AVFilterContext *TempoProcessor::CreateTempoFilter(AVFilterGraph* graph, AVFilte return nullptr; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/audio/tempoprocessor.h b/app/audio/tempoprocessor.h index eff244bf4..53d5ee96b 100644 --- a/app/audio/tempoprocessor.h +++ b/app/audio/tempoprocessor.h @@ -35,7 +35,7 @@ extern "C" { #include "render/audioparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TempoProcessor { @@ -78,6 +78,6 @@ private: bool flushed_; }; -OLIVE_NAMESPACE_EXIT +} #endif // TEMPOPROCESSOR_H diff --git a/app/cli/cliexport/cliexportmanager.cpp b/app/cli/cliexport/cliexportmanager.cpp index 195d9fdb2..f0bbaa0d4 100644 --- a/app/cli/cliexport/cliexportmanager.cpp +++ b/app/cli/cliexport/cliexportmanager.cpp @@ -20,11 +20,11 @@ #include "cliexportmanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { CLIExportManager::CLIExportManager() { } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/cli/cliexport/cliexportmanager.h b/app/cli/cliexport/cliexportmanager.h index a9d2afed7..7bfd9f14b 100644 --- a/app/cli/cliexport/cliexportmanager.h +++ b/app/cli/cliexport/cliexportmanager.h @@ -23,7 +23,7 @@ #include "task/export/export.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CLIExportManager : public QObject { @@ -31,6 +31,6 @@ public: CLIExportManager(); }; -OLIVE_NAMESPACE_EXIT +} #endif // CLIEXPORTMANAGER_H diff --git a/app/cli/cliprogress/cliprogressdialog.cpp b/app/cli/cliprogress/cliprogressdialog.cpp index ebd53ecf9..522b23e31 100644 --- a/app/cli/cliprogress/cliprogressdialog.cpp +++ b/app/cli/cliprogress/cliprogressdialog.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { CLIProgressDialog::CLIProgressDialog(const QString& title, QObject *parent) : QObject(parent), @@ -103,4 +103,4 @@ void CLIProgressDialog::SetProgress(double p) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/cli/cliprogress/cliprogressdialog.h b/app/cli/cliprogress/cliprogressdialog.h index ce1811e5f..c5874ed26 100644 --- a/app/cli/cliprogress/cliprogressdialog.h +++ b/app/cli/cliprogress/cliprogressdialog.h @@ -26,7 +26,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CLIProgressDialog : public QObject { @@ -47,6 +47,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // CLIPROGRESSDIALOG_H diff --git a/app/cli/clitask/clitaskdialog.cpp b/app/cli/clitask/clitaskdialog.cpp index 84f62e18b..b06c18a66 100644 --- a/app/cli/clitask/clitaskdialog.cpp +++ b/app/cli/clitask/clitaskdialog.cpp @@ -20,7 +20,7 @@ #include "clitaskdialog.h" -OLIVE_NAMESPACE_ENTER +namespace olive { CLITaskDialog::CLITaskDialog(Task *task, QObject* parent) : CLIProgressDialog(task->GetTitle(), parent), @@ -34,4 +34,4 @@ bool CLITaskDialog::Run() return task_->Start(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/cli/clitask/clitaskdialog.h b/app/cli/clitask/clitaskdialog.h index 69c161955..79a626900 100644 --- a/app/cli/clitask/clitaskdialog.h +++ b/app/cli/clitask/clitaskdialog.h @@ -24,7 +24,7 @@ #include "cli/cliprogress/cliprogressdialog.h" #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CLITaskDialog : public CLIProgressDialog { @@ -39,6 +39,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // CLITASKDIALOG_H diff --git a/app/codec/decoder.cpp b/app/codec/decoder.cpp index c6fcc4ece..26efa8ccc 100644 --- a/app/codec/decoder.cpp +++ b/app/codec/decoder.cpp @@ -37,7 +37,7 @@ #include "task/taskmanager.h" #include "project/project.h" -OLIVE_NAMESPACE_ENTER +namespace olive { QMutex Decoder::currently_conforming_mutex_; QWaitCondition Decoder::currently_conforming_wait_cond_; @@ -377,4 +377,4 @@ SampleBufferPtr Decoder::RetrieveAudioFromConform(const QString &conform_filenam return nullptr; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/decoder.h b/app/codec/decoder.h index 8e165b9c8..74137e33b 100644 --- a/app/codec/decoder.h +++ b/app/codec/decoder.h @@ -36,7 +36,7 @@ extern "C" { #include "common/rational.h" #include "project/item/footage/footage.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Decoder; using DecoderPtr = std::shared_ptr; @@ -248,8 +248,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::Decoder::RetrieveState) +Q_DECLARE_METATYPE(olive::Decoder::RetrieveState) #endif // DECODER_H diff --git a/app/codec/encoder.cpp b/app/codec/encoder.cpp index 189e4f939..fe7204c36 100644 --- a/app/codec/encoder.cpp +++ b/app/codec/encoder.cpp @@ -24,7 +24,7 @@ #include "ffmpeg/ffmpegencoder.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Encoder::Encoder(const EncodingParams ¶ms) : params_(params) @@ -236,4 +236,4 @@ Encoder* Encoder::CreateFromID(const QString &id, const EncodingParams& params) return new FFmpegEncoder(params); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/encoder.h b/app/codec/encoder.h index 47c9a0710..24ac3a84c 100644 --- a/app/codec/encoder.h +++ b/app/codec/encoder.h @@ -32,7 +32,7 @@ #include "render/audioparams.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Encoder; using EncoderPtr = std::shared_ptr; @@ -114,10 +114,10 @@ public: virtual bool Open() = 0; - virtual bool WriteFrame(OLIVE_NAMESPACE::FramePtr frame, OLIVE_NAMESPACE::rational time) = 0; - virtual void WriteAudio(OLIVE_NAMESPACE::AudioParams pcm_info, + virtual bool WriteFrame(olive::FramePtr frame, olive::rational time) = 0; + virtual void WriteAudio(olive::AudioParams pcm_info, QIODevice *file) = 0; - void WriteAudio(OLIVE_NAMESPACE::AudioParams pcm_info, + void WriteAudio(olive::AudioParams pcm_info, const QString& pcm_filename); virtual void Close() = 0; @@ -132,6 +132,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // ENCODER_H diff --git a/app/codec/exportcodec.cpp b/app/codec/exportcodec.cpp index 09d25800d..0654c5f78 100644 --- a/app/codec/exportcodec.cpp +++ b/app/codec/exportcodec.cpp @@ -25,7 +25,7 @@ extern "C" { #include } -OLIVE_NAMESPACE_ENTER +namespace olive { QString ExportCodec::GetCodecName(ExportCodec::Codec c) { @@ -125,4 +125,4 @@ QStringList ExportCodec::GetPixelFormatsForCodec(ExportCodec::Codec c) return pix_fmts; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/exportcodec.h b/app/codec/exportcodec.h index d0a57eb61..6f3e0c49e 100644 --- a/app/codec/exportcodec.h +++ b/app/codec/exportcodec.h @@ -26,7 +26,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ExportCodec : public QObject { @@ -57,6 +57,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // EXPORTCODEC_H diff --git a/app/codec/exportformat.cpp b/app/codec/exportformat.cpp index b241168fb..caeca6412 100644 --- a/app/codec/exportformat.cpp +++ b/app/codec/exportformat.cpp @@ -20,7 +20,7 @@ #include "exportformat.h" -OLIVE_NAMESPACE_ENTER +namespace olive { QString ExportFormat::GetName(olive::ExportFormat::Format f) { @@ -135,4 +135,4 @@ QList ExportFormat::GetAudioCodecs(ExportFormat::Format f) return {}; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/exportformat.h b/app/codec/exportformat.h index ca5ef1afe..eaaea84c5 100644 --- a/app/codec/exportformat.h +++ b/app/codec/exportformat.h @@ -27,7 +27,7 @@ #include "common/define.h" #include "exportcodec.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ExportFormat : public QObject { @@ -53,6 +53,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // EXPORTFORMAT_H diff --git a/app/codec/ffmpeg/avframeptr.h b/app/codec/ffmpeg/avframeptr.h index 8841b7c89..5660fd4b2 100644 --- a/app/codec/ffmpeg/avframeptr.h +++ b/app/codec/ffmpeg/avframeptr.h @@ -30,7 +30,7 @@ extern "C" { #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AVFrameWrapper { public: @@ -55,6 +55,6 @@ private: using AVFramePtr = std::shared_ptr; -OLIVE_NAMESPACE_EXIT +} #endif // AVFRAMEPTR_H diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index b17ff24f7..494e14827 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -45,7 +45,7 @@ extern "C" { #include "render/framehashcache.h" #include "render/diskmanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { FFmpegDecoder::FFmpegDecoder() : scale_ctx_(nullptr), @@ -1085,4 +1085,4 @@ void FFmpegDecoder::Instance::Seek(int64_t timestamp) av_seek_frame(fmt_ctx_, avstream_->index, timestamp, AVSEEK_FLAG_BACKWARD); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/ffmpeg/ffmpegdecoder.h b/app/codec/ffmpeg/ffmpegdecoder.h index 9861e0fdc..2634f06f4 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.h +++ b/app/codec/ffmpeg/ffmpegdecoder.h @@ -38,7 +38,7 @@ extern "C" { #include "ffmpegframepool.h" #include "project/item/footage/videostream.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A Decoder derivative that wraps FFmpeg functions as on Olive decoder @@ -162,6 +162,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // FFMPEGDECODER_H diff --git a/app/codec/ffmpeg/ffmpegencoder.cpp b/app/codec/ffmpeg/ffmpegencoder.cpp index 2c5001d4d..7b28558e1 100644 --- a/app/codec/ffmpeg/ffmpegencoder.cpp +++ b/app/codec/ffmpeg/ffmpegencoder.cpp @@ -28,7 +28,7 @@ extern "C" { #include "common/ffmpegutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { FFmpegEncoder::FFmpegEncoder(const EncodingParams ¶ms) : Encoder(params), @@ -634,4 +634,4 @@ void FFmpegEncoder::Error(const QString &s) Close(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/ffmpeg/ffmpegencoder.h b/app/codec/ffmpeg/ffmpegencoder.h index 46ddb2ae2..75e5b25bd 100644 --- a/app/codec/ffmpeg/ffmpegencoder.h +++ b/app/codec/ffmpeg/ffmpegencoder.h @@ -30,7 +30,7 @@ extern "C" { #include "codec/encoder.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FFmpegEncoder : public Encoder { @@ -40,9 +40,9 @@ public: virtual bool Open() override; - virtual bool WriteFrame(OLIVE_NAMESPACE::FramePtr frame, OLIVE_NAMESPACE::rational time) override; + virtual bool WriteFrame(olive::FramePtr frame, olive::rational time) override; - virtual void WriteAudio(OLIVE_NAMESPACE::AudioParams pcm_info, + virtual void WriteAudio(olive::AudioParams pcm_info, QIODevice *file) override; virtual void Close() override; @@ -97,6 +97,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // FFMPEGENCODER_H diff --git a/app/codec/ffmpeg/ffmpegframepool.cpp b/app/codec/ffmpeg/ffmpegframepool.cpp index e7ec89238..c4cfb3412 100644 --- a/app/codec/ffmpeg/ffmpegframepool.cpp +++ b/app/codec/ffmpeg/ffmpegframepool.cpp @@ -22,7 +22,7 @@ #include "codec/frame.h" -OLIVE_NAMESPACE_ENTER +namespace olive { FFmpegFramePool::FFmpegFramePool(int element_count) : MemoryPool(element_count), @@ -48,4 +48,4 @@ size_t FFmpegFramePool::GetElementSize() return Frame::generate_linesize_bytes(width_, format_, channel_count_) * height_; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/ffmpeg/ffmpegframepool.h b/app/codec/ffmpeg/ffmpegframepool.h index 189cec3a1..cffe58ab6 100644 --- a/app/codec/ffmpeg/ffmpegframepool.h +++ b/app/codec/ffmpeg/ffmpegframepool.h @@ -24,7 +24,7 @@ #include "common/memorypool.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FFmpegFramePool : public MemoryPool { @@ -57,6 +57,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // FFMPEGFRAMEPOOL_H diff --git a/app/codec/frame.cpp b/app/codec/frame.cpp index 42733c0b9..5bcb6041c 100644 --- a/app/codec/frame.cpp +++ b/app/codec/frame.cpp @@ -27,7 +27,7 @@ #include "common/oiioutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Frame::Frame() : timestamp_(0) @@ -129,4 +129,4 @@ FramePtr Frame::convert(VideoParams::Format format) const } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/frame.h b/app/codec/frame.h index 5dd763110..b9f7e3cb0 100644 --- a/app/codec/frame.h +++ b/app/codec/frame.h @@ -28,7 +28,7 @@ #include "render/color.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Frame; using FramePtr = std::shared_ptr; @@ -163,8 +163,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::FramePtr) +Q_DECLARE_METATYPE(olive::FramePtr) #endif // FRAME_H diff --git a/app/codec/oiio/oiiodecoder.cpp b/app/codec/oiio/oiiodecoder.cpp index 3cc893a15..7f4a280c1 100644 --- a/app/codec/oiio/oiiodecoder.cpp +++ b/app/codec/oiio/oiiodecoder.cpp @@ -31,7 +31,7 @@ #include "config/config.h" #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { QStringList OIIODecoder::supported_formats_; @@ -261,4 +261,4 @@ void OIIODecoder::CloseImageHandle() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/oiio/oiiodecoder.h b/app/codec/oiio/oiiodecoder.h index 767ba0e01..3a6398d45 100644 --- a/app/codec/oiio/oiiodecoder.h +++ b/app/codec/oiio/oiiodecoder.h @@ -26,7 +26,7 @@ #include "codec/decoder.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class OIIODecoder : public Decoder { @@ -72,6 +72,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // OIIODECODER_H diff --git a/app/codec/samplebuffer.cpp b/app/codec/samplebuffer.cpp index eb615cc75..dc5f3ffb8 100644 --- a/app/codec/samplebuffer.cpp +++ b/app/codec/samplebuffer.cpp @@ -20,7 +20,7 @@ #include "samplebuffer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SampleBuffer::SampleBuffer() : sample_count_per_channel_(0), @@ -310,4 +310,4 @@ void SampleBuffer::destroy_sample_buffer(float ***data, int nb_channels) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/samplebuffer.h b/app/codec/samplebuffer.h index b412c171c..984959788 100644 --- a/app/codec/samplebuffer.h +++ b/app/codec/samplebuffer.h @@ -25,7 +25,7 @@ #include "render/audioparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SampleBuffer; using SampleBufferPtr = std::shared_ptr; @@ -94,8 +94,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::SampleBufferPtr) +Q_DECLARE_METATYPE(olive::SampleBufferPtr) #endif // SAMPLEBUFFER_H diff --git a/app/codec/waveinput.cpp b/app/codec/waveinput.cpp index 43130b9c5..49de1eb59 100644 --- a/app/codec/waveinput.cpp +++ b/app/codec/waveinput.cpp @@ -27,7 +27,7 @@ extern "C" { #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { WaveInput::WaveInput(const QString &f) : file_(f) @@ -239,4 +239,4 @@ qint64 WaveInput::calculate_max_read() const return data_size_ - (file_.pos() - data_position_ ); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/waveinput.h b/app/codec/waveinput.h index ebb2f1fbc..51131891e 100644 --- a/app/codec/waveinput.h +++ b/app/codec/waveinput.h @@ -25,7 +25,7 @@ #include "render/audioparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class WaveInput { @@ -70,6 +70,6 @@ private: quint32 data_size_; }; -OLIVE_NAMESPACE_EXIT +} #endif // WAVEINPUT_H diff --git a/app/codec/waveoutput.cpp b/app/codec/waveoutput.cpp index 958180f1c..b6b858957 100644 --- a/app/codec/waveoutput.cpp +++ b/app/codec/waveoutput.cpp @@ -22,7 +22,7 @@ #include "render/audioparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const int16_t kWAVIntegerFormat = 1; const int16_t kWAVFloatFormat = 3; @@ -177,4 +177,4 @@ void WaveOutput::write_int(QFile *file, T integer) file->write(bytes); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/codec/waveoutput.h b/app/codec/waveoutput.h index f48490838..54ef72ed0 100644 --- a/app/codec/waveoutput.h +++ b/app/codec/waveoutput.h @@ -26,7 +26,7 @@ #include "render/audioparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class WaveOutput { @@ -63,6 +63,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // WAVEAUDIO_H diff --git a/app/common/autoscroll.h b/app/common/autoscroll.h index 19cd0a8dc..9d21a5df4 100644 --- a/app/common/autoscroll.h +++ b/app/common/autoscroll.h @@ -23,7 +23,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AutoScroll { public: @@ -34,6 +34,6 @@ public: }; }; -OLIVE_NAMESPACE_EXIT +} #endif // AUTOSCROLL_H diff --git a/app/common/bezier.cpp b/app/common/bezier.cpp index 926f10a49..11e7c4aac 100644 --- a/app/common/bezier.cpp +++ b/app/common/bezier.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { double Bezier::QuadraticXtoT(double x, double a, double b, double c) { @@ -63,4 +63,4 @@ double Bezier::CubicTtoY(double a, double b, double c, double d, double t) return qPow(1.0 - t, 3)*a + 3*qPow(1.0 - t, 2)*t*b + 3*(1.0 - t)*qPow(t, 2)*c + qPow(t, 3)*d; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/bezier.h b/app/common/bezier.h index c53838616..55cb7dd0f 100644 --- a/app/common/bezier.h +++ b/app/common/bezier.h @@ -23,7 +23,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Bezier { @@ -37,6 +37,6 @@ public: static double CubicTtoY(double a, double b, double c, double d, double t); }; -OLIVE_NAMESPACE_EXIT +} #endif // BEZIER_H diff --git a/app/common/cancelableobject.h b/app/common/cancelableobject.h index 310bf9098..25b42f143 100644 --- a/app/common/cancelableobject.h +++ b/app/common/cancelableobject.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CancelableObject { public: @@ -53,6 +53,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // CANCELABLEOBJECT_H diff --git a/app/common/crashpadinterface.cpp b/app/common/crashpadinterface.cpp index 61b8f9613..6014bd493 100644 --- a/app/common/crashpadinterface.cpp +++ b/app/common/crashpadinterface.cpp @@ -40,7 +40,7 @@ crashpad::CrashpadClient *client; QString GenerateReportPath() { - return QDir(OLIVE_NAMESPACE::FileFunctions::GetTempFilePath()).filePath(QStringLiteral("reports")); + return QDir(olive::FileFunctions::GetTempFilePath()).filePath(QStringLiteral("reports")); } base::FilePath GenerateReportPathForCrashpad() @@ -90,7 +90,7 @@ bool InitializeCrashpad() base::FilePath reports_dir = GenerateReportPathForCrashpad(); - base::FilePath metrics_dir(QSTRING_TO_BASE_STRING(QDir(OLIVE_NAMESPACE::FileFunctions::GetTempFilePath()).filePath(QStringLiteral("metrics")))); + base::FilePath metrics_dir(QSTRING_TO_BASE_STRING(QDir(olive::FileFunctions::GetTempFilePath()).filePath(QStringLiteral("metrics")))); // Metadata that will be posted to the server with the crash report map std::map annotations; diff --git a/app/common/debug.cpp b/app/common/debug.cpp index f859c8cee..195f74f4d 100644 --- a/app/common/debug.cpp +++ b/app/common/debug.cpp @@ -20,7 +20,7 @@ #include "debug.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void DebugHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { @@ -54,4 +54,4 @@ void DebugHandler(QtMsgType type, const QMessageLogContext &context, const QStri #endif } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/debug.h b/app/common/debug.h index 214ba376b..edb2aeb68 100644 --- a/app/common/debug.h +++ b/app/common/debug.h @@ -25,10 +25,10 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void DebugHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg); -OLIVE_NAMESPACE_EXIT +} #endif // DEBUG_H diff --git a/app/common/define.h b/app/common/define.h index d613f1480..6bc08b3a1 100644 --- a/app/common/define.h +++ b/app/common/define.h @@ -21,13 +21,7 @@ #ifndef OLIVECOMMONDEFINE_H #define OLIVECOMMONDEFINE_H -#define OLIVE_NAMESPACE olive - -#define OLIVE_NAMESPACE_ENTER namespace OLIVE_NAMESPACE { - -#define OLIVE_NAMESPACE_EXIT } - -OLIVE_NAMESPACE_ENTER +namespace olive { /// The minimum size an icon in ProjectExplorer can be const int kProjectIconSizeMinimum = 16; @@ -40,14 +34,14 @@ const int kProjectIconSizeDefault = 64; const int kBytesInGigabyte = 1073741824; -OLIVE_NAMESPACE_EXIT +} #define MACRO_NAME_AS_STR(s) #s #define MACRO_VAL_AS_STR(s) MACRO_NAME_AS_STR(s) -#define OLIVE_NS_CONST_ARG(x, y) QArgument("const " MACRO_VAL_AS_STR(OLIVE_NAMESPACE) "::" #x, y) -#define OLIVE_NS_ARG(x, y) QArgument(MACRO_VAL_AS_STR(OLIVE_NAMESPACE) "::" #x, y) -#define OLIVE_NS_RETURN_ARG(x, y) QReturnArgument(MACRO_VAL_AS_STR(OLIVE_NAMESPACE) "::" #x, y) +#define OLIVE_NS_CONST_ARG(x, y) QArgument("const " MACRO_VAL_AS_STR(olive) "::" #x, y) +#define OLIVE_NS_ARG(x, y) QArgument(MACRO_VAL_AS_STR(olive) "::" #x, y) +#define OLIVE_NS_RETURN_ARG(x, y) QReturnArgument(MACRO_VAL_AS_STR(olive) "::" #x, y) /** * Copy/move deleters. Similar to Q_DISABLE_COPY_MOVE, et al. but those functions are not present in Qt < 5.13 so we diff --git a/app/common/ffmpegutils.cpp b/app/common/ffmpegutils.cpp index bf335aa0c..46723e915 100644 --- a/app/common/ffmpegutils.cpp +++ b/app/common/ffmpegutils.cpp @@ -20,7 +20,7 @@ #include "common/ffmpegutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { AVPixelFormat FFmpegUtils::GetCompatiblePixelFormat(const AVPixelFormat &pix_fmt) { @@ -138,4 +138,4 @@ VideoParams::Format FFmpegUtils::GetCompatiblePixelFormat(const VideoParams::For return VideoParams::kFormatInvalid; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/ffmpegutils.h b/app/common/ffmpegutils.h index c4aa4667c..e40cf1c6d 100644 --- a/app/common/ffmpegutils.h +++ b/app/common/ffmpegutils.h @@ -28,7 +28,7 @@ extern "C" { #include "render/audioparams.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FFmpegUtils { public: @@ -58,6 +58,6 @@ public: static AVSampleFormat GetFFmpegSampleFormat(const AudioParams::Format &smp_fmt); }; -OLIVE_NAMESPACE_EXIT +} #endif // FFMPEGABSTRACTION_H diff --git a/app/common/filefunctions.cpp b/app/common/filefunctions.cpp index d6c480abb..8314acb4c 100644 --- a/app/common/filefunctions.cpp +++ b/app/common/filefunctions.cpp @@ -29,7 +29,7 @@ #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { QString FileFunctions::GetUniqueFileIdentifier(const QString &filename) { @@ -240,4 +240,4 @@ bool FileFunctions::RenameFileAllowOverwrite(const QString &from, const QString return true; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/filefunctions.h b/app/common/filefunctions.h index c883da0a0..124d42b17 100644 --- a/app/common/filefunctions.h +++ b/app/common/filefunctions.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A collection of static file and directory functions @@ -88,6 +88,6 @@ public: -OLIVE_NAMESPACE_EXIT +} #endif // FILEFUNCTIONS_H diff --git a/app/common/flipmodifiers.cpp b/app/common/flipmodifiers.cpp index e43146606..e126bae16 100644 --- a/app/common/flipmodifiers.cpp +++ b/app/common/flipmodifiers.cpp @@ -20,7 +20,7 @@ #include "flipmodifiers.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Qt::KeyboardModifiers FlipControlAndShiftModifiers(Qt::KeyboardModifiers e) { if (e & Qt::ControlModifier & Qt::ShiftModifier) { @@ -38,4 +38,4 @@ Qt::KeyboardModifiers FlipControlAndShiftModifiers(Qt::KeyboardModifiers e) { return e; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/flipmodifiers.h b/app/common/flipmodifiers.h index c8d508b65..010b13058 100644 --- a/app/common/flipmodifiers.h +++ b/app/common/flipmodifiers.h @@ -25,10 +25,10 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Qt::KeyboardModifiers FlipControlAndShiftModifiers(Qt::KeyboardModifiers e); -OLIVE_NAMESPACE_EXIT +} #endif // FLIPMODIFIERS_H diff --git a/app/common/memorypool.cpp b/app/common/memorypool.cpp index f88ba8d46..31e987e73 100644 --- a/app/common/memorypool.cpp +++ b/app/common/memorypool.cpp @@ -1,6 +1,6 @@ #include "memorypool.h" -OLIVE_NAMESPACE_ENTER +namespace olive { size_t memory_pool_consumption = 0; QMutex memory_pool_consumption_lock; @@ -11,4 +11,4 @@ bool MemoryPoolLimitReached() return (memory_pool_consumption >= 2147483648); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/memorypool.h b/app/common/memorypool.h index b5d75bbbd..cc54db121 100644 --- a/app/common/memorypool.h +++ b/app/common/memorypool.h @@ -30,7 +30,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { extern size_t memory_pool_consumption; extern QMutex memory_pool_consumption_lock; @@ -397,6 +397,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // MEMORYPOOL_H diff --git a/app/common/ocioutils.cpp b/app/common/ocioutils.cpp index 6750a6f09..4b7a8a306 100644 --- a/app/common/ocioutils.cpp +++ b/app/common/ocioutils.cpp @@ -20,7 +20,7 @@ #include "ocioutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { OCIO::BitDepth OCIOUtils::GetOCIOBitDepthFromPixelFormat(VideoParams::Format format) { @@ -44,4 +44,4 @@ OCIO::BitDepth OCIOUtils::GetOCIOBitDepthFromPixelFormat(VideoParams::Format for return OCIO::BIT_DEPTH_UNKNOWN; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/ocioutils.h b/app/common/ocioutils.h index 788c4ea7c..d7fb0c977 100644 --- a/app/common/ocioutils.h +++ b/app/common/ocioutils.h @@ -26,7 +26,7 @@ namespace OCIO = OpenColorIO_v2_0dev; #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class OCIOUtils { @@ -34,6 +34,6 @@ public: static OCIO::BitDepth GetOCIOBitDepthFromPixelFormat(VideoParams::Format format); }; -OLIVE_NAMESPACE_EXIT +} #endif // OCIOUTILS_H diff --git a/app/common/oiioutils.cpp b/app/common/oiioutils.cpp index 38452fd27..f98b435b4 100644 --- a/app/common/oiioutils.cpp +++ b/app/common/oiioutils.cpp @@ -20,7 +20,7 @@ #include "oiioutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void OIIOUtils::FrameToBuffer(const Frame* frame, OIIO::ImageBuf *buf) { @@ -117,4 +117,4 @@ VideoParams::Format OIIOUtils::GetFormatFromOIIOBasetype(OIIO::TypeDesc::BASETYP return VideoParams::kFormatInvalid; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/oiioutils.h b/app/common/oiioutils.h index 8c52a54a7..68677df8f 100644 --- a/app/common/oiioutils.h +++ b/app/common/oiioutils.h @@ -27,7 +27,7 @@ #include "codec/frame.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class OIIOUtils { public: @@ -60,6 +60,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // OIIOUTILS_H diff --git a/app/common/power.h b/app/common/power.h index 2ecf12578..6ecebaf62 100644 --- a/app/common/power.h +++ b/app/common/power.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { uint32_t ceil_to_power_of_2(uint32_t v) { @@ -51,6 +51,6 @@ uint32_t floor_to_power_of_2(uint32_t x) return x - (x >> 1); } -OLIVE_NAMESPACE_EXIT +} #endif // POWER_H diff --git a/app/common/qtutils.cpp b/app/common/qtutils.cpp index a6a15b60c..225a7b7e3 100644 --- a/app/common/qtutils.cpp +++ b/app/common/qtutils.cpp @@ -20,7 +20,7 @@ #include "qtutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { int QtUtils::QFontMetricsWidth(QFontMetrics fm, const QString& s) { #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0) @@ -38,4 +38,4 @@ QFrame *QtUtils::CreateHorizontalLine() return horizontal_line; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/qtutils.h b/app/common/qtutils.h index 12b70a17a..d01ba1f03 100644 --- a/app/common/qtutils.h +++ b/app/common/qtutils.h @@ -32,7 +32,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class QtUtils { public: @@ -49,6 +49,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // QTVERSIONABSTRACTION_H diff --git a/app/common/ratiodialog.cpp b/app/common/ratiodialog.cpp index d1bb98449..20e64bc43 100644 --- a/app/common/ratiodialog.cpp +++ b/app/common/ratiodialog.cpp @@ -23,7 +23,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { double GetFloatRatioFromUser(QWidget* parent, const QString& title, @@ -88,4 +88,4 @@ double GetFloatRatioFromUser(QWidget* parent, } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/ratiodialog.h b/app/common/ratiodialog.h index 10c44f899..8d09b583b 100644 --- a/app/common/ratiodialog.h +++ b/app/common/ratiodialog.h @@ -25,12 +25,12 @@ #include "common/rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { double GetFloatRatioFromUser(QWidget* parent, const QString& title, bool* ok_in); -OLIVE_NAMESPACE_EXIT +} #endif // RATIODIALOG_H diff --git a/app/common/rational.cpp b/app/common/rational.cpp index 2160e3f0e..fa4bfd133 100644 --- a/app/common/rational.cpp +++ b/app/common/rational.cpp @@ -3,7 +3,7 @@ #include "rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { rational rational::fromDouble(const double &flt) { @@ -391,9 +391,9 @@ uint qHash(const rational &r, uint seed) return ::qHash(r.toDouble(), seed); } -OLIVE_NAMESPACE_EXIT +} -QDebug operator<<(QDebug debug, const OLIVE_NAMESPACE::rational &r) +QDebug operator<<(QDebug debug, const olive::rational &r) { return debug.space() << r.toDouble(); /* diff --git a/app/common/rational.h b/app/common/rational.h index 358ea9697..9b8f05e1e 100644 --- a/app/common/rational.h +++ b/app/common/rational.h @@ -20,7 +20,7 @@ extern "C" { #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { typedef int64_t intType; /* @@ -140,10 +140,10 @@ private: uint qHash(const rational& r, uint seed); -OLIVE_NAMESPACE_EXIT +} -QDebug operator<<(QDebug debug, const OLIVE_NAMESPACE::rational& r); +QDebug operator<<(QDebug debug, const olive::rational& r); -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::rational) +Q_DECLARE_METATYPE(olive::rational) #endif // RATIONAL_H diff --git a/app/common/threadedobject.cpp b/app/common/threadedobject.cpp index 833face4c..38efd7d8a 100644 --- a/app/common/threadedobject.cpp +++ b/app/common/threadedobject.cpp @@ -20,7 +20,7 @@ #include "threadedobject.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void ThreadedObject::LockDeletes() { @@ -54,4 +54,4 @@ bool ThreadedObject::TryLockMutex(int timeout) return threadobj_main_lock_.tryLock(timeout); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/threadedobject.h b/app/common/threadedobject.h index 9d0013386..7340433b9 100644 --- a/app/common/threadedobject.h +++ b/app/common/threadedobject.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ThreadedObject { @@ -45,6 +45,6 @@ private: QAtomicInt threadobj_delete_lock_; }; -OLIVE_NAMESPACE_EXIT +} #endif // THREADEDOBJECT_H diff --git a/app/common/timecodefunctions.cpp b/app/common/timecodefunctions.cpp index e18454acd..613fe8aa9 100644 --- a/app/common/timecodefunctions.cpp +++ b/app/common/timecodefunctions.cpp @@ -24,7 +24,7 @@ #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { QString padded(int64_t arg, int padding) { return QStringLiteral("%1").arg(arg, padding, 10, QChar('0')); @@ -289,4 +289,4 @@ int64_t Timecode::rescale_timestamp_ceil(const int64_t &ts, const rational &sour return qCeil(static_cast(ts) * source.toDouble() / dest.toDouble()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/timecodefunctions.h b/app/common/timecodefunctions.h index 6d4b1b2cc..872b9f823 100644 --- a/app/common/timecodefunctions.h +++ b/app/common/timecodefunctions.h @@ -25,7 +25,7 @@ #include "common/rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Functions for converting times/timecodes/timestamps @@ -72,6 +72,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMECODEFUNCTIONS_H diff --git a/app/common/timerange.cpp b/app/common/timerange.cpp index f314006e2..b71d3e6b4 100644 --- a/app/common/timerange.cpp +++ b/app/common/timerange.cpp @@ -23,7 +23,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { TimeRange::TimeRange(const rational &in, const rational &out) : in_(in), @@ -296,9 +296,9 @@ uint qHash(const TimeRange &r, uint seed) return qHash(r.in(), seed) ^ qHash(r.out(), seed); } -OLIVE_NAMESPACE_EXIT +} -QDebug operator<<(QDebug debug, const OLIVE_NAMESPACE::TimeRange &r) +QDebug operator<<(QDebug debug, const olive::TimeRange &r) { debug.nospace() << r.in().toDouble() << " - " << r.out().toDouble(); return debug.space(); diff --git a/app/common/timerange.h b/app/common/timerange.h index 869e90b63..a14ceb69d 100644 --- a/app/common/timerange.h +++ b/app/common/timerange.h @@ -23,7 +23,7 @@ #include "rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimeRange { public: @@ -139,11 +139,11 @@ private: uint qHash(const TimeRange& r, uint seed); -OLIVE_NAMESPACE_EXIT +} -QDebug operator<<(QDebug debug, const OLIVE_NAMESPACE::TimeRange& r); -QDebug operator<<(QDebug debug, const OLIVE_NAMESPACE::TimeRangeList& r); +QDebug operator<<(QDebug debug, const olive::TimeRange& r); +QDebug operator<<(QDebug debug, const olive::TimeRangeList& r); -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::TimeRange) +Q_DECLARE_METATYPE(olive::TimeRange) #endif // TIMERANGE_H diff --git a/app/common/tohex.h b/app/common/tohex.h index 3843ebf84..0e7eff7dd 100644 --- a/app/common/tohex.h +++ b/app/common/tohex.h @@ -5,12 +5,12 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { inline QString ToHex(quint64 t) { return QStringLiteral("%1").arg(t, 0, 16); } -OLIVE_NAMESPACE_EXIT +} #endif // TOHEX_H diff --git a/app/common/xmlutils.cpp b/app/common/xmlutils.cpp index 54eafe7a1..0ff66750a 100644 --- a/app/common/xmlutils.cpp +++ b/app/common/xmlutils.cpp @@ -24,7 +24,7 @@ #include "node/factory.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void XMLConnectNodes(const XMLNodeData &xml_node_data, QUndoCommand *command) { @@ -64,4 +64,4 @@ void XMLLinkBlocks(const XMLNodeData &xml_node_data) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/common/xmlutils.h b/app/common/xmlutils.h index 64f77bd32..40a029732 100644 --- a/app/common/xmlutils.h +++ b/app/common/xmlutils.h @@ -26,7 +26,7 @@ #include "project/item/footage/stream.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Block; class Node; @@ -71,6 +71,6 @@ bool XMLReadNextStartElement(QXmlStreamReader* reader); void XMLLinkBlocks(const XMLNodeData& xml_node_data); -OLIVE_NAMESPACE_EXIT +} #endif // XMLREADLOOP_H diff --git a/app/config/config.cpp b/app/config/config.cpp index 24a827839..51dc15713 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -34,7 +34,7 @@ #include "ui/style/style.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Config Config::current_config_; @@ -268,4 +268,4 @@ NodeParam::DataType Config::GetConfigEntryType(const QString &key) const return config_map_[key].type; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/config/config.h b/app/config/config.h index 727f4778b..5fedcdbd1 100644 --- a/app/config/config.h +++ b/app/config/config.h @@ -28,7 +28,7 @@ #include "common/timecodefunctions.h" #include "node/param.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Config { public: @@ -63,6 +63,6 @@ private: static QString GetConfigFilePath(); }; -OLIVE_NAMESPACE_EXIT +} #endif // CONFIG_H diff --git a/app/core.cpp b/app/core.cpp index 6f4222d35..9687b9f53 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -68,7 +68,7 @@ #include "widget/viewer/viewer.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Core* Core::instance_ = nullptr; const uint Core::kProjectVersion = 201003; @@ -103,17 +103,17 @@ void Core::DeclareTypesForQt() qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); - qRegisterMetaType(); + qRegisterMetaType(); qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); } void Core::Start() @@ -1375,4 +1375,4 @@ Core::CoreParams::CoreParams() : { } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/core.h b/app/core.h index f068a388d..ed1727541 100644 --- a/app/core.h +++ b/app/core.h @@ -36,7 +36,7 @@ #include "tool/tool.h" #include "undo/undostack.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class MainWindow; @@ -563,7 +563,7 @@ private slots: /** * @brief Adds a project to the "open projects" list */ - void AddOpenProject(OLIVE_NAMESPACE::ProjectPtr p); + void AddOpenProject(olive::ProjectPtr p); void AddOpenProjectFromTask(Task* task); @@ -584,6 +584,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // CORE_H diff --git a/app/dialog/about/about.cpp b/app/dialog/about/about.cpp index fb2f418bb..330a613cb 100644 --- a/app/dialog/about/about.cpp +++ b/app/dialog/about/about.cpp @@ -25,7 +25,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) @@ -67,4 +67,4 @@ AboutDialog::AboutDialog(QWidget *parent) : connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/about/about.h b/app/dialog/about/about.h index ed334f46a..53557ebec 100644 --- a/app/dialog/about/about.h +++ b/app/dialog/about/about.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The AboutDialog class @@ -49,6 +49,6 @@ public: explicit AboutDialog(QWidget *parent = nullptr); }; -OLIVE_NAMESPACE_EXIT +} #endif // ABOUTDIALOG_H diff --git a/app/dialog/actionsearch/actionsearch.cpp b/app/dialog/actionsearch/actionsearch.cpp index 57c1cd2dc..ac632f415 100644 --- a/app/dialog/actionsearch/actionsearch.cpp +++ b/app/dialog/actionsearch/actionsearch.cpp @@ -25,7 +25,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { ActionSearch::ActionSearch(QWidget *parent) : QDialog(parent), @@ -254,4 +254,4 @@ void ActionSearchList::mouseDoubleClickEvent(QMouseEvent *) { } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/actionsearch/actionsearch.h b/app/dialog/actionsearch/actionsearch.h index 386a0cd07..ecb446955 100644 --- a/app/dialog/actionsearch/actionsearch.h +++ b/app/dialog/actionsearch/actionsearch.h @@ -29,7 +29,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ActionSearchList; @@ -182,6 +182,6 @@ signals: void moveSelectionDown(); }; -OLIVE_NAMESPACE_EXIT +} #endif // ACTIONSEARCH_H diff --git a/app/dialog/color/colordialog.cpp b/app/dialog/color/colordialog.cpp index f67438f0e..e838ce982 100644 --- a/app/dialog/color/colordialog.cpp +++ b/app/dialog/color/colordialog.cpp @@ -26,7 +26,7 @@ #include "common/qtutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ColorDialog::ColorDialog(ColorManager* color_manager, const ManagedColor& start, QWidget *parent) : QDialog(parent), @@ -160,4 +160,4 @@ void ColorDialog::ColorSpaceChanged(const QString &input, const ColorTransform & color_values_widget_->SetColorProcessor(input_to_ref_processor_, ref_to_display, nullptr, ref_to_input); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/color/colordialog.h b/app/dialog/color/colordialog.h index d4c8e0274..ccba97c18 100644 --- a/app/dialog/color/colordialog.h +++ b/app/dialog/color/colordialog.h @@ -31,7 +31,7 @@ #include "widget/colorwheel/colorvalueswidget.h" #include "widget/colorwheel/colorwheelwidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorDialog : public QDialog { @@ -87,6 +87,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORDIALOG_H diff --git a/app/dialog/crashhandler/crashhandler.cpp b/app/dialog/crashhandler/crashhandler.cpp index ca15f805c..61f8c276b 100644 --- a/app/dialog/crashhandler/crashhandler.cpp +++ b/app/dialog/crashhandler/crashhandler.cpp @@ -36,7 +36,7 @@ #include "common/crashpadutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { CrashHandlerDialog::CrashHandlerDialog(const char *report_dir, const char* crash_time) { @@ -208,4 +208,4 @@ void CrashHandlerDialog::SendErrorReport() manager->post(request, multipart); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/crashhandler/crashhandler.h b/app/dialog/crashhandler/crashhandler.h index d180eb273..f93be9dfa 100644 --- a/app/dialog/crashhandler/crashhandler.h +++ b/app/dialog/crashhandler/crashhandler.h @@ -30,7 +30,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CrashHandlerDialog : public QDialog { @@ -72,6 +72,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // CRASHHANDLERDIALOG_H diff --git a/app/dialog/crashhandler/crashhandlermain.cpp b/app/dialog/crashhandler/crashhandlermain.cpp index 7530607c3..7142fc244 100644 --- a/app/dialog/crashhandler/crashhandlermain.cpp +++ b/app/dialog/crashhandler/crashhandlermain.cpp @@ -30,7 +30,7 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); - OLIVE_NAMESPACE::CrashHandlerDialog chd(argv[1], argv[2]); + olive::CrashHandlerDialog chd(argv[1], argv[2]); chd.open(); return a.exec(); diff --git a/app/dialog/diskcache/diskcachedialog.cpp b/app/dialog/diskcache/diskcachedialog.cpp index 58361c40a..3e8831f49 100644 --- a/app/dialog/diskcache/diskcachedialog.cpp +++ b/app/dialog/diskcache/diskcachedialog.cpp @@ -27,7 +27,7 @@ #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { DiskCacheDialog::DiskCacheDialog(DiskCacheFolder *folder, QWidget* parent) : QDialog(parent), @@ -104,4 +104,4 @@ void DiskCacheDialog::ClearDiskCache() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/diskcache/diskcachedialog.h b/app/dialog/diskcache/diskcachedialog.h index 1f0f3cb76..b1ea61395 100644 --- a/app/dialog/diskcache/diskcachedialog.h +++ b/app/dialog/diskcache/diskcachedialog.h @@ -28,7 +28,7 @@ #include "render/diskmanager.h" #include "widget/slider/floatslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class DiskCacheDialog : public QDialog { @@ -53,6 +53,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // DISKCACHEDIALOG_H diff --git a/app/dialog/export/codec/codecsection.cpp b/app/dialog/export/codec/codecsection.cpp index 181bc2970..9847bb697 100644 --- a/app/dialog/export/codec/codecsection.cpp +++ b/app/dialog/export/codec/codecsection.cpp @@ -20,11 +20,11 @@ #include "codecsection.h" -OLIVE_NAMESPACE_ENTER +namespace olive { CodecSection::CodecSection(QWidget *parent) : QWidget(parent) { } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/export/codec/codecsection.h b/app/dialog/export/codec/codecsection.h index 22281dd5b..82f70b69e 100644 --- a/app/dialog/export/codec/codecsection.h +++ b/app/dialog/export/codec/codecsection.h @@ -25,7 +25,7 @@ #include "codec/encoder.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CodecSection : public QWidget { @@ -37,6 +37,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // CODECSECTION_H diff --git a/app/dialog/export/codec/h264section.cpp b/app/dialog/export/codec/h264section.cpp index bcbc3734d..ac4dcda78 100644 --- a/app/dialog/export/codec/h264section.cpp +++ b/app/dialog/export/codec/h264section.cpp @@ -28,7 +28,7 @@ #include "common/qtutils.h" #include "widget/slider/integerslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { H264Section::H264Section(QWidget *parent) : CodecSection(parent) @@ -208,4 +208,4 @@ int64_t H264FileSizeSection::GetFileSize() const return qRound64(file_size_->GetValue() * 1024.0 * 1024.0 * 8.0); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/export/codec/h264section.h b/app/dialog/export/codec/h264section.h index 85477a5bf..f00e9cb17 100644 --- a/app/dialog/export/codec/h264section.h +++ b/app/dialog/export/codec/h264section.h @@ -27,7 +27,7 @@ #include "codecsection.h" #include "widget/slider/floatslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class H264CRFSection : public QWidget { @@ -112,6 +112,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // H264SECTION_H diff --git a/app/dialog/export/codec/imagesection.cpp b/app/dialog/export/codec/imagesection.cpp index 319f7460e..611a99504 100644 --- a/app/dialog/export/codec/imagesection.cpp +++ b/app/dialog/export/codec/imagesection.cpp @@ -23,7 +23,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { ImageSection::ImageSection(QWidget* parent) : CodecSection(parent) @@ -44,4 +44,4 @@ QCheckBox *ImageSection::image_sequence_checkbox() const return image_sequence_checkbox_; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/export/codec/imagesection.h b/app/dialog/export/codec/imagesection.h index e9880b626..d21f782a2 100644 --- a/app/dialog/export/codec/imagesection.h +++ b/app/dialog/export/codec/imagesection.h @@ -25,7 +25,7 @@ #include "codecsection.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ImageSection : public CodecSection { @@ -40,6 +40,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // IMAGESECTION_H diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index 90bc52435..799594715 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -37,7 +37,7 @@ #include "project/project.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ExportDialog::ExportDialog(ViewerOutput *viewer_node, TimelinePoints *points, QWidget *parent) : QDialog(parent), @@ -507,4 +507,4 @@ void ExportDialog::UpdateViewerDimensions() preview_viewer_->SetMatrix(transform); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/export/export.h b/app/dialog/export/export.h index b422f3806..37144b6b3 100644 --- a/app/dialog/export/export.h +++ b/app/dialog/export/export.h @@ -34,7 +34,7 @@ #include "task/export/export.h" #include "widget/viewer/viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ExportDialog : public QDialog { @@ -95,6 +95,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // EXPORTDIALOG_H diff --git a/app/dialog/export/exportadvancedvideodialog.cpp b/app/dialog/export/exportadvancedvideodialog.cpp index f4fc6b6e6..9e38969fb 100644 --- a/app/dialog/export/exportadvancedvideodialog.cpp +++ b/app/dialog/export/exportadvancedvideodialog.cpp @@ -5,7 +5,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { ExportAdvancedVideoDialog::ExportAdvancedVideoDialog(const QList &pix_fmts, QWidget *parent) : QDialog(parent) @@ -59,4 +59,4 @@ ExportAdvancedVideoDialog::ExportAdvancedVideoDialog(const QList &pix_f layout->addWidget(buttons); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/export/exportadvancedvideodialog.h b/app/dialog/export/exportadvancedvideodialog.h index bdadbbebe..275ae44f9 100644 --- a/app/dialog/export/exportadvancedvideodialog.h +++ b/app/dialog/export/exportadvancedvideodialog.h @@ -6,7 +6,7 @@ #include "widget/slider/integerslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ExportAdvancedVideoDialog : public QDialog { @@ -42,6 +42,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // EXPORTADVANCEDVIDEODIALOG_H diff --git a/app/dialog/export/exportaudiotab.cpp b/app/dialog/export/exportaudiotab.cpp index fb08d87d8..781183c19 100644 --- a/app/dialog/export/exportaudiotab.cpp +++ b/app/dialog/export/exportaudiotab.cpp @@ -25,7 +25,7 @@ #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ExportAudioTab::ExportAudioTab(QWidget* parent) : QWidget(parent) @@ -64,4 +64,4 @@ ExportAudioTab::ExportAudioTab(QWidget* parent) : outer_layout->addStretch(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/export/exportaudiotab.h b/app/dialog/export/exportaudiotab.h index d3b7b13db..5ef06d2a2 100644 --- a/app/dialog/export/exportaudiotab.h +++ b/app/dialog/export/exportaudiotab.h @@ -27,7 +27,7 @@ #include "common/define.h" #include "widget/standardcombos/standardcombos.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ExportAudioTab : public QWidget { @@ -57,6 +57,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // EXPORTAUDIOTAB_H diff --git a/app/dialog/export/exportvideotab.cpp b/app/dialog/export/exportvideotab.cpp index 82be998ee..d37f61389 100644 --- a/app/dialog/export/exportvideotab.cpp +++ b/app/dialog/export/exportvideotab.cpp @@ -31,7 +31,7 @@ #include "render/colormanager.h" #include "task/export/exportparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ExportVideoTab::ExportVideoTab(ColorManager* color_manager, QWidget *parent) : QWidget(parent), @@ -206,4 +206,4 @@ void ExportVideoTab::VideoCodecChanged() qDebug() << "Set default pix fmt" << pix_fmt_; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/export/exportvideotab.h b/app/dialog/export/exportvideotab.h index 1e2bfaa57..feed9eb78 100644 --- a/app/dialog/export/exportvideotab.h +++ b/app/dialog/export/exportvideotab.h @@ -33,7 +33,7 @@ #include "widget/slider/integerslider.h" #include "widget/standardcombos/standardcombos.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ExportVideoTab : public QWidget { @@ -167,6 +167,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // EXPORTVIDEOTAB_H diff --git a/app/dialog/footageproperties/footageproperties.cpp b/app/dialog/footageproperties/footageproperties.cpp index 88a43b3af..e08da2564 100644 --- a/app/dialog/footageproperties/footageproperties.cpp +++ b/app/dialog/footageproperties/footageproperties.cpp @@ -36,7 +36,7 @@ #include "streamproperties/audiostreamproperties.h" #include "streamproperties/videostreamproperties.h" -OLIVE_NAMESPACE_ENTER +namespace olive { FootagePropertiesDialog::FootagePropertiesDialog(QWidget *parent, Footage *footage) : QDialog(parent), @@ -198,4 +198,4 @@ void FootagePropertiesDialog::StreamEnableChangeCommand::undo_internal() stream_->set_enabled(old_enabled_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/footageproperties/footageproperties.h b/app/dialog/footageproperties/footageproperties.h index 513df2f03..614fb8800 100644 --- a/app/dialog/footageproperties/footageproperties.h +++ b/app/dialog/footageproperties/footageproperties.h @@ -32,7 +32,7 @@ #include "project/item/footage/footage.h" #include "undo/undocommand.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The MediaPropertiesDialog class @@ -132,6 +132,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // MEDIAPROPERTIESDIALOG_H diff --git a/app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp index 5dc7a32d8..9f52c0e3e 100644 --- a/app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp @@ -20,7 +20,7 @@ #include "audiostreamproperties.h" -OLIVE_NAMESPACE_ENTER +namespace olive { AudioStreamProperties::AudioStreamProperties(AudioStreamPtr stream) : stream_(stream) @@ -31,4 +31,4 @@ void AudioStreamProperties::Accept(QUndoCommand*) { } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/footageproperties/streamproperties/audiostreamproperties.h b/app/dialog/footageproperties/streamproperties/audiostreamproperties.h index 1d8373dc5..f3a77c4b9 100644 --- a/app/dialog/footageproperties/streamproperties/audiostreamproperties.h +++ b/app/dialog/footageproperties/streamproperties/audiostreamproperties.h @@ -24,7 +24,7 @@ #include "project/item/footage/audiostream.h" #include "streamproperties.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AudioStreamProperties : public StreamProperties { @@ -37,6 +37,6 @@ private: AudioStreamPtr stream_; }; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOSTREAMPROPERTIES_H diff --git a/app/dialog/footageproperties/streamproperties/streamproperties.cpp b/app/dialog/footageproperties/streamproperties/streamproperties.cpp index 102ac7d70..96f3bbd5a 100644 --- a/app/dialog/footageproperties/streamproperties/streamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/streamproperties.cpp @@ -20,11 +20,11 @@ #include "streamproperties.h" -OLIVE_NAMESPACE_ENTER +namespace olive { StreamProperties::StreamProperties(QWidget *parent) : QWidget(parent) { } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/footageproperties/streamproperties/streamproperties.h b/app/dialog/footageproperties/streamproperties/streamproperties.h index 8af0934b1..677be9b0a 100644 --- a/app/dialog/footageproperties/streamproperties/streamproperties.h +++ b/app/dialog/footageproperties/streamproperties/streamproperties.h @@ -26,7 +26,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class StreamProperties : public QWidget { @@ -39,6 +39,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // STREAMPROPERTIES_H diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index 81ed24770..c97b011c0 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -32,7 +32,7 @@ #include "project/project.h" #include "undo/undostack.h" -OLIVE_NAMESPACE_ENTER +namespace olive { VideoStreamProperties::VideoStreamProperties(VideoStreamPtr stream) : stream_(stream), @@ -253,4 +253,4 @@ void VideoStreamProperties::ImageSequenceChangeCommand::undo_internal() video_stream_->set_timebase(old_frame_rate_.flipped()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.h b/app/dialog/footageproperties/streamproperties/videostreamproperties.h index 332a00791..96416f596 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.h +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.h @@ -30,7 +30,7 @@ #include "widget/slider/integerslider.h" #include "widget/standardcombos/standardcombos.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class VideoStreamProperties : public StreamProperties { @@ -143,6 +143,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIDEOSTREAMPROPERTIES_H diff --git a/app/dialog/footagerelink/footagerelinkdialog.cpp b/app/dialog/footagerelink/footagerelinkdialog.cpp index eae68b38e..cfdde7fc5 100644 --- a/app/dialog/footagerelink/footagerelinkdialog.cpp +++ b/app/dialog/footagerelink/footagerelinkdialog.cpp @@ -27,7 +27,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { FootageRelinkDialog::FootageRelinkDialog(const QList& footage, QWidget* parent) : QDialog(parent), @@ -100,4 +100,4 @@ void FootageRelinkDialog::BrowseForFootage() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/footagerelink/footagerelinkdialog.h b/app/dialog/footagerelink/footagerelinkdialog.h index 1c9984f9c..b201b6762 100644 --- a/app/dialog/footagerelink/footagerelinkdialog.h +++ b/app/dialog/footagerelink/footagerelinkdialog.h @@ -26,7 +26,7 @@ #include "project/item/footage/footage.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FootageRelinkDialog : public QDialog { @@ -44,6 +44,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // FOOTAGERELINKDIALOG_H diff --git a/app/dialog/keyframeproperties/keyframeproperties.cpp b/app/dialog/keyframeproperties/keyframeproperties.cpp index dfbfcb49e..469734cfd 100644 --- a/app/dialog/keyframeproperties/keyframeproperties.cpp +++ b/app/dialog/keyframeproperties/keyframeproperties.cpp @@ -28,7 +28,7 @@ #include "widget/keyframeview/keyframeviewundo.h" #include "widget/nodeparamview/nodeparamviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { KeyframePropertiesDialog::KeyframePropertiesDialog(const QList &keys, const rational &timebase, QWidget *parent) : QDialog(parent), @@ -240,4 +240,4 @@ void KeyframePropertiesDialog::KeyTypeChanged(int index) bezier_group_->setEnabled(type_select_->itemData(index) == NodeKeyframe::kBezier); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/keyframeproperties/keyframeproperties.h b/app/dialog/keyframeproperties/keyframeproperties.h index 3fada931a..3ad6145af 100644 --- a/app/dialog/keyframeproperties/keyframeproperties.h +++ b/app/dialog/keyframeproperties/keyframeproperties.h @@ -29,7 +29,7 @@ #include "widget/slider/floatslider.h" #include "widget/slider/timeslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class KeyframePropertiesDialog : public QDialog { @@ -66,6 +66,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // KEYFRAMEPROPERTIESDIALOG_H diff --git a/app/dialog/preferences/keysequenceeditor.cpp b/app/dialog/preferences/keysequenceeditor.cpp index 4c915d9d6..34012ef2f 100644 --- a/app/dialog/preferences/keysequenceeditor.cpp +++ b/app/dialog/preferences/keysequenceeditor.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { KeySequenceEditor::KeySequenceEditor(QWidget* parent, QAction* a) : QKeySequenceEdit(parent), action(a) { @@ -49,4 +49,4 @@ QString KeySequenceEditor::export_shortcut() { return nullptr; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/preferences/keysequenceeditor.h b/app/dialog/preferences/keysequenceeditor.h index cb507da50..3231df622 100644 --- a/app/dialog/preferences/keysequenceeditor.h +++ b/app/dialog/preferences/keysequenceeditor.h @@ -25,7 +25,7 @@ #include "common/debug.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The KeySequenceEditor class @@ -101,6 +101,6 @@ private: QAction* action; }; -OLIVE_NAMESPACE_EXIT +} #endif // KEYSEQUENCEEDITOR_H diff --git a/app/dialog/preferences/preferences.cpp b/app/dialog/preferences/preferences.cpp index 5f38750af..c3c34131f 100644 --- a/app/dialog/preferences/preferences.cpp +++ b/app/dialog/preferences/preferences.cpp @@ -33,7 +33,7 @@ #include "tabs/preferencesaudiotab.h" #include "tabs/preferenceskeyboardtab.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PreferencesDialog::PreferencesDialog(QWidget *parent, QMenuBar* main_menu_bar) : QDialog(parent) @@ -98,4 +98,4 @@ void PreferencesDialog::AddTab(PreferencesTab *tab, const QString &title) tabs_.append(tab); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/preferences/preferences.h b/app/dialog/preferences/preferences.h index 9b4074e69..e337c3eeb 100644 --- a/app/dialog/preferences/preferences.h +++ b/app/dialog/preferences/preferences.h @@ -30,7 +30,7 @@ #include "tabs/preferencestab.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The PreferencesDialog class @@ -69,6 +69,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PREFERENCESDIALOG_H diff --git a/app/dialog/preferences/tabs/preferencesappearancetab.cpp b/app/dialog/preferences/tabs/preferencesappearancetab.cpp index bf3a2c468..1ad9a6113 100644 --- a/app/dialog/preferences/tabs/preferencesappearancetab.cpp +++ b/app/dialog/preferences/tabs/preferencesappearancetab.cpp @@ -29,7 +29,7 @@ #include "node/node.h" #include "widget/colorbutton/colorbutton.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PreferencesAppearanceTab::PreferencesAppearanceTab() { @@ -122,4 +122,4 @@ void PreferencesAppearanceTab::ColorButtonClicked() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/preferences/tabs/preferencesappearancetab.h b/app/dialog/preferences/tabs/preferencesappearancetab.h index 98f04d3ef..6e3e82751 100644 --- a/app/dialog/preferences/tabs/preferencesappearancetab.h +++ b/app/dialog/preferences/tabs/preferencesappearancetab.h @@ -28,7 +28,7 @@ #include "preferencestab.h" #include "ui/style/style.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PreferencesAppearanceTab : public PreferencesTab { @@ -60,6 +60,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // PREFERENCESAPPEARANCETAB_H diff --git a/app/dialog/preferences/tabs/preferencesaudiotab.cpp b/app/dialog/preferences/tabs/preferencesaudiotab.cpp index fb7fc7b0c..66c34a3d9 100644 --- a/app/dialog/preferences/tabs/preferencesaudiotab.cpp +++ b/app/dialog/preferences/tabs/preferencesaudiotab.cpp @@ -26,7 +26,7 @@ #include "audio/audiomanager.h" #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PreferencesAudioTab::PreferencesAudioTab() { @@ -206,4 +206,4 @@ void PreferencesAudioTab::PopulateComboBox(QComboBox *cb, bool still_refreshing, } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/preferences/tabs/preferencesaudiotab.h b/app/dialog/preferences/tabs/preferencesaudiotab.h index b3d0dbd9c..e0cb6fa7b 100644 --- a/app/dialog/preferences/tabs/preferencesaudiotab.h +++ b/app/dialog/preferences/tabs/preferencesaudiotab.h @@ -27,7 +27,7 @@ #include "preferencestab.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PreferencesAudioTab : public PreferencesTab { @@ -79,6 +79,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PREFERENCESAUDIOTAB_H diff --git a/app/dialog/preferences/tabs/preferencesbehaviortab.cpp b/app/dialog/preferences/tabs/preferencesbehaviortab.cpp index 5eef42c79..79b6d217c 100644 --- a/app/dialog/preferences/tabs/preferencesbehaviortab.cpp +++ b/app/dialog/preferences/tabs/preferencesbehaviortab.cpp @@ -25,7 +25,7 @@ #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PreferencesBehaviorTab::PreferencesBehaviorTab() { @@ -156,4 +156,4 @@ QTreeWidgetItem *PreferencesBehaviorTab::AddParent(const QString &text, QTreeWid return AddParent(text, QString(), parent); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/preferences/tabs/preferencesbehaviortab.h b/app/dialog/preferences/tabs/preferencesbehaviortab.h index 45016b5fa..997aee0cc 100644 --- a/app/dialog/preferences/tabs/preferencesbehaviortab.h +++ b/app/dialog/preferences/tabs/preferencesbehaviortab.h @@ -25,7 +25,7 @@ #include "preferencestab.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PreferencesBehaviorTab : public PreferencesTab { @@ -48,6 +48,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PREFERENCESBEHAVIORTAB_H diff --git a/app/dialog/preferences/tabs/preferencesdisktab.cpp b/app/dialog/preferences/tabs/preferencesdisktab.cpp index 870c842fa..6041d19fe 100644 --- a/app/dialog/preferences/tabs/preferencesdisktab.cpp +++ b/app/dialog/preferences/tabs/preferencesdisktab.cpp @@ -29,7 +29,7 @@ #include "common/filefunctions.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PreferencesDiskTab::PreferencesDiskTab() { @@ -117,4 +117,4 @@ void PreferencesDiskTab::Accept() Config::Current()["DiskCacheAhead"] = QVariant::fromValue(rational::fromDouble(cache_ahead_slider_->GetValue())); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/preferences/tabs/preferencesdisktab.h b/app/dialog/preferences/tabs/preferencesdisktab.h index 8a6fadeb2..6f4e45771 100644 --- a/app/dialog/preferences/tabs/preferencesdisktab.h +++ b/app/dialog/preferences/tabs/preferencesdisktab.h @@ -30,7 +30,7 @@ #include "widget/slider/floatslider.h" #include "widget/path/pathwidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PreferencesDiskTab : public PreferencesTab { @@ -53,6 +53,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PREFERENCESDISKTAB_H diff --git a/app/dialog/preferences/tabs/preferencesgeneraltab.cpp b/app/dialog/preferences/tabs/preferencesgeneraltab.cpp index 4ec57eeb3..e4ac956ab 100644 --- a/app/dialog/preferences/tabs/preferencesgeneraltab.cpp +++ b/app/dialog/preferences/tabs/preferencesgeneraltab.cpp @@ -29,7 +29,7 @@ #include "dialog/sequence/sequence.h" #include "project/item/sequence/sequence.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PreferencesGeneralTab::PreferencesGeneralTab() { @@ -128,4 +128,4 @@ void PreferencesGeneralTab::AddLanguage(const QString &locale_name) language_combobox_->setItemData(language_combobox_->count() - 1, locale_name); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/preferences/tabs/preferencesgeneraltab.h b/app/dialog/preferences/tabs/preferencesgeneraltab.h index 8fedf64dc..e48123fc6 100644 --- a/app/dialog/preferences/tabs/preferencesgeneraltab.h +++ b/app/dialog/preferences/tabs/preferencesgeneraltab.h @@ -29,7 +29,7 @@ #include "project/item/sequence/sequence.h" #include "widget/slider/floatslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PreferencesGeneralTab : public PreferencesTab { @@ -52,6 +52,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PREFERENCESGENERALTAB_H diff --git a/app/dialog/preferences/tabs/preferenceskeyboardtab.cpp b/app/dialog/preferences/tabs/preferenceskeyboardtab.cpp index ef7e614c1..22ab4f652 100644 --- a/app/dialog/preferences/tabs/preferenceskeyboardtab.cpp +++ b/app/dialog/preferences/tabs/preferenceskeyboardtab.cpp @@ -27,7 +27,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { PreferencesKeyboardTab::PreferencesKeyboardTab(QMenuBar *menubar) { @@ -239,4 +239,4 @@ void PreferencesKeyboardTab::save_shortcut_file() { } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/preferences/tabs/preferenceskeyboardtab.h b/app/dialog/preferences/tabs/preferenceskeyboardtab.h index c8c86a730..723d95e44 100644 --- a/app/dialog/preferences/tabs/preferenceskeyboardtab.h +++ b/app/dialog/preferences/tabs/preferenceskeyboardtab.h @@ -27,7 +27,7 @@ #include "preferencestab.h" #include "../keysequenceeditor.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PreferencesKeyboardTab : public PreferencesTab { @@ -134,6 +134,6 @@ private: QVector key_shortcut_fields_; }; -OLIVE_NAMESPACE_EXIT +} #endif // PREFERENCESKEYBOARDTAB_H diff --git a/app/dialog/preferences/tabs/preferencestab.cpp b/app/dialog/preferences/tabs/preferencestab.cpp index 6e3c5dd59..4dc6d46d8 100644 --- a/app/dialog/preferences/tabs/preferencestab.cpp +++ b/app/dialog/preferences/tabs/preferencestab.cpp @@ -20,11 +20,11 @@ #include "preferencestab.h" -OLIVE_NAMESPACE_ENTER +namespace olive { bool PreferencesTab::Validate() { return true; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/preferences/tabs/preferencestab.h b/app/dialog/preferences/tabs/preferencestab.h index 7eaebf15c..8bfaec15d 100644 --- a/app/dialog/preferences/tabs/preferencestab.h +++ b/app/dialog/preferences/tabs/preferencestab.h @@ -25,7 +25,7 @@ #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PreferencesTab : public QWidget { @@ -37,6 +37,6 @@ public: virtual void Accept() = 0; }; -OLIVE_NAMESPACE_EXIT +} #endif // PREFERENCESTAB_H diff --git a/app/dialog/progress/progress.cpp b/app/dialog/progress/progress.cpp index 96ad4e0c8..3024dffca 100644 --- a/app/dialog/progress/progress.cpp +++ b/app/dialog/progress/progress.cpp @@ -27,7 +27,7 @@ #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProgressDialog::ProgressDialog(const QString& message, const QString& title, QWidget *parent) : QDialog(parent) @@ -101,4 +101,4 @@ void ProgressDialog::ShowErrorMessage(const QString &title, const QString &messa b.exec(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/progress/progress.h b/app/dialog/progress/progress.h index 8b011b88b..75103a900 100644 --- a/app/dialog/progress/progress.h +++ b/app/dialog/progress/progress.h @@ -27,7 +27,7 @@ #include "common/debug.h" #include "widget/taskview/elapsedcounterwidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ProgressDialog : public QDialog { @@ -56,6 +56,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PROGRESSDIALOG_H diff --git a/app/dialog/projectproperties/projectproperties.cpp b/app/dialog/projectproperties/projectproperties.cpp index be8c74756..7f7414f3f 100644 --- a/app/dialog/projectproperties/projectproperties.cpp +++ b/app/dialog/projectproperties/projectproperties.cpp @@ -35,7 +35,7 @@ #include "render/colormanager.h" #include "render/diskmanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectPropertiesDialog::ProjectPropertiesDialog(Project* p, QWidget *parent) : QDialog(parent), @@ -242,4 +242,4 @@ void ProjectPropertiesDialog::OCIOFilenameUpdated() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/projectproperties/projectproperties.h b/app/dialog/projectproperties/projectproperties.h index dbabf953c..e861004b8 100644 --- a/app/dialog/projectproperties/projectproperties.h +++ b/app/dialog/projectproperties/projectproperties.h @@ -31,7 +31,7 @@ #include "project/project.h" #include "widget/path/pathwidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ProjectPropertiesDialog : public QDialog { @@ -68,6 +68,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTPROPERTIESDIALOG_H diff --git a/app/dialog/rendercancel/rendercancel.cpp b/app/dialog/rendercancel/rendercancel.cpp index 5bff8b315..29aee8137 100644 --- a/app/dialog/rendercancel/rendercancel.cpp +++ b/app/dialog/rendercancel/rendercancel.cpp @@ -20,7 +20,7 @@ #include "rendercancel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RenderCancelDialog::RenderCancelDialog(QWidget *parent) : ProgressDialog(tr("Waiting for workers to finish..."), tr("Renderer"), parent), @@ -79,4 +79,4 @@ void RenderCancelDialog::UpdateProgress() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/rendercancel/rendercancel.h b/app/dialog/rendercancel/rendercancel.h index aa23934ba..bc6dd72ed 100644 --- a/app/dialog/rendercancel/rendercancel.h +++ b/app/dialog/rendercancel/rendercancel.h @@ -23,7 +23,7 @@ #include "dialog/progress/progress.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RenderCancelDialog : public ProgressDialog { @@ -54,6 +54,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // RENDERCANCELDIALOG_H diff --git a/app/dialog/richtext/richtext.cpp b/app/dialog/richtext/richtext.cpp index 99b5ddad5..a623ed3e1 100644 --- a/app/dialog/richtext/richtext.cpp +++ b/app/dialog/richtext/richtext.cpp @@ -28,7 +28,7 @@ #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RichTextDialog::RichTextDialog(QString start, QWidget* parent) : QDialog(parent) @@ -336,4 +336,4 @@ void RichTextDialog::UpdateButtons() */ } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/richtext/richtext.h b/app/dialog/richtext/richtext.h index bcf67877c..479581cb9 100644 --- a/app/dialog/richtext/richtext.h +++ b/app/dialog/richtext/richtext.h @@ -28,7 +28,7 @@ #include "common/define.h" #include "widget/slider/floatslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RichTextDialog : public QDialog { @@ -82,6 +82,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // RICHTEXTDIALOG_H diff --git a/app/dialog/sequence/presetmanager.h b/app/dialog/sequence/presetmanager.h index 98e47763b..1ac467a9e 100644 --- a/app/dialog/sequence/presetmanager.h +++ b/app/dialog/sequence/presetmanager.h @@ -34,7 +34,7 @@ #include "common/filefunctions.h" #include "common/xmlutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Preset { @@ -234,6 +234,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PRESETMANAGER_H diff --git a/app/dialog/sequence/sequence.cpp b/app/dialog/sequence/sequence.cpp index 4ce905697..db9e50615 100644 --- a/app/dialog/sequence/sequence.cpp +++ b/app/dialog/sequence/sequence.cpp @@ -33,7 +33,7 @@ #include "common/rational.h" #include "undo/undostack.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SequenceDialog::SequenceDialog(Sequence* s, Type t, QWidget* parent) : QDialog(parent), @@ -171,4 +171,4 @@ void SequenceDialog::SequenceParamCommand::undo_internal() sequence_->set_name(old_name_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/sequence/sequence.h b/app/dialog/sequence/sequence.h index 29d20a328..947627642 100644 --- a/app/dialog/sequence/sequence.h +++ b/app/dialog/sequence/sequence.h @@ -30,7 +30,7 @@ #include "sequencedialogpresettab.h" #include "undo/undocommand.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A dialog for editing Sequence parameters @@ -133,6 +133,6 @@ private: }; }; -OLIVE_NAMESPACE_EXIT +} #endif // SEQUENCEDIALOG_H diff --git a/app/dialog/sequence/sequencedialogparametertab.cpp b/app/dialog/sequence/sequencedialogparametertab.cpp index 326df8b11..11ea7ea71 100644 --- a/app/dialog/sequence/sequencedialogparametertab.cpp +++ b/app/dialog/sequence/sequencedialogparametertab.cpp @@ -7,7 +7,7 @@ #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence* sequence, QWidget* parent) : QWidget(parent) @@ -143,4 +143,4 @@ void SequenceDialogParameterTab::UpdatePreviewResolutionLabel() QString::number(test_param.effective_height()))); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/sequence/sequencedialogparametertab.h b/app/dialog/sequence/sequencedialogparametertab.h index d2dabdea1..dcc1a4b4e 100644 --- a/app/dialog/sequence/sequencedialogparametertab.h +++ b/app/dialog/sequence/sequencedialogparametertab.h @@ -10,7 +10,7 @@ #include "widget/slider/integerslider.h" #include "widget/standardcombos/standardcombos.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SequenceDialogParameterTab : public QWidget { @@ -97,6 +97,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // SEQUENCEDIALOGPARAMETERTAB_H diff --git a/app/dialog/sequence/sequencedialogpresettab.cpp b/app/dialog/sequence/sequencedialogpresettab.cpp index c6ff81b6d..a57852b64 100644 --- a/app/dialog/sequence/sequencedialogpresettab.cpp +++ b/app/dialog/sequence/sequencedialogpresettab.cpp @@ -36,7 +36,7 @@ #include "ui/icons/icons.h" #include "widget/menu/menu.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const int kDataIsPreset = Qt::UserRole; const int kDataPresetIsCustomRole = Qt::UserRole + 1; @@ -295,4 +295,4 @@ void SequenceDialogPresetTab::DeleteSelectedPreset() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/sequence/sequencedialogpresettab.h b/app/dialog/sequence/sequencedialogpresettab.h index 1caae8268..c6296673f 100644 --- a/app/dialog/sequence/sequencedialogpresettab.h +++ b/app/dialog/sequence/sequencedialogpresettab.h @@ -28,7 +28,7 @@ #include "presetmanager.h" #include "sequencepreset.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SequenceDialogPresetTab : public QWidget, public PresetManager { @@ -77,6 +77,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // SEQUENCEDIALOGPRESETTAB_H diff --git a/app/dialog/sequence/sequencepreset.h b/app/dialog/sequence/sequencepreset.h index e686faabe..f6fc052b9 100644 --- a/app/dialog/sequence/sequencepreset.h +++ b/app/dialog/sequence/sequencepreset.h @@ -28,7 +28,7 @@ #include "dialog/sequence/presetmanager.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SequencePreset : public Preset { public: @@ -174,6 +174,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // SEQUENCEPARAM_H diff --git a/app/dialog/task/task.cpp b/app/dialog/task/task.cpp index 423c6b708..094d91120 100644 --- a/app/dialog/task/task.cpp +++ b/app/dialog/task/task.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { TaskDialog::TaskDialog(Task* task, const QString& title, QWidget *parent) : ProgressDialog(task->GetTitle(), title, parent), @@ -85,4 +85,4 @@ void TaskDialog::TaskFinished() close(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/dialog/task/task.h b/app/dialog/task/task.h index a8424f93f..7fbfaa239 100644 --- a/app/dialog/task/task.h +++ b/app/dialog/task/task.h @@ -24,7 +24,7 @@ #include "dialog/progress/progress.h" #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TaskDialog : public ProgressDialog { @@ -77,6 +77,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TASKDIALOG_H diff --git a/app/main.cpp b/app/main.cpp index 5d02a37e3..c7ef668ab 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -48,7 +48,7 @@ extern "C" { int main(int argc, char *argv[]) { // Set up debug handler - qInstallMessageHandler(OLIVE_NAMESPACE::DebugHandler); + qInstallMessageHandler(olive::DebugHandler); // Generate version string QString app_version = APPVERSION; @@ -74,7 +74,7 @@ int main(int argc, char *argv[]) // Parse command line arguments // - OLIVE_NAMESPACE::Core::CoreParams startup_params; + olive::Core::CoreParams startup_params; CommandLineParser parser; @@ -119,7 +119,7 @@ int main(int argc, char *argv[]) } if (export_option->IsSet()) { - startup_params.set_run_mode(OLIVE_NAMESPACE::Core::CoreParams::kHeadlessExport); + startup_params.set_run_mode(olive::Core::CoreParams::kHeadlessExport); } if (ts_option->IsSet()) { @@ -147,7 +147,7 @@ int main(int argc, char *argv[]) // Create application instance std::unique_ptr a; - if (startup_params.run_mode() == OLIVE_NAMESPACE::Core::CoreParams::kRunNormal) { + if (startup_params.run_mode() == olive::Core::CoreParams::kRunNormal) { a.reset(new QApplication(argc, argv)); } else { a.reset(new QCoreApplication(argc, argv)); @@ -169,7 +169,7 @@ int main(int argc, char *argv[]) #endif // USE_CRASHPAD // Start core - OLIVE_NAMESPACE::Core c(startup_params); + olive::Core c(startup_params); c.Start(); diff --git a/app/node/audio/pan/pan.cpp b/app/node/audio/pan/pan.cpp index 08770e0df..9b0b688f7 100644 --- a/app/node/audio/pan/pan.cpp +++ b/app/node/audio/pan/pan.cpp @@ -20,7 +20,7 @@ #include "pan.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PanNode::PanNode() { @@ -114,4 +114,4 @@ void PanNode::Retranslate() panning_input_->set_name(tr("Pan")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/audio/pan/pan.h b/app/node/audio/pan/pan.h index 4ef15c702..e6298fc84 100644 --- a/app/node/audio/pan/pan.h +++ b/app/node/audio/pan/pan.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PanNode : public Node { @@ -50,6 +50,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PANNODE_H diff --git a/app/node/audio/volume/volume.cpp b/app/node/audio/volume/volume.cpp index f96370ab6..5f6d829c2 100644 --- a/app/node/audio/volume/volume.cpp +++ b/app/node/audio/volume/volume.cpp @@ -20,7 +20,7 @@ #include "volume.h" -OLIVE_NAMESPACE_ENTER +namespace olive { VolumeNode::VolumeNode() { @@ -81,4 +81,4 @@ void VolumeNode::Retranslate() volume_input_->set_name(tr("Volume")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/audio/volume/volume.h b/app/node/audio/volume/volume.h index d6b62447e..a45aeb340 100644 --- a/app/node/audio/volume/volume.h +++ b/app/node/audio/volume/volume.h @@ -23,7 +23,7 @@ #include "node/math/math/mathbase.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class VolumeNode : public MathNodeBase { @@ -55,6 +55,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // VOLUMENODE_H diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index 79b8a7ffe..6cdc8535e 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -25,7 +25,7 @@ #include "node/output/track/track.h" #include "transition/transition.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Block::Block() : previous_(nullptr), @@ -375,4 +375,4 @@ void Block::Hash(QCryptographicHash &, const rational &) const // A block does nothing by default, so we hash nothing } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/block/block.h b/app/node/block/block.h index 14a715166..1f4362340 100644 --- a/app/node/block/block.h +++ b/app/node/block/block.h @@ -24,7 +24,7 @@ #include "node/node.h" #include "timeline/timelinecommon.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A Node that represents a block of time, also displayable on a Timeline @@ -137,6 +137,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // BLOCK_H diff --git a/app/node/block/clip/clip.cpp b/app/node/block/clip/clip.cpp index 0aaf82e76..cc73034e6 100644 --- a/app/node/block/clip/clip.cpp +++ b/app/node/block/clip/clip.cpp @@ -20,7 +20,7 @@ #include "clip.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ClipBlock::ClipBlock() { @@ -120,4 +120,4 @@ void ClipBlock::Hash(QCryptographicHash &hash, const rational &time) const } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/block/clip/clip.h b/app/node/block/clip/clip.h index c8bbcde5a..adedaaac6 100644 --- a/app/node/block/clip/clip.h +++ b/app/node/block/clip/clip.h @@ -23,7 +23,7 @@ #include "node/block/block.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Node that represents a block of Media @@ -61,6 +61,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEBLOCK_H diff --git a/app/node/block/gap/gap.cpp b/app/node/block/gap/gap.cpp index 495667ca7..2312cc539 100644 --- a/app/node/block/gap/gap.cpp +++ b/app/node/block/gap/gap.cpp @@ -20,7 +20,7 @@ #include "gap.h" -OLIVE_NAMESPACE_ENTER +namespace olive { GapBlock::GapBlock() { @@ -51,4 +51,4 @@ QString GapBlock::Description() const return tr("A time-based node that represents an empty space."); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/block/gap/gap.h b/app/node/block/gap/gap.h index 245627465..17856c039 100644 --- a/app/node/block/gap/gap.h +++ b/app/node/block/gap/gap.h @@ -23,7 +23,7 @@ #include "node/block/block.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Node that represents nothing in its respective track for a certain period of time @@ -46,6 +46,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEBLOCK_H diff --git a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp index 1614eac42..9ce1e3607 100644 --- a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp +++ b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp @@ -20,7 +20,7 @@ #include "crossdissolvetransition.h" -OLIVE_NAMESPACE_ENTER +namespace olive { CrossDissolveTransition::CrossDissolveTransition() { @@ -86,4 +86,4 @@ void CrossDissolveTransition::SampleJobEvent(SampleBufferPtr from_samples, Sampl } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/block/transition/crossdissolve/crossdissolvetransition.h b/app/node/block/transition/crossdissolve/crossdissolvetransition.h index 3a68ddea8..f21d3fd7e 100644 --- a/app/node/block/transition/crossdissolve/crossdissolvetransition.h +++ b/app/node/block/transition/crossdissolve/crossdissolvetransition.h @@ -23,7 +23,7 @@ #include "node/block/transition/transition.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CrossDissolveTransition : public TransitionBlock { @@ -47,6 +47,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // CROSSDISSOLVETRANSITION_H diff --git a/app/node/block/transition/diptocolor/diptocolortransition.cpp b/app/node/block/transition/diptocolor/diptocolortransition.cpp index 03751374a..6925ffa25 100644 --- a/app/node/block/transition/diptocolor/diptocolortransition.cpp +++ b/app/node/block/transition/diptocolor/diptocolortransition.cpp @@ -20,7 +20,7 @@ #include "diptocolortransition.h" -OLIVE_NAMESPACE_ENTER +namespace olive { DipToColorTransition::DipToColorTransition() { @@ -65,4 +65,4 @@ void DipToColorTransition::ShaderJobEvent(NodeValueDatabase &value, ShaderJob &j job.InsertValue(color_input_, value); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/block/transition/diptocolor/diptocolortransition.h b/app/node/block/transition/diptocolor/diptocolortransition.h index 3a1dd6cc2..0f54b272b 100644 --- a/app/node/block/transition/diptocolor/diptocolortransition.h +++ b/app/node/block/transition/diptocolor/diptocolortransition.h @@ -23,7 +23,7 @@ #include "node/block/transition/transition.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class DipToColorTransition : public TransitionBlock { @@ -48,6 +48,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // DIPTOCOLORTRANSITION_H diff --git a/app/node/block/transition/transition.cpp b/app/node/block/transition/transition.cpp index 554e7fd15..eacffe377 100644 --- a/app/node/block/transition/transition.cpp +++ b/app/node/block/transition/transition.cpp @@ -22,7 +22,7 @@ #include "common/clamp.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TransitionBlock::TransitionBlock() : connected_out_block_(nullptr), @@ -319,4 +319,4 @@ double TransitionBlock::TransformCurve(double linear) const return linear; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/block/transition/transition.h b/app/node/block/transition/transition.h index 69dc2b2ec..8a6acca7e 100644 --- a/app/node/block/transition/transition.h +++ b/app/node/block/transition/transition.h @@ -23,7 +23,7 @@ #include "node/block/block.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TransitionBlock : public Block { @@ -91,6 +91,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TRANSITIONBLOCK_H diff --git a/app/node/edge.cpp b/app/node/edge.cpp index 0fd475d9f..ed6f8efbe 100644 --- a/app/node/edge.cpp +++ b/app/node/edge.cpp @@ -24,7 +24,7 @@ #include "node.h" #include "output.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeEdge::NodeEdge(NodeOutput *output, NodeInput *input) { @@ -47,4 +47,4 @@ NodeEdge::Connection NodeEdge::ParamToConnection(NodeParam *param) return {param->parentNode(), param->id()}; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/edge.h b/app/node/edge.h index dca841edd..a3f377741 100644 --- a/app/node/edge.h +++ b/app/node/edge.h @@ -26,7 +26,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Node; class NodeInput; @@ -82,6 +82,6 @@ private: using NodeEdgePtr = std::shared_ptr; -OLIVE_NAMESPACE_EXIT +} #endif // EDGE_H diff --git a/app/node/factory.cpp b/app/node/factory.cpp index e81bfc405..a7efd6b2e 100644 --- a/app/node/factory.cpp +++ b/app/node/factory.cpp @@ -41,7 +41,7 @@ #include "output/track/track.h" #include "output/viewer/viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { QList NodeFactory::library_; void NodeFactory::Initialize() @@ -224,4 +224,4 @@ Node *NodeFactory::CreateFromFactoryIndex(const NodeFactory::InternalID &id) abort(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/factory.h b/app/node/factory.h index 5a0906ba7..eeef59986 100644 --- a/app/node/factory.h +++ b/app/node/factory.h @@ -26,7 +26,7 @@ #include "node.h" #include "widget/menu/menu.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeFactory { @@ -80,6 +80,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEFACTORY_H diff --git a/app/node/filter/blur/blur.cpp b/app/node/filter/blur/blur.cpp index ce833f713..66efd333f 100644 --- a/app/node/filter/blur/blur.cpp +++ b/app/node/filter/blur/blur.cpp @@ -20,7 +20,7 @@ #include "blur.h" -OLIVE_NAMESPACE_ENTER +namespace olive { BlurFilterNode::BlurFilterNode() { @@ -128,4 +128,4 @@ NodeValueTable BlurFilterNode::Value(NodeValueDatabase &value) const return table; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/filter/blur/blur.h b/app/node/filter/blur/blur.h index 7539b440c..7a121a34b 100644 --- a/app/node/filter/blur/blur.h +++ b/app/node/filter/blur/blur.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class BlurFilterNode : public Node { @@ -58,6 +58,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // BLURFILTERNODE_H diff --git a/app/node/filter/stroke/stroke.cpp b/app/node/filter/stroke/stroke.cpp index 18358fac3..41448e04d 100644 --- a/app/node/filter/stroke/stroke.cpp +++ b/app/node/filter/stroke/stroke.cpp @@ -22,7 +22,7 @@ #include "render/color.h" -OLIVE_NAMESPACE_ENTER +namespace olive { StrokeFilterNode::StrokeFilterNode() { @@ -113,4 +113,4 @@ ShaderCode StrokeFilterNode::GetShaderCode(const QString &shader_id) const return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/stroke.frag"), QString()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/filter/stroke/stroke.h b/app/node/filter/stroke/stroke.h index 30153ba3f..fb29aea33 100644 --- a/app/node/filter/stroke/stroke.h +++ b/app/node/filter/stroke/stroke.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class StrokeFilterNode : public Node { @@ -56,6 +56,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // STROKEFILTERNODE_H diff --git a/app/node/generator/matrix/matrix.cpp b/app/node/generator/matrix/matrix.cpp index 70e77ec1b..466819fe1 100644 --- a/app/node/generator/matrix/matrix.cpp +++ b/app/node/generator/matrix/matrix.cpp @@ -26,7 +26,7 @@ #include "common/range.h" -OLIVE_NAMESPACE_ENTER +namespace olive { MatrixGenerator::MatrixGenerator() { @@ -294,4 +294,4 @@ MatrixGenerator::GizmoSharedData::GizmoSharedData(const QSize &viewport, const Q inverted_half_scale = QVector2D(1.0f / half_scale.x(), 1.0f / half_scale.y()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/generator/matrix/matrix.h b/app/node/generator/matrix/matrix.h index 30e21ff27..e782ff02c 100644 --- a/app/node/generator/matrix/matrix.h +++ b/app/node/generator/matrix/matrix.h @@ -26,7 +26,7 @@ #include "node/node.h" #include "node/inputdragger.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class MatrixGenerator : public Node { @@ -97,6 +97,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TRANSFORMDISTORT_H diff --git a/app/node/generator/polygon/polygon.cpp b/app/node/generator/polygon/polygon.cpp index dc2c6baf9..aa60ee396 100644 --- a/app/node/generator/polygon/polygon.cpp +++ b/app/node/generator/polygon/polygon.cpp @@ -23,7 +23,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { PolygonGenerator::PolygonGenerator() { @@ -204,4 +204,4 @@ QVector PolygonGenerator::GetGizmoRects(const QVector &points) return rects; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/generator/polygon/polygon.h b/app/node/generator/polygon/polygon.h index 2d38fcb44..645e8c5de 100644 --- a/app/node/generator/polygon/polygon.h +++ b/app/node/generator/polygon/polygon.h @@ -24,7 +24,7 @@ #include "node/node.h" #include "node/inputdragger.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PolygonGenerator : public Node { @@ -68,6 +68,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // POLYGONGENERATOR_H diff --git a/app/node/generator/solid/solid.cpp b/app/node/generator/solid/solid.cpp index d82c0e903..15e5b1d2c 100644 --- a/app/node/generator/solid/solid.cpp +++ b/app/node/generator/solid/solid.cpp @@ -22,7 +22,7 @@ #include "render/color.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SolidGenerator::SolidGenerator() { @@ -80,4 +80,4 @@ ShaderCode SolidGenerator::GetShaderCode(const QString &shader_id) const return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/solid.frag"), QString()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/generator/solid/solid.h b/app/node/generator/solid/solid.h index 95be72a55..dbf21cf93 100644 --- a/app/node/generator/solid/solid.h +++ b/app/node/generator/solid/solid.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SolidGenerator : public Node { @@ -48,6 +48,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // SOLIDGENERATOR_H diff --git a/app/node/generator/text/text.cpp b/app/node/generator/text/text.cpp index d88e3cd1e..c221f709f 100644 --- a/app/node/generator/text/text.cpp +++ b/app/node/generator/text/text.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { enum TextVerticalAlign { kVerticalAlignTop, @@ -176,4 +176,4 @@ void TextGenerator::GenerateFrame(FramePtr frame, const GenerateJob& job) const } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/generator/text/text.h b/app/node/generator/text/text.h index 34c452251..f672459a5 100644 --- a/app/node/generator/text/text.h +++ b/app/node/generator/text/text.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TextGenerator : public Node { @@ -57,6 +57,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TEXTGENERATOR_H diff --git a/app/node/graph.cpp b/app/node/graph.cpp index 676647e12..37b674d64 100644 --- a/app/node/graph.cpp +++ b/app/node/graph.cpp @@ -20,7 +20,7 @@ #include "graph.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeGraph::NodeGraph() : operation_stack_(0) @@ -164,4 +164,4 @@ bool NodeGraph::ContainsNode(Node *n) const return (n->parent() == this); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/graph.h b/app/node/graph.h index 0a3e86c9f..e722403d7 100644 --- a/app/node/graph.h +++ b/app/node/graph.h @@ -25,7 +25,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A collection of nodes @@ -110,6 +110,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEGRAPH_H diff --git a/app/node/input.cpp b/app/node/input.cpp index dac383689..c305f8557 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -35,7 +35,7 @@ #include "project/item/footage/stream.h" #include "render/color.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeInput::NodeInput(const QString& id, const DataType &type, const QVector &default_value) : NodeParam(id) @@ -1215,4 +1215,4 @@ void NodeInput::set_combobox_strings(const QStringList &strings) set_property(QStringLiteral("combo_str"), strings); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/input.h b/app/node/input.h index ab50925f4..86a10a823 100644 --- a/app/node/input.h +++ b/app/node/input.h @@ -25,7 +25,7 @@ #include "keyframe.h" #include "param.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A node parameter designed to take either user input or data from another node @@ -295,7 +295,7 @@ public: QVector GetImmediateDependencies() const; signals: - void ValueChanged(const OLIVE_NAMESPACE::TimeRange& range); + void ValueChanged(const olive::TimeRange& range); void KeyframeEnableChanged(bool); @@ -431,6 +431,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEINPUT_H diff --git a/app/node/input/media/audio/audio.cpp b/app/node/input/media/audio/audio.cpp index d98118880..fe0faff7d 100644 --- a/app/node/input/media/audio/audio.cpp +++ b/app/node/input/media/audio/audio.cpp @@ -20,7 +20,7 @@ #include "audio.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Node *AudioInput::copy() const { @@ -52,4 +52,4 @@ QString AudioInput::Description() const return tr("Import an audio footage stream."); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/input/media/audio/audio.h b/app/node/input/media/audio/audio.h index 0690c4f42..7a2b8a272 100644 --- a/app/node/input/media/audio/audio.h +++ b/app/node/input/media/audio/audio.h @@ -23,7 +23,7 @@ #include "../media.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AudioInput : public MediaInput { @@ -42,6 +42,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOINPUT_H diff --git a/app/node/input/media/media.cpp b/app/node/input/media/media.cpp index bd57ad7f9..a7ad7f953 100644 --- a/app/node/input/media/media.cpp +++ b/app/node/input/media/media.cpp @@ -23,7 +23,7 @@ #include "common/timecodefunctions.h" #include "common/tohex.h" -OLIVE_NAMESPACE_ENTER +namespace olive { MediaInput::MediaInput() : connected_footage_(nullptr) @@ -98,4 +98,4 @@ void MediaInput::FootageParametersChanged() InvalidateCache(TimeRange(0, RATIONAL_MAX), footage_input_, footage_input_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/input/media/media.h b/app/node/input/media/media.h index f0fae920d..c7b23ca08 100644 --- a/app/node/input/media/media.h +++ b/app/node/input/media/media.h @@ -25,7 +25,7 @@ #include "node/node.h" #include "project/item/footage/stream.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A node that imports an image @@ -62,6 +62,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // MEDIAINPUT_H diff --git a/app/node/input/media/video/video.cpp b/app/node/input/media/video/video.cpp index 3163d327c..3bcf98352 100644 --- a/app/node/input/media/video/video.cpp +++ b/app/node/input/media/video/video.cpp @@ -28,7 +28,7 @@ #include "core.h" #include "project/item/footage/footage.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Node *VideoInput::copy() const { @@ -60,4 +60,4 @@ QString VideoInput::Description() const return tr("Import a video footage stream."); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/input/media/video/video.h b/app/node/input/media/video/video.h index 785634de8..0606ceece 100644 --- a/app/node/input/media/video/video.h +++ b/app/node/input/media/video/video.h @@ -26,7 +26,7 @@ #include "../media.h" #include "render/colormanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class VideoInput : public MediaInput { @@ -45,6 +45,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIDEOINPUT_H diff --git a/app/node/input/time/timeinput.cpp b/app/node/input/time/timeinput.cpp index 75fa6888d..101e738e8 100644 --- a/app/node/input/time/timeinput.cpp +++ b/app/node/input/time/timeinput.cpp @@ -20,7 +20,7 @@ #include "timeinput.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimeInput::TimeInput() { @@ -71,4 +71,4 @@ void TimeInput::Hash(QCryptographicHash &hash, const rational &time) const hash.addData(NodeParam::ValueToBytes(NodeParam::kRational, QVariant::fromValue(time))); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/input/time/timeinput.h b/app/node/input/time/timeinput.h index 1f898a98f..eb2dac8f2 100644 --- a/app/node/input/time/timeinput.h +++ b/app/node/input/time/timeinput.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimeInput : public Node { @@ -44,6 +44,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMEINPUT_H diff --git a/app/node/inputarray.cpp b/app/node/inputarray.cpp index 1203e4a4d..6811e8633 100644 --- a/app/node/inputarray.cpp +++ b/app/node/inputarray.cpp @@ -25,7 +25,7 @@ #include "common/xmlutils.h" #include "node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeInputArray::NodeInputArray(const QString &id, const DataType &type, const QVariant &default_value) : NodeInput(id, type, default_value), @@ -235,4 +235,4 @@ void NodeInputArray::SaveInternal(QXmlStreamWriter *writer) const writer->writeEndElement(); // subparameters } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/inputarray.h b/app/node/inputarray.h index 7acb192d8..4af48cd5c 100644 --- a/app/node/inputarray.h +++ b/app/node/inputarray.h @@ -23,7 +23,7 @@ #include "input.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeInputArray : public NodeInput { @@ -74,6 +74,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // INPUTARRAY_H diff --git a/app/node/inputdragger.cpp b/app/node/inputdragger.cpp index 0edb8b85b..b6708d326 100644 --- a/app/node/inputdragger.cpp +++ b/app/node/inputdragger.cpp @@ -24,7 +24,7 @@ #include "node.h" #include "widget/nodeparamview/nodeparamviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeInputDragger::NodeInputDragger() : input_(nullptr) @@ -115,4 +115,4 @@ void NodeInputDragger::End() input_ = nullptr; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/inputdragger.h b/app/node/inputdragger.h index 17038f003..f9f20d490 100644 --- a/app/node/inputdragger.h +++ b/app/node/inputdragger.h @@ -23,7 +23,7 @@ #include "node/input.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeInputDragger { @@ -55,6 +55,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEINPUTDRAGGER_H diff --git a/app/node/keyframe.cpp b/app/node/keyframe.cpp index 1112f10ec..dd3ae2de3 100644 --- a/app/node/keyframe.cpp +++ b/app/node/keyframe.cpp @@ -20,7 +20,7 @@ #include "keyframe.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const NodeKeyframe::Type NodeKeyframe::kDefaultType = kLinear; @@ -145,4 +145,4 @@ void NodeKeyframe::set_parent(NodeInput *parent) parent_ = parent; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/keyframe.h b/app/node/keyframe.h index f386f7fad..517defe6d 100644 --- a/app/node/keyframe.h +++ b/app/node/keyframe.h @@ -27,7 +27,7 @@ #include "common/rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeInput; @@ -164,8 +164,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::NodeKeyframe::Type) +Q_DECLARE_METATYPE(olive::NodeKeyframe::Type) #endif // NODEKEYFRAME_H diff --git a/app/node/math/math/math.cpp b/app/node/math/math/math.cpp index 72dc8ae73..caa4d8f42 100644 --- a/app/node/math/math/math.cpp +++ b/app/node/math/math/math.cpp @@ -20,7 +20,7 @@ #include "math.h" -OLIVE_NAMESPACE_ENTER +namespace olive { MathNode::MathNode() { @@ -119,4 +119,4 @@ void MathNode::ProcessSamples(NodeValueDatabase &values, const SampleBufferPtr i return ProcessSamplesInternal(values, GetOperation(), param_a_in_, param_b_in_, input, output, index); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/math/math/math.h b/app/node/math/math/math.h index e516a8f21..5d9584d77 100644 --- a/app/node/math/math/math.h +++ b/app/node/math/math/math.h @@ -23,7 +23,7 @@ #include "mathbase.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class MathNode : public MathNodeBase { @@ -75,6 +75,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // MATHNODE_H diff --git a/app/node/math/math/mathbase.cpp b/app/node/math/math/mathbase.cpp index 66bd28788..bc83d5b5b 100644 --- a/app/node/math/math/mathbase.cpp +++ b/app/node/math/math/mathbase.cpp @@ -26,7 +26,7 @@ #include "common/tohex.h" #include "render/color.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ShaderCode MathNodeBase::GetShaderCodeInternal(const QString &shader_id, NodeInput *param_a_in, olive::NodeInput *param_b_in) const { @@ -611,4 +611,4 @@ T MathNodeBase::PerformAddSubMultDiv(Operation operation, T a, U b) return a; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/math/math/mathbase.h b/app/node/math/math/mathbase.h index 2d563c192..e54ac2f58 100644 --- a/app/node/math/math/mathbase.h +++ b/app/node/math/math/mathbase.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class MathNodeBase : public Node { @@ -119,6 +119,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // MATHNODEBASE_H diff --git a/app/node/math/merge/merge.cpp b/app/node/math/merge/merge.cpp index d837c3269..b85096458 100644 --- a/app/node/math/merge/merge.cpp +++ b/app/node/math/merge/merge.cpp @@ -20,7 +20,7 @@ #include "merge.h" -OLIVE_NAMESPACE_ENTER +namespace olive { MergeNode::MergeNode() { @@ -117,4 +117,4 @@ void MergeNode::Hash(QCryptographicHash &hash, const rational &time) const } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/math/merge/merge.h b/app/node/math/merge/merge.h index 3a7af401f..6fd205734 100644 --- a/app/node/math/merge/merge.h +++ b/app/node/math/merge/merge.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class MergeNode : public Node { @@ -55,6 +55,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // MERGENODE_H diff --git a/app/node/math/trigonometry/trigonometry.cpp b/app/node/math/trigonometry/trigonometry.cpp index 6cdb24e72..89119db60 100644 --- a/app/node/math/trigonometry/trigonometry.cpp +++ b/app/node/math/trigonometry/trigonometry.cpp @@ -20,7 +20,7 @@ #include "trigonometry.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TrigonometryNode::TrigonometryNode() { @@ -118,4 +118,4 @@ NodeValueTable TrigonometryNode::Value(NodeValueDatabase &value) const return table; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/math/trigonometry/trigonometry.h b/app/node/math/trigonometry/trigonometry.h index 148a0bb40..86c74d235 100644 --- a/app/node/math/trigonometry/trigonometry.h +++ b/app/node/math/trigonometry/trigonometry.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TrigonometryNode : public Node { @@ -61,6 +61,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TRIGNODE_H diff --git a/app/node/node.cpp b/app/node/node.cpp index 4d9f227c3..98727515e 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -31,7 +31,7 @@ #include "project/item/footage/videostream.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Node::Node() : can_be_deleted_(true) @@ -933,4 +933,4 @@ void Node::InputConnectionChanged(NodeEdgePtr edge) InvalidateCache(TimeRange(RATIONAL_MIN, RATIONAL_MAX), edge->input(), edge->input()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/node.h b/app/node/node.h index 308af12dd..7a47d02ff 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -41,7 +41,7 @@ #include "render/job/shaderjob.h" #include "render/shadercode.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A single processing unit that can be connected with others to create intricate processing systems @@ -444,7 +444,7 @@ protected: virtual QVector GetInputsToHash() const; protected slots: - void InputChanged(const OLIVE_NAMESPACE::TimeRange &range); + void InputChanged(const olive::TimeRange &range); void InputConnectionChanged(NodeEdgePtr edge); @@ -586,6 +586,6 @@ QVector Node::FindOutputNode() using NodePtr = std::shared_ptr; -OLIVE_NAMESPACE_EXIT +} #endif // NODE_H diff --git a/app/node/output.cpp b/app/node/output.cpp index 72bfd3340..3f9320c67 100644 --- a/app/node/output.cpp +++ b/app/node/output.cpp @@ -23,7 +23,7 @@ #include "common/xmlutils.h" #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeOutput::NodeOutput(const QString &id) : NodeParam(id) @@ -68,4 +68,4 @@ void NodeOutput::Save(QXmlStreamWriter *writer) const writer->writeAttribute("ptr", QString::number(reinterpret_cast(this))); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/output.h b/app/node/output.h index bef01c7fe..26ad2141a 100644 --- a/app/node/output.h +++ b/app/node/output.h @@ -24,7 +24,7 @@ #include "common/timerange.h" #include "param.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A node parameter designed to serve data to the input of another node @@ -53,6 +53,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEOUTPUT_H diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index 1304ed63c..723d97003 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -27,7 +27,7 @@ #include "node/block/gap/gap.h" #include "node/graph.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const double TrackOutput::kTrackHeightDefault = 3.0; const double TrackOutput::kTrackHeightMinimum = 1.5; @@ -602,4 +602,4 @@ void TrackOutput::MutedInputValueChanged() emit MutedChanged(IsMuted()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/output/track/track.h b/app/node/output/track/track.h index 047ca7588..a5dd8b112 100644 --- a/app/node/output/track/track.h +++ b/app/node/output/track/track.h @@ -25,7 +25,7 @@ #include "node/block/block.h" #include "timeline/timelinecommon.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A time traversal Node for sorting through one channel/track of Blocks @@ -304,6 +304,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TRACKOUTPUT_H diff --git a/app/node/output/track/tracklist.cpp b/app/node/output/track/tracklist.cpp index 36178e449..d4e5ae8fe 100644 --- a/app/node/output/track/tracklist.cpp +++ b/app/node/output/track/tracklist.cpp @@ -25,7 +25,7 @@ #include "node/math/merge/merge.h" #include "node/output/viewer/viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TrackList::TrackList(ViewerOutput *parent, const Timeline::TrackType &type, NodeInputArray *track_input) : QObject(parent), @@ -274,4 +274,4 @@ void TrackList::TrackHeightChangedSlot(int height) emit TrackHeightChanged(static_cast(sender())->Index(), height); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/output/track/tracklist.h b/app/node/output/track/tracklist.h index 8af67abed..5dd3dbe84 100644 --- a/app/node/output/track/tracklist.h +++ b/app/node/output/track/tracklist.h @@ -27,7 +27,7 @@ #include "node/output/track/track.h" #include "timeline/timelinecommon.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ViewerOutput; @@ -114,6 +114,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TRACKLIST_H diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index 8d26336b9..37b6529ad 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -22,7 +22,7 @@ #include "node/traverser.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ViewerOutput::ViewerOutput() : video_frame_cache_(this), @@ -345,4 +345,4 @@ void ViewerOutput::TrackHeightChangedSlot(int index, int height) emit TrackHeightChanged(static_cast(sender())->type(), index, height); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/output/viewer/viewer.h b/app/node/output/viewer/viewer.h index 886195135..66d111bd0 100644 --- a/app/node/output/viewer/viewer.h +++ b/app/node/output/viewer/viewer.h @@ -34,7 +34,7 @@ #include "timeline/timelinecommon.h" #include "timeline/trackreference.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A bridge between a node system and a ViewerPanel @@ -196,6 +196,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWER_H diff --git a/app/node/param.cpp b/app/node/param.cpp index b26df62ad..3d1ce2c17 100644 --- a/app/node/param.cpp +++ b/app/node/param.cpp @@ -31,7 +31,7 @@ #include "node/output.h" #include "render/color.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeParam::NodeParam(const QString &id) : id_(id), @@ -286,4 +286,4 @@ QByteArray NodeParam::ValueToBytesInternal(const QVariant &v) return bytes; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/param.h b/app/node/param.h index e0cffb354..0852fa7df 100644 --- a/app/node/param.h +++ b/app/node/param.h @@ -30,7 +30,7 @@ #include "common/xmlutils.h" #include "node/edge.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Node; @@ -432,6 +432,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPARAM_H diff --git a/app/node/traverser.cpp b/app/node/traverser.cpp index bd87ade63..92b777fbe 100644 --- a/app/node/traverser.cpp +++ b/app/node/traverser.cpp @@ -22,7 +22,7 @@ #include "node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeValueDatabase NodeTraverser::GenerateDatabase(const Node* node, const TimeRange &range) { @@ -265,4 +265,4 @@ void NodeTraverser::PostProcessTable(const Node *node, const TimeRange &range, N } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/traverser.h b/app/node/traverser.h index b4a722813..87c4019d1 100644 --- a/app/node/traverser.h +++ b/app/node/traverser.h @@ -27,7 +27,7 @@ #include "project/item/footage/stream.h" #include "value.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeTraverser : public CancelableObject { @@ -63,6 +63,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODETRAVERSER_H diff --git a/app/node/value.cpp b/app/node/value.cpp index fc994b125..3c52d3ea0 100644 --- a/app/node/value.cpp +++ b/app/node/value.cpp @@ -20,7 +20,7 @@ #include "value.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeValueTable NodeValueDatabase::Merge() const { @@ -153,4 +153,4 @@ int NodeValueTable::GetInternal(const NodeParam::DataType &type, const QString & return index; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/node/value.h b/app/node/value.h index 6d089ae8c..7ccc9c5e4 100644 --- a/app/node/value.h +++ b/app/node/value.h @@ -26,7 +26,7 @@ #include "input.h" #include "render/shadervalue.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeValue { @@ -184,10 +184,10 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::NodeValue) -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::NodeValueTable) -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::NodeValueDatabase) +Q_DECLARE_METATYPE(olive::NodeValue) +Q_DECLARE_METATYPE(olive::NodeValueTable) +Q_DECLARE_METATYPE(olive::NodeValueDatabase) #endif // VALUE_H diff --git a/app/panel/audiomonitor/audiomonitor.cpp b/app/panel/audiomonitor/audiomonitor.cpp index 8a33e8e6b..d937a2a07 100644 --- a/app/panel/audiomonitor/audiomonitor.cpp +++ b/app/panel/audiomonitor/audiomonitor.cpp @@ -20,7 +20,7 @@ #include "audiomonitor.h" -OLIVE_NAMESPACE_ENTER +namespace olive { AudioMonitorPanel::AudioMonitorPanel(QWidget *parent) : PanelWidget(QStringLiteral("AudioMonitor"), parent) @@ -37,4 +37,4 @@ void AudioMonitorPanel::Retranslate() SetTitle(tr("Audio Monitor")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/audiomonitor/audiomonitor.h b/app/panel/audiomonitor/audiomonitor.h index 567213047..2915edfca 100644 --- a/app/panel/audiomonitor/audiomonitor.h +++ b/app/panel/audiomonitor/audiomonitor.h @@ -24,7 +24,7 @@ #include "widget/audiomonitor/audiomonitor.h" #include "widget/panel/panel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief PanelWidget wrapper around an AudioMonitor @@ -42,6 +42,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOMONITORPANEL_H diff --git a/app/panel/curve/curve.cpp b/app/panel/curve/curve.cpp index b81a99b0b..3357dc861 100644 --- a/app/panel/curve/curve.cpp +++ b/app/panel/curve/curve.cpp @@ -20,7 +20,7 @@ #include "curve.h" -OLIVE_NAMESPACE_ENTER +namespace olive { CurvePanel::CurvePanel(QWidget *parent) : TimeBasedPanel(QStringLiteral("CurvePanel"), parent) @@ -61,4 +61,4 @@ void CurvePanel::Retranslate() SetTitle(tr("Curve Editor")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/curve/curve.h b/app/panel/curve/curve.h index 4a5b6bb92..301e1e976 100644 --- a/app/panel/curve/curve.h +++ b/app/panel/curve/curve.h @@ -24,7 +24,7 @@ #include "panel/timebased/timebased.h" #include "widget/curvewidget/curvewidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CurvePanel : public TimeBasedPanel { @@ -46,6 +46,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // CURVEPANEL_H diff --git a/app/panel/footageviewer/footageviewer.cpp b/app/panel/footageviewer/footageviewer.cpp index e23dad1e0..90b43f6f6 100644 --- a/app/panel/footageviewer/footageviewer.cpp +++ b/app/panel/footageviewer/footageviewer.cpp @@ -22,7 +22,7 @@ #include "widget/viewer/footageviewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { FootageViewerPanel::FootageViewerPanel(QWidget *parent) : ViewerPanelBase(QStringLiteral("FootageViewerPanel"), parent) @@ -72,4 +72,4 @@ void FootageViewerPanel::Retranslate() SetTitle(tr("Footage Viewer")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/footageviewer/footageviewer.h b/app/panel/footageviewer/footageviewer.h index b2925b8ed..d4f0d0bba 100644 --- a/app/panel/footageviewer/footageviewer.h +++ b/app/panel/footageviewer/footageviewer.h @@ -26,7 +26,7 @@ #include "panel/viewer/viewerbase.h" #include "panel/project/footagemanagementpanel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Dockable wrapper around a ViewerWidget @@ -45,6 +45,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // FOOTAGE_VIEWER_PANEL_H diff --git a/app/panel/node/node.cpp b/app/panel/node/node.cpp index 5953893d8..7d4177db3 100644 --- a/app/panel/node/node.cpp +++ b/app/panel/node/node.cpp @@ -20,7 +20,7 @@ #include "node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodePanel::NodePanel(QWidget *parent) : PanelWidget(QStringLiteral("NodePanel"), parent) @@ -39,4 +39,4 @@ NodePanel::NodePanel(QWidget *parent) : Retranslate(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/node/node.h b/app/panel/node/node.h index 7582073fa..b0aa5e187 100644 --- a/app/panel/node/node.h +++ b/app/panel/node/node.h @@ -24,7 +24,7 @@ #include "widget/nodeview/nodeview.h" #include "widget/panel/panel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A PanelWidget wrapper around a NodeView @@ -111,6 +111,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPANEL_H diff --git a/app/panel/panelmanager.cpp b/app/panel/panelmanager.cpp index a2c5d76a2..fdeff1f9d 100644 --- a/app/panel/panelmanager.cpp +++ b/app/panel/panelmanager.cpp @@ -22,7 +22,7 @@ #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PanelManager* PanelManager::instance_ = nullptr; @@ -164,4 +164,4 @@ void PanelManager::PanelDestroyed() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/panelmanager.h b/app/panel/panelmanager.h index cd73c0402..50311a4b5 100644 --- a/app/panel/panelmanager.h +++ b/app/panel/panelmanager.h @@ -26,7 +26,7 @@ #include "widget/panel/panel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The PanelFocusManager class @@ -232,6 +232,6 @@ QList PanelManager::GetPanelsOfType() return panels; } -OLIVE_NAMESPACE_EXIT +} #endif // PANELFOCUSMANAGER_H diff --git a/app/panel/param/param.cpp b/app/panel/param/param.cpp index 35dfba91d..068ee3aae 100644 --- a/app/panel/param/param.cpp +++ b/app/panel/param/param.cpp @@ -22,7 +22,7 @@ #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ParamPanel::ParamPanel(QWidget* parent) : TimeBasedPanel(QStringLiteral("ParamPanel"), parent) @@ -70,4 +70,4 @@ void ParamPanel::Retranslate() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/param/param.h b/app/panel/param/param.h index 6f9ce30e5..a2106d812 100644 --- a/app/panel/param/param.h +++ b/app/panel/param/param.h @@ -25,7 +25,7 @@ #include "panel/timebased/timebased.h" #include "widget/nodeparamview/nodeparamview.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ParamPanel : public TimeBasedPanel { @@ -51,6 +51,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // PARAM_H diff --git a/app/panel/pixelsampler/pixelsamplerpanel.cpp b/app/panel/pixelsampler/pixelsamplerpanel.cpp index 15281a284..d2fcc8d04 100644 --- a/app/panel/pixelsampler/pixelsamplerpanel.cpp +++ b/app/panel/pixelsampler/pixelsamplerpanel.cpp @@ -20,7 +20,7 @@ #include "pixelsamplerpanel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PixelSamplerPanel::PixelSamplerPanel(QWidget *parent) : PanelWidget(QStringLiteral("ProjectPanel"), parent) @@ -41,4 +41,4 @@ void PixelSamplerPanel::Retranslate() SetTitle(tr("Pixel Sampler")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/pixelsampler/pixelsamplerpanel.h b/app/panel/pixelsampler/pixelsamplerpanel.h index 812fec51a..0da27c12c 100644 --- a/app/panel/pixelsampler/pixelsamplerpanel.h +++ b/app/panel/pixelsampler/pixelsamplerpanel.h @@ -24,7 +24,7 @@ #include "widget/panel/panel.h" #include "widget/pixelsampler/pixelsampler.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PixelSamplerPanel : public PanelWidget { @@ -42,6 +42,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PIXELSAMPLERPANEL_H diff --git a/app/panel/project/footagemanagementpanel.h b/app/panel/project/footagemanagementpanel.h index c1ec1ba64..e962e22ef 100644 --- a/app/panel/project/footagemanagementpanel.h +++ b/app/panel/project/footagemanagementpanel.h @@ -25,13 +25,13 @@ #include "project/item/footage/footage.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FootageManagementPanel { public: virtual QList GetSelectedFootage() const = 0; }; -OLIVE_NAMESPACE_EXIT +} #endif // FOOTAGEMANAGEMENTPANEL_H diff --git a/app/panel/project/project.cpp b/app/panel/project/project.cpp index 928956c60..7fbd9560f 100644 --- a/app/panel/project/project.cpp +++ b/app/panel/project/project.cpp @@ -32,7 +32,7 @@ #include "widget/projecttoolbar/projecttoolbar.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectPanel::ProjectPanel(QWidget *parent) : PanelWidget(QStringLiteral("ProjectPanel"), parent) @@ -243,4 +243,4 @@ QList ProjectPanel::GetSelectedFootage() const return footage; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/project/project.h b/app/panel/project/project.h index 345a44d8f..5d15e50ad 100644 --- a/app/panel/project/project.h +++ b/app/panel/project/project.h @@ -26,7 +26,7 @@ #include "widget/panel/panel.h" #include "widget/projectexplorer/projectexplorer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A PanelWidget wrapper around a ProjectExplorer and a ProjectToolbar @@ -80,8 +80,8 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::ProjectPtr) +Q_DECLARE_METATYPE(olive::ProjectPtr) #endif // PROJECT_PANEL_H diff --git a/app/panel/scope/scope.cpp b/app/panel/scope/scope.cpp index 936f68f9b..753443a62 100644 --- a/app/panel/scope/scope.cpp +++ b/app/panel/scope/scope.cpp @@ -24,7 +24,7 @@ #include "panel/viewer/viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ScopePanel::ScopePanel(QWidget* parent) : PanelWidget(QStringLiteral("ScopePanel"), parent) @@ -105,4 +105,4 @@ void ScopePanel::Retranslate() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/scope/scope.h b/app/panel/scope/scope.h index 30622fbf3..2478b5859 100644 --- a/app/panel/scope/scope.h +++ b/app/panel/scope/scope.h @@ -28,7 +28,7 @@ #include "widget/scope/histogram/histogram.h" #include "widget/scope/waveform/waveform.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ViewerPanel; @@ -70,6 +70,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // SCOPE_PANEL_H diff --git a/app/panel/sequenceviewer/sequenceviewer.cpp b/app/panel/sequenceviewer/sequenceviewer.cpp index 0292ae445..44f6910f2 100644 --- a/app/panel/sequenceviewer/sequenceviewer.cpp +++ b/app/panel/sequenceviewer/sequenceviewer.cpp @@ -20,7 +20,7 @@ #include "sequenceviewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SequenceViewerPanel::SequenceViewerPanel(QWidget *parent) : ViewerPanel(QStringLiteral("SequenceViewerPanel"), parent) @@ -36,4 +36,4 @@ void SequenceViewerPanel::Retranslate() SetTitle(tr("Sequence Viewer")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/sequenceviewer/sequenceviewer.h b/app/panel/sequenceviewer/sequenceviewer.h index 9c86eb156..e03d2c828 100644 --- a/app/panel/sequenceviewer/sequenceviewer.h +++ b/app/panel/sequenceviewer/sequenceviewer.h @@ -23,7 +23,7 @@ #include "panel/viewer/viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SequenceViewerPanel : public ViewerPanel { @@ -36,6 +36,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // SEQUENCEVIEWERPANEL_H diff --git a/app/panel/table/table.cpp b/app/panel/table/table.cpp index 0ee975248..a863078a9 100644 --- a/app/panel/table/table.cpp +++ b/app/panel/table/table.cpp @@ -20,7 +20,7 @@ #include "table.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeTablePanel::NodeTablePanel(QWidget* parent) : TimeBasedPanel(QStringLiteral("NodeTablePanel"), parent) @@ -35,4 +35,4 @@ void NodeTablePanel::Retranslate() SetTitle(tr("Table View")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/table/table.h b/app/panel/table/table.h index 7667f0294..d7dac3f2e 100644 --- a/app/panel/table/table.h +++ b/app/panel/table/table.h @@ -24,7 +24,7 @@ #include "panel/timebased/timebased.h" #include "widget/nodetableview/nodetablewidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeTablePanel : public TimeBasedPanel { @@ -48,6 +48,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODETABLEPANEL_H diff --git a/app/panel/taskmanager/taskmanager.cpp b/app/panel/taskmanager/taskmanager.cpp index f7d9309c8..e50193158 100644 --- a/app/panel/taskmanager/taskmanager.cpp +++ b/app/panel/taskmanager/taskmanager.cpp @@ -22,7 +22,7 @@ #include "task/taskmanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TaskManagerPanel::TaskManagerPanel(QWidget* parent) : PanelWidget(QStringLiteral("TaskManagerPanel"), parent) @@ -48,4 +48,4 @@ void TaskManagerPanel::Retranslate() SetTitle(tr("Task Manager")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/taskmanager/taskmanager.h b/app/panel/taskmanager/taskmanager.h index 6ae0daba1..af1ac8a8d 100644 --- a/app/panel/taskmanager/taskmanager.h +++ b/app/panel/taskmanager/taskmanager.h @@ -24,7 +24,7 @@ #include "widget/taskview/taskview.h" #include "widget/panel/panel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A PanelWidget wrapper around a TaskView widget @@ -41,6 +41,6 @@ private: TaskView* view_; }; -OLIVE_NAMESPACE_EXIT +} #endif // TASKMANAGER_H diff --git a/app/panel/timebased/timebased.cpp b/app/panel/timebased/timebased.cpp index c48c111cb..be52e2ca5 100644 --- a/app/panel/timebased/timebased.cpp +++ b/app/panel/timebased/timebased.cpp @@ -20,7 +20,7 @@ #include "timebased.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimeBasedPanel::TimeBasedPanel(const QString &object_name, QWidget *parent) : PanelWidget(object_name, parent), @@ -214,4 +214,4 @@ void TimeBasedPanel::GoToOut() GetTimeBasedWidget()->GoToOut(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/timebased/timebased.h b/app/panel/timebased/timebased.h index 8e998f02d..ef0690652 100644 --- a/app/panel/timebased/timebased.h +++ b/app/panel/timebased/timebased.h @@ -24,7 +24,7 @@ #include "widget/panel/panel.h" #include "widget/timebased/timebased.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimeBasedPanel : public PanelWidget { @@ -118,6 +118,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMEBASEDPANEL_H diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index 124e99a36..cdfcd13d9 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -23,7 +23,7 @@ #include "panel/panelmanager.h" #include "panel/project/footagemanagementpanel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelinePanel::TimelinePanel(QWidget *parent) : TimeBasedPanel(QStringLiteral("TimelinePanel"), parent) @@ -182,4 +182,4 @@ void TimelinePanel::Retranslate() SetTitle(tr("Timeline")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/timeline/timeline.h b/app/panel/timeline/timeline.h index a0ea68116..5f88651d0 100644 --- a/app/panel/timeline/timeline.h +++ b/app/panel/timeline/timeline.h @@ -24,7 +24,7 @@ #include "panel/timebased/timebased.h" #include "widget/timelinewidget/timelinewidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Panel container for a TimelineWidget @@ -97,6 +97,6 @@ signals: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINE_PANEL_H diff --git a/app/panel/tool/tool.cpp b/app/panel/tool/tool.cpp index 9ad5cddcd..1b95e12aa 100644 --- a/app/panel/tool/tool.cpp +++ b/app/panel/tool/tool.cpp @@ -23,7 +23,7 @@ #include "core.h" #include "widget/toolbar/toolbar.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ToolPanel::ToolPanel(QWidget *parent) : PanelWidget(QStringLiteral("ToolPanel"), parent) @@ -52,4 +52,4 @@ void ToolPanel::Retranslate() SetTitle(tr("Tools")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/tool/tool.h b/app/panel/tool/tool.h index 2e2e956cb..a4d673a7a 100644 --- a/app/panel/tool/tool.h +++ b/app/panel/tool/tool.h @@ -23,7 +23,7 @@ #include "widget/panel/panel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A PanelWidget wrapper around a Toolbar @@ -39,6 +39,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TOOL_PANEL_H diff --git a/app/panel/viewer/viewer.cpp b/app/panel/viewer/viewer.cpp index 4a575b910..a79f09b52 100644 --- a/app/panel/viewer/viewer.cpp +++ b/app/panel/viewer/viewer.cpp @@ -20,7 +20,7 @@ #include "viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ViewerPanel::ViewerPanel(const QString &object_name, QWidget *parent) : ViewerPanelBase(object_name, parent) @@ -41,4 +41,4 @@ void ViewerPanel::Retranslate() SetTitle(tr("Viewer")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/viewer/viewer.h b/app/panel/viewer/viewer.h index 8309a8694..9d83e0c97 100644 --- a/app/panel/viewer/viewer.h +++ b/app/panel/viewer/viewer.h @@ -25,7 +25,7 @@ #include "viewerbase.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Dockable wrapper around a ViewerWidget @@ -40,6 +40,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWER_PANEL_H diff --git a/app/panel/viewer/viewerbase.cpp b/app/panel/viewer/viewerbase.cpp index 028fb484e..f58c5d11f 100644 --- a/app/panel/viewer/viewerbase.cpp +++ b/app/panel/viewer/viewerbase.cpp @@ -22,7 +22,7 @@ #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ViewerPanelBase::ViewerPanelBase(const QString& object_name, QWidget *parent) : TimeBasedPanel(object_name, parent) @@ -123,4 +123,4 @@ void ViewerPanelBase::closeEvent(QCloseEvent *e) TimeBasedPanel::closeEvent(e); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/panel/viewer/viewerbase.h b/app/panel/viewer/viewerbase.h index a8fe9c00a..536847631 100644 --- a/app/panel/viewer/viewerbase.h +++ b/app/panel/viewer/viewerbase.h @@ -25,7 +25,7 @@ #include "panel/timebased/timebased.h" #include "widget/viewer/viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ViewerPanelBase : public TimeBasedPanel { @@ -68,6 +68,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWERPANELBASE_H diff --git a/app/project/item/folder/folder.cpp b/app/project/item/folder/folder.cpp index 7f3b97661..6c8ec1916 100644 --- a/app/project/item/folder/folder.cpp +++ b/app/project/item/folder/folder.cpp @@ -25,7 +25,7 @@ #include "project/item/sequence/sequence.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Item::Type Folder::type() const { @@ -104,4 +104,4 @@ void Folder::Save(QXmlStreamWriter *writer) const } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/project/item/folder/folder.h b/app/project/item/folder/folder.h index cec258c44..93eaa9f6c 100644 --- a/app/project/item/folder/folder.h +++ b/app/project/item/folder/folder.h @@ -25,7 +25,7 @@ #include "project/item/footage/footage.h" #include "project/item/item.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The Folder class representing a directory in a project structure @@ -52,6 +52,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // FOLDER_H diff --git a/app/project/item/footage/audiostream.cpp b/app/project/item/footage/audiostream.cpp index 58e5b6096..70cbfbc06 100644 --- a/app/project/item/footage/audiostream.cpp +++ b/app/project/item/footage/audiostream.cpp @@ -22,7 +22,7 @@ #include "common/xmlutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { AudioStream::AudioStream() { @@ -93,4 +93,4 @@ void AudioStream::SaveCustomParameters(QXmlStreamWriter *writer) const writer->writeTextElement(QStringLiteral("rate"), QString::number(sample_rate_)); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/project/item/footage/audiostream.h b/app/project/item/footage/audiostream.h index f38b9b6c9..6941c8177 100644 --- a/app/project/item/footage/audiostream.h +++ b/app/project/item/footage/audiostream.h @@ -27,7 +27,7 @@ #include "render/audioparams.h" #include "stream.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A Stream derivative containing audio-specific information @@ -65,6 +65,6 @@ private: using AudioStreamPtr = std::shared_ptr; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOSTREAM_H diff --git a/app/project/item/footage/footage.cpp b/app/project/item/footage/footage.cpp index 5a8f03388..01da128ef 100644 --- a/app/project/item/footage/footage.cpp +++ b/app/project/item/footage/footage.cpp @@ -30,7 +30,7 @@ #include "core.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Footage::Footage() { @@ -345,4 +345,4 @@ void Footage::UpdateTooltip() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/project/item/footage/footage.h b/app/project/item/footage/footage.h index 3bc4a2b3a..ec59750d8 100644 --- a/app/project/item/footage/footage.h +++ b/app/project/item/footage/footage.h @@ -30,7 +30,7 @@ #include "project/item/footage/videostream.h" #include "timeline/timelinepoints.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Footage; using FootagePtr = std::shared_ptr; @@ -250,6 +250,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // FOOTAGE_H diff --git a/app/project/item/footage/stream.cpp b/app/project/item/footage/stream.cpp index 5e8b6dd5d..fe0d5eef5 100644 --- a/app/project/item/footage/stream.cpp +++ b/app/project/item/footage/stream.cpp @@ -23,7 +23,7 @@ #include "footage.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Stream::Stream() : footage_(nullptr), @@ -190,4 +190,4 @@ void Stream::SaveCustomParameters(QXmlStreamWriter*) const { } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/project/item/footage/stream.h b/app/project/item/footage/stream.h index e3890c6f0..e18da0542 100644 --- a/app/project/item/footage/stream.h +++ b/app/project/item/footage/stream.h @@ -30,7 +30,7 @@ #include "common/rational.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Footage; class Stream; @@ -122,9 +122,9 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #include -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::StreamPtr) +Q_DECLARE_METATYPE(olive::StreamPtr) #endif // STREAM_H diff --git a/app/project/item/footage/videostream.cpp b/app/project/item/footage/videostream.cpp index de2a846c0..2ace06129 100644 --- a/app/project/item/footage/videostream.cpp +++ b/app/project/item/footage/videostream.cpp @@ -28,7 +28,7 @@ #include "project/project.h" #include "render/colormanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { VideoStream::VideoStream() : premultiplied_alpha_(false), @@ -187,4 +187,4 @@ void VideoStream::DefaultColorSpaceChanged() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/project/item/footage/videostream.h b/app/project/item/footage/videostream.h index 9742c67f5..0377d9146 100644 --- a/app/project/item/footage/videostream.h +++ b/app/project/item/footage/videostream.h @@ -24,7 +24,7 @@ #include "render/videoparams.h" #include "stream.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A Stream derivative containing video-specific information @@ -176,6 +176,6 @@ private: using VideoStreamPtr = std::shared_ptr; -OLIVE_NAMESPACE_EXIT +} #endif // VIDEOSTREAM_H diff --git a/app/project/item/item.cpp b/app/project/item/item.cpp index cd9cf8e18..33657825e 100644 --- a/app/project/item/item.cpp +++ b/app/project/item/item.cpp @@ -20,7 +20,7 @@ #include "item.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Item::Item() : parent_(nullptr), @@ -203,4 +203,4 @@ bool Item::ChildExistsWithNameInternal(const QString &name, Item *folder) return false; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/project/item/item.h b/app/project/item/item.h index 9f67b5b1c..32ed1fb8a 100644 --- a/app/project/item/item.h +++ b/app/project/item/item.h @@ -33,7 +33,7 @@ #include "node/param.h" #include "project/item/footage/stream.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Project; @@ -123,6 +123,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // ITEM_H diff --git a/app/project/item/sequence/sequence.cpp b/app/project/item/sequence/sequence.cpp index d85b17ff4..02440f29a 100644 --- a/app/project/item/sequence/sequence.cpp +++ b/app/project/item/sequence/sequence.cpp @@ -36,7 +36,7 @@ #include "panel/sequenceviewer/sequenceviewer.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Sequence::Sequence() { @@ -352,4 +352,4 @@ void Sequence::NameChangedEvent(const QString &name) viewer_output_->set_media_name(name); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/project/item/sequence/sequence.h b/app/project/item/sequence/sequence.h index c0c6db7e8..d364c298d 100644 --- a/app/project/item/sequence/sequence.h +++ b/app/project/item/sequence/sequence.h @@ -29,7 +29,7 @@ #include "project/item/item.h" #include "timeline/timelinepoints.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Sequence; using SequencePtr = std::shared_ptr; @@ -84,6 +84,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // SEQUENCE_H diff --git a/app/project/project.cpp b/app/project/project.cpp index 9b1578ecd..839474b73 100644 --- a/app/project/project.cpp +++ b/app/project/project.cpp @@ -29,7 +29,7 @@ #include "render/diskmanager.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Project::Project() : is_modified_(false), @@ -228,4 +228,4 @@ void Project::DefaultColorSpaceChanged() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/project/project.h b/app/project/project.h index bca8872c7..e4075ca5d 100644 --- a/app/project/project.h +++ b/app/project/project.h @@ -28,7 +28,7 @@ #include "project/item/folder/folder.h" #include "window/mainwindow/mainwindowlayoutinfo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A project instance containing all the data pertaining to the user's project @@ -105,6 +105,6 @@ private slots: using ProjectPtr = std::shared_ptr; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECT_H diff --git a/app/project/projectviewmodel.cpp b/app/project/projectviewmodel.cpp index b27573f98..f11135e3e 100644 --- a/app/project/projectviewmodel.cpp +++ b/app/project/projectviewmodel.cpp @@ -27,7 +27,7 @@ #include "core.h" #include "node/input/media/media.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectViewModel::ProjectViewModel(QObject *parent) : QAbstractItemModel(parent), @@ -604,4 +604,4 @@ void ProjectViewModel::RemoveItemCommand::undo_internal() model_->AddChild(parent_, item_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/project/projectviewmodel.h b/app/project/projectviewmodel.h index e9f032e70..e524684ba 100644 --- a/app/project/projectviewmodel.h +++ b/app/project/projectviewmodel.h @@ -27,7 +27,7 @@ #include "undo/undocommand.h" #include "node/block/block.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief An adapter that interprets the data in a Project into a Qt item model for usage in ViewModel Views. @@ -251,6 +251,6 @@ private: QVector columns_; }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWMODEL_H diff --git a/app/render/audioparams.cpp b/app/render/audioparams.cpp index bcf4cfb3f..fa16a4838 100644 --- a/app/render/audioparams.cpp +++ b/app/render/audioparams.cpp @@ -26,7 +26,7 @@ extern "C" { #include -OLIVE_NAMESPACE_ENTER +namespace olive { const QVector AudioParams::kSupportedSampleRates = { 8000, // 8000 Hz @@ -195,4 +195,4 @@ QString AudioParams::ChannelLayoutToString(const uint64_t &layout) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/audioparams.h b/app/render/audioparams.h index 8cfc43c72..989fbf959 100644 --- a/app/render/audioparams.h +++ b/app/render/audioparams.h @@ -26,7 +26,7 @@ #include "common/rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AudioParams { public: @@ -132,8 +132,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::AudioParams) +Q_DECLARE_METATYPE(olive::AudioParams) #endif // AUDIOPARAMS_H diff --git a/app/render/audioplaybackcache.cpp b/app/render/audioplaybackcache.cpp index 7763ab603..03526672f 100644 --- a/app/render/audioplaybackcache.cpp +++ b/app/render/audioplaybackcache.cpp @@ -26,7 +26,7 @@ #include "common/filefunctions.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const qint64 AudioPlaybackCache::kDefaultSegmentSize = 5242880; @@ -538,4 +538,4 @@ qint64 AudioPlaybackCache::Playlist::GetLength() const return this->last().offset() + this->last().size(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/audioplaybackcache.h b/app/render/audioplaybackcache.h index 6cea5fb0f..3ea9973a2 100644 --- a/app/render/audioplaybackcache.h +++ b/app/render/audioplaybackcache.h @@ -25,7 +25,7 @@ #include "codec/samplebuffer.h" #include "render/playbackcache.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A fully integrated system of storing and playing cached audio @@ -214,6 +214,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOPLAYBACKCACHE_H diff --git a/app/render/color.cpp b/app/render/color.cpp index 2df47ed70..8167701db 100644 --- a/app/render/color.cpp +++ b/app/render/color.cpp @@ -25,7 +25,7 @@ #include "common/clamp.h" #include "common/oiioutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Color Color::fromHsv(const double &h, const double &s, const double &v) { @@ -301,9 +301,9 @@ Color Color::operator/(const double &rhs) const return c; } -OLIVE_NAMESPACE_EXIT +} -QDebug operator<<(QDebug debug, const OLIVE_NAMESPACE::Color &r) +QDebug operator<<(QDebug debug, const olive::Color &r) { debug.nospace() << "[R: " << r.red() << ", G: " << r.green() << ", B: " << r.blue() << ", A: " << r.alpha() << "]"; return debug.space(); diff --git a/app/render/color.h b/app/render/color.h index 046c88a10..70204f165 100644 --- a/app/render/color.h +++ b/app/render/color.h @@ -27,7 +27,7 @@ #include "common/define.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief High precision 64-bit float based RGBA color value @@ -111,10 +111,10 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -QDebug operator<<(QDebug debug, const OLIVE_NAMESPACE::Color& r); +QDebug operator<<(QDebug debug, const olive::Color& r); -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::Color) +Q_DECLARE_METATYPE(olive::Color) #endif // COLOR_H diff --git a/app/render/colormanager.cpp b/app/render/colormanager.cpp index db49bee0f..b0dd6e4cd 100644 --- a/app/render/colormanager.cpp +++ b/app/render/colormanager.cpp @@ -29,7 +29,7 @@ #include "config/config.h" #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { OCIO::ConstConfigRcPtr ColorManager::default_config_; @@ -318,4 +318,4 @@ ColorManager::SetLocale::~SetLocale() setlocale(LC_NUMERIC, old_locale_.toUtf8()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/colormanager.h b/app/render/colormanager.h index 558f9816a..7c79a39c2 100644 --- a/app/render/colormanager.h +++ b/app/render/colormanager.h @@ -28,7 +28,7 @@ #define OCIO_SET_C_LOCALE_FOR_SCOPE ColorManager::SetLocale d("C") -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorManager : public QObject { @@ -113,6 +113,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORSERVICE_H diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index b9f663eaf..99aff541c 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -24,7 +24,7 @@ #include "common/ocioutils.h" #include "colormanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const ColorTransform &transform) { @@ -131,4 +131,4 @@ void ColorProcessor::ConvertFrame(FramePtr f) ConvertFrame(f.get()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/colorprocessor.h b/app/render/colorprocessor.h index daaf985fe..0704b89e0 100644 --- a/app/render/colorprocessor.h +++ b/app/render/colorprocessor.h @@ -26,7 +26,7 @@ #include "render/color.h" #include "render/colortransform.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorManager; @@ -72,8 +72,8 @@ private: using ColorProcessorChain = QVector; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::ColorProcessorPtr) +Q_DECLARE_METATYPE(olive::ColorProcessorPtr) #endif // COLORPROCESSOR_H diff --git a/app/render/colorprocessorcache.h b/app/render/colorprocessorcache.h index d9d41152d..9c9c40b6b 100644 --- a/app/render/colorprocessorcache.h +++ b/app/render/colorprocessorcache.h @@ -24,10 +24,10 @@ #include "project/item/footage/stream.h" #include "render/colorprocessor.h" -OLIVE_NAMESPACE_ENTER +namespace olive { using ColorProcessorCache = QHash; -OLIVE_NAMESPACE_EXIT +} #endif // COLORPROCESSORCACHE_H diff --git a/app/render/colortransform.h b/app/render/colortransform.h index 882e7e5ff..61a4c74ba 100644 --- a/app/render/colortransform.h +++ b/app/render/colortransform.h @@ -26,7 +26,7 @@ #include "common/define.h" #include "common/ocioutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorTransform { @@ -79,6 +79,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORTRANSFORM_H diff --git a/app/render/diskmanager.cpp b/app/render/diskmanager.cpp index c1423d26d..40d385e76 100644 --- a/app/render/diskmanager.cpp +++ b/app/render/diskmanager.cpp @@ -33,7 +33,7 @@ #include "core.h" #include "dialog/diskcache/diskcachedialog.h" -OLIVE_NAMESPACE_ENTER +namespace olive { DiskManager* DiskManager::instance_ = nullptr; @@ -364,4 +364,4 @@ void DiskCacheFolder::SaveDiskCacheIndex() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/diskmanager.h b/app/render/diskmanager.h index 0a3c84819..c4073d71f 100644 --- a/app/render/diskmanager.h +++ b/app/render/diskmanager.h @@ -29,7 +29,7 @@ #include "common/define.h" #include "project/project.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class DiskCacheFolder : public QObject { @@ -165,6 +165,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // DISKMANAGER_H diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index e2c5b02b3..9328c58dd 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -32,7 +32,7 @@ #include "common/timecodefunctions.h" #include "render/diskmanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { FrameHashCache::FrameHashCache(QObject *parent) : PlaybackCache(parent) @@ -438,4 +438,4 @@ bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const V return true; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/framehashcache.h b/app/render/framehashcache.h index 276c4f1d3..3ff6eb9b7 100644 --- a/app/render/framehashcache.h +++ b/app/render/framehashcache.h @@ -29,7 +29,7 @@ #include "render/playbackcache.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FrameHashCache : public PlaybackCache { @@ -76,7 +76,7 @@ public: QVector GetInvalidatedFrames(const TimeRange& intersecting); public slots: - void SetHash(const OLIVE_NAMESPACE::rational& time, const QByteArray& hash, const qint64 &job_time, bool frame_exists); + void SetHash(const olive::rational& time, const QByteArray& hash, const qint64 &job_time, bool frame_exists); protected: virtual void LengthChangedEvent(const rational& old, const rational& newlen) override; @@ -97,6 +97,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIDEORENDERFRAMECACHE_H diff --git a/app/render/job/acceleratedjob.h b/app/render/job/acceleratedjob.h index 4bdd87d16..e4b981e21 100644 --- a/app/render/job/acceleratedjob.h +++ b/app/render/job/acceleratedjob.h @@ -26,7 +26,7 @@ #include "render/shadervalue.h" #include "node/value.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AcceleratedJob { public: @@ -96,6 +96,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // ACCELERATEDJOB_H diff --git a/app/render/job/generatejob.h b/app/render/job/generatejob.h index 086459abc..dc71a873f 100644 --- a/app/render/job/generatejob.h +++ b/app/render/job/generatejob.h @@ -23,7 +23,7 @@ #include "acceleratedjob.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class GenerateJob : public AcceleratedJob { public: @@ -47,8 +47,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::GenerateJob) +Q_DECLARE_METATYPE(olive::GenerateJob) #endif // GENERATEJOB_H diff --git a/app/render/job/samplejob.h b/app/render/job/samplejob.h index 0ce1163ef..80cf5657e 100644 --- a/app/render/job/samplejob.h +++ b/app/render/job/samplejob.h @@ -24,7 +24,7 @@ #include "acceleratedjob.h" #include "codec/samplebuffer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SampleJob : public AcceleratedJob { public: @@ -58,8 +58,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::SampleJob) +Q_DECLARE_METATYPE(olive::SampleJob) #endif // SAMPLEJOB_H diff --git a/app/render/job/shaderjob.h b/app/render/job/shaderjob.h index daa1167dd..fdb64117e 100644 --- a/app/render/job/shaderjob.h +++ b/app/render/job/shaderjob.h @@ -26,7 +26,7 @@ #include "generatejob.h" #include "render/texture.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ShaderJob : public GenerateJob { public: @@ -93,8 +93,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::ShaderJob) +Q_DECLARE_METATYPE(olive::ShaderJob) #endif // SHADERJOB_H diff --git a/app/render/managedcolor.cpp b/app/render/managedcolor.cpp index 611f15054..e12e02dc9 100644 --- a/app/render/managedcolor.cpp +++ b/app/render/managedcolor.cpp @@ -20,7 +20,7 @@ #include "managedcolor.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ManagedColor::ManagedColor() { @@ -61,4 +61,4 @@ void ManagedColor::set_color_output(const ColorTransform &color_output) color_transform_ = color_output; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/managedcolor.h b/app/render/managedcolor.h index d63607cb7..19a475a9a 100644 --- a/app/render/managedcolor.h +++ b/app/render/managedcolor.h @@ -24,7 +24,7 @@ #include "color.h" #include "colortransform.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ManagedColor : public Color { @@ -47,6 +47,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // MANAGEDCOLOR_H diff --git a/app/render/opengl/openglrenderer.cpp b/app/render/opengl/openglrenderer.cpp index bade4e17c..050b6982e 100644 --- a/app/render/opengl/openglrenderer.cpp +++ b/app/render/opengl/openglrenderer.cpp @@ -23,7 +23,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { const QVector blit_vertices = { -1.0f, -1.0f, 0.0f, @@ -665,4 +665,4 @@ void OpenGLRenderer::PrepareInputTexture(GLenum target, Texture::Interpolation i functions_->glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/opengl/openglrenderer.h b/app/render/opengl/openglrenderer.h index 6ba883398..3d78fdd54 100644 --- a/app/render/opengl/openglrenderer.h +++ b/app/render/opengl/openglrenderer.h @@ -30,7 +30,7 @@ #include "render/renderer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class OpenGLRenderer : public Renderer { @@ -51,24 +51,24 @@ public slots: virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; - virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; - virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture2D(int width, int height, olive::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture3D(int width, int height, int depth, olive::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; virtual void DestroyNativeTexture(QVariant texture) override; - virtual QVariant CreateNativeShader(OLIVE_NAMESPACE::ShaderCode code) override; + virtual QVariant CreateNativeShader(olive::ShaderCode code) override; virtual void DestroyNativeShader(QVariant shader) override; - virtual void UploadToTexture(OLIVE_NAMESPACE::Texture* texture, const void* data, int linesize) override; + virtual void UploadToTexture(olive::Texture* texture, const void* data, int linesize) override; - virtual void DownloadFromTexture(OLIVE_NAMESPACE::Texture* texture, void* data, int linesize) override; + virtual void DownloadFromTexture(olive::Texture* texture, void* data, int linesize) override; protected slots: virtual void Blit(QVariant shader, - OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::Texture* destination, - OLIVE_NAMESPACE::VideoParams destination_params) override; + olive::ShaderJob job, + olive::Texture* destination, + olive::VideoParams destination_params) override; private: static GLint GetInternalFormat(VideoParams::Format format, int channel_layout); @@ -77,7 +77,7 @@ private: static GLenum GetPixelFormat(int channel_count); - void AttachTextureAsDestination(OLIVE_NAMESPACE::Texture* texture); + void AttachTextureAsDestination(olive::Texture* texture); void DetachTextureAsDestination(); @@ -93,6 +93,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // OPENGLCONTEXT_H diff --git a/app/render/playbackcache.cpp b/app/render/playbackcache.cpp index 07d98eaa8..a56c106be 100644 --- a/app/render/playbackcache.cpp +++ b/app/render/playbackcache.cpp @@ -27,7 +27,7 @@ #include "project/project.h" #include "render/diskmanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void PlaybackCache::Invalidate(const TimeRange &r) { @@ -195,4 +195,4 @@ QString PlaybackCache::GetCacheDirectory() const } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/playbackcache.h b/app/render/playbackcache.h index 4d254aacf..40d333526 100644 --- a/app/render/playbackcache.h +++ b/app/render/playbackcache.h @@ -26,7 +26,7 @@ #include "common/timerange.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Project; @@ -71,13 +71,13 @@ public slots: void Shift(const rational& from, const rational& to); signals: - void Invalidated(const OLIVE_NAMESPACE::TimeRange& r); + void Invalidated(const olive::TimeRange& r); - void Validated(const OLIVE_NAMESPACE::TimeRange& r); + void Validated(const olive::TimeRange& r); - void Shifted(const OLIVE_NAMESPACE::rational& from, const OLIVE_NAMESPACE::rational& to); + void Shifted(const olive::rational& from, const olive::rational& to); - void LengthChanged(const OLIVE_NAMESPACE::rational& r); + void LengthChanged(const olive::rational& r); protected: void Validate(const TimeRange& r); @@ -106,6 +106,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PLAYBACKCACHE_H diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 9091b720b..7a309e467 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -8,7 +8,7 @@ #include "render/rendermanager.h" #include "render/renderprocessor.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PreviewAutoCacher::PreviewAutoCacher() : viewer_node_(nullptr), @@ -771,4 +771,4 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index 663ee7bc2..03898c169 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -9,7 +9,7 @@ #include "render/colormanager.h" #include "threading/threadticketwatcher.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Manager for dynamically caching a sequence in the background @@ -160,12 +160,12 @@ private slots: /** * @brief Handler for when the NodeGraph reports a video change over a certain time range */ - void VideoInvalidated(const OLIVE_NAMESPACE::TimeRange &range); + void VideoInvalidated(const olive::TimeRange &range); /** * @brief Handler for when the NodeGraph reports a audio change over a certain time range */ - void AudioInvalidated(const OLIVE_NAMESPACE::TimeRange &range); + void AudioInvalidated(const olive::TimeRange &range); /** * @brief Handler for when we have applied all the hashes to the FrameHashCache @@ -204,6 +204,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // AUTOCACHER_H diff --git a/app/render/rendercache.h b/app/render/rendercache.h index 5aab47f59..f27120e61 100644 --- a/app/render/rendercache.h +++ b/app/render/rendercache.h @@ -24,7 +24,7 @@ #include "codec/decoder.h" #include "project/item/footage/stream.h" -OLIVE_NAMESPACE_ENTER +namespace olive { template class RenderCache : public QHash @@ -43,6 +43,6 @@ private: using DecoderCache = RenderCache; using ShaderCache = RenderCache; -OLIVE_NAMESPACE_EXIT +} #endif // RENDERCACHE_H diff --git a/app/render/renderer.cpp b/app/render/renderer.cpp index daab11df9..beba1f5c5 100644 --- a/app/render/renderer.cpp +++ b/app/render/renderer.cpp @@ -24,7 +24,7 @@ #include "common/ocioutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Renderer::Renderer(QObject *parent) : QObject(parent) @@ -275,4 +275,4 @@ void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, Textu } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/renderer.h b/app/render/renderer.h index 50f2f9f86..3efb7c20b 100644 --- a/app/render/renderer.h +++ b/app/render/renderer.h @@ -31,7 +31,7 @@ #include "render/videoparams.h" #include "texture.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ShaderJob; @@ -47,15 +47,15 @@ public: TexturePtr CreateTexture(const VideoParams& params, const void *data = nullptr, int linesize = 0); void BlitToTexture(QVariant shader, - OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::Texture* destination) + olive::ShaderJob job, + olive::Texture* destination) { Blit(shader, job, destination, destination->params()); } void Blit(QVariant shader, - OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::VideoParams params) + olive::ShaderJob job, + olive::VideoParams params) { Blit(shader, job, nullptr, params); } @@ -72,24 +72,24 @@ public slots: virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) = 0; - virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) = 0; - virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) = 0; + virtual QVariant CreateNativeTexture2D(int width, int height, olive::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) = 0; + virtual QVariant CreateNativeTexture3D(int width, int height, int depth, olive::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) = 0; virtual void DestroyNativeTexture(QVariant texture) = 0; - virtual QVariant CreateNativeShader(OLIVE_NAMESPACE::ShaderCode code) = 0; + virtual QVariant CreateNativeShader(olive::ShaderCode code) = 0; virtual void DestroyNativeShader(QVariant shader) = 0; - virtual void UploadToTexture(OLIVE_NAMESPACE::Texture* texture, const void* data, int linesize) = 0; + virtual void UploadToTexture(olive::Texture* texture, const void* data, int linesize) = 0; - virtual void DownloadFromTexture(OLIVE_NAMESPACE::Texture* texture, void* data, int linesize) = 0; + virtual void DownloadFromTexture(olive::Texture* texture, void* data, int linesize) = 0; protected slots: virtual void Blit(QVariant shader, - OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::Texture* destination, - OLIVE_NAMESPACE::VideoParams destination_params) = 0; + olive::ShaderJob job, + olive::Texture* destination, + olive::VideoParams destination_params) = 0; private: struct ColorContext { @@ -121,6 +121,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // RENDERCONTEXT_H diff --git a/app/render/rendererthreadwrapper.cpp b/app/render/rendererthreadwrapper.cpp index b394a8349..ef1547d95 100644 --- a/app/render/rendererthreadwrapper.cpp +++ b/app/render/rendererthreadwrapper.cpp @@ -20,7 +20,7 @@ #include "rendererthreadwrapper.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RendererThreadWrapper::RendererThreadWrapper(Renderer *inner, QObject *parent) : Renderer(parent), @@ -157,4 +157,4 @@ void RendererThreadWrapper::Blit(QVariant shader, ShaderJob job, Texture *destin OLIVE_NS_ARG(VideoParams, destination_params)); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/rendererthreadwrapper.h b/app/render/rendererthreadwrapper.h index 202d96e7a..9cd521b0c 100644 --- a/app/render/rendererthreadwrapper.h +++ b/app/render/rendererthreadwrapper.h @@ -25,7 +25,7 @@ #include "renderer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RendererThreadWrapper : public Renderer { @@ -47,24 +47,24 @@ public slots: virtual void ClearDestination(double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) override; - virtual QVariant CreateNativeTexture2D(int width, int height, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; - virtual QVariant CreateNativeTexture3D(int width, int height, int depth, OLIVE_NAMESPACE::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture2D(int width, int height, olive::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; + virtual QVariant CreateNativeTexture3D(int width, int height, int depth, olive::VideoParams::Format format, int channel_count, const void* data = nullptr, int linesize = 0) override; virtual void DestroyNativeTexture(QVariant texture) override; - virtual QVariant CreateNativeShader(OLIVE_NAMESPACE::ShaderCode code) override; + virtual QVariant CreateNativeShader(olive::ShaderCode code) override; virtual void DestroyNativeShader(QVariant shader) override; - virtual void UploadToTexture(OLIVE_NAMESPACE::Texture* texture, const void* data, int linesize) override; + virtual void UploadToTexture(olive::Texture* texture, const void* data, int linesize) override; - virtual void DownloadFromTexture(OLIVE_NAMESPACE::Texture* texture, void* data, int linesize) override; + virtual void DownloadFromTexture(olive::Texture* texture, void* data, int linesize) override; protected slots: virtual void Blit(QVariant shader, - OLIVE_NAMESPACE::ShaderJob job, - OLIVE_NAMESPACE::Texture* destination, - OLIVE_NAMESPACE::VideoParams destination_params) override; + olive::ShaderJob job, + olive::Texture* destination, + olive::VideoParams destination_params) override; private: Renderer* inner_; @@ -73,6 +73,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // RENDERCONTEXTTHREADWRAPPER_H diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 04fd8156f..f771502b5 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -34,7 +34,7 @@ #include "task/taskmanager.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RenderManager* RenderManager::instance_ = nullptr; @@ -199,4 +199,4 @@ void RenderManager::RunTicket(RenderTicketPtr ticket) const RenderProcessor::Process(ticket, context_, still_cache_, decoder_cache_, shader_cache_, default_shader_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 0e6f5e37b..8bc580ab8 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -34,7 +34,7 @@ #include "stillimagecache.h" #include "threading/threadpool.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RenderManager : public ThreadPool { @@ -142,8 +142,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::RenderManager::TicketType) +Q_DECLARE_METATYPE(olive::RenderManager::TicketType) #endif // RENDERBACKEND_H diff --git a/app/render/rendermodes.h b/app/render/rendermodes.h index eace6428e..02f2dfda2 100644 --- a/app/render/rendermodes.h +++ b/app/render/rendermodes.h @@ -23,7 +23,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RenderMode { public: @@ -45,6 +45,6 @@ public: }; }; -OLIVE_NAMESPACE_EXIT +} #endif // RENDERMODE_H diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 227ea1cd2..f54b5d013 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -27,7 +27,7 @@ #include "project/project.h" #include "rendermanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RenderProcessor::RenderProcessor(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache* still_image_cache, DecoderCache* decoder_cache, ShaderCache *shader_cache, QVariant default_shader) : ticket_(ticket), @@ -512,4 +512,4 @@ QVariant RenderProcessor::GetCachedFrame(const Node *node, const rational &time) return QVariant(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index 3ec743981..40e522286 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -27,7 +27,7 @@ #include "stillimagecache.h" #include "threading/threadticket.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RenderProcessor : public NodeTraverser { @@ -76,8 +76,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::RenderProcessor::RenderedWaveform) +Q_DECLARE_METATYPE(olive::RenderProcessor::RenderedWaveform) #endif // RENDERPROCESSOR_H diff --git a/app/render/shadercode.h b/app/render/shadercode.h index 6a7a86034..12d805c43 100644 --- a/app/render/shadercode.h +++ b/app/render/shadercode.h @@ -23,7 +23,7 @@ #include "common/filefunctions.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ShaderCode { public: @@ -57,6 +57,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // SHADERCODE_H diff --git a/app/render/shadervalue.h b/app/render/shadervalue.h index 6633aef5d..0b042173b 100644 --- a/app/render/shadervalue.h +++ b/app/render/shadervalue.h @@ -23,7 +23,7 @@ #include "node/param.h" -OLIVE_NAMESPACE_ENTER +namespace olive { struct ShaderValue { @@ -50,6 +50,6 @@ struct ShaderValue using NodeValueMap = QHash; -OLIVE_NAMESPACE_EXIT +} #endif // SHADERVALUE_H diff --git a/app/render/stillimagecache.h b/app/render/stillimagecache.h index f5b4336e7..728247200 100644 --- a/app/render/stillimagecache.h +++ b/app/render/stillimagecache.h @@ -8,7 +8,7 @@ #include "project/item/footage/stream.h" #include "render/texture.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class StillImageCache { @@ -78,6 +78,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // STILLIMAGECACHE_H diff --git a/app/render/texture.cpp b/app/render/texture.cpp index 6ed5db9f7..c6ed11e6f 100644 --- a/app/render/texture.cpp +++ b/app/render/texture.cpp @@ -22,7 +22,7 @@ #include "renderer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const Texture::Interpolation Texture::kDefaultInterpolation = Texture::kMipmappedLinear; @@ -36,4 +36,4 @@ void Texture::Upload(void *data, int linesize) renderer_->UploadToTexture(this, data, linesize); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/texture.h b/app/render/texture.h index ed1f1e07c..e0d9500f3 100644 --- a/app/render/texture.h +++ b/app/render/texture.h @@ -25,7 +25,7 @@ #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Renderer; @@ -115,8 +115,8 @@ private: using TexturePtr = std::shared_ptr; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::TexturePtr) +Q_DECLARE_METATYPE(olive::TexturePtr) #endif // RENDERTEXTURE_H diff --git a/app/render/videoparams.cpp b/app/render/videoparams.cpp index 7063d9588..02f736344 100644 --- a/app/render/videoparams.cpp +++ b/app/render/videoparams.cpp @@ -24,7 +24,7 @@ #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const int VideoParams::kInternalChannelCount = kRGBAChannelCount; @@ -280,4 +280,4 @@ int VideoParams::GetScaledDimension(int dim, int divider) return dim / divider; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/render/videoparams.h b/app/render/videoparams.h index 39a4d0833..d38626491 100644 --- a/app/render/videoparams.h +++ b/app/render/videoparams.h @@ -24,7 +24,7 @@ #include "common/rational.h" #include "rendermodes.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class VideoParams { public: @@ -263,9 +263,9 @@ private: int effective_depth_; }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::VideoParams) -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::VideoParams::Interlacing) +Q_DECLARE_METATYPE(olive::VideoParams) +Q_DECLARE_METATYPE(olive::VideoParams::Interlacing) #endif // VIDEOPARAMS_H diff --git a/app/task/conform/conform.cpp b/app/task/conform/conform.cpp index f30c4306a..b1e546155 100644 --- a/app/task/conform/conform.cpp +++ b/app/task/conform/conform.cpp @@ -22,7 +22,7 @@ #include "codec/decoder.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ConformTask::ConformTask(AudioStreamPtr stream, const AudioParams& params) : stream_(stream), @@ -57,4 +57,4 @@ bool ConformTask::Run() return true; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/conform/conform.h b/app/task/conform/conform.h index 1ebb6632f..4486cda8f 100644 --- a/app/task/conform/conform.h +++ b/app/task/conform/conform.h @@ -25,7 +25,7 @@ #include "render/audioparams.h" #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ConformTask : public Task { @@ -43,6 +43,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // CONFORMTASK_H diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index 9041d37e3..50bcb3554 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -23,7 +23,7 @@ #include "common/timecodefunctions.h" #include "render/colormanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ExportTask::ExportTask(ViewerOutput* viewer_node, ColorManager* color_manager, @@ -189,4 +189,4 @@ void ExportTask::AudioDownloaded(const TimeRange &range, SampleBufferPtr samples audio_data_.WritePCM(adjusted_range, samples, QDateTime::currentMSecsSinceEpoch()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/export/export.h b/app/task/export/export.h index 86e8aa011..1382d6856 100644 --- a/app/task/export/export.h +++ b/app/task/export/export.h @@ -27,7 +27,7 @@ #include "task/render/render.h" #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ExportTask : public RenderTask { @@ -64,6 +64,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // EXPORTTASK_H diff --git a/app/task/export/exportparams.cpp b/app/task/export/exportparams.cpp index 80c3e5acd..7b3b6a659 100644 --- a/app/task/export/exportparams.cpp +++ b/app/task/export/exportparams.cpp @@ -20,7 +20,7 @@ #include "exportparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ExportParams::ExportParams() : video_scaling_method_(kStretch), @@ -122,4 +122,4 @@ void ExportParams::Save(QXmlStreamWriter *writer) const writer->writeEndElement(); // export } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/export/exportparams.h b/app/task/export/exportparams.h index d76d23d4e..0fb17a4f2 100644 --- a/app/task/export/exportparams.h +++ b/app/task/export/exportparams.h @@ -27,7 +27,7 @@ #include "node/output/viewer/viewer.h" #include "render/colortransform.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ExportParams : public EncodingParams { public: @@ -70,6 +70,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // EXPORTPARAMS_H diff --git a/app/task/precache/precachetask.cpp b/app/task/precache/precachetask.cpp index a538ed199..fc033dac2 100644 --- a/app/task/precache/precachetask.cpp +++ b/app/task/precache/precachetask.cpp @@ -22,7 +22,7 @@ #include "project/project.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PreCacheTask::PreCacheTask(VideoStreamPtr footage, Sequence* sequence) : RenderTask(new ViewerOutput(), sequence->video_params(), sequence->audio_params()), @@ -92,4 +92,4 @@ void PreCacheTask::AudioDownloaded(const TimeRange &range, SampleBufferPtr sampl Q_UNUSED(job_time) } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/precache/precachetask.h b/app/task/precache/precachetask.h index ffa4e7caa..7fb2483e7 100644 --- a/app/task/precache/precachetask.h +++ b/app/task/precache/precachetask.h @@ -26,7 +26,7 @@ #include "project/item/sequence/sequence.h" #include "task/render/render.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PreCacheTask : public RenderTask { @@ -50,6 +50,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PRECACHETASK_H diff --git a/app/task/project/import/import.cpp b/app/task/project/import/import.cpp index 588d2b488..66fa1de18 100644 --- a/app/task/project/import/import.cpp +++ b/app/task/project/import/import.cpp @@ -27,7 +27,7 @@ #include "core.h" #include "project/item/footage/footage.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectImportTask::ProjectImportTask(ProjectViewModel *model, Folder *folder, const QStringList &filenames) : command_(nullptr), @@ -284,4 +284,4 @@ int64_t ProjectImportTask::GetImageSequenceLimit(const QString& start_fn, int64_ return start; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/project/import/import.h b/app/task/project/import/import.h index 10aafc99b..9dd44b65e 100644 --- a/app/task/project/import/import.h +++ b/app/task/project/import/import.h @@ -28,7 +28,7 @@ #include "project/projectviewmodel.h" #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ProjectImportTask : public Task { @@ -83,6 +83,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTIMPORTMANAGER_H diff --git a/app/task/project/import/importerrordialog.cpp b/app/task/project/import/importerrordialog.cpp index 6421df455..232967cff 100644 --- a/app/task/project/import/importerrordialog.cpp +++ b/app/task/project/import/importerrordialog.cpp @@ -25,7 +25,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectImportErrorDialog::ProjectImportErrorDialog(const QStringList& filenames, QWidget* parent) : QDialog(parent) @@ -50,4 +50,4 @@ ProjectImportErrorDialog::ProjectImportErrorDialog(const QStringList& filenames, layout->addWidget(buttons); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/project/import/importerrordialog.h b/app/task/project/import/importerrordialog.h index d8b1c36ee..21cc1a720 100644 --- a/app/task/project/import/importerrordialog.h +++ b/app/task/project/import/importerrordialog.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ProjectImportErrorDialog : public QDialog { @@ -35,6 +35,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTIMPORTERRORDIALOG_H diff --git a/app/task/project/load/load.cpp b/app/task/project/load/load.cpp index bb733273e..a246abbbc 100644 --- a/app/task/project/load/load.cpp +++ b/app/task/project/load/load.cpp @@ -27,7 +27,7 @@ #include "common/xmlutils.h" #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectLoadTask::ProjectLoadTask(const QString &filename) : ProjectLoadBaseTask(filename) @@ -99,4 +99,4 @@ bool ProjectLoadTask::Run() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/project/load/load.h b/app/task/project/load/load.h index 518f58fad..5b521324a 100644 --- a/app/task/project/load/load.h +++ b/app/task/project/load/load.h @@ -24,7 +24,7 @@ #include "loadbasetask.h" #include "window/mainwindow/mainwindowlayoutinfo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ProjectLoadTask : public ProjectLoadBaseTask { @@ -37,6 +37,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTLOADMANAGER_H diff --git a/app/task/project/load/loadbasetask.cpp b/app/task/project/load/loadbasetask.cpp index 2285f16be..a6fce7189 100644 --- a/app/task/project/load/loadbasetask.cpp +++ b/app/task/project/load/loadbasetask.cpp @@ -20,7 +20,7 @@ #include "loadbasetask.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectLoadBaseTask::ProjectLoadBaseTask(const QString &filename) : project_(nullptr), @@ -29,4 +29,4 @@ ProjectLoadBaseTask::ProjectLoadBaseTask(const QString &filename) : SetTitle(tr("Loading '%1'").arg(filename)); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/project/load/loadbasetask.h b/app/task/project/load/loadbasetask.h index 933b7588d..a7dc831bf 100644 --- a/app/task/project/load/loadbasetask.h +++ b/app/task/project/load/loadbasetask.h @@ -24,7 +24,7 @@ #include "project/project.h" #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ProjectLoadBaseTask : public Task { @@ -69,6 +69,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // LOADBASETASK_H diff --git a/app/task/project/loadotio/loadotio.cpp b/app/task/project/loadotio/loadotio.cpp index 196b1eee9..beeb65b90 100644 --- a/app/task/project/loadotio/loadotio.cpp +++ b/app/task/project/loadotio/loadotio.cpp @@ -36,7 +36,7 @@ #define OTIO opentimelineio::v1_0 -OLIVE_NAMESPACE_ENTER +namespace olive { LoadOTIOTask::LoadOTIOTask(const QString& s) : ProjectLoadBaseTask(s) @@ -209,4 +209,4 @@ bool LoadOTIOTask::Run() return true; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/project/loadotio/loadotio.h b/app/task/project/loadotio/loadotio.h index cddbfabb7..bc5ef72a9 100644 --- a/app/task/project/loadotio/loadotio.h +++ b/app/task/project/loadotio/loadotio.h @@ -24,7 +24,7 @@ #include "project/project.h" #include "task/project/load/loadbasetask.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class LoadOTIOTask : public ProjectLoadBaseTask { @@ -37,6 +37,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // OTIODECODER_H diff --git a/app/task/project/save/save.cpp b/app/task/project/save/save.cpp index 65d44b306..b233693e4 100644 --- a/app/task/project/save/save.cpp +++ b/app/task/project/save/save.cpp @@ -27,7 +27,7 @@ #include "common/filefunctions.h" #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectSaveTask::ProjectSaveTask(ProjectPtr project) : project_(project) @@ -87,4 +87,4 @@ bool ProjectSaveTask::Run() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/project/save/save.h b/app/task/project/save/save.h index c52553b5c..23b116469 100644 --- a/app/task/project/save/save.h +++ b/app/task/project/save/save.h @@ -24,7 +24,7 @@ #include "project/project.h" #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ProjectSaveTask : public Task { @@ -45,6 +45,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTSAVEMANAGER_H diff --git a/app/task/project/saveotio/saveotio.cpp b/app/task/project/saveotio/saveotio.cpp index 7def5a7cb..2a2b25092 100644 --- a/app/task/project/saveotio/saveotio.cpp +++ b/app/task/project/saveotio/saveotio.cpp @@ -29,7 +29,7 @@ #include "node/block/transition/transition.h" #include "node/input/media/media.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SaveOTIOTask::SaveOTIOTask(ProjectPtr project) : project_(project) @@ -206,4 +206,4 @@ bool SaveOTIOTask::SerializeTrackList(TrackList *list, opentimelineio::v1_0::Tim return true; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/project/saveotio/saveotio.h b/app/task/project/saveotio/saveotio.h index 1a64d11e5..d076a2691 100644 --- a/app/task/project/saveotio/saveotio.h +++ b/app/task/project/saveotio/saveotio.h @@ -27,7 +27,7 @@ #include "project/project.h" #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SaveOTIOTask : public Task { @@ -49,6 +49,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTSAVEASOTIOTASK_H diff --git a/app/task/render/render.cpp b/app/task/render/render.cpp index ab95bb323..be5635944 100644 --- a/app/task/render/render.cpp +++ b/app/task/render/render.cpp @@ -23,7 +23,7 @@ #include "common/timecodefunctions.h" #include "render/rendermanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RenderTask::RenderTask(ViewerOutput* viewer, const VideoParams &vparams, const AudioParams &aparams) : viewer_(viewer), @@ -238,4 +238,4 @@ void RenderTask::TicketDone(RenderTicketWatcher* watcher) finished_watcher_mutex_.unlock(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/render/render.h b/app/task/render/render.h index 6a0f3214b..ddb97091f 100644 --- a/app/task/render/render.h +++ b/app/task/render/render.h @@ -29,7 +29,7 @@ #include "threading/threadticket.h" #include "threading/threadticketwatcher.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RenderTask : public Task { @@ -102,6 +102,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // RENDERTASK_H diff --git a/app/task/task.h b/app/task/task.h index d7dce0535..84f056315 100644 --- a/app/task/task.h +++ b/app/task/task.h @@ -27,7 +27,7 @@ #include "common/cancelableobject.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A base class for background tasks running in Olive. @@ -162,6 +162,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TASK_H diff --git a/app/task/taskmanager.cpp b/app/task/taskmanager.cpp index 074641b01..a4b31efb9 100644 --- a/app/task/taskmanager.cpp +++ b/app/task/taskmanager.cpp @@ -23,7 +23,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { TaskManager* TaskManager::instance_ = nullptr; @@ -133,4 +133,4 @@ void TaskManager::TaskFinished() emit TaskListChanged(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/task/taskmanager.h b/app/task/taskmanager.h index 45e11aa21..ef3f9e127 100644 --- a/app/task/taskmanager.h +++ b/app/task/taskmanager.h @@ -27,7 +27,7 @@ #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief An object that manages background Task objects, handling their start and end @@ -136,6 +136,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TASKMANAGER_H diff --git a/app/threading/threadpool.cpp b/app/threading/threadpool.cpp index 05b57eb8d..a77fbf72d 100644 --- a/app/threading/threadpool.cpp +++ b/app/threading/threadpool.cpp @@ -20,7 +20,7 @@ #include "threadpool.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ThreadPool::ThreadPool(QThread::Priority priority, int threads, QObject *parent) : QObject(parent) @@ -135,4 +135,4 @@ void ThreadPoolThread::CancelEvent() wait_cond_.wakeAll(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/threading/threadpool.h b/app/threading/threadpool.h index 377ae6d5b..8d93667d4 100644 --- a/app/threading/threadpool.h +++ b/app/threading/threadpool.h @@ -26,7 +26,7 @@ #include "common/cancelableobject.h" #include "threading/threadticket.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ThreadPoolThread; @@ -43,7 +43,7 @@ public: virtual void RunTicket(RenderTicketPtr ticket) const = 0; public slots: - void AddTicket(OLIVE_NAMESPACE::RenderTicketPtr ticket, bool prioritize = false); + void AddTicket(olive::RenderTicketPtr ticket, bool prioritize = false); private: void RunNext(); @@ -88,6 +88,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // THREADPOOL_H diff --git a/app/threading/threadticket.cpp b/app/threading/threadticket.cpp index 30ca9bc53..9a30fc37f 100644 --- a/app/threading/threadticket.cpp +++ b/app/threading/threadticket.cpp @@ -20,7 +20,7 @@ #include "threadticket.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RenderTicket::RenderTicket() : started_(false), @@ -121,4 +121,4 @@ void RenderTicket::Cancel() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/threading/threadticket.h b/app/threading/threadticket.h index dca13f78d..5ead976b6 100644 --- a/app/threading/threadticket.h +++ b/app/threading/threadticket.h @@ -30,7 +30,7 @@ #include "common/timerange.h" #include "node/output/viewer/viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RenderTicket : public QObject { @@ -89,8 +89,8 @@ private: using RenderTicketPtr = std::shared_ptr; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::RenderTicketPtr) +Q_DECLARE_METATYPE(olive::RenderTicketPtr) #endif // RENDERTICKET_H diff --git a/app/threading/threadticketwatcher.cpp b/app/threading/threadticketwatcher.cpp index a8b93ae4b..34ba594ed 100644 --- a/app/threading/threadticketwatcher.cpp +++ b/app/threading/threadticketwatcher.cpp @@ -20,7 +20,7 @@ #include "threadticketwatcher.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RenderTicketWatcher::RenderTicketWatcher(QObject *parent) : QObject(parent), @@ -98,4 +98,4 @@ void RenderTicketWatcher::TicketFinished() emit Finished(this); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/threading/threadticketwatcher.h b/app/threading/threadticketwatcher.h index 9a6ebd351..a6de21e1a 100644 --- a/app/threading/threadticketwatcher.h +++ b/app/threading/threadticketwatcher.h @@ -23,7 +23,7 @@ #include "threadticket.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RenderTicketWatcher : public QObject { @@ -58,6 +58,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // RENDERTICKETWATCHER_H diff --git a/app/timeline/timelinecommon.h b/app/timeline/timelinecommon.h index d4dbc124f..3646eb907 100644 --- a/app/timeline/timelinecommon.h +++ b/app/timeline/timelinecommon.h @@ -24,7 +24,7 @@ #include "common/define.h" #include "common/rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Block; class TrackOutput; @@ -59,6 +59,6 @@ public: // FIXME: Hardcoded (but that might be okay here) #define PLAYHEAD_COLOR Qt::red -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINECOMMON_H diff --git a/app/timeline/timelinecoordinate.cpp b/app/timeline/timelinecoordinate.cpp index 031b827da..5b9882901 100644 --- a/app/timeline/timelinecoordinate.cpp +++ b/app/timeline/timelinecoordinate.cpp @@ -20,7 +20,7 @@ #include "timelinecoordinate.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineCoordinate::TimelineCoordinate() : track_(Timeline::kTrackTypeNone, 0) @@ -59,4 +59,4 @@ void TimelineCoordinate::SetTrack(const TrackReference &track) track_ = track; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/timeline/timelinecoordinate.h b/app/timeline/timelinecoordinate.h index 26dc7e671..98fa8b34d 100644 --- a/app/timeline/timelinecoordinate.h +++ b/app/timeline/timelinecoordinate.h @@ -24,7 +24,7 @@ #include "common/rational.h" #include "trackreference.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelineCoordinate { @@ -46,6 +46,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINECOORDINATE_H diff --git a/app/timeline/timelinemarker.cpp b/app/timeline/timelinemarker.cpp index 4f3e83573..9d5632919 100644 --- a/app/timeline/timelinemarker.cpp +++ b/app/timeline/timelinemarker.cpp @@ -22,7 +22,7 @@ #include "common/xmlutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineMarker::TimelineMarker(const TimeRange &time, const QString &name, QObject *parent) : QObject(parent), @@ -121,4 +121,4 @@ void TimelineMarkerList::Load(QXmlStreamReader *reader) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/timeline/timelinemarker.h b/app/timeline/timelinemarker.h index de99b2539..0466aa689 100644 --- a/app/timeline/timelinemarker.h +++ b/app/timeline/timelinemarker.h @@ -27,7 +27,7 @@ #include "common/timerange.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelineMarker : public QObject { @@ -80,6 +80,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEMARKER_H diff --git a/app/timeline/timelinepoints.cpp b/app/timeline/timelinepoints.cpp index 2c11f6f94..06e87dac0 100644 --- a/app/timeline/timelinepoints.cpp +++ b/app/timeline/timelinepoints.cpp @@ -22,7 +22,7 @@ #include "common/xmlutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineMarkerList *TimelinePoints::markers() { @@ -68,4 +68,4 @@ TimelineWorkArea *TimelinePoints::workarea() return &workarea_; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/timeline/timelinepoints.h b/app/timeline/timelinepoints.h index 888aee94d..437aeb493 100644 --- a/app/timeline/timelinepoints.h +++ b/app/timeline/timelinepoints.h @@ -27,7 +27,7 @@ #include "timelinemarker.h" #include "timelineworkarea.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelinePoints { @@ -50,6 +50,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEPOINTS_H diff --git a/app/timeline/timelineworkarea.cpp b/app/timeline/timelineworkarea.cpp index 75320c5cd..fd57b2295 100644 --- a/app/timeline/timelineworkarea.cpp +++ b/app/timeline/timelineworkarea.cpp @@ -22,7 +22,7 @@ #include "common/xmlutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const rational TimelineWorkArea::kResetIn = 0; const rational TimelineWorkArea::kResetOut = RATIONAL_MAX; @@ -101,4 +101,4 @@ const rational &TimelineWorkArea::length() const return workarea_range_.length(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/timeline/timelineworkarea.h b/app/timeline/timelineworkarea.h index ce0bc0e05..579bd747f 100644 --- a/app/timeline/timelineworkarea.h +++ b/app/timeline/timelineworkarea.h @@ -27,7 +27,7 @@ #include "common/timerange.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelineWorkArea : public QObject { @@ -62,6 +62,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEWORKAREA_H diff --git a/app/timeline/trackreference.cpp b/app/timeline/trackreference.cpp index b77841fe1..f558ea03d 100644 --- a/app/timeline/trackreference.cpp +++ b/app/timeline/trackreference.cpp @@ -20,7 +20,7 @@ #include "trackreference.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TrackReference::TrackReference() : type_(Timeline::kTrackTypeNone), @@ -62,4 +62,4 @@ uint qHash(const TrackReference &r, uint seed) seed); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/timeline/trackreference.h b/app/timeline/trackreference.h index ffeedab54..827422fc6 100644 --- a/app/timeline/trackreference.h +++ b/app/timeline/trackreference.h @@ -23,7 +23,7 @@ #include "timeline/timelinecommon.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TrackReference { @@ -51,6 +51,6 @@ private: uint qHash(const TrackReference& r, uint seed); -OLIVE_NAMESPACE_EXIT +} #endif // TRACKREFERENCE_H diff --git a/app/tool/tool.h b/app/tool/tool.h index 0285d4073..95a745c59 100644 --- a/app/tool/tool.h +++ b/app/tool/tool.h @@ -26,7 +26,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class Tool { public: @@ -121,6 +121,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // TOOL_H diff --git a/app/ts/en_US.ts b/app/ts/en_US.ts index 15dfc47ab..ef4523a3d 100644 --- a/app/ts/en_US.ts +++ b/app/ts/en_US.ts @@ -1,58 +1,6 @@ - - AboutDialog - - - About %1 - - - - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - - - - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - - - - - ActionSearch - - - Search for action... - - - - - AudioInput - - - Audio Input - - - - - Audio - - - - - Import an audio footage stream. - - - - - AudioMonitorPanel - - - Audio Monitor - - - AudioParams @@ -92,7 +40,408 @@ - Block + Config + + + Error loading settings + + + + + Failed to load application settings. This session will use defaults. + +%1 + + + + + Error saving settings + + + + + Failed to save application settings. The application may lack write permissions to this location. + + + + + Footage + + + %1 FPS + + + + + %1 Hz + + + + + Filename: %1 + + + + + This footage is not valid for use + + + + + ImportTool + + + Don't ask me again + + + + + No Active Sequence + + + + + No sequence is currently open. Would you like to create one? + + + + + Automatically Detect Parameters From Footage + + + + + Set Parameters Manually + + + + + MoveItemCommand + + + Move Item + + + + + NodeCopyPasteWidget + + + Error pasting nodes + + + + + Failed to paste nodes: %1 + + + + + NodeFactory + + + None + + + + + NodeViewItem + + + %1... + + + + + PresetManager + + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + + + + + RatioDialog + + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + + + + + Invalid custom ratio + + + + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + + + + + RenameItemCommand + + + Rename Item + + + + + Sequence + + + %1 FPS + + + + + Stream + + + %1: Audio - %2 Channels, %3Hz + + + + + %1: Unknown + + + + + %1: Image - %2x%3 + + + + + %1: Video - %2x%3 + + + + + TimelineViewBlockItem + + + %1 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + + + + + Bars + + + + + Solid + + + + + Title + + + + + Tone + + + + + Unknown + + + + + VideoParams + + + 8-bit + + + + + 16-bit Integer + + + + + Half-Float (16-bit) + + + + + Full-Float (32-bit) + + + + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + + + + + main + + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + qm-file + + + + + Project to open on startup + + + + + olive::AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + + + + + olive::ActionSearch + + + Search for action... + + + + + olive::AudioInput + + + Audio Input + + + + + Audio + + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block Length @@ -115,7 +464,7 @@ - BlurFilterNode + olive::BlurFilterNode Blur @@ -168,7 +517,7 @@ - ClipBlock + olive::ClipBlock Clip @@ -186,7 +535,7 @@ - ColorDialog + olive::ColorDialog Select Color @@ -194,7 +543,7 @@ - ColorSpaceChooser + olive::ColorSpaceChooser Color Management @@ -232,7 +581,7 @@ - ColorValuesTab + olive::ColorValuesTab Red @@ -250,7 +599,7 @@ - ColorValuesWidget + olive::ColorValuesWidget Preview @@ -273,32 +622,7 @@ - Config - - - Error loading settings - - - - - Failed to load application settings. This session will use defaults. - -%1 - - - - - Error saving settings - - - - - Failed to save application settings. The application may lack write permissions to this location. - - - - - ConformTask + olive::ConformTask Conforming Audio %1:%2 @@ -306,261 +630,261 @@ - Core + olive::Core - + Import error - + Nothing to import - + Importing... - + Import footage... - + Failed to import footage - + Failed to find active Project panel - + No Active Project - + No project is currently open to set the properties for - + Failed to create new folder - - + + Failed to find active project - + New Folder - + Failed to create new sequence - + Possible image sequence detected - + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? - + You must specify a project file to export - + Specified project does not exist - + Project contains no sequences, nothing to export - + This project has multiple sequences. Which do you wish to export? - + Enter number (or %1 to cancel): - + Invalid sequence number - + Export succeeded - + Export failed: %1 - + Project failed to load: %1 - + Failed to open startup file - + The project "%1" doesn't exist. A new project will be started instead. - - + + Missing OpenTimelineIO Libraries - - + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. - + Save Project - - + + Error - + This Sequence is empty. There is nothing to export. - + No valid sequence detected. Make sure a sequence is loaded and it has a connected Viewer node. - + Olive Project - + OpenTimelineIO - + Save Project As - + Load Project - + Label Node - + Set node label - + Sequence %1 - + Cannot open recent project - + The project "%1" doesn't exist. Would you like to remove this file from the recent list? - + Unsaved Changes - + The project '%1' has unsaved changes. Would you like to save them? - + Save - + Save All - + Don't Save - + Don't Save All - + Failed to cache sequence - + No active viewer found with this sequence. - + Open Project - CrashHandlerDialog + olive::CrashHandlerDialog Olive @@ -618,7 +942,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - CrossDissolveTransition + olive::CrossDissolveTransition Cross Dissolve @@ -631,7 +955,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - CurvePanel + olive::CurvePanel Curve Editor @@ -639,7 +963,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - CurveView + olive::CurveView Zoom to Fit @@ -647,7 +971,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - CurveWidget + olive::CurveWidget Linear @@ -665,7 +989,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - DipToColorTransition + olive::DipToColorTransition Dip To Color @@ -678,7 +1002,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - DiskCacheDialog + olive::DiskCacheDialog Disk Cache: %1 @@ -733,7 +1057,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - DiskManager + olive::DiskManager @@ -762,7 +1086,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ElapsedCounterWidget + olive::ElapsedCounterWidget Elapsed: %1 @@ -775,7 +1099,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ExportAdvancedVideoDialog + olive::ExportAdvancedVideoDialog Advanced @@ -803,7 +1127,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ExportAudioTab + olive::ExportAudioTab Codec: @@ -826,7 +1150,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ExportCodec + olive::ExportCodec DNxHD @@ -889,7 +1213,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ExportDialog + olive::ExportDialog Filename: @@ -1023,7 +1347,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ExportFormat + olive::ExportFormat DNxHD @@ -1066,7 +1390,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ExportTask + olive::ExportTask Exporting "%1" @@ -1089,7 +1413,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ExportVideoTab + olive::ExportVideoTab Basic @@ -1167,7 +1491,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - FloatSlider + olive::FloatSlider %1 dB @@ -1180,30 +1504,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - Footage - - - %1 FPS - - - - - %1 Hz - - - - - Filename: %1 - - - - - This footage is not valid for use - - - - - FootagePropertiesDialog + olive::FootagePropertiesDialog "%1" Properties @@ -1221,7 +1522,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - FootageRelinkDialog + olive::FootageRelinkDialog Footage @@ -1259,7 +1560,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - FootageViewerPanel + olive::FootageViewerPanel Footage Viewer @@ -1267,7 +1568,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - GapBlock + olive::GapBlock Gap @@ -1280,7 +1581,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - H264BitRateSection + olive::H264BitRateSection Target Bit Rate (Mbps): @@ -1298,7 +1599,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - H264FileSizeSection + olive::H264FileSizeSection Target File Size (MB): @@ -1311,7 +1612,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - H264Section + olive::H264Section Compression Method: @@ -1334,7 +1635,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ImageSection + olive::ImageSection Image Sequence: @@ -1342,35 +1643,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - ImportTool - - - Don't ask me again - - - - - No Active Sequence - - - - - No sequence is currently open. Would you like to create one? - - - - - Automatically Detect Parameters From Footage - - - - - Set Parameters Manually - - - - - InterlacedComboBox + olive::InterlacedComboBox None (Progressive) @@ -1388,7 +1661,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - KeyframePropertiesDialog + olive::KeyframePropertiesDialog Keyframe Properties @@ -1421,7 +1694,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - KeyframeViewBase + olive::KeyframeViewBase Linear @@ -1444,7 +1717,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - LoadOTIOTask + olive::LoadOTIOTask Failed to load OpenTimelineIO from file "%1" @@ -1462,7 +1735,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - MainMenu + olive::MainMenu &Save '%1' @@ -1860,7 +2133,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - MainStatusBar + olive::MainStatusBar Welcome to %1 %2 @@ -1873,7 +2146,7 @@ Make sure a sequence is loaded and it has a connected Viewer node. - MainWindow + olive::MainWindow Driver Warning @@ -1888,7 +2161,7 @@ This driver is known to have stability and performance issues with Olive. It is - ManagedDisplayWidget + olive::ManagedDisplayWidget Color Space @@ -1931,7 +2204,7 @@ This driver is known to have stability and performance issues with Olive. It is - ManagedPixelSamplerWidget + olive::ManagedPixelSamplerWidget Display @@ -1944,7 +2217,7 @@ This driver is known to have stability and performance issues with Olive. It is - MathNode + olive::MathNode Math @@ -1993,7 +2266,7 @@ This driver is known to have stability and performance issues with Olive. It is - MatrixGenerator + olive::MatrixGenerator Orthographic Matrix @@ -2036,7 +2309,7 @@ This driver is known to have stability and performance issues with Olive. It is - MediaInput + olive::MediaInput Footage @@ -2044,7 +2317,7 @@ This driver is known to have stability and performance issues with Olive. It is - MenuShared + olive::MenuShared &Project @@ -2172,7 +2445,7 @@ This driver is known to have stability and performance issues with Olive. It is - MergeNode + olive::MergeNode Merge @@ -2195,7 +2468,7 @@ This driver is known to have stability and performance issues with Olive. It is - Node + olive::Node Input @@ -2253,28 +2526,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeCopyPasteWidget - - - Error pasting nodes - - - - - Failed to paste nodes: %1 - - - - - NodeFactory - - - None - - - - - NodeInput + olive::NodeInput Input @@ -2282,7 +2534,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeOutput + olive::NodeOutput Output @@ -2290,7 +2542,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodePanel + olive::NodePanel Node Editor @@ -2298,7 +2550,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeParam + olive::NodeParam Value @@ -2391,7 +2643,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeParamViewArrayWidget + olive::NodeParamViewArrayWidget + @@ -2404,7 +2656,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeParamViewConnectedLabel + olive::NodeParamViewConnectedLabel Connected to @@ -2422,7 +2674,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeParamViewItem + olive::NodeParamViewItem %1 (%2) @@ -2430,7 +2682,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeParamViewItemBody + olive::NodeParamViewItemBody %1: @@ -2438,7 +2690,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeParamViewKeyframeControl + olive::NodeParamViewKeyframeControl Warning @@ -2451,7 +2703,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeTablePanel + olive::NodeTablePanel Table View @@ -2459,7 +2711,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeTableView + olive::NodeTableView Type @@ -2497,7 +2749,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeTreeView + olive::NodeTreeView Nodes @@ -2505,7 +2757,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeView + olive::NodeView Label @@ -2568,15 +2820,7 @@ This driver is known to have stability and performance issues with Olive. It is - NodeViewItem - - - %1... - - - - - PanNode + olive::PanNode @@ -2595,7 +2839,7 @@ This driver is known to have stability and performance issues with Olive. It is - PanelWidget + olive::PanelWidget %1: %2 @@ -2603,7 +2847,7 @@ This driver is known to have stability and performance issues with Olive. It is - ParamPanel + olive::ParamPanel Parameter Editor @@ -2621,7 +2865,7 @@ This driver is known to have stability and performance issues with Olive. It is - PathWidget + olive::PathWidget Browse @@ -2634,7 +2878,7 @@ This driver is known to have stability and performance issues with Olive. It is - PixelAspectRatioComboBox + olive::PixelAspectRatioComboBox Set Custom Pixel Aspect Ratio @@ -2652,7 +2896,7 @@ This driver is known to have stability and performance issues with Olive. It is - PixelSamplerPanel + olive::PixelSamplerPanel Pixel Sampler @@ -2660,7 +2904,7 @@ This driver is known to have stability and performance issues with Olive. It is - PixelSamplerWidget + olive::PixelSamplerWidget Color @@ -2673,7 +2917,7 @@ This driver is known to have stability and performance issues with Olive. It is - PolygonGenerator + olive::PolygonGenerator Polygon @@ -2696,7 +2940,7 @@ This driver is known to have stability and performance issues with Olive. It is - PreCacheTask + olive::PreCacheTask Pre-caching %1:%2 @@ -2704,7 +2948,7 @@ This driver is known to have stability and performance issues with Olive. It is - PreferencesAppearanceTab + olive::PreferencesAppearanceTab Theme @@ -2717,7 +2961,7 @@ This driver is known to have stability and performance issues with Olive. It is - PreferencesAudioTab + olive::PreferencesAudioTab Output Device: @@ -2765,7 +3009,7 @@ This driver is known to have stability and performance issues with Olive. It is - PreferencesBehaviorTab + olive::PreferencesBehaviorTab Behavior @@ -2908,7 +3152,7 @@ This driver is known to have stability and performance issues with Olive. It is - PreferencesDialog + olive::PreferencesDialog Preferences @@ -2946,7 +3190,7 @@ This driver is known to have stability and performance issues with Olive. It is - PreferencesDiskTab + olive::PreferencesDiskTab Disk Management @@ -2995,55 +3239,55 @@ This driver is known to have stability and performance issues with Olive. It is - PreferencesGeneralTab + olive::PreferencesGeneralTab - + Language: - + Auto-Scroll Method: - + None - + Page Scrolling - + Smooth Scrolling - + Rectified Waveforms: - + Default Still Image Length: - + %1 seconds - + %1 (%2) - PreferencesKeyboardTab + olive::PreferencesKeyboardTab Search for action or shortcut @@ -3127,40 +3371,7 @@ This driver is known to have stability and performance issues with Olive. It is - PresetManager - - - Save Preset - - - - - Set preset name: - - - - - Invalid preset name - - - - - You must enter a preset name - - - - - Preset exists - - - - - A preset with this name already exists. Would you like to replace it? - - - - - ProgressDialog + olive::ProgressDialog Cancel @@ -3168,7 +3379,7 @@ This driver is known to have stability and performance issues with Olive. It is - Project + olive::Project @@ -3177,7 +3388,7 @@ This driver is known to have stability and performance issues with Olive. It is - ProjectExplorer + olive::ProjectExplorer &New @@ -3263,7 +3474,7 @@ What would you like to do with these clips? - ProjectExplorerNavigation + olive::ProjectExplorerNavigation Go to parent folder @@ -3271,7 +3482,7 @@ What would you like to do with these clips? - ProjectImportErrorDialog + olive::ProjectImportErrorDialog Import Error @@ -3284,7 +3495,7 @@ What would you like to do with these clips? - ProjectImportTask + olive::ProjectImportTask Importing %1 files @@ -3292,7 +3503,7 @@ What would you like to do with these clips? - ProjectLoadBaseTask + olive::ProjectLoadBaseTask Loading '%1' @@ -3300,7 +3511,7 @@ What would you like to do with these clips? - ProjectLoadTask + olive::ProjectLoadTask This project is newer than this version of Olive and cannot be opened. @@ -3319,7 +3530,7 @@ What would you like to do with these clips? - ProjectPanel + olive::ProjectPanel Folder @@ -3337,7 +3548,7 @@ What would you like to do with these clips? - ProjectPropertiesDialog + olive::ProjectPropertiesDialog Project Properties for '%1' @@ -3426,7 +3637,7 @@ What would you like to do with these clips? - ProjectSaveTask + olive::ProjectSaveTask Saving '%1' @@ -3449,7 +3660,7 @@ What would you like to do with these clips? - ProjectToolbar + olive::ProjectToolbar New... @@ -3497,7 +3708,7 @@ What would you like to do with these clips? - ProjectViewModel + olive::ProjectViewModel Name @@ -3520,41 +3731,7 @@ What would you like to do with these clips? - ProjectViewModel::MoveItemCommand - - - Move Item - - - - - ProjectViewModel::RenameItemCommand - - - Rename Item - - - - - RatioDialog - - - Enter custom ratio (e.g. "4:3", "16/9", etc.): - - - - - Invalid custom ratio - - - - - Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. - - - - - RenderCancelDialog + olive::RenderCancelDialog Waiting for workers to finish... @@ -3567,7 +3744,7 @@ What would you like to do with these clips? - RichTextDialog + olive::RichTextDialog B @@ -3660,7 +3837,7 @@ What would you like to do with these clips? - SaveOTIOTask + olive::SaveOTIOTask Exporting project to OpenTimelineIO @@ -3678,7 +3855,7 @@ What would you like to do with these clips? - ScopePanel + olive::ScopePanel Waveform @@ -3696,15 +3873,7 @@ What would you like to do with these clips? - Sequence - - - %1 FPS - - - - - SequenceDialog + olive::SequenceDialog Name: @@ -3732,7 +3901,7 @@ What would you like to do with these clips? - SequenceDialogParameterTab + olive::SequenceDialogParameterTab Video @@ -3805,7 +3974,7 @@ What would you like to do with these clips? - SequenceDialogPresetTab + olive::SequenceDialogPresetTab Preset @@ -3883,7 +4052,7 @@ What would you like to do with these clips? - SequenceViewerPanel + olive::SequenceViewerPanel Sequence Viewer @@ -3891,7 +4060,7 @@ What would you like to do with these clips? - SliderBase + olive::SliderBase Invalid Value @@ -3904,7 +4073,7 @@ What would you like to do with these clips? - SolidGenerator + olive::SolidGenerator Solid @@ -3922,30 +4091,7 @@ What would you like to do with these clips? - Stream - - - %1: Audio - %2 Channels, %3Hz - - - - - %1: Unknown - - - - - %1: Image - %2x%3 - - - - - %1: Video - %2x%3 - - - - - StringSlider + olive::StringSlider (none) @@ -3953,7 +4099,7 @@ What would you like to do with these clips? - StrokeFilterNode + olive::StrokeFilterNode Stroke @@ -3991,7 +4137,7 @@ What would you like to do with these clips? - Task + olive::Task Task @@ -4004,7 +4150,7 @@ What would you like to do with these clips? - TaskDialog + olive::TaskDialog Task Failed @@ -4012,7 +4158,7 @@ What would you like to do with these clips? - TaskManagerPanel + olive::TaskManagerPanel Task Manager @@ -4020,7 +4166,7 @@ What would you like to do with these clips? - TaskViewItem + olive::TaskViewItem Error: %1 @@ -4028,7 +4174,7 @@ What would you like to do with these clips? - TextGenerator + olive::TextGenerator Sample Text @@ -4082,7 +4228,7 @@ What would you like to do with these clips? - TimeBasedPanel + olive::TimeBasedPanel (none) @@ -4090,7 +4236,7 @@ What would you like to do with these clips? - TimeBasedWidget + olive::TimeBasedWidget Set Marker @@ -4103,7 +4249,7 @@ What would you like to do with these clips? - TimeInput + olive::TimeInput Time @@ -4116,7 +4262,7 @@ What would you like to do with these clips? - TimelinePanel + olive::TimelinePanel Timeline @@ -4124,19 +4270,7 @@ What would you like to do with these clips? - TimelineViewBlockItem - - - %1 - -In: %2 -Out: %3 -Length: %4 - - - - - TimelineWidget + olive::TimelineWidget @@ -4150,40 +4284,7 @@ Length: %4 - Tool - - - Empty - - - - - Bars - - - - - Solid - - - - - Title - - - - - Tone - - - - - Unknown - - - - - ToolPanel + olive::ToolPanel Tools @@ -4191,7 +4292,7 @@ Length: %4 - Toolbar + olive::Toolbar Pointer Tool @@ -4259,7 +4360,7 @@ Length: %4 - TrackOutput + olive::TrackOutput Track @@ -4302,7 +4403,7 @@ Length: %4 - TrackViewItem + olive::TrackViewItem M @@ -4315,7 +4416,7 @@ Length: %4 - TransitionBlock + olive::TransitionBlock From @@ -4348,7 +4449,7 @@ Length: %4 - TrigonometryNode + olive::TrigonometryNode Trigonometry @@ -4411,7 +4512,7 @@ Length: %4 - VideoDividerComboBox + olive::VideoDividerComboBox Full @@ -4424,7 +4525,7 @@ Length: %4 - VideoInput + olive::VideoInput Video Input @@ -4442,128 +4543,65 @@ Length: %4 - VideoParams + olive::VideoStreamProperties - - 8-bit - - - - - 16-bit Integer - - - - - Half-Float (16-bit) - - - - - Full-Float (32-bit) - - - - - Unknown (0x%1) - - - - - %1 FPS - - - - - Square Pixels (%1) - - - - - NTSC Standard (%1) - - - - - NTSC Widescreen (%1) - - - - - PAL Standard (%1) - - - - - PAL Widescreen (%1) - - - - - HD Anamorphic 1080 (%1) - - - - - VideoStreamProperties - - + Pixel Aspect: - + Interlacing: - + Color Space: - + Default (%1) - + Premultiplied Alpha - + Image Sequence - + Start Index: - + End Index: - + Frame Rate: - + Invalid Configuration - + Image sequence end index must be a value higher than the start index. - ViewerOutput + olive::ViewerOutput Viewer @@ -4601,7 +4639,7 @@ Length: %4 - ViewerPanel + olive::ViewerPanel Viewer @@ -4609,7 +4647,7 @@ Length: %4 - ViewerWidget + olive::ViewerWidget Error @@ -4708,7 +4746,7 @@ Length: %4 - VolumeNode + olive::VolumeNode @@ -4726,37 +4764,4 @@ Length: %4 - - main - - - Show this help text - - - - - Show application version - - - - - Start in full-screen mode - - - - - Export only (No GUI) - - - - - Override language with file - - - - - Project to open on startup - - - diff --git a/app/ui/icons/icons.cpp b/app/ui/icons/icons.cpp index 5cd7ee9d0..f5ccd421d 100644 --- a/app/ui/icons/icons.cpp +++ b/app/ui/icons/icons.cpp @@ -20,7 +20,7 @@ #include "icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /// Works in conjunction with `genicons.sh` to generate and utilize icons of specific sizes const int ICON_SIZE_COUNT = 4; @@ -140,4 +140,4 @@ QIcon icon::Create(const QString& theme, const QString &name) return icon; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/ui/icons/icons.h b/app/ui/icons/icons.h index a11df8778..ea8bc4e6d 100644 --- a/app/ui/icons/icons.h +++ b/app/ui/icons/icons.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { namespace icon { @@ -125,6 +125,6 @@ void LoadAll(const QString &theme); } -OLIVE_NAMESPACE_EXIT +} #endif // ICONS_H diff --git a/app/ui/style/style.cpp b/app/ui/style/style.cpp index 7b5b43fea..e4fa53722 100644 --- a/app/ui/style/style.cpp +++ b/app/ui/style/style.cpp @@ -31,7 +31,7 @@ #include "config/config.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const char* StyleManager::kDefaultStyle = "olive-dark"; QString StyleManager::current_style_; @@ -192,4 +192,4 @@ void StyleManager::SetStyle(const QString &style_path) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/ui/style/style.h b/app/ui/style/style.h index edb07de79..be77dce06 100644 --- a/app/ui/style/style.h +++ b/app/ui/style/style.h @@ -26,7 +26,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class StyleManager : public QObject { public: @@ -58,6 +58,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // STYLEMANAGER_H diff --git a/app/undo/undocommand.cpp b/app/undo/undocommand.cpp index ad880b9ca..db8318c3e 100644 --- a/app/undo/undocommand.cpp +++ b/app/undo/undocommand.cpp @@ -22,7 +22,7 @@ #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { UndoCommand::UndoCommand(QUndoCommand *parent) : QUndoCommand(parent) @@ -54,4 +54,4 @@ void UndoCommand::undo_internal() QUndoCommand::undo(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/undo/undocommand.h b/app/undo/undocommand.h index 3257d7ed9..ff71174d1 100644 --- a/app/undo/undocommand.h +++ b/app/undo/undocommand.h @@ -26,7 +26,7 @@ #include "common/define.h" #include "project/project.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class UndoCommand : public QUndoCommand { @@ -47,6 +47,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // UNDOCOMMAND_H diff --git a/app/undo/undostack.cpp b/app/undo/undostack.cpp index 9a8ae4c53..299f6f695 100644 --- a/app/undo/undostack.cpp +++ b/app/undo/undostack.cpp @@ -20,7 +20,7 @@ #include "undostack.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void UndoStack::pushIfHasChildren(QUndoCommand *command) { @@ -31,4 +31,4 @@ void UndoStack::pushIfHasChildren(QUndoCommand *command) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/undo/undostack.h b/app/undo/undostack.h index 486cac0d8..f19e98969 100644 --- a/app/undo/undostack.h +++ b/app/undo/undostack.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class UndoStack : public QUndoStack { public: @@ -37,6 +37,6 @@ public: void pushIfHasChildren(QUndoCommand* command); }; -OLIVE_NAMESPACE_EXIT +} #endif // UNDOSTACK_H diff --git a/app/widget/audiomonitor/audiomonitor.cpp b/app/widget/audiomonitor/audiomonitor.cpp index e41354d3c..22ba0eb58 100644 --- a/app/widget/audiomonitor/audiomonitor.cpp +++ b/app/widget/audiomonitor/audiomonitor.cpp @@ -27,7 +27,7 @@ #include "audio/audiomanager.h" #include "common/qtutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const int kDecibelStep = 6; const int kDecibelMinimum = -200; @@ -357,4 +357,4 @@ QVector AudioMonitor::GetAverages() const return v; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/audiomonitor/audiomonitor.h b/app/widget/audiomonitor/audiomonitor.h index 2fd782179..e9189b3d8 100644 --- a/app/widget/audiomonitor/audiomonitor.h +++ b/app/widget/audiomonitor/audiomonitor.h @@ -29,7 +29,7 @@ #include "render/audioparams.h" #include "render/audioplaybackcache.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AudioMonitor : public QOpenGLWidget { @@ -78,6 +78,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOMONITORWIDGET_H diff --git a/app/widget/clickablelabel/clickablelabel.cpp b/app/widget/clickablelabel/clickablelabel.cpp index 3b5c6bdff..a55837dbd 100644 --- a/app/widget/clickablelabel/clickablelabel.cpp +++ b/app/widget/clickablelabel/clickablelabel.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { ClickableLabel::ClickableLabel(const QString &text, QWidget *parent) : QLabel(text, parent) @@ -48,4 +48,4 @@ void ClickableLabel::mouseDoubleClickEvent(QMouseEvent *event) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/clickablelabel/clickablelabel.h b/app/widget/clickablelabel/clickablelabel.h index 5e13ff605..3897097ce 100644 --- a/app/widget/clickablelabel/clickablelabel.h +++ b/app/widget/clickablelabel/clickablelabel.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ClickableLabel : public QLabel { @@ -44,6 +44,6 @@ signals: }; -OLIVE_NAMESPACE_EXIT +} #endif // CLICKABLELABEL_H diff --git a/app/widget/collapsebutton/collapsebutton.cpp b/app/widget/collapsebutton/collapsebutton.cpp index 9d09738b6..2d31330b8 100644 --- a/app/widget/collapsebutton/collapsebutton.cpp +++ b/app/widget/collapsebutton/collapsebutton.cpp @@ -22,7 +22,7 @@ #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { CollapseButton::CollapseButton(QWidget *parent) : QPushButton(parent) @@ -47,4 +47,4 @@ void CollapseButton::UpdateIcon(bool e) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/collapsebutton/collapsebutton.h b/app/widget/collapsebutton/collapsebutton.h index 7b57505f2..ab3a6ff18 100644 --- a/app/widget/collapsebutton/collapsebutton.h +++ b/app/widget/collapsebutton/collapsebutton.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CollapseButton : public QPushButton { @@ -38,6 +38,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLLAPSEBUTTON_H diff --git a/app/widget/colorbutton/colorbutton.cpp b/app/widget/colorbutton/colorbutton.cpp index 23b2f11f4..716d7f906 100644 --- a/app/widget/colorbutton/colorbutton.cpp +++ b/app/widget/colorbutton/colorbutton.cpp @@ -22,7 +22,7 @@ #include "dialog/color/colordialog.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ColorButton::ColorButton(ColorManager* color_manager, QWidget *parent) : QPushButton(parent), @@ -72,7 +72,7 @@ void ColorButton::UpdateColor() QColor managed = color_processor_->ConvertColor(color_).toQColor(); - setStyleSheet(QStringLiteral("%1--ColorButton {background: %2;}").arg(MACRO_VAL_AS_STR(OLIVE_NAMESPACE), managed.name())); + setStyleSheet(QStringLiteral("%1--ColorButton {background: %2;}").arg(MACRO_VAL_AS_STR(olive), managed.name())); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/colorbutton/colorbutton.h b/app/widget/colorbutton/colorbutton.h index 4b3dcef3f..9d3a7e46c 100644 --- a/app/widget/colorbutton/colorbutton.h +++ b/app/widget/colorbutton/colorbutton.h @@ -26,7 +26,7 @@ #include "render/colormanager.h" #include "render/managedcolor.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorButton : public QPushButton { @@ -56,6 +56,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORBUTTON_H diff --git a/app/widget/colorwheel/colorgradientwidget.cpp b/app/widget/colorwheel/colorgradientwidget.cpp index 686b924d5..56a166342 100644 --- a/app/widget/colorwheel/colorgradientwidget.cpp +++ b/app/widget/colorwheel/colorgradientwidget.cpp @@ -26,7 +26,7 @@ #include "common/lerp.h" #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ColorGradientWidget::ColorGradientWidget(Qt::Orientation orientation, QWidget *parent) : ColorSwatchWidget(parent), @@ -106,4 +106,4 @@ Color ColorGradientWidget::LerpColor(const Color &a, const Color &b, int i, int lerp(a.blue(), b.blue(), t)); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/colorwheel/colorgradientwidget.h b/app/widget/colorwheel/colorgradientwidget.h index d59fe95be..ae972408e 100644 --- a/app/widget/colorwheel/colorgradientwidget.h +++ b/app/widget/colorwheel/colorgradientwidget.h @@ -24,7 +24,7 @@ #include "colorswatchwidget.h" #include "render/color.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorGradientWidget : public ColorSwatchWidget { @@ -54,6 +54,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORGRADIENTGLWIDGET_H diff --git a/app/widget/colorwheel/colorpreviewbox.cpp b/app/widget/colorwheel/colorpreviewbox.cpp index 1ff67e206..ad8360649 100644 --- a/app/widget/colorwheel/colorpreviewbox.cpp +++ b/app/widget/colorwheel/colorpreviewbox.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { ColorPreviewBox::ColorPreviewBox(QWidget *parent) : QWidget(parent), @@ -66,4 +66,4 @@ void ColorPreviewBox::paintEvent(QPaintEvent *e) p.drawRect(rect().adjusted(0, 0, -1, -1)); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/colorwheel/colorpreviewbox.h b/app/widget/colorwheel/colorpreviewbox.h index e8fe9266b..88d50335d 100644 --- a/app/widget/colorwheel/colorpreviewbox.h +++ b/app/widget/colorwheel/colorpreviewbox.h @@ -26,7 +26,7 @@ #include "render/color.h" #include "render/colorprocessor.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorPreviewBox : public QWidget { @@ -51,6 +51,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORPREVIEWBOX_H diff --git a/app/widget/colorwheel/colorspacechooser.cpp b/app/widget/colorwheel/colorspacechooser.cpp index 39a668d5a..46e98d125 100644 --- a/app/widget/colorwheel/colorspacechooser.cpp +++ b/app/widget/colorwheel/colorspacechooser.cpp @@ -23,7 +23,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { ColorSpaceChooser::ColorSpaceChooser(ColorManager* color_manager, bool enable_input_field, bool enable_display_fields, QWidget *parent): QGroupBox(parent), @@ -200,4 +200,4 @@ void ColorSpaceChooser::ComboBoxChanged() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/colorwheel/colorspacechooser.h b/app/widget/colorwheel/colorspacechooser.h index ae3bcb4ce..221dca934 100644 --- a/app/widget/colorwheel/colorspacechooser.h +++ b/app/widget/colorwheel/colorspacechooser.h @@ -26,7 +26,7 @@ #include "render/colormanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorSpaceChooser : public QGroupBox { @@ -66,6 +66,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORSPACECHOOSER_H diff --git a/app/widget/colorwheel/colorswatchwidget.cpp b/app/widget/colorwheel/colorswatchwidget.cpp index 163b493fb..d0d030b38 100644 --- a/app/widget/colorwheel/colorswatchwidget.cpp +++ b/app/widget/colorwheel/colorswatchwidget.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { ColorSwatchWidget::ColorSwatchWidget(QWidget *parent) : QWidget(parent), @@ -98,4 +98,4 @@ void ColorSwatchWidget::SetSelectedColorInternal(const Color &c, bool external) update(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/colorwheel/colorswatchwidget.h b/app/widget/colorwheel/colorswatchwidget.h index 9d20895a0..ee1d8526e 100644 --- a/app/widget/colorwheel/colorswatchwidget.h +++ b/app/widget/colorwheel/colorswatchwidget.h @@ -26,7 +26,7 @@ #include "render/color.h" #include "render/colorprocessor.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorSwatchWidget : public QWidget { @@ -68,6 +68,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORSWATCHWIDGET_H diff --git a/app/widget/colorwheel/colorvalueswidget.cpp b/app/widget/colorwheel/colorvalueswidget.cpp index 62703b5e6..cdb13f5e3 100644 --- a/app/widget/colorwheel/colorvalueswidget.cpp +++ b/app/widget/colorwheel/colorvalueswidget.cpp @@ -23,7 +23,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { ColorValuesWidget::ColorValuesWidget(ColorManager *manager, QWidget *parent) : QWidget(parent), @@ -213,4 +213,4 @@ void ColorValuesTab::SliderChanged() emit ColorChanged(GetColor()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/colorwheel/colorvalueswidget.h b/app/widget/colorwheel/colorvalueswidget.h index 3af8d9e95..371cbb392 100644 --- a/app/widget/colorwheel/colorvalueswidget.h +++ b/app/widget/colorwheel/colorvalueswidget.h @@ -28,7 +28,7 @@ #include "render/colormanager.h" #include "widget/slider/floatslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorValuesTab : public QWidget { @@ -110,6 +110,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORVALUESWIDGET_H diff --git a/app/widget/colorwheel/colorwheelwidget.cpp b/app/widget/colorwheel/colorwheelwidget.cpp index 6d9ce2fc5..2e2aa31f4 100644 --- a/app/widget/colorwheel/colorwheelwidget.cpp +++ b/app/widget/colorwheel/colorwheelwidget.cpp @@ -26,7 +26,7 @@ #include "common/clamp.h" #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { #define M_180_OVER_PI 57.295791433133264917914229473464 #define M_RADIAN_TO_0_1 0.15915497620314795810531730409296 @@ -177,4 +177,4 @@ QPoint ColorWheelWidget::GetCoordsFromColor(const Color &c) const return pos; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/colorwheel/colorwheelwidget.h b/app/widget/colorwheel/colorwheelwidget.h index 15c6d1a61..c0d5fc776 100644 --- a/app/widget/colorwheel/colorwheelwidget.h +++ b/app/widget/colorwheel/colorwheelwidget.h @@ -26,7 +26,7 @@ #include "colorswatchwidget.h" #include "render/color.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ColorWheelWidget : public ColorSwatchWidget { @@ -71,6 +71,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // COLORWHEELWIDGET_H diff --git a/app/widget/columnedgridlayout/columnedgridlayout.cpp b/app/widget/columnedgridlayout/columnedgridlayout.cpp index aff4e5a37..5db3b0844 100644 --- a/app/widget/columnedgridlayout/columnedgridlayout.cpp +++ b/app/widget/columnedgridlayout/columnedgridlayout.cpp @@ -20,7 +20,7 @@ #include "columnedgridlayout.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ColumnedGridLayout::ColumnedGridLayout(QWidget* parent, int maximum_columns) : @@ -55,4 +55,4 @@ void ColumnedGridLayout::SetMaximumColumns(int maximum_columns) maximum_columns_ = maximum_columns; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/columnedgridlayout/columnedgridlayout.h b/app/widget/columnedgridlayout/columnedgridlayout.h index e6afb6444..87b50c014 100644 --- a/app/widget/columnedgridlayout/columnedgridlayout.h +++ b/app/widget/columnedgridlayout/columnedgridlayout.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The ColumnedGridLayout class @@ -48,6 +48,6 @@ private: int maximum_columns_; }; -OLIVE_NAMESPACE_EXIT +} #endif // COLUMNEDGRIDLAYOUT_H diff --git a/app/widget/curvewidget/beziercontrolpointitem.cpp b/app/widget/curvewidget/beziercontrolpointitem.cpp index f40496252..207a92e3e 100644 --- a/app/widget/curvewidget/beziercontrolpointitem.cpp +++ b/app/widget/curvewidget/beziercontrolpointitem.cpp @@ -27,7 +27,7 @@ #include "common/qtutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { BezierControlPointItem::BezierControlPointItem(NodeKeyframePtr key, NodeKeyframe::BezierType mode, QGraphicsItem *parent) : QGraphicsRectItem(parent), @@ -103,4 +103,4 @@ void BezierControlPointItem::UpdatePos() setPos(handle_offset - rect().center()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/curvewidget/beziercontrolpointitem.h b/app/widget/curvewidget/beziercontrolpointitem.h index 720f7fe06..6cca33d5a 100644 --- a/app/widget/curvewidget/beziercontrolpointitem.h +++ b/app/widget/curvewidget/beziercontrolpointitem.h @@ -25,7 +25,7 @@ #include "node/keyframe.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class BezierControlPointItem : public QObject, public QGraphicsRectItem { @@ -63,6 +63,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // BEZIERCONTROLPOINTITEM_H diff --git a/app/widget/curvewidget/curveview.cpp b/app/widget/curvewidget/curveview.cpp index cdc749c45..e93a8fd3d 100644 --- a/app/widget/curvewidget/curveview.cpp +++ b/app/widget/curvewidget/curveview.cpp @@ -27,7 +27,7 @@ #include "common/qtutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { CurveView::CurveView(QWidget *parent) : KeyframeViewBase(parent) @@ -431,4 +431,4 @@ void CurveView::AddKeyframe(NodeKeyframePtr key) connect(key.get(), &NodeKeyframe::TypeChanged, this, &CurveView::KeyframeTypeChanged); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/curvewidget/curveview.h b/app/widget/curvewidget/curveview.h index 4ac8d740c..65a82ed52 100644 --- a/app/widget/curvewidget/curveview.h +++ b/app/widget/curvewidget/curveview.h @@ -26,7 +26,7 @@ #include "widget/keyframeview/keyframeview.h" #include "widget/keyframeview/keyframeviewitem.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CurveView : public KeyframeViewBase { @@ -97,6 +97,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // CURVEVIEW_H diff --git a/app/widget/curvewidget/curvewidget.cpp b/app/widget/curvewidget/curvewidget.cpp index 05138b7e0..75d481ad9 100644 --- a/app/widget/curvewidget/curvewidget.cpp +++ b/app/widget/curvewidget/curvewidget.cpp @@ -32,7 +32,7 @@ #include "node/node.h" #include "widget/keyframeview/keyframeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { CurveWidget::CurveWidget(QWidget *parent) : TimeBasedWidget(parent) @@ -322,4 +322,4 @@ void CurveWidget::InputEnabledChanged(NodeInput *i, bool e) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/curvewidget/curvewidget.h b/app/widget/curvewidget/curvewidget.h index a65f8c805..127987289 100644 --- a/app/widget/curvewidget/curvewidget.h +++ b/app/widget/curvewidget/curvewidget.h @@ -33,7 +33,7 @@ #include "widget/nodetreeview/nodetreeview.h" #include "widget/timebased/timebased.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class CurveWidget : public TimeBasedWidget, public TimeTargetObject { @@ -100,6 +100,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // CURVEWIDGET_H diff --git a/app/widget/focusablelineedit/focusablelineedit.cpp b/app/widget/focusablelineedit/focusablelineedit.cpp index cb1f0059b..ea9c00efe 100644 --- a/app/widget/focusablelineedit/focusablelineedit.cpp +++ b/app/widget/focusablelineedit/focusablelineedit.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { FocusableLineEdit::FocusableLineEdit(QWidget *parent) : QLineEdit(parent) @@ -52,4 +52,4 @@ void FocusableLineEdit::focusOutEvent(QFocusEvent *e) emit Confirmed(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/focusablelineedit/focusablelineedit.h b/app/widget/focusablelineedit/focusablelineedit.h index 6dfd21214..a6c2a82b8 100644 --- a/app/widget/focusablelineedit/focusablelineedit.h +++ b/app/widget/focusablelineedit/focusablelineedit.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FocusableLineEdit : public QLineEdit { @@ -46,6 +46,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // SLIDERLINEEDIT_H diff --git a/app/widget/footagecombobox/footagecombobox.cpp b/app/widget/footagecombobox/footagecombobox.cpp index 7a9ddf42e..684eeeca2 100644 --- a/app/widget/footagecombobox/footagecombobox.cpp +++ b/app/widget/footagecombobox/footagecombobox.cpp @@ -26,7 +26,7 @@ #include "ui/icons/icons.h" #include "widget/menu/menu.h" -OLIVE_NAMESPACE_ENTER +namespace olive { FootageComboBox::FootageComboBox(QWidget *parent) : QComboBox(parent), @@ -128,4 +128,4 @@ QString FootageComboBox::FootageToString(Stream *f) return f->description(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/footagecombobox/footagecombobox.h b/app/widget/footagecombobox/footagecombobox.h index 01eab6653..2d96f4a6f 100644 --- a/app/widget/footagecombobox/footagecombobox.h +++ b/app/widget/footagecombobox/footagecombobox.h @@ -27,7 +27,7 @@ #include "project/item/footage/footage.h" #include "project/project.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FootageComboBox : public QComboBox { @@ -63,6 +63,6 @@ private: bool only_show_ready_footage_; }; -OLIVE_NAMESPACE_EXIT +} #endif // FOOTAGECOMBOBOX_H diff --git a/app/widget/keyframeview/keyframeview.cpp b/app/widget/keyframeview/keyframeview.cpp index 99782b24f..dddf30c62 100644 --- a/app/widget/keyframeview/keyframeview.cpp +++ b/app/widget/keyframeview/keyframeview.cpp @@ -20,7 +20,7 @@ #include "keyframeview.h" -OLIVE_NAMESPACE_ENTER +namespace olive { KeyframeView::KeyframeView(QWidget *parent) : KeyframeViewBase(parent), @@ -52,4 +52,4 @@ void KeyframeView::AddKeyframe(NodeKeyframePtr key, int y) item->SetOverrideY(scene_pt.y()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/keyframeview/keyframeview.h b/app/widget/keyframeview/keyframeview.h index b21c1e5a0..5eef3934c 100644 --- a/app/widget/keyframeview/keyframeview.h +++ b/app/widget/keyframeview/keyframeview.h @@ -23,7 +23,7 @@ #include "keyframeviewbase.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class KeyframeView : public KeyframeViewBase { @@ -49,6 +49,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // KEYFRAMEVIEW_H diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index dde824e56..7850ada79 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -30,7 +30,7 @@ #include "widget/menu/menushared.h" #include "widget/nodeparamview/nodeparamviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { KeyframeViewBase::KeyframeViewBase(QWidget *parent) : TimelineViewBase(parent), @@ -538,4 +538,4 @@ void KeyframeViewBase::AutoSelectKeyTimeNeighbors() currently_autoselecting_ = false; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/keyframeview/keyframeviewbase.h b/app/widget/keyframeview/keyframeviewbase.h index ecb7df990..113a14895 100644 --- a/app/widget/keyframeview/keyframeviewbase.h +++ b/app/widget/keyframeview/keyframeviewbase.h @@ -28,7 +28,7 @@ #include "widget/timelinewidget/view/timelineviewbase.h" #include "widget/timetarget/timetarget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class KeyframeViewBase : public TimelineViewBase, public TimeTargetObject { @@ -105,6 +105,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // KEYFRAMEVIEWBASE_H diff --git a/app/widget/keyframeview/keyframeviewitem.cpp b/app/widget/keyframeview/keyframeviewitem.cpp index 8acde3ee7..783d94544 100644 --- a/app/widget/keyframeview/keyframeviewitem.cpp +++ b/app/widget/keyframeview/keyframeviewitem.cpp @@ -28,7 +28,7 @@ #include "common/qtutils.h" #include "node/input.h" -OLIVE_NAMESPACE_ENTER +namespace olive { KeyframeViewItem::KeyframeViewItem(NodeKeyframePtr key, QGraphicsItem *parent) : QGraphicsRectItem(parent), @@ -127,4 +127,4 @@ void KeyframeViewItem::Redraw() QGraphicsItem::update(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/keyframeview/keyframeviewitem.h b/app/widget/keyframeview/keyframeviewitem.h index d0e974920..102da3b61 100644 --- a/app/widget/keyframeview/keyframeviewitem.h +++ b/app/widget/keyframeview/keyframeviewitem.h @@ -26,7 +26,7 @@ #include "node/keyframe.h" #include "widget/timetarget/timetarget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class KeyframeViewItem : public QObject, public QGraphicsRectItem, public TimeTargetObject { @@ -63,6 +63,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // KEYFRAMEVIEWITEM_H diff --git a/app/widget/keyframeview/keyframeviewundo.cpp b/app/widget/keyframeview/keyframeviewundo.cpp index 1a0d16690..6e286768e 100644 --- a/app/widget/keyframeview/keyframeviewundo.cpp +++ b/app/widget/keyframeview/keyframeviewundo.cpp @@ -24,7 +24,7 @@ #include "node/node.h" #include "project/item/sequence/sequence.h" -OLIVE_NAMESPACE_ENTER +namespace olive { KeyframeSetTypeCommand::KeyframeSetTypeCommand(NodeKeyframePtr key, NodeKeyframe::Type type, QUndoCommand *parent) : UndoCommand(parent), @@ -82,4 +82,4 @@ void KeyframeSetBezierControlPoint::undo_internal() key_->set_bezier_control(mode_, old_point_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/keyframeview/keyframeviewundo.h b/app/widget/keyframeview/keyframeviewundo.h index 89e0799ac..a6aa322b1 100644 --- a/app/widget/keyframeview/keyframeviewundo.h +++ b/app/widget/keyframeview/keyframeviewundo.h @@ -24,7 +24,7 @@ #include "node/keyframe.h" #include "undo/undocommand.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class KeyframeSetTypeCommand : public UndoCommand { public: @@ -67,6 +67,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // KEYFRAMEVIEWUNDO_H diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index e69731846..0ffc6401b 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -26,7 +26,7 @@ #include "render/opengl/openglrenderer.h" #include "render/rendermanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ManagedDisplayWidget::ManagedDisplayWidget(QWidget *parent) : QWidget(parent), @@ -345,4 +345,4 @@ void ManagedDisplayWidget::SetupColorProcessor() emit ColorProcessorChanged(color_service_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index 100dff95f..7cab3bd38 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -28,7 +28,7 @@ #include "render/renderer.h" #include "widget/menu/menu.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ManagedDisplayWidgetOpenGL : public QOpenGLWidget { @@ -261,6 +261,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // MANAGEDDISPLAYOBJECT_H diff --git a/app/widget/menu/menu.cpp b/app/widget/menu/menu.cpp index c58d806ef..55e4c762d 100644 --- a/app/widget/menu/menu.cpp +++ b/app/widget/menu/menu.cpp @@ -22,7 +22,7 @@ #include "ui/style/style.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Menu::Menu(QMenuBar *bar) { @@ -111,4 +111,4 @@ void Menu::Init() StyleManager::UseOSNativeStyling(this); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/menu/menu.h b/app/widget/menu/menu.h index af9e6d119..6dafb99f1 100644 --- a/app/widget/menu/menu.h +++ b/app/widget/menu/menu.h @@ -27,7 +27,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A menu widget for context menus and menu bars @@ -237,6 +237,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // WIDGETMENU_H diff --git a/app/widget/menu/menushared.cpp b/app/widget/menu/menushared.cpp index b6c201924..9701ec9a6 100644 --- a/app/widget/menu/menushared.cpp +++ b/app/widget/menu/menushared.cpp @@ -24,7 +24,7 @@ #include "panel/panelmanager.h" #include "panel/timeline/timeline.h" -OLIVE_NAMESPACE_ENTER +namespace olive { MenuShared* MenuShared::instance_ = nullptr; @@ -309,4 +309,4 @@ void MenuShared::Retranslate() view_timecode_view_seconds_item_->setText(tr("Seconds")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/menu/menushared.h b/app/widget/menu/menushared.h index 69d26ba93..60d0b6989 100644 --- a/app/widget/menu/menushared.h +++ b/app/widget/menu/menushared.h @@ -23,7 +23,7 @@ #include "widget/menu/menu.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A static object that provides various "stock" menus for use throughout the application @@ -132,6 +132,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // MENUSHARED_H diff --git a/app/widget/nodecombobox/nodecombobox.cpp b/app/widget/nodecombobox/nodecombobox.cpp index d2a16f011..d8d23c91a 100644 --- a/app/widget/nodecombobox/nodecombobox.cpp +++ b/app/widget/nodecombobox/nodecombobox.cpp @@ -27,7 +27,7 @@ #include "ui/icons/icons.h" #include "widget/menu/menu.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeComboBox::NodeComboBox(QWidget *parent) : QComboBox(parent) @@ -90,4 +90,4 @@ void NodeComboBox::SetNodeInternal(const QString &id, bool emit_signal) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodecombobox/nodecombobox.h b/app/widget/nodecombobox/nodecombobox.h index 06f16df90..dbdb8cf16 100644 --- a/app/widget/nodecombobox/nodecombobox.h +++ b/app/widget/nodecombobox/nodecombobox.h @@ -25,7 +25,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeComboBox : public QComboBox { @@ -55,6 +55,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // FOOTAGECOMBOBOX_H diff --git a/app/widget/nodecopypaste/nodecopypaste.cpp b/app/widget/nodecopypaste/nodecopypaste.cpp index d25b0b151..ccc6c235a 100644 --- a/app/widget/nodecopypaste/nodecopypaste.cpp +++ b/app/widget/nodecopypaste/nodecopypaste.cpp @@ -27,7 +27,7 @@ #include "widget/nodeview/nodeviewundo.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void NodeCopyPasteWidget::CopyNodesToClipboard(const QVector &nodes, void *userdata) { @@ -177,4 +177,4 @@ void NodeCopyPasteWidget::PasteNodesFromClipboardInternal(QXmlStreamReader* read reader->skipCurrentElement(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodecopypaste/nodecopypaste.h b/app/widget/nodecopypaste/nodecopypaste.h index a960c9d25..00b7c30a0 100644 --- a/app/widget/nodecopypaste/nodecopypaste.h +++ b/app/widget/nodecopypaste/nodecopypaste.h @@ -27,7 +27,7 @@ #include "node/node.h" #include "project/item/sequence/sequence.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeCopyPasteWidget { @@ -45,6 +45,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODECOPYPASTEWIDGET_H diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index 7b0bd36de..2a734a718 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -28,7 +28,7 @@ #include "common/timecodefunctions.h" #include "node/output/viewer/viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeParamView::NodeParamView(QWidget *parent) : TimeBasedWidget(true, false, parent), @@ -389,4 +389,4 @@ void NodeParamView::FocusChanged(QWidget* old, QWidget* now) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index c8f0352a4..1bbefbf52 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -30,7 +30,7 @@ #include "widget/keyframeview/keyframeview.h" #include "widget/timebased/timebased.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeParamViewParamContainer : public QWidget { @@ -134,6 +134,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPARAMVIEW_H diff --git a/app/widget/nodeparamview/nodeparamviewarraywidget.cpp b/app/widget/nodeparamview/nodeparamviewarraywidget.cpp index dc8cf1714..46b04caba 100644 --- a/app/widget/nodeparamview/nodeparamviewarraywidget.cpp +++ b/app/widget/nodeparamview/nodeparamviewarraywidget.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { NodeParamViewArrayWidget::NodeParamViewArrayWidget(NodeInputArray* array, QWidget* parent) : QWidget(parent), @@ -55,4 +55,4 @@ void NodeParamViewArrayWidget::AddElement() array_->Append(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeparamview/nodeparamviewarraywidget.h b/app/widget/nodeparamview/nodeparamviewarraywidget.h index 83f9bad67..1582f497d 100644 --- a/app/widget/nodeparamview/nodeparamviewarraywidget.h +++ b/app/widget/nodeparamview/nodeparamviewarraywidget.h @@ -27,7 +27,7 @@ #include "node/inputarray.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeParamViewArrayWidget : public QWidget { @@ -49,6 +49,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPARAMVIEWARRAYWIDGET_H diff --git a/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp b/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp index bdcfcdb4e..fba601f93 100644 --- a/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp +++ b/app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp @@ -28,7 +28,7 @@ #include "widget/menu/menu.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeParamViewConnectedLabel::NodeParamViewConnectedLabel(NodeInput *input, QWidget *parent) : QWidget(parent), @@ -86,4 +86,4 @@ void NodeParamViewConnectedLabel::ShowLabelContextMenu() m.exec(QCursor::pos()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeparamview/nodeparamviewconnectedlabel.h b/app/widget/nodeparamview/nodeparamviewconnectedlabel.h index 7e5b99580..ffec58ecc 100644 --- a/app/widget/nodeparamview/nodeparamviewconnectedlabel.h +++ b/app/widget/nodeparamview/nodeparamviewconnectedlabel.h @@ -24,7 +24,7 @@ #include "node/input.h" #include "widget/clickablelabel/clickablelabel.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeParamViewConnectedLabel : public QWidget { Q_OBJECT @@ -46,6 +46,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPARAMVIEWCONNECTEDLABEL_H diff --git a/app/widget/nodeparamview/nodeparamviewitem.cpp b/app/widget/nodeparamview/nodeparamviewitem.cpp index 7b0e558d8..8261d3720 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.cpp +++ b/app/widget/nodeparamview/nodeparamviewitem.cpp @@ -29,7 +29,7 @@ #include "nodeparamviewundo.h" #include "project/item/sequence/sequence.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeParamViewItem::NodeParamViewItem(Node *node, QWidget *parent) : QDockWidget(parent), @@ -459,4 +459,4 @@ NodeParamViewItemBody::InputUI::InputUI() : { } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeparamview/nodeparamviewitem.h b/app/widget/nodeparamview/nodeparamviewitem.h index 9bc1fef6c..a71b46359 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.h +++ b/app/widget/nodeparamview/nodeparamviewitem.h @@ -35,7 +35,7 @@ #include "widget/clickablelabel/clickablelabel.h" #include "widget/collapsebutton/collapsebutton.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeParamViewItemTitleBar : public QWidget { @@ -186,6 +186,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPARAMVIEWITEM_H diff --git a/app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp b/app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp index a41b0ff2e..6e5e3e7ab 100644 --- a/app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp +++ b/app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp @@ -27,7 +27,7 @@ #include "nodeparamviewundo.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeParamViewKeyframeControl::NodeParamViewKeyframeControl(bool right_align, QWidget *parent) : QWidget(parent), @@ -277,4 +277,4 @@ void NodeParamViewKeyframeControl::KeyframeEnableChanged(bool e) Core::instance()->undo_stack()->pushIfHasChildren(command); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeparamview/nodeparamviewkeyframecontrol.h b/app/widget/nodeparamview/nodeparamviewkeyframecontrol.h index c27276236..1a22a24c3 100644 --- a/app/widget/nodeparamview/nodeparamviewkeyframecontrol.h +++ b/app/widget/nodeparamview/nodeparamviewkeyframecontrol.h @@ -27,7 +27,7 @@ #include "node/input.h" #include "widget/timetarget/timetarget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeParamViewKeyframeControl : public QWidget, public TimeTargetObject { @@ -77,6 +77,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPARAMVIEWKEYFRAMECONTROL_H diff --git a/app/widget/nodeparamview/nodeparamviewrichtext.cpp b/app/widget/nodeparamview/nodeparamviewrichtext.cpp index 4ff1a9da2..b6545dfaa 100644 --- a/app/widget/nodeparamview/nodeparamviewrichtext.cpp +++ b/app/widget/nodeparamview/nodeparamviewrichtext.cpp @@ -26,7 +26,7 @@ #include "dialog/richtext/richtext.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeParamViewRichText::NodeParamViewRichText(QWidget *parent) : QWidget(parent) @@ -61,4 +61,4 @@ void NodeParamViewRichText::InnerWidgetTextChanged() emit textEdited(this->text()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeparamview/nodeparamviewrichtext.h b/app/widget/nodeparamview/nodeparamviewrichtext.h index 90555111e..28cae7200 100644 --- a/app/widget/nodeparamview/nodeparamviewrichtext.h +++ b/app/widget/nodeparamview/nodeparamviewrichtext.h @@ -26,7 +26,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeParamViewRichText : public QWidget { @@ -74,6 +74,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPARAMVIEWRICHTEXT_H diff --git a/app/widget/nodeparamview/nodeparamviewundo.cpp b/app/widget/nodeparamview/nodeparamviewundo.cpp index 397ffb85f..7a02391af 100644 --- a/app/widget/nodeparamview/nodeparamviewundo.cpp +++ b/app/widget/nodeparamview/nodeparamviewundo.cpp @@ -23,7 +23,7 @@ #include "node/node.h" #include "project/item/sequence/sequence.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeParamSetKeyframingCommand::NodeParamSetKeyframingCommand(NodeInput *input, bool setting, QUndoCommand *parent) : UndoCommand(parent), @@ -200,4 +200,4 @@ void NodeParamSetStandardValueCommand::undo_internal() input_->set_standard_value(old_value_, track_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeparamview/nodeparamviewundo.h b/app/widget/nodeparamview/nodeparamviewundo.h index da531bc4d..07d190a83 100644 --- a/app/widget/nodeparamview/nodeparamviewundo.h +++ b/app/widget/nodeparamview/nodeparamviewundo.h @@ -24,7 +24,7 @@ #include "node/input.h" #include "undo/undocommand.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeParamSetKeyframingCommand : public UndoCommand { public: @@ -136,6 +136,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPARAMVIEWUNDO_H diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp index b4a1c6492..e04cc9949 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp @@ -38,7 +38,7 @@ #include "widget/slider/floatslider.h" #include "widget/slider/integerslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeParamViewWidgetBridge::NodeParamViewWidgetBridge(NodeInput *input, QObject *parent) : QObject(parent), @@ -671,4 +671,4 @@ void NodeParamViewWidgetBridge::PropertyChanged(const QString &key, const QVaria } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.h b/app/widget/nodeparamview/nodeparamviewwidgetbridge.h index 71ea4969d..a4698e001 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.h +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.h @@ -28,7 +28,7 @@ #include "widget/slider/sliderbase.h" #include "widget/timetarget/timetarget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeParamViewWidgetBridge : public QObject, public TimeTargetObject { @@ -72,6 +72,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEPARAMVIEWWIDGETBRIDGE_H diff --git a/app/widget/nodetableview/nodetabletraverser.cpp b/app/widget/nodetableview/nodetabletraverser.cpp index 59864c9df..cd94ee5f8 100644 --- a/app/widget/nodetableview/nodetabletraverser.cpp +++ b/app/widget/nodetableview/nodetabletraverser.cpp @@ -20,7 +20,7 @@ #include "nodetabletraverser.h" -OLIVE_NAMESPACE_ENTER +namespace olive { QVariant NodeTableTraverser::ProcessVideoFootage(StreamPtr stream, const rational &input_time) { @@ -43,4 +43,4 @@ QVariant NodeTableTraverser::ProcessAudioFootage(StreamPtr stream, const TimeRan AudioParams::kInternalFormat)); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodetableview/nodetabletraverser.h b/app/widget/nodetableview/nodetabletraverser.h index 5eaa8b415..dbfc531cd 100644 --- a/app/widget/nodetableview/nodetabletraverser.h +++ b/app/widget/nodetableview/nodetabletraverser.h @@ -23,7 +23,7 @@ #include "node/traverser.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeTableTraverser : public NodeTraverser { @@ -37,6 +37,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODETABLETRAVERSER_H diff --git a/app/widget/nodetableview/nodetableview.cpp b/app/widget/nodetableview/nodetableview.cpp index 972032f55..90afc94af 100644 --- a/app/widget/nodetableview/nodetableview.cpp +++ b/app/widget/nodetableview/nodetableview.cpp @@ -26,7 +26,7 @@ #include "node/param.h" #include "nodetabletraverser.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeTableView::NodeTableView(QWidget* parent) : QTreeWidget(parent) @@ -260,4 +260,4 @@ void NodeTableView::SetNode(Node *n, const rational &time) } */ -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodetableview/nodetableview.h b/app/widget/nodetableview/nodetableview.h index f2bbf6ca4..49e768740 100644 --- a/app/widget/nodetableview/nodetableview.h +++ b/app/widget/nodetableview/nodetableview.h @@ -25,7 +25,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeTableView : public QTreeWidget { @@ -46,6 +46,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODETABLEVIEW_H diff --git a/app/widget/nodetableview/nodetablewidget.cpp b/app/widget/nodetableview/nodetablewidget.cpp index 890899ff8..1146e954b 100644 --- a/app/widget/nodetableview/nodetablewidget.cpp +++ b/app/widget/nodetableview/nodetablewidget.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { NodeTableWidget::NodeTableWidget(QWidget* parent) : TimeBasedWidget(parent) @@ -35,4 +35,4 @@ NodeTableWidget::NodeTableWidget(QWidget* parent) : layout->addWidget(view_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodetableview/nodetablewidget.h b/app/widget/nodetableview/nodetablewidget.h index ebe892f64..b2e39210a 100644 --- a/app/widget/nodetableview/nodetablewidget.h +++ b/app/widget/nodetableview/nodetablewidget.h @@ -24,7 +24,7 @@ #include "nodetableview.h" #include "widget/timebased/timebased.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeTableWidget : public TimeBasedWidget { @@ -57,6 +57,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODETABLEWIDGET_H diff --git a/app/widget/nodetreeview/nodetreeview.cpp b/app/widget/nodetreeview/nodetreeview.cpp index 324dd78c8..8d4dfa4c3 100644 --- a/app/widget/nodetreeview/nodetreeview.cpp +++ b/app/widget/nodetreeview/nodetreeview.cpp @@ -1,6 +1,6 @@ #include "nodetreeview.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeTreeView::NodeTreeView(QWidget *parent) : QTreeWidget(parent), @@ -108,4 +108,4 @@ void NodeTreeView::ItemCheckStateChanged(QTreeWidgetItem *item, int column) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodetreeview/nodetreeview.h b/app/widget/nodetreeview/nodetreeview.h index 65d87bbda..0984bcde4 100644 --- a/app/widget/nodetreeview/nodetreeview.h +++ b/app/widget/nodetreeview/nodetreeview.h @@ -5,7 +5,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeTreeView : public QTreeWidget { @@ -57,6 +57,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODETREEVIEW_H diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index c3a79f83c..8948c98ce 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -30,7 +30,7 @@ #define super HandMovableView -OLIVE_NAMESPACE_ENTER +namespace olive { NodeView::NodeView(QWidget *parent) : HandMovableView(parent), @@ -903,4 +903,4 @@ void NodeView::GraphEdgeRemoved(NodeEdgePtr edge) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeview/nodeview.h b/app/widget/nodeview/nodeview.h index afd6fe297..09c255468 100644 --- a/app/widget/nodeview/nodeview.h +++ b/app/widget/nodeview/nodeview.h @@ -29,7 +29,7 @@ #include "widget/timelinewidget/view/handmovableview.h" #include "widget/nodecopypaste/nodecopypaste.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A widget for viewing and editing node graphs @@ -190,6 +190,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEVIEW_H diff --git a/app/widget/nodeview/nodeviewcommon.h b/app/widget/nodeview/nodeviewcommon.h index be731eee0..648229b28 100644 --- a/app/widget/nodeview/nodeviewcommon.h +++ b/app/widget/nodeview/nodeviewcommon.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeViewCommon { public: @@ -53,6 +53,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEVIEWCOMMON_H diff --git a/app/widget/nodeview/nodeviewedge.cpp b/app/widget/nodeview/nodeviewedge.cpp index e783e3584..c48c2af46 100644 --- a/app/widget/nodeview/nodeviewedge.cpp +++ b/app/widget/nodeview/nodeviewedge.cpp @@ -30,7 +30,7 @@ #include "nodeview.h" #include "nodeviewscene.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeViewEdge::NodeViewEdge(QGraphicsItem *parent) : QGraphicsPathItem(parent), @@ -170,4 +170,4 @@ void NodeViewEdge::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti painter->drawPath(path()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeview/nodeviewedge.h b/app/widget/nodeview/nodeviewedge.h index c29ea8fc4..07f2c3298 100644 --- a/app/widget/nodeview/nodeviewedge.h +++ b/app/widget/nodeview/nodeviewedge.h @@ -27,7 +27,7 @@ #include "node/edge.h" #include "nodeviewcommon.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A graphical representation of a NodeEdge to be used in NodeView @@ -112,6 +112,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEEDGEITEM_H diff --git a/app/widget/nodeview/nodeviewitem.cpp b/app/widget/nodeview/nodeviewitem.cpp index c1f030899..596024897 100644 --- a/app/widget/nodeview/nodeviewitem.cpp +++ b/app/widget/nodeview/nodeviewitem.cpp @@ -36,7 +36,7 @@ #include "ui/icons/icons.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeViewItem::NodeViewItem(QGraphicsItem *parent) : QGraphicsRectItem(parent), @@ -699,4 +699,4 @@ QPointF NodeViewItem::GetInputPoint(int index, const QPointF& source_pos) const } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeview/nodeviewitem.h b/app/widget/nodeview/nodeviewitem.h index e33968785..845f0d652 100644 --- a/app/widget/nodeview/nodeviewitem.h +++ b/app/widget/nodeview/nodeviewitem.h @@ -32,7 +32,7 @@ #include "nodeviewedge.h" #include "nodeviewitemwidgetproxy.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A visual widget representation of a Node object to be used in a NodeView @@ -174,6 +174,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEVIEWITEM_H diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index 45c1b6934..f326c100c 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -25,7 +25,7 @@ #include "nodeviewitem.h" #include "project/item/sequence/sequence.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeViewScene::NodeViewScene(QObject *parent) : QGraphicsScene(parent), @@ -310,4 +310,4 @@ void NodeViewScene::NodeLabelChanged() item_map_.value(static_cast(sender()))->update(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeview/nodeviewscene.h b/app/widget/nodeview/nodeviewscene.h index b5ffa7e93..51064c965 100644 --- a/app/widget/nodeview/nodeviewscene.h +++ b/app/widget/nodeview/nodeviewscene.h @@ -28,7 +28,7 @@ #include "nodeviewedge.h" #include "nodeviewitem.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class NodeViewScene : public QGraphicsScene { @@ -146,6 +146,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEVIEWSCENE_H diff --git a/app/widget/nodeview/nodeviewundo.cpp b/app/widget/nodeview/nodeviewundo.cpp index 1f2bd8c7e..66416c158 100644 --- a/app/widget/nodeview/nodeviewundo.cpp +++ b/app/widget/nodeview/nodeviewundo.cpp @@ -22,7 +22,7 @@ #include "project/item/sequence/sequence.h" -OLIVE_NAMESPACE_ENTER +namespace olive { NodeEdgeAddCommand::NodeEdgeAddCommand(NodeOutput *output, NodeInput *input, QUndoCommand *parent) : UndoCommand(parent), @@ -230,4 +230,4 @@ void NodeCopyInputsCommand::redo() Node::CopyInputs(src_, dest_, include_connections_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/nodeview/nodeviewundo.h b/app/widget/nodeview/nodeviewundo.h index c59cba83e..03f9f4bcd 100644 --- a/app/widget/nodeview/nodeviewundo.h +++ b/app/widget/nodeview/nodeviewundo.h @@ -29,7 +29,7 @@ #include "undo/undocommand.h" #include "widget/timelinewidget/undo/undo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief An undoable command for connecting two NodeParams together @@ -209,6 +209,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // NODEVIEWUNDO_H diff --git a/app/widget/panel/panel.cpp b/app/widget/panel/panel.cpp index f9ac502d5..49aef76cf 100644 --- a/app/widget/panel/panel.cpp +++ b/app/widget/panel/panel.cpp @@ -28,7 +28,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { PanelWidget::PanelWidget(const QString &object_name, QWidget *parent) : QDockWidget(parent), @@ -154,4 +154,4 @@ void PanelWidget::SetWidgetWithPadding(QWidget *widget) setWidget(wrapper); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/panel/panel.h b/app/widget/panel/panel.h index fba6a60cc..939baa2af 100644 --- a/app/widget/panel/panel.h +++ b/app/widget/panel/panel.h @@ -26,7 +26,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A widget that is always dockable within the MainWindow. @@ -236,6 +236,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // PANEL_WIDGET_H diff --git a/app/widget/path/pathwidget.cpp b/app/widget/path/pathwidget.cpp index 255ecb7ad..f0ffeeb57 100644 --- a/app/widget/path/pathwidget.cpp +++ b/app/widget/path/pathwidget.cpp @@ -26,7 +26,7 @@ #include "common/filefunctions.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PathWidget::PathWidget(const QString &path, QWidget *parent) : QWidget(parent) @@ -65,4 +65,4 @@ void PathWidget::LineEditChanged() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/path/pathwidget.h b/app/widget/path/pathwidget.h index f6273e96b..74a0da99f 100644 --- a/app/widget/path/pathwidget.h +++ b/app/widget/path/pathwidget.h @@ -26,7 +26,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PathWidget : public QWidget { @@ -52,6 +52,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PATHWIDGET_H diff --git a/app/widget/pixelsampler/pixelsampler.cpp b/app/widget/pixelsampler/pixelsampler.cpp index c110283a4..cd0ddf92f 100644 --- a/app/widget/pixelsampler/pixelsampler.cpp +++ b/app/widget/pixelsampler/pixelsampler.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { PixelSamplerWidget::PixelSamplerWidget(QWidget *parent) : QGroupBox(parent) @@ -77,4 +77,4 @@ void ManagedPixelSamplerWidget::SetValues(const Color &reference, const Color &d display_view_->SetValues(display); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/pixelsampler/pixelsampler.h b/app/widget/pixelsampler/pixelsampler.h index 19109105d..a2f6ada6f 100644 --- a/app/widget/pixelsampler/pixelsampler.h +++ b/app/widget/pixelsampler/pixelsampler.h @@ -27,7 +27,7 @@ #include "render/color.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PixelSamplerWidget : public QGroupBox { @@ -63,6 +63,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PIXELSAMPLERWIDGET_H diff --git a/app/widget/playbackcontrols/dragbutton.cpp b/app/widget/playbackcontrols/dragbutton.cpp index 345ed3f27..644f1c1bc 100644 --- a/app/widget/playbackcontrols/dragbutton.cpp +++ b/app/widget/playbackcontrols/dragbutton.cpp @@ -20,7 +20,7 @@ #include "dragbutton.h" -OLIVE_NAMESPACE_ENTER +namespace olive { DragButton::DragButton(QWidget *parent) : QPushButton(parent) @@ -33,4 +33,4 @@ void DragButton::mousePressEvent(QMouseEvent *event) { emit MousePressed(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/playbackcontrols/dragbutton.h b/app/widget/playbackcontrols/dragbutton.h index 8e6d9ac19..c0bb2f2a5 100644 --- a/app/widget/playbackcontrols/dragbutton.h +++ b/app/widget/playbackcontrols/dragbutton.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class DragButton : public QPushButton { @@ -41,6 +41,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // DRAGBUTTON_H diff --git a/app/widget/playbackcontrols/playbackcontrols.cpp b/app/widget/playbackcontrols/playbackcontrols.cpp index 7ae497a98..692e20a91 100644 --- a/app/widget/playbackcontrols/playbackcontrols.cpp +++ b/app/widget/playbackcontrols/playbackcontrols.cpp @@ -28,7 +28,7 @@ #include "config/config.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { PlaybackControls::PlaybackControls(QWidget *parent) : QWidget(parent), @@ -229,4 +229,4 @@ void PlaybackControls::TimecodeChanged() SetEndTime(end_time_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/playbackcontrols/playbackcontrols.h b/app/widget/playbackcontrols/playbackcontrols.h index c61b08eba..a77563ac2 100644 --- a/app/widget/playbackcontrols/playbackcontrols.h +++ b/app/widget/playbackcontrols/playbackcontrols.h @@ -30,7 +30,7 @@ #include "dragbutton.h" #include "widget/slider/timeslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A playback controls widget providing buttons for navigating media @@ -134,6 +134,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // PLAYBACKCONTROLS_H diff --git a/app/widget/projectexplorer/projectexplorer.cpp b/app/widget/projectexplorer/projectexplorer.cpp index 6a261895c..a9c38820e 100644 --- a/app/widget/projectexplorer/projectexplorer.cpp +++ b/app/widget/projectexplorer/projectexplorer.cpp @@ -41,7 +41,7 @@ #include "widget/timelinewidget/timelinewidget.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectExplorer::ProjectExplorer(QWidget *parent) : QWidget(parent), @@ -683,4 +683,4 @@ void ProjectExplorer::DeleteSelected() Core::instance()->undo_stack()->pushIfHasChildren(command); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projectexplorer/projectexplorer.h b/app/widget/projectexplorer/projectexplorer.h index 93cbb8814..e935b9084 100644 --- a/app/widget/projectexplorer/projectexplorer.h +++ b/app/widget/projectexplorer/projectexplorer.h @@ -34,7 +34,7 @@ #include "widget/projectexplorer/projectexplorernavigation.h" #include "widget/projecttoolbar/projecttoolbar.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A widget for browsing through a Project structure. @@ -186,6 +186,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTEXPLORER_H diff --git a/app/widget/projectexplorer/projectexplorericonview.cpp b/app/widget/projectexplorer/projectexplorericonview.cpp index ece2a47d5..ac2bd7561 100644 --- a/app/widget/projectexplorer/projectexplorericonview.cpp +++ b/app/widget/projectexplorer/projectexplorericonview.cpp @@ -20,7 +20,7 @@ #include "projectexplorericonview.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectExplorerIconView::ProjectExplorerIconView(QWidget *parent) : ProjectExplorerListViewBase(parent) @@ -30,4 +30,4 @@ ProjectExplorerIconView::ProjectExplorerIconView(QWidget *parent) : setItemDelegate(&delegate_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projectexplorer/projectexplorericonview.h b/app/widget/projectexplorer/projectexplorericonview.h index 9cb67a113..68e7f25e9 100644 --- a/app/widget/projectexplorer/projectexplorericonview.h +++ b/app/widget/projectexplorer/projectexplorericonview.h @@ -24,7 +24,7 @@ #include "projectexplorerlistviewbase.h" #include "projectexplorericonviewitemdelegate.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The view widget used when ProjectExplorer is in Icon View @@ -39,6 +39,6 @@ private: ProjectExplorerIconViewItemDelegate delegate_; }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTEXPLORERICONVIEW_H diff --git a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp index 9073da4e7..3690576bf 100644 --- a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp +++ b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp @@ -24,7 +24,7 @@ #include "common/qtutils.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectExplorerIconViewItemDelegate::ProjectExplorerIconViewItemDelegate(QObject *parent) : QStyledItemDelegate (parent) @@ -99,4 +99,4 @@ void ProjectExplorerIconViewItemDelegate::paint(QPainter *painter, const QStyleO } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.h b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.h index 4e4b930c7..69da53e64 100644 --- a/app/widget/projectexplorer/projectexplorericonviewitemdelegate.h +++ b/app/widget/projectexplorer/projectexplorericonviewitemdelegate.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The delegate that's used to draw items when ProjectExplorer is in Icon view @@ -38,6 +38,6 @@ public: virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTEXPLORERICONVIEWITEMDELEGATE_H diff --git a/app/widget/projectexplorer/projectexplorerlistview.cpp b/app/widget/projectexplorer/projectexplorerlistview.cpp index ac5c7885f..340107c54 100644 --- a/app/widget/projectexplorer/projectexplorerlistview.cpp +++ b/app/widget/projectexplorer/projectexplorerlistview.cpp @@ -20,7 +20,7 @@ #include "projectexplorerlistview.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectExplorerListView::ProjectExplorerListView(QWidget *parent) : ProjectExplorerListViewBase(parent) @@ -30,4 +30,4 @@ ProjectExplorerListView::ProjectExplorerListView(QWidget *parent) : setItemDelegate(&delegate_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projectexplorer/projectexplorerlistview.h b/app/widget/projectexplorer/projectexplorerlistview.h index 6d3695337..5d15941c4 100644 --- a/app/widget/projectexplorer/projectexplorerlistview.h +++ b/app/widget/projectexplorer/projectexplorerlistview.h @@ -24,7 +24,7 @@ #include "projectexplorerlistviewbase.h" #include "projectexplorerlistviewitemdelegate.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The view widget used when ProjectExplorer is in List View @@ -39,6 +39,6 @@ private: ProjectExplorerListViewItemDelegate delegate_; }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTEXPLORERLISTVIEW_H diff --git a/app/widget/projectexplorer/projectexplorerlistviewbase.cpp b/app/widget/projectexplorer/projectexplorerlistviewbase.cpp index b305cb067..79cb6e9db 100644 --- a/app/widget/projectexplorer/projectexplorerlistviewbase.cpp +++ b/app/widget/projectexplorer/projectexplorerlistviewbase.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectExplorerListViewBase::ProjectExplorerListViewBase(QWidget *parent) : QListView(parent) @@ -51,4 +51,4 @@ void ProjectExplorerListViewBase::mouseDoubleClickEvent(QMouseEvent *event) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projectexplorer/projectexplorerlistviewbase.h b/app/widget/projectexplorer/projectexplorerlistviewbase.h index f71c598a2..f3b397b8a 100644 --- a/app/widget/projectexplorer/projectexplorerlistviewbase.h +++ b/app/widget/projectexplorer/projectexplorerlistviewbase.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A QListView derivative that contains functionality used by both List view and Icon view (which are both based @@ -57,6 +57,6 @@ signals: void DoubleClickedEmptyArea(); }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTEXPLORERLISTVIEWBASE_H diff --git a/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.cpp b/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.cpp index 2cb01d9a5..465b3aee9 100644 --- a/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.cpp +++ b/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectExplorerListViewItemDelegate::ProjectExplorerListViewItemDelegate(QObject *parent) : QStyledItemDelegate(parent) @@ -80,4 +80,4 @@ void ProjectExplorerListViewItemDelegate::paint(QPainter *painter, const QStyleO painter->drawText(text_rect, static_cast(Qt::AlignLeft | Qt::AlignVCenter), text); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.h b/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.h index 152f40a4a..780b153b4 100644 --- a/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.h +++ b/app/widget/projectexplorer/projectexplorerlistviewitemdelegate.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The delegate that's used to draw items when ProjectExplorer is in List view @@ -39,6 +39,6 @@ public: virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTEXPLORERLISTVIEWITEMDELEGATE_H diff --git a/app/widget/projectexplorer/projectexplorernavigation.cpp b/app/widget/projectexplorer/projectexplorernavigation.cpp index e595a2a7b..6f23ee6d8 100644 --- a/app/widget/projectexplorer/projectexplorernavigation.cpp +++ b/app/widget/projectexplorer/projectexplorernavigation.cpp @@ -26,7 +26,7 @@ #include "common/define.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectExplorerNavigation::ProjectExplorerNavigation(QWidget *parent) : QWidget(parent) @@ -96,4 +96,4 @@ void ProjectExplorerNavigation::UpdateIcons() size_slider_->setValue(kProjectIconSizeDefault); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projectexplorer/projectexplorernavigation.h b/app/widget/projectexplorer/projectexplorernavigation.h index 412c98d6f..4edb93ac4 100644 --- a/app/widget/projectexplorer/projectexplorernavigation.h +++ b/app/widget/projectexplorer/projectexplorernavigation.h @@ -28,7 +28,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A navigation bar widget for ProjectExplorer's Icon and List views @@ -112,6 +112,6 @@ private: QSlider* size_slider_; }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTEXPLORERLISTVIEWTOOLBAR_H diff --git a/app/widget/projectexplorer/projectexplorertreeview.cpp b/app/widget/projectexplorer/projectexplorertreeview.cpp index 40ed01ad8..0b7a95514 100644 --- a/app/widget/projectexplorer/projectexplorertreeview.cpp +++ b/app/widget/projectexplorer/projectexplorertreeview.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectExplorerTreeView::ProjectExplorerTreeView(QWidget *parent) : QTreeView(parent) @@ -54,4 +54,4 @@ void ProjectExplorerTreeView::mouseDoubleClickEvent(QMouseEvent *event) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projectexplorer/projectexplorertreeview.h b/app/widget/projectexplorer/projectexplorertreeview.h index 74eeb3d5e..0d1c562e7 100644 --- a/app/widget/projectexplorer/projectexplorertreeview.h +++ b/app/widget/projectexplorer/projectexplorertreeview.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The view widget used when ProjectExplorer is in Tree View @@ -59,6 +59,6 @@ signals: void DoubleClickedEmptyArea(); }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTEXPLORERTREEVIEW_H diff --git a/app/widget/projectexplorer/projectexplorerundo.cpp b/app/widget/projectexplorer/projectexplorerundo.cpp index 303029187..3bb2753d7 100644 --- a/app/widget/projectexplorer/projectexplorerundo.cpp +++ b/app/widget/projectexplorer/projectexplorerundo.cpp @@ -20,7 +20,7 @@ #include "projectexplorerundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { OfflineFootageCommand::OfflineFootageCommand(const QList &media, QUndoCommand* parent) : UndoCommand(parent) @@ -51,4 +51,4 @@ void OfflineFootageCommand::undo_internal() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projectexplorer/projectexplorerundo.h b/app/widget/projectexplorer/projectexplorerundo.h index 4203fbe26..fbab93992 100644 --- a/app/widget/projectexplorer/projectexplorerundo.h +++ b/app/widget/projectexplorer/projectexplorerundo.h @@ -24,7 +24,7 @@ #include "node/input/media/media.h" #include "undo/undocommand.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief An undo command for offlining footage when it is deleted from the project explorer @@ -47,6 +47,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTEXPLORERUNDO_H diff --git a/app/widget/projecttoolbar/projecttoolbar.cpp b/app/widget/projecttoolbar/projecttoolbar.cpp index d53a2ed51..a7049d207 100644 --- a/app/widget/projecttoolbar/projecttoolbar.cpp +++ b/app/widget/projecttoolbar/projecttoolbar.cpp @@ -26,7 +26,7 @@ #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ProjectToolbar::ProjectToolbar(QWidget *parent) : QWidget(parent) @@ -153,4 +153,4 @@ void ProjectToolbar::ViewButtonClicked() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/projecttoolbar/projecttoolbar.h b/app/widget/projecttoolbar/projecttoolbar.h index cc084e0aa..35abec4de 100644 --- a/app/widget/projecttoolbar/projecttoolbar.h +++ b/app/widget/projecttoolbar/projecttoolbar.h @@ -27,7 +27,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The ProjectToolbar class @@ -87,6 +87,6 @@ private slots: void ViewButtonClicked(); }; -OLIVE_NAMESPACE_EXIT +} #endif // PROJECTTOOLBAR_H diff --git a/app/widget/resizablescrollbar/resizablescrollbar.cpp b/app/widget/resizablescrollbar/resizablescrollbar.cpp index ffee074a2..d7cbfb8e8 100644 --- a/app/widget/resizablescrollbar/resizablescrollbar.cpp +++ b/app/widget/resizablescrollbar/resizablescrollbar.cpp @@ -27,7 +27,7 @@ #include "common/range.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const int ResizableScrollBar::kHandleWidth = 10; @@ -159,4 +159,4 @@ int ResizableScrollBar::GetActiveMousePos(QMouseEvent *event) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/resizablescrollbar/resizablescrollbar.h b/app/widget/resizablescrollbar/resizablescrollbar.h index cba125d95..1e0d21f13 100644 --- a/app/widget/resizablescrollbar/resizablescrollbar.h +++ b/app/widget/resizablescrollbar/resizablescrollbar.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ResizableScrollBar : public QScrollBar { @@ -65,6 +65,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // RESIZABLESCROLLBAR_H diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index 1f032a3de..54211a066 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -27,7 +27,7 @@ #include "common/qtutils.h" #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { HistogramScope::HistogramScope(QWidget* parent) : ScopeBase(parent) @@ -146,4 +146,4 @@ void HistogramScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) p.drawLines(histogram_lines); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/scope/histogram/histogram.h b/app/widget/scope/histogram/histogram.h index eefaefc18..756a40d54 100644 --- a/app/widget/scope/histogram/histogram.h +++ b/app/widget/scope/histogram/histogram.h @@ -23,7 +23,7 @@ #include "widget/scope/scopebase/scopebase.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class HistogramScope : public ScopeBase { @@ -50,6 +50,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // HISTOGRAMSCOPE_H diff --git a/app/widget/scope/scopebase/scopebase.cpp b/app/widget/scope/scopebase/scopebase.cpp index fc1a227b9..3f9c4cd68 100644 --- a/app/widget/scope/scopebase/scopebase.cpp +++ b/app/widget/scope/scopebase/scopebase.cpp @@ -22,7 +22,7 @@ #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ScopeBase::ScopeBase(QWidget* parent) : ManagedDisplayWidget(parent), @@ -121,4 +121,4 @@ void ScopeBase::OnDestroy() pipeline_.clear(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/scope/scopebase/scopebase.h b/app/widget/scope/scopebase/scopebase.h index 2433f6a2f..4e7d852f9 100644 --- a/app/widget/scope/scopebase/scopebase.h +++ b/app/widget/scope/scopebase/scopebase.h @@ -25,7 +25,7 @@ #include "render/colorprocessor.h" #include "widget/manageddisplay/manageddisplay.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ScopeBase : public ManagedDisplayWidget { @@ -69,6 +69,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // SCOPEBASE_H diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index ce0751f66..c92a7158a 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -31,7 +31,7 @@ #include "config/config.h" #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { WaveformScope::WaveformScope(QWidget* parent) : ScopeBase(parent) @@ -122,4 +122,4 @@ void WaveformScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) p.drawLines(ire_lines); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/scope/waveform/waveform.h b/app/widget/scope/waveform/waveform.h index 6656d3df1..743d3de5c 100644 --- a/app/widget/scope/waveform/waveform.h +++ b/app/widget/scope/waveform/waveform.h @@ -23,7 +23,7 @@ #include "widget/scope/scopebase/scopebase.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class WaveformScope : public ScopeBase { @@ -40,6 +40,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // WAVEFORMSCOPE_H diff --git a/app/widget/slider/floatslider.cpp b/app/widget/slider/floatslider.cpp index 58a741b23..4c30e7d0b 100644 --- a/app/widget/slider/floatslider.cpp +++ b/app/widget/slider/floatslider.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { FloatSlider::FloatSlider(QWidget *parent) : SliderBase(kFloat, parent), @@ -184,4 +184,4 @@ void FloatSlider::ConvertValue(QVariant v) emit ValueChanged(v.toDouble()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/slider/floatslider.h b/app/widget/slider/floatslider.h index 246ab6982..51b806fce 100644 --- a/app/widget/slider/floatslider.h +++ b/app/widget/slider/floatslider.h @@ -23,7 +23,7 @@ #include "sliderbase.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FloatSlider : public SliderBase { @@ -73,6 +73,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // FLOATSLIDER_H diff --git a/app/widget/slider/integerslider.cpp b/app/widget/slider/integerslider.cpp index 08404e108..2c2973cd1 100644 --- a/app/widget/slider/integerslider.cpp +++ b/app/widget/slider/integerslider.cpp @@ -20,7 +20,7 @@ #include "integerslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { IntegerSlider::IntegerSlider(QWidget* parent) : SliderBase(kInteger, parent) @@ -72,4 +72,4 @@ void IntegerSlider::ConvertValue(QVariant v) emit ValueChanged(v.toInt()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/slider/integerslider.h b/app/widget/slider/integerslider.h index 9a6db1860..bb4236366 100644 --- a/app/widget/slider/integerslider.h +++ b/app/widget/slider/integerslider.h @@ -23,7 +23,7 @@ #include "sliderbase.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class IntegerSlider : public SliderBase { @@ -49,6 +49,6 @@ private slots: void ConvertValue(QVariant v); }; -OLIVE_NAMESPACE_EXIT +} #endif // INTEGERSLIDER_H diff --git a/app/widget/slider/sliderbase.cpp b/app/widget/slider/sliderbase.cpp index 66c12a1ac..b3e6ce6ee 100644 --- a/app/widget/slider/sliderbase.cpp +++ b/app/widget/slider/sliderbase.cpp @@ -28,7 +28,7 @@ #include "core.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SliderBase::SliderBase(Mode mode, QWidget *parent) : QStackedWidget(parent), @@ -395,4 +395,4 @@ void SliderBase::ResetValue() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/slider/sliderbase.h b/app/widget/slider/sliderbase.h index 7788ddd2c..31c6d31c4 100644 --- a/app/widget/slider/sliderbase.h +++ b/app/widget/slider/sliderbase.h @@ -27,7 +27,7 @@ #include "sliderladder.h" #include "widget/focusablelineedit/focusablelineedit.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SliderBase : public QStackedWidget { Q_OBJECT @@ -141,6 +141,6 @@ private slots: void ResetValue(); }; -OLIVE_NAMESPACE_EXIT +} #endif // SLIDERBASE_H diff --git a/app/widget/slider/sliderlabel.cpp b/app/widget/slider/sliderlabel.cpp index 1e25177dd..11048658f 100644 --- a/app/widget/slider/sliderlabel.cpp +++ b/app/widget/slider/sliderlabel.cpp @@ -24,7 +24,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { SliderLabel::SliderLabel(QWidget *parent) : QLabel(parent) @@ -69,4 +69,4 @@ void SliderLabel::focusInEvent(QFocusEvent *event) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/slider/sliderlabel.h b/app/widget/slider/sliderlabel.h index 749fba621..2f698eb2c 100644 --- a/app/widget/slider/sliderlabel.h +++ b/app/widget/slider/sliderlabel.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SliderLabel : public QLabel { @@ -47,6 +47,6 @@ signals: }; -OLIVE_NAMESPACE_EXIT +} #endif // SLIDERLABEL_H diff --git a/app/widget/slider/sliderladder.cpp b/app/widget/slider/sliderladder.cpp index 4646c4d70..3412f7d5f 100644 --- a/app/widget/slider/sliderladder.cpp +++ b/app/widget/slider/sliderladder.cpp @@ -33,7 +33,7 @@ #include "common/clamp.h" #include "common/lerp.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SliderLadder::SliderLadder(double drag_multiplier, int nb_outer_values, QWidget* parent) : QFrame(parent, Qt::Popup), @@ -241,4 +241,4 @@ void SliderLadderElement::UpdateLabel() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/slider/sliderladder.h b/app/widget/slider/sliderladder.h index 6bad59941..aac5c1bd3 100644 --- a/app/widget/slider/sliderladder.h +++ b/app/widget/slider/sliderladder.h @@ -27,7 +27,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SliderLadderElement : public QWidget { @@ -98,6 +98,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // SLIDERLADDER_H diff --git a/app/widget/slider/stringslider.cpp b/app/widget/slider/stringslider.cpp index 68b12609c..33db4d8f5 100644 --- a/app/widget/slider/stringslider.cpp +++ b/app/widget/slider/stringslider.cpp @@ -20,7 +20,7 @@ #include "stringslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { StringSlider::StringSlider(QWidget* parent) : SliderBase(kString, parent) @@ -49,4 +49,4 @@ void StringSlider::ConvertValue(QVariant v) emit ValueChanged(v.toString()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/slider/stringslider.h b/app/widget/slider/stringslider.h index 939191ec4..232df2480 100644 --- a/app/widget/slider/stringslider.h +++ b/app/widget/slider/stringslider.h @@ -23,7 +23,7 @@ #include "sliderbase.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class StringSlider : public SliderBase { @@ -47,6 +47,6 @@ private slots: void ConvertValue(QVariant v); }; -OLIVE_NAMESPACE_EXIT +} #endif // STRINGSLIDER_H diff --git a/app/widget/slider/timeslider.cpp b/app/widget/slider/timeslider.cpp index 911b59dcf..146d5750a 100644 --- a/app/widget/slider/timeslider.cpp +++ b/app/widget/slider/timeslider.cpp @@ -23,7 +23,7 @@ #include "common/timecodefunctions.h" #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimeSlider::TimeSlider(QWidget *parent) : IntegerSlider(parent) @@ -63,4 +63,4 @@ void TimeSlider::TimecodeDisplayChanged() UpdateLabel(Value()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/slider/timeslider.h b/app/widget/slider/timeslider.h index 8083b7f1c..a8e6d977c 100644 --- a/app/widget/slider/timeslider.h +++ b/app/widget/slider/timeslider.h @@ -24,7 +24,7 @@ #include "common/rational.h" #include "integerslider.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimeSlider : public IntegerSlider { @@ -47,6 +47,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMESLIDER_H diff --git a/app/widget/standardcombos/channellayoutcombobox.h b/app/widget/standardcombos/channellayoutcombobox.h index 8cd2e1ac6..0ff814ed8 100644 --- a/app/widget/standardcombos/channellayoutcombobox.h +++ b/app/widget/standardcombos/channellayoutcombobox.h @@ -25,7 +25,7 @@ #include "render/audioparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ChannelLayoutComboBox : public QComboBox { @@ -57,6 +57,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // CHANNELLAYOUTCOMBOBOX_H diff --git a/app/widget/standardcombos/frameratecombobox.h b/app/widget/standardcombos/frameratecombobox.h index 21b39dfba..d4482d7c1 100644 --- a/app/widget/standardcombos/frameratecombobox.h +++ b/app/widget/standardcombos/frameratecombobox.h @@ -26,7 +26,7 @@ #include "common/rational.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FrameRateComboBox : public QComboBox { @@ -57,6 +57,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // FRAMERATECOMBOBOX_H diff --git a/app/widget/standardcombos/interlacedcombobox.h b/app/widget/standardcombos/interlacedcombobox.h index d745e4da5..9c8599562 100644 --- a/app/widget/standardcombos/interlacedcombobox.h +++ b/app/widget/standardcombos/interlacedcombobox.h @@ -25,7 +25,7 @@ #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class InterlacedComboBox : public QComboBox { @@ -52,6 +52,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // INTERLACEDCOMBOBOX_H diff --git a/app/widget/standardcombos/pixelaspectratiocombobox.h b/app/widget/standardcombos/pixelaspectratiocombobox.h index b433dd9d6..a78aae0b3 100644 --- a/app/widget/standardcombos/pixelaspectratiocombobox.h +++ b/app/widget/standardcombos/pixelaspectratiocombobox.h @@ -26,7 +26,7 @@ #include "common/ratiodialog.h" #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PixelAspectRatioComboBox : public QComboBox { @@ -122,6 +122,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // PIXELASPECTRATIOCOMBOBOX_H diff --git a/app/widget/standardcombos/pixelformatcombobox.h b/app/widget/standardcombos/pixelformatcombobox.h index a6a399c38..3614a7f35 100644 --- a/app/widget/standardcombos/pixelformatcombobox.h +++ b/app/widget/standardcombos/pixelformatcombobox.h @@ -25,7 +25,7 @@ #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class PixelFormatComboBox : public QComboBox { @@ -61,6 +61,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // PIXELFORMATCOMBOBOX_H diff --git a/app/widget/standardcombos/sampleratecombobox.h b/app/widget/standardcombos/sampleratecombobox.h index c3a9bd2cc..f1689126f 100644 --- a/app/widget/standardcombos/sampleratecombobox.h +++ b/app/widget/standardcombos/sampleratecombobox.h @@ -25,7 +25,7 @@ #include "render/audioparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SampleRateComboBox : public QComboBox { @@ -56,6 +56,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // SAMPLERATECOMBOBOX_H diff --git a/app/widget/standardcombos/videodividercombobox.h b/app/widget/standardcombos/videodividercombobox.h index 359e467ae..e7924cbb2 100644 --- a/app/widget/standardcombos/videodividercombobox.h +++ b/app/widget/standardcombos/videodividercombobox.h @@ -25,7 +25,7 @@ #include "render/videoparams.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class VideoDividerComboBox : public QComboBox { @@ -64,6 +64,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIDEODIVIDERCOMBOBOX_H diff --git a/app/widget/taskview/elapsedcounterwidget.cpp b/app/widget/taskview/elapsedcounterwidget.cpp index 6b82f2945..d8cc976d0 100644 --- a/app/widget/taskview/elapsedcounterwidget.cpp +++ b/app/widget/taskview/elapsedcounterwidget.cpp @@ -25,7 +25,7 @@ #include "common/timecodefunctions.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ElapsedCounterWidget::ElapsedCounterWidget(QWidget* parent) : QWidget(parent), @@ -85,4 +85,4 @@ void ElapsedCounterWidget::UpdateTimers() remaining_lbl_->setText(tr("Remaining: %1").arg(Timecode::TimeToString(remaining_ms))); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/taskview/elapsedcounterwidget.h b/app/widget/taskview/elapsedcounterwidget.h index e11ded5e1..902b11fd4 100644 --- a/app/widget/taskview/elapsedcounterwidget.h +++ b/app/widget/taskview/elapsedcounterwidget.h @@ -27,7 +27,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ElapsedCounterWidget : public QWidget { @@ -56,6 +56,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // ELAPSEDCOUNTERWIDGET_H diff --git a/app/widget/taskview/taskview.cpp b/app/widget/taskview/taskview.cpp index 5803cf05f..ef1c83c8c 100644 --- a/app/widget/taskview/taskview.cpp +++ b/app/widget/taskview/taskview.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { TaskView::TaskView(QWidget* parent) : QScrollArea(parent) @@ -63,4 +63,4 @@ void TaskView::RemoveTask(Task *t) items_.remove(t); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/taskview/taskview.h b/app/widget/taskview/taskview.h index a0c214c96..17dd23d66 100644 --- a/app/widget/taskview/taskview.h +++ b/app/widget/taskview/taskview.h @@ -26,7 +26,7 @@ #include "widget/taskview/taskviewitem.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A widget that shows a list of Tasks @@ -66,6 +66,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TASKVIEW_H diff --git a/app/widget/taskview/taskviewitem.cpp b/app/widget/taskview/taskviewitem.cpp index 3d28ec077..0a3d15c56 100644 --- a/app/widget/taskview/taskviewitem.cpp +++ b/app/widget/taskview/taskviewitem.cpp @@ -26,7 +26,7 @@ #include "common/timecodefunctions.h" #include "ui/icons/icons.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TaskViewItem::TaskViewItem(Task* task, QWidget *parent) : QFrame(parent), @@ -92,4 +92,4 @@ void TaskViewItem::UpdateProgress(double d) elapsed_timer_lbl_->SetProgress(d); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/taskview/taskviewitem.h b/app/widget/taskview/taskviewitem.h index 49378aff7..75cf766f0 100644 --- a/app/widget/taskview/taskviewitem.h +++ b/app/widget/taskview/taskviewitem.h @@ -30,7 +30,7 @@ #include "elapsedcounterwidget.h" #include "task/task.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A widget that visually represents the status of a Task @@ -68,6 +68,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TASKVIEWITEM_H diff --git a/app/widget/timebased/timebased.cpp b/app/widget/timebased/timebased.cpp index 6c39865e4..ea894768e 100644 --- a/app/widget/timebased/timebased.cpp +++ b/app/widget/timebased/timebased.cpp @@ -29,7 +29,7 @@ #include "project/item/sequence/sequence.h" #include "widget/timelinewidget/undo/undo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimeBasedWidget::TimeBasedWidget(bool ruler_text_visible, bool ruler_cache_status_visible, QWidget *parent) : TimelineScaledWidget(parent), @@ -541,4 +541,4 @@ void TimeBasedWidget::MarkerAddCommand::undo_internal() marker_list_->RemoveMarker(added_marker_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timebased/timebased.h b/app/widget/timebased/timebased.h index 24bf5c851..6fdfad8e0 100644 --- a/app/widget/timebased/timebased.h +++ b/app/widget/timebased/timebased.h @@ -30,7 +30,7 @@ #include "widget/timelinewidget/view/timelineview.h" #include "widget/timeruler/timeruler.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimeBasedWidget : public TimelineScaledWidget { @@ -206,6 +206,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMEBASEDWIDGET_H diff --git a/app/widget/timelinewidget/snapservice.h b/app/widget/timelinewidget/snapservice.h index ad7b09834..c9c6a601c 100644 --- a/app/widget/timelinewidget/snapservice.h +++ b/app/widget/timelinewidget/snapservice.h @@ -3,7 +3,7 @@ #include "common/rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SnapService { @@ -26,6 +26,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // SNAPSERVICE_H diff --git a/app/widget/timelinewidget/timelineandtrackview.cpp b/app/widget/timelinewidget/timelineandtrackview.cpp index bf5291fe2..233a00c79 100644 --- a/app/widget/timelinewidget/timelineandtrackview.cpp +++ b/app/widget/timelinewidget/timelineandtrackview.cpp @@ -23,7 +23,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineAndTrackView::TimelineAndTrackView(Qt::Alignment vertical_alignment, QWidget *parent) : QWidget(parent) @@ -73,4 +73,4 @@ void TimelineAndTrackView::TracksValueChanged(int v) view_->verticalScrollBar()->setValue(view_->verticalScrollBar()->minimum() + v); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/timelineandtrackview.h b/app/widget/timelinewidget/timelineandtrackview.h index 7f8952d7f..cc4331556 100644 --- a/app/widget/timelinewidget/timelineandtrackview.h +++ b/app/widget/timelinewidget/timelineandtrackview.h @@ -27,7 +27,7 @@ #include "view/timelineview.h" #include "trackview/trackview.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelineAndTrackView : public QWidget { @@ -55,6 +55,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEANDTRACKVIEW_H diff --git a/app/widget/timelinewidget/timelinescaledobject.cpp b/app/widget/timelinewidget/timelinescaledobject.cpp index daa5b84b6..28453c391 100644 --- a/app/widget/timelinewidget/timelinescaledobject.cpp +++ b/app/widget/timelinewidget/timelinescaledobject.cpp @@ -25,7 +25,7 @@ #include "common/clamp.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const int TimelineScaledObject::kCalculateDimensionsPadding = 10; @@ -134,4 +134,4 @@ TimelineScaledWidget::TimelineScaledWidget(QWidget *parent) : { } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/timelinescaledobject.h b/app/widget/timelinewidget/timelinescaledobject.h index 2f061b692..8e96ec122 100644 --- a/app/widget/timelinewidget/timelinescaledobject.h +++ b/app/widget/timelinewidget/timelinescaledobject.h @@ -25,7 +25,7 @@ #include "common/rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelineScaledObject { @@ -82,6 +82,6 @@ public: TimelineScaledWidget(QWidget* parent = nullptr); }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINESCALEDOBJECT_H diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index f836dc8fa..a574f7a0c 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -47,7 +47,7 @@ #include "widget/menu/menushared.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineWidget::TimelineWidget(QWidget *parent) : TimeBasedWidget(true, true, parent), @@ -84,20 +84,20 @@ TimelineWidget::TimelineWidget(QWidget *parent) : views_.append(new TimelineAndTrackView(Qt::AlignTop)); // Create tools - tools_.resize(OLIVE_NAMESPACE::Tool::kCount); + tools_.resize(olive::Tool::kCount); tools_.fill(nullptr); - tools_.replace(OLIVE_NAMESPACE::Tool::kPointer, new PointerTool(this)); - tools_.replace(OLIVE_NAMESPACE::Tool::kEdit, new EditTool(this)); - tools_.replace(OLIVE_NAMESPACE::Tool::kRipple, new RippleTool(this)); - tools_.replace(OLIVE_NAMESPACE::Tool::kRolling, new RollingTool(this)); - tools_.replace(OLIVE_NAMESPACE::Tool::kRazor, new RazorTool(this)); - tools_.replace(OLIVE_NAMESPACE::Tool::kSlip, new SlipTool(this)); - tools_.replace(OLIVE_NAMESPACE::Tool::kSlide, new SlideTool(this)); - tools_.replace(OLIVE_NAMESPACE::Tool::kZoom, new ZoomTool(this)); - tools_.replace(OLIVE_NAMESPACE::Tool::kTransition, new TransitionTool(this)); - //tools_.replace(OLIVE_NAMESPACE::Tool::kRecord, new PointerTool(this)); FIXME: Implement - tools_.replace(OLIVE_NAMESPACE::Tool::kAdd, new AddTool(this)); + tools_.replace(olive::Tool::kPointer, new PointerTool(this)); + tools_.replace(olive::Tool::kEdit, new EditTool(this)); + tools_.replace(olive::Tool::kRipple, new RippleTool(this)); + tools_.replace(olive::Tool::kRolling, new RollingTool(this)); + tools_.replace(olive::Tool::kRazor, new RazorTool(this)); + tools_.replace(olive::Tool::kSlip, new SlipTool(this)); + tools_.replace(olive::Tool::kSlide, new SlideTool(this)); + tools_.replace(olive::Tool::kZoom, new ZoomTool(this)); + tools_.replace(olive::Tool::kTransition, new TransitionTool(this)); + //tools_.replace(olive::Tool::kRecord, new PointerTool(this)); FIXME: Implement + tools_.replace(olive::Tool::kAdd, new AddTool(this)); import_tool_ = new ImportTool(this); @@ -1655,4 +1655,4 @@ bool TimelineWidget::SnapPoint(QList start_times, rational* movement, return true; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index 54beb5db8..3eb0d94d4 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -38,7 +38,7 @@ #include "widget/timelinewidget/tool/import.h" #include "widget/timelinewidget/tool/tool.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Full widget for working with TimelineOutput nodes @@ -321,6 +321,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEWIDGET_H diff --git a/app/widget/timelinewidget/timelinewidgetselections.cpp b/app/widget/timelinewidget/timelinewidgetselections.cpp index 570713f51..5c082fe52 100644 --- a/app/widget/timelinewidget/timelinewidgetselections.cpp +++ b/app/widget/timelinewidget/timelinewidgetselections.cpp @@ -20,7 +20,7 @@ #include "timelinewidgetselections.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void TimelineWidgetSelections::ShiftTime(const rational &diff) { @@ -68,4 +68,4 @@ void TimelineWidgetSelections::TrimOut(const rational &diff) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/timelinewidgetselections.h b/app/widget/timelinewidget/timelinewidgetselections.h index 3d92122fc..ce866ba1f 100644 --- a/app/widget/timelinewidget/timelinewidgetselections.h +++ b/app/widget/timelinewidget/timelinewidgetselections.h @@ -26,7 +26,7 @@ #include "common/timerange.h" #include "timeline/trackreference.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelineWidgetSelections : public QHash { @@ -43,6 +43,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEWIDGETSELECTIONS_H diff --git a/app/widget/timelinewidget/tool/add.cpp b/app/widget/timelinewidget/tool/add.cpp index 360cde603..738e2af19 100644 --- a/app/widget/timelinewidget/tool/add.cpp +++ b/app/widget/timelinewidget/tool/add.cpp @@ -27,7 +27,7 @@ #include "node/generator/text/text.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { AddTool::AddTool(TimelineWidget *parent) : BeamTool(parent), @@ -48,18 +48,18 @@ void AddTool::MousePress(TimelineViewMouseEvent *event) Timeline::TrackType add_type = Timeline::kTrackTypeNone; switch (Core::instance()->GetSelectedAddableObject()) { - case OLIVE_NAMESPACE::Tool::kAddableBars: - case OLIVE_NAMESPACE::Tool::kAddableSolid: - case OLIVE_NAMESPACE::Tool::kAddableTitle: + case olive::Tool::kAddableBars: + case olive::Tool::kAddableSolid: + case olive::Tool::kAddableTitle: add_type = Timeline::kTrackTypeVideo; break; - case OLIVE_NAMESPACE::Tool::kAddableTone: + case olive::Tool::kAddableTone: add_type = Timeline::kTrackTypeAudio; break; - case OLIVE_NAMESPACE::Tool::kAddableEmpty: + case olive::Tool::kAddableEmpty: // Leave as "none", which means this block can be placed on any track break; - case OLIVE_NAMESPACE::Tool::kAddableCount: + case olive::Tool::kAddableCount: // Return so we do nothing return; } @@ -97,7 +97,7 @@ void AddTool::MouseRelease(TimelineViewMouseEvent *event) ClipBlock* clip = new ClipBlock(); clip->set_length_and_media_out(ghost_->GetAdjustedLength()); - clip->SetLabel(OLIVE_NAMESPACE::Tool::GetAddableObjectName(Core::instance()->GetSelectedAddableObject())); + clip->SetLabel(olive::Tool::GetAddableObjectName(Core::instance()->GetSelectedAddableObject())); NodeGraph* graph = static_cast(parent()->GetConnectedNode()->parent()); @@ -112,10 +112,10 @@ void AddTool::MouseRelease(TimelineViewMouseEvent *event) command); switch (Core::instance()->GetSelectedAddableObject()) { - case OLIVE_NAMESPACE::Tool::kAddableEmpty: + case olive::Tool::kAddableEmpty: // Empty, nothing to be done break; - case OLIVE_NAMESPACE::Tool::kAddableSolid: + case olive::Tool::kAddableSolid: { Node* solid = new SolidGenerator(); @@ -126,7 +126,7 @@ void AddTool::MouseRelease(TimelineViewMouseEvent *event) new NodeEdgeAddCommand(solid->output(), clip->texture_input(), command); break; } - case OLIVE_NAMESPACE::Tool::kAddableTitle: + case olive::Tool::kAddableTitle: { Node* text = new TextGenerator(); @@ -137,12 +137,12 @@ void AddTool::MouseRelease(TimelineViewMouseEvent *event) new NodeEdgeAddCommand(text->output(), clip->texture_input(), command); break; } - case OLIVE_NAMESPACE::Tool::kAddableBars: - case OLIVE_NAMESPACE::Tool::kAddableTone: + case olive::Tool::kAddableBars: + case olive::Tool::kAddableTone: // Not implemented yet qWarning() << "Unimplemented add object:" << Core::instance()->GetSelectedAddableObject(); break; - case OLIVE_NAMESPACE::Tool::kAddableCount: + case olive::Tool::kAddableCount: // Invalid value, do nothing break; } @@ -190,4 +190,4 @@ void AddTool::MouseMoveInternal(const rational &cursor_frame, bool outwards) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/add.h b/app/widget/timelinewidget/tool/add.h index 83f83d03f..9e655756e 100644 --- a/app/widget/timelinewidget/tool/add.h +++ b/app/widget/timelinewidget/tool/add.h @@ -23,7 +23,7 @@ #include "beam.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AddTool : public BeamTool { @@ -42,6 +42,6 @@ protected: rational drag_start_point_; }; -OLIVE_NAMESPACE_EXIT +} #endif // ADDTIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/beam.cpp b/app/widget/timelinewidget/tool/beam.cpp index 2350eadf0..ec57b4122 100644 --- a/app/widget/timelinewidget/tool/beam.cpp +++ b/app/widget/timelinewidget/tool/beam.cpp @@ -21,7 +21,7 @@ #include "beam.h" #include "widget/timelinewidget/timelinewidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { BeamTool::BeamTool(TimelineWidget *parent) : TimelineTool(parent) @@ -46,4 +46,4 @@ TimelineCoordinate BeamTool::ValidatedCoordinate(TimelineCoordinate coord) return coord; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/beam.h b/app/widget/timelinewidget/tool/beam.h index 651d82e98..dc4f89f9d 100644 --- a/app/widget/timelinewidget/tool/beam.h +++ b/app/widget/timelinewidget/tool/beam.h @@ -23,7 +23,7 @@ #include "tool.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class BeamTool : public TimelineTool { @@ -37,6 +37,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // BEAMTIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/edit.cpp b/app/widget/timelinewidget/tool/edit.cpp index dc1b381d8..231997e5e 100644 --- a/app/widget/timelinewidget/tool/edit.cpp +++ b/app/widget/timelinewidget/tool/edit.cpp @@ -21,7 +21,7 @@ #include "edit.h" #include "widget/timelinewidget/timelinewidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { EditTool::EditTool(TimelineWidget* parent) : BeamTool(parent) @@ -85,4 +85,4 @@ void EditTool::MouseDoubleClick(TimelineViewMouseEvent *event) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/edit.h b/app/widget/timelinewidget/tool/edit.h index c83312dc0..5a2f61519 100644 --- a/app/widget/timelinewidget/tool/edit.h +++ b/app/widget/timelinewidget/tool/edit.h @@ -25,7 +25,7 @@ #include "tool.h" #include "widget/timelinewidget/timelinewidgetselections.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class EditTool : public BeamTool { @@ -44,6 +44,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // EDITTIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/import.cpp b/app/widget/timelinewidget/tool/import.cpp index 4d2a50cb7..80d610bad 100644 --- a/app/widget/timelinewidget/tool/import.cpp +++ b/app/widget/timelinewidget/tool/import.cpp @@ -38,7 +38,7 @@ #include "widget/nodeview/nodeviewundo.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Timeline::TrackType TrackTypeFromStreamType(Stream::Type stream_type) { @@ -498,4 +498,4 @@ QList ImportTool::FootageToDraggedFootage(QList split_tracks_; }; -OLIVE_NAMESPACE_EXIT +} #endif // RAZORTIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/ripple.cpp b/app/widget/timelinewidget/tool/ripple.cpp index ad269353f..06e094451 100644 --- a/app/widget/timelinewidget/tool/ripple.cpp +++ b/app/widget/timelinewidget/tool/ripple.cpp @@ -24,7 +24,7 @@ #include "ripple.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RippleTool::RippleTool(TimelineWidget* parent) : PointerTool(parent) @@ -147,4 +147,4 @@ void RippleTool::FinishDrag(TimelineViewMouseEvent *event) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/ripple.h b/app/widget/timelinewidget/tool/ripple.h index 0067e4cc4..c51436dae 100644 --- a/app/widget/timelinewidget/tool/ripple.h +++ b/app/widget/timelinewidget/tool/ripple.h @@ -23,7 +23,7 @@ #include "pointer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RippleTool : public PointerTool { @@ -36,6 +36,6 @@ protected: Timeline::MovementMode trim_mode) override; }; -OLIVE_NAMESPACE_EXIT +} #endif // RIPPLETIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/rolling.cpp b/app/widget/timelinewidget/tool/rolling.cpp index d89f7670d..4baa8a8fc 100644 --- a/app/widget/timelinewidget/tool/rolling.cpp +++ b/app/widget/timelinewidget/tool/rolling.cpp @@ -24,7 +24,7 @@ #include "rolling.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { RollingTool::RollingTool(TimelineWidget* parent) : PointerTool(parent) @@ -39,4 +39,4 @@ void RollingTool::InitiateDrag(TimelineViewBlockItem *clicked_item, InitiateDragInternal(clicked_item, trim_mode, false, true, false); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/rolling.h b/app/widget/timelinewidget/tool/rolling.h index 812536f65..3e8bb9940 100644 --- a/app/widget/timelinewidget/tool/rolling.h +++ b/app/widget/timelinewidget/tool/rolling.h @@ -23,7 +23,7 @@ #include "pointer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class RollingTool : public PointerTool { @@ -35,6 +35,6 @@ protected: Timeline::MovementMode trim_mode) override; }; -OLIVE_NAMESPACE_EXIT +} #endif // ROLLINGTIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/slide.cpp b/app/widget/timelinewidget/tool/slide.cpp index 926ec71ab..e5e9b3b04 100644 --- a/app/widget/timelinewidget/tool/slide.cpp +++ b/app/widget/timelinewidget/tool/slide.cpp @@ -24,7 +24,7 @@ #include "slide.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SlideTool::SlideTool(TimelineWidget* parent) : PointerTool(parent) @@ -40,4 +40,4 @@ void SlideTool::InitiateDrag(TimelineViewBlockItem *clicked_item, InitiateDragInternal(clicked_item, trim_mode, false, true, true); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/slide.h b/app/widget/timelinewidget/tool/slide.h index 95a04d066..904e0f8ca 100644 --- a/app/widget/timelinewidget/tool/slide.h +++ b/app/widget/timelinewidget/tool/slide.h @@ -23,7 +23,7 @@ #include "pointer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SlideTool : public PointerTool { @@ -36,6 +36,6 @@ protected: }; -OLIVE_NAMESPACE_EXIT +} #endif // SLIDETIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/slip.cpp b/app/widget/timelinewidget/tool/slip.cpp index daa93cf7b..edf788138 100644 --- a/app/widget/timelinewidget/tool/slip.cpp +++ b/app/widget/timelinewidget/tool/slip.cpp @@ -26,7 +26,7 @@ #include "config/config.h" #include "slip.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SlipTool::SlipTool(TimelineWidget *parent) : PointerTool(parent) @@ -79,4 +79,4 @@ void SlipTool::FinishDrag(TimelineViewMouseEvent *event) Core::instance()->undo_stack()->pushIfHasChildren(command); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/slip.h b/app/widget/timelinewidget/tool/slip.h index 2d80df367..8de6bfb69 100644 --- a/app/widget/timelinewidget/tool/slip.h +++ b/app/widget/timelinewidget/tool/slip.h @@ -23,7 +23,7 @@ #include "pointer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SlipTool : public PointerTool { @@ -35,6 +35,6 @@ protected: virtual void FinishDrag(TimelineViewMouseEvent *event) override; }; -OLIVE_NAMESPACE_EXIT +} #endif // SLIPTIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/tool.cpp b/app/widget/timelinewidget/tool/tool.cpp index dcba3a1ab..633bd5c5b 100644 --- a/app/widget/timelinewidget/tool/tool.cpp +++ b/app/widget/timelinewidget/tool/tool.cpp @@ -23,7 +23,7 @@ #include "node/block/transition/transition.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineTool::TimelineTool(TimelineWidget *parent) : dragging_(false), @@ -119,4 +119,4 @@ void TimelineTool::InsertGapsAtGhostDestination(QUndoCommand *command) parent()->InsertGapsAt(earliest_point, latest_point - earliest_point, command); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/tool.h b/app/widget/timelinewidget/tool/tool.h index e0e036ef0..544fe7be9 100644 --- a/app/widget/timelinewidget/tool/tool.h +++ b/app/widget/timelinewidget/tool/tool.h @@ -27,7 +27,7 @@ #include "widget/timelinewidget/view/timelineviewghostitem.h" #include "widget/timelinewidget/view/timelineviewmouseevent.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelineWidget; @@ -84,6 +84,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/transition.cpp b/app/widget/timelinewidget/tool/transition.cpp index bf89eb922..335d6652f 100644 --- a/app/widget/timelinewidget/tool/transition.cpp +++ b/app/widget/timelinewidget/tool/transition.cpp @@ -26,7 +26,7 @@ #include "transition.h" #include "widget/nodeview/nodeviewundo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TransitionTool::TransitionTool(TimelineWidget *parent) : AddTool(parent) @@ -181,4 +181,4 @@ void TransitionTool::MouseRelease(TimelineViewMouseEvent *event) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/transition.h b/app/widget/timelinewidget/tool/transition.h index 6dee39d17..70ac8de08 100644 --- a/app/widget/timelinewidget/tool/transition.h +++ b/app/widget/timelinewidget/tool/transition.h @@ -23,7 +23,7 @@ #include "add.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TransitionTool : public AddTool { @@ -37,6 +37,6 @@ private: bool dual_transition_; }; -OLIVE_NAMESPACE_EXIT +} #endif // TRANSITIONTIMELINETOOL_H diff --git a/app/widget/timelinewidget/tool/zoom.cpp b/app/widget/timelinewidget/tool/zoom.cpp index 4eda48a9f..350e98560 100644 --- a/app/widget/timelinewidget/tool/zoom.cpp +++ b/app/widget/timelinewidget/tool/zoom.cpp @@ -21,7 +21,7 @@ #include "widget/timelinewidget/timelinewidget.h" #include "zoom.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ZoomTool::ZoomTool(TimelineWidget *parent) : TimelineTool(parent) @@ -96,4 +96,4 @@ void ZoomTool::MouseRelease(TimelineViewMouseEvent *event) parent()->QueueScroll(scroll_value); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/tool/zoom.h b/app/widget/timelinewidget/tool/zoom.h index f52316a43..26940d8d0 100644 --- a/app/widget/timelinewidget/tool/zoom.h +++ b/app/widget/timelinewidget/tool/zoom.h @@ -23,7 +23,7 @@ #include "tool.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ZoomTool : public TimelineTool { @@ -36,6 +36,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // ZOOMTIMELINETOOL_H diff --git a/app/widget/timelinewidget/trackview/trackview.cpp b/app/widget/timelinewidget/trackview/trackview.cpp index 03fbadfd3..d594787ad 100644 --- a/app/widget/timelinewidget/trackview/trackview.cpp +++ b/app/widget/timelinewidget/trackview/trackview.cpp @@ -28,7 +28,7 @@ #include "trackviewitem.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TrackView::TrackView(Qt::Alignment vertical_alignment, QWidget *parent) : QScrollArea(parent), @@ -132,4 +132,4 @@ void TrackView::RemoveTrack(TrackOutput *track) splitter_->Remove(track->Index()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/trackview/trackview.h b/app/widget/timelinewidget/trackview/trackview.h index 0801dfeac..1ee2e3aab 100644 --- a/app/widget/timelinewidget/trackview/trackview.h +++ b/app/widget/timelinewidget/trackview/trackview.h @@ -28,7 +28,7 @@ #include "trackviewitem.h" #include "trackviewsplitter.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TrackView : public QScrollArea { @@ -63,6 +63,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TRACKVIEW_H diff --git a/app/widget/timelinewidget/trackview/trackviewitem.cpp b/app/widget/timelinewidget/trackview/trackviewitem.cpp index d2e65c77c..9d2b68904 100644 --- a/app/widget/timelinewidget/trackview/trackviewitem.cpp +++ b/app/widget/timelinewidget/trackview/trackviewitem.cpp @@ -26,7 +26,7 @@ #include #include -OLIVE_NAMESPACE_ENTER +namespace olive { TrackViewItem::TrackViewItem(TrackOutput* track, QWidget *parent) : QWidget(parent), @@ -117,4 +117,4 @@ void TrackViewItem::UpdateLabel() } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/trackview/trackviewitem.h b/app/widget/timelinewidget/trackview/trackviewitem.h index 258656ecf..01a237f2d 100644 --- a/app/widget/timelinewidget/trackview/trackviewitem.h +++ b/app/widget/timelinewidget/trackview/trackviewitem.h @@ -29,7 +29,7 @@ #include "widget/clickablelabel/clickablelabel.h" #include "widget/focusablelineedit/focusablelineedit.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TrackViewItem : public QWidget { @@ -63,6 +63,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TRACKVIEWITEM_H diff --git a/app/widget/timelinewidget/trackview/trackviewsplitter.cpp b/app/widget/timelinewidget/trackview/trackviewsplitter.cpp index 0ee10f53e..e0226016b 100644 --- a/app/widget/timelinewidget/trackview/trackviewsplitter.cpp +++ b/app/widget/timelinewidget/trackview/trackviewsplitter.cpp @@ -25,7 +25,7 @@ #include "node/output/track/track.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TrackViewSplitter::TrackViewSplitter(Qt::Alignment vertical_alignment, QWidget* parent) : QSplitter(Qt::Vertical, parent), @@ -192,4 +192,4 @@ void TrackViewSplitterHandle::paintEvent(QPaintEvent *) p.fillRect(rect(), palette().base()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/trackview/trackviewsplitter.h b/app/widget/timelinewidget/trackview/trackviewsplitter.h index f0fb5435c..b478159ac 100644 --- a/app/widget/timelinewidget/trackview/trackviewsplitter.h +++ b/app/widget/timelinewidget/trackview/trackviewsplitter.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TrackViewSplitterHandle : public QSplitterHandle { @@ -77,6 +77,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TRACKVIEWSPLITTER_H diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index 97f7b8624..6de8941d2 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -28,7 +28,7 @@ #include "widget/nodeview/nodeviewundo.h" #include "widget/timelinewidget/timelinewidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Node* TakeNodeFromParentGraph(Node* n, QObject* new_parent = nullptr) { @@ -1751,4 +1751,4 @@ void TimelineSetSelectionsCommand::undo() timeline_->SetSelections(old_); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/undo/undo.h b/app/widget/timelinewidget/undo/undo.h index 377fabb38..adb670e99 100644 --- a/app/widget/timelinewidget/undo/undo.h +++ b/app/widget/timelinewidget/undo/undo.h @@ -32,7 +32,7 @@ #include "undo/undocommand.h" #include "widget/timelinewidget/timelinewidgetselections.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class BlockResizeCommand : public UndoCommand { public: @@ -633,6 +633,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEUNDOABLE_H diff --git a/app/widget/timelinewidget/view/handmovableview.cpp b/app/widget/timelinewidget/view/handmovableview.cpp index ae06c6bc7..6c3362e3c 100644 --- a/app/widget/timelinewidget/view/handmovableview.cpp +++ b/app/widget/timelinewidget/view/handmovableview.cpp @@ -24,7 +24,7 @@ #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { HandMovableView::HandMovableView(QWidget* parent) : QGraphicsView(parent), @@ -115,4 +115,4 @@ const QGraphicsView::DragMode &HandMovableView::GetDefaultDragMode() const return default_drag_mode_; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/view/handmovableview.h b/app/widget/timelinewidget/view/handmovableview.h index 26562e00a..c39f20730 100644 --- a/app/widget/timelinewidget/view/handmovableview.h +++ b/app/widget/timelinewidget/view/handmovableview.h @@ -25,7 +25,7 @@ #include "tool/tool.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class HandMovableView : public QGraphicsView { @@ -54,6 +54,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // HANDMOVABLEVIEW_H diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index e914f55d3..d9cd2ced8 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -33,7 +33,7 @@ #include "node/input/media/media.h" #include "project/item/footage/footage.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineView::TimelineView(Qt::Alignment vertical_alignment, QWidget *parent) : TimelineViewBase(parent), @@ -480,4 +480,4 @@ void TimelineView::UserSetTime(const int64_t &time) emit TimeChanged(time); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/view/timelineview.h b/app/widget/timelinewidget/view/timelineview.h index 0096f8d88..71d6eb1d8 100644 --- a/app/widget/timelinewidget/view/timelineview.h +++ b/app/widget/timelinewidget/view/timelineview.h @@ -35,7 +35,7 @@ #include "widget/timelinewidget/undo/undo.h" #include "undo/undostack.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A widget for viewing and interacting Sequences @@ -130,6 +130,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEVIEW_H diff --git a/app/widget/timelinewidget/view/timelineviewbase.cpp b/app/widget/timelinewidget/view/timelineviewbase.cpp index 06a8f3dc8..45a836b64 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.cpp +++ b/app/widget/timelinewidget/view/timelineviewbase.cpp @@ -29,7 +29,7 @@ #include "common/timecodefunctions.h" #include "config/config.h" -OLIVE_NAMESPACE_ENTER +namespace olive { const double TimelineViewBase::kMaximumScale = 8192; @@ -359,4 +359,4 @@ bool TimelineViewBase::WheelEventIsAZoomEvent(QWheelEvent *event) return (static_cast(event->modifiers() & Qt::ControlModifier) == !Config::Current()["ScrollZooms"].toBool()); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/view/timelineviewbase.h b/app/widget/timelinewidget/view/timelineviewbase.h index ac9b198c6..1b14744e3 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.h +++ b/app/widget/timelinewidget/view/timelineviewbase.h @@ -28,7 +28,7 @@ #include "widget/timelinewidget/snapservice.h" #include "widget/timelinewidget/timelinescaledobject.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelineViewBase : public HandMovableView, public TimelineScaledObject { @@ -134,6 +134,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEVIEWBASE_H diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.cpp b/app/widget/timelinewidget/view/timelineviewblockitem.cpp index 6313e5d14..20efa28fe 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewblockitem.cpp @@ -35,7 +35,7 @@ #include "node/block/transition/transition.h" #include "widget/viewer/audiowaveformview.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineViewBlockItem::TimelineViewBlockItem(Block *block, QGraphicsItem* parent) : TimelineViewRect(parent), @@ -192,4 +192,4 @@ void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsI } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.h b/app/widget/timelinewidget/view/timelineviewblockitem.h index a9315cab8..83cef5c0d 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.h +++ b/app/widget/timelinewidget/view/timelineviewblockitem.h @@ -24,7 +24,7 @@ #include "timelineviewrect.h" #include "node/block/clip/clip.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A graphical representation of a ClipBlock @@ -46,6 +46,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEVIEWCLIPITEM_H diff --git a/app/widget/timelinewidget/view/timelineviewghostitem.cpp b/app/widget/timelinewidget/view/timelineviewghostitem.cpp index 335c15e0c..e816094d8 100644 --- a/app/widget/timelinewidget/view/timelineviewghostitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewghostitem.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineViewGhostItem::TimelineViewGhostItem() : track_adj_(0), @@ -203,4 +203,4 @@ bool TimelineViewGhostItem::HasBeenAdjusted() const || GetTrackAdjustment() != 0; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/view/timelineviewghostitem.h b/app/widget/timelinewidget/view/timelineviewghostitem.h index dbab4e782..9f734e45f 100644 --- a/app/widget/timelinewidget/view/timelineviewghostitem.h +++ b/app/widget/timelinewidget/view/timelineviewghostitem.h @@ -28,7 +28,7 @@ #include "timelineviewblockitem.h" #include "timelineviewrect.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A graphical representation of changes the user is making before they apply it */ @@ -142,6 +142,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEVIEWGHOSTITEM_H diff --git a/app/widget/timelinewidget/view/timelineviewmouseevent.cpp b/app/widget/timelinewidget/view/timelineviewmouseevent.cpp index 47ae0d477..61e697d63 100644 --- a/app/widget/timelinewidget/view/timelineviewmouseevent.cpp +++ b/app/widget/timelinewidget/view/timelineviewmouseevent.cpp @@ -24,7 +24,7 @@ #include "widget/timelinewidget/timelinescaledobject.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineViewMouseEvent::TimelineViewMouseEvent(const qreal &scene_x, const double &scale_x, @@ -100,4 +100,4 @@ void TimelineViewMouseEvent::ignore() source_event_->ignore(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/view/timelineviewmouseevent.h b/app/widget/timelinewidget/view/timelineviewmouseevent.h index 4fc2654f3..f4371660e 100644 --- a/app/widget/timelinewidget/view/timelineviewmouseevent.h +++ b/app/widget/timelinewidget/view/timelineviewmouseevent.h @@ -27,7 +27,7 @@ #include "timeline/timelinecoordinate.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimelineViewMouseEvent { @@ -84,6 +84,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEVIEWMOUSEEVENT_H diff --git a/app/widget/timelinewidget/view/timelineviewrect.cpp b/app/widget/timelinewidget/view/timelineviewrect.cpp index 64e38a9eb..1145671ea 100644 --- a/app/widget/timelinewidget/view/timelineviewrect.cpp +++ b/app/widget/timelinewidget/view/timelineviewrect.cpp @@ -20,7 +20,7 @@ #include "timelineviewrect.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimelineViewRect::TimelineViewRect(QGraphicsItem* parent) : QGraphicsRectItem(parent), @@ -62,4 +62,4 @@ void TimelineViewRect::TimebaseChangedEvent(const rational &tb) UpdateRect(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timelinewidget/view/timelineviewrect.h b/app/widget/timelinewidget/view/timelineviewrect.h index c56432ec1..14311264a 100644 --- a/app/widget/timelinewidget/view/timelineviewrect.h +++ b/app/widget/timelinewidget/view/timelineviewrect.h @@ -26,7 +26,7 @@ #include "timeline/timelinecoordinate.h" #include "../timelinescaledobject.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A base class for graphical representations of Block nodes @@ -55,6 +55,6 @@ protected: TrackReference track_; }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMELINEVIEWRECT_H diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index 3bacf4ee5..dd13e1d90 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -27,7 +27,7 @@ #include "common/qtutils.h" #include "core.h" -OLIVE_NAMESPACE_ENTER +namespace olive { SeekableWidget::SeekableWidget(QWidget* parent) : TimelineScaledWidget(parent), @@ -260,4 +260,4 @@ void SeekableWidget::DrawPlayhead(QPainter *p, int x, int y) p->setRenderHint(QPainter::Antialiasing, false); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timeruler/seekablewidget.h b/app/widget/timeruler/seekablewidget.h index a9712b05f..d34b47bac 100644 --- a/app/widget/timeruler/seekablewidget.h +++ b/app/widget/timeruler/seekablewidget.h @@ -26,7 +26,7 @@ #include "widget/timelinewidget/snapservice.h" #include "widget/timelinewidget/timelinescaledobject.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class SeekableWidget : public TimelineScaledWidget { @@ -100,6 +100,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // SEEKABLEWIDGET_H diff --git a/app/widget/timeruler/timeruler.cpp b/app/widget/timeruler/timeruler.cpp index 98236ce39..3b3f92635 100644 --- a/app/widget/timeruler/timeruler.cpp +++ b/app/widget/timeruler/timeruler.cpp @@ -30,7 +30,7 @@ #include "widget/menu/menu.h" #include "widget/menu/menushared.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimeRuler::TimeRuler(bool text_visible, bool cache_status_visible, QWidget* parent) : SeekableWidget(parent), @@ -332,4 +332,4 @@ void TimeRuler::UpdateHeight() setFixedHeight(height); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timeruler/timeruler.h b/app/widget/timeruler/timeruler.h index 7d0d6f0d9..400bd640f 100644 --- a/app/widget/timeruler/timeruler.h +++ b/app/widget/timeruler/timeruler.h @@ -28,7 +28,7 @@ #include "seekablewidget.h" #include "render/playbackcache.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimeRuler : public SeekableWidget { @@ -69,6 +69,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMERULER_H diff --git a/app/widget/timetarget/timetarget.cpp b/app/widget/timetarget/timetarget.cpp index cebce4296..eb8830bd6 100644 --- a/app/widget/timetarget/timetarget.cpp +++ b/app/widget/timetarget/timetarget.cpp @@ -20,7 +20,7 @@ #include "timetarget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { TimeTargetObject::TimeTargetObject() : time_target_(nullptr), @@ -80,4 +80,4 @@ TimeRange TimeTargetObject::GetAdjustedTime(Node* from, Node* to, const TimeRang return adjusted.size(); }*/ -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/timetarget/timetarget.h b/app/widget/timetarget/timetarget.h index 3a4b4d0c6..5826bfd61 100644 --- a/app/widget/timetarget/timetarget.h +++ b/app/widget/timetarget/timetarget.h @@ -23,7 +23,7 @@ #include "node/node.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class TimeTargetObject { @@ -50,6 +50,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // TIMETARGETOBJECT_H diff --git a/app/widget/toolbar/toolbar.cpp b/app/widget/toolbar/toolbar.cpp index 2c5078561..2a6aaac39 100644 --- a/app/widget/toolbar/toolbar.cpp +++ b/app/widget/toolbar/toolbar.cpp @@ -29,7 +29,7 @@ #include "ui/icons/icons.h" #include "widget/menu/menu.h" -OLIVE_NAMESPACE_ENTER +namespace olive { Toolbar::Toolbar(QWidget *parent) : QWidget(parent) @@ -206,4 +206,4 @@ void Toolbar::TransitionMenuItemTriggered(QAction *a) emit SelectedTransitionChanged(NodeFactory::GetIDFromMenuAction(a)); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/toolbar/toolbar.h b/app/widget/toolbar/toolbar.h index 338ef6b5d..076a7850e 100644 --- a/app/widget/toolbar/toolbar.h +++ b/app/widget/toolbar/toolbar.h @@ -27,7 +27,7 @@ #include "widget/toolbar/toolbarbutton.h" #include "tool/tool.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A widget containing buttons for all of Olive's application-wide tools. @@ -234,6 +234,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // TOOLBAR_H diff --git a/app/widget/toolbar/toolbarbutton.cpp b/app/widget/toolbar/toolbarbutton.cpp index de9e5d17c..df65826c3 100644 --- a/app/widget/toolbar/toolbarbutton.cpp +++ b/app/widget/toolbar/toolbarbutton.cpp @@ -20,7 +20,7 @@ #include "toolbarbutton.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ToolbarButton::ToolbarButton(QWidget *parent, const Tool::Item &tool) : QPushButton(parent), @@ -34,4 +34,4 @@ const Tool::Item &ToolbarButton::tool() return tool_; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/toolbar/toolbarbutton.h b/app/widget/toolbar/toolbarbutton.h index 6cd51a606..a8ca88dd4 100644 --- a/app/widget/toolbar/toolbarbutton.h +++ b/app/widget/toolbar/toolbarbutton.h @@ -25,7 +25,7 @@ #include "tool/tool.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Simple derived class of QPushButton to contain an Tool ID. Used as the main widget through Toolbar. @@ -59,6 +59,6 @@ private: Tool::Item tool_; }; -OLIVE_NAMESPACE_EXIT +} #endif // TOOLBARBUTTON_H diff --git a/app/widget/viewer/audiowaveformview.cpp b/app/widget/viewer/audiowaveformview.cpp index 5b24d87f1..2dce75fbd 100644 --- a/app/widget/viewer/audiowaveformview.cpp +++ b/app/widget/viewer/audiowaveformview.cpp @@ -28,7 +28,7 @@ #include "config/config.h" #include "timeline/timelinecommon.h" -OLIVE_NAMESPACE_ENTER +namespace olive { AudioWaveformView::AudioWaveformView(QWidget *parent) : SeekableWidget(parent), @@ -152,4 +152,4 @@ void AudioWaveformView::ForceUpdate() update(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/viewer/audiowaveformview.h b/app/widget/viewer/audiowaveformview.h index afa2a0dbf..94ab95ab5 100644 --- a/app/widget/viewer/audiowaveformview.h +++ b/app/widget/viewer/audiowaveformview.h @@ -28,7 +28,7 @@ #include "render/audioplaybackcache.h" #include "widget/timeruler/seekablewidget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class AudioWaveformView : public SeekableWidget { @@ -58,6 +58,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // AUDIOWAVEFORMVIEW_H diff --git a/app/widget/viewer/footageviewer.cpp b/app/widget/viewer/footageviewer.cpp index 51a17bf94..0cc0ef2c9 100644 --- a/app/widget/viewer/footageviewer.cpp +++ b/app/widget/viewer/footageviewer.cpp @@ -26,7 +26,7 @@ #include "config/config.h" #include "project/project.h" -OLIVE_NAMESPACE_ENTER +namespace olive { FootageViewerWidget::FootageViewerWidget(QWidget *parent) : ViewerWidget(parent), @@ -175,4 +175,4 @@ void FootageViewerWidget::StartAudioDrag() StartFootageDragInternal(false, true); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/viewer/footageviewer.h b/app/widget/viewer/footageviewer.h index fc014ec49..9b76b6000 100644 --- a/app/widget/viewer/footageviewer.h +++ b/app/widget/viewer/footageviewer.h @@ -26,7 +26,7 @@ #include "node/output/viewer/viewer.h" #include "viewer.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class FootageViewerWidget : public ViewerWidget { @@ -64,6 +64,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // FOOTAGEVIEWERWIDGET_H diff --git a/app/widget/viewer/gizmotraverser.cpp b/app/widget/viewer/gizmotraverser.cpp index a01d61378..e9938d9e8 100644 --- a/app/widget/viewer/gizmotraverser.cpp +++ b/app/widget/viewer/gizmotraverser.cpp @@ -20,7 +20,7 @@ #include "gizmotraverser.h" -OLIVE_NAMESPACE_ENTER +namespace olive { QVariant GizmoTraverser::ProcessVideoFootage(StreamPtr stream, const rational &input_time) { @@ -40,4 +40,4 @@ QVariant GizmoTraverser::ProcessShader(const Node *node, const TimeRange &range, return size_; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/viewer/gizmotraverser.h b/app/widget/viewer/gizmotraverser.h index fbd8e44aa..576019855 100644 --- a/app/widget/viewer/gizmotraverser.h +++ b/app/widget/viewer/gizmotraverser.h @@ -23,7 +23,7 @@ #include "node/traverser.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class GizmoTraverser : public NodeTraverser { @@ -45,6 +45,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // GIZMOTRAVERSER_H diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index eafb0ac3d..00757f925 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -42,7 +42,7 @@ #include "widget/menu/menu.h" #include "window/mainwindow/mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { QVector ViewerWidget::instances_; @@ -1199,4 +1199,4 @@ void ViewerWidget::ViewerShiftedRange(const rational &from, const rational &to) } } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 4133d7bd1..40bdc7053 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -42,7 +42,7 @@ #include "widget/playbackcontrols/playbackcontrols.h" #include "widget/timebased/timebased.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief An OpenGL-based viewer widget with playback controls (a PlaybackControls widget). @@ -266,7 +266,7 @@ private slots: void SetZoomFromMenu(QAction* action); - void ViewerShiftedRange(const OLIVE_NAMESPACE::rational& from, const OLIVE_NAMESPACE::rational& to); + void ViewerShiftedRange(const olive::rational& from, const olive::rational& to); void UpdateStack(); @@ -286,7 +286,7 @@ private slots: void RendererGeneratedFrameForQueue(); - void ViewerInvalidatedVideoRange(const OLIVE_NAMESPACE::TimeRange &range); + void ViewerInvalidatedVideoRange(const olive::TimeRange &range); void ManualSwitchToWaveform(bool e); @@ -294,6 +294,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWER_WIDGET_H diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 79326f8a3..c688a1234 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -35,7 +35,7 @@ #include "core.h" #include "gizmotraverser.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ViewerDisplayWidget::ViewerDisplayWidget(QWidget *parent) : ManagedDisplayWidget(parent), @@ -421,4 +421,4 @@ QTransform ViewerDisplayWidget::GenerateWorldTransform() return world; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index fcf140cf1..5c6fa164a 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -32,7 +32,7 @@ #include "widget/manageddisplay/manageddisplay.h" #include "widget/timetarget/timetarget.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief The inner display/rendering widget of a Viewer class. @@ -252,6 +252,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWERGLWIDGET_H diff --git a/app/widget/viewer/viewerplaybacktimer.cpp b/app/widget/viewer/viewerplaybacktimer.cpp index a1abed086..d2de65c77 100644 --- a/app/widget/viewer/viewerplaybacktimer.cpp +++ b/app/widget/viewer/viewerplaybacktimer.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { void ViewerPlaybackTimer::Start(const int64_t &start_timestamp, const int &playback_speed, const double &timebase) { @@ -41,4 +41,4 @@ int64_t ViewerPlaybackTimer::GetTimestampNow() const return start_timestamp_ + frames_since_start * playback_speed_; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/viewer/viewerplaybacktimer.h b/app/widget/viewer/viewerplaybacktimer.h index 4df1031dc..bd613d687 100644 --- a/app/widget/viewer/viewerplaybacktimer.h +++ b/app/widget/viewer/viewerplaybacktimer.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ViewerPlaybackTimer { public: @@ -43,6 +43,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWERPLAYBACKTIMER_H diff --git a/app/widget/viewer/viewerqueue.h b/app/widget/viewer/viewerqueue.h index 19fb8d908..3e0ddfdd8 100644 --- a/app/widget/viewer/viewerqueue.h +++ b/app/widget/viewer/viewerqueue.h @@ -25,7 +25,7 @@ #include "codec/frame.h" -OLIVE_NAMESPACE_ENTER +namespace olive { struct ViewerPlaybackFrame { rational timestamp; @@ -52,6 +52,6 @@ public: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWERQUEUE_H diff --git a/app/widget/viewer/viewersafemargininfo.h b/app/widget/viewer/viewersafemargininfo.h index a71a0b2d7..73add3bea 100644 --- a/app/widget/viewer/viewersafemargininfo.h +++ b/app/widget/viewer/viewersafemargininfo.h @@ -25,7 +25,7 @@ #include "common/define.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ViewerSafeMarginInfo { public: @@ -70,6 +70,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWERSAFEMARGININFO_H diff --git a/app/widget/viewer/viewersizer.cpp b/app/widget/viewer/viewersizer.cpp index 9bc685f1a..2db30c9d4 100644 --- a/app/widget/viewer/viewersizer.cpp +++ b/app/widget/viewer/viewersizer.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { ViewerSizer::ViewerSizer(QWidget *parent) : QWidget(parent), @@ -255,4 +255,4 @@ void ViewerSizer::ScrollBarMoved() emit RequestTranslate(mat); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/viewer/viewersizer.h b/app/widget/viewer/viewersizer.h index 43adc0277..8833e9735 100644 --- a/app/widget/viewer/viewersizer.h +++ b/app/widget/viewer/viewersizer.h @@ -27,7 +27,7 @@ #include "common/define.h" #include "common/rational.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief A container widget that enforces the aspect ratio of a child widget @@ -120,6 +120,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWERSIZER_H diff --git a/app/widget/viewer/viewerwindow.cpp b/app/widget/viewer/viewerwindow.cpp index ae79e6373..57484da23 100644 --- a/app/widget/viewer/viewerwindow.cpp +++ b/app/widget/viewer/viewerwindow.cpp @@ -25,7 +25,7 @@ #include "common/timecodefunctions.h" -OLIVE_NAMESPACE_ENTER +namespace olive { ViewerWindow::ViewerWindow(QWidget *parent) : QWidget(parent, Qt::Window | Qt::WindowStaysOnTopHint), @@ -140,4 +140,4 @@ void ViewerWindow::UpdateMatrix() display_widget_->SetMatrixZoom(mat); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/widget/viewer/viewerwindow.h b/app/widget/viewer/viewerwindow.h index bc883eafa..a2cbc76ce 100644 --- a/app/widget/viewer/viewerwindow.h +++ b/app/widget/viewer/viewerwindow.h @@ -27,7 +27,7 @@ #include "viewerplaybacktimer.h" #include "viewerqueue.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class ViewerWindow : public QWidget { @@ -89,6 +89,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // VIEWERWINDOW_H diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp index 89e5b2b00..21de51cb7 100644 --- a/app/window/mainwindow/mainmenu.cpp +++ b/app/window/mainwindow/mainmenu.cpp @@ -36,7 +36,7 @@ #include "widget/menu/menushared.h" #include "mainwindow.h" -OLIVE_NAMESPACE_ENTER +namespace olive { MainMenu::MainMenu(MainWindow *parent) : QMenuBar(parent) @@ -692,4 +692,4 @@ void MainMenu::Retranslate() help_about_item_->setText(tr("&About...")); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/window/mainwindow/mainmenu.h b/app/window/mainwindow/mainmenu.h index d1c5e046d..b2e7c0546 100644 --- a/app/window/mainwindow/mainmenu.h +++ b/app/window/mainwindow/mainmenu.h @@ -27,7 +27,7 @@ #include "dialog/actionsearch/actionsearch.h" #include "widget/menu/menu.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class MainWindow; @@ -272,6 +272,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // MAINMENU_H diff --git a/app/window/mainwindow/mainstatusbar.cpp b/app/window/mainwindow/mainstatusbar.cpp index bbc8ee455..6bdd530a4 100644 --- a/app/window/mainwindow/mainstatusbar.cpp +++ b/app/window/mainwindow/mainstatusbar.cpp @@ -22,7 +22,7 @@ #include -OLIVE_NAMESPACE_ENTER +namespace olive { MainStatusBar::MainStatusBar(QWidget *parent) : QStatusBar(parent), @@ -104,4 +104,4 @@ void MainStatusBar::mouseDoubleClickEvent(QMouseEvent* e) emit DoubleClicked(); } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/window/mainwindow/mainstatusbar.h b/app/window/mainwindow/mainstatusbar.h index 4f744c4c7..dad53115d 100644 --- a/app/window/mainwindow/mainstatusbar.h +++ b/app/window/mainwindow/mainstatusbar.h @@ -26,7 +26,7 @@ #include "task/taskmanager.h" -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Shows abbreviated information from a TaskManager object @@ -61,6 +61,6 @@ private: }; -OLIVE_NAMESPACE_EXIT +} #endif // MAINSTATUSBAR_H diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index d9faaf66b..8426fa8cf 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -32,7 +32,7 @@ #include "mainmenu.h" #include "mainstatusbar.h" -OLIVE_NAMESPACE_ENTER +namespace olive { MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -697,4 +697,4 @@ T *MainWindow::AppendFloatingPanelInternal(QList &list) return panel; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h index 3d0e03772..3b543880b 100644 --- a/app/window/mainwindow/mainwindow.h +++ b/app/window/mainwindow/mainwindow.h @@ -44,7 +44,7 @@ #include #endif -OLIVE_NAMESPACE_ENTER +namespace olive { /** * @brief Olive's main window responsible for docking widgets and the main menu bar. @@ -175,6 +175,6 @@ private slots: }; -OLIVE_NAMESPACE_EXIT +} #endif diff --git a/app/window/mainwindow/mainwindowlayoutinfo.cpp b/app/window/mainwindow/mainwindowlayoutinfo.cpp index 0b75a957f..3466f26ea 100644 --- a/app/window/mainwindow/mainwindowlayoutinfo.cpp +++ b/app/window/mainwindow/mainwindowlayoutinfo.cpp @@ -1,6 +1,6 @@ #include "mainwindowlayoutinfo.h" -OLIVE_NAMESPACE_ENTER +namespace olive { void MainWindowLayoutInfo::toXml(QXmlStreamWriter *writer) const { @@ -101,4 +101,4 @@ void MainWindowLayoutInfo::set_state(const QByteArray &layout) state_ = layout; } -OLIVE_NAMESPACE_EXIT +} diff --git a/app/window/mainwindow/mainwindowlayoutinfo.h b/app/window/mainwindow/mainwindowlayoutinfo.h index 59f357935..bb14ab66e 100644 --- a/app/window/mainwindow/mainwindowlayoutinfo.h +++ b/app/window/mainwindow/mainwindowlayoutinfo.h @@ -4,7 +4,7 @@ #include "project/item/folder/folder.h" #include "project/item/sequence/sequence.h" -OLIVE_NAMESPACE_ENTER +namespace olive { class MainWindowLayoutInfo { @@ -50,8 +50,8 @@ private: }; -OLIVE_NAMESPACE_EXIT +} -Q_DECLARE_METATYPE(OLIVE_NAMESPACE::MainWindowLayoutInfo) +Q_DECLARE_METATYPE(olive::MainWindowLayoutInfo) #endif // MAINWINDOWLAYOUTINFO_H From 502753e05b1d30e6d5922502d439177c8889a382 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 22:55:20 +1100 Subject: [PATCH 58/72] Revert "ci: combined mac dependencies" This reverts commit ea090a9215934f0a1d484b8ffc008d86fac22bda. --- .github/workflows/ci.yml | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ae08e614..274c0c47c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -318,11 +318,35 @@ jobs: with: version: 5.15.1 - - name: Acquire Dependencies + - name: Acquire FFmpeg shell: bash run: | - $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/dep-mac.7z - $EXTRACT_TOOL dep-mac.7z + $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/ffmpeg-mac.zip + $EXTRACT_TOOL ffmpeg-mac.zip + + - name: Acquire OpenColorIO + shell: bash + run: | + $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/ocio-mac.zip + $EXTRACT_TOOL ocio-mac.zip + + - name: Acquire OpenEXR + shell: bash + run: | + $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/openexr-mac.zip + $EXTRACT_TOOL openexr-mac.zip + + - name: Acquire OpenImageIO + shell: bash + run: | + $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/oiio-mac.zip + $EXTRACT_TOOL oiio-mac.zip + + - name: Acquire Crashpad + shell: bash + run: | + $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/crashpad-mac.zip + $EXTRACT_TOOL crashpad-mac.zip - name: Configure CMake shell: bash From 3fd27deb7c84eb87c69bd664e381ef0db1e2958e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 22:59:42 +1100 Subject: [PATCH 59/72] removed unnecessary debug line --- app/core.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/core.cpp b/app/core.cpp index 9687b9f53..8017c8a10 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -915,12 +915,7 @@ void Core::SetStartupLocale() { // Set language if (!core_params_.startup_language().isEmpty()) { - if (translator_->load(core_params_.startup_language())) { - if (QApplication::installTranslator(translator_)) { - qDebug() << "Successfully installed language at" << translator_->filePath(); - } else { - qDebug() << "Failed to install translator"; - } + if (translator_->load(core_params_.startup_language()) && QApplication::installTranslator(translator_)) { return; } else { qWarning() << "Failed to load translation file. Falling back to defaults."; From cdda27fc72a6c8f9910c47d65bb550b1b16a984e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 23:03:12 +1100 Subject: [PATCH 60/72] ci: add otio to mac deps --- .github/workflows/ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 274c0c47c..e120e18fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -330,6 +330,12 @@ jobs: $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/ocio-mac.zip $EXTRACT_TOOL ocio-mac.zip + - name: Acquire OpenTimelineIO + shell: bash + run: | + $DOWNLOAD_TOOL https://olivevideoeditor.org/deps/otio-mac.zip + $EXTRACT_TOOL otio-mac.zip + - name: Acquire OpenEXR shell: bash run: | From 82cc59042392b18ff06a7a6705ddec50d5d4a0e4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Nov 2020 23:15:32 +1100 Subject: [PATCH 61/72] updated splash url in about dialog Fixes #1246 --- app/dialog/about/about.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dialog/about/about.cpp b/app/dialog/about/about.cpp index 330a613cb..aa3f8f9be 100644 --- a/app/dialog/about/about.cpp +++ b/app/dialog/about/about.cpp @@ -38,7 +38,7 @@ AboutDialog::AboutDialog(QWidget *parent) : // Construct About text QLabel* label = new QLabel(QStringLiteral("" - "

" + "

" "

" "" "https://www.olivevideoeditor.org/" From 3edac8a07fd0814b23c2b71f0ded7a0ba22b40c0 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Nov 2020 01:34:40 +1100 Subject: [PATCH 62/72] nodeview: added arrows --- app/widget/nodeview/nodeviewedge.cpp | 53 +++++++++++++++++++++++++++- app/widget/nodeview/nodeviewedge.h | 4 +++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/app/widget/nodeview/nodeviewedge.cpp b/app/widget/nodeview/nodeviewedge.cpp index c48c2af46..800b60393 100644 --- a/app/widget/nodeview/nodeviewedge.cpp +++ b/app/widget/nodeview/nodeviewedge.cpp @@ -25,6 +25,7 @@ #include #include +#include "common/bezier.h" #include "common/clamp.h" #include "common/lerp.h" #include "nodeview.h" @@ -47,6 +48,7 @@ NodeViewEdge::NodeViewEdge(QGraphicsItem *parent) : // Use font metrics to set edge width for basic high DPI support edge_width_ = QFontMetrics(QFont()).height() / 12; + arrow_size_ = QFontMetrics(QFont()).height() / 2; } void NodeViewEdge::SetEdge(NodeEdgePtr edge) @@ -104,6 +106,8 @@ void NodeViewEdge::SetPoints(const QPointF &start, const QPointF &end, bool inpu QPainterPath path; path.moveTo(start); + double angle = qAtan2(end.y() - start.y(), end.x() - start.x()); + if (curved_) { double half_x = lerp(start.x(), end.x(), 0.5); @@ -125,6 +129,36 @@ void NodeViewEdge::SetPoints(const QPointF &start, const QPointF &end, bool inpu path.cubicTo(cp1, cp2, end); + if (!qFuzzyCompare(start.x(), end.x())) { + double continue_x = end.x() - qCos(angle)*arrow_size_; + + double x1, x2, x3, x4, y1, y2, y3, y4; + if (start.x() < end.x()) { + x1 = start.x(); + x2 = cp1.x(); + x3 = cp2.x(); + x4 = end.x(); + y1 = start.y(); + y2 = cp1.y(); + y3 = cp2.y(); + y4 = end.y(); + } else { + x1 = end.x(); + x2 = cp2.x(); + x3 = cp1.x(); + x4 = start.x(); + y1 = end.y(); + y2 = cp2.y(); + y3 = cp1.y(); + y4 = start.y(); + } + + double t = Bezier::CubicXtoT(continue_x, x1, x2, x3, x4); + double y = Bezier::CubicTtoY(y1, y2, y3, y4, t); + + angle = qAtan2(end.y() - y, end.x() - continue_x); + } + } else { path.lineTo(end); @@ -132,6 +166,15 @@ void NodeViewEdge::SetPoints(const QPointF &start, const QPointF &end, bool inpu } setPath(path); + + const double arrow_angle = 150.0 * 3.141592 / 180.0; + QVector arrow_points(4); + arrow_points[0] = end; + arrow_points[1] = end + QPointF(qCos(angle + arrow_angle) * arrow_size_, qSin(angle + arrow_angle) * arrow_size_); + arrow_points[2] = end + QPointF(qCos(angle - arrow_angle) * arrow_size_, qSin(angle - arrow_angle) * arrow_size_); + arrow_points[3] = end; + + arrow_ = QPolygonF(arrow_points); } void NodeViewEdge::SetFlowDirection(NodeViewCommon::FlowDirection dir) @@ -165,9 +208,17 @@ void NodeViewEdge::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti role = QPalette::Text; } - painter->setPen(QPen(qApp->palette().color(group, role), edge_width_)); + // Draw main path + QColor edge_color = qApp->palette().color(group, role); + + painter->setPen(QPen(edge_color, edge_width_)); painter->setBrush(Qt::NoBrush); painter->drawPath(path()); + + // Draw arrow + painter->setPen(Qt::NoPen); + painter->setBrush(edge_color); + painter->drawPolygon(arrow_); } } diff --git a/app/widget/nodeview/nodeviewedge.h b/app/widget/nodeview/nodeviewedge.h index 07f2c3298..361a3ffb5 100644 --- a/app/widget/nodeview/nodeviewedge.h +++ b/app/widget/nodeview/nodeviewedge.h @@ -110,6 +110,10 @@ private: bool curved_; + QPolygonF arrow_; + + int arrow_size_; + }; } From aa8f26b8f97aea8793531e83b8dfeebabfb1e897 Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Tue, 17 Nov 2020 21:01:07 +0300 Subject: [PATCH 63/72] Add old Olive translations from the 0.1.x series --- app/ts/CMakeLists.txt | 15 + app/ts/ar_AR.ts | 4130 ++++++++++++++++++++++++++++++++++++++ app/ts/bs_BS.ts | 3716 ++++++++++++++++++++++++++++++++++ app/ts/cs_CS.ts | 3841 +++++++++++++++++++++++++++++++++++ app/ts/de_DE.ts | 4158 ++++++++++++++++++++++++++++++++++++++ app/ts/es_ES.ts | 4437 +++++++++++++++++++++++++++++++++++++++++ app/ts/fr_FR.ts | 4093 +++++++++++++++++++++++++++++++++++++ app/ts/id_ID.ts | 3788 +++++++++++++++++++++++++++++++++++ app/ts/it_IT.ts | 3864 +++++++++++++++++++++++++++++++++++ app/ts/pt_BR.ts | 4198 ++++++++++++++++++++++++++++++++++++++ app/ts/ru_RU.ts | 3646 +++++++++++++++++++++++++++++++++ app/ts/sr_SR.ts | 3703 ++++++++++++++++++++++++++++++++++ app/ts/tr_TR.ts | 3813 +++++++++++++++++++++++++++++++++++ app/ts/uk_UK.ts | 3813 +++++++++++++++++++++++++++++++++++ app/ts/zh_CN.ts | 3759 ++++++++++++++++++++++++++++++++++ app/ts/zh_TW.ts | 3759 ++++++++++++++++++++++++++++++++++ 16 files changed, 58733 insertions(+) create mode 100644 app/ts/ar_AR.ts create mode 100644 app/ts/bs_BS.ts create mode 100644 app/ts/cs_CS.ts create mode 100644 app/ts/de_DE.ts create mode 100644 app/ts/es_ES.ts create mode 100644 app/ts/fr_FR.ts create mode 100644 app/ts/id_ID.ts create mode 100644 app/ts/it_IT.ts create mode 100644 app/ts/pt_BR.ts create mode 100644 app/ts/ru_RU.ts create mode 100644 app/ts/sr_SR.ts create mode 100644 app/ts/tr_TR.ts create mode 100644 app/ts/uk_UK.ts create mode 100755 app/ts/zh_CN.ts create mode 100755 app/ts/zh_TW.ts diff --git a/app/ts/CMakeLists.txt b/app/ts/CMakeLists.txt index 58fee900e..ff371a59f 100644 --- a/app/ts/CMakeLists.txt +++ b/app/ts/CMakeLists.txt @@ -15,6 +15,21 @@ # along with this program. If not, see . set(OLIVE_TS_FILES + ts/ar_AR.ts + ts/bs_BS.ts + ts/cs_CS.ts + ts/de_DE.ts ts/en_US.ts + ts/es_ES.ts + ts/fr_FR.ts + ts/id_ID.ts + ts/it_IT.ts + ts/pt_BR.ts + ts/ru_RU.ts + ts/sr_SR.ts + ts/tr_TR.ts + ts/uk_UK.ts + ts/zh_CN.ts + ts/zh_TW.ts PARENT_SCOPE ) diff --git a/app/ts/ar_AR.ts b/app/ts/ar_AR.ts new file mode 100644 index 000000000..490994f47 --- /dev/null +++ b/app/ts/ar_AR.ts @@ -0,0 +1,4130 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + زيتون هو محرر فيديو غير خطي. هذا البرنامج حر ومحمي بموجب رخصة جنو العمومية. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + فريق زيتون ملزم بإخبار مستخدميه بأن الشفرة المصدرية لزيتون متوفرة للتنزيل عبر موقعه الإلكتروني. + + + + ActionSearch + + + Search for action... + ابحث عن إجراء... + + + + AdvancedVideoDialog + + + Advanced Video Settings + + + + + Pixel Format: + + + + + Threads: + + + + + Audio + + Audio + الصوت + + + Recording + تسجيل + + + + %1 Audio + + + + + Recording %1 + + + + + AudioNoiseEffect + + + Amount + المقدار + + + + Mix + دمج + + + + AutoCutSilenceDialog + + + Cut Silence + + + + + Attack Threshold: + + + + + Attack Time: + + + + + Release Threshold: + + + + + Release Time: + + + + + Cacher + + + + Could not open %1 - %2 + + + + + ChannelLayoutName + + + Invalid + معطوب + + + + Mono + اُحادي + + + + Stereo + مُجسم + + + + ClipPropertiesDialog + + + "%1" Properties + "%1" الخصائص + + + + Multiple Clip Properties + + + + + Name: + اﻷسم: + + + + Duration: + المدة: + + + + (multiple) + + + + + CollapsibleWidget + + + <untitled> + <غير معنون> + + + + ColorButton + + + Set Color + حدد اللون + + + + CornerPinEffect + + + Top Left + اعلى اليسار + + + + Top Right + اعلى اليمين + + + + Bottom Left + ادنى اليسار + + + + Bottom Right + ادنى اليمين + + + + Perspective + منظور + + + + DebugDialog + + + Debug Log + سجل التنقيح + + + + DemoNotice + + + + Welcome to Olive! + مرحباً في زيتون! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + زيتون هو محرر فيديو حر ومفتوح المصدر تحت مظلة رخصة رخصة جنو العمومية. أن دفعت ﻷجل الحصول على هذا البرنامج فقد غُششت. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + هذا البرنامج في مرحلة ألفا حالياً حيث تعني أنه غير مستقر وفي اﻷعم اﻷغلب عرضة للتحطم, به علل, ويفتقر لبعض المميزات. نحن لا نوفر ضمانة لذا أستخدمهُ على مسؤوليتك. رجاءً بلغ أي علل أو طلب مميزات على %1 + + + + Thank you for trying Olive and we hope you enjoy it! + شكراً لتجربتك زيتون ونحن نأمل أن تستمتع به! + + + + Effect + + + Invalid effect + تأثير غير صالح + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + لا وجود للتأثير '%1'. هذا التأثير قد يكون فاسد حاول إعادة تثبيته مجدداً أو زيتون. + + + Cu&t + قط&ع + + + &Copy + &نسخ + + + Move &Up + حرك &للاعلى + + + Move &Down + حرك &لﻷسفل + + + D&elete + ح&ذف + + + Load Settings From File + حمل اﻹعدادات من ملف + + + Save Settings to File + أحفظ اﻷعدادات في ملف + + + + Save Effect Settings + أحفظ أعدادات المؤثر + + + + + Effect XML Settings %1 + غير إعدادات XML %1 + + + + Save Settings Failed + حفظ اﻷعدادات فشل + + + + Failed to open "%1" for writing. + فشل فتح "%1" للكتابة. + + + + Load Effect Settings + تحميل أعدادات المؤثر + + + + + Load Settings Failed + تحميل اﻹعدادات فشل + + + + Failed to open "%1" for reading. + فشل في فتح "%1" للقراءة. + + + + This settings file doesn't match this effect. + ملف اﻷعدادات هذا لا يطابق هذا المؤثر. + + + + EffectControls + + + Effects: + المؤثرات: + + + &Paste + &لصق + + + + (none) + (لا شيء) + + + + Add Video Effect + أضف موثر فيديو + + + + VIDEO EFFECTS + موثرات الفيديو + + + + Add Video Transition + أضف أنتقالة فيديو + + + + Add Audio Effect + أضف موثر صوت + + + + AUDIO EFFECTS + موثرات الصوت + + + + Add Audio Transition + أضف أنتقالة صوت + + + (Multiple clips selected) + (مقاطع عديدة محددة) + + + + EffectRow + + + Disable Keyframes + عطّل اﻹطارت المفتاحية + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + تعطيل اﻹطارات المفتاحية سوف يحذف جميع اﻹطارات المفتاحية الحالية هل أنت متأكد من ما ستقدم عليه؟ + + + + EffectUI + + + %1 (Opening) + + + + + %1 (Closing) + + + + + %1 (multiple) + + + + + Cu&t + قط&ع + + + + &Copy + &نسخ + + + + Move &Up + حرك &للاعلى + + + + Move &Down + حرك &لﻷسفل + + + + D&elete + ح&ذف + + + + Load Settings From File + حمل اﻹعدادات من ملف + + + + Save Settings to File + أحفظ اﻷعدادات في ملف + + + + EmbeddedFileChooser + + + File: + ملف: + + + + ExportDialog + + + Export "%1" + صدّر "%1" + + + + Unknown codec name %1 + + + + + Export Failed + فشل التصدير + + + + Export failed - %1 + فشل تصدير - %1 + + + + Invalid dimensions + أبعاد خاطئة + + + + Export width and height must both be even numbers/divisible by 2. + تصدير العرض والطول يجب أن يكون عدد زوجي/قابل للقسمة ب 2. + + + + Invalid codec + مرماز غير صالح + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + لم يتم التعرف على خيارات الإخراج للمرماز المحدد. هذه علة, رجاءً تواصل مع المطورين. + + + + Invalid format + صيغة غير صالحة + + + + Couldn't determine output format. This is a bug, please contact the developers. + لم يتم التعرف على صيغة اﻹخراج. هذه علة, رجاءً تواصل مع المطورين. + + + + Export Media + صدّر الوسائط + + + + %p% (Total: %1:%2:%3) + + + + + %p% (ETA: %1:%2:%3) + + + + + Quality-based (Constant Rate Factor) + (عامل النسبة الثابت) أعتماداً-بالجودة + + + + Constant Bitrate + نسبة بت ثابتة + + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + + Bitrate (Mbps): + نسبة البت (مب/ث): + + + + Quality (CRF): + الجودة (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + عامل الجودة: + +0 = بدون خسارة +17-18 = بدون خسارة بصرية (مضغوط, لكن غير متأثر) +23 = جودة عالية +51 = أقل جودة ممكنة + + + + Target File Size (MB): + حجم الملف الهدف (مب): + + + + Format: + صيغة: + + + + Range: + المدى: + + + + Entire Sequence + كل المقطع + + + + In to Out + الدخل إلى الخرج + + + + Video + فيديو + + + + + Codec: + مرماز: + + + + Width: + العرض: + + + + Height: + الطول: + + + + Frame Rate: + نسبة الإطارات: + + + + Compression Type: + نوع الضغط: + + + + Advanced + + + + + Audio + الصوت + + + + Sampling Rate: + معدل الإعتيان: + + + + Bitrate (Kbps/CBR): + نسبة البت (Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + فشل إرسال اﻹطار للمُرمز.(%1) + + + + failed to receive packet from encoder (%1) + فشل إستلام الرزمة من المُرمز (%1) + + + + could not video encoder for %1 + لم يجد مُرمز فيديو ل %1 + + + + could not allocate video stream + لم يستطع تخصيص بث فيديو + + + + could not allocate video encoding context + للمراجعة + لم يستطع تخصيص سياق ترميز فيديو + + + + could not open output video encoder (%1) + لم يتم فتح مرمّز مخرجات فيديو (%1) + + + + could not copy video encoder parameters to output stream (%1) + لم يتم نسخ عوامل مرمّز الفيديو لبث المخرجات (%1) + + + + could not audio encoder for %1 + لم يستطع ترميز فيديو ل %1 + + + + could not allocate audio stream + لم يستطع تخصيص بث صوت + + + + could not allocate audio encoding context + لم يستطع تخصيص سياق ترميز صوت + + + + could not open output audio encoder (%1) + لم يتم فتح مرمّز مخرجات صوت (%1) + + + + could not copy audio encoder parameters to output stream (%1) + لم يتم نسخ عوامل مرمّز الصوت لبث المخرجات (%1) + + + + could not allocate audio buffer (%1) + لم يستطع تخصيص حافظة صوت (%1) + + + + could not create output format context + لم يستطع إنشاء سياق صيغة الصوت + + + + could not open output file (%1) + لم يستطع فتح ملف اﻹخراج (%1) + + + + could not write output file header (%1) + لم يستطع كتابة مخرجات ترويسة الملف (%1) + + + + could not write output file trailer (%1) + لم يستطع كتابة مخرجات ملحقة الملف (%1) + + + + FillLeftRightEffect + + + Type + النوع + + + + Fill Left with Right + املأ اليسار مع اليمين + + + + Fill Right with Left + املأ اليمين مع اليسار + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + فشل في تحميل إضافة Frei0r "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + ملحوظة: لا يمكنك تحميل إضافة Frei0r 32-بت لنسخة زيتون مبنية ل64-بت. رجاءً جد نسخة 64-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 32-بت. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + ملحوظة: لا يمكنك تحميل إضافة Frei0r 64-بت لنسخة زيتون مبنية ل32-بت. رجاءً جد نسخة 32-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 64-بت. + + + + Error loading Frei0r plugin + خطأ تحميل إضافة Frei0r + + + + GraphEditor + + + Graph Editor + محرر المخطط + + + + Linear + خطي + + + + Bezier + بيزير + + + + Hold + أمسك + + + + GraphView + + + Zoom to Selection + قرّب للمُحدد + + + + Zoom to Show All + تقريب لرؤية الكل + + + + Reset View + صفّر الرؤية + + + + InterlacingName + + + None (Progressive) + لا شيء (متفاقم) + + + + Top Field First + الحقل العلوي أولاً + + + + Bottom Field First + الحقل السفلي أولاً + + + + Invalid + غير صالح + + + + KeyframeNavigator + + + Enable Keyframes + فعّل اﻹطارات المفتاحية + + + + KeyframeView + + + Linear + خطي + + + + Bezier + بيزير + + + + Hold + أمسك + + + + LabelSlider + + + &Edit + &تعديل + + + + &Reset to Default + + + + + + Set Value + حدد القيمة + + + + + New value: + قيمة جديدة: + + + + LoadDialog + + + Loading... + تحميل... + + + + Loading '%1'... + تحميل '%1'... + + + + Cancel + إلغاء + + + + LoadThread + + + Version Mismatch + عدم تطابق النسخة + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + هذا المشروع كان محفوظاً بنسخة مختلفة من زيتون وقد لا تكون متوافقة بشكل كامل مع هذه النسخة. هل تريد محاولة تحميله على إي حال؟ + + + + Invalid Clip Link + رابط مقطع غير صالح + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + هذا المشروع يحوي رابط مقطع غير صالح. قد يكون معطوباً. هل تريد اﻷستمرار بتحميله؟ + + + + %1 - Line: %2 Col: %3 + %1 - سطر: %2 عمود: %3 + + + + User aborted loading + المسخدم أجهض التحميل + + + + XML Parsing Error + خطأ تحليل XML + + + + Couldn't load '%1'. %2 + تعثر تحميل '%1'. %2 + + + + Project Load Error + خطأ تحميل المشروع + + + + Error loading project: %1 + خطأ تحميل المشروع: %1 + + + + MainWindow + + + Welcome to %1 + مرحباً في %1 + + + Auto-recovery + اﻷستعادة التلقائية + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + زيتون لم يغلق بشكل سليم وتم التعرف على ملف اﻷستعادة التلقائة. هل تريد فتحه؟ + + + &Project + &المشروع + + + &Sequence + &مقطع + + + &Folder + &مجلد + + + Set In Point + ضع في نقطة + + + Set Out Point + ضع خارج نقطة + + + Reset In Point + صفر في النقطة + + + Reset Out Point + صفّر النقطة + + + Clear In/Out Point + محو نقطة الدخل/الخرج + + + No active sequence + لا مقاطع نشطة + + + Please open the sequence you wish to export. + رجاءً أفتح المقطع المراد تصديره. + + + Save Project As... + أحفظ المشروع ك... + + + Unsaved Project + مشروع غير محفوظ + + + This project has changed since it was last saved. Would you like to save it before closing? + هذا المشروع غُيِرَ منذ أخر مرة. أتريد حفظه قبل اﻹغلاق؟ + + + + &File + &ملف + + + + &New + &جديد + + + + &Open Project + &أفتح مشروع + + + + Clear Recent List + أفرغ قائمة مؤخراً + + + + Open Recent + أفتح مؤخراً + + + + &Save Project + &أحفظ المشروع + + + + Save Project &As + أحفظ المشروع &ك + + + + &Import... + &أستيراد + + + + &Export... + &تصدير + + + + E&xit + خ&روج + + + + &Edit + &تعديل + + + + &Undo + &تراجع + + + + Redo + أعد + + + Cu&t + قط&ع + + + Cop&y + &نسخ + + + &Paste + &لصق + + + Paste Insert + ألصق أدرج + + + Duplicate + أستنساخ + + + Delete + حذف + + + Ripple Delete + حذف موجة + + + Split + أنقسام + + + + Select &All + تحديد &الكل + + + + Deselect All + إلغاء تحديد الكل + + + Add Default Transition + أضف اﻷنتقال الأفتراضي + + + Link/Unlink + ربط/فصل + + + Enable/Disable + تفعيل/تعطيل + + + Nest + للمراجعة + تداخل + + + + Ripple to In Point + موجة لنقطة إدخال + + + + Ripple to Out Point + موجة لنقطة إخراج + + + + Edit to In Point + عدّل لنقطة إدخال + + + + Edit to Out Point + عدّل لنقطة إخراج + + + + Delete In/Out Point + محو نقطة الدخل/الخرج + + + + Ripple Delete In/Out Point + موجة حذف نقطة الإدخال/الإخراج + + + + Set/Edit Marker + حدد/عدّل اﻹشارات + + + + &View + &أظهر + + + + Zoom In + تقريب + + + + Zoom Out + أبتعاد + + + + Increase Track Height + زدّ طول المسار + + + + Decrease Track Height + قلل طول المسار + + + + Toggle Show All + فعل إظهار الكل + + + + Track Lines + تعقب السطور + + + + Rectified Waveforms + أشكال موجية متناوبة + + + + Frames + اﻹطارات + + + + Drop Frame + أفلت إطار + + + + Non-Drop Frame + إطار غير مُفلت + + + + Milliseconds + جزء من الثانية + + + + Title/Action Safe Area + عنوان/إجراء المنطقة الآمنة + + + + Off + مطفئ + + + + Default + إفتراضي + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + مخصوص + + + + Full Screen + ملء الشاشة + + + + Full Screen Viewer + عارض ملء الشاشة + + + + &Playback + &الترديد + + + + Go to Start + أذهب للبداية + + + + Previous Frame + الإطار السابق + + + + Play/Pause + تشغيل/أستئناف + + + + Play In to Out + شغل من الإدخال إلى الإخراج + + + + Next Frame + اﻹطار التالي + + + + Go to End + أذهب للنهاية + + + + Go to Previous Cut + أذهب للقطعة السابقة + + + + Go to Next Cut + أذهب للقطعة التالية + + + + Go to In Point + أذهب لنقطة إدخال + + + + Go to Out Point + أذهب لنقطة إخراج + + + + Shuttle Left + توشع اليسار + + + + Shuttle Stop + إيقاف التوشع + + + + Shuttle Right + توشع اليمين + + + + Loop + حلقة + + + + &Window + &نافذة + + + + Project + المشروع + + + + Effect Controls + تحكمات المؤثر + + + + Timeline + الخط الزمني + + + + Graph Editor + محرر المخطط + + + + Media Viewer + عارض الوسائط + + + + Sequence Viewer + عارض المقطع + + + + Maximize Panel + ضخّم اللائحة + + + + Lock Panels + + + + + Reset to Default Layout + صفّر للتخطيط المبدئي + + + + &Tools + &اﻷدوات + + + + Pointer Tool + أداة المؤشر + + + + Edit Tool + أداة التحرير + + + + Ripple Tool + أداة الموجة + + + + Razor Tool + أداة القطع + + + + Slip Tool + أداة المنزلقة + + + + Slide Tool + أداة الشريحة + + + + Hand Tool + أداة اليد + + + + Transition Tool + أداة اﻷنتقال + + + + Enable Snapping + فعّل السحب + + + + Auto-Cut Silence + + + + Selecting Also Seeks + للمراجعة + تحديد العروضات إيضاً + + + Edit Tool Also Seeks + أداة التحرير تعرض إيضاً + + + Edit Tool Selects Links + أداة التحرير تحدد الروابط + + + Seek Also Selects + للمراجعة + العرض يحدد إيضاً + + + Seek to the End of Pastes + أعرض لنهاية الملصوقات + + + Scroll Wheel Zooms + العجلة الدوراة تُقرّب + + + Enable Drag Files to Timeline + أسمح بسحب الملفات للخط الزمني + + + Auto-Scale By Default + التحجيم-التلقائي إفتراضياً + + + Enable Seek to Import + للمراجعة + أسمح للعرض بالإستيراد + + + Audio Scrubbing + حكّ شريط الصوت + + + Enable Drop on Media to Replace + أسمح برمي الوسائط للأستبدال + + + Enable Hover Focus + فعّل التركيز الحائم + + + Ask For Name When Setting Marker + أسال عن اﻷسم حين وضع المؤشر + + + + No Auto-Scroll + لا أنزلاق التلقائي + + + + Page Auto-Scroll + أنزلاق الصفحة التلقائي + + + + Smooth Auto-Scroll + الأنزلاق التلقائي الناعم + + + + Preferences + التفضيلات + + + + Clear Undo + أمسح التراجُعات + + + + &Help + &مساعدة + + + + A&ction Search + ب&حث إجراء + + + + Debug Log + سجل التنقيح + + + + &About... + &حول... + + + + <untitled> + <غير معنون> + + + Open Project... + أفتح مشروع... + + + Missing recent project + مشروع ماضي ضائع + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + المشروع '%1' غير بعد اﻷن. هل ترغب بحذفه من من قائمة مشاريع مؤخراً؟ + + + Invalid aspect ratio + معدل نسبة غير صالح + + + The aspect ratio '%1' is invalid. Please try again. + معدل النسبة '%1' غير صالح. حاول مجدداً. + + + Enter custom aspect ratio + أدخل نسبة معدل مخصصة + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + أدخل معدل النسبة لأستعماله في العنوان/الإجراء المنطقة الآمنة (كــ. 16:9): + + + Nested Sequence + مقطع متشعب + + + + Marker + + + Set Marker + ضع وسم + + + + Set clip marker name: + ضع أسم وسم المقطوعة: + + + + Set sequence marker name: + ضع أسم وسم المقطع: + + + + Media + + + New Folder + مجلد جديد + + + + Name: + اﻷسم: + + + + Filename: + أسم الملف: + + + + Video Dimensions: + أبعاد الفيديو: + + + + Frame Rate: + معدل اﻹطارات: + + + %1 fields (%2 frames) + %1 الحقل (%2 إطارات) + + + + %1 field(s) (%2 frame(s)) + + + + + Interlacing: + المشابكة: + + + + Audio Frequency: + تردد الصوت: + + + + Audio Channels: + قنوات الصوت: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + اﻷسم: %1 +أبعاد الفيديو: %2x%3 +معدل اﻹطارات: %4 +تردد الصوت: %5 +تخطيط الصوت: %6 + + + + Name + اﻷسم + + + + Duration + المدة + + + + Rate + النسبة + + + + MediaPropertiesDialog + + + "%1" Properties + "%1" الخصائص + + + + Tracks: + المقطوعات: + + + + Video %1: %2x%3 %4FPS + فيديو %1: %2x%3 %4إطار/ث + + + Audio %1: %2Hz %3 channels + الصوت %1: %2هرتز %3 قنوات + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + + + + + + + + + + + Conform to Frame Rate: + المصادقة لمستوى اﻹطارات: + + + + Alpha is Premultiplied + ألفا مضاعفة مسبقاً + + + + Auto (%1) + تلقائي (%1) + + + + Interlacing: + المشابكة: + + + + Name: + اﻷسم: + + + + MenuHelper + + + &Project + &المشروع + + + + &Sequence + &مقطع + + + + &Folder + &مجلد + + + + Set In Point + ضع في نقطة + + + + Set Out Point + ضع خارج نقطة + + + + Reset In Point + صفر في النقطة + + + + Reset Out Point + صفّر النقطة + + + + Clear In/Out Point + محو نقطة الدخل/الخرج + + + + Add Default Transition + أضف اﻷنتقال الأفتراضي + + + + Link/Unlink + ربط/فصل + + + + Enable/Disable + تفعيل/تعطيل + + + + Nest + تداخل + + + + Cu&t + قط&ع + + + + Cop&y + &نسخ + + + + + &Paste + &لصق + + + + Paste Insert + ألصق أدرج + + + + Duplicate + أستنساخ + + + + Delete + حذف + + + + Ripple Delete + حذف موجة + + + + Split + أنقسام + + + + Invalid aspect ratio + معدل نسبة غير صالح + + + + The aspect ratio '%1' is invalid. Please try again. + معدل النسبة '%1' غير صالح. حاول مجدداً. + + + + Enter custom aspect ratio + أدخل نسبة معدل مخصصة + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + أدخل معدل النسبة لأستعماله في العنوان/الإجراء المنطقة الآمنة (كــ. 16:9): + + + + NewSequenceDialog + + + Editing "%1" + تعديل "%1" + + + + New Sequence + مقطع جديد + + + + Preset: + قالب: + + + + Film 4K + فلم 4K + + + + TV 4K (Ultra HD/2160p) + 4K تلفاز (أقصى-عالي الدقة/2160p) + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + مخصوص + + + + Video + فيديو + + + + Width: + العرض: + + + + Height: + الطول: + + + + Frame Rate: + معدل اﻹطارات: + + + + Pixel Aspect Ratio: + للمراجعة + معدل نسبة البيكسل: + + + + Square Pixels (1.0) + بكسيل مربع (1.0) + + + + Interlacing: + المشابكة: + + + + None (Progressive) + لا شيء (متفاقم) + + + + Audio + الصوت + + + + Sample Rate: + معدل الإعتيان: + + + + Name: + اﻷسم: + + + + OliveGlobal + + + Olive Project %1 + + + + + Auto-recovery + اﻷستعادة التلقائية + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + زيتون لم يغلق بشكل سليم وتم التعرف على ملف اﻷستعادة التلقائة. هل تريد فتحه؟ + + + + Open Project... + أفتح مشروع... + + + + Missing recent project + مشروع ماضي ضائع + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + المشروع '%1' غير بعد اﻷن. هل ترغب بحذفه من من قائمة مشاريع مؤخراً؟ + + + + Save Project As... + أحفظ المشروع ك... + + + + Unsaved Project + مشروع غير محفوظ + + + + This project has changed since it was last saved. Would you like to save it before closing? + هذا المشروع غُيِرَ منذ أخر مرة. أتريد حفظه قبل اﻹغلاق؟ + + + + No active sequence + لا مقاطع نشطة + + + + Please open the sequence to perform this action. + + + + + No clips selected + + + + + Select the clips you wish to auto-cut + + + + Please open the sequence you wish to export. + رجاءً أفتح المقطع المراد تصديره. + + + + Missing Project File + + + + + Specified project '%1' does not exist. + + + + + PanEffect + + + Pan + بحاجة لمتابعة + تسطّح + + + + Playback + + Generating Proxy: %1% + توليد وسيط: %1% + + + + PreferencesDialog + + + Preferences + التفضيلات + + + + Invalid CSS File + ملف CSS غير صالح + + + + CSS file '%1' does not exist. + ملف CSS '%1' غير موجود. + + + Warning + تحذير + + + Some changed settings will require restarting Olive to take effect + بعض اﻹعدادات المعدلة تتطلب من زيتون إعادة التشغيل لتأخذ تأثيرها + + + + Confirm Reset All Shortcuts + أكّد تصفير كل اﻹختصارات + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + هل أنت متأكد أنك ترغب بتصفير جميع أختصارات لوحة المفاتيح لقيمهم اﻹفتراضية؟ + + + + Import Keyboard Shortcuts + أستيراد أخصارات لوحة المفاتيح + + + + + Error saving shortcuts + خطأ حفظ اﻹختصارات + + + + Failed to open file for reading + فشل في فتح الملف للقراءة + + + + Export Keyboard Shortcuts + تصدير أختصارات لوحة المفاتيح + + + + Export Shortcuts + تصدير اﻹختصارات + + + + Shortcuts exported successfully + صُدرت اﻷختصارات بنجاح + + + + Failed to open file for writing + فشل في فتح الملف للكتابة + + + + Browse for CSS file + أبحث عن ملف CSS + + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + + Language: + اللغة: + + + + Default Sequence Settings + + + + + Add Default Effects to New Clips + + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + + + + + Selecting Also Seeks + تحديد العروضات إيضاً + + + + Edit Tool Also Seeks + أداة التحرير تعرض إيضاً + + + + Edit Tool Selects Links + أداة التحرير تحدد الروابط + + + + Seek Also Selects + العرض يحدد إيضاً + + + + Seek to the End of Pastes + أعرض لنهاية الملصوقات + + + + Scroll Wheel Zooms + العجلة الدوراة تُقرّب + + + + Hold CTRL to toggle this setting + + + + + Invert Timeline Scroll Axes + + + + + Enable Drag Files to Timeline + أسمح بسحب الملفات للخط الزمني + + + + Auto-Scale By Default + التحجيم-التلقائي إفتراضياً + + + + Auto-Seek to Imported Clips + + + + + Audio Scrubbing + حكّ شريط الصوت + + + + Drop Files on Media to Replace + + + + + Enable Hover Focus + فعّل التركيز الحائم + + + + Ask For Name When Setting Marker + أسال عن اﻷسم حين وضع المؤشر + + + + Appearance + + + + + Theme + + + + + Olive Dark (Default) + + + + + Olive Light + + + + + Native + + + + + Native (Light Icons) + + + + + Use Native Menu Styling + + + + + Custom CSS: + CSS مخصوص: + + + + Browse + تصفّح + + + + Image sequence formats: + صيغ صور المقاطع: + + + + Audio Recording: + تسجيل الصوت: + + + + Mono + اُحادي + + + + Stereo + مُجسم + + + + Effect Textbox Lines: + للمراجعة + أثر بسطور صندوق النص: + + + + Default Sequence + + + + + Thumbnail Resolution: + دقّة الصورة المصغرة: + + + + Waveform Resolution: + دقّة الشكل الموجي: + + + + Delete Previews + + + + + Use Software Fallbacks When Possible + أستعمل معالجة البرمجيات حين اﻹمكان + + + + General + عام + + + + Behavior + السلوك + + + Disable Multithreading on Images + عطل تعدد المعالجات بالصور + + + Seeking + للمراجعة + التنزيل + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + للمراجعة + عرض دقيق +دوماً أظهر اﻹطار الصحيح (البصريات قد تتوقف بإيجاز كلما تستجلب اﻹطارات بدقة) + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + للمراجعة الشديدة + سرعة النقل +أنقل بسرعة (قد يعمق روئية اﻹطارات غير الصحيحة - لا يؤثر الترديد/تصدير) + + + + Memory Usage + أستعمال الذاكرة + + + + Upcoming Frame Queue: + إطار الصف القادم: + + + + + frames + اﻹطارات + + + + + seconds + الثوان + + + + Previous Frame Queue: + إطار الصف السابق: + + + + Playback + للمراجعة + الترديد + + + + Output Device: + جهاز اﻹخراج: + + + + + Default + إفتراضي + + + + Input Device: + جهاز اﻹدخال: + + + + Sample Rate: + معدل الإعتيان: + + + + Audio + الصوت + + + + Search for action or shortcut + ابحث عن إجراء أو أختصار + + + + Action + إجراء + + + + Shortcut + أختصار + + + + Import + أستيراد + + + + Export + تصدير + + + + Reset Selected + صفّر المحدد + + + + Reset All + صفّر الجميع + + + + Keyboard + لوحة المفاتيح + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + + + + + Could not open file - %1 + لا يمكن فتح الملف - %1 + + + + Could not find stream information - %1 + لم يتم العثور على ملومات التدفق - %1 + + + + Project + + + New + جديد + + + + Open Project + + + + + Save Project + + + + + Undo + + + + + Redo + أعد + + + + Tree View + مظهر الشجرة + + + + Icon View + مظهر الإيقونات + + + + List View + + + + + Search media, markers, etc. + بحث وسائط, علامات, إلخ. + + + + Project + المشروع + + + + Sequence + مقطع + + + + Replace '%1' + أستبدل '%1' + + + + + All Files + كل الملفات + + + + + No active sequence + لا مقاطع نشطة + + + + No sequence is active, please open the sequence you want to replace clips from. + لا مقطع نشط, رجاءً أفتح المقطع التي تريد أستبدال الجزء منه. + + + + Active sequence selected + مقطع نشط محدد + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + لا يمكنك إدراج المقطع بنفسه, لذا لا جزئيات من هذه الوسائط ستكون بهذا المقطع. + + + + Rename '%1' + أعد تسمية '%1' + + + + Enter new name: + أدخل اﻷسم الجديد: + + + + Delete media in use? + أحذف الوسائط المستعملة؟ + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + الوسائط '%1' حالياً مستعملة ب '%2'. حذفه سوف يحذف جميع حالات المقطع. هل أنت متأكد أنك تريد فعل هذا؟ + + + + Skip + تخطى + + + + Import a Project + + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + + + + + Image sequence detected + تم التعرف على مقاطع صور + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + الملف '%1' يبدو كأنه جزء من سلسلة صور. هل تريد أستيراده هكذا؟ + + + + Import media... + أستيراد وسائط... + + + + No sequence is active, please open the sequence you want to delete clips from. + لا مقطع نشط, رجاءً أفتح المقطع المراد حذف جزء منه. + + + + ProxyDialog + + + Create Proxy + أنشئ وسيط + + + + Proxy + وسيط + + + + Dimensions: + اﻷبعاد: + + + + Same Size as Source + نفس حجم المصدر + + + + Half Resolution (1/2) + نصف الدقّة (1/2) + + + + Quarter Resolution (1/4) + ربع الدقّة (1/4) + + + + Eighth Resolution (1/8) + ثُمن الدقة (1/8) + + + + Sixteenth Resolution (1/16) + ستة أعشار الدقّة (1/16) + + + + Format: + صيغة: + + + + ProRes HQ + جودة عالية أحترافية (ProRes HQ) + + + + Location: + الموقع: + + + + Same as Source (in "%1" folder) + مثل المصدر (في مجلد "%1") + + + + Proxy file exists + ملف الوسيط موجود + + + + The file "%1" already exists. Do you wish to replace it? + الملف "%1" موجود مسبقاً. هل ترغب بأستبداله؟ + + + + Custom Location + موقع مخصوص + + + + ProxyGenerator + + + Finished generating proxy for "%1" + أنتهى توليد وسيط إلى "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + أستبدل المقاطع بأستعمال "%1" + + + + Select which media you want to replace this media's clips with: + أختار إي الوسائط تريد أستبدالها لمقاطع الوسائط هذخ مع: + + + + Keep the same media in-points + ضع ذات الوسائط في نقاط + + + + Replace + أستبدل + + + + Cancel + إلغاء + + + + No media selected + لا وسائط محددة + + + + Please select a media to replace with or click 'Cancel'. + رجاءً أختر الوسائط للأستبدال مع أو أنقر 'إلغاء'. + + + + Same media selected + ذات الوسائط مختارة + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + أخترت ذات الوسائط المراد أستبدالها. رجاءً أختر غيرها أو أنقر 'إلغاء'. + + + + Folder selected + مجلد محدد + + + + You cannot replace footage with a folder. + لا يمكنك أستبدال اللقطات مع مجلد. + + + + Active sequence selected + مقاطع نشطة محددة + + + + You cannot insert a sequence into itself. + لا يسعك إدراج مقطع في نفسه. + + + + RichTextEffect + + + Text + النص + + + + Padding + + + + + Position + الموضع + + + + Vertical Align: + + + + + Top + أعلى + + + + Center + المركز + + + + Bottom + القاع + + + + Auto-Scroll + + + + + Off + مطفئ + + + + Up + + + + + Down + + + + + Left + يسار + + + + Right + يمين + + + + Shadow + الظل + + + + Shadow Color + لون الظل + + + + Shadow Angle + + + + + Shadow Distance + مسافة الظل + + + + Shadow Softness + نعومة الظل + + + + Shadow Opacity + عتمة الظل + + + + Sequence + + + %1 (copy) + %1 (نسخ) + + + + ShakeEffect + + + Intensity + للمراجعة(كثافة أم شدة) + الكثافة + + + + Rotation + الدوران + + + + Frequency + التردد + + + + SolidEffect + + + Type + النوع + + + + Solid Color + لون صلب + + + + SMPTE Bars + ألواح SMPTE + + + + Checkerboard + لوح التدقيق + + + + Opacity + العتمة + + + + Color + اللون + + + + Checkerboard Size + حجم لوح التدقيق + + + + SourcesCommon + + + Import... + أستيراد... + + + + New + جديد + + + + View + أظهر + + + + Tree View + مظهر الشجرة + + + + Icon View + مظهر الإيقونات + + + + Show Toolbar + أظهر لوح اﻷدوات + + + + Show Sequences + أظهر المقاطع + + + + Replace/Relink Media + أستبدل/أعد ربط الوسائط + + + + Reveal in Explorer + أظهر في الكاشف + + + + Reveal in Finder + أظهر في البحث + + + + Reveal in File Manager + أظهر بمتصفح الملفات + + + + Replace Clips Using This Media + أستبدل المقاطع مستعملاً هذه الوسائط + + + + Create Sequence With This Media + أنشئ مقطع مع هذه الوسائط + + + + Duplicate + أستنساخ + + + + Delete All Clips Using This Media + أحذف جميع هذه المقاطع المستعملة هذه الوسائط + + + + Proxy + وسيط + + + + Generating proxy: %1% complete + توليد الوسيط: %1% أكتمل + + + + Create/Modify Proxy + أنشئ/غيّر وسيط + + + + Create Proxy + أنشئ وسيط + + + + Modify Proxy + غيّر الوسيط + + + + Restore Original + أستعد اﻷصل + + + + Delete + حذف + + + + Preview in Media Viewer + + + + + Properties... + الخصائص... + + + + Replace Media + أستبدل الوسائط + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + أنت أوقعت ملفً على '%1' هل تريد أستبداله مع الملف المرمي؟ + + + + Delete proxy + حذف وسيط + + + + Would you like to delete the proxy file "%1" as well? + هل تريد حذف ملف الوسيط "%1" إيضاً؟ + + + + SpeedDialog + + Dialog + الحوار + + + + Speed: + السرعة: + + + + Frame Rate: + معدل اﻹطارات: + + + + Duration: + المدة: + + + + Speed/Duration + السرعة/المدّة + + + + Reverse + معكوس + + + + Maintain Audio Pitch + للمراجعة + حافظ على حدة الصوت + + + + Ripple Changes + تغيرات الموجة + + + + TextEditDialog + + + Edit Text + عدّل النص + + + + Thin + + + + + Extra Light + + + + + Light + + + + + Normal + عادي + + + + Medium + + + + + Demi Bold + + + + + Bold + + + + + Extra Bold + + + + + Black + + + + + TextEditEx + + + Edit Text + عدّل النص + + + + &Edit Text + &عدل النص + + + + TextEffect + + + Text + النص + + + + Font + الخط + + + + Size + الحجم + + + + Color + اللون + + + + Alignment + محاذاة + + + + Left + يسار + + + + + Center + المركز + + + + Right + يمين + + + + Justify + تسوية + + + + Top + أعلى + + + + Bottom + القاع + + + + Word Wrap + لُف الكلمة + + + + Padding + + + + + Position + الموضع + + + + Outline + الخلاصة + + + + Outline Color + لون الخلاصة + + + + Outline Width + عرض الخلاصة + + + + Shadow + الظل + + + + Shadow Color + لون الظل + + + + Shadow Angle + + + + + Shadow Distance + مسافة الظل + + + + Shadow Softness + نعومة الظل + + + + Shadow Opacity + عتمة الظل + + + + Sample Text + عينة نص + + + &Edit Text + &عدل النص + + + + TimecodeEffect + + + Timecode + شفرة الوقت + + + + Sequence + مقطع + + + + Media + الوسائط + + + + Scale + المقياس + + + + Color + اللون + + + + Background Color + لون الخلفية + + + + Background Opacity + عتمة الخلفية + + + + Offset + اﻷزاحة + + + + Prepend + باحجة للمراجعة + البادئة + + + + Timeline + + + Timeline: + الخط الزمني: + + + <none> + <لا شيء> + + + + Nested Sequence + مقطع متشعب + + + + Effect already exists + المؤثر موجود مسبقاً + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + المقطع '%1' يحتوي على المؤثر '%2'. هل تفضل أستبداله مع الملصوق أو إضافته كمؤثر منفصل؟ + + + + Add + أضف + + + + Replace + أستبدل + + + + Skip + تخطى + + + + Do this for all conflicts found + أفعل هذا مع كل التعارضات الموجودة + + + + Title... + العنوان... + + + + Solid Color... + بحاجة لمتابعة + لون صلب... + + + + Bars... + ألواح... + + + + Tone... + نغّم... + + + + Noise... + ضجيج... + + + + Unsaved Project + مشروع غير محفوظ + + + + You must save this project before you can record audio in it. + يجب عليك حفظ المشروع قبل تسجيل الصوت فيه. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + أنقر على الخط الزمني حيث تريد بدء التسجيل (أسحب لوضع حد للتسجيل في إطار وقت معين) + + + + (none) + (لا شيء) + + + + Pointer Tool + أداة المؤشر + + + + Edit Tool + أداة التحرير + + + + Ripple Tool + أداة الموجة + + + + Razor Tool + أداة القطع + + + + Slip Tool + بحاجة لمتابعة + أداة المنزلقة + + + + Slide Tool + أداة الشريحة + + + + Hand Tool + أداة اليد + + + + Transition Tool + أداة اﻷنتقال + + + + Snapping + بحاجة لمتابعة + الساحبة + + + + Zoom In + تقريب + + + + Zoom Out + أبتعاد + + + + Record audio + سجّل الصوت + + + + Add title, solid, bars, etc. + أضف عنوان, صلب, ألواح, إلخ. + + + + TimelineHeader + + + Center Timecodes + وسّط رمز الوقت + + + + TimelineWidget + + + &Undo + &تراجع + + + + &Redo + &أعد + + + C&ut + قط&ع + + + Cop&y + &نسخ + + + &Paste + &لصق + + + R&ipple Delete + حذف مو&جة + + + + Sequence Settings + اﻷعدادات المقطع + + + + &Speed/Duration + &السرعة/المدّة + + + Auto-s&cale + التحجيم-التلقا&ئي + + + Enable/Disable + تفعيل/تعطيل + + + Link/Unlink + ربط/فصل + + + &Nest + &تداخل + + + + &Reveal in Project + &أبرّز في المشروع + + + R&ename + أ&عد تسمية + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +بدء: %2 +أنتهاء: %3 +المدة: %4 + + + Rename '%1' + أعد تسمية '%1' + + + Rename multiple clips + أعد تسمية عدة مقاطع + + + Enter a new name for this clip: + أدخل أسم جديد لهذا المقطع: + + + + R&ipple Delete Empty Space + + + + + Auto-Cut Silence + + + + + Auto-S&cale + + + + + Properties + + + + + Error + خطأ + + + + Couldn't locate media wrapper for sequence. + لم يتم رصد موقع غلاف الوسائط للمقطع. + + + + Title + عنوان + + + + Solid Color + لون صلب + + + + Bars + ألواح + + + + Tone + نغّم + + + + Noise + ضجيج + + + + Duration: + المدة: + + + + ToneEffect + + + Type + نوع + + + + Sine + + + + + Frequency + التردد + + + + Amount + مقدار + + + + Mix + دمج + + + + TransformEffect + + + Position + الموضع + + + + Scale + المقياس + + + + Uniform Scale + المقياس الموحد + + + + Rotation + الدوران + + + + Anchor Point + نقطة المرساة + + + + Opacity + العتمة + + + + Blend Mode + طور المزج + + + + Normal + عادي + + + Darken + ظلّم + + + Multiply + ضاعف + + + Color Burn + حرق اللون + + + Linear Burn + حرق خطي + + + Lighten + خفّف + + + Screen + شاشة + + + Color Dodge + بحاجة لمتابعة + تلفيق اللون + + + Linear Dodge (Add) + تلفيق خطي (أضف) + + + Overlay + غطاء + + + Soft Light + ضوء ناعم + + + Hard Light + ضوء خشن + + + Vivid Light + بحاجة لمتابعة + ضوء حيوي + + + Linear Light + ضوء خطي + + + Pin Light + بحاجة لمتابعة + ضوء الدبوس + + + Hard Mix + بحاجة لمتابعة + دمج صلب + + + Difference + فرق + + + Exclusion + حصر + + + Reflect + أنعكاس + + + Substract + طرح + + + Average + متوسط + + + Glow + توهج + + + Negation + نفي + + + Phoenix + فينيكس + + + + Transition + + Length: + الطول: + + + + Length + + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + + + + + VSTHost + + + + Error loading VST plugin + خطأ تحميل إضافة VST + + + Failed to create VST reference + فشل إنشاء مرجع VST + + + + Failed to load VST plugin "%1": %2 + فشب تحميل إضافة VST "%1": %2 + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + ملحوظة: لا يمكنك تحميل إضافة VST 32-بت لنسخة زيتون مبنية ل64-بت. رجاءً جد نسخة 64-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 32-بت. + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + ملحوظة: لا يمكنك تحميل إضافة VST 64-بت لنسخة زيتون مبنية ل32-بت. رجاءً جد نسخة 32-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 64-بت. + + + + Failed to locate entry point for dynamic library. + + + + + VST Error + خطأ VST + + + + Plugin's magic number is invalid + رقم اﻹضافة السحري غير صالح + + + + Plugin + إضافة + + + + Interface + واجهة + + + + Show + أظهر + + + + VST Plugin + إضافة VST + + + + Viewer + + + Sequence Viewer + عارض المقطع + + + + Media Viewer + عارض الوسائط + + + + (none) + (لا شيء) + + + + Drag video only + + + + + Drag audio only + + + + + ViewerWidget + + + Save Frame as Image... + احفظ اﻹطار كصورة... + + + + Show Fullscreen + أظهر ملء الشاشة + + + + Disable + تعطيل + + + + Screen %1: %2x%3 + الشاشة %1: %2x%3 + + + + Zoom + قرّب + + + + Fit + وائم + + + + Custom + مخصوص + + + + Close Media + أغلق الوسائط + + + + Save Frame + أحفظ اﻹطار + + + + Viewer Zoom + تقريب الرؤية + + + + Set Custom Zoom Value: + حدد قيمة تقريب مخصصة: + + + + ViewerWindow + + + Exit Fullscreen + الخروج من ملء الشاشة + + + + VoidEffect + + + (unknown) + (غير معلوم) + + + + Missing Effect + تأثير مفقود + + + + VolumeEffect + + + Volume + درجة الصوت + + + + transition + + + Invalid transition + أنتقال غير صالح + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + لا مرشح للأنتقال '%1'. هذه اﻷنتقالة قد تكون فاسدة. جرب إعادة تثبيتها أو زيتون. + + + diff --git a/app/ts/bs_BS.ts b/app/ts/bs_BS.ts new file mode 100644 index 000000000..d05f177b3 --- /dev/null +++ b/app/ts/bs_BS.ts @@ -0,0 +1,3716 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + To the best of my knowledge, there is no translation for free as in libre that sounds quite as nicely as slobodan. + Olive je nelinearni video uređivač. Ovaj software je slobodan i zaštićen GNU GPL-om. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive tim je pod obavezom da obavijesti svoje korisnike da je Olive-ov izvorni kod dostupan za preuzimanje sa njegove web stranice + + + + ActionSearch + + + Search for action... + Potražite radnju... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Napredne video postavke + + + + Pixel Format: + Format piksela: + + + + Threads: + + + + + Audio + + Audio + Audio + + + Recording + Snimanje + + + + %1 Audio + %1 Audio + + + + Recording %1 + Snimanje %1 + + + + AudioNoiseEffect + + + Amount + Količina + + + + Mix + Miks + + + + AutoCutSilenceDialog + + + Cut Silence + + + + + Attack Threshold: + + + + + Attack Time: + + + + + Release Threshold: + + + + + Release Time: + + + + + Cacher + + + + Could not open %1 - %2 + + + + + ChannelLayoutName + + + Invalid + Nevažeće + + + + Mono + Mono + + + + Stereo + Stereo + + + + ClipPropertiesDialog + + + "%1" Properties + + + + + Multiple Clip Properties + + + + + Name: + + + + + Duration: + + + + + (multiple) + + + + + CollapsibleWidget + + + <untitled> + <neimenovano> + + + + ColorButton + + + Set Color + Postavi boju + + + + CornerPinEffect + + + Top Left + Gornje lijevo + + + + Top Right + Gornje desno + + + + Bottom Left + Donje lijevo + + + + Bottom Right + Donje desno + + + + Perspective + Perspektiva + + + + DebugDialog + + + Debug Log + Zapis za debugiranje + + + + DemoNotice + + + + Welcome to Olive! + Dobrodošli u Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive je slobodan video uređivač sa otvorenim izvornim kodom izdan pod GNU GPL-om. Ako ste platili za ovaj software, vi ste bili prevareni. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Ovaj software je trenutno u ALFA stanju, što znači da je nestabilan i veoma je vjerovatno da će se srušiti, imati greške i da ne dostaje nekih mogućnosti. Mi ne dajemo nikakvu garanciju, tako da koristite na svoj sopstveni rizik. Molimo da prijavite sve greške i željene funkcije na %1 + + + + Thank you for trying Olive and we hope you enjoy it! + Hvala što isprobavate Olive i nadamo se da ćete uživati u njemu! + + + + Effect + + + Invalid effect + Nevažeći efekat + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + Nema kandidata za efekat '%1'. Moguće je da je ovaj efekat koruptiran. Pokušajte ponovno instalirati njega ili Olive. + + + Cu&t + I'll have to check back on this later to see how it works with the keyboard in practice + &Reži + + + &Copy + &Kopiraj + + + Move &Up + Pomjeri &gore + + + Move &Down + Pomjeri &dolje + + + D&elete + &Obriši + + + Load Settings From File + Učitaj postavke iz datoteke + + + Save Settings to File + Spasi postavke u datoteku + + + + Save Effect Settings + Spasi postavke efekata + + + + + Effect XML Settings %1 + XML postavke-efekta %1 + + + + Save Settings Failed + Spašavanje postavki neuspješno + + + + Failed to open "%1" for writing. + Neuspješno otvaranje "%1" za uređivanje. + + + + Load Effect Settings + Učitaj postavke efekta + + + + + Load Settings Failed + Učitavanje postavki neuspješno + + + + Failed to open "%1" for reading. + Neuspješno otvaranje "%1" za čitanje. + + + + This settings file doesn't match this effect. + Ova datoteka postavki nije prikladna za ovaj efekat. + + + + EffectControls + + + Effects: + Efekti: + + + &Paste + &Zalijepi + + + + (none) + (nema) + + + + Add Video Effect + Dodaj video efekat + + + + VIDEO EFFECTS + VIDEO EFEKTI + + + + Add Video Transition + Dodaj video prelaz + + + + Add Audio Effect + Dodaj audio efekat + + + + AUDIO EFFECTS + AUDIO EFEKTI + + + + Add Audio Transition + Dodaj audio prelaz + + + (Multiple clips selected) + (Vše snimki je odabrano) + + + + EffectRow + + + Disable Keyframes + Onemogući ključne kadrove + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Onemogućavanje ključnih kadrova će obrisati sve trenutne ključne kadrove. Da li ste sigurni da želite ovo uraditi? + + + + EffectUI + + + %1 (Opening) + + + + + %1 (Closing) + + + + + %1 (multiple) + + + + + Cu&t + &Reži + + + + &Copy + &Kopiraj + + + + Move &Up + Pomjeri &gore + + + + Move &Down + Pomjeri &dolje + + + + D&elete + &Obriši + + + + Load Settings From File + Učitaj postavke iz datoteke + + + + Save Settings to File + Spasi postavke u datoteku + + + + EmbeddedFileChooser + + + File: + Datoteka: + + + + ExportDialog + + + Export "%1" + Izvoz "%1" + + + + Unknown codec name %1 + Nepoznato ime kodeka %1 + + + + Export Failed + Izvoz neuspješan + + + + Export failed - %1 + Izvoz neuspješan - %1 + + + + Invalid dimensions + Nevažeće dimenzije + + + + Export width and height must both be even numbers/divisible by 2. + Visina i širina izvoza obje moraju biti parni brojevi/djeljive sa dva. + + + + Invalid codec + Nevažeći kodek + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Parametri odabranog kodeka se nisu mogli odrediti. Ovo je greška, molimo da kontaktirate developere. + + + + Invalid format + Nevažeći format + + + + Couldn't determine output format. This is a bug, please contact the developers. + Izlazni format se nije mogao odrediti. Ovo je greška, molimo da kontaktirate developere. + + + + Export Media + Izvoz medija + + + + %p% (Total: %1:%2:%3) + + + + + %p% (ETA: %1:%2:%3) + + + + + Quality-based (Constant Rate Factor) + Bazirano na kvaliteti (Faktor stalne stope/Constant Rate Factor) + + + + Constant Bitrate + Stalna stopa bitova + + + + + Invalid Codec + Nevažeći kodek + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Traganje za prikladnim koderom za ovaj kodek nije uspjelo. Izvoz najvjerovatnije neće uspjeti. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Traganje za prikladnim formatom piksela za ovaj kodek nije uspjelo. Izvoz najvjerovatnije neće uspjeti. + + + + Bitrate (Mbps): + Stopa bitova (Mbps): + + + + Quality (CRF): + Kvaliteta (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Faktor kvalitete: + +0 = besprijekorno +17-18 = oku besprijekorno (komprimirano, ali neprimjetno) +23 = visoka kvaliteta +51 = najniža kvaliteta moguća + + + + Target File Size (MB): + Željena veličina datoteke (MB): + + + + Format: + Format: + + + + Range: + Raspon: + + + + Entire Sequence + Čitava sekvenca + + + + In to Out + I have no clue what to call this really, it only plays sound, but that's not in the name, so I can't mention sound, so I assume that "in" and "out" reference the in and out points respectively. + Od početka do kraja + + + + Video + Video + + + + + Codec: + Kodek: + + + + Width: + Širina: + + + + Height: + Visina: + + + + Frame Rate: + Okvirna stopa: + + + + Compression Type: + Tip komprimacije: + + + + Advanced + Napredno + + + + Audio + Audio + + + + Sampling Rate: + Stopa uzoraka: + + + + Bitrate (Kbps/CBR): + Stopa bitova (Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + Slanje okvira koderu nije uspjelo (%1) + + + + failed to receive packet from encoder (%1) + Primanje paketa od kodera nije uspjelo (%1) + + + + could not video encoder for %1 + Nije mogao video koder za %1 + + + + could not allocate video stream + Video tok se nije mogao zauzeti + + + + could not allocate video encoding context + Kontekst video kodiranja se nije moago zauzeti + + + + could not open output video encoder (%1) + Izlazni video koder se nije moago otvoriti (%1) + + + + could not copy video encoder parameters to output stream (%1) + Parametri video kodera se nisu mogli kopirati u izlazni tok (%1) + + + + could not audio encoder for %1 + Not sure if there should be anything in between "not" and "audio" + Nije mogao audio koder za %1 + + + + could not allocate audio stream + Audio tok se nije mogao zauzeti + + + + could not allocate audio encoding context + Kontekst audio kodiranja se nije mogao zauzeti + + + + could not open output audio encoder (%1) + Izlaz audio kodera se nije mogao otvoriti (%1) + + + + could not copy audio encoder parameters to output stream (%1) + Parametri audio kodera se nisu mogli kopirati u izlazni tok (%1) + + + + could not allocate audio buffer (%1) + Audio međuspremnik se nije mogao zauzeti (%1) + + + + could not create output format context + Kontekst izlaznog formata se nije mogao stvoriti + + + + could not open output file (%1) + Izlazna datoteka se nije mogla otvoriti (%1) + + + + could not write output file header (%1) + Zaglavlje izlazne datoteke se nije moglo ispisati (%1) + + + + could not write output file trailer (%1) + Zaglavlje izlazne datoteke se nije moglo ispisati (%1) + + + + FillLeftRightEffect + + + Type + Tip + + + + Fill Left with Right + Popuni lijevo sa desnim + + + + Fill Right with Left + Popuni desno sa lijevim + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Not sure if that's completely accurate, as I have not seen this dialog and the text itself is somewhat ambiguous regarding the placeholders' functions + Učitavanje Frei0r dodatka nije uspjelo "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + PAŽNJA: Vi ne možete učitavati 32-bitne Frei0r dodatke u 64-bitno izdanje Olive-a. Molimo nađite 64-bitno izdanje ovih dodataka, ili pređite na 32-bitno izdanje Olive-a. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + PAŽNJA: Vi ne možete učitavati 64-bitne Frei0r dodatke u 32-bitno izdanje Olive-a. Molimo nađite 32-bitno izdanje ovih dodataka, ili pređite na 64-bitno izdanje Olive-a. + + + + Error loading Frei0r plugin + Greška pri učitavanju Frei0r dodataka + + + + GraphEditor + + + Graph Editor + Uređivač grafikona + + + + Linear + Linearno + + + + Bezier + Bezier + + + + Hold + Drži + + + + GraphView + + + Zoom to Selection + Povećaj ka odabiru + + + + Zoom to Show All + Povećaj ka svemu + + + + Reset View + Vrati prvobitni prikaz + + + + InterlacingName + + + None (Progressive) + Nema (progresivno) + + + + Top Field First + Gornje polje prvo + + + + Bottom Field First + Donje polje prvo + + + + Invalid + Nevažeće + + + + KeyframeNavigator + + + Enable Keyframes + Omogući ključne kadrove + + + + KeyframeView + + + Linear + Linearno + + + + Bezier + Bezier + + + + Hold + Drži + + + + LabelSlider + + + &Edit + + + + + &Reset to Default + + + + + + Set Value + Odredi vrijednost + + + + + New value: + Nova vrijednost: + + + + LoadDialog + + + Loading... + Učitavanje... + + + + Loading '%1'... + Učitavanje "%1"... + + + + Cancel + Prekini + + + + LoadThread + + + Version Mismatch + Verzije se ne poklapaju + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Ovaj projekat je bio spašen u drugačijoj verziji Olive-a i moguće je da nije u potpunosti kompatibilan sa ovom verzijom. Da li još uvijek želite probati učitati projekat? + + + + Invalid Clip Link + Nevažeća veza snimke + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Ovaj projekat sadrži nevažeću vezu snimke. Moguće je da je koruptiran. Da li biste htjeli da ga nastavite učitavati? + + + + %1 - Line: %2 Col: %3 + %1 - Red: %2 Kolona: %3 + + + + User aborted loading + Korisnik je prekinuo učitavanje + + + + XML Parsing Error + Greška u parsiranju XML-a + + + + Couldn't load '%1'. %2 + "%1": %2 se nije moglo učitati + + + + Project Load Error + Greška pri učitavanju projekta + + + + Error loading project: %1 + Greška pri učitavanju projekta: %1 + + + + MainWindow + + + Welcome to %1 + Dobrodišli u %1 + + + Auto-recovery + Automatski oporavak + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive se nije pravilno zatvorio i datoteka za automatsko obnavljanje je primjećena. Da li želite da ju otvorite? + + + + &File + + + + + &New + + + + + &Open Project + + + + + Clear Recent List + + + + + Open Recent + + + + + &Save Project + + + + + Save Project &As + + + + + &Import... + + + + + &Export... + + + + + E&xit + + + + + &Edit + + + + + &Undo + + + + + Redo + + + + Cu&t + &Reži + + + &Paste + &Zalijepi + + + + Select &All + + + + + Deselect All + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Track Lines + + + + + Rectified Waveforms + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Title/Action Safe Area + + + + + Off + + + + + Default + + + + + 4:3 + + + + + 16:9 + + + + + Custom + + + + + Full Screen + + + + + Full Screen Viewer + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + + + Loop + + + + + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + Uređivač grafikona + + + + Media Viewer + + + + + Sequence Viewer + + + + + Maximize Panel + + + + + Lock Panels + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Auto-Cut Silence + + + + + No Auto-Scroll + + + + + Page Auto-Scroll + + + + + Smooth Auto-Scroll + + + + + Preferences + + + + + Clear Undo + + + + + &Help + + + + + A&ction Search + + + + + Debug Log + Zapis za debugiranje + + + + &About... + + + + + <untitled> + <neimenovano> + + + + Marker + + + Set Marker + + + + + Set clip marker name: + + + + + Set sequence marker name: + + + + + Media + + + New Folder + + + + + Name: + + + + + Filename: + + + + + Video Dimensions: + + + + + Frame Rate: + Okvirna stopa: + + + + %1 field(s) (%2 frame(s)) + + + + + Interlacing: + + + + + Audio Frequency: + + + + + Audio Channels: + + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + + + + + Name + + + + + Duration + + + + + Rate + + + + + MediaPropertiesDialog + + + "%1" Properties + + + + + Tracks: + + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + + + + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + + + + + Auto (%1) + + + + + Interlacing: + + + + + Name: + + + + + MenuHelper + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Set In Point + + + + + Set Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Cu&t + &Reži + + + + Cop&y + + + + + + &Paste + &Zalijepi + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Invalid aspect ratio + + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + + + NewSequenceDialog + + + Editing "%1" + + + + + New Sequence + + + + + Preset: + + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + + + + + Video + Video + + + + Width: + Širina: + + + + Height: + Visina: + + + + Frame Rate: + Okvirna stopa: + + + + Pixel Aspect Ratio: + + + + + Square Pixels (1.0) + + + + + Interlacing: + + + + + None (Progressive) + Nema (progresivno) + + + + Audio + Audio + + + + Sample Rate: + + + + + Name: + + + + + OliveGlobal + + + Olive Project %1 + + + + + Auto-recovery + Automatski oporavak + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive se nije pravilno zatvorio i datoteka za automatsko obnavljanje je primjećena. Da li želite da ju otvorite? + + + + Open Project... + + + + + Missing recent project + + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + + + + + Save Project As... + + + + + Unsaved Project + + + + + This project has changed since it was last saved. Would you like to save it before closing? + + + + + No active sequence + + + + + Please open the sequence to perform this action. + + + + + No clips selected + + + + + Select the clips you wish to auto-cut + + + + + Missing Project File + + + + + Specified project '%1' does not exist. + + + + + PanEffect + + + Pan + + + + + PreferencesDialog + + + Preferences + + + + + Default Sequence + + + + + Invalid CSS File + + + + + CSS file '%1' does not exist. + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + Browse for CSS file + + + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + + Language: + + + + + Default Sequence Settings + + + + + Add Default Effects to New Clips + + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + + + + + Hold CTRL to toggle this setting + + + + + Invert Timeline Scroll Axes + + + + + Enable Drag Files to Timeline + + + + + Auto-Scale By Default + + + + + Auto-Seek to Imported Clips + + + + + Audio Scrubbing + + + + + Drop Files on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + + + + + Appearance + + + + + Theme + + + + + Olive Dark (Default) + + + + + Olive Light + + + + + Native + + + + + Native (Light Icons) + + + + + Use Native Menu Styling + + + + + Custom CSS: + + + + + Browse + + + + + Image sequence formats: + + + + + Audio Recording: + + + + + Mono + Mono + + + + Stereo + Stereo + + + + Effect Textbox Lines: + + + + + Thumbnail Resolution: + + + + + Waveform Resolution: + + + + + Delete Previews + + + + + Use Software Fallbacks When Possible + + + + + General + + + + + Behavior + + + + + Memory Usage + + + + + Upcoming Frame Queue: + + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + + + + + Playback + + + + + Output Device: + + + + + + Default + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio + Audio + + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Keyboard + + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + + + + + Could not open file - %1 + + + + + Could not find stream information - %1 + + + + + Project + + + New + + + + + Open Project + + + + + Save Project + + + + + Undo + + + + + Redo + + + + + Tree View + + + + + Icon View + + + + + List View + + + + + Search media, markers, etc. + + + + + Project + + + + + Sequence + + + + + Replace '%1' + + + + + + All Files + + + + + + No active sequence + + + + + No sequence is active, please open the sequence you want to replace clips from. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + + + + + Rename '%1' + + + + + Enter new name: + + + + + Delete media in use? + + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + + + + + Skip + + + + + Import a Project + + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + + + + + Image sequence detected + + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + + + + + Import media... + + + + + No sequence is active, please open the sequence you want to delete clips from. + + + + + ProxyDialog + + + Create Proxy + + + + + Proxy + + + + + Dimensions: + + + + + Same Size as Source + + + + + Half Resolution (1/2) + + + + + Quarter Resolution (1/4) + + + + + Eighth Resolution (1/8) + + + + + Sixteenth Resolution (1/16) + + + + + Format: + Format: + + + + ProRes HQ + + + + + Location: + + + + + Same as Source (in "%1" folder) + + + + + Proxy file exists + + + + + The file "%1" already exists. Do you wish to replace it? + + + + + Custom Location + + + + + ProxyGenerator + + + Finished generating proxy for "%1" + + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + + + + + Select which media you want to replace this media's clips with: + + + + + Keep the same media in-points + + + + + Replace + + + + + Cancel + Prekini + + + + No media selected + + + + + Please select a media to replace with or click 'Cancel'. + + + + + Same media selected + + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + + + + + Folder selected + + + + + You cannot replace footage with a folder. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself. + + + + + RichTextEffect + + + Text + + + + + Padding + + + + + Position + + + + + Vertical Align: + + + + + Top + + + + + Center + + + + + Bottom + + + + + Auto-Scroll + + + + + Off + + + + + Up + + + + + Down + + + + + Left + + + + + Right + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Angle + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sequence + + + %1 (copy) + + + + + ShakeEffect + + + Intensity + + + + + Rotation + + + + + Frequency + + + + + SolidEffect + + + Type + Tip + + + + Solid Color + + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + + + + + Color + + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + + + + + New + + + + + View + + + + + Tree View + + + + + Icon View + + + + + Show Toolbar + + + + + Show Sequences + + + + + Replace/Relink Media + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Replace Clips Using This Media + + + + + Create Sequence With This Media + + + + + Duplicate + + + + + Delete All Clips Using This Media + + + + + Proxy + + + + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + + Create Proxy + + + + + Modify Proxy + + + + + Restore Original + + + + + Delete + + + + + Preview in Media Viewer + + + + + Properties... + + + + + Replace Media + + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + + + + SpeedDialog + + + Speed/Duration + + + + + Speed: + + + + + Frame Rate: + Okvirna stopa: + + + + Duration: + + + + + Reverse + + + + + Maintain Audio Pitch + + + + + Ripple Changes + + + + + TextEditDialog + + + Edit Text + + + + + Thin + + + + + Extra Light + + + + + Light + + + + + Normal + + + + + Medium + + + + + Demi Bold + + + + + Bold + + + + + Extra Bold + + + + + Black + + + + + TextEditEx + + + Edit Text + + + + + &Edit Text + + + + + TextEffect + + + Text + + + + + Font + + + + + Size + + + + + Color + + + + + Alignment + + + + + Left + + + + + + Center + + + + + Right + + + + + Justify + + + + + Top + + + + + Bottom + + + + + Word Wrap + + + + + Padding + + + + + Position + + + + + Outline + + + + + Outline Color + + + + + Outline Width + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Angle + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sample Text + + + + + TimecodeEffect + + + Timecode + + + + + Sequence + + + + + Media + + + + + Scale + + + + + Color + + + + + Background Color + + + + + Background Opacity + + + + + Offset + + + + + Prepend + + + + + Timeline + + + Nested Sequence + + + + + Timeline: + + + + + Effect already exists + + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + + + + + Add + + + + + Replace + + + + + Skip + + + + + Do this for all conflicts found + + + + + Title... + + + + + Solid Color... + + + + + Bars... + + + + + Tone... + + + + + Noise... + + + + + Unsaved Project + + + + + You must save this project before you can record audio in it. + + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + + + + + (none) + (nema) + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Snapping + + + + + Zoom In + + + + + Zoom Out + + + + + Record audio + + + + + Add title, solid, bars, etc. + + + + + TimelineHeader + + + Center Timecodes + + + + + TimelineWidget + + + &Undo + + + + + &Redo + + + + &Paste + &Zalijepi + + + + Sequence Settings + + + + + &Speed/Duration + + + + + &Reveal in Project + + + + + %1 +Start: %2 +End: %3 +Duration: %4 + + + + + R&ipple Delete Empty Space + + + + + Auto-Cut Silence + + + + + Auto-S&cale + + + + + Properties + + + + + Error + + + + + Couldn't locate media wrapper for sequence. + + + + + Title + + + + + Solid Color + + + + + Bars + + + + + Tone + + + + + Noise + + + + + Duration: + + + + + ToneEffect + + + Type + Tip + + + + Sine + + + + + Frequency + + + + + Amount + Količina + + + + Mix + Miks + + + + TransformEffect + + + Position + + + + + Scale + + + + + Uniform Scale + + + + + Rotation + + + + + Anchor Point + + + + + Opacity + + + + + Blend Mode + + + + + Normal + + + + + Transition + + + Length + + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + + + + + VSTHost + + + + Error loading VST plugin + + + + + Failed to load VST plugin "%1": %2 + + + + + Failed to locate entry point for dynamic library. + + + + + VST Error + + + + + Plugin's magic number is invalid + + + + + Plugin + + + + + Interface + + + + + Show + + + + + VST Plugin + + + + + Viewer + + + Sequence Viewer + + + + + Media Viewer + + + + + (none) + (nema) + + + + Drag video only + + + + + Drag audio only + + + + + ViewerWidget + + + Save Frame as Image... + + + + + Show Fullscreen + + + + + Disable + + + + + Screen %1: %2x%3 + + + + + Zoom + + + + + Fit + + + + + Custom + + + + + Close Media + + + + + Save Frame + + + + + Viewer Zoom + + + + + Set Custom Zoom Value: + + + + + ViewerWindow + + + Exit Fullscreen + + + + + VoidEffect + + + (unknown) + + + + + Missing Effect + + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + diff --git a/app/ts/cs_CS.ts b/app/ts/cs_CS.ts new file mode 100644 index 000000000..ab43bae78 --- /dev/null +++ b/app/ts/cs_CS.ts @@ -0,0 +1,3841 @@ + + + + + AboutDialog + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive je nelineární editor obrazového záznamu. Tento program je zdarma a chráněn GNU GPL. + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Družstvo Olive se dává na vědomí, že zdrojové kódy Olive jsou dostupné pro stažení na internetové stránce projektu. + + + + ActionSearch + + Search for action... + Hledat činnost... + + + + AdvancedVideoDialog + + Advanced Video Settings + Pokročilá nastavení obrazu + + + Pixel Format: + Formát pixelu: + + + Threads: + Vlákna: + + + + Audio + + %1 Audio + %1 Zvuk + + + Recording %1 + Nahrávání %1 + + + + AudioNoiseEffect + + Mix + Smíchat + + + Amount + Množství + + + Noise + Šum + + + Generate audio noise that can be mixed with this clip. + Vytvořit zvukový šum, který může být smíchán s tímto záběrem. + + + + AutoCutSilenceDialog + + Cut Silence + Ořezat ticho + + + Attack Threshold: + Práh náběhu: + + + Attack Time: + Čas náběhu: + + + Release Threshold: + Práh uvolnění: + + + Release Time: + Čas uvolnění: + + + + Cacher + + Could not open %1 - %2 + Nepodařilo se otevřít %1 - %2 + + + + ChannelLayoutName + + Mono + Mono + + + Invalid + Neplatný + + + Stereo + Stereo + + + + ClipPropertiesDialog + + "%1" Properties + "%1" Vlastnosti + + + Multiple Clip Properties + Vlastnosti více záběrů + + + Name: + Název: + + + Duration: + Doba trvání: + + + (multiple) + (více) + + + + CollapsibleWidget + + <untitled> + + + + + ColorButton + + Set Color + Nastavit barvu + + + + CornerPinEffect + + Top Right + Nahoře vpravo + + + Bottom Left + Dole vlevo + + + Top Left + Nahoře vlevo + + + Perspective + Perspektiva + + + Bottom Right + Dole vpravo + + + Corner Pin + Rohový špendlík + + + Distort + Zprohýbat + + + Distort/warp this clip by pinning each of its four corners. + Pokřivit/Zkroutit tento záběr přišpendlením každého z jeho čtyř rohů. + + + + CrashDialog + + We're very sorry, Olive has crashed. Please send the following data to developers: + Je nám to velice líto. Olive spadl. Následující údaje, prosím, zašlete vývojářům: + + + + CrossDissolveTransition + + Cross Dissolve + Prolínat obraz křížem + + + Dissolves + Prolínání obrazu + + + Dissolve clips evenly. + Prolínat záběry rovnoměrně. + + + + DebugDialog + + Debug Log + Zápis ladění + + + + DemoNotice + + Welcome to Olive! + Vítejte v Olive! + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Tento program je v současnosti v Alfa verzi, což znamená, že je nestálý a velice pravděpodobně náchylný k pádům, má chyby a chybí mu funkce. Není poskytována žádná záruka, takže jej používejte na vlastní nebezpečí. Hlašte, prosím, jakékoli chyby nebo žádosti o funkce na %1 + + + Thank you for trying Olive and we hope you enjoy it! + Děkujeme vám za zkoušení Olive. Přejeme si, aby vám dělal radost! + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive je editor obrazového záznamu s otevřeným zdrojovým kódem vydaný pod GNU GPL. + + + + Effect + + Cu&t + Vyjmou&t + + + &Copy + &Kopírovat + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + Žádný uchazeč pro efekt '%1'. Tento přechod může být poškozen. Pokuste se jej nebo Olive znovu nainstalovat. + + + Invalid effect + Neplatný efekt + + + Load Settings From File + Nahrát nastavení ze souboru + + + Load Effect Settings + Nahrát nastavení efektu + + + Move &Up + Posunout &nahoru + + + D&elete + S&mazat + + + Move &Down + Posunout &dolů + + + Save Settings Failed + Nastavení se nepodařilo uložit + + + Save Effect Settings + Uložit nastavení efektu + + + Load Settings Failed + Nastavení se nepodařilo nahrát + + + This settings file doesn't match this effect. + Tento soubor s nastavením neodpovídá tomuto efektu. + + + Effect XML Settings %1 + Nastavení XML efektu %1 + + + Failed to open "%1" for reading. + Nepodařilo se otevřít "%1" pro čtení. + + + Save Settings to File + Uložit nastavení do souboru + + + Failed to open "%1" for writing. + Nepodařilo se otevřít "%1" pro zápis. + + + + EffectControls + + Add Audio Effect + Přidat zvukový efekt + + + Add Video Effect + Přidat obrazový efekt + + + &Paste + &Vložit + + + (none) + (žádný) + + + VIDEO EFFECTS + OBRAZOVÉ EFEKTY + + + Add Audio Transition + Přidat zvukový přechod + + + Add Video Transition + Přidat obrazový přechod + + + Effects: + Efekty: + + + (Multiple clips selected) + (vybráno více záběrů) + + + AUDIO EFFECTS + ZVUKOVÉ EFEKTY + + + + EffectRow + + Disable Keyframes + Zakázat klíčové snímky + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Zákázání klíčových snímků smaže všechny nynější klíčové snímky. Opravdu to chcete udělat? + + + + EffectUI + + %1 (Opening) + %1 (otevření) + + + %1 (Closing) + %1 (zavření) + + + %1 (multiple) + %1 (více) + + + Cu&t + Vyjmou&t + + + &Copy + &Kopírovat + + + Move &Up + Posunout &nahoru + + + Move &Down + Posunout &dolů + + + D&elete + S&mazat + + + Load Settings From File + Nahrát nastavení ze souboru + + + Save Settings to File + Uložit nastavení do souboru + + + + EmbeddedFileChooser + + File: + Soubor: + + + + ExponentialFadeTransition + + Exponential Fade + Exponenciální prolínání + + + An exponential audio fade that starts slow and ends fast. + Exponenciální prolínání zvuku, které začíná pomalu a končí rychle. + + + + ExportDialog + + Audio + Zvuk + + + Video + Obraz + + + Sampling Rate: + Rychlost vzorkování: + + + Invalid dimensions + Neplatné rozměry + + + Export Media + Vyvést záznam + + + Invalid format + Neplatný formát + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Faktor kvality: + +0 = bezztrátová +17-18 = beze ztrát na obraze (komprimace, ale nepozorovatelná) +23 = vysoká jakost +51 = nejnižší možná jakost + + + Constant Bitrate + Stálý datový tok + + + Codec: + Kodek: + + + Couldn't determine output format. This is a bug, please contact the developers. + Nepodařilo se určit výstupní formát. Toto je chyba. Spojte se, prosím, s vývojáři. + + + Range: + Rozsah: + + + Width: + Šířka: + + + Invalid Codec + Neplatný kodek + + + Invalid codec + Neplatný kodek + + + Frame Rate: + Snímkování: + + + Entire Sequence + Celý úryvek (sled záběrů) + + + In to Out + Vstup do výstupu + + + Export Failed + Nepodařilo se vyvést + + + Unknown codec name %1 + Neznámý název kodeku %1 + + + Target File Size (MB): + Velikost cílového souboru (MB): + + + Bitrate (Mbps): + Datový tok (MB/s): + + + Compression Type: + Typ komprese: + + + Export "%1" + Vyvést "%1" + + + Export width and height must both be even numbers/divisible by 2. + Šířka a výška pro vyvedení musí být sudá čísla dělitelná 2. + + + Quality (CRF): + Kvalita (CRF): + + + Quality-based (Constant Rate Factor) + Kvalita (Constant Rate Factor) + + + Export failed - %1 + Nepodařilo se vyvést - %1 + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Nepodařilo se určit výstupní parametry pro vybraný kodek. Toto je chyba. Spojte se, prosím, s vývojáři. + + + Advanced + Pokročilé + + + Bitrate (Kbps/CBR): + Datový tok (KB/s/stálý datový tok): + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Nepodařilo se najít vhodný kodér pro tento kodek. Vyvedení pravděpodobně selže. + + + Failed to find pixel format for this encoder. Export will likely fail. + Nepodařilo se najít formát pixelu pro tento kodér. Vyvedení pravděpodobně selže. + + + Format: + Formát: + + + Height: + Výška: + + + %p% (Total: %1:%2:%3) + %p% (Celkem: %1:%2:%3) + + + %p% (ETA: %1:%2:%3) + %p% (odhadovaný čas dokončení: %1:%2:%3) + + + + ExportThread + + could not create output format context + Nepodařilo se vytvořit kontext výstupního formátu + + + could not open output file (%1) + Nepodařilo se otevřít výstupní soubor (%1) + + + failed to receive packet from encoder (%1) + Chyba při přijetí paketu od kodéru (%1) + + + could not copy audio encoder parameters to output stream (%1) + Nepodařilo se kopírovat parametry kodéru zvuku do výstupního proudu (%1) + + + could not allocate audio encoding context + Nepodařilo se přiřadit kontext kódování zvuku + + + could not copy video encoder parameters to output stream (%1) + Nepodařilo se kopírovat parametry kodéru obrazu do výstupního proudu (%1) + + + failed to send frame to encoder (%1) + Chyba při poslání snímku kodéru (%1) + + + could not open output audio encoder (%1) + Nepodařilo se otevřít kodér zvuku (%1) + + + could not write output file trailer (%1) + Nepodařilo se zapsat ukázku výstupního souboru (%1) + + + could not audio encoder for %1 + Nepodařilo se najít kodér zvuku pro %1 + + + could not allocate video encoding context + Nepodařilo se přiřadit kontext kódování obrazu + + + could not write output file header (%1) + Nepodařilo se zapsat hlavičku výstupního souboru (%1) + + + could not video encoder for %1 + Nepodařilo se najít kodér obrazu pro %1 + + + could not allocate video stream + Nepodařilo se přiřadit datový proud obrazu + + + could not open output video encoder (%1) + Nepodařilo se otevřít kodér obrazu (%1) + + + could not allocate audio buffer (%1) + Nepodařilo se přiřadit vyrovnávací paměť zvuku (%1) + + + could not allocate audio stream + Nepodařilo se přiřadit datový proud zvuku + + + + FFmpegDecoder + + Failed to find appropriate decoder for this codec (%1 :: %2) + Nepodařilo se najít vhodný dekodér pro tento kodek (%1 :: %2) + + + Failed to allocate codec context (%1 :: %2) + Nepodařilo se přiřadit kontext kódeku (%1 :: %2) + + + Error decoding %1 - %2 %3 + Chyba při dekódování %1 - %2 %3 + + + + FillLeftRightEffect + + Type + Typ + + + Fill Left with Right + Vyplnit levý pravým + + + Fill Right with Left + Vyplnit pravý levým + + + Fill Left/Right + Vyplnit levý/pravý + + + Replaces either the left or right channel with the other + Nahradí buď levý nebo pravý kanál druhým + + + + Frei0rEffect + + Failed to load Frei0r plugin "%1": %2 + Nepodařilo se nahrát přídavný modul Frei0r "%1": %2 + + + Error loading Frei0r plugin + Chyba při nahrávání přídavného modulu Frei0r + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + Poznámka: Nemůžete nahrát 64 bitové přídavné moduly Frei0r do 32 bitového sestavení Olive. Najděte, prosím, 32 bitovou verzi tohoto přídavného modulu nebo přepněte na 64 bitové sestavení Olive. + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + Poznámka: Nemůžete nahrát 32 bitové přídavné moduly Frei0r do 64 bitového sestavení Olive. Najděte, prosím, 64 bitovou verzi tohoto přídavného modulu nebo přepněte na 32 bitové sestavení Olive. + + + + GraphEditor + + Hold + Držet + + + Graph Editor + Editor grafu + + + Bezier + Bézier + + + Linear + Lineární + + + + GraphView + + Zoom to Show All + Přiblížit pro ukázání všeho + + + Zoom to Selection + Přiblížit na výběr + + + Reset View + Obnovit výchozí zvětšení + + + + InterlacingName + + Invalid + Neplatný + + + Top Field First + Nejprve horní pole + + + None (Progressive) + Žádný (progresivní) + + + Bottom Field First + Nejprve dolní pole + + + Upper Field First + Nejprve horní pole + + + Lower Field First + Nejprve dolní pole + + + + KeyframeNavigator + + Enable Keyframes + Povolit klíčové snímky + + + + KeyframeView + + Hold + Držet + + + Bezier + Bézier + + + Linear + Lineární + + + + LabelSlider + + Set Value + Nastavit hodnotu + + + New value: + Nová hodnota: + + + &Edit + Úp&ravy + + + &Reset to Default + &Obnovit výchozí + + + + LinearFadeTransition + + Linear Fade + Lineární prolínání + + + An linear audio fade that fades evenly at a constant rate. + Lineární prolínání zvuku, které rovnoměrně při stálé rychlosti. + + + + LoadDialog + + Cancel + Zrušit + + + Loading... + Nahrává se... + + + Loading '%1'... + Nahrává se '%1'... + + + + LoadThread + + Invalid Clip Link + Neplatný odkaz na záběr + + + %1 - Line: %2 Col: %3 + %1 - Řádek: %2 Sloupec: %3 + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Tento projekt obsahuje neplatný odkaz na záběr. Tento může být poškozen. Chcete pokračovat v jeho nahrávání? + + + Project Load Error + Chyba při nahrávání projektu + + + Couldn't load '%1'. %2 + Nepodařilo se nahrát '%1'. %2 + + + Version Mismatch + Rozdílná verze + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Tento projekt byl uložen v jiné verzi Olive a nemusí být plně slučitelný s touto verzí. Přesto se jej chcete pokusit nahrát? + + + Error loading project: %1 + Chyba při nahrávání projektu: %1 + + + User aborted loading + Uživatelem přerušené nahrávání + + + XML Parsing Error + Chyba při zpracování XML + + + + LogarithmicFadeTransition + + Logarithmic Fade + Logaritmické prolínání + + + An logarithmic audio fade that starts fast and ends slow. + Logaritmické prolínání zvuku, které začíná rychle a končí pomalu. + + + + MainWindow + + 4:3 + 4:3 + + + Off + Vypnuto + + + &New + &Nový + + + 16:9 + 16:9 + + + Loop + Smyčka + + + Redo + Znovu + + + Slip Tool + Roztočení se ztotožněním + + + &Edit + Úp&ravy + + + &File + &Soubor + + + &Help + Nápo&věda + + + &Undo + &Zpět + + + &View + &Pohled + + + Timeline + Časová osa + + + E&xit + &Ukončit + + + Graph Editor + Editor grafu + + + Edit Tool + Nástroj pro úpravy + + + Media Viewer + Prohlížeč záznamu + + + Go to Start + Jít na začátek + + + Go to In Point + Jít na bod začátku + + + Zoom In + Přiblížit + + + Clear Recent List + Vyprázdnit seznam naposledy otevřených souborů + + + Edit to Out Point + Upravit po bod konce + + + Go to Out Point + Jít na bod konce + + + Seek to the End of Pastes + Vyhledávat po konec vložení + + + Ripple Tool + Vložení a posunutí + + + Enable Drag Files to Timeline + Povolit tažení souborů na časovou osu + + + Drop Frame + Zahodit snímek + + + &Playback + &Přehrávání + + + Title/Action Safe Area + Bezpečná oblast + + + Audio Scrubbing + Přehrávání zvuku při tažení ukazatele + + + &Tools + &Nástroje + + + Ripple to In Point + Vložit a posunout k bodu začátku + + + Enable Snapping + Povolit přichytávání + + + No Auto-Scroll + Žádné automatické projíždění + + + Auto-Scale By Default + Automaticky měnit velikost + + + Set/Edit Marker + Nastavit/Upravit značku + + + Non-Drop Frame + Nezahodit snímek + + + Hand Tool + Ručička + + + Toggle Show All + Přepnout ukázání všeho + + + Custom + Vlastní + + + Frames + Snímky + + + Lock Panels + Uzamknout panely + + + Play In to Out + Přehrát od začátku po konec + + + Scroll Wheel Zooms + Kolečko myši přibližuje + + + Page Auto-Scroll + Stránkové automatické projíždění + + + Full Screen + Celá obrazovka + + + Open Recent + Otevřít nedávné + + + Edit to In Point + Upravit po bod začátku + + + Razor Tool + Nástroj břitvy + + + Next Frame + Další snímek + + + Zoom Out + Oddálit + + + Go to Previous Cut + Jít na předchozí záběr + + + &Export... + &Vyvést... + + + &Import... + &Zavést... + + + Project + Projekt + + + Go to End + Jít na konec + + + Enable Hover Focus + Povolit zaměření při přejetí + + + Shuttle Stop + Zastavit pendlování + + + Shuttle Left + Jezdit tam a zpět vlevo + + + Delete In/Out Point + Smazat bod začátku/konce + + + Clear Undo + Vyprázdnit minulost kroků zpět + + + Ripple Delete In/Out Point + Vytáhnout bod začátku/konce + + + Full Screen Viewer + Prohlížeč na celou obrazovku + + + Ripple to Out Point + Vložit a posunout k bodu konce + + + Enable Seek to Import + Povolit vyhledávání k zavedení + + + Edit Tool Selects Links + Nástroj pro úpravy vybírá odkazy + + + A&ction Search + Hledání č&inností + + + Pointer Tool + Ukazovátko + + + &About... + &O programu... + + + Debug Log + Zápis ladění + + + Selecting Also Seeks + Výběr také vyhledává + + + Select &All + Vybrat &vše + + + Slide Tool + Roztočení + + + Welcome to %1 + Vítejte v %1 + + + Default + Výchozí + + + Reset to Default Layout + Obnovit výchozí rozvržení + + + Effect Controls + Ovládání efektů + + + Enable Drop on Media to Replace + Povolit upuštění na záznam pro nahrazení + + + <untitled> + <bez názvu> + + + Rectified Waveforms + Vlnový tvar odspodu + + + Decrease Track Height + Zmenšit výšku stopy + + + Increase Track Height + Zvětšit výšku stopy + + + &Window + &Okno + + + Ask For Name When Setting Marker + Požádat o název při nastavení značky + + + &Save Project + &Uložit projekt + + + Play/Pause + Přehrát/Pozastavit + + + Preferences + Nastavení + + + Save Project &As + Uložit projekt j&ako + + + &Open Project + &Otevřít projekt + + + Milliseconds + Milisekundy + + + Track Lines + Řádky stop + + + Sequence Viewer + Prohlížeč úryvku (sledu záběrů) + + + Smooth Auto-Scroll + Jemné automatické projíždění + + + Previous Frame + Předchozí snímek + + + Go to Next Cut + Jít na další záběr + + + Seek Also Selects + Vyhledávání také vybírá + + + Transition Tool + Přechod + + + Shuttle Right + Jezdit tam a zpět vpravo + + + Deselect All + Zrušit výběr všeho + + + Maximize Panel + Zvětšit panel + + + Edit Tool Also Seeks + Nástroj pro úpravy také vyhledává + + + Auto-Cut Silence + Ořezat ticho automaticky + + + OpenColorIO Config Error + Chyba nastavení OpenColorIO + + + Failed to set OpenColorIO configuration: %1 + Nepodařilo se nastavit nastavení OpenColorIO: %1 + + + Node Editor + Editor uzlu + + + + Marker + + Set Marker + Nastavit značku + + + Set clip marker name: + Nastavit název značky záběru: + + + Set sequence marker name: + Nastavit název značky úryvku (sledu záběrů): + + + + Media + + Name + Název + + + Rate + Rychlost + + + Name: + Název: + + + Filename: + Název souboru: + + + Video Dimensions: + Rozměry obrazu: + + + New Folder + Nová složka + + + Frame Rate: + Snímkování: + + + Interlacing: + Prokládání: + + + Audio Frequency: + Kmitočet zvuku: + + + %1 field(s) (%2 frame(s)) + %1 pole(í) (%2 snímek(y)) + + + Duration + Doba trvání + + + Audio Channels: + Zvukové kanály: + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Název: %1 +Rozměry obrazu: %2x%3 +Snímkování: %4 +Kmitočet zvuku: %5 +Rozložení zvuku: %6 + + + + MediaPropertiesDialog + + Name: + Název: + + + Video %1: %2x%3 %4FPS + Obraz %1: %2x%3 %4 FPS + + + Alpha is Premultiplied + Alfa je předznásobena + + + "%1" Properties + "%1" Vlastnosti + + + Interlacing: + Prokládání: + + + Audio %1: %2Hz %3 + Zvuk %1: %2Hz %3 + + + %n channel(s) + + %n kanál + %n kanály + %n kanálů + + + + Auto (%1) + Auto (%1) + + + Conform to Frame Rate: + Odpovídá snímkování: + + + Tracks: + Stopy: + + + Color Space: + Barevný prostor: + + + + MenuHelper + + Cu&t + Vyjmou&t + + + Nest + Vnořovat + + + The aspect ratio '%1' is invalid. Please try again. + Poměr stran '%1' je neplatný. Zkuste to, prosím, znovu. + + + Cop&y + &Kopírovat + + + Split + Rozdělit + + + Paste Insert + Vložit/Přidat + + + Add Default Transition + Přidat výchozí přechod + + + &Paste + &Vložit + + + Delete + Smazat + + + Link/Unlink + Spojit/Oddělit + + + Invalid aspect ratio + Neplatný poměr stran + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Zadejte poměr stran k použití pro bezpečnou oblast (např. 16:9): + + + Set In Point + Nastavit bod začátku + + + Clear In/Out Point + Vymazat bod začátku/konce + + + Enter custom aspect ratio + Zadat vlastní poměr stran + + + Duplicate + Zdvojit + + + &Project + &Projekt + + + &Folder + &Složka + + + &Sequence + Ú&ryvek + + + Reset In Point + Obnovit výchozí bod začátku + + + Ripple Delete + Vytáhnout + + + Enable/Disable + Povolit/Zakázat + + + Set Out Point + Nastavit bod konce + + + Reset Out Point + Obnovit výchozí bod konce + + + + NewSequenceDialog + + 144p + 144p + + + 240p + 240p + + + 360p + 360p + + + 480p + 480p + + + 720p + 720p + + + Editing "%1" + Upravení "%1" + + + 1080p + 1080p + + + Audio + Zvuk + + + Name: + Název: + + + Video + Obraz + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + PAL (576i) + PAL (576i) + + + NTSC (480i) + NTSC (480i) + + + None (Progressive) + Žádné (progresivní) + + + Custom + Vlastní + + + Width: + Šířka: + + + Frame Rate: + Snímkování: + + + Interlacing: + Prokládání: + + + Preset: + Přednastavení: + + + New Sequence + Nový úryvek (sled záběrů) + + + Pixel Aspect Ratio: + Poměr stran pixelu: + + + Square Pixels (1.0) + Čtvercové pixely (1.0) + + + Sample Rate: + Vzorkovací kmitočet: + + + Film 4K + Film 4K + + + Height: + Výška: + + + + Node + + Node + Uzel + + + + NodeBlock + + Previous + Předchozí + + + Next + Další + + + Block + Blok + + + + NodeEditor + + Node Editor + Editor uzlu + + + + NodeIO + + Disable Keyframes + Zakázat klíčové snímky + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Zákázání klíčových snímků smaže všechny nynější klíčové snímky. Opravdu to chcete udělat? + + + + NodeMedia + + Matrix + Matice + + + Texture + Povrch + + + Media + Záznam + + + + NodeTexturePassthru + + Texture + Povrch + + + Image Output + Výstup obrázku + + + + NodeVideoClip + + Texture + Povrch + + + + NodeView + + Node Editor + Editor uzlu + + + + OldEffectNode + + Save Effect Settings + Uložit nastavení efektu + + + Effect XML Settings %1 + Nastavení XML efektu %1 + + + Save Settings Failed + Nastavení se nepodařilo uložit + + + Failed to open "%1" for writing. + Nepodařilo se otevřít "%1" pro zápis. + + + Load Effect Settings + Nahrát nastavení efektu + + + Load Settings Failed + Nastavení se nepodařilo nahrát + + + Failed to open "%1" for reading. + Nepodařilo se otevřít "%1" pro čtení. + + + This settings file doesn't match this effect. + Tento soubor s nastavením neodpovídá tomuto efektu. + + + + OliveGlobal + + Auto-recovery + Automatické obnovení + + + Save Project As... + Uložit projekt jako... + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive nebyl zavřen řádně a byl zjištěn soubor pro automatické obnovení. Chcete jej otevřít? + + + Missing recent project + Chybí nedávný projekt + + + Please open the sequence you wish to export. + Otevřete, prosím, úryvek (sled záběrů), jejž chcete vyvést. + + + This project has changed since it was last saved. Would you like to save it before closing? + Tento projekt se od doby, kdy byl naposledy uložen, změnil. Chcete jej před zavřením uložit? + + + Open Project... + Otevřít projekt... + + + Olive Project %1 + Projekt Olive %1 + + + No active sequence + Žádný činný úryvek (sled záběrů) + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Projekt '%1' už neexistuje. Chcete jej odstranit ze seznamu nedávných projektů? + + + Unsaved Project + Neuložený projekt + + + Missing Project File + Chybí soubor projektu + + + Specified project '%1' does not exist. + Daný projekt '%1' neexistuje. + + + Please open the sequence to perform this action. + Otevřete, prosím, úryvek (sled záběrů), pro provedení této činnosti. + + + No clips selected + Nevybrány žádné záběry + + + Select the clips you wish to auto-cut + Vyberte záběry, které chcete automaticky ořezat + + + Effect already exists + Efekt již existuje + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + Záběr '%1' již obsahuje '%2' efekt. Chcete jej nahradit vloženým nebo jej přidat jako samostatný efekt? + + + Add + Přidat + + + Replace + Nahradit + + + Skip + Přeskočit + + + Do this for all conflicts found + Použít na všechny nalezené střety + + + Import media... + Zavést záznam... + + + All Files + Všechny soubory + + + + PanEffect + + Pan + Vyvážení + + + Modifying the panning on a stereo audio clip. + Změna vyvážení na stereo zvukovém záběru. + + + + PreferencesDialog + + Mono + Mono + + + Export Shortcuts + Vyvést zkratky + + + Audio + Zvuk + + + Invalid CSS File + Neplatný soubor CSS + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + Všechny náhledy byly úspěšně smazány. Možná budete muset nynější projekt otevřít znovu, aby se změny projevily. + + + Thumbnail Resolution: + Rozlišení náhledu: + + + Playback + Přehrávání + + + Search for action or shortcut + Hledat činnosti nebo klávesové zkratky + + + Sample Rate: + Vzorkovací kmitočet: + + + Waveform Resolution: + Rozlišení tvaru vlny: + + + Use Software Fallbacks When Possible + Zajištění skrze softwarovou zálohu + + + Action + Činnost + + + Browse + Procházet + + + Export + Vyvést + + + Language: + Jazyk: + + + Import + Zavést + + + Effect Textbox Lines: + Řádky textového pole efektu: + + + Stereo + Stereo + + + Custom CSS: + Vlastní CSS: + + + Delete All Previews + Smazat všechny náhledy + + + Previews Deleted + Náhledy smazány + + + Output Device: + Výstupní zařízení: + + + Audio Recording: + Nahrávání zvuku: + + + frames + snímků + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + Rychlé vyhledávání +Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - neovlivňuje přehrávání/vyvádění) + + + Browse for CSS file + Hledat soubor CSS + + + Export Keyboard Shortcuts + Vyvést klávesové zkratky + + + Reset Selected + Obnovit výchozí hodnotu u vybraného + + + Failed to open file for writing + Soubor se nepodařilo otevřít pro zápis + + + Shortcuts exported successfully + Zkratky úspěšně vyvedeny + + + seconds + sekund + + + Seeking + Vyhledávání + + + Reset All + Obnovit výchozí hodnotu u všeho + + + Delete Previews + Smazat náhledy + + + Input Device: + Vstupní zařízení: + + + Confirm Reset All Shortcuts + Potvrdit obnovení výchozího nastavení všech klávesových zkratek + + + Default + Výchozí + + + Upcoming Frame Queue: + Nadcházející řada snímků: + + + Import Keyboard Shortcuts + Zavést klávesové zkratky + + + Behavior + Chování + + + Image sequence formats: + Formáty obrázkového úryvku (sledu záběrů): + + + Error saving shortcuts + Chyba při ukládání klávesových zkratek + + + Preferences + Nastavení + + + Keyboard + Klávesnice + + + Previous Frame Queue: + Předchozí řada snímků: + + + Are you sure you want to delete all previews? + Opravdu chcete smazat všechny náhledy? + + + General + Obecné + + + Memory Usage + Využití paměti + + + CSS file '%1' does not exist. + Soubor CSS '%1' neexistuje. + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + Přesné vyhledávání +Vždy ukazovat správný snímek (obraz se při získávání správného snímku může na krátkou dobu pozastavit) + + + Failed to open file for reading + Soubor se nepodařilo otevřít pro čtení + + + Shortcut + Zkratka + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Jste si jistý, že chcete vrátit nastavení všech klávesových zkratek do jejich výchozího stavu? + + + Default Sequence + Výchozí úryvek (sled záběrů) + + + Default Sequence Settings + Nastavení pro výchozí úryvek (sled záběrů) + + + Add Default Effects to New Clips + Přidat výchozí efekty do nových záběrů + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + Přetočit automaticky na začátek při přehrávání na konci úryvku (sledu záběrů) + + + Selecting Also Seeks + Výběr také přetáčí + + + Edit Tool Also Seeks + Nástroj pro úpravy také přetáčí + + + Edit Tool Selects Links + Nástroj pro úpravy vybírá odkazy + + + Seek Also Selects + Přetáčení také vybírá + + + Seek to the End of Pastes + Přetáčet po konec vložení + + + Scroll Wheel Zooms + Kolečko myši přibližuje + + + Hold CTRL to toggle this setting + Podržet Ctrl pro přepnutí tohoto nastavení + + + Invert Timeline Scroll Axes + Obrátit osy projíždění časovou osu + + + Enable Drag Files to Timeline + Povolit tažení souborů na časovou osu + + + Auto-Scale By Default + Automaticky měnit velikost + + + Auto-Seek to Imported Clips + Přetáčet automaticky k zavedeným záběrům + + + Audio Scrubbing + Přehrávání zvuku při tažení ukazatele + + + Drop Files on Media to Replace + Upustit soubory na záznam pro nahrazení + + + Enable Hover Focus + Povolit zaměření při přejetí + + + Ask For Name When Setting Marker + Požádat o název při nastavení značky + + + Appearance + Vzhled + + + Theme + Motiv + + + Olive Dark (Default) + Tmavá olivová (výchozí) + + + Olive Light + Světlá olivová + + + Native + Původní + + + Native (Light Icons) + Původní (světlé ikony) + + + Use Native Menu Styling + Použít původní styl nabídky + + + (None) + (žádný) + + + OpenColorIO Config Error + Chyba nastavení OpenColorIO + + + Failed to set OpenColorIO configuration: %1 + Nepodařilo se nastavit nastavení OpenColorIO: %1 + + + Invalid OpenColorIO Configuration File + Neplatný soubor s nastavením OpenColorIO + + + You must specify an OpenColorIO configuration file if color management is enabled. + Musíte zadat soubor s nastavením OpenColorIO, pakliže je povolena správa barev. + + + OpenColorIO configuration file '%1' does not exist. + Soubor s nastavením OpenColorIO '%1' není. + + + Browse for OpenColorIO configuration + Procházet pro nastavení OpenColorIO + + + All previews deleted successfully. You may have to re-open your current project for changes to take effect. + Všechny náhledy byly úspěšně smazány. Možná budete muset nynější projekt otevřít znovu, aby se změny projevily. + + + Don't Use Proxies When Exporting + Nepoužívat při vyvádění náhrady + + + Use originals instead of proxies when exporting + Namísto náhrad při vyvádění používat originály + + + Enable Color Management + Povolit správu barev + + + OpenColorIO Config File: + Otevřít soubor s nastavením OpenColorIO: + + + Default Input Color Space: + Výchozí vstupní barevný prostor: + + + Display: + Zobrazení: + + + View: + Pohled: + + + Look: + Vzhled: + + + Bit Depth + Bitová hloubka + + + Playback (Offline): + Přehrávání (nepřipojeno): + + + Export (Online): + Vyvedení (připojeno): + + + Color Management + Správa barev + + + + PreviewGenerator + + Could not find stream information - %1 + Nepodařilo se najít údaje o proudu - %1 + + + Could not open file - %1 + Nepodařilo se otevřít soubor - %1 + + + Failed to find any valid video/audio streams + Nepodařilo se najít žádné platné obrazové/zvukové proudy + + + + Project + + Skip + Přeskočit + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + Záznam '%1' se nyní používá v '%2'. Jeho smazání odstraní všechny instance v úryvku (sledu záběrů). Opravdu to chcete udělat? + + + Delete media in use? + Smazat používaný záznam? + + + Image sequence detected + Zjištěn obrázkový úryvek (sled záběrů) + + + Rename '%1' + Přejmenovat '%1' + + + Active sequence selected + Vybrán činný úryvek (sled záběrů) + + + Enter new name: + Zadat nový název: + + + Search media, markers, etc. + Hledat záznam, značky atd. + + + Project + Projekt + + + Sequence + Úryvek + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + Úryvek (sled záběrů) nemůžete vložit do něj samého, aby žádné záběry z tohoto záznamu nebyly v tomto úryvku (sledu záběrů). + + + Import media... + Zavést záznam... + + + No active sequence + Žádný činný úryvek (sled záběrů) + + + No sequence is active, please open the sequence you want to delete clips from. + Žádný úryvek (sled záběrů) není činný. Otevřete, prosím, úryvek (sled záběrů), ve kterém chcete smazat záběry. + + + Replace '%1' + Nahradit '%1' + + + All Files + Všechny soubory + + + No sequence is active, please open the sequence you want to replace clips from. + Žádný úryvek (sled záběrů) není činný. Otevřete, prosím, úryvek (sled záběrů), ve kterém chcete nahradit záběry. + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + Soubor '%1' se zdá být součástí obrázkového úryvku (sledu záběrů). Chcete jej zavést jako takový? + + + New + Nový + + + Open Project + Otevřít projekt + + + Save Project + Uložit projekt + + + Undo + Zpět + + + Redo + Znovu + + + Tree View + Stromový pohled + + + Icon View + Pohled s ikonami + + + List View + Pohled se seznamem + + + + ProjectModel + + Sequence %1 + Úryvek %1 + + + Import a Project + Zavést projekt + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" je soubor s projektem Olive. Sloučí se s tímto projektem. Chcete pokračovat? + + + Image sequence detected + Zjištěn obrázkový úryvek (sled záběrů) + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + Soubor '%1' se zdá být součástí obrázkového úryvku (sledu záběrů). Chcete jej zavést jako takový? + + + + ProxyDialog + + Proxy + Proxy + + + Eighth Resolution (1/8) + Osminové rozlišení (1/8) + + + Create Proxy + Vytvořit proxy + + + Sixteenth Resolution (1/16) + Šestnáctinové rozlišení (1/16) + + + ProRes HQ + ProRes HQ + + + The file "%1" already exists. Do you wish to replace it? + Soubor "%1" již existuje. Chcete jej nahradit? + + + Dimensions: + Rozměry: + + + Half Resolution (1/2) + Poloviční rozlišení (1/2) + + + Location: + Umístění: + + + Same as Source (in "%1" folder) + Stejné jako zdroj (ve složce "%1") + + + Format: + Formát: + + + Quarter Resolution (1/4) + Čtvrtinové rozlišení (1/4) + + + Proxy file exists + Soubor proxy existuje + + + Same Size as Source + Stejná velikost jako zdroj + + + Custom Location + Vlastní umístění + + + + ProxyGenerator + + Finished generating proxy for "%1" + Dokončeno vytvoření proxy pro "%1" + + + + ReplaceClipMediaDialog + + No media selected + Nevybrán žádný záznam + + + You cannot replace footage with a folder. + Záběry nemůžete nahradit složkou. + + + Active sequence selected + Vybrán činný úryvek (sled záběrů) + + + Cancel + Zrušit + + + Please select a media to replace with or click 'Cancel'. + Vyberte, prosím, záznam k nahrazení nebo klepněte na Zrušit. + + + You cannot insert a sequence into itself. + Nemůžete vložit úryvek (sled záběrů) do něj samého. + + + Replace + Nahradit + + + Same media selected + Vybrán stejný záznam + + + Folder selected + Složka vybrána + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Vybral jste stejný záznam, jejž chcete nahradit. Vyberte, prosím, jiný nebo klepněte na Zrušit. + + + Replace clips using "%1" + Nahradit záběry pomocí "%1" + + + Keep the same media in-points + Zachovat stejné začáteční body záznamu + + + Select which media you want to replace this media's clips with: + Vyberte, kterým záznamem chcete nahradit záběry tohoto záznamu: + + + + RichTextEffect + + Text + Text + + + Padding + Odstup + + + Position + Poloha + + + Vertical Align: + Svislé zarovnání: + + + Top + Nahoře + + + Center + Na střed + + + Bottom + Dole + + + Auto-Scroll + Automatické projíždění + + + Off + Vypnuto + + + Up + Nahoru + + + Down + Dolů + + + Left + Vlevo + + + Right + Vpravo + + + Shadow + Stín + + + Shadow Color + Barva stínu + + + Shadow Angle + Úhel stínu + + + Shadow Distance + Vzdálenost stínu + + + Shadow Softness + Měkkost stínu + + + Shadow Opacity + Neprůhlednost stínu + + + Rich Text + Formátovaný text + + + Render + Vykreslit + + + Render formatted rich text over a clip. + Vykreslit formátovaný text nad záběrem. + + + + Sequence + + %1 (copy) + %1 (kopírovat) + + + + ShakeEffect + + Rotation + Otočení + + + Intensity + Síla + + + Frequency + Četnost + + + Shake + Zatřást + + + Distort + Zkřivit + + + Simulate a camera shake movement. + Napodobit pohyb při zatřesení kamerou. + + + + SolidEffect + + Type + Typ + + + Color + Barva + + + Solid Color + Plná barva + + + Opacity + Neprůhlednost + + + Checkerboard + Šachovnice + + + SMPTE Bars + Pruhy SMPTE + + + Checkerboard Size + Velikost šachovnice + + + Solid + Plná + + + Render + Vykreslit + + + Render a solid color over this clip. + Vykreslit plnou barvu nad tímto záběrem. + + + + SourcesCommon + + New + Nový + + + View + Pohled + + + Proxy + Proxy + + + Show Toolbar + Ukázat nástrojový pruh + + + Create/Modify Proxy + Vytvořit/Změnit proxy + + + Restore Original + Obnovit původní + + + Delete proxy + Smazat proxy + + + Create Proxy + Vytvořit proxy + + + Create Sequence With This Media + Vytvořit úryvek (sled záběrů) pomocí tohoto záznamu + + + Reveal in Explorer + Ukázat v průzkumníku + + + Delete + Smazat + + + Replace/Relink Media + Nahradit/Znovuspojit záznamy + + + Icon View + Pohled s ikonami + + + Delete All Clips Using This Media + Smazat všechny záběry pomocí tohoto záznamu + + + Duplicate + Zdvojit + + + Import... + Zavést... + + + Show Sequences + Ukázat úryvky (sledy záběrů) + + + Preview in Media Viewer + Náhled v prohlížeči záznamu + + + Replace Clips Using This Media + Nahradit záběry pomocí tohoto záznamu + + + Tree View + Stromový pohled + + + Generating proxy: %1% complete + Vytvoření proxy: %1% hotovo + + + Reveal in File Manager + Ukázat ve správci souborů + + + Properties... + Vlastnosti... + + + Modify Proxy + Změnit proxy + + + Replace Media + Nahradit záznam + + + Reveal in Finder + Ukázat v hledači + + + Would you like to delete the proxy file "%1" as well? + Chcete smazat i soubor proxy "%1"? + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Upustil jste soubor na '%1'. Chcete jej nahradit upuštěným souborem? + + + Replace '%1' + Nahradit '%1' + + + All Files + Všechny soubory + + + + SpeedDialog + + Speed: + Rychlost: + + + Frame Rate: + Snímkování: + + + Duration: + Doba trvání: + + + Reverse + Obrátit + + + Maintain Audio Pitch + Udržovat výšku tónu zvuku + + + Ripple Changes + Změny vytažení + + + Speed/Duration + Rychlost/Doba trvání + + + + TextEditDialog + + Edit Text + Upravit text + + + Thin + Tenké + + + Extra Light + Mimořádně lehké + + + Light + Lehké + + + Normal + Normální + + + Medium + Střední + + + Demi Bold + Polotučné + + + Bold + Tučné + + + Extra Bold + Mimořádně tučné + + + Black + Černé + + + + TextEditEx + + Edit Text + Upravit text + + + &Edit Text + &Upravit text + + + + TextEffect + + Top + Nahoře + + + Font + Písmo + + + Left + Vlevo + + + Size + Velikost + + + Text + Text + + + Color + Barva + + + Right + Vpravo + + + &Edit Text + &Upravit text + + + Outline Color + Barva obrysu + + + Outline Width + Šířka obrysu + + + Justify + Do bloku + + + Sample Text + Text příkladu + + + Shadow Softness + Měkkost stínu + + + Bottom + Dole + + + Center + Na střed + + + Shadow + Stín + + + Outline + Obrys + + + Shadow Distance + Vzdálenost stínu + + + Shadow Opacity + Neprůhlednost stínu + + + Word Wrap + Zalamování slov + + + Shadow Color + Barva stínu + + + Shadow Angle + Úhel stínu + + + Alignment + Zarovnání + + + Padding + Odstup + + + Position + Poloha + + + Horizontal Alignment + Vodorovné zarovnání + + + Vertical Alignment + Svislé zarovnání + + + Render + Vykreslit + + + Generate simple text over this clip + Vytvořit jednoduchý text nad tímto záběrem. + + + + TimecodeEffect + + Timecode + Časový kód + + + Color + Barva + + + Media + Záznamy + + + Scale + Měřítko + + + Offset + Posun + + + Prepend + Uvést na začátku + + + Background Color + Barva pozadí + + + Background Opacity + Neprůhlednost pozadí + + + Sequence + Úryvek + + + Render + Vykreslit + + + Render the media or sequence timecode on this clip. + Vykreslit časový kód záznamu nebo úryvku na tomto záběru. + + + + Timeline + + Add + Přidat + + + Skip + Přeskočit + + + Slip Tool + Roztočení se ztotožněním + + + Edit Tool + Nástroj pro úpravy + + + Title... + Název... + + + Zoom In + Přiblížit + + + Ripple Tool + Nástroj pro vložení a posunutí + + + (none) + (žádný) + + + Record audio + Nahrát zvuk + + + Solid Color... + Plná barva... + + + Hand Tool + Nástroj ručičky + + + Snapping + Přichytávání + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Klepněte na časovou osu, kde chcete začít s nahráváním (táhněte pro omezení nahrávky na určitý časový snímek) + + + Noise... + Šum... + + + Nested Sequence + Vnořený úryvek (sled záběrů) + + + Razor Tool + Nástroj břitvy + + + Zoom Out + Oddálit + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + Záběr '%1' již obsahuje '%2' efekt. Chcete jej nahradit vloženým nebo jej přidat jako samostatný efekt? + + + Bars... + Pruhy... + + + Replace + Nahradit + + + Pointer Tool + Nástroj ukazovátka + + + You must save this project before you can record audio in it. + Musíte tento projekt uložit, předtím než do něj můžete nahrát zvuk. + + + Effect already exists + Efekt již existuje + + + Slide Tool + Roztočení + + + Add title, solid, bars, etc. + Přidat název, plnou barvu, pruhy atd. + + + Tone... + Tón... + + + Do this for all conflicts found + Použít na všechny nalezené střety + + + Timeline: + Časová osa: + + + Unsaved Project + Neuložený projekt + + + Transition Tool + Nástroj pro přechod + + + Video Transitions + Obrazové přechody + + + Audio Transitions + Zvukové přechody + + + Timeline: %1 + Časová osa: %1 + + + + TimelineHeader + + Center Timecodes + Vystředit časové kódy + + + + TimelineLabel + + Rename Track + Přejmenovat stopu + + + Enter the new name for this track + Zadejte nový název pro tuto stopu + + + + TimelineView + + &Undo + &Zpět + + + &Redo + &Znovu + + + R&ipple Delete Empty Space + &Vytáhnout (smazat a posunout) prázdný prostor + + + Sequence Settings + Nastavení úryvku (sledu záběrů) + + + &Speed/Duration + &Rychlost/Doba trvání + + + Auto-Cut Silence + Ořezat ticho automaticky + + + Auto-S&cale + Automatická &změna velikosti + + + &Reveal in Project + &Odkrýt v projektu + + + Properties + Vlastnosti + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Začátek: %2 +Konec: %3 +Doba trvání: %4 + + + Error + Chyba + + + Couldn't locate media wrapper for sequence. + Nepodařilo se najít obal záznamu pro tento úryvek (sled záběrů). + + + Title + Název + + + Solid Color + Plná barva + + + Bars + Pruhy + + + Tone + Tón + + + Noise + Šum + + + Duration: + Doba trvání: + + + + TimelineWidget + + C&ut + Vyj&mout + + + Bars + Pruhy + + + Tone + Tón + + + &Redo + &Znovu + + + &Undo + &Zpět + + + Cop&y + &Kopírovat + + + Error + Chyba + + + Noise + Šum + + + Title + Název + + + Sequence Settings + Nastavení úryvku (sledu záběrů) + + + &Paste + &Vložit + + + &Reveal in Project + &Odkrýt v projektu + + + Rename '%1' + Přejmenovat '%1' + + + Auto-s&cale + Automatická &změna velikosti + + + R&ename + &Přejmenovat + + + Solid Color + Plná barva + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Začátek: %2 +Konec: %3 +Doba trvání: %4 + + + Rename multiple clips + Přejmenovat více záběrů + + + Enter a new name for this clip: + zadejte nový název pro tento záběr: + + + Duration: + Doba trvání: + + + R&ipple Delete + &Vytáhnout (smazat a posunout) + + + &Speed/Duration + &Rychlost/Doba trvání + + + Couldn't locate media wrapper for sequence. + Nepodařilo se najít obal záznamu pro tento úryvek (sled záběrů). + + + R&ipple Delete Empty Space + &Vytáhnout (smazat a posunout) prázdný prostor + + + Auto-Cut Silence + Ořezat ticho automaticky + + + Auto-S&cale + Automatická &změna velikosti + + + Properties + Vlastnosti + + + + ToneEffect + + Mix + Směs + + + Type + Typ + + + Amount + Množství + + + Frequency + Kmitočet + + + Sine + Sinus + + + Tone + Tón + + + Generate a sine wave tone to mix into this clip's audio. + Vytvořit tón sinové vlny k zamíchání do zvuku tohoto záběru. + + + + Track + + Video %1 + Obraz %1 + + + Audio %1 + Zvuk %1 + + + Subtitle %1 + Titulek %1 + + + Unknown %1 + Neznámý %1 + + + + TransformEffect + + Glow + Záře + + + Pin Light + Připíchnout světlo + + + Scale + Měřítko + + + Anchor Point + Bod ukotvení + + + Linear Light + Přímé světlo + + + Lighten + Vypálit + + + Uniform Scale + Jednotné měřítko + + + Color Dodge + Uskočení barvy + + + Blend Mode + Režim mísení + + + Darken + Ztmavit + + + Normal + Normální + + + Screen + Obrazovka + + + Vivid Light + Jasné světlo + + + Color Burn + Vypálení barvy + + + Hard Light + Ostré světlo + + + Soft Light + Tlumené světlo + + + Linear Dodge (Add) + Lineární uskočení (Přidat) + + + Opacity + Neprůhlednost + + + Position + Poloha + + + Rotation + Otočení + + + Overlay + Překrytí + + + Phoenix + Fénix + + + Linear Burn + Přímé vypálení + + + Hard Mix + Tvrdá směs + + + Reflect + Zrcadlit + + + Average + Průměr + + + Substract + Odečíst + + + Exclusion + Ohraničení + + + Negation + Odmítnutí + + + Multiply + Znásobit + + + Difference + Rozdíl + + + Transform + Přeměnit + + + Distort + Zkřivit + + + Transform the position, scale, and rotation of this clip. + Přeměnit polohu, rozměry a otočení tohoto záběru. + + + + Transition + + Length + Délka + + + + UpdateNotification + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + Na internetové stránce Olive je dostupná aktualizace. Pro její stažení navštivte www.olivevideoeditor.org. + + + + VSTHost + + Show + Ukázat + + + Error loading VST plugin + Chyba při nahrávání přídavného modulu VST + + + Plugin's magic number is invalid + Kouzelné číslo přídavného modulu je neplatné + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + Poznámka: Nemůžete nahrát 64 bitové přídavné moduly VST do 32 bitového sestavení Olive. Najděte, prosím, 32 bitovou verzi tohoto přídavného modulu nebo přepněte na 64 bitové sestavení Olive. + + + Plugin + Přídavný modul + + + VST Plugin + Přídavný modul VST + + + VST Error + Chyba VST + + + Interface + Rozhraní + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + Poznámka: Nemůžete nahrát 32 bitové přídavné moduly VST do 64 bitového sestavení Olive. Najděte, prosím, 64 bitovou verzi tohoto přídavného modulu nebo přepněte na 32 bitové sestavení Olive. + + + Failed to locate entry point for dynamic library. + Nepodařilo se najít vstupní bod pro dynamickou knihovnu. + + + Failed to create VST reference + Nepodařilo se vytvořit odkaz na VST + + + Failed to load VST plugin "%1": %2 + Nepodařilo se nahrát přídavný modul "%1": %2 + + + VST Plugin 2.x + Přídavný modul VST 2.x + + + Use a VST 2.x plugin on this clip's audio. + Použít na zvuk tohoto záběru přídavný modul VST 2.x. + + + + Viewer + + Media Viewer + Prohlížeč záznamu + + + (none) + (žádný) + + + Sequence Viewer + Prohlížeč úryvku (sledu záběrů) + + + Drag video only + Táhnout pouze obraz + + + Drag audio only + Táhnout pouze zvuk + + + Viewer: %1 + Prohlížeč: %1 + + + Failed to import recorded file + Nepodařilo se zavést nahraný soubor + + + An error occurred trying to import the recorded audio + Při pokusu o zavedení nahraného souboru se vyskytla chyba + + + Sequence Viewer: %1 + Prohlížeč úryvku (sledu záběrů): %1 + + + Media Viewer: %1 + Prohlížeč záznamu: %1 + + + + ViewerWidget + + Fit + Vejít se + + + Zoom + Zvětšení + + + Save Frame as Image... + Uložit snímek jako obrázek... + + + Custom + Vlastní + + + Show Fullscreen + Ukázat na celou obrazovku + + + Close Media + Zavřít záznam + + + Save Frame + Uložit snímek + + + Screen %1: %2x%3 + Obrazovka %1: %2x%3 + + + Set Custom Zoom Value: + Nastavit vlastní hodnotu zvětšení: + + + Disable + Zakázat + + + Viewer Zoom + Zvětšení prohlížeče + + + + ViewerWindow + + Exit Fullscreen + Opustit celou obrazovku + + + + VoidEffect + + Missing Effect + Chybí efekt + + + (unknown) + (neznámý) + + + + VolumeEffect + + Volume + Hlasitost + + + Adjust the volume of this clip's audio + Upravit hlasitost zvuku tohoto záběru + + + + bitdepths + + 8-bit + 8-bitů + + + 16-bit Integer + 16-bitů celé číslo + + + Half-Float (16-bit) + Poloviční plovoucí (16-bitů) + + + Full-Float (32-bit) + Celý plovoucí (32-bitů) + + + + transition + + Invalid transition + Neplatný přechod + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + Žádný uchazeč o přechod '%1'. Tento přechod může být poškozen. Pokuste se jej nebo Olive znovu nainstalovat. + + + diff --git a/app/ts/de_DE.ts b/app/ts/de_DE.ts new file mode 100644 index 000000000..4dd5c3bcd --- /dev/null +++ b/app/ts/de_DE.ts @@ -0,0 +1,4158 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive ist ein nicht-lineares Videoschnittprogramm. Diese Software ist frei und durch die GNU GPL geschützt. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Das Olive Team ist dazu verpflichtet, die Nutzer darüber zu informieren, dass der Quellcode von der Webseite heruntergeladen werden kann. + + + + ActionSearch + + + Search for action... + Nach Aktion suchen... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Erweiterte Video-Einstellungen + + + + Pixel Format: + Pixelformat: + + + + Threads: + Threads: + + + + Audio + + Audio + Same as in english + Audio + + + Recording + Aufnahme + + + + %1 Audio + %1 Audio + + + + Recording %1 + %1 aufnehmen + + + + AudioNoiseEffect + + + Amount + In this case the intensity is meant + Stärke + + + + Mix + Same as in english? + Mix + + + + AutoCutSilenceDialog + + + Cut Silence + + + + + Attack Threshold: + + + + + Attack Time: + + + + + Release Threshold: + + + + + Release Time: + + + + + Cacher + + + + Could not open %1 - %2 + Konnte %1 nicht öffnen - %2 + + + + ChannelLayoutName + + + Invalid + ungültig + + + + Mono + Same as in english + Mono + + + + Stereo + Same as in english + Stereo + + + + ClipPropertiesDialog + + + "%1" Properties + "%1" Eigenschaften + + + + Multiple Clip Properties + + + + + Name: + Name: + + + + Duration: + Dauer: + + + + (multiple) + (mehrere) + + + + CollapsibleWidget + + + <untitled> + <unbenannt> + + + + ColorButton + + + Set Color + Farbe übernehmen + + + + CornerPinEffect + + + Top Left + Oben Links + + + + Top Right + Oben Rechts + + + + Bottom Left + Unten Links + + + + Bottom Right + Unten Rechts + + + + Perspective + Perspektive + + + + DebugDialog + + + Debug Log + Could be also different but is understandable in german + Debug-Log + + + + DemoNotice + + + + Welcome to Olive! + Willkommen in Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive ist ein freies, offenes Videoschnittprogramm welches unter der GNU GPL lizensiert ist. Sofern Sie für diese Software bezahlt haben, wurden Sie betrogen. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Diese Software ist aktuell in einem ALPHA-Stadium, was bedeutet, dass die Software instabil ist, abstürzen könnte, Fehler enthält und einige Funktionen fehlen. Wir leisten keine Garantie, die Benutzung der Software erfolgt auf eigenes Risiko. Bitte melden Sie Fehler oder Funktionswünsche auf %1 + + + + Thank you for trying Olive and we hope you enjoy it! + Danke das Sie Olive ausprobieren, wir hoffen es gefällt Ihnen! + + + + Effect + + + Invalid effect + Ungültiger Effekt + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + The last sentence does not make real sense in german. I changed it to "a reinstallation is recommended" + Kein Kandidat für Effekt '%1'. Dieser Effekt ist möglicherweise beschädigt. Eine Neuinstallation wird empfohlen. + + + Cu&t + &Ausschneiden + + + &Copy + &Kopieren + + + Move &Up + Nach &oben + + + Move &Down + Nach &unten + + + D&elete + L&öschen + + + Load Settings From File + Einstellungen aus Datei laden + + + Save Settings to File + Einstellungen in Datei speichern + + + + Save Effect Settings + Effekt-Einstellungen speichern + + + + + Effect XML Settings %1 + XML Effekt-Einstellungen %1 + + + + Save Settings Failed + Speichern der Einstellungen fehlgeschlagen + + + + Failed to open "%1" for writing. + Fehler beim Öffnen von "%1" + + + + Load Effect Settings + Effekt-Einstellungen laden + + + + + Load Settings Failed + Laden von Einstellungen fehlgeschlagen + + + + Failed to open "%1" for reading. + Fehler beim Öffnen von "%1" + + + + This settings file doesn't match this effect. + Die Einstellungsdatei stimmt nicht mit diesem Effekt überein. + + + + EffectControls + + + Effects: + Effekte: + + + &Paste + &Einfügen + + + + (none) + (keine) + + + + Add Video Effect + Video-Effekt hinzufügen + + + + VIDEO EFFECTS + VIDEO-EFFEKTE + + + + Add Video Transition + Video-Übergang hinzufügen + + + + Add Audio Effect + Audio-Effekt hinzufügen + + + + AUDIO EFFECTS + AUDIO-EFFEKTE + + + + Add Audio Transition + Audio-Übergang hinzufügen + + + (Multiple clips selected) + (mehrere Clips ausgewählt) + + + + EffectRow + + + Disable Keyframes + Keyframes deaktivieren + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Ein Deaktivieren von Keyframes löscht alle aktuellen Keyframes. Sind Sie sicher? + + + + EffectUI + + + %1 (Opening) + + + + + %1 (Closing) + + + + + %1 (multiple) + + + + + Cu&t + &Ausschneiden + + + + &Copy + &Kopieren + + + + Move &Up + Nach &oben + + + + Move &Down + Nach &unten + + + + D&elete + L&öschen + + + + Load Settings From File + Einstellungen aus Datei laden + + + + Save Settings to File + Einstellungen in Datei speichern + + + + EmbeddedFileChooser + + + File: + Datei: + + + + ExportDialog + + + Export "%1" + Exportieren von "%1" + + + + Unknown codec name %1 + Unbekannter Codec-Name %1 + + + + Export Failed + Exportieren fehlgeschlagen + + + + Export failed - %1 + Exportieren fehlgeschlagen - %1 + + + + Invalid dimensions + Ungültige Dimensionen + + + + Export width and height must both be even numbers/divisible by 2. + Breite und Höhe müssen Zahlen sein, die durch 2 teilbar sind. + + + + Invalid codec + Ungültiger Codec + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Ausgabe-Parameter für den ausgewählten Codec konnte nicht erkannt werden. Dies ist ein Fehler, bitte kontaktieren Sie den Entwickler. + + + + Invalid format + Ungültiges Format + + + + Couldn't determine output format. This is a bug, please contact the developers. + Ausgabe-Format konnte nicht erkannt werden. Dies ist ein Fehler, bitte kontaktieren Sie den Entwickler. + + + + Export Media + In german it would be not good to add media to the title + Exportieren + + + + %p% (Total: %1:%2:%3) + + + + + %p% (ETA: %1:%2:%3) + + + + + Quality-based (Constant Rate Factor) + Qualität (Constant Rate Factor) + + + + Constant Bitrate + Konstante Bitrate + + + + + Invalid Codec + Ungültiger Codec + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Es wurde kein passender Encoder für diesen Codec gefunden. Exportieren könnte fehlschlagen. + + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + + Bitrate (Mbps): + Bitrate (Mbps): + + + + Quality (CRF): + Qualität (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Qualitätsfaktor: + +0 = verlustfrei (lossless) +17-18 = optisch verlustfrei (komprimiert, aber nicht bemerkbar) +23 = höchste Qualität +51 = kleinstmögliche Qualität + + + + Target File Size (MB): + Ziel-Dateigröße (MB): + + + + Format: + Same as in english + Format: + + + + Range: + Bereich: + + + + Entire Sequence + Komplette Sequenz + + + + In to Out + In to Out + + + + Video + Same as in english + Video + + + + + Codec: + Same as in english + Codec: + + + + Width: + Breite: + + + + Height: + Höhe: + + + + Frame Rate: + Bildfrequenz: + + + + Compression Type: + Komprimierungsverfahren: + + + + Advanced + Erweitert + + + + Audio + Audio + + + + Sampling Rate: + Abtastrate: + + + + Bitrate (Kbps/CBR): + Same as in english + Bitrate (Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + Fehler beim Senden des Frames zum Encoder (%1) + + + + failed to receive packet from encoder (%1) + Fehler beim Empfangen des Pakets vom Encoder (%1) + + + + could not video encoder for %1 + Video-Encoder für %1 konnte nicht gefunden werden + + + + could not allocate video stream + Videostream konnte nicht zugewiesen werden + + + + could not allocate video encoding context + + + + + could not open output video encoder (%1) + Video-Encoder konnte nicht geöffnet werden (%1) + + + + could not copy video encoder parameters to output stream (%1) + Video-Encoder-Parameter konnten nicht in den Ausgabe-Stream kopiert werden (%1) + + + + could not audio encoder for %1 + Audio-Encoder für %1 konnte nicht gefunden werden + + + + could not allocate audio stream + Audiostream konnte nicht zugewiesen werden + + + + could not allocate audio encoding context + Audio-Encoding-Kontext konnte nicht zugewiesen werden + + + + could not open output audio encoder (%1) + Audio-Encoder konnte nicht geöffnet werden (%1) + + + + could not copy audio encoder parameters to output stream (%1) + Audio-Encoder-Parameter konnten nicht in den Ausgabe-Stream kopiert werden (%1) + + + + could not allocate audio buffer (%1) + Audio-Buffer konnte nicht zugewiesen werden (%1) + + + + could not create output format context + Ausgabe-Format-Kontext konnte nicht erstellt werden + + + + could not open output file (%1) + Ausgabe konnte nicht geöffnet werden (%1) + + + + could not write output file header (%1) + Ausgabe-Datei-Header konnte nicht geschrieben werden (%1) + + + + could not write output file trailer (%1) + Ausgabe-Datei-Trailer konnte nicht geschrieben werden (%1) + + + + FillLeftRightEffect + + + Type + Typ + + + + Fill Left with Right + Linke Seite mit Rechter füllen + + + + Fill Right with Left + Rechte Seite mit Linker füllen + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Frei0r plugin konnte nicht geladen werden (%1:%2) + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + HINWEIS: Sie können keine 32-bit Frei0r Plugins in einer 64-bit Version von Olive laden. Sie benötigen entweder eine 64-bit Version des Plugins oder eine 32-bit Version von Olive. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + HINWEIS: Sie können keine 64-bit Frei0r Plugins in einer 32-bit Version von Olive laden. Sie benötigen entweder eine 32-bit Version des Plugins oder eine 64-bit Version von Olive. + + + + Error loading Frei0r plugin + Fehler beim Laden des Frei0r Plugins + + + + GraphEditor + + + Graph Editor + Grafischer Editor + + + + Linear + Same as in english + Linear + + + + Bezier + Same as in english + Bezier + + + + Hold + Does this make sense? (is a handle button meant?) + Halten + + + + GraphView + + + Zoom to Selection + In die Auswahl zoomen + + + + Zoom to Show All + Zommen, um alles anzuzeigen + + + + Reset View + Ansicht zurücksetzen + + + + InterlacingName + + + None (Progressive) + Keine (Progressive) + + + + Top Field First + Oberes Feld zuerst + + + + Bottom Field First + Unteres Feld zuerst + + + + Invalid + Ungültig + + + + KeyframeNavigator + + + Enable Keyframes + Keyframes aktivieren + + + + KeyframeView + + + Linear + Same as in english + Linear + + + + Bezier + Same as in english + Bezier + + + + Hold + Does this make sense? + Halten + + + + LabelSlider + + + &Edit + &Bearbeiten + + + + &Reset to Default + + + + + + Set Value + Wert ändern + + + + + New value: + Neuer Wert: + + + + LoadDialog + + + Loading... + Lädt... + + + + Loading '%1'... + Lädt '%1'... + + + + Cancel + Abbrechen + + + + LoadThread + + + Version Mismatch + Unterschiedliche Versionen + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Dieses Projekt wurde mit einer anderen Version von Olive gespeichert und ist möglicherweise nicht vollständig kompatibel. Wollen Sie trotzdem versuchen, es zu laden? + + + + Invalid Clip Link + Ungültiger Clip Link + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Sounds better in German but has same sense + Dieses Projekt enthält eine ungültige Verlinkung zu einem Clip. Das Projekt ist möglicherweise beschädigt. Wollen Sie es dennoch versuchen? + + + + %1 - Line: %2 Col: %3 + %1 - Zeile: %2 Spalte: %3 + + + + User aborted loading + Ladevorgang durch Nutzer abgebrochen + + + + XML Parsing Error + Does not make sense to translate this + XML Parsing Error + + + + Couldn't load '%1'. %2 + '%1' konnte nicht geladen werden. (%2) + + + + Project Load Error + Projektladefehler + + + + Error loading project: %1 + Fehler beim Laden des Projektes: %1 + + + + MainWindow + + Auto-recovery + Auto-Wiederherstellung + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive wurde nicht richtig beendet und eine Wiederherstellungsdatei wurde gefunden. Möchten Sie diese öffnen? + + + &Project + &Projekt + + + &Sequence + &Sequenz + + + &Folder + &Ordner + + + Set In Point + Also for following translations: Not sure if sense is matched + Anfangspunkt festlegen + + + Set Out Point + Endpunkt festlegen + + + Enable/Disable In/Out Point + Anfangs-/Endpunkt aktivieren/deaktiviern + + + + Welcome to %1 + Willkommen in %1 + + + Reset In Point + Anfangspunkt zurücksetzen + + + Reset Out Point + Endpunkt zurücksetzen + + + Clear In/Out Point + Anfangs-/Endpunkt löschen + + + No active sequence + Keine aktive Sequenz + + + Please open the sequence you wish to export. + Bitte öffnen Sie die Sequenz, die Sie exportieren möchten. + + + Save Project As... + Projekt speichern als... + + + Unsaved Project + Ungespeichertes Projekt + + + This project has changed since it was last saved. Would you like to save it before closing? + Das Projekt enthält ungespeicherte Änderungen. Wollen Sie diese jetzt speichern? + + + + &File + &Datei + + + + &New + &Neu + + + + &Open Project + Projekt &öffnen + + + + Clear Recent List + 'Zuletzt geöffnet' leeren + + + + Open Recent + Zuletzt Verwendete öffnen + + + + &Save Project + &Projekt speichern + + + + Save Project &As + Projekt speichern &als... + + + + &Import... + &Importieren... + + + + &Export... + &Exportieren + + + + E&xit + B&eenden + + + + &Edit + &Bearbeiten + + + + &Undo + &Rückgängig + + + + Redo + Wiederholen + + + Cu&t + &Ausschneiden + + + Cop&y + &Kopieren + + + &Paste + &Einfügen + + + Duplicate + Duplizieren + + + Delete + Löschen + + + Ripple Delete + In Premiere's translations its also called "Ripple Delete" + Ripple Delete + + + Split + Teilen + + + + Select &All + Alles &auswählen + + + + Deselect All + Auswahl aufheben + + + Add Default Transition + Standardübergang einfügen + + + Link/Unlink + Verbinden/Trennen + + + Enable/Disable + Einblenden/Ausblenden + + + Nest + Schachteln + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + Marker setzen/bearbeiten + + + + &View + &Ansicht + + + + Zoom In + Hereinzoomen + + + + Zoom Out + Herauszoomen + + + + Increase Track Height + Spurhöhe erhöhen + + + + Decrease Track Height + Spurhöhe verringern + + + + Toggle Show All + + + + + Track Lines + Spurlinien + + + + Rectified Waveforms + Nachgebesserte Waveforms + + + + Frames + Frames + + + + Drop Frame + Same word used in German + Drop Frame + + + + Non-Drop Frame + Same word used in German + Non-Drop Frame + + + + Milliseconds + Millisekunden + + + + Title/Action Safe Area + Sicherer Titelbereich + + + + Off + Aus + + + + Default + Standard + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + Benutzerdefiniert + + + + Full Screen + Vollbild + + + + Full Screen Viewer + Does this make sense? + Vollbild-Viewer + + + + &Playback + Should we translate this? Playback is also known + &Wiedergabe + + + + Go to Start + Zum Start gehen + + + + Previous Frame + Vorheriger Frame + + + + Play/Pause + Does not make sense to translate + Play/Pause + + + + Play In to Out + Von Anfang bis Ende wiedergeben + + + + Next Frame + Nächster Frame + + + + Go to End + Zum Ende springen + + + + Go to Previous Cut + Zum vorherigen Schnitt springen + + + + Go to Next Cut + Zum nächsten Schnitt springen + + + + Go to In Point + Zum Anfangspunkt springen + + + + Go to Out Point + Zum Endpunkt springen + + + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + + + Auto-Cut Silence + + + + Decrease Speed + Geschwindigkeit verringern + + + Pause + Same as in english + Pause + + + Increase Speed + Geschwindigkeit erhöhen + + + + Loop + Schleife + + + + &Window + &Fenster + + + + Project + Projekt + + + + Effect Controls + Effektsteuerung + + + + Timeline + Same as in english + Timeline + + + + Graph Editor + Grafischer Editor + + + + Media Viewer + Does this make sense to translate? + Media Viewer + + + + Sequence Viewer + Does this make sense to translate? + Sequence Viewer + + + + Maximize Panel + Panel maximieren + + + + Lock Panels + Panel sperren + + + + Reset to Default Layout + Zum Standard-Layout zurücksetzen + + + + &Tools + &Werkzeuge + + + + Pointer Tool + Does this make sense? + Zeiger + + + + Edit Tool + Bearbeitungs-Werkzeug + + + + Ripple Tool + Same as 'Ripple Delete' + Ripple-Werkzeug + + + + Razor Tool + Schneide-Werkzeug + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + Hand-Werkzeug + + + + Transition Tool + Übergangs-Werkzeug + + + + Enable Snapping + Snapping aktivieren + + + Scroll Wheel Zooms + Could be better + Scrollrad zoomt + + + Enable Drag Files to Timeline + Dateien auf Timeline ziehen aktivieren + + + Auto-Scale By Default + Skaliere automatisch + + + Audio Scrubbing + Same as in english + Audio Scrubbing + + + Enable Drop on Media to Replace + Auf Medien zum Ersetzen ziehen aktivieren + + + Ask For Name When Setting Marker + Nach Namen fragen, wenn Marker gesetzt wird + + + + No Auto-Scroll + Kein Auto-Scroll + + + + Page Auto-Scroll + Seiten Auto-Scroll + + + + Smooth Auto-Scroll + Weiches Auto-Scroll + + + + Preferences + Einstellungen + + + + Clear Undo + Rückgängig-Historie leeren + + + + &Help + &Hilfe + + + + A&ction Search + &Aktionensuche + + + + Debug Log + Same as in english + Debug-Log + + + + &About... + &Über... + + + + <untitled> + <unbenannt> + + + Open Project... + Projekt öffnen... + + + Missing recent project + Zuletzt geöffnetes Projekt existiert nicht + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie es aus der Liste entfernen? + + + Invalid aspect ratio + Ungültiges Seitenverhältnis + + + The aspect ratio '%1' is invalid. Please try again. + Das Seitenverhältnis '%1' ist ungültig. Bitte versuchen Sie es erneut. + + + Enter custom aspect ratio + Benutzerdefiniertes Seitenverhältnis eingeben + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Geben Sie das Seitenverhältnis für den sicheren Bereich ein (z.B. 16:9): + + + Nested Sequence + Geschachtelte Sequenz + + + + Marker + + + Set Marker + Marker setzen + + + + Set clip marker name: + + + + + Set sequence marker name: + + + + + Media + + + New Folder + Neuer Ordner: + + + + Name: + Name: + + + + Filename: + Dateiname: + + + + Video Dimensions: + Video-Dimensionen: + + + + Frame Rate: + Bildrate: + + + %1 fields (%2 frames) + %1 Felder (%2 frames) + + + + %1 field(s) (%2 frame(s)) + + + + + Interlacing: + Same as in english + Interlacing: + + + + Audio Frequency: + Audiofrequenz: + + + + Audio Channels: + Audiokanäle: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Name: %1 +Video-Dimensionen: %2x%3 +Bildrate: %4 +Audiofrequenz: %5 +Audio Layout: %6 + + + + Name + Name + + + + Duration + Dauer + + + + Rate + Same as in english, differently spoken, but same meaning + Rate + + + + MediaPropertiesDialog + + + "%1" Properties + "%1" Eigenschaften + + + + Tracks: + Spuren: + + + + Video %1: %2x%3 %4FPS + Same as in english + Video %1: %2x%3 %4FPS + + + Audio %1: %2Hz %3 channels + Audio %1: %2Hz %3 Kanäle + + + + Audio %1: %2Hz %3 + Audio %1: %2Hz %3 + + + + %n channel(s) + + %n Kanal + %n Kanäle + + + + + Conform to Frame Rate: + Entspricht Bildrate: + + + + Alpha is Premultiplied + Alpha ist vormultipliziert + + + + Auto (%1) + Same? + Auto (%1) + + + + Interlacing: + Same as in english + Interlacing: + + + + Name: + Same as in english + Name: + + + + MenuHelper + + + &Project + &Projekt + + + + &Sequence + &Sequenz + + + + &Folder + &Ordner + + + + Set In Point + Anfangspunkt festlegen + + + + Set Out Point + Endpunkt festlegen + + + + Reset In Point + Anfangspunkt zurücksetzen + + + + Reset Out Point + Endpunkt zurücksetzen + + + + Clear In/Out Point + Anfangs-/Endpunkt löschen + + + + Add Default Transition + Standardübergang einfügen + + + + Link/Unlink + Verbinden/Trennen + + + + Enable/Disable + Einblenden/Ausblenden + + + + Nest + Schachteln + + + + Cu&t + &Ausschneiden + + + + Cop&y + &Kopieren + + + + + &Paste + &Einfügen + + + + Paste Insert + + + + + Duplicate + Duplizieren + + + + Delete + Löschen + + + + Ripple Delete + Ripple Delete + + + + Split + Teilen + + + + Invalid aspect ratio + Ungültiges Seitenverhältnis + + + + The aspect ratio '%1' is invalid. Please try again. + Das Seitenverhältnis '%1' ist ungültig. Bitte versuchen Sie es erneut. + + + + Enter custom aspect ratio + Benutzerdefiniertes Seitenverhältnis eingeben + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Geben Sie das Seitenverhältnis für den sicheren Bereich ein (z.B. 16:9): + + + + NewSequenceDialog + + + Editing "%1" + Bearbeitung von "%1" + + + + New Sequence + Neue Sequenz + + + + Preset: + Could be also preset + Vorgabe: + + + + Film 4K + Film 4K + + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + Benutzerdefiniert + + + + Video + Same as in english + Video + + + + Width: + Breite: + + + + Height: + Höhe: + + + + Frame Rate: + Bildrate: + + + + Pixel Aspect Ratio: + Pixel-Seitenverhältnis: + + + + Square Pixels (1.0) + Quadratische Pixel (1.0) + + + + Interlacing: + Same as in english + Interlacing: + + + + None (Progressive) + Keine (Progressive) + + + + Audio + Same as in english + Audio + + + + Sample Rate: + Abtastrate: + + + + Name: + Name: + + + + OliveGlobal + + + Olive Project %1 + Olive-Projekt %1 + + + + Auto-recovery + Auto-Wiederherstellung + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive wurde nicht richtig beendet und eine Wiederherstellungsdatei wurde gefunden. Möchten Sie diese öffnen? + + + + Open Project... + Projekt öffnen... + + + + Missing recent project + Zuletzt geöffnetes Projekt existiert nicht + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie es aus der Liste entfernen? + + + + Save Project As... + Projekt speichern als... + + + + Unsaved Project + Ungespeichertes Projekt + + + + This project has changed since it was last saved. Would you like to save it before closing? + Das Projekt enthält ungespeicherte Änderungen. Wollen Sie diese jetzt speichern? + + + + No active sequence + Keine aktive Sequenz + + + + Please open the sequence to perform this action. + Bitte öffnen Sie die Sequenz um diese Aktion auszuführen. + + + + No clips selected + Keine Clips ausgewählt + + + + Select the clips you wish to auto-cut + + + + Please open the sequence you wish to export. + Bitte öffnen Sie die Sequenz, die Sie exportieren möchten. + + + + Missing Project File + Projektdatei fehlt + + + + Specified project '%1' does not exist. + Das Projekt '%1' existiert nicht. + + + + PanEffect + + + Pan + Schwenken + + + + Playback + + Generating Proxy: %1% + Proxy wird generiert: %1% + + + + PreferencesDialog + + + Preferences + Einstellungen + + + + Invalid CSS File + Ungültige CSS Datei + + + + CSS file '%1' does not exist. + CSS Datei '%1' existiert nicht. + + + Warning + Achtung + + + Some changed settings will require restarting Olive to take effect + Einige Änderungen erfordern einen Neustart von Olive, um angwendet zu werden + + + + Confirm Reset All Shortcuts + Bestätige das Zurücksetzen aller Shortcuts + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Sind Sie sicher, dass Sie alle Tastatur-Shortcuts zurücksetzen wollen? + + + + Import Keyboard Shortcuts + Tastatur-Shortcuts importieren + + + + + Error saving shortcuts + Fehler beim Speichern der Shortcuts + + + + Failed to open file for reading + Fehler beim öffnen der Datei + + + + Export Keyboard Shortcuts + Tastatur-Shortcuts exportieren + + + + Export Shortcuts + Shortcuts exportieren + + + + Shortcuts exported successfully + Shortcuts wurden erfolgreich exportiert + + + + Failed to open file for writing + Fehler beim Schreiben der Datei + + + + Browse for CSS file + Nach CSS Datei suchen + + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + + Language: + Sprache: + + + + Default Sequence Settings + Sequenzeinstellungen auf Standard setzen + + + + Add Default Effects to New Clips + + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + Scrollrad zoomt + + + + Hold CTRL to toggle this setting + Halten Sie STRG um diese Einstellung anzuzeigen + + + + Invert Timeline Scroll Axes + + + + + Enable Drag Files to Timeline + Dateien auf Timeline ziehen aktivieren + + + + Auto-Scale By Default + Skaliere automatisch + + + + Auto-Seek to Imported Clips + + + + + Audio Scrubbing + Audio Scrubbing + + + + Drop Files on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + Nach Namen fragen, wenn Marker gesetzt wird + + + + Appearance + Erscheinungsbild + + + + Theme + Thema + + + + Olive Dark (Default) + Olive Dunkel (Standard) + + + + Olive Light + Olive Hell + + + + Native + Nativ (System UI) + + + + Native (Light Icons) + Nativ (Helle Icons) + + + + Use Native Menu Styling + + + + + Custom CSS: + Benutzerdefiniertes CSS: + + + + Browse + Durchsuchen + + + + Image sequence formats: + Bilddateiformate: + + + + Audio Recording: + Audioaufnahmen: + + + + Mono + Same as in english + Mono + + + + Stereo + Same as in english + Stereo + + + + Effect Textbox Lines: + Effekt Textbox-Linien: + + + + Default Sequence + Standard Sequenz: + + + + Thumbnail Resolution: + Thumbnail-Auflösung: + + + + Waveform Resolution: + + + + + Delete Previews + + + + + Use Software Fallbacks When Possible + Absicherung durch Software-Defaults + + + + General + Allgemein + + + + Behavior + Verhalten + + + Disable Multithreading on Images + Multithreading auf Bildern deaktiviern + + + Seeking + Suche + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + Genaue Suche +Zeigt immer den richtigen Frame (kann optisch kurzzeitig anhalten, wenn Frame abgefragt wird) + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + Schnelle Suche +Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Plaback aus) + + + + Memory Usage + Speicherauslastung + + + + Upcoming Frame Queue: + Anstehende Frame-Warteschlange: + + + + + frames + Could also use 'Bilder' + Frames + + + + + seconds + Sekunden + + + + Previous Frame Queue: + Vorherige Frame-Warteschlange: + + + + Playback + Wiedergabe + + + + Output Device: + Ausgabegerät: + + + + + Default + Standard + + + + Input Device: + Eingabegerät: + + + + Sample Rate: + Abtastrate: + + + + Audio + Audio + + + + Search for action or shortcut + Nach Eintrag oder Shortcut suchen + + + + Action + Eintrag + + + + Shortcut + Shortcut + + + + Import + Importieren + + + + Export + Exportieren + + + + Reset Selected + Ausgewählte zurücksetzen + + + + Reset All + Alle zurücksetzen + + + + Keyboard + Tastatur + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + + + + + Could not open file - %1 + Konnte Datei nicht öffnen - %1 + + + + Could not find stream information - %1 + Konnte Stream-Informationen nicht finden - %1 + + + + Project + + + New + Neu + + + + Open Project + Projekt öffnen + + + + Save Project + Projekt speichern + + + + Undo + + + + + Redo + Wiederholen + + + + Tree View + Tree View + + + + Icon View + Icon View + + + + List View + + + + + Search media, markers, etc. + + + + + Project + Projekt + + + + Sequence + Sequenz + + + + Replace '%1' + Ersetze '%1' + + + + + All Files + Alle Dateien + + + + + No active sequence + Keine aktive Sequenz + + + + No sequence is active, please open the sequence you want to replace clips from. + Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips ersetzen möchten. + + + + Active sequence selected + Aktive Sequenz ausgewählt + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + Sequenz kann nicht sich selbst zugewiesen werden, da es keine Medien enthalten würde. + + + + Rename '%1' + '%1' umbenennen + + + + Enter new name: + Neuen Namen eingeben: + + + + Delete media in use? + Verwendete Datei löschen? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + Die Datei '%1' wird aktuell in '%2' benutzt. Wenn Sie sie löschen, werden alle Instanzen in der Sequenz entfernt. Sind Sie sicher? + + + + Skip + Überspringen + + + + Import a Project + Ein Projekt importieren + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" ist eine Olive-Projektdatei. Das Projekt wird automatisch mit diesem Projekt zusammengeführt. Möchten Sie fortfahren? + + + + Image sequence detected + Bildsequenz erkannt + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + Die Datei '%1' scheint eine Bildsequenz zu enthalten. Möchten Sie sie als solche importieren? + + + + Import media... + Medien importieren... + + + + No sequence is active, please open the sequence you want to delete clips from. + Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips löschen möchten. + + + + ProxyDialog + + + Create Proxy + Proxy erstellen + + + + Proxy + Same as in english + Proxy + + + + Dimensions: + Dimensionen: + + + + Same Size as Source + Selbe Größe wie Quelle + + + + Half Resolution (1/2) + + + + + Quarter Resolution (1/4) + + + + + Eighth Resolution (1/8) + + + + + Sixteenth Resolution (1/16) + + + + + Format: + Format: + + + + ProRes HQ + ProRes HQ + + + + Location: + Pfad: + + + + Same as Source (in "%1" folder) + Genau wie Quelle (in Ordner "%1") + + + + Proxy file exists + Proxy-Datei existiert bereits + + + + The file "%1" already exists. Do you wish to replace it? + Die Datei "%1" existiert bereits. Möchten Sie sie ersetzen? + + + + Custom Location + Benutzerdefinierter Pfad + + + + ProxyGenerator + + + Finished generating proxy for "%1" + Proxy-Generierung für "%1" wurde abgeschlossen + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Ersetze Clips unter Verwendung von "%1" + + + + Select which media you want to replace this media's clips with: + Wählen Sie, welche Medien mit den Clips dieser Medien ersetzt werden sollen + + + + Keep the same media in-points + Anfangspunkte der Medien behalten + + + + Replace + Ersetzen + + + + Cancel + Abbrechen + + + + No media selected + Keine Medien ausgewählt + + + + Please select a media to replace with or click 'Cancel'. + Bitten wählen Sie Medien zum Ersetzen aus oder klicken Sie auf 'Abbrechen'. + + + + Same media selected + Identische Medien ausgewählt + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Sie haben die gleichen Medien ausgewählt, die Sie ersetzen möchten. Bitte wählen Sie andere Medien oder klicken Sie auf 'Abbrechen'. + + + + Folder selected + Ordner ausgewählt + + + + You cannot replace footage with a folder. + Sie können Footage nicht mit einem Ordner austauschen. + + + + Active sequence selected + Aktive Sequenz ausgewählt + + + + You cannot insert a sequence into itself. + Sie können keine Sequenz in die selbe einsetzen. + + + + RichTextEffect + + + Text + Text + + + + Padding + + + + + Position + Position + + + + Vertical Align: + Vertikale Ausrichtung: + + + + Top + Oben + + + + Center + Mitte + + + + Bottom + Unten + + + + Auto-Scroll + + + + + Off + Aus + + + + Up + Hoch + + + + Down + Runter + + + + Left + Links + + + + Right + Rechts + + + + Shadow + Schatten + + + + Shadow Color + Schattenfarbe + + + + Shadow Angle + + + + + Shadow Distance + Schattenentfernung + + + + Shadow Softness + Schattensoftness + + + + Shadow Opacity + Schattendeckkraft + + + + Sequence + + + %1 (copy) + %1 (kopieren) + + + + ShakeEffect + + + Intensity + Intentsität + + + + Rotation + Sames as in english, but differently spoken + Rotation + + + + Frequency + Frequenz + + + + SolidEffect + + + Type + Typ + + + + Solid Color + AE and Premiere handle this in the same way + Solid + + + + SMPTE Bars + SMPTE Farbstreifen + + + + Checkerboard + Schachbrettmuster + + + + Opacity + Deckkraft + + + + Color + Farbe + + + + Checkerboard Size + Größe Schachbrettmuster + + + + SourcesCommon + + + Import... + Importieren... + + + + New + Neu + + + + View + Ansicht + + + + Tree View + A translation would be not recommended due to misunderstanding + Tree View + + + + Icon View + A translation would be not recommended due to misunderstanding + Icon View + + + + Show Toolbar + Toolbar anzeigen + + + + Show Sequences + Sequenzen anzeigen + + + + Replace/Relink Media + Medien ersetzen/neu verbinden + + + + Reveal in Explorer + Im Explorer anzeigen + + + + Reveal in Finder + Im Finder anzeigen + + + + Reveal in File Manager + Im File Manager anzeigen + + + + Replace Clips Using This Media + Ersetze Clips die diese Medien benutzen + + + + Create Sequence With This Media + Sequenz mit diesen Medien erstellen + + + + Duplicate + Duplizieren + + + + Delete All Clips Using This Media + Alle Clips, die diese Medien enthalten löschen + + + + Proxy + Proxy + + + + Generating proxy: %1% complete + Proxy wird generiert: %1% fertig + + + + Create/Modify Proxy + Erstelle/Modifiziere Proxy + + + + Create Proxy + Proxy erstellen + + + + Modify Proxy + Proxy modifizieren + + + + Restore Original + Original wiederherstellen + + + + Delete + Löschen + + + + Preview in Media Viewer + Vorschau im Media Viewer + + + + Properties... + Eigenschaften... + + + + Replace Media + Medien ersetzen + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Sie haben eine Datei auf '%1' gezogen. Möchten Sie diese ersetzen? + + + + Delete proxy + Proxy löschen + + + + Would you like to delete the proxy file "%1" as well? + Möchten Sie die Proxy-Datei "%1" ebenfalls löschen? + + + + SpeedDialog + + + Speed/Duration + Geschwindigkeit/Dauer + + + + Speed: + Geschwindigkeit: + + + + Frame Rate: + Bildrate: + + + + Duration: + Dauer: + + + + Reverse + Rückwärts + + + + Maintain Audio Pitch + Tonhöhe erhalten + + + + Ripple Changes + Ripple-Änderungen + + + + TextEditDialog + + + Edit Text + Text bearbeiten + + + + Thin + Dünn + + + + Extra Light + + + + + Light + + + + + Normal + Normal + + + + Medium + + + + + Demi Bold + + + + + Bold + + + + + Extra Bold + + + + + Black + + + + + TextEditEx + + + Edit Text + Text bearbeiten + + + + &Edit Text + &Text bearbeiten + + + + TextEffect + + + Text + Same as in english + Text + + + + Font + Schriftart + + + + Size + Größe + + + + Color + Farbe + + + + Alignment + Ausrichtung + + + + Left + Links + + + + + Center + Mitte + + + + Right + Rechts + + + + Justify + Ausrichten + + + + Top + Oben + + + + Bottom + Unten + + + + Word Wrap + Zeilenumbruch + + + + Padding + + + + + Position + Position + + + + Outline + Umriss + + + + Outline Color + Umrissfarbe + + + + Outline Width + Umrissbreite + + + + Shadow + Schatten + + + + Shadow Color + Schattenfarbe + + + + Shadow Angle + + + + + Shadow Distance + Schattenentfernung + + + + Shadow Softness + Schattensoftness + + + + Shadow Opacity + Schattendeckkraft + + + + Sample Text + Beispieltext + + + &Edit Text + &Text bearbeiten + + + + TimecodeEffect + + + Timecode + Zeitstempel + + + + Sequence + Sequenz + + + + Media + Medien + + + + Scale + Skalierung + + + + Color + Farbe + + + + Background Color + Hintergrundfarbe + + + + Background Opacity + Hintergrunddeckkraft + + + + Offset + Versatz + + + + Prepend + Voreinstellung + + + + Timeline + + + Timeline: + Makes no sense to translate + Timeline: + + + <none> + <keine> + + + + Effect already exists + Effekt existiert bereits + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + Der Clip '%1' enthält bereits den Effekt '%2'. Möchten Sie diesen ersetzen oder ihn als separaten Effekt hinzufügen? + + + + Add + Hinzufügen + + + + Replace + Ersetzen + + + + Skip + Überspringen + + + + Do this for all conflicts found + Auf alle gefundenen Konflikte anwenden + + + Set Marker + Marker setzen + + + Set marker name: + Marker-Name setzen: + + + + Title... + Titel... + + + + Solid Color... + Solid... + + + + Bars... + Balken... + + + + Tone... + Ton... + + + + Noise... + Rauschen... + + + + Unsaved Project + Ungespeichertes Projekt + + + + You must save this project before you can record audio in it. + Sie müssen das Projekt speichern, bevor Sie Audio aufnehmen können. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Klicken Sie auf die Timeline, an welcher Stelle Sie mit der Aufnahme beginnen möchten (Ziehen, um das Limit der Aufnahme auf einen bestimmten Timeframe zu setzen) + + + + Pointer Tool + Pointer-Werkzeug + + + + Edit Tool + Bearbeitungs-Werkzeug + + + + Ripple Tool + Ripple-Werkzeug + + + + Razor Tool + Schneide-Werkzeug + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + Hand-Werkzeug + + + + Transition Tool + Übergangs-Werkzeug + + + + Snapping + Same as in english + Snapping + + + + Zoom In + Hereinzommen + + + + Zoom Out + Herauszoomen + + + + Record audio + Audio aufnehmen + + + + Add title, solid, bars, etc. + Titel, Solid, Balken, etc. Hinzufügen + + + + Nested Sequence + Geschachtelte Sequenz + + + + (none) + (keine) + + + + TimelineHeader + + + Center Timecodes + Timecodes zentrieren + + + + TimelineWidget + + + &Undo + &Rückgängig + + + + &Redo + + + + C&ut + &Ausschneiden + + + Cop&y + &Kopieren + + + &Paste + &Einfügen + + + R&ipple Delete + Taken from Premiere + R&ipple Delete + + + + Sequence Settings + Sequenz-Einstellungen + + + + &Speed/Duration + &Geschwindigkeit/Dauer + + + Auto-s&cale + Auto-&Skalierung + + + Enable/Disable + Einblenden/Ausblenden + + + Link/Unlink + Verbinden/Trennen + + + + &Reveal in Project + &Im Projekt anzeigen + + + R&ename + U&mbenennen + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Start: %2 +Ende: %3 +Dauer: %4 + + + Rename '%1' + '%1' umbenennen + + + Rename multiple clips + Mehrere Clips umbenennen + + + Enter a new name for this clip: + Geben Sie einen neuen Namen für den Clip ein: + + + + R&ipple Delete Empty Space + + + + + Auto-Cut Silence + + + + + Auto-S&cale + + + + + Properties + Eigenschaften + + + + Error + Fehler + + + + Couldn't locate media wrapper for sequence. + Konnte den Medienwrapper für diese Sequenz nicht finden. + + + + Title + Titel + + + + Solid Color + Solid + + + + Bars + Balken + + + + Tone + Ton + + + + Noise + Rauschen + + + + Duration: + Dauer: + + + + ToneEffect + + + Type + Typ + + + + Sine + Sinus + + + + Frequency + Frequenz + + + + Amount + Menge + + + + Mix + Same as in english + Mix + + + + TransformEffect + + + Position + Same as in english, differently spoken + Position + + + + Scale + Skalierung + + + + Uniform Scale + Einheitliche Skalierung + + + + Rotation + Same as in english, differently spoken + Rotation + + + + Anchor Point + Ankerpunkt + + + + Opacity + Deckkraft + + + + Blend Mode + Mischmodus + + + + Normal + Same as in english, differently spoken + Normal + + + Darken + Verdunkeln + + + Multiply + Vervielfachen + + + Color Burn + Makes no sense to translate + Color Burn + + + Linear Burn + Makes no sense to translate + Linear Burn + + + Lighten + Aufhellen + + + Screen + Makes no sense to translate + Screen + + + Color Dodge + Color-Dodge + + + Linear Dodge (Add) + Addieren + + + Overlay + Überlagern + + + Soft Light + Weiches Licht + + + Hard Light + Hartes Licht + + + Vivid Light + Lebhaftes Licht + + + Linear Light + Lineares Licht + + + Pin Light + Scharfes Licht + + + Hard Mix + Hartes Mischen + + + Difference + Differenz + + + Exclusion + Ausgrenzung + + + Reflect + Spiegeln + + + Substract + Abziehen + + + Average + Durschnitt + + + Glow + Leuchten + + + Negation + Negativ + + + Phoenix + Same as in english + Phoenix + + + + Transition + + Length: + Länge: + + + + Length + Länge + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + Ein Update ist für Olive ist verfügbar. Besuchen Sie www.olivevideoeditor.org um es herunterzuladen. + + + + VSTHost + + + + Error loading VST plugin + Fehler beim Laden des VST Plugins + + + Failed to create VST reference + Fehler beim Herstellen einer VST Referenz + + + + Failed to load VST plugin "%1": %2 + Fehler beim Laden des VST Plugins "%1":%2 + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + HINWEIS: Sie können keine 32-bit VST Plugins in einer 64-bit Version von Olive laden. Sie benötigen entweder eine 64-bit Version des Plugins oder eine 32-bit Version von Olive. + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + HINWEIS: Sie können keine 64-bit VST Plugins in einer 32-bit Version von Olive laden. Sie benötigen entweder eine 32-bit Version des Plugins oder eine 64-bit Version von Olive. + + + + Failed to locate entry point for dynamic library. + Kein Einstiegspunkt für dynamische Bibliothek gefunden. + + + + VST Error + VST Fehler + + + + Plugin's magic number is invalid + Die Magic Number des Plugins ist ungültig + + + + Plugin + Same as in english + Plugin + + + + Interface + Benutzeroberfläche + + + + Show + Anzeigen + + + + VST Plugin + Same as in english + VST Plugin + + + + Viewer + + + Sequence Viewer + Sequenz-Viewer + + + + Media Viewer + Medien-Viewer + + + + (none) + (keine) + + + + Drag video only + + + + + Drag audio only + + + + + ViewerWidget + + + Save Frame as Image... + Frame als Bild speichern... + + + + Show Fullscreen + Vollbildschirm + + + + Disable + Ausblenden + + + + Screen %1: %2x%3 + Screen %1:%2x%3 + + + + Zoom + Same as in english + Zoom + + + + Fit + Einpassen + + + + Custom + Benutzerdefiniert + + + + Close Media + Medien schließen + + + + Save Frame + Frame speichern + + + + Viewer Zoom + Makes no sense to translate + Viewer Zoom + + + + Set Custom Zoom Value: + Benutzerdefinierten Zoomwert angeben + + + + ViewerWindow + + + Exit Fullscreen + Vollbild verlassen + + + + VoidEffect + + + (unknown) + (unbekannt) + + + + Missing Effect + Effekt fehlt + + + + VolumeEffect + + + Volume + Lautstärke + + + + transition + + + Invalid transition + Ungültiger Übergang + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + Kein Kandidat für den Übergang '%1'. Der Übergang ist möglicherweise beschädigt. Eine Neuinstallation wird empfohlen. + + + diff --git a/app/ts/es_ES.ts b/app/ts/es_ES.ts new file mode 100644 index 000000000..6897bae59 --- /dev/null +++ b/app/ts/es_ES.ts @@ -0,0 +1,4437 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive es un editor de vídeo no lineal. Esta aplicación es gratuita y está protegida bajo la licencia GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + El equipo de Olive está obligado a informar a los usuarios que el código fuente de la aplicación esta disponible para su descarga desde su sitio web. + + + + ActionSearch + + + Search for action... + Búsqueda de acción... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Configuraciones Avanzadas de Vídeo + + + + Pixel Format: + Formato de Píxel: + + + + Threads: + Hilos (Threads): + + + + Audio + + + %1 Audio + %1 Audio + + + + Recording %1 + Grabación %1 + + + + AudioNoiseEffect + + + Amount + Cantidad + + + + Mix + Mezclar + + + + Noise + Ruido + + + + Generate audio noise that can be mixed with this clip. + Generar ruido de audio que se puede mezclar con este clip. + + + + AutoCutSilenceDialog + + + Cut Silence + Corte de silencio + + + + Attack Threshold: + Umbral de ataque: + + + + Attack Time: + Tiempo de ataque: + + + + Release Threshold: + Umbral de liberación: + + + + Release Time: + Tiempo de liberación: + + + + Cacher + + + + Could not open %1 - %2 + No se pudo abrir %1 - %2 + + + + ChannelLayoutName + + + Invalid + Inválido + + + + Mono + Monoaural + + + + Stereo + Estéreo + + + + ClipPropertiesDialog + + + "%1" Properties + "%1" Propiedades + + + + Multiple Clip Properties + Propiedades de múltiples clips + + + + Name: + Nombre: + + + + Duration: + Duración: + + + + (multiple) + (múltiple) + + + + CollapsibleWidget + + + <untitled> + <SinTítulo> + + + + ColorButton + + + Set Color + Establecer color + + + + CornerPinEffect + + + Top Left + Arriba Izquierda + + + + Top Right + Arriba Derecha + + + + Bottom Left + Abajo Izquierda + + + + Bottom Right + Abajo Derecha + + + + Perspective + Perspectiva + + + + Corner Pin + Fijar Esquinas Para Deformar (Corner Pin) + + + + Distort + Distorsionar + + + + Distort/warp this clip by pinning each of its four corners. + Distorsionar/deformar este clip fijando cada una de sus cuatro esquinas. + + + + CrashDialog + + + We're very sorry, Olive has crashed. Please send the following data to developers: + Lo sentimos mucho, se ha producido un error en la aplicación. Por favor envíe los siguientes datos a los desarrolladores de Olive para falcilitar la resolución del problema, gracias: + + + + CrossDissolveTransition + + + Cross Dissolve + Fundido Cruzado + + + + Dissolves + Fundido + + + + Dissolve clips evenly. + Fundir uniformemente los clips. + + + + DebugDialog + + + Debug Log + Registro de depuración + + + + DemoNotice + + + + Welcome to Olive! + ¡Bienvenido a Olive Video Editor! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive es un editor de video gratuito de código abierto lanzado bajo la licencia GPL de GNU. Si ha pagado por este software, ha sido estafado. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Este software se encuentra actualmente en desarrollo y es una versión ALPHA, lo que significa que es inestable y es muy probable que se bloquee, tenga errores y carezca de algunas características. No podemos ofrecerle ninguna garantía, así que úselo bajo su propia responsabilidad. Por favor, informe de cualquier error y no dude en notificarnos características que le gustaría que se incluyan en la aplicación en la siguiente web %1 + + + + Thank you for trying Olive and we hope you enjoy it! + ¡Gracias por probar Olive Vídeo Editor, esperamos que lo disfrutes! + + + + EffectControls + + + Effects: + Efectos: + + + + (none) + (ninguno) + + + + Add Video Effect + Añadir Efecto de Vídeo + + + + VIDEO EFFECTS + EFECTOS DE VÍDEO + + + + Add Video Transition + Añadir Transición de Vídeo + + + + Add Audio Effect + Añadir Efecto de Audio + + + + AUDIO EFFECTS + EFECTOS DE AUDIO + + + + Add Audio Transition + Añadir Transición de Audio + + + + EffectUI + + + %1 (Opening) + %1 (Abriendo) + + + + %1 (Closing) + %1 (Cerrando) + + + + %1 (multiple) + %1 (múltiple) + + + + Cu&t + Cor&tar + + + + &Copy + &Copiar + + + + Move &Up + Mover Arriba (&Up) + + + + Move &Down + Mover Abajo (&Down) + + + + D&elete + &Eliminar + + + + Load Settings From File + Cargar configuración predefinida desde un archivo + + + + Save Settings to File + Guardar configuración predefinida en un archivo + + + + EmbeddedFileChooser + + + File: + Archivo: + + + + ExponentialFadeTransition + + + Exponential Fade + Desvanecimiento exponencial + + + + An exponential audio fade that starts slow and ends fast. + Desvanecimiento de audio exponencial, comienza lento y termina rápido. + + + + ExportDialog + + + Export "%1" + Exportar "%1" + + + + Unknown codec name %1 + Nombre de códec desconocido %1 + + + + Export Failed + La exportación ha fallado + + + + Export failed - %1 + La exportación ha fallado - %1 + + + + Invalid dimensions + Dimensiones no válidas + + + + Export width and height must both be even numbers/divisible by 2. + El ancho y el alto de la exportación deben ser números pares/divisibles entre 2. + + + + Invalid codec + Códec no valido + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + No se pudieron determinar los parámetros de salida para el códec seleccionado. Si esto es un error, por favor, póngase en contacto con los desarrolladores. + + + + Invalid format + Formato no válido + + + + Couldn't determine output format. This is a bug, please contact the developers. + No se pudo determinar el formato de salida. Si esto es un error, por favor, póngase en contacto con los desarrolladores. + + + + Export Media + Exportar Medios + + + + %p% (Total: %1:%2:%3) + %p% (Total: %1:%2:%3) + + + + %p% (ETA: %1:%2:%3) + %p% (ETA: %1:%2:%3) + + + + Quality-based (Constant Rate Factor) + Basado en la Calidad de Factor de Ratio Constante + + + + Constant Bitrate + Velocidad de bits constante + + + + + Invalid Codec + Códec no valido + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Error al encontrar un codificador adecuado para este códec. La exportación probablemente fallará. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Error al encontrar el formato de píxel adecuado para este codificador. La exportación probablemente fallará. + + + + Bitrate (Mbps): + Velocidad de Bits (Mbps): + + + + Quality (CRF): + Calidad (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Factor de Calidad: + +0 = Sin pérdida, sin compresión. (La mejor calidad pero mayor tamaño de archivo) +17-18 = Muy alta calidad, sin pérdida visual. (RECOMENDADO) (Comprimido, pero de manera imperceptible.) +23 = Alta calidad (Recomendado en la mayoría de casos para mantener una buena relación calidad tamaño) +51 = La peor calidad posible (No se recomienda salvo excepciónes donde sea más importante el menor tamaño de archivo que la calidad del vídeo) + + + + Target File Size (MB): + Tamaño del archivo de destino (MB): + + + + Format: + Formato: + + + + Range: + Rango: + + + + Entire Sequence + Secuencia entera + + + + In to Out + De entrada a salida + + + + Video + Vídeo + + + + + Codec: + Codificación (Códec): + + + + Width: + Ancho: + + + + Height: + Alto: + + + + Frame Rate: + Fotogramas por segundo: + + + + Compression Type: + Tipo de Compresión: + + + + Advanced + Avanzado + + + + Audio + Audio + + + + Sampling Rate: + Tasa de muestreo: + + + + Bitrate (Kbps/CBR): + Velocidad de bits (Kbps / CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + Error al enviar los fotogramas al codificador (%1) + + + + failed to receive packet from encoder (%1) + Error al recibir el paquete del codificador (%1) + + + + could not video encoder for %1 + No se ha podido codificar el vídeo para %1 + + + + could not allocate video stream + no se pudo asignar el flujo de video + + + + could not allocate video encoding context + no se pudo asignar el flujo de video + + + + could not open output video encoder (%1) + no se pudo abrir el codificador para el vídeo de salida (%1) + + + + could not copy video encoder parameters to output stream (%1) + no se pudieron copiar los parámetros del codificador de video para este flujo de salida (%1) + + + + could not audio encoder for %1 + no se pudo codificar el audio para %1 + + + + could not allocate audio stream + no se pudo asignar el flujo de audio + + + + could not allocate audio encoding context + no se pudo asignar el contexto de codificación de audio + + + + could not open output audio encoder (%1) + no se pudo abrir el codificador de audio de salida (%1) + + + + could not copy audio encoder parameters to output stream (%1) + no se pudieron copiar los parámetros del codificador de audio al flujo de salida (%1) + + + + could not allocate audio buffer (%1) + no se pudo asignar el búfer de audio (%1) + + + + could not create output format context + no se pudo crear el contexto del formato de salida + + + + could not open output file (%1) + no se pudo abrir el archvo de salida (%1) + + + + could not write output file header (%1) + no se pudo escribir la cabecera del archivo de salida (%1) + + + + could not write output file trailer (%1) + no se pudo escribir el final del archivo de salida (%1) + + + + FFmpegDecoder + + + Failed to find appropriate decoder for this codec (%1 :: %2) + No se pudo encontrar un decodificador adecuado para este códec (%1 :: %2) + + + + Failed to allocate codec context (%1 :: %2) + Error al asignar el contexto del códec (%1 :: %2) + + + + Error decoding %1 - %2 %3 + Error al decodificar %1 - %2 %3 + + + + FillLeftRightEffect + + + Type + Tipo + + + + Fill Left with Right + Rellena a la izquierda con la derecha + + + + Fill Right with Left + Rellena a la derecha con la izquierda + + + + Fill Left/Right + Rellenar Izquierda/Derecha + + + + Replaces either the left or right channel with the other + Reemplaza el canal izquierdo o derecho con el otro + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Falló la carga del plugin Frei0r "%1": %2 + + + + Error loading Frei0r plugin + Error al cargar el plugin Frei0r + + + + GraphEditor + + + Graph Editor + Editor Gráfico + + + + Linear + Lineal + + + + Bezier + Bézier + + + + Hold + Mantener + + + + GraphView + + + Zoom to Selection + Ampliar a la selección + + + + Zoom to Show All + Mostrar todo + + + + Reset View + Resetear vista + + + + InterlacingName + + + None (Progressive) + Ninguno (Progresivo) + + + + Upper Field First + Campo superior primero + + + + Lower Field First + Campo inferior primero + + + + Invalid + No válido + + + + Top Field First + Campo de arriba primero + + + + Bottom Field First + Campo de abajo primero + + + + KeyframeNavigator + + + Enable Keyframes + Habilitar fotogramas clave + + + + KeyframeView + + + Linear + Lineal + + + + Bezier + Bézier + + + + Hold + Mantener + + + + LabelSlider + + + &Edit + &Editar + + + + &Reset to Default + &Restablecer a Predeterminados + + + + + Set Value + Establecer Valor + + + + + New value: + Nuevo Valor: + + + + LinearFadeTransition + + + Linear Fade + Fundido Lineal + + + + An linear audio fade that fades evenly at a constant rate. + Desvanecimiento lineal del audio a una velocidad constante. + + + + LoadDialog + + + Loading... + Cargando... + + + + Loading '%1'... + Cargando '%1'... + + + + Cancel + Cancelar + + + + LoadThread + + + Version Mismatch + La versión no coincide + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Este proyecto se guardó en una versión diferente de Olive y puede que no sea totalmente compatible con esta versión ¿Deseas intentar abrirlo de todos modos? + + + + %1 - Line: %2 Col: %3 + %1 - Línea: %2 Col: %3 + + + + User aborted loading + Carga cancelada por el usuario + + + + XML Parsing Error + Error de análisis XML + + + + Couldn't load '%1'. %2 + No se pudo cargar '%1'. %2 + + + + Project Load Error + La carga del proyecto falló + + + + Error loading project: %1 + Error al cargar el proyecto: %1 + + + + Invalid Clip Link + Enlace al clip inválido + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Este proyecto contiene un enlace de clip no válido. Puede haberse movido o estar corrupto. ¿Te gustaría seguir cargándolo? + + + + LogarithmicFadeTransition + + + Logarithmic Fade + Desvanecimiento logarítmico + + + + An logarithmic audio fade that starts fast and ends slow. + Un desvanecimiento de audio logarítmico que comienza rápido y termina lentamente. + + + + MainWindow + + + Welcome to %1 + Bienvenido a %1 + + + + &File + &Archivo + + + + &New + &Nuevo + + + + &Open Project + &Abrir Proyecto + + + + Clear Recent List + Limpiar lista de recientes + + + + Open Recent + Abrir Recientes + + + + &Save Project + &Guardar Proyecto + + + + Save Project &As + G&uardar Proyecto Como + + + + &Import... + &Importar... + + + + &Export... + &Exportar... + + + + E&xit + &Cerrar la aplicación + + + + &Edit + &Editar + + + + &Undo + Deshacer Cambios (&Undo) + + + + Redo + Rehacer Cambios + + + + Select &All + Seleccion&ar Todo + + + + Deselect All + Deseleccionar Todo + + + + Ripple to In Point + Extraer desde el punto de inicio del clip + + + + Ripple to Out Point + Extraer desde el punto final del clip + + + + Edit to In Point + Eliminar desde el punto de inicio del clip + + + + Edit to Out Point + Eliminar desde el punto final del clip + + + + Delete In/Out Point + Eliminar lo comprendido entre los puntos de Entrada/Salida + + + + Track Lines + Ver líneas de las pistas + + + + Ripple Delete In/Out Point + Extraer lo comprendido entre los puntos de Entrada/Salida + + + + Set/Edit Marker + Establecer/Editar Marcador + + + + &View + &Ver + + + + Zoom In + Ampliar + + + + Zoom Out + Reducir + + + + Increase Track Height + Aumentar la altura de la pista + + + + Decrease Track Height + Disminuir la altura de la pista + + + + Toggle Show All + Alternar Mostrar Todo + + + + OpenColorIO Config Error + Error de configuración de OpenColorIO + + + + Failed to set OpenColorIO configuration: %1 + Error al establecer la configuración de OpenColorIO: %1 + + + + Rectified Waveforms + Ondas de audio recortadas + + + + Frames + Fotogramas + + + + Drop Frame + Descartar fotograma (Drop Frame) + + + + Non-Drop Frame + No descartar fotograma (Non-Drop Frame) + + + + Milliseconds + Milisegundos + + + + Title/Action Safe Area + Area segura para Titulos y Acción + + + + Off + Apagado + + + + Default + Por defecto + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + Personalizado + + + + Full Screen + Pantalla completa + + + + Full Screen Viewer + Visor a pantalla completa + + + + &Playback + &Reproducción + + + + Go to Start + Ir al inicio + + + + Previous Frame + Fotograma anterior + + + + Play/Pause + Reproducir/Pausar + + + + Play In to Out + Reproducir desde la marca de entrada a la marca de salida + + + + Next Frame + Siguiente fotograma + + + + Go to End + Ir al final + + + + Go to Previous Cut + Ir al corte anterior + + + + Go to Next Cut + Ir al siguiente corte + + + + Go to In Point + Ir al punto de entrada + + + + Go to Out Point + Ir al punto de salida + + + + Shuttle Left + Reproducir hacia la Izquierda (Inversa) + + + + Shuttle Stop + Parar la Reproducción + + + + Shuttle Right + Reproducir hacia la Derecha (Normal) + + + + Loop + Bucle (Loop) + + + + &Window + Ve&ntana + + + + Project + Proyecto + + + + Effect Controls + Controles de efectos + + + + Timeline + Línea de Tiempo + + + + Graph Editor + Editor Gráfico + + + + Node Editor + Editor de Nodos + + + + Media Viewer + Visor de Medios + + + + Sequence Viewer + Visor de Secuencias + + + + Maximize Panel + Maximizar Panel + + + + Lock Panels + Bloquear Paneles + + + + Reset to Default Layout + Restaurar valores por defecto de la interfaz + + + + &Tools + &Herramientas + + + + Pointer Tool + Puntero de Selección/Edición/Mover Clips + + + + Edit Tool + Herramienta de Selección + + + + Ripple Tool + Herramienta para Enrrollar/Desenrrollar + + + + Razor Tool + Herramienta de Corte + + + + Slip Tool + Deslizar clip sin desplazar + + + + Slide Tool + Desplazar clip afectando a los clips contiguos + + + + Hand Tool + Mano para ajustar la vista (No afecta a la edición) + + + + Transition Tool + Herramienta para Inserción de Transiciones + + + + Enable Snapping + Habilitar Imán de Ajuste + + + + Auto-Cut Silence + Auto Cortar en los Silencios + + + + No Auto-Scroll + Sin desplazamiento automático + + + + Page Auto-Scroll + Desplazamiento automático de páginas + + + + Smooth Auto-Scroll + Desplazamiento automático suave + + + + Preferences + Preferencias + + + + Clear Undo + Limpiar historial de Deshacer + + + + &Help + A&yuda + + + + A&ction Search + &Buscar + + + + Debug Log + Registro de depuración + + + + &About... + &Acerca de... + + + + <untitled> + <SinTítulo> + + + + Marker + + + + Set Marker + Establecer Marca + + + + Set clip marker name: + Establecer el nombre del marcador de clip: + + + + Set sequence marker name: + Establecer el nombre del marcador de secuencia: + + + + Media + + + New Folder + Nueva Carpeta + + + + Name: + Nombre: + + + + Filename: + Nombre de Archivo: + + + + Video Dimensions: + Dimensiones de Vídeo: + + + + Frame Rate: + Fotogramas por Segundo: + + + + %1 field(s) (%2 frame(s)) + %1 Campo(s) (%2 Fotograma(s)) + + + + Interlacing: + Entrelazado: + + + + Audio Frequency: + Frecuencia del Audio: + + + + Audio Channels: + Canales de Audio: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Nombre: %1 +Dimensiones del Vídeo: %2x%3 +Fotogramas por Segundo: %4 +Frecuencia del Audio: %5 +Audio: %6 + + + + Name + Nombre + + + + Duration + Duración + + + + Rate + Velocidad + + + + MediaPropertiesDialog + + + "%1" Properties + "%1" Propiedades + + + + Tracks: + Pistas: + + + + Video %1: %2x%3 %4FPS + Vídeo %1: %2x%3 %4FPS + + + + Audio %1: %2Hz %3 + Audio %1: %2Hz %3 + + + + %n channel(s) + + %n canal + %n canales + + + + + Conform to Frame Rate: + Conforme a la velocidad de fotogramas: + + + + Alpha is Premultiplied + Canal Alfa Premultiplicado + + + + Auto (%1) + Automático (%1) + + + + Interlacing: + Entrelazado: + + + + Color Space: + Espacio de color: + + + + Name: + Nombre: + + + + MenuHelper + + + &Project + &Proyecto + + + + &Sequence + &Sequencia + + + + &Folder + &Carpeta + + + + Set In Point + Establecer punto de entrada + + + + Set Out Point + Establecer punto de salida + + + + Reset In Point + Resetear punto de entrada + + + + Reset Out Point + Resetear punto de salida + + + + Clear In/Out Point + Limpiar puntos de Entrada/Salida + + + + Add Default Transition + Añadir Transición predeterminada + + + + Link/Unlink + Unir/Separar clips seleccionados + + + + Enable/Disable + Habilitar/Deshabilitar clips seleccionados + + + + Nest + Anidar selección en una secuencia + + + + Cu&t + Cortar (&x) + + + + Cop&y + &Copiar + + + + + &Paste + &Pegar + + + + Paste Insert + Insertar (Pegar) + + + + Duplicate + Duplicar + + + + Delete + Eliminar Selección (No elimina el hueco) + + + + Ripple Delete + Extraer Selección (Elimina el hueco) + + + + Split + Dividir clips + + + + Invalid aspect ratio + Relación de aspecto no válida + + + + The aspect ratio '%1' is invalid. Please try again. + La relación de aspecto '%1' no es válida. Inténtalo de nuevo. + + + + Enter custom aspect ratio + Introduzca una relación de aspecto personalizada + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Ingrese la relación de aspecto a usar para el área segura de título/acción (por ejemplo, 16:9): + + + + NewSequenceDialog + + + Editing "%1" + Edición "%1" + + + + New Sequence + Nueva Secuencia + + + + Preset: + Preestablecidos: + + + + Film 4K + Película 4K + + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + Personalizado + + + + Video + Vídeo + + + + Width: + Ancho: + + + + Height: + Alto: + + + + Frame Rate: + Velocidad de Fotogramas (FPS): + + + + Pixel Aspect Ratio: + Relación de aspecto de píxeles: + + + + Square Pixels (1.0) + Píxeles cuadrados (1.0) + + + + Interlacing: + Entrelazado: + + + + None (Progressive) + Ninguno (Progresivo) + + + + Audio + Audio + + + + Sample Rate: + Frecuencia de muestreo: + + + + Name: + Name: + + + + Node + + + Node + Nodo + + + + NodeBlock + + + Previous + Anterior + + + + Next + Siguiente + + + + Block + Bloquear + + + + NodeEditor + + + Node Editor + Editor de Nodos + + + + NodeIO + + + Disable Keyframes + Desconectar Fotogramas Clave + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + ¡Al desactivar los fotogramas clave se eliminarán todos los fotogramas clave actuales! ¿Seguro que quieres hacer esto? + + + + NodeMedia + + + Matrix + Matriz + + + + Texture + Textura + + + + Media + Medios + + + + NodeTexturePassthru + + + + Texture + Textura + + + + Image Output + Salida de imagen + + + + NodeVideoClip + + + + Texture + Textura + + + + NodeView + + + Node Editor + Editor de Nodos + + + + OldEffectNode + + + Save Effect Settings + Guardar Ajustes del Efecto + + + + + Effect XML Settings %1 + Configuración de efectos XML %1 + + + + Save Settings Failed + El guardado de los ajustes a fallado + + + + Failed to open "%1" for writing. + Error al abrir "%1" para escribir. + + + + Load Effect Settings + Cargar Ajustes del Efecto + + + + + Load Settings Failed + La carga de los ajustes ha fallado + + + + Failed to open "%1" for reading. + Error al abrir "%1" para leer. + + + + This settings file doesn't match this effect. + Este archivo de configuración no es valido para este efecto. + + + + OliveGlobal + + + Olive Project %1 + Proyecto de Olive %1 + + + + Auto-recovery + Recuperación Automática + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive no se cerró correctamente y se generó un archivo de recuperación automática. ¿Deseas abrirlo? + + + + Effect already exists + Effect already exists + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + El clip '%1' ya contiene un efecto '%2'. ¿Desea reemplazarlo con el que está pegando o agregarlo como un efecto separado? + + + + Add + Añadir + + + + Replace + Reemplazar + + + + Skip + Omitir + + + + Do this for all conflicts found + Haga esto para todos los conflictos encontrados + + + + Open Project... + Abrir Preyecto... + + + + Missing recent project + No se encuentra este proyecto reciente, si lo ha movido de su ubicación desde que lo guardo por última vez deberá abrirlo manualmente + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + El proyecto '%1' ya no existe. ¿Deseas eliminarlo de la lista de proyectos recientes? + + + + Save Project As... + Guardar Proyecto Como... + + + + Unsaved Project + Proyecto no guardado + + + + This project has changed since it was last saved. Would you like to save it before closing? + ¡ADVERTENCIA! Se han realizado cambios desde la última vez que se guardó. ¿Deseas guardar éstos antes de cerrar? + + + + Import media... + Importar Medios... + + + + All Files + Todos los Archivos + + + + No active sequence + Ninguna Secuaencia Activa + + + + Please open the sequence to perform this action. + Por favor, abra la secuencia para realizar esta acción. + + + + No clips selected + Ningún Clip Seleccionado + + + + Select the clips you wish to auto-cut + Seleccione los clips que desea cortar automáticamente + + + + Missing Project File + No se encuentra el archivo de proyecto + + + + Specified project '%1' does not exist. + El proyecto especificado '%1' no existe. + + + + PanEffect + + + + Pan + Panorámica + + + + Modifying the panning on a stereo audio clip. + Modificar la panorámica en un clip de audio estéreo. + + + + PreferencesDialog + + + Preferences + Preferencias + + + + Default Sequence + Secuencia Predeterminada + + + + Invalid CSS File + Archivo CSS NO válido + + + + CSS file '%1' does not exist. + El archivo CSS '%1' NO existe. + + + + Confirm Reset All Shortcuts + Confirmar restablecer todos los accesos directos + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + ¿Está seguro de que desea restablecer todos los métodos abreviados de teclado a sus valores predeterminados? + + + + Import Keyboard Shortcuts + Importar Accesos Rápidos de Teclado + + + + + Error saving shortcuts + Error al guardar los Accesos Rápidos + + + + Failed to open file for reading + Error al abrir el archivo de lectura + + + + Export Keyboard Shortcuts + Exportar los Accesos Rápidos de Teclado + + + + Export Shortcuts + Exportar Accesos Rápidos + + + + Shortcuts exported successfully + Atajos exportados exitosamente + + + + Failed to open file for writing + Error al abrir el archivo para escribir + + + + Browse for CSS file + Buscar el archivo CSS + + + + Delete All Previews + Eliminar todas las vistas previas + + + + Are you sure you want to delete all previews? + ¿Estás seguro de que deseas eliminar todas las vistas previas? + + + + Previews Deleted + Vistas previas eliminadas + + + + Language: + Idioma: + + + + Default Sequence Settings + Configuración predeterminada +de las secuencias + + + + Add Default Effects to New Clips + Añadir efectos predeterminados a los nuevos clips + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + Ir al principio cuando iniciamos la reproducción +con el cursor al final de la secuencia + + + + Selecting Also Seeks + Al seleccionar un clip +poner el cursor en su inico + + + + Edit Tool Also Seeks + Poner el cursor de reproducción +al inicio de la selección + + + + Edit Tool Selects Links + La selección incluye +los clips vinculados + + + + Seek Also Selects + El cursor de reproducción +selecciona los clips que cruza + + + + Seek to the End of Pastes + Desplazar el cursor al final de lo pegado + + + + Scroll Wheel Zooms + Usar rueda del ratón para hacer zoom + + + + Hold CTRL to toggle this setting + Mantenga presionada la tecla CTRL para cambiar esta configuración + + + + Invert Timeline Scroll Axes + Rueda del ratón desplaza la línea de tiempo + + + + Enable Drag Files to Timeline + Habilitar poder arrastrar archivos a la línea de tiempo + + + + Auto-Scale By Default + Escala automática por defecto + + + + Auto-Seek to Imported Clips + Búsqueda automática de clips importados + + + + Audio Scrubbing + Limpiar o depurar Audio + + + + Drop Files on Media to Replace + Colocar archivos de medios para reemplazar + + + + Enable Hover Focus + Habilitar Enfoque flotante + + + + Ask For Name When Setting Marker + Preguntar por el nombre al insertar un marcador + + + + Appearance + Apariencia + + + + Theme + Tema + + + + Olive Dark (Default) + Olive Oscuro (Por defecto) + + + + Olive Light + Olive Claro + + + + Native + Nativo del sistema + + + + Native (Light Icons) + Nativo con Iconos Claros + + + + Use Native Menu Styling + Usar el estilo de menú nativo + + + + Custom CSS: + CSS Personalizado: + + + + + Browse + Buscar + + + + Image sequence formats: + Secuencia de imágenes. +Formatos: + + + + Audio Recording: + Grabación de audio en: + + + + Mono + Monoaural (1 canal) + + + + Stereo + Estéreo (2 canales) + + + + Effect Textbox Lines: + Efectos de inserción de Texto. +Líneas de los Cuadros de Texto: + + + + (None) + (Nada) + + + + OpenColorIO Config Error + Error de configuración de OpenColorIO + + + + Failed to set OpenColorIO configuration: %1 + Error al establecer la configuración de OpenColorIO: %1 + + + + Invalid OpenColorIO Configuration File + Archivo de configuración de OpenColorIO no válido + + + + You must specify an OpenColorIO configuration file if color management is enabled. + Debe especificar un archivo de configuración de OpenColorIO si la administración de color está habilitada. + + + + OpenColorIO configuration file '%1' does not exist. + El archivo de configuración de OpenColorIO '%1' no existe. + + + + Browse for OpenColorIO configuration + Buscar la configuración OpenColorIO + + + + All previews deleted successfully. You may have to re-open your current project for changes to take effect. + Todas las vistas previas eliminadas con éxito. Es posible que tenga que volver a abrir su proyecto actual para que los cambios surtan efecto. + + + + Thumbnail Resolution: + Resolución miniaturas: + + + + Waveform Resolution: + Resolución Onda de Audio: + + + + Delete Previews + Eliminar vistas previas + + + + Use Software Fallbacks When Possible + Use los recursos de software cuando sea posible + + + + Don't Use Proxies When Exporting + No use proxies al exportar + + + + Use originals instead of proxies when exporting + Use originales en lugar de proxies al exportar + + + + General + General + + + + Behavior + Comportamiento + + + + Memory Usage + Uso de Memoria + + + + Upcoming Frame Queue: + Cargar cola de fotogramas en: + + + + + frames + Fotogramas + + + + + seconds + segundos + + + + Previous Frame Queue: + Cola de fotogramas anteriores en: + + + + Playback + Reproducir + + + + Output Device: + Dispositivo de Salida: + + + + + Default + Por defecto + + + + Input Device: + Dispositivo de Entrada: + + + + Sample Rate: + Frecuencia de muestreo: + + + + Audio + Audio + + + + Enable Color Management + Habilitar la gestión del color + + + + OpenColorIO Config File: + Archivo de configuración de OpenColorIO: + + + + Default Input Color Space: + Espacio de color de entrada predeterminado: + + + + Display: + Monitor: + + + + View: + Ver: + + + + Look: + Mira: + + + + Bit Depth + Profundidad de bits + + + + Playback (Offline): + Reproducción (sin conexión): + + + + Export (Online): + Exportar (sin conexión): + + + + Color Management + Manejo del color + + + + Search for action or shortcut + Buscar acción o atajo + + + + Action + Acción + + + + Shortcut + Atajo + + + + Import + Importar + + + + Export + Exportar + + + + Reset Selected + Restablecer lo Seleccionado + + + + Reset All + Restablecer Todo + + + + Keyboard + Atajos de Teclado + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + Error al encontrar cualquier transmisión de video/audio válida + + + + Could not open file - %1 + No se pudo abrir el archivo -%1 + + + + Could not find stream information - %1 + No se pudo encontrar la información de la secuencia -%1 + + + + Project + + + New + Nuevo + + + + Open Project + Abrir Proyecto + + + + Save Project + Guardar Proyecto + + + + Undo + Deshacer los cambiós + + + + Redo + Reacer los cambios + + + + Tree View + Ver en árbol + + + + Icon View + Ver como iconos + + + + List View + Ver en modo lista + + + + Search media, markers, etc. + Buscar archivos multimedia, marcas, etc. + + + + Project + Proyecto + + + + + No active sequence + Sin secuencia activa + + + + No sequence is active, please open the sequence you want to replace clips from. + Ninguna secuencia está activa, abra la secuencia desde la que desea reemplazar los clips. + + + + Active sequence selected + Secuencia activa seleccionada + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + No puede insertar una secuencia en sí misma, por lo que no habrá clips de este medio en esta secuencia. + + + + Rename '%1' + Renombrar '%1' + + + + Enter new name: + Introduzca un nuevo nombre: + + + + Delete media in use? + ¿Realmente quieres borrar este archivo que está en uso? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + El medio '%1' se usa actualmente en '%2'. Al eliminarlo se eliminarán todas las instancias en la secuencia. ¿Seguro que quieres hacer esto? + + + + Skip + Saltar/Omitir + + + + No sequence is active, please open the sequence you want to delete clips from. + Ninguna secuencia está activa, abra la secuencia de la que desea eliminar los clips. + + + + Sequence + Secuencia + + + + Replace '%1' + Reemplazar '%1' + + + + + All Files + Todos los archivos + + + + Import a Project + Importar un proyecto + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" es un archivo de proyecto de Olive. Se fusionará con este proyecto. ¿Desea continuar? + + + + Image sequence detected + Secuencia de imágenes detectada + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + El archivo '%1' parece ser parte de una secuencia de imágenes. ¿Te gustaría importarlo como tal? + + + + Import media... + Importar Medios... + + + + ProjectModel + + + Sequence %1 + Secuencia %1 + + + + Import a Project + Importar un proyecto + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" es un archivo de proyecto de Olive. Se fusionará con este proyecto. ¿Desea continuar? + + + + Image sequence detected + Secuencia de Imágenes Detectada + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + El archivo '%1' parece ser parte de una secuencia de imágenes. ¿Te gustaría importarlo como tal? + + + + ProxyDialog + + + Create Proxy + Crear Proxy + + + + Proxy + Proxy + + + + Dimensions: + Dimensiones: + + + + Same Size as Source + Mismo tamaño que la fuente + + + + Half Resolution (1/2) + Resolución a la mitad (1/2) + + + + Quarter Resolution (1/4) + Resolución a un cuarto (1/4) + + + + Eighth Resolution (1/8) + Resolución a un octavo (1/8) + + + + Sixteenth Resolution (1/16) + Resolución a un dieciseisavo (1/16) + + + + Format: + Formato: + + + + ProRes HQ + ProRes HQ + + + + Location: + Localización: + + + + Same as Source (in "%1" folder) + Igual que la fuente (en la carpeta "%1") + + + + Proxy file exists + El archivo proxy existe + + + + The file "%1" already exists. Do you wish to replace it? + El archivo "%1" ya existe. ¿Desea reemplazarlo? + + + + Custom Location + Ubicación Personalizada + + + + ProxyGenerator + + + Finished generating proxy for "%1" + Terminado de generar el proxy para "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Reemplazar clips usando "%1" + + + + Select which media you want to replace this media's clips with: + Seleccione el medio con el que desea reemplazar los clips de este medio por: + + + + Keep the same media in-points + Mantener los mismos puntos de entrada de medios + + + + Replace + Reemplazar + + + + Cancel + Cancelar + + + + No media selected + Ningún medio seleccionado + + + + Please select a media to replace with or click 'Cancel'. + Seleccione un medio para reemplazar o haga clic en "Cancelar". + + + + Same media selected + Mismo medio seleccionado + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Seleccionó el mismo medio que está reemplazando. Por favor, seleccione uno diferente o haga clic en 'Cancelar'. + + + + Folder selected + Carpeta Seleccionada + + + + You cannot replace footage with a folder. + No puedes reemplazar las imágenes con una carpeta. + + + + Active sequence selected + Secuencia activa seleccionada + + + + You cannot insert a sequence into itself. + No puedes insertar una secuencia en sí misma. + + + + RichTextEffect + + + Text + Texto + + + + Padding + Márgenes + + + + Position + Posición + + + + Vertical Align: + Alineación Vertical: + + + + Top + Arriba + + + + Center + Centro + + + + Bottom + Abajo + + + + Auto-Scroll + Desplazamiento automático + + + + Off + Apagado + + + + Up + Arriba + + + + Down + Abajo + + + + Left + Izquierda + + + + Right + Derecha + + + + Shadow + Sombra + + + + Shadow Color + Color de la Sombra + + + + Shadow Angle + Angulo de la Sombra + + + + Shadow Distance + Distancia de la Sombra + + + + Shadow Softness + Suavizado de la Sombra + + + + Shadow Opacity + Opacidad de la Sombra + + + + Rich Text + Texto enriquecido + + + + Render + Renderizar (Calcular) + + + + Render formatted rich text over a clip. + Renderizar texto enriquecido formateado sobre un clip. + + + + Sequence + + + %1 (copy) + %1 (copiar) + + + + ShakeEffect + + + Intensity + Intensidad + + + + Rotation + Rotación + + + + Frequency + Frecuencia + + + + Shake + Temblor/Movimiento + + + + Distort + Distorsionar + + + + Simulate a camera shake movement. + Simular movimiento de la cámara. + + + + SolidEffect + + + Type + Tipo + + + + Solid Color + Color Sólido + + + + SMPTE Bars + Barras SMPTE + + + + Checkerboard + Tablero de damas + + + + Opacity + Opacidad + + + + Color + Color + + + + Checkerboard Size + Tamaño de los cuadros + + + + Solid + Sólido + + + + Render + Renderizar/Calcular + + + + Render a solid color over this clip. + Renderiza un color sólido sobre este clip. + + + + SourcesCommon + + + Import... + Impotar... + + + + New + Nuevo + + + + View + Ver + + + + Tree View + Vista en árbol + + + + Icon View + Vista de Icono + + + + Show Toolbar + Mostrar la barra de herramientas + + + + Show Sequences + Mostrar Secuencias + + + + Replace/Relink Media + Reemplazar/Revincular Medios + + + + Reveal in Explorer + Revelar en el explorador + + + + Reveal in Finder + Revelar en el buscador + + + + Reveal in File Manager + Revelar en el administrador de archivos + + + + Replace Clips Using This Media + Reemplazar clips utilizando este medio + + + + Create Sequence With This Media + Crear secuencia con este medio + + + + Duplicate + Duplicar + + + + Delete All Clips Using This Media + Eliminar todos los clips que utilizan este medio + + + + Proxy + Trabajar con Proxy + + + + Generating proxy: %1% complete + Generando proxy: %1% completado + + + + Create/Modify Proxy + Crear/Modificar Proxy + + + + Create Proxy + Crear Proxy + + + + Modify Proxy + Modificar Proxy + + + + Restore Original + Restaurar Original + + + + Delete + Eliminar + + + + Preview in Media Viewer + Previsualizar en el visor de medios + + + + Properties... + Propiedades... + + + + Replace '%1' + Reemplazar '%1' + + + + All Files + Todos los archivos + + + + Replace Media + Reemplazar medios + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Has colocado un archivo en '%1'. ¿Te gustaría reemplazarlo con el archivo caído? + + + + Delete proxy + Eliminar Proxy + + + + Would you like to delete the proxy file "%1" as well? + ¿Desea eliminar el archivo proxy "%1" también? + + + + SpeedDialog + + + Speed/Duration + Velocidad/Duración + + + + Speed: + Velocidad: + + + + Frame Rate: + Velocidad +Fotogramas: + + + + Duration: + Duración: + + + + Reverse + Invertir Dirección + + + + Maintain Audio Pitch + Mantener el Tono del Audio + + + + Ripple Changes + Desplazar clips contiguos + + + + TextEditDialog + + + Edit Text + Editar texto + + + + Thin + Fino + + + + Extra Light + Extra Fino + + + + Light + Suave + + + + Normal + Normal + + + + Medium + Medio + + + + Demi Bold + Semi Negrita + + + + Bold + Negrita + + + + Extra Bold + Extra Negrita + + + + Black + Grueso + + + + TextEditEx + + + Edit Text + Editar Texto + + + + &Edit Text + &Editar Texto + + + + TextEffect + + + + Text + Texto + + + + Font + Fuente + + + + Size + Tamaño + + + + Color + Color + + + + Horizontal Alignment + Alineación Horizontal + + + + Left + Izquierda + + + + + Center + Centrado + + + + Right + Derecha + + + + Justify + Justificado + + + + Vertical Alignment + Alineación Vertical + + + + Top + Arriba + + + + Bottom + Abajo + + + + Alignment + Alineación + + + + Word Wrap + Ajuste de línea + + + + Padding + Márgenes + + + + Position + Posición + + + + Outline + Contorno + + + + Outline Color + Color Contorno + + + + Outline Width + Ancho del Contorno + + + + Shadow + Sombra + + + + Shadow Color + Color Sombra + + + + Shadow Angle + Ángulo Sombra + + + + Shadow Distance + Distancia Sombra + + + + Shadow Softness + Suavidad Sombra + + + + Shadow Opacity + Opacidad Sombra + + + + Sample Text + Texto de ejemplo + + + + Render + Renderizar + + + + Generate simple text over this clip + Generar texto simple sobre este clip + + + + TimecodeEffect + + + + Timecode + Código de Tiempo + + + + Sequence + Secuencia + + + + Media + Clip + + + + Scale + Escala + + + + Color + Color + + + + Background Color + Color del Fondo + + + + Background Opacity + Opacidad del Fondo + + + + Offset + Compensar x-y + + + + Prepend + Anteponer + + + + Render + Renderizar + + + + Render the media or sequence timecode on this clip. + Renderice el código de tiempo de los medios, o la secuencia, en este clip. + + + + Timeline + + + Timeline: + Línea de Tiempo: + + + + Nested Sequence + Secuencia Anidada + + + + Title... + Título... + + + + Solid Color... + Color Sólido... + + + + Bars... + Barras... + + + + Tone... + Tono... + + + + Noise... + Ruido... + + + + Unsaved Project + Proyecto sin guardar + + + + You must save this project before you can record audio in it. + Debe guardar este proyecto antes de poder grabar audio en él. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Haga clic en la línea de tiempo donde desea iniciar la grabación (arrastre para limitar la grabación a un determinado período de tiempo) + + + + Video Transitions + Transiciones de Vídeo + + + + Audio Transitions + Transiciones de Audio + + + + Timeline: %1 + Linea de Tiempo: %1 + + + + (none) + (Ninguno) + + + + Pointer Tool + Puntero de Selección/Edición/Mover Clips + + + + Edit Tool + Herramienta de Selección + + + + Ripple Tool + Herramienta para Enrrollar/Desenrrollar + + + + Razor Tool + Herramienta de corte + + + + Slip Tool + Deslizar clip sin desplazar + + + + Slide Tool + Desplazar clip afectando a los clips contiguos + + + + Hand Tool + Herramienta de Mano + + + + Transition Tool + Herramienta para Inserción de Transiciones + + + + Snapping + Imantar + + + + Zoom In + Acercar (Zoom) + + + + Zoom Out + Alejar (Zoom) + + + + Record audio + Grabar Audio + + + + Add title, solid, bars, etc. + Añadir clip de:. + + + + Effect already exists + El efecto ya existe + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + El clip '%1' ya contiene el efecto '%2'. ¿Desea reemplazarlo con el pegado o agregarlo como un efecto separado? + + + + Add + Añadir + + + + Replace + Reemplazar + + + + Skip + Omitir + + + + Do this for all conflicts found + Haga esto para todos los conflictos encontrados + + + + TimelineHeader + + + Center Timecodes + Centrar Código de Tiempo + + + + TimelineLabel + + + Rename Track + Renombrar Pista + + + + Enter the new name for this track + Introduzca el nuevo nombre para esta pista + + + + TimelineView + + + &Undo + &Deshacer + + + + &Redo + &Rehacer + + + + R&ipple Delete Empty Space + &Eliminar espacio vacío + + + + Sequence Settings + Ajustes de la Secuencia + + + + &Speed/Duration + Cambiar &Velocidad/Duración + + + + Auto-Cut Silence + Auto Cortar en los Silencios + + + + Auto-S&cale + Escala Aut&omática + + + + &Reveal in Project + &Revelar en Proyecto + + + + Properties + Propiedades + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Inicio: %2 +Final: %3 +Duración: %4 + + + + Error + Error + + + + Couldn't locate media wrapper for sequence. + No se pudo localizar el contenedor de medios para la secuencia. + + + + Title + Título + + + + Solid Color + Color Sólido + + + + Bars + Barras + + + + Tone + Tono + + + + Noise + Ruido + + + + Duration: + Duración: + + + + TimelineWidget + + + &Undo + &Deshacer + + + + &Redo + &Rehacer + + + + Sequence Settings + Ajustes de la Secuencia + + + + &Speed/Duration + Cambiar &Velocidad/Duración + + + + &Reveal in Project + &Revelar en Proyecto + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Inicio: %2 +Final: %3 +Duración: %4 + + + + R&ipple Delete Empty Space + &Eliminar espacio vacío + + + + Auto-Cut Silence + Auto Cortar en los Silencios + + + + Auto-S&cale + Escala Aut&omática + + + + Properties + Propiedades + + + + Error + Error + + + + Couldn't locate media wrapper for sequence. + No se pudo localizar el contenedor de medios para la secuencia. + + + + Title + Título + + + + Solid Color + Color Sólido + + + + Bars + Barras + + + + Tone + Tono + + + + Noise + Ruido + + + + Duration: + Duración: + + + + ToneEffect + + + Type + Tipo + + + + Sine + Sinusoidal + + + + Frequency + Frecuencia + + + + Amount + Cantidad + + + + Mix + Mezclar + + + + Tone + Tono + + + + Generate a sine wave tone to mix into this clip's audio. + Genera un tono de onda sinusoidal para mezclarlo con el audio de este clip. + + + + Track + + + Video %1 + Vídeo %1 + + + + Audio %1 + Audio %1 + + + + Subtitle %1 + Subtítulo %1 + + + + Unknown %1 + Desconocido %1 + + + + TransformEffect + + + Position + Posición + + + + Scale + Escala + + + + Uniform Scale + Escala Uniforme + + + + Rotation + Rotación + + + + Anchor Point + Punto de Ancla + + + + Opacity + Opacidad + + + + Transform + Transformación + + + + Distort + Distorsionar + + + + Transform the position, scale, and rotation of this clip. + Transformar la posición, escala y rotación de este clip. + + + + Blend Mode + Modo de Fusión + + + + Normal + Normal + + + + Transition + + + Length + Longitud + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + Una actualización está disponible en el sitio web de Olive. Visita www.olivevideoeditor.org para descargarla. + + + + Invalid transition + Transición No Válida + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + Ningún candidato para la transición '%1'. Esta transición puede estar corrupta. Intenta volver a instalarla o reinstala Olive. + + + + VSTHost + + + + Error loading VST plugin + Error al cargar el Plugin VST + + + + Failed to load VST plugin "%1": %2 + Falló la carga del complemento VST "%1":%2 + + + + Failed to locate entry point for dynamic library. + Error al localizar el punto de entrada para la librería dinámica. + + + + VST Error + VST Error + + + + Plugin's magic number is invalid + El número mágico de Plugin no es válido + + + + Plugin + Plugin + + + + Interface + Interface + + + + Show + Mostrar + + + + VST Plugin 2.x + VST Plugin 2.x + + + + Use a VST 2.x plugin on this clip's audio. + Utilice un Plugin VST 2.x en el audio de este clip. + + + + VST Plugin + Plugin VST + + + + Viewer + + + Viewer: %1 + Visionar: %1 + + + + Failed to import recorded file + No se pudo importar el archivo grabado + + + + An error occurred trying to import the recorded audio + Se ha producido un error al intentar importar el audio grabado + + + + (none) + (ninguno) + + + + Drag video only + Sólo arrastrar Vídeo + + + + Drag audio only + Sólo arrastrar Audio + + + + Sequence Viewer: %1 + Visor de secuencia:%1 + + + + Media Viewer: %1 + Visor de Medios: %1 + + + + Sequence Viewer + Visor de Secuencias + + + + Media Viewer + Visor de Medios + + + + ViewerWidget + + + Save Frame as Image... + Guardar fotograma como imagen... + + + + Show Fullscreen + Pantalla Completa + + + + Disable + Desconectar + + + + Screen %1: %2x%3 + Pantalla %1: %2x%3 + + + + Zoom + Zoom + + + + Fit + Ajuste Automático + + + + Custom + Personalizado + + + + Close Media + Cerrar Medios + + + + Save Frame + Guardar Fotograma + + + + Viewer Zoom + Visor de Zoom + + + + Set Custom Zoom Value: + Establecer valor de zoom personalizado: + + + + ViewerWindow + + + Exit Fullscreen + Salir de la Pantalla Completa + + + + VoidEffect + + + (unknown) + (Desconocido) + + + + Missing Effect + Efecto faltante + + + + VolumeEffect + + + + Volume + Volumen + + + + Adjust the volume of this clip's audio + Ajusta el volumen de los clips de audio + + + + bitdepths + + + 8-bit + 8-bit + + + + 16-bit Integer + 16-bit Entero + + + + Half-Float (16-bit) + Medio-Coma-Flotante (16-bit) + + + + Full-Float (32-bit) + Máximo-Coma-Flotante (32-bit) + + + + Effect + + + Invalid effect + Efecto no válido + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + Ningún candidato para el efecto '%1'. Este efecto parece estar corrupto. Pruebe a reinstalarlo o reinstale Olive. + + + + Save Effect Settings + Guardar los ajustes del efecto + + + + + Effect XML Settings %1 + Ajustes XML del efecto %1 + + + + Save Settings Failed + Falló guardar los ajustes + + + + Failed to open "%1" for writing. + Falló la apertura "%1" para escritura. + + + + Load Effect Settings + Cargar los ajuste del efecto + + + + + Load Settings Failed + Falló la carga de los ajustes + + + + Failed to open "%1" for reading. + Falló la apertura "%1" para lectura. + + + + This settings file doesn't match this effect. + Estos ajustes no son para este efecto. + + + + EffectRow + + + Disable Keyframes + Desactivar fotogramas clave + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + ¡Desconectar los fotogramas clave los eliminará! ¿Relamente los quieres eliminar? + + + diff --git a/app/ts/fr_FR.ts b/app/ts/fr_FR.ts new file mode 100644 index 000000000..19af75204 --- /dev/null +++ b/app/ts/fr_FR.ts @@ -0,0 +1,4093 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive est un logiciel de montage non-linéaire. Ce logiciel est libre et protégé par la licence GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + L'équipe d'Olive vous informe que le code source d'Olive est disponible au téléchargement sur son site Web. + + + + ActionSearch + + + Search for action... + Rechercher une action… + + + + AdvancedVideoDialog + + + Advanced Video Settings + Paramètres vidéo avancés + + + + Pixel Format: + Format de pixel : + + + + Threads: + + + + + Audio + + Audio + Audio + + + Recording + Enregistrement audio + + + + %1 Audio + + + + + Recording %1 + + + + + AudioNoiseEffect + + + Amount + Quantité + + + + Mix + Mélanger + + + + AutoCutSilenceDialog + + + Cut Silence + + + + + Attack Threshold: + + + + + Attack Time: + + + + + Release Threshold: + + + + + Release Time: + + + + + Cacher + + + + Could not open %1 - %2 + + + + + ChannelLayoutName + + + Invalid + Invalide + + + + Mono + Mono + + + + Stereo + Stéréo + + + + ClipPropertiesDialog + + + "%1" Properties + "%1" Propriétés + + + + Multiple Clip Properties + + + + + Name: + Nom : + + + + Duration: + Durée : + + + + (multiple) + + + + + CollapsibleWidget + + + <untitled> + &lt;Sans titre&gt; + + + + ColorButton + + + Set Color + Définir la couleur + + + + CornerPinEffect + + + Top Left + En haut à gauche + + + + Top Right + En haut à droite + + + + Bottom Left + En bas à gauche + + + + Bottom Right + En bas à droite + + + + Perspective + Perspective + + + + DebugDialog + + + Debug Log + Journal de débogage + + + + DemoNotice + + + + Welcome to Olive! + Bienvenue dans Olive ! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive est un logiciel libre et open-source distribué sous la licence GNU GPL. Si vous avez payé pour ce logiciel, vous avez été victime d'un scam. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Ce logiciel est actuellement en ALPHA, ce qui signifie qu'il a de grandes chances de planter, d'avoir des bugs ou de manquer de certaines fonctions. Nous n'offrons aucune garantie, utilisez-le à vos propres risques. Merci de nous rapporter tout bug ou demande d'ajout d'une fonctionnalité à %1 + + + + Thank you for trying Olive and we hope you enjoy it! + Merci d'utiliser Olive, nous espérons que vous l'apprécierez ! + + + + Effect + + + Invalid effect + Effet invalide + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + Aucun candidat pour l'effet '%1'. C'est effet est peut-être corrompu. Essayez de le réinstaller, ou de réinstaller Olive. + + + Cu&t + &Couper + + + &Copy + Cop&ier + + + Move &Up + Déplacer vers le &haut + + + Move &Down + Déplacer vers le &bas + + + D&elete + &Supprimer + + + Load Settings From File + Charger les paramètres + + + Save Settings to File + Enregistrer les paramètres + + + + Save Effect Settings + Enregistrer les paramètres d'effet + + + + + Effect XML Settings %1 + Paramètres d'effet XML %1 + + + + Save Settings Failed + L'enregistrement des paramètres a échoué + + + + Failed to open "%1" for writing. + Impossible d'écrire dans "%1". + + + + Load Effect Settings + Charger les paramètres d'effet + + + + + Load Settings Failed + Le chargement des paramètres a échoué + + + + Failed to open "%1" for reading. + Impossible de lire "%1". + + + + This settings file doesn't match this effect. + Ce fichier de paramètre ne correspond pas à cet effet. + + + + EffectControls + + + Effects: + Effets : + + + &Paste + C&oller + + + + (none) + (aucun) + + + + Add Video Effect + Ajouter un effet vidéo + + + + VIDEO EFFECTS + EFFETS VIDÉO + + + + Add Video Transition + Ajouter une transition vidéo + + + + Add Audio Effect + Ajouter un effet audio + + + + AUDIO EFFECTS + EFFETS AUDIO + + + + Add Audio Transition + Ajouter une transition audio + + + (Multiple clips selected) + (Clips multiples sélectionnés) + + + + EffectRow + + + Disable Keyframes + Désactiver les images-clés + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Désactiver les images-clés supprimera toutes les images-clés courantes. Êtes-vous sûr⋅e de vouloir cela ? + + + + EffectUI + + + %1 (Opening) + + + + + %1 (Closing) + + + + + %1 (multiple) + + + + + Cu&t + &Couper + + + + &Copy + Cop&ier + + + + Move &Up + Déplacer vers le &haut + + + + Move &Down + Déplacer vers le &bas + + + + D&elete + &Supprimer + + + + Load Settings From File + Charger les paramètres + + + + Save Settings to File + Enregistrer les paramètres + + + + EmbeddedFileChooser + + + File: + Fichier : + + + + ExportDialog + + + Export "%1" + Exporter "%1" + + + + Unknown codec name %1 + Nom de codec inconnu %1 + + + + Export Failed + L'export a échoué + + + + Export failed - %1 + Export échoué - %1 + + + + Invalid dimensions + Dimensions invalides + + + + Export width and height must both be even numbers/divisible by 2. + La largeur et la hauteur d'export doivent être des nombres pairs/divisibles par 2. + + + + Invalid codec + Codec invalide + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Impossible de déterminer les paramètres de sortie pour le codec sélectionné. Ceci est un bug, merci de contacter les développeurs. + + + + Invalid format + Format invalide + + + + Couldn't determine output format. This is a bug, please contact the developers. + Impossible de déterminer le format de sortie. Ceci est un bug, merci de contacter les développeurs. + + + + Export Media + Exporter le média + + + + %p% (Total: %1:%2:%3) + + + + + %p% (ETA: %1:%2:%3) + + + + + Quality-based (Constant Rate Factor) + Qualitatif (Constant Rate Factor) + + + + Constant Bitrate + Débit binaire constant + + + + + Invalid Codec + Codec invalide + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Impossible de trouver un encodeur approprié pour ce codec. L'export risque de planter. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Impossible de trouver un format de pixel pour cet encodeur. L'export risque de planter. + + + + Bitrate (Mbps): + Débit binaire (Mbps) : + + + + Quality (CRF): + Qualité (CRF) : + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Facteur de qualité : + +0 = sans perte +17-18 = visuellement sans perte (compressé, mais imperceptible) +23 = haute qualité +51 = qualité la plus basse + + + + Target File Size (MB): + Taille du fichier cible (Mo) : + + + + Format: + Format : + + + + Range: + Plage : + + + + Entire Sequence + Séquence entière + + + + In to Out + Du point d'entrée au point de sortie + + + + Video + Vidéo + + + + + Codec: + Codec : + + + + Width: + Largeur : + + + + Height: + Hauteur : + + + + Frame Rate: + Images par seconde : + + + + Compression Type: + Type de compression : + + + + Advanced + Avancé + + + + Audio + Audio + + + + Sampling Rate: + Taux d'échantillonnage : + + + + Bitrate (Kbps/CBR): + Débit binaire (Kbps/CBR) : + + + + ExportThread + + + failed to send frame to encoder (%1) + Échec de l'envoi d'une image vers l'encodeur (%1) + + + + failed to receive packet from encoder (%1) + Échec de la réception d'un paquet depuis l'encodeur (%1) + + + + could not video encoder for %1 + Impossible d'encoder la vidéo pour %1 + + + + could not allocate video stream + impossible d'allouer le flux vidéo + + + + could not allocate video encoding context + impossible d'allouer le contexte d'encodage vidéo + + + + could not open output video encoder (%1) + impossible d'ouvrir l'encodeur vidéo de sortie (%1) + + + + could not copy video encoder parameters to output stream (%1) + impossible de copier les paramètres d'encodage vidéo vers le flux de sortie (%1) + + + + could not audio encoder for %1 + impossible d'encoder l'audio pour %1 + + + + could not allocate audio stream + impossible d'allouer le flux audio + + + + could not allocate audio encoding context + impossible d'allouer le contexte d'encodage audio + + + + could not open output audio encoder (%1) + impossible d'ouvrir l'encodeur audio de sortie (%1) + + + + could not copy audio encoder parameters to output stream (%1) + impossible de copier les paramètres d'encodage audio vers le flux de sortie (%1) + + + + could not allocate audio buffer (%1) + impossible d'allouer le buffer audio (%1) + + + + could not create output format context + impossible de créer le contexte du format de sortie + + + + could not open output file (%1) + impossible d'ouvrir le fichier de sortie (%1) + + + + could not write output file header (%1) + impossible d'écrire l'en-tête du fichier de sortie (%1) + + + + could not write output file trailer (%1) + impossible d'écrire le trailer du fichier (%1) + + + + FillLeftRightEffect + + + Type + Type + + + + Fill Left with Right + Remplir la gauche avec la droite + + + + Fill Right with Left + Remplir la droite avec la gauche + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Impossible de charger le plugin Frei0r "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + NOTE : Vous ne pouvez pas charger de plugin Frei0r 32-bit dans la version 64-bit d'Olive. Essayez de trouver une version 64-bit de ce plugin ou basculez vers Olive 32-bit. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + NOTE : Vous ne pouvez pas charger de plugin Frei0r 64-bit dans la version 32-bit d'Olive. Essayez de trouver une version 32-bit de ce plugin ou basculez vers Olive 64-bit. + + + + Error loading Frei0r plugin + Erreur durant le chargement du plugin Frei0r + + + + GraphEditor + + + Graph Editor + Éditeur de graphes + + + + Linear + Linéaire + + + + Bezier + Bézier + + + + Hold + Maintenir + + + + GraphView + + + Zoom to Selection + Zoomer sur la sélection + + + + Zoom to Show All + Zoomer pour tout montrer + + + + Reset View + Réinitialiser la vue + + + + InterlacingName + + + None (Progressive) + Aucun (Progressif) + + + + Top Field First + Trame supérieure en premier + + + + Bottom Field First + Trame inférieure en premier + + + + Invalid + Invalide + + + + KeyframeNavigator + + + Enable Keyframes + Activer les images-clés + + + + KeyframeView + + + Linear + Linéaire + + + + Bezier + Bézier + + + + Hold + Maintenir + + + + LabelSlider + + + &Edit + &Édition + + + + &Reset to Default + + + + + + Set Value + Définir la valeur + + + + + New value: + Nouvelle valeur : + + + + LoadDialog + + + Loading... + Cargement… + + + + Loading '%1'... + Chargement '%1'… + + + + Cancel + Annuler + + + + LoadThread + + + Version Mismatch + Incompatibilité de version + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Ce projet a été enregistré avec une version différente d'Olive et peut ne pas être totalement compatible avec celle-ci. Voulez-vous essayer de l'ouvrir malgré tout ? + + + + Invalid Clip Link + Lien du clip invalide + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Ce projet contient un lien de clip invalide. Il peut être corrompu. Voulez-vous l'ouvrir malgré tout ? + + + + %1 - Line: %2 Col: %3 + %1 - Ligne : %2 Col. : %3 + + + + User aborted loading + L'utilisateur a abandonné le chargement + + + + XML Parsing Error + Erreur de parsage XML + + + + Couldn't load '%1'. %2 + Impossible de charger '%1'. %2 + + + + Project Load Error + Erreur dans le chargement du projet + + + + Error loading project: %1 + Erreur lors du chargement du projet : %1 + + + + MainWindow + + Auto-recovery + Récupération automatique + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive ne s'est pas fermé convenablement et un fichier de récupépration a été détecté. Souhaitez-vous l'ouvrir ? + + + &Project + &Projet + + + &Sequence + &Séquence + + + &Folder + &Dossier + + + Set In Point + Définir le point d'entrée + + + Set Out Point + Définir le point de sortie + + + + Welcome to %1 + Bienvenue à %1 + + + Reset In Point + Réinitialiser le point d'entrée + + + Reset Out Point + Réinitialiser le point de sortie + + + Clear In/Out Point + Effacer le point d'entrée/de sortie + + + No active sequence + Pas de séquence active + + + Please open the sequence you wish to export. + Veuillez ouvrir la séquence que vous souhaitez exporter. + + + Save Project As... + Enregistrer sous… + + + Unsaved Project + Projet non-sauvegardé + + + This project has changed since it was last saved. Would you like to save it before closing? + Ce projet a été modifié depuis la dernière sauvegarde. Souhaitez-vous l'enregistrer avant de fermer ? + + + + &File + &Fichier + + + + &New + &Nouveau + + + + &Open Project + &Ouvrir un projet + + + + Clear Recent List + Nettoyer la liste des projets récents + + + + Open Recent + Ouvrir un projet récent + + + + &Save Project + &Enregistrer le projet + + + + Save Project &As + Enregistrer le projet &sous + + + + &Import... + &Importer… + + + + &Export... + &Exporter… + + + + E&xit + &Quitter + + + + &Edit + &Édition + + + + &Undo + &Annuler + + + + Redo + Rétablir + + + Cu&t + &Couper + + + Cop&y + Cop&ier + + + &Paste + C&oller + + + Paste Insert + Coller et Insérer + + + Duplicate + Dupliquer + + + Delete + Supprimer + + + Ripple Delete + Supprimer et raccorder + + + Split + Séparer + + + + Select &All + Sélectionner &tout + + + + Deselect All + Tout désélectionner + + + Add Default Transition + Ajouter la transition par défaut + + + Link/Unlink + Lier/Délier + + + Enable/Disable + Activer/Désactiver + + + Nest + Imbriquer + + + + Ripple to In Point + Not literal, but it says what it is + Propager au point d'entrée + + + + Ripple to Out Point + Not literal, but it says what it is + Propager au point de sortie + + + + Edit to In Point + Éditer comme point d'entrée + + + + Edit to Out Point + Éditer comme point de sortie + + + + Delete In/Out Point + Supprimer les points d'entrée/de sortie + + + + Ripple Delete In/Out Point + Supprimer et raccorder au point d'entrée/de sortie + + + + Set/Edit Marker + Définir/Éditer un marqueur + + + + &View + &Affichage + + + + Zoom In + Zommer + + + + Zoom Out + Dézoomer + + + + Increase Track Height + Augmenter la hauteur de piste + + + + Decrease Track Height + Diminuer la hauteur de piste + + + + Toggle Show All + Vue d'ensemble + + + + Track Lines + Contours des pistes + + + + Rectified Waveforms + Formes d'onde ajustées + + + + Frames + Images + + + + Drop Frame + Drop Frame + + + + Non-Drop Frame + Non-Drop Frame + + + + Milliseconds + Millisecondes + + + + Title/Action Safe Area + Zone sûre de titre/d'action + + + + Off + Désactivée + + + + Default + Par défaut + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + Personnalisée + + + + Full Screen + Plein-écran + + + + Full Screen Viewer + Lecteur en plein écran + + + + &Playback + &Lecture + + + + Go to Start + Aller au début + + + + Previous Frame + Image précédente + + + + Play/Pause + Lire/Pause + + + + Play In to Out + Lire entre les points d'entrée et de sortie + + + + Next Frame + Image suivante + + + + Go to End + Aller à la fin + + + + Go to Previous Cut + Aller au point d'édition précédent + + + + Go to Next Cut + Aller au point d'édition suivant + + + + Go to In Point + Aller au point d'entrée + + + + Go to Out Point + Aller au point de sortie + + + + Shuttle Left + Jouer vers la gauche + + + + Shuttle Stop + Arrêter + + + + Shuttle Right + Jouer vers la droite + + + + Loop + Boucle + + + + &Window + &Fenêtre + + + + Project + Projet + + + + Effect Controls + Propriétés des effets + + + + Timeline + Ligne du temps + + + + Graph Editor + Éditeur de graphes + + + + Media Viewer + Lecteur de média + + + + Sequence Viewer + Lecteur de séquence + + + + Maximize Panel + Agrandir le panneau + + + + Lock Panels + + + + + Reset to Default Layout + Restaurer la disposition par défaut + + + + &Tools + &Outils + + + + Pointer Tool + Curseur + + + + Edit Tool + Éditer + + + + Ripple Tool + Propagation + + + + Razor Tool + Cutter + + + + Slip Tool + Déplacer dessous + + + + Slide Tool + Déplacer dessus + + + + Hand Tool + Main + + + + Transition Tool + Transition + + + + Enable Snapping + Autoriser le magnétisme + + + + Auto-Cut Silence + + + + Selecting Also Seeks + Sélectionner déplace la tête de lecture + + + Edit Tool Also Seeks + Éditer déplace la tête de lecture + + + Edit Tool Selects Links + Éditer sélectionne les liens + + + Seek Also Selects + Sélectionner avec la tête de lecture + + + Seek to the End of Pastes + Placer la tête de lecture après le collage + + + Scroll Wheel Zooms + Zoomer avec la molette + + + Enable Drag Files to Timeline + Autoriser le dépôt de fichier sur la ligne de temps + + + Auto-Scale By Default + Échelle automatique par défaut + + + Enable Seek to Import + Déplacer la tête de lecture à l'import + + + Audio Scrubbing + Lire l'audio au déplacement de la tête de lecture + + + Enable Drop on Media to Replace + Déposer sur un média pour le remplacer + + + Enable Hover Focus + Activer le focus au survol + + + Ask For Name When Setting Marker + Demander un nom à la création d'un marqueur + + + + No Auto-Scroll + Pas de défilement automatique + + + + Page Auto-Scroll + Défilement paginé + + + + Smooth Auto-Scroll + Défilement doux + + + + Preferences + Préférences + + + + Clear Undo + Nettoyer la pile d'annulation + + + + &Help + &Aide + + + + A&ction Search + Chercher une a&ction + + + + Debug Log + Journal de débogage + + + + &About... + &À propos… + + + + <untitled> + &lt;Sans titre&gt; + + + Open Project... + Ouvrir un projet… + + + Missing recent project + Projet récent manquant + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Le projet '%1' n'existe plus. Voulez-vous le retirer de la liste des projets récents ? + + + Invalid aspect ratio + Ratio d'image invalide + + + The aspect ratio '%1' is invalid. Please try again. + Le ratio d'image '%1' est invalide. Merci de réessayer à nouveau. + + + Enter custom aspect ratio + Entrez un ratio d'image personnalisé + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Entrez le ratio de la zone sûre de titre/d'action (ex: 16:9) : + + + Nested Sequence + Séquence imbriquée + + + + Marker + + + Set Marker + Définir un marqueur + + + + Set clip marker name: + Définir le nom du marqueur de clip : + + + + Set sequence marker name: + Définir le nom du marqueur de séquence : + + + + Media + + + New Folder + Nouveau dossier + + + + Name: + Nom : + + + + Filename: + Nom de fichier : + + + + Video Dimensions: + Dimensions de la vidéo : + + + + Frame Rate: + Images par seconde : + + + + %1 field(s) (%2 frame(s)) + %1 trame(s) (%2 image(s)) + + + + Interlacing: + Entrelacement : + + + + Audio Frequency: + Fréquence audio : + + + + Audio Channels: + Canaux audio : + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Nom : %1 +Dimensions vidéo : %2x%3 +Images par seconde : %4 +Fréquence audio: %5 +Canaux audio : %6 + + + + Name + Nom + + + + Duration + Durée + + + + Rate + Images par seconde + + + + MediaPropertiesDialog + + + "%1" Properties + "%1" Propriétés + + + + Tracks: + Pistes : + + + + Video %1: %2x%3 %4FPS + Vidéo %1 : %2×%3 %4 i/s + + + + Audio %1: %2Hz %3 + Audio %1 : %2 Hz %3 + + + + %n channel(s) + + %n canal + %n canaux + + + + + Conform to Frame Rate: + Conformer aux images par seconde : + + + + Alpha is Premultiplied + Le canal alpha est prémultiplié + + + + Auto (%1) + Auto (%1) + + + + Interlacing: + Entrelacement : + + + + Name: + Nom : + + + + MenuHelper + + + &Project + &Projet + + + + &Sequence + &Séquence + + + + &Folder + &Dossier + + + + Set In Point + Définir le point d'entrée + + + + Set Out Point + Définir le point de sortie + + + + Reset In Point + Réinitialiser le point d'entrée + + + + Reset Out Point + Réinitialiser le point de sortie + + + + Clear In/Out Point + Effacer le point d'entrée/de sortie + + + + Add Default Transition + Ajouter la transition par défaut + + + + Link/Unlink + Lier/Délier + + + + Enable/Disable + Activer/Désactiver + + + + Nest + Imbriquer + + + + Cu&t + &Couper + + + + Cop&y + Cop&ier + + + + + &Paste + C&oller + + + + Paste Insert + Coller et Insérer + + + + Duplicate + Dupliquer + + + + Delete + Supprimer + + + + Ripple Delete + Supprimer et raccorder + + + + Split + Séparer + + + + Invalid aspect ratio + Ratio d'image invalide + + + + The aspect ratio '%1' is invalid. Please try again. + Le ratio d'image '%1' est invalide. Merci de réessayer à nouveau. + + + + Enter custom aspect ratio + Entrez un ratio d'image personnalisé + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Entrez le ratio de la zone sûre de titre/d'action (ex: 16:9) : + + + + NewSequenceDialog + + + Editing "%1" + Édition "%1" + + + + New Sequence + Nouvelle séquence + + + + Preset: + Préréglage : + + + + Film 4K + Film 4K + + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + Personnalisé + + + + Video + Vidéo + + + + Width: + Largeur : + + + + Height: + Hauteur : + + + + Frame Rate: + Images par seconde : + + + + Pixel Aspect Ratio: + Ratio des pixels : + + + + Square Pixels (1.0) + Pixels carré (1,0) + + + + Interlacing: + Entrelacement : + + + + None (Progressive) + Aucun (Progressif) + + + + Audio + Audio + + + + Sample Rate: + Taux d'échantillonnage : + + + + Name: + Nom : + + + + OliveGlobal + + + Olive Project %1 + + + + + Auto-recovery + Récupération automatique + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive ne s'est pas fermé convenablement et un fichier de récupépration a été détecté. Souhaitez-vous l'ouvrir ? + + + + Open Project... + Ouvrir un projet… + + + + Missing recent project + Projet récent manquant + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Le projet '%1' n'existe plus. Voulez-vous le retirer de la liste des projets récents ? + + + + Save Project As... + Enregistrer sous… + + + + Unsaved Project + Projet non-sauvegardé + + + + This project has changed since it was last saved. Would you like to save it before closing? + Ce projet a été modifié depuis la dernière sauvegarde. Souhaitez-vous l'enregistrer avant de fermer ? + + + + No active sequence + Pas de séquence active + + + + Please open the sequence to perform this action. + + + + + No clips selected + + + + + Select the clips you wish to auto-cut + + + + Please open the sequence you wish to export. + Veuillez ouvrir la séquence que vous souhaitez exporter. + + + + Missing Project File + + + + + Specified project '%1' does not exist. + + + + + PanEffect + + + Pan + Panoramique + + + + Playback + + Generating Proxy: %1% + Génération du proxy : %1% + + + + PreferencesDialog + + + Preferences + Préférences + + + + Invalid CSS File + Fichier CSS invalide + + + + CSS file '%1' does not exist. + Le fichier CSS '%1' n'existe pas. + + + Warning + Avertissement + + + Some changed settings will require restarting Olive to take effect + Certains paramètres modifiés nécessitent le redémarrage d'Olive pour prendre effet + + + + Confirm Reset All Shortcuts + Confirmez la réinitialisation de tous les raccourcis clavier + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Êtes-vous sûr⋅e de vouloir réinitialiser tous les raccourcis clavier à leur valeur par défaut ? + + + + Import Keyboard Shortcuts + Importer les raccourcis clavier + + + + + Error saving shortcuts + Erreur dans l'enregistrement des raccourcis + + + + Failed to open file for reading + Échec de l'ouverture du fichier + + + + Export Keyboard Shortcuts + Exporter les raccourcis clavier + + + + Export Shortcuts + Exporter les raccourcis + + + + Shortcuts exported successfully + Les raccourcis ont été exporté avec succès + + + + Failed to open file for writing + Échec de l'ouverture du fichier + + + + Browse for CSS file + Choisir un fichier CSS + + + + Delete All Previews + Supprimer toutes les prévisualisations + + + + Are you sure you want to delete all previews? + Êtes-vous sûr⋅e de vouloir supprimer toutes les prévisualisations ? + + + + Previews Deleted + Prévisualisations supprimées + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + Toutes les prévisualisations ont été supprimées avec succès. Il est possible que vous deviez ré-ouvrir le projet actuel pour que les changements prennent effet. + + + + Language: + Langue : + + + + Default Sequence Settings + + + + + Add Default Effects to New Clips + + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + + + + + Selecting Also Seeks + Sélectionner déplace la tête de lecture + + + + Edit Tool Also Seeks + Éditer déplace la tête de lecture + + + + Edit Tool Selects Links + Éditer sélectionne les liens + + + + Seek Also Selects + Sélectionner avec la tête de lecture + + + + Seek to the End of Pastes + Placer la tête de lecture après le collage + + + + Scroll Wheel Zooms + Zoomer avec la molette + + + + Hold CTRL to toggle this setting + + + + + Invert Timeline Scroll Axes + + + + + Enable Drag Files to Timeline + Autoriser le dépôt de fichier sur la ligne de temps + + + + Auto-Scale By Default + Échelle automatique par défaut + + + + Auto-Seek to Imported Clips + + + + + Audio Scrubbing + Lire l'audio au déplacement de la tête de lecture + + + + Drop Files on Media to Replace + + + + + Enable Hover Focus + Activer le focus au survol + + + + Ask For Name When Setting Marker + Demander un nom à la création d'un marqueur + + + + Appearance + + + + + Theme + + + + + Olive Dark (Default) + + + + + Olive Light + + + + + Native + + + + + Native (Light Icons) + + + + + Use Native Menu Styling + + + + + Custom CSS: + CSS personnalisé : + + + + Browse + Parcourir + + + + Image sequence formats: + Formats de séquence d'image : + + + + Audio Recording: + Enregistrement audio : + + + + Mono + Mono + + + + Stereo + Stéréo + + + + Effect Textbox Lines: + Lignes des boîtes de texte d'effet : + + + + Default Sequence + + + + + Thumbnail Resolution: + Résolution des miniatures : + + + + Waveform Resolution: + Résolution des formes d'onde : + + + + Delete Previews + Supprimer les prévisualisations + + + + Use Software Fallbacks When Possible + Utiliser les solutions de repli logicielles quand cela est possible + + + + General + Général + + + + Behavior + Comportement + + + Seeking + Tête de lecture + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + Recherche fidèle +Tojours montrer l'image exacte (la prévisualisation peut se mettre en pause brièvement quand la bonne image est en cours de récupération) + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + Recherhe rapide +Montrer rapidement (la prévisualition peut montrer brièvement des images imprécises lors du déplacement de la tête de lecture − cela n'affecte pas la lecture et l'export) + + + + Memory Usage + Utilisation de la mémoire + + + + Upcoming Frame Queue: + File d'image à venir : + + + + + frames + images + + + + + seconds + secondes + + + + Previous Frame Queue: + File d'image précédentes : + + + + Playback + Lecture + + + + Output Device: + Système de sortie : + + + + + Default + Défaut + + + + Input Device: + Système d'entrée : + + + + Sample Rate: + Taux d'échantillonnage : + + + + Audio + Audio + + + + Search for action or shortcut + Rechercher une action ou un raccourci + + + + Action + Action + + + + Shortcut + Raccourci + + + + Import + Importer + + + + Export + Exporter + + + + Reset Selected + Réinitialiser la sélection + + + + Reset All + Tout réinitialiser + + + + Keyboard + Clavier + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + + + + + Could not open file - %1 + Impossible d'ouvrir le fichier - %1 + + + + Could not find stream information - %1 + Impossible de trouver les informations de flux - %1 + + + + Project + + + New + Nouveau + + + + Open Project + + + + + Save Project + + + + + Undo + + + + + Redo + Rétablir + + + + Tree View + Vue arborescente + + + + Icon View + Vue par icônes + + + + List View + + + + + Search media, markers, etc. + Rechercher des médias, marqueurs, etc. + + + + Project + Projet + + + + Sequence + Séquence + + + + Replace '%1' + Remplacer '%1' + + + + + All Files + Tous les fichiers + + + + + No active sequence + Pas de séquence active + + + + No sequence is active, please open the sequence you want to replace clips from. + Pas de séquence active, veuillez ouvrir la séquence dont vous souhaitez modifier les clips. + + + + Active sequence selected + Séquence active sélectionnée + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + Vous ne pouvez pas insérer une séquence à l'intérieur d'elle-même, donc aucun clip de ce média ne peut être dans cette séquence. + + + + Rename '%1' + Renommer '%1' + + + + Enter new name: + Entrez le nouveau nom : + + + + Delete media in use? + Supprimer un média en cours d'utilisation ? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + Le média '%1' est actuellement utilisé dans '%2', le supprimer effacera toutes les instances dans la séquence. Êtes-vous sûr⋅e de vouloir cela ? + + + + Skip + Passer + + + + Import a Project + + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + + + + + Image sequence detected + Séquence d'image détectée + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + Le fichier '%1' semble faire partie d'une séquence d'image. Voulez-vous l'importer comme tel ? + + + + Import media... + Importer un média… + + + + No sequence is active, please open the sequence you want to delete clips from. + Aucune séquence n'est active, veuillez sélectionner la séquence dont vous souhaitez supprimer les clips. + + + + ProxyDialog + + + Create Proxy + Créer un proxy + + + + Proxy + Proxy + + + + Dimensions: + Dimensions : + + + + Same Size as Source + Même taille que la source + + + + Half Resolution (1/2) + Moitié de la résolution (1/2) + + + + Quarter Resolution (1/4) + Quart de la résolution (1/4) + + + + Eighth Resolution (1/8) + Huitième de la résolution (1/8) + + + + Sixteenth Resolution (1/16) + Seizième de la résolution (1/16) + + + + Format: + Format : + + + + ProRes HQ + ProRes HQ + + + + Location: + Chemin : + + + + Same as Source (in "%1" folder) + Comme la source (dans le dossier "%1") + + + + Proxy file exists + Un fichier de proxy existe + + + + The file "%1" already exists. Do you wish to replace it? + Le fichier "%1" existe déjà. Voulez-vous le remplacer ? + + + + Custom Location + Chemin personnalisé + + + + ProxyGenerator + + + Finished generating proxy for "%1" + Génération du proxy pour "%1" terminée + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Remplacer les clips par "%1" + + + + Select which media you want to replace this media's clips with: + Sélectionnez quel média vous souhaitez utiliser pour remplacer les clips de ce média : + + + + Keep the same media in-points + Garder les mêmes points d'entrée du média + + + + Replace + Remplacer + + + + Cancel + Annuler + + + + No media selected + Aucun média sélectionné + + + + Please select a media to replace with or click 'Cancel'. + Veuillez sélectionner un média avec lequel remplacer ou choisir 'Annuler'. + + + + Same media selected + Même média sélectionné + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Vous avez sélectionné le même média que celui que vous souhaitez remplacer. Veuillez sélectionner un autre média ou cliquer sur 'Annuler'. + + + + Folder selected + Dossier sélectionné + + + + You cannot replace footage with a folder. + Vous ne pouvez pas remplacer un média par un dossier. + + + + Active sequence selected + Séquence active sélectionnée + + + + You cannot insert a sequence into itself. + Vous ne pouvez pas insérer une séquence dans elle-même. + + + + RichTextEffect + + + Text + Texte + + + + Padding + + + + + Position + Position + + + + Vertical Align: + + + + + Top + En haut + + + + Center + Centrer + + + + Bottom + En bas + + + + Auto-Scroll + + + + + Off + Désactivée + + + + Up + + + + + Down + + + + + Left + À gauche + + + + Right + À droite + + + + Shadow + Ombre + + + + Shadow Color + Couleur de l'ombre + + + + Shadow Angle + + + + + Shadow Distance + Distance de l'ombre + + + + Shadow Softness + Douceur de l'ombre + + + + Shadow Opacity + Opacité de l'ombre + + + + Sequence + + + %1 (copy) + %1 (copy) + + + + ShakeEffect + + + Intensity + Intensité + + + + Rotation + Rotation + + + + Frequency + Fréquence + + + + SolidEffect + + + Type + Type + + + + Solid Color + Couleur unie + + + + SMPTE Bars + Barres SMPTE + + + + Checkerboard + Damier + + + + Opacity + Opacité + + + + Color + Couleur + + + + Checkerboard Size + Taille du damier + + + + SourcesCommon + + + Import... + Importer… + + + + New + Nouveau + + + + View + Affichage + + + + Tree View + Vue arborescente + + + + Icon View + Vue par icônes + + + + Show Toolbar + Afficher la barre d'outils + + + + Show Sequences + Afficher les séquences + + + + Replace/Relink Media + Remplacer/Relier le média + + + + Reveal in Explorer + Montrer dans l'explorateur + + + + Reveal in Finder + Montrer dans le Finder + + + + Reveal in File Manager + Montrer dans le gestionnaire de fichiers + + + + Replace Clips Using This Media + Remplacer les clips utilisant ce média + + + + Create Sequence With This Media + Créer une séquence à partir de ce média + + + + Duplicate + Dupliquer + + + + Delete All Clips Using This Media + Supprimer tous les clips utilisant ce média + + + + Proxy + Proxy + + + + Generating proxy: %1% complete + Génération du proxy: %1% achevée + + + + Create/Modify Proxy + Créer/Modifier le proxy + + + + Create Proxy + Créer le proxy + + + + Modify Proxy + Modifier le proxy + + + + Restore Original + Restaurer l'original + + + + Delete + Supprimer + + + + Preview in Media Viewer + + + + + Properties... + Propriétés… + + + + Replace Media + Remplacer le média + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Vous avez déposé un fichier sur '%1'. Souhaitez-vous le remplacer par le fichier déposé ? + + + + Delete proxy + Supprimer le proxy + + + + Would you like to delete the proxy file "%1" as well? + Souhaitez-vous aussi supprimer le fichier de proxy "%1" ? + + + + SpeedDialog + + + Speed/Duration + Vitesse/Durée + + + + Speed: + Vitesse : + + + + Frame Rate: + Images par seconde : + + + + Duration: + Durée : + + + + Reverse + Inverser + + + + Maintain Audio Pitch + Maintenir la hauteur audio + + + + Ripple Changes + Propager les changements + + + + TextEditDialog + + + Edit Text + Éditer le texte + + + + Thin + + + + + Extra Light + + + + + Light + + + + + Normal + Normal + + + + Medium + + + + + Demi Bold + + + + + Bold + + + + + Extra Bold + + + + + Black + + + + + TextEditEx + + + Edit Text + Éditer le texte + + + + &Edit Text + &Modifier le texte + + + + TextEffect + + + Text + Texte + + + + Font + Police + + + + Size + Taille + + + + Color + Couleur + + + + Alignment + Allignement + + + + Left + À gauche + + + + + Center + Centrer + + + + Right + À droite + + + + Justify + Justifié + + + + Top + En haut + + + + Bottom + En bas + + + + Word Wrap + Retour automatique + + + + Padding + + + + + Position + Position + + + + Outline + Contour + + + + Outline Color + Couleur du contour + + + + Outline Width + Épaisseur du contour + + + + Shadow + Ombre + + + + Shadow Color + Couleur de l'ombre + + + + Shadow Angle + + + + + Shadow Distance + Distance de l'ombre + + + + Shadow Softness + Douceur de l'ombre + + + + Shadow Opacity + Opacité de l'ombre + + + + Sample Text + Texte d'exemple + + + &Edit Text + &Modifier le texte + + + + TimecodeEffect + + + Timecode + Code temporel + + + + Sequence + Séquence + + + + Media + Média + + + + Scale + Échelle + + + + Color + Couleur + + + + Background Color + Couleur d'arrière-plan + + + + Background Opacity + Opacité de l'arrière-plan + + + + Offset + Écart + + + + Prepend + Préfixe + + + + Timeline + + + Timeline: + Ligne du temps : + + + <none> + <aucun> + + + + Nested Sequence + Séquence imbriquée + + + + Effect already exists + L'effet existe déjà + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + Le clip '%1' contient déjà un effet '%2'. SOuhaitez-vous le remplacer par l'effet du presse-papier ou ajouter celui comme un effet distinct ? + + + + Add + Ajouter + + + + Replace + Remplacer + + + + Skip + Passer + + + + Do this for all conflicts found + Faire ceci pour tous les conflits + + + + Title... + Titre… + + + + Solid Color... + Couleur unie… + + + + Bars... + Barres… + + + + Tone... + Ton… + + + + Noise... + Bruit… + + + + Unsaved Project + Projet non-sauvegardé + + + + You must save this project before you can record audio in it. + Vous devez sauvegarder ce projet avant d'effectuer un enregistrement audio à l'intérieur. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Cliquez sur la ligne du temps là où vous souhaitez commencer l'enregistrement (tirez pour limiter l'enregistrement jusqu'à une certaine image) + + + + (none) + (aucun) + + + + Pointer Tool + Curseur + + + + Edit Tool + Éditer + + + + Ripple Tool + Propagation + + + + Razor Tool + Cutter + + + + Slip Tool + Déplacer dessous + + + + Slide Tool + Déplacer dessus + + + + Hand Tool + Main + + + + Transition Tool + Transition + + + + Snapping + Magnétisme + + + + Zoom In + Zoomer + + + + Zoom Out + Dézoomer + + + + Record audio + Enregistrement audio + + + + Add title, solid, bars, etc. + Ajouter un titre, une couleur unie, des barres, etc. + + + + TimelineHeader + + + Center Timecodes + Centrer les codes temporels + + + + TimelineWidget + + + &Undo + Ann&uler + + + + &Redo + &Rétablir + + + C&ut + &Couper + + + Cop&y + Cop&ier + + + &Paste + C&oller + + + R&ipple Delete + Supprimer et r&accorder + + + + Sequence Settings + Paramètres de la séquence + + + + &Speed/Duration + &Vitesse/Durée + + + Auto-s&cale + Échelle automati&que + + + Enable/Disable + Activer/Désactiver + + + Link/Unlink + Lier/Délier + + + &Nest + Im&briquer + + + + &Reveal in Project + &Révéler dans le projet + + + R&ename + R&enommer + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Début : %2 +Fin : %3 +Durée : %4 + + + Rename '%1' + Renommer '%1' + + + Rename multiple clips + Renommer plusieurs clips + + + Enter a new name for this clip: + Entrez un nouveau nom pour ce clip : + + + + R&ipple Delete Empty Space + + + + + Auto-Cut Silence + + + + + Auto-S&cale + + + + + Properties + + + + + Error + Erreur + + + + Couldn't locate media wrapper for sequence. + Impossible de localiser le conteneurdu média de cette séquence. + + + + Title + Titre + + + + Solid Color + Couleur unie + + + + Bars + Barres + + + + Tone + Ton + + + + Noise + Bruit + + + + Duration: + Durée : + + + + ToneEffect + + + Type + Type + + + + Sine + + + + + Frequency + Fréquence + + + + Amount + Quantité + + + + Mix + Mélange + + + + TransformEffect + + + Position + Position + + + + Scale + Échelle + + + + Uniform Scale + Échelle uniforme + + + + Rotation + Rotation + + + + Anchor Point + Point d'ancrage + + + + Opacity + Opacité + + + + Blend Mode + Mode de fusion + + + + Normal + Normal + + + Darken + Assombrir + + + Multiply + Multiplier + + + Color Burn + Not literal but same translation as Adobe + Densité couleur + + + + Linear Burn + Not literal but same translation as Adobe + Densité linéaire + + + + Lighten + Éclaircir + + + Screen + Not literal but same translation as Adobe + Superposition + + + Color Dodge + Not literal but same translation as Adobe + Densité couleur - + + + Linear Dodge (Add) + Not literal but same translation as Adobe + Densité linéaire - + + + Overlay + Incrustation + + + Soft Light + Not literal but same translation as Adobe + Lumière tamisée + + + Hard Light + Lumière crue + + + Vivid Light + Lumière vive + + + Linear Light + Lumière linéaire + + + Pin Light + Not literal but same translation as Adobe + Lumière ponctuelle + + + Hard Mix + Mélange maximal + + + Difference + Différence + + + Exclusion + Exclusion + + + Reflect + Réflexion + + + Substract + Soustraction + + + Average + Moyenne + + + Glow + Lueur + + + Negation + Négation + + + Phoenix + Phénix + + + + Transition + + + Length + Longueur + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + + + + + VSTHost + + + + Error loading VST plugin + Erreur lors du chargement du plugin VST + + + Failed to create VST reference + Impossible de créer la référence VST + + + + Failed to load VST plugin "%1": %2 + Impossible de charger le plugin VST "%1": %2 + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + NOTE : Vous ne pouvez pas charger de plugin VST 32-bit avec la version 64-bit d'Olive. Essayez de trouver une version 64-bit de ce plugin ou basculez sur la version 32-bit d'Olive. + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + NOTE : Vous ne pouvez pas charger de plugin VST 64-bit avec la version 32-bit d'Olive. Essayez de trouver une version 32-bit de ce plugin ou basculez sur la version 64-bit d'Olive. + + + + Failed to locate entry point for dynamic library. + Impossible de localiser le point d'entrée de la bibliothèque dynamique. + + + + VST Error + Erreur VST + + + + Plugin's magic number is invalid + Le nombre magique du plugin est invalide + + + + Plugin + Plugin + + + + Interface + Interface + + + + Show + Montrer + + + + VST Plugin + Plugin VST + + + + Viewer + + + Sequence Viewer + Lecteur de séquence + + + + Media Viewer + Lecteur de média + + + + (none) + (aucun) + + + + Drag video only + + + + + Drag audio only + + + + + ViewerWidget + + + Save Frame as Image... + Enregistrer l'image… + + + + Show Fullscreen + Montrer en plein écran + + + + Disable + Désactiver + + + + Screen %1: %2x%3 + Écran %1: %2x%3 + + + + Zoom + Zoom + + + + Fit + Ajuster + + + + Custom + Personnalisé + + + + Close Media + Fermer le média + + + + Save Frame + Enregistrer l'image + + + + Viewer Zoom + Zoom du lecteur + + + + Set Custom Zoom Value: + Définir une valeur de zoom personnalisée : + + + + ViewerWindow + + + Exit Fullscreen + Quitter le mode plein-écran + + + + VoidEffect + + + (unknown) + (inconnu) + + + + Missing Effect + Effet manquant + + + + VolumeEffect + + + Volume + Volume + + + + transition + + + Invalid transition + Transition invalide + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + Aucun candidat pour la transition '%1'. Cette transition est peut-être corrompue. Essayez de la réinstaller, ou de réinstaller Olive. + + + diff --git a/app/ts/id_ID.ts b/app/ts/id_ID.ts new file mode 100644 index 000000000..7030215c5 --- /dev/null +++ b/app/ts/id_ID.ts @@ -0,0 +1,3788 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive adalah aplikasi pengedit video yang bersifat non-linier. Aplikasi ini bebas, gratis, dan terlindungi GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive Team berkewajiban memberitahu pengguna bahwa kode sumber aplikasi ini dapat diunduh dari situs resminya. + + + + ActionSearch + + + Search for action... + Cari Aksi... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Pengaturan Video Lanjutan + + + + Pixel Format: + Bentuk piksel: + + + + Threads: + Jumlah thread/utas: + + + + Audio + + + %1 Audio + Audio %1 + + + + Recording %1 + Merekam %1 + + + + AudioNoiseEffect + + + Amount + Kenyaringan + + + + Mix + + + + + AutoCutSilenceDialog + + + Cut Silence + Potong Senyap + + + + Attack Threshold: + Ambang Mula: + + + + Attack Time: + Waktu Mula: + + + + Release Threshold: + Ambang Akhir: + + + + Release Time: + Waktu Akhir: + + + + Cacher + + + + Could not open %1 - %2 + Tidak dapat membuka %1 - %2 + + + + ChannelLayoutName + + + Invalid + Salah + + + + Mono + Mono + + + + Stereo + Stereo + + + + ClipPropertiesDialog + + + "%1" Properties + Properti untuk "%1" + + + + Multiple Clip Properties + Properti untuk Beberapa Klip + + + + Name: + Nama: + + + + Duration: + Durasi: + + + + (multiple) + (beberapa) + + + + CollapsibleWidget + + + <untitled> + <belum dinamai> + + + + ColorButton + + + Set Color + Pilih Warna + + + + CornerPinEffect + + + Top Left + Kiri Atas + + + + Top Right + Kanan Atas + + + + Bottom Left + Kiri Bawah + + + + Bottom Right + Kanan Bawah + + + + Perspective + Perspektif + + + + DebugDialog + + + Debug Log + Awakutu (Debug) + + + + DemoNotice + + + + Welcome to Olive! + Selamat datang di Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + differentiate "free" as in "free of charge" and "free" as in "freedom/libre" + Olive adalah aplikasi edit video yang bebas, gratis dan terbuka sumbernya, terlisensi GNU GPL. Jika Anda membayar untuk aplikasi ini, Anda telah tertipu. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Aplikasi ini masih dalam tahap ALPHA, artinya aplikasi ini belum stabil dan kemungkinan besar akan crash, memiliki bug atau kutu, dan banyak fitur yang belum ada. Kami tidak menjamin apapun, jadi Anda dipersilahkan menggunakan aplikasi ini dengan menanggung resikonya. Jika menemukan bug/kutu atau ingin meminta suatu fitur, silahkan lapor di %1 + + + + Thank you for trying Olive and we hope you enjoy it! + Terima kasih Anda telah mencoba Olive dan kami harap Anda menyukainya! + + + + Effect + + + Invalid effect + Efek tidak ada + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + Tidak ada kandidat untuk efek '%1'. Efek mungkin korup. Coba menginstal ulang efek tersebut, atau menginstal ulang Olive. + + + Cu&t + &Potong + + + Move &Up + Pindah ke &Atas + + + Move &Down + Pindah ke &Bawah + + + D&elete + &Hapus + + + Load Settings From File + Buka Pengaturan Efek dari File + + + Save Settings to File + Simpan Pengaturan ke File + + + + Save Effect Settings + Simpan Pengaturan Efek + + + + + Effect XML Settings %1 + Pengaturan XML Efek %1 + + + + Save Settings Failed + Gagal Menyimpan Pengaturan + + + + Failed to open "%1" for writing. + Gagal menulis file "%1". + + + + Load Effect Settings + Buka Pengaturan Efek + + + + + Load Settings Failed + Gagal Membuka Pengaturan + + + + Failed to open "%1" for reading. + considering changing "file" to the defined equivalent "berkas", but it might not be familiar to most people + Gagal membaca file "%1". + + + + This settings file doesn't match this effect. + File pengaturan ini tidak cocok dengan efek yang dipilih. + + + + EffectControls + + &Paste + &Tempel + + + + (none) + (tidak ada) + + + + Effects: + Efek: + + + + Add Video Effect + Masukkan Efek Video + + + + VIDEO EFFECTS + EFEK VIDEO + + + + Add Video Transition + Masukkan Transisi Video + + + + Add Audio Effect + Masukkan Efek Audio + + + + AUDIO EFFECTS + EFEK AUDIO + + + + Add Audio Transition + Masukkan Transisi Audio + + + (Multiple clips selected) + (Beberapa klip terseleksi) + + + + EffectRow + + + Disable Keyframes + Matikan Keyframe + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Mematikan keyframe akan menghapus semua keyframe di efek ini. Benarkah Anda ingin melakukan hal tersebut? + + + + EffectUI + + + %1 (Opening) + %1 (Membuka) + + + + %1 (Closing) + %1 (Menutup) + + + + %1 (multiple) + %1 (beberapa) + + + + Cu&t + &Potong + + + + &Copy + &Salin + + + + Move &Up + Pindah ke &Atas + + + + Move &Down + Pindah ke &Bawah + + + + D&elete + &Hapus + + + + Load Settings From File + Buka Pengaturan Efek dari File + + + + Save Settings to File + Simpan Pengaturan ke File + + + + EmbeddedFileChooser + + + File: + + + + + ExportDialog + + + Export "%1" + Ekspor "%1" + + + + Unknown codec name %1 + Kodek %1 tidak diketahui + + + + Export Failed + Gagal Mengekspor + + + + Export failed - %1 + Gagal mengekspor - %1 + + + + Invalid dimensions + Dimensi salah + + + + Export width and height must both be even numbers/divisible by 2. + Lebar dan tinggi video ekspor harus genap/habis dibagi 2. + + + + Invalid codec + Kodek salah + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Tidak dapat menset pengaturan keluaran/output. Ini merupakan kesalahan, silahkan hubungi pengembang aplikasi. + + + + Invalid format + Format salah + + + + Couldn't determine output format. This is a bug, please contact the developers. + Tidak dapat memilih format keluaran/output. Ini merupakan kutu/bug, silahkan hubungi pengembang aplikasi. + + + + Export Media + Ekspor Media + + + + %p% (Total: %1:%2:%3) + %p% (Lama: %1:%2:%3) + + + + %p% (ETA: %1:%2:%3) + %p% (Perkiraan: %1:%2:%3) + + + + Quality-based (Constant Rate Factor) + Berbasis kualitas (CRF) + + + + Constant Bitrate + Laju bit konstan (CBR) + + + + + Invalid Codec + Kodek Salah + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Tidak dapat mencari enkoder yang cocok untuk kodek ini. Ekspor kemungkinan gagal. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Tidak dapat menentukan format piksel untuk enkoder ini. Ekspor kemungkinan gagal. + + + + Bitrate (Mbps): + Laju bit (Mbps): + + + + Quality (CRF): + Kualitas (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Faktor kualitas: + +0 = lossless / tidak terkompresi +17-18 = lossless secara visual (masih terkompresi namun tidak terlihat pecah-pecah) +23 = kualitas tinggi +51 = kualitas paling rendah + + + + Target File Size (MB): + Ukuran File yang Ditargetkan (MB): + + + + Format: + + + + + Range: + Sepanjang: + + + + Entire Sequence + Seluruh rangkaian + + + + In to Out + Masuk hingga Keluar + + + + Video + + + + + + Codec: + Kodek: + + + + Width: + Lebar: + + + + Height: + Tinggi: + + + + Frame Rate: + Laju frame (fps): + + + + Compression Type: + Jenis Kompresi: + + + + Advanced + Pengaturan Lanjut + + + + Audio + + + + + Sampling Rate: + Laju sampel: + + + + Bitrate (Kbps/CBR): + Laju bit (Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + gagal mengirim frame ke enkoder (%1) + + + + failed to receive packet from encoder (%1) + gagal menerima paket dari enkoder (%1) + + + + could not video encoder for %1 + tidak dapat mencari enkoder video untuk %1 + + + + could not allocate video stream + tidak dapat mengalokasikan stream video + + + + could not allocate video encoding context + tidak dapat mengalokasikan konteks mengenkode video + + + + could not open output video encoder (%1) + tidak dapat membuka enkoder video keluaran (%1) + + + + could not copy video encoder parameters to output stream (%1) + tidak dapat menyalin parameter enkoder video ke stream keluaran (%1) + + + + could not audio encoder for %1 + tidak dapat mencari enkoder audio untuk %1 + + + + could not allocate audio stream + tidak dapat mengalokasikan stream audio + + + + could not allocate audio encoding context + tidak dapat mengalokasikan konteks mengenkode audio + + + + could not open output audio encoder (%1) + tidak dapat membuka enkoder audio keluaran (%1) + + + + could not copy audio encoder parameters to output stream (%1) + tidak dapat menyalin parameter enkoder audio ke stream keluaran (%1) + + + + could not allocate audio buffer (%1) + tidak dapat mengalokasikan buffer audio (%1) + + + + could not create output format context + tidak dapat membuat konteks format keluaran + + + + could not open output file (%1) + tidak dapat membuka file keluaran (%1) + + + + could not write output file header (%1) + tidak dapat menulis header untuk file keluaran (%1) + + + + could not write output file trailer (%1) + tidak dapat menulis trailer untuk file keluaran (%1) + + + + FillLeftRightEffect + + + Type + Tipe + + + + Fill Left with Right + Penuhi Suara Kiri dengan Kanan + + + + Fill Right with Left + Penuhi Suara Kanan dengan Kiri + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Gagal membuka plugin Frei0r "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + CATATAN: Plugin Frei0r 32-bit tidak dapat dibuka dalam Olive versi 64-bit. Silahkan mencari versi 64-bit dari plugin ini atau instal Olive versi 32-bit. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + CATATAN: Plugin Frei0r 64-bit tidak dapat dibuka dalam Olive versi 32-bit. Silahkan mencari versi 32-bit dari plugin ini atau instal Olive versi 64-bit. + + + + Error loading Frei0r plugin + Gagal membuka plugin Frei0r + + + + GraphEditor + + + Graph Editor + Pengedit Grafik + + + + Linear + Linier + + + + Bezier + Kurva Bezier + + + + Hold + Tahan + + + + GraphView + + + Zoom to Selection + Perbesar ke Seleksi + + + + Zoom to Show All + Perlihatkan Semua + + + + Reset View + Kembalikan Seperti Semula + + + + InterlacingName + + + None (Progressive) + Tidak ada (Progresif) + + + + Top Field First + Utamakan Bidang Atas + + + + Bottom Field First + Utamakan Bidang Bawah + + + + Invalid + Salah + + + + KeyframeNavigator + + + Enable Keyframes + Nyalakan Keyframe + + + + KeyframeView + + + Linear + Linier + + + + Bezier + + + + + Hold + Tahan + + + + LabelSlider + + + &Edit + + + + + &Reset to Default + &Kembalikan seperti Semula + + + + + Set Value + Ubah Jumlah + + + + + New value: + "value" actually would be "harga" or "nilai" but it probably won't fit + Jumlah: + + + + LoadDialog + + + Loading... + Memuat... + + + + Loading '%1'... + Memuat '%1'... + + + + Cancel + Batalkan + + + + LoadThread + + + Version Mismatch + Versi Tak Cocok + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Proyek ini disimpan menggunakan versi Olive yang lain dan mungkin tidak sepenuhnya kompatibel dengan versi ini. Tetap dibuka? + + + + Invalid Clip Link + Tautan Klip Salah + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Proyek ini terdapat tautan klip yang salah, kemungkinan korup. Tetap dibuka? + + + + %1 - Line: %2 Col: %3 + %1 - Baris: %2 Kolom: %3 + + + + User aborted loading + Pengguna membatalkan pemuatan proyek + + + + XML Parsing Error + Gagal Membaca XML + + + + Couldn't load '%1'. %2 + Tidak dapat membaca '%1'. %2 + + + + Project Load Error + Gagal Memuat Proyek + + + + Error loading project: %1 + Gagal memuat proyek: %1 + + + + MainWindow + + + Welcome to %1 + Selamat datang di %1 + + + + &File + + + + + &New + &Buat + + + + &Open Project + Buka &Proyek + + + + Clear Recent List + Hapus Daftar "Terakhir Dibuka" + + + + Open Recent + Terakhir Dibuka + + + + &Save Project + &Simpan Proyek + + + + Save Project &As + Simpan Proyek Seba&gai + + + + &Import... + &Impor... + + + + &Export... + &Ekspor... + + + + E&xit + &Keluar + + + + &Edit + + + + + &Undo + &Urung + + + + Redo + Ulangi + + + + Select &All + Seleksi &Semua + + + + Deselect All + Batalkan Semua Seleksi + + + + Ripple to In Point + Atur hingga Titik Masuk + + + + Ripple to Out Point + Atur hingga Titik Keluar + + + + Edit to In Point + Edit ke Titik Masuk + + + + Edit to Out Point + Edit ke Titik Keluar + + + + Delete In/Out Point + Hapus Titik Masuk/Keluar + + + + Ripple Delete In/Out Point + Hapus dan Sesuaikan Titik Masuk/Keluar + + + + Set/Edit Marker + Set/Edit Penanda + + + + &View + &Tampilan + + + + Zoom In + Perbesar Tampilan + + + + Zoom Out + Perkecil Tampilan + + + + Increase Track Height + Lebarkan Trek + + + + Decrease Track Height + Persempit Trek + + + + Toggle Show All + "show all" + Perlihatkan Semua + + + + Track Lines + Garis Trek + + + + Rectified Waveforms + "flatten" or "center at bottom" + Visualisasi Audio Rata Bawah + + + + Frames + Frame + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + Milisekon + + + + Title/Action Safe Area + Area Aman Judul/Aksi + + + + Off + Matikan + + + + Default + + + + + 4:3 + + + + + 16:9 + + + + + Custom + Kustom + + + + Full Screen + Layar Penuh + + + + Full Screen Viewer + Penampil Layar Penuh + + + + &Playback + &Pemutaran + + + + Go to Start + Lompat ke Awal + + + + Previous Frame + Frame sebelumnya + + + + Play/Pause + Mainkan/Berhenti + + + + Play In to Out + Mainkan dari Titik Masuk hingga Keluar + + + + Next Frame + Frame Berikutnya + + + + Go to End + Lompat ke Akhir + + + + Go to Previous Cut + Lompat ke Cut Sebelumnya + + + + Go to Next Cut + Lompat ke Cut Berikutnya + + + + Go to In Point + Lompat ke Titik Masuk + + + + Go to Out Point + Lompat ke Titik Keluar + + + + Shuttle Left + Jalankan ke Kiri + + + + Shuttle Stop + Hentikan jalan + + + + Shuttle Right + Jalankan ke Kanan + + + + Loop + Putar secara Berulang + + + + &Window + &Jendela + + + + Project + Proyek + + + + Effect Controls + Pengaturan Efek + + + + Timeline + Garis Waktu + + + + Graph Editor + Pengedit Grafik + + + + Media Viewer + Penampil Media + + + + Sequence Viewer + Penampil Rangkaian + + + + Maximize Panel + Lebarkan Panel + + + + Lock Panels + Kunci Panel + + + + Reset to Default Layout + Kembalikan Layout Semula + + + + &Tools + &Alat + + + + Pointer Tool + Alat Tunjuk + + + + Edit Tool + Alat Edit + + + + Ripple Tool + Alat Pengatur + + + + Razor Tool + Alat Potong + + + + Slip Tool + Alat Slip + + + + Slide Tool + Alat Geser Klip + + + + Hand Tool + Alat Geser Tampilan + + + + Transition Tool + Alat Transisi + + + + Enable Snapping + Nyalakan Lekatan + + + + Auto-Cut Silence + Potong Audio Senyap + + + Selecting Also Seeks + idk how to translate this + Menyeleksi Juga Menggeser + + + Edit Tool Also Seeks + Alat Edit Juga Menggeser + + + Edit Tool Selects Links + Alat Edit Menyeleksi Tautan + + + Seek Also Selects + Menggeser Juga Menyeleksi + + + Seek to the End of Pastes + Geser hingga Akhir Tempelan + + + Scroll Wheel Zooms + Scroll Wheel Memperbesar/Memperkecil Tampilan + + + Hold CTRL to toggle this setting + Tekan CTRL untuk mengaktifkan pengaturan ini + + + Invert Timeline Scroll Axes + Balikkan Arah Gulir Garis Waktu + + + Enable Drag Files to Timeline + Seret dan Lepas file ke Timeline + + + Auto-Scale By Default + Atur Ukuran Video sebagai Default + + + Enable Seek to Import + Nyalakan Geser-untuk-Impor + + + Audio Scrubbing + Nyalakan Audio Scrubbing + + + Enable Drop on Media to Replace + Seret pada Media untuk Menggantikan + + + Enable Hover Focus + Nyalakan Fokus Melayang + + + Ask For Name When Setting Marker + Tanyakan Nama ketika Menaruh Penanda + + + + No Auto-Scroll + Matikan Gulir Otomatis + + + + Page Auto-Scroll + Gulir Halaman Otomatis + + + + Smooth Auto-Scroll + Gulir Halus Otomatis + + + + Preferences + Preferensi + + + + Clear Undo + Hapus Daftar Urung (Undo) + + + + &Help + &Bantuan + + + + A&ction Search + &Cari Aksi + + + + Debug Log + Awakutu / Debug + + + + &About... + &Tentang... + + + + <untitled> + <belum dinamai> + + + + Marker + + + Set Marker + Masukkan Penanda + + + + Set clip marker name: + Masukkan nama penanda: + + + + Set sequence marker name: + Masukkan nama penanda rangkaian: + + + + Media + + + New Folder + Folder Baru + + + + Name: + Nama: + + + + Filename: + Nama file: + + + + Video Dimensions: + Dimensi Video: + + + + Frame Rate: + Laju frame: + + + + %1 field(s) (%2 frame(s)) + %1 baris (%2 frame) + + + + Interlacing: + Mode interlace: + + + + Audio Frequency: + Frekuensi Audio: + + + + Audio Channels: + Kanal Audio: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Nama: %1 +Dimensi Video: %2x%3 +Laju Frame: %4 +Frekuensi Audio: %5 +Tata Audio: %6 + + + + Name + Nama + + + + Duration + Durasi + + + + Rate + Laju + + + + MediaPropertiesDialog + + + "%1" Properties + Properti "%1" + + + + Tracks: + Daftar trek: + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + %n kanal + + + + + Conform to Frame Rate: + Ubah laju frame menjadi: + + + + Alpha is Premultiplied + Idk how to translate this either + Alpha dipremultiplikasi + + + + Auto (%1) + + + + + Interlacing: + Mode interlace: + + + + Name: + Nama: + + + + MenuHelper + + + &Project + &Proyek Baru + + + + &Sequence + &Rangkaian Baru + + + + &Folder + &Folder Baru + + + + Set In Point + Set Titik Masuk + + + + Set Out Point + Set Titik Keluar + + + + Reset In Point + Kembalikan Titik Masuk + + + + Reset Out Point + Kembalikan Titik Keluar + + + + Clear In/Out Point + Hapus Titik Masuk/Keluar + + + + Add Default Transition + Masukkan Transisi Biasa + + + + Link/Unlink + Tautkan/Lepaskan + + + + Enable/Disable + Nyalakan/Matikan + + + + Nest + Sarangkan + + + + Cu&t + &Potong + + + + Cop&y + &Salin + + + + + &Paste + &Tempel + + + + Paste Insert + Tempel dan Masukkan + + + + Duplicate + Gandakan + + + + Delete + Hapus + + + + Ripple Delete + literally the function of ripple delete: "delete and adjust" + Hapus dan Sesuaikan + + + + Split + Pisahkan + + + + Invalid aspect ratio + Rasio aspek salah + + + + The aspect ratio '%1' is invalid. Please try again. + Rasio aspek '%1' salah. Silahkan coba lagi. + + + + Enter custom aspect ratio + Masukkan rasio aspek kustom + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Masukkan rasio aspek yang ingin dipakai untuk area aman judul/aksi (contohnya 16:9): + + + + NewSequenceDialog + + + Editing "%1" + Mengedit "%1" + + + + New Sequence + Rangkaian Baru + + + + Preset: + + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + Kustom + + + + Video + + + + + Width: + Lebar: + + + + Height: + Tinggi: + + + + Frame Rate: + Laju frame (fps): + + + + Pixel Aspect Ratio: + Rasio aspek piksel: + + + + Square Pixels (1.0) + Persegi (1.0) + + + + Interlacing: + Mode interlace: + + + + None (Progressive) + Tidak ada (Progresif) + + + + Audio + + + + + Sample Rate: + Laju sampel: + + + + Name: + Nama: + + + + OliveGlobal + + + Olive Project %1 + Proyek Olive %1 + + + + Auto-recovery + Auto-pulih + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive tidak ditutup sebagaimana mestinya, dan ditemukan sebuah file auto-pulih. Buka? + + + + Open Project... + Buka Proyek... + + + + Missing recent project + Proyek Terakhir Tidak Ada + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Proyek '%1' tidak ada lagi. Hapus dari daftar "proyek terakhir"? + + + + Save Project As... + Simpan Proyek Sebagai... + + + + Unsaved Project + Proyek Belum Disimpan + + + + This project has changed since it was last saved. Would you like to save it before closing? + Proyek ini diubah sejak terakhir disimpan. Simpan sebelum ditutup? + + + + No active sequence + Tidak ada rangkaian aktif + + + + Please open the sequence to perform this action. + Buka dahulu rangkaian untuk melakukan aksi ini. + + + + No clips selected + Tidak ada klip yang diseleksi + + + + Select the clips you wish to auto-cut + Silahkan seleksi terlebih dahulu klip-klip yang Anda ingin potong secara otomatis + + + Please open the sequence you wish to export. + Buka dahulu rangkaian/sequence yang ingin diekspor. + + + + Missing Project File + File Proyek Tidak Ada + + + + Specified project '%1' does not exist. + Proyek yang dipilih, '%1', tidak ditemukan. + + + + PanEffect + + + Pan + Geser/Pan + + + + PreferencesDialog + + + Preferences + Preferensi + + + + Default Sequence + Rangkaian Default + + + + Invalid CSS File + File CSS Salah + + + + CSS file '%1' does not exist. + Tidak ditemukan file CSS '%1'. + + + + Confirm Reset All Shortcuts + Konfirmasi + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Anda akan mengembalikan semua pintasan keyboard seperti semula. Lanjut? + + + + Import Keyboard Shortcuts + Impor Pintasan Keyboard + + + + + Error saving shortcuts + Gagal menyimpan pintasan + + + + Failed to open file for reading + Gagal membuka file + + + + Export Keyboard Shortcuts + Ekspor Pintasan Keyboard + + + + Export Shortcuts + Ekspor Pintasan + + + + Shortcuts exported successfully + Pintasan berhasil diekspor + + + + Failed to open file for writing + Gagal membaca file + + + + Browse for CSS file + Buka file CSS + + + + Delete All Previews + Hapus Semua Pratinjau + + + + Are you sure you want to delete all previews? + Yakin menghapus semua pratinjau? + + + + Previews Deleted + Pratinjau Dihapus + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + Semua pratinjau berhasil dihapus. Anda mungkin perlu membuka proyek kembali. + + + + Language: + Bahasa: + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + Pindahkan kursor secara otomatis ke awal ketika mencapai akhir rangkaian + + + + Selecting Also Seeks + Menyeleksi juga menggeser + + + + Edit Tool Also Seeks + Alat Edit juga menggeser + + + + Edit Tool Selects Links + Alat Edit menyeleksi tautan + + + + Seek Also Selects + Menggeser juga menyeleksi + + + + Seek to the End of Pastes + Geser hingga akhir tempelan + + + + Scroll Wheel Zooms + Scroll Wheel memperbesar/memperkecil tampilan + + + + Hold CTRL to toggle this setting + Tekan CTRL untuk mengaktifkan pengaturan ini + + + + Invert Timeline Scroll Axes + Balikkan arah gulir Garis Waktu + + + + Enable Drag Files to Timeline + Seret dan Lepas file ke Garis Waktu + + + + Auto-Scale By Default + Atur ukuran video secara default + + + + Auto-Seek to Imported Clips + Geser hingga awal klip yang diimpor + + + + Audio Scrubbing + Nyalakan Audio Scrubbing + + + + Drop Files on Media to Replace + Lepas file pada media untuk menggantikan + + + + Enable Hover Focus + Nyalakan fokus melayang + + + + Ask For Name When Setting Marker + Tanyakan nama ketika menaruh penanda + + + + Custom CSS: + CSS Kustom: + + + + Browse + Telusur + + + + Image sequence formats: + Format rangkaian gambar: + + + + Audio Recording: + Rekaman audio: + + + + Mono + + + + + Stereo + Stereo + + + + Effect Textbox Lines: + Baris Teks Efek: + + + + Thumbnail Resolution: + according to kbbi it should be "keluku" but not a lot of people know that + Resolusi thumbnail: + + + + Waveform Resolution: + Resolusi waveform: + + + + Delete Previews + Hapus Pratinjau + + + + Use Software Fallbacks When Possible + Gunakan software fallback sebisa mungkin + + + + Default Sequence Settings + Pengaturan Rangkaian + + + + General + + + + + Behavior + Kelakuan + + + + Add Default Effects to New Clips + Tambahkan efek-efek biasa pada klip baru + + + + Appearance + Penampilan + + + + Theme + Tema + + + + Olive Dark (Default) + Gelap (Default) + + + + Olive Light + Terang + + + + Native + Selaras/native + + + + Native (Light Icons) + Selaras (Ikon Terang) + + + + Use Native Menu Styling + Gunakan gaya menu Selaras + + + Seeking + "geser" may not be understood well + Tampilan Frame + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + Tampilan Akurat +Selalu tampilkan frame yang sebenarnya (dapat terhenti sejenak sembari mencari frame yang benar) + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + Tampilan Cepat +Tampilkan frame dengan cepat (dapat menampilkan frame yang salah ketika menggeser kursor di timeline - tidak berpengaruh pada pemutaran/ekspor) + + + + Memory Usage + Pemakaian Memori + + + + Upcoming Frame Queue: + Antrian frame ke depan: + + + + + frames + frame + + + + + seconds + detik + + + + Previous Frame Queue: + Antrian frame ke belakang: + + + + Playback + Pemutaran + + + + Output Device: + Peranti output: + + + + + Default + + + + + Input Device: + Peranti masukan: + + + + Sample Rate: + Laju sampel: + + + + Audio + + + + + Search for action or shortcut + Cari aksi atau pintasan + + + + Action + Aksi + + + + Shortcut + Pintasan + + + + Import + Impor + + + + Export + Ekspor + + + + Reset Selected + Kembalikan Terseleksi + + + + Reset All + Kembalikan Semua + + + + Keyboard + + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + Gagal mencari stream video/audio yang benar + + + + Could not open file - %1 + Tidak dapat membuka file - %1 + + + + Could not find stream information - %1 + Tidak dapat mencari informasi stream - %1 + + + + Project + + + New + "make" instead of "new", for readability + Buat + + + + Open Project + Buka Proyek + + + + Save Project + Simpan Proyek + + + + Undo + Urung + + + + Redo + Ulangi + + + + Tree View + Tampilan Pohon + + + + Icon View + Tampilan Ikon + + + + List View + Tampilan Daftar + + + + Search media, markers, etc. + Cari media, penanda, dll. + + + + Project + Proyek + + + + Sequence + Rangkaian + + + + Replace '%1' + Ganti '%1' + + + + + All Files + Semua file + + + + + No active sequence + Tidak ada rangkaian aktif + + + + No sequence is active, please open the sequence you want to replace clips from. + Tidak ada rangkaian aktif, silahkan buka rangkaian yang akan diganti klipnya. + + + + Active sequence selected + Rangkaian aktif terseleksi + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + Anda tak dapat memasukkan rangkaian ke dalam rangkaian itu sendiri, jadi tidak ada klip sejenis ini dalam rangkaian. + + + + Rename '%1' + Ganti nama '%1' + + + + Enter new name: + Masukkan nama pengganti: + + + + Delete media in use? + Hapus media yang sedang dipakai? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + Media '%1' sedang dipakai dalam '%2'. Menghapus media tersebut akan menghapus semua kemunculan media dalam rangkaian. Yakin akan melakukan hal tersebut? + + + + Skip + Lewati + + + + Import a Project + Impor Proyek + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" adalah file proyek Olive. File tersebut akan tergabung dengan proyek ini. Lanjutkan? + + + + Image sequence detected + Rangkaian gambar terdeteksi + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + File '%1' sepertinya merupakan rangkaian gambar. Impor sebagai rangkaian gambar? + + + + Import media... + Impor media... + + + + No sequence is active, please open the sequence you want to delete clips from. + Tidak ada rangkaian aktif, silahkan buka rangkaian yang Anda ingin hapus klipnya. + + + + ProxyDialog + + + Create Proxy + Buat Proksi + + + + Proxy + Proksi + + + + Dimensions: + Ukuran: + + + + Same Size as Source + Sama dengan Sumber + + + + Half Resolution (1/2) + Resolusi setengah (1/2) + + + + Quarter Resolution (1/4) + Resolusi seperempat (1/4) + + + + Eighth Resolution (1/8) + Resolusi seperdelapan (1/8) + + + + Sixteenth Resolution (1/16) + Resolusi seperenambelas (1/16) + + + + Format: + + + + + ProRes HQ + + + + + Location: + Lokasi: + + + + Same as Source (in "%1" folder) + Sama dengan Sumber (dalam folder "%1") + + + + Proxy file exists + File proksi sudah ada + + + + The file "%1" already exists. Do you wish to replace it? + File "%1" sudah ada. Ganti? + + + + Custom Location + Lokasi Kustom + + + + ProxyGenerator + + + Finished generating proxy for "%1" + Selesai membuat proksi untuk "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Ganti klip yang menggunakan "%1" + + + + Select which media you want to replace this media's clips with: + Pilih media pengganti: + + + + Keep the same media in-points + Samakan titik masuk media + + + + Replace + Ganti + + + + Cancel + Batalkan + + + + No media selected + Tidak ada media yang diseleksi + + + + Please select a media to replace with or click 'Cancel'. + Pilih media pengganti atau klik "Batalkan". + + + + Same media selected + Terseleksi media yang sama + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Anda menyeleksi media yang sama dengan yang akan diganti. Silahkan pilih yang lain atau klik "Batalkan". + + + + Folder selected + Folder terseleksi + + + + You cannot replace footage with a folder. + Anda tidak dapat mengganti media dengan folder. + + + + Active sequence selected + Rangkaian aktif terseleksi + + + + You cannot insert a sequence into itself. + Anda tidak dapat memasukkan rangkaian pada rangkaian itu sendiri. + + + + RichTextEffect + + + Text + Teks + + + + Padding + Ruang Border + + + + Position + Posisi + + + + Vertical Align: + Rata Vertikal: + + + + Top + Atas + + + + Center + Tengah + + + + Bottom + Bawah + + + + Auto-Scroll + Gulir otomatis + + + + Off + Matikan + + + + Up + Ke atas + + + + Down + Ke bawah + + + + Left + Ke kiri + + + + Right + Ke kanan + + + + Shadow + Bayangan + + + + Shadow Color + Warna Bayangan + + + + Shadow Angle + Arah Bayangan + + + + Shadow Distance + Jarak Bayangan + + + + Shadow Softness + Kehalusan Bayangan + + + + Shadow Opacity + "opacity" is a hard word to find a suitable meaning for + Intensitas Bayangan + + + + Sequence + + + %1 (copy) + %1 (salinan) + + + + ShakeEffect + + + Intensity + Intensitas + + + + Rotation + Rotasi + + + + Frequency + Frekuensi + + + + SolidEffect + + + Type + Tipe + + + + Solid Color + Warna + + + + SMPTE Bars + + + + + Checkerboard + Kotak-Kotak + + + + Opacity + + + + + Color + Warna + + + + Checkerboard Size + Ukuran Kotak-Kotak + + + + SourcesCommon + + + Import... + Impor... + + + + New + thought it'd made more sense to have the user read it as "buat -> rangkaian baru" ("create new sequence"), instead of "baru -> rangkaian" + Buat + + + + View + Tampilan + + + + Tree View + Tampilan Pohon + + + + Icon View + Tampilan Ikon + + + + Show Toolbar + Tampilkan Toolbar + + + + Show Sequences + Tampilkan Rangkaian + + + + Replace/Relink Media + Ganti/Taut Media + + + + Reveal in Explorer + Buka di Explorer + + + + Reveal in Finder + Buka di Finder + + + + Reveal in File Manager + Buka di Manajer Berkas + + + + Replace Clips Using This Media + Ganti Semua Klip yang Menggunakan Media Ini + + + + Create Sequence With This Media + Buat Rangkaian dengan Media Ini + + + + Duplicate + Gandakan + + + + Delete All Clips Using This Media + Hapus Semua Klip yang Menggunakan Media Ini + + + + Proxy + Proksi + + + + Generating proxy: %1% complete + Membuat proksi: %1% + + + + Create/Modify Proxy + Buat/Ubah Proksi + + + + Create Proxy + Buat Proksi + + + + Modify Proxy + Ubah Proksi + + + + Restore Original + Kembalikan Seperti Semula + + + + Delete + Hapus + + + + Preview in Media Viewer + Pratayang di Penampil Media + + + + Properties... + Properti... + + + + Replace Media + Ganti Media + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Anda menjatuhkan file ke '%1'. Ganti klip dengan file tersebut? + + + + Delete proxy + Hapus proksi + + + + Would you like to delete the proxy file "%1" as well? + Hapus file proksi "%1" juga? + + + + SpeedDialog + + + Speed/Duration + Kecepatan/Durasi + + + + Speed: + Kecepatan: + + + + Frame Rate: + Laju frame (fps): + + + + Duration: + Durasi: + + + + Reverse + Terbalik + + + + Maintain Audio Pitch + Tahan Pitch + + + + Ripple Changes + + + + + TextEditDialog + + + Edit Text + Edit Teks + + + + Thin + + + + + Extra Light + + + + + Light + + + + + Normal + + + + + Medium + + + + + Demi Bold + + + + + Bold + + + + + Extra Bold + + + + + Black + + + + + TextEditEx + + + Edit Text + Edit Teks + + + + &Edit Text + &Edit Teks + + + + TextEffect + + + Text + Teks + + + + Font + Fon + + + + Size + Ukuran + + + + Color + Warna + + + + Alignment + Rata + + + + Left + Kiri + + + + + Center + Tengah + + + + Right + Kanan + + + + Justify + Kanan-Kiri + + + + Top + Atas + + + + Bottom + Bawah + + + + Word Wrap + "bungkus kata" is also possible but feels weird + Sesuaikan Lebar Kata + + + + Padding + Ruang Border + + + + Position + Posisi + + + + Outline + Garis Teks + + + + Outline Color + Warna Garis + + + + Outline Width + Ketebalan Garis + + + + Shadow + Bayangan + + + + Shadow Color + Warna Bayangan + + + + Shadow Angle + Arah Bayangan + + + + Shadow Distance + Jarak Bayangan + + + + Shadow Softness + Kehalusan Bayangan + + + + Shadow Opacity + Intensitas Bayangan + + + + Sample Text + Masukkan teks disini + + + + TimecodeEffect + + + Timecode + Kode Waktu + + + + Sequence + Rangkaian + + + + Media + + + + + Scale + Ukuran + + + + Color + Warna + + + + Background Color + Warna Latar + + + + Background Opacity + Transparansi Latar + + + + Offset + Penggeseran + + + + Prepend + Teks Sebelum + + + + Timeline + + + Pointer Tool + Alat Tunjuk + + + + Edit Tool + Alat Edit + + + + Ripple Tool + Alat Pengatur + + + + Razor Tool + Alat Potong + + + + Slip Tool + Alat Slip + + + + Slide Tool + Alat Geser Klip + + + + Hand Tool + Alat Geser Tampilan + + + + Transition Tool + Alat Transisi + + + + Snapping + Lekatan + + + + Zoom In + Perbesar Tampilan + + + + Zoom Out + Perkecil Tampilan + + + + Record audio + Rekam suara + + + + Add title, solid, bars, etc. + Masukkan judul, warna, bars, dll. + + + + Nested Sequence + Rangkaian Bersarang + + + + Effect already exists + Efek sudah ada + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + Klip '%1' sudah memiliki efek '%2'. Ganti dengan yang akan ditempel atau tambahkan sebagai efek sendiri? + + + + Add + Tambah + + + + Replace + Ganti + + + + Skip + Lewati + + + + Do this for all conflicts found + Lakukan untuk semua konflik yang ditemukan + + + + Title... + Judul... + + + + Solid Color... + Warna... + + + + Bars... + + + + + Tone... + Nada... + + + + Noise... + + + + + Unsaved Project + Proyek Belum Disimpan + + + + You must save this project before you can record audio in it. + Proyek ini harus disimpan sebelum merekam suara. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Klik tempat dimana Anda akan mulai merekam (seret untuk membatasi rekaman dalam waktu tertentu) + + + + Timeline: + Garis Waktu: + + + + (none) + (tidak ada) + + + + TimelineHeader + + + Center Timecodes + Ratakan Kode Waktu + + + + TimelineWidget + + + &Undo + "takjadi" and "batalkan" are also possible translations + &Urung + + + + &Redo + "kembalikan" is also possible + &Ulangi + + + &Paste + &Tempel + + + + R&ipple Delete Empty Space + Hapus dan Sesuaikan Ruang &Kosong + + + + Sequence Settings + Pengaturan Rangkaian + + + + &Speed/Duration + &Kecepatan/Durasi + + + Auto-s&cale + Per&besar otomatis + + + + Auto-Cut Silence + Potong Audio Senyap + + + + Auto-S&cale + Per&besar Otomatis + + + + &Reveal in Project + &Buka di Proyek + + + + Properties + Properti + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Mulai: %2 +Akhir: %3 +Durasi: %4 + + + + Error + + + + + Couldn't locate media wrapper for sequence. + Tidak dapat mencari bungkus media untuk rangkaian. + + + + Title + Judul + + + + Solid Color + Warna + + + + Bars + + + + + Tone + Nada + + + + Noise + Noise + + + + Duration: + Durasi: + + + + ToneEffect + + + Type + Tipe + + + + Sine + Sinus + + + + Frequency + Frekuensi + + + + Amount + Kenyaringan + + + + Mix + Campur + + + + TransformEffect + + + Position + Posisi + + + + Scale + Ukuran + + + + Uniform Scale + Ukuran Merata + + + + Rotation + Rotasi + + + + Anchor Point + Titik Poros + + + + Opacity + + + + + Blend Mode + Mode Penggabungan + + + + Normal + + + + + Transition + + + Length + Panjang + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + Pembaruan aplikasi telah tersedia. Silahkan kunjungi www.olivevideoeditor.org untuk mengunduhnya. + + + + VSTHost + + + + Error loading VST plugin + Gagal membuka plugin VST + + + + Failed to load VST plugin "%1": %2 + Gagal membuka plugin VST "%1": %2 + + + + Failed to locate entry point for dynamic library. + Gagal mencari titik masuk untuk pustaka dinamis (dynamic library). + + + + VST Error + Galat VST + + + + Plugin's magic number is invalid + Identifikasi (magic number) plugin salah + + + + Plugin + + + + + Interface + Antarmuka + + + + Show + Tampilkan + + + + VST Plugin + Plugin VST + + + + Viewer + + + Sequence Viewer + Tampilan Rangkaian + + + + Media Viewer + Tampilan Media + + + + (none) + (tidak ada) + + + + Drag video only + Tarik video saja + + + + Drag audio only + Tarik audio saja + + + + ViewerWidget + + + Save Frame as Image... + Simpan Frame sebagai Gambar... + + + + Show Fullscreen + Tampilkan Layar Penuh + + + + Disable + Matikan + + + + Screen %1: %2x%3 + Layar %1: %2x%3 + + + + Zoom + Pembesaran + + + + Fit + Pas + + + + Custom + Kustom + + + + Close Media + Tutup Media + + + + Save Frame + Simpan Frame + + + + Viewer Zoom + Pembesaran Tampilan + + + + Set Custom Zoom Value: + Masukkan pembesaran kustom: + + + + ViewerWindow + + + Exit Fullscreen + Keluar dari Layar Penuh + + + + VoidEffect + + + (unknown) + (tidak diketahui) + + + + Missing Effect + Efek Hilang + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + Transisi salah + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + Tidak ada kandidat untuk efek '%1'. Efek mungkin korup. Coba menginstal ulang efek tersebut, atau menginstal ulang Olive. + + + diff --git a/app/ts/it_IT.ts b/app/ts/it_IT.ts new file mode 100644 index 000000000..79466c81d --- /dev/null +++ b/app/ts/it_IT.ts @@ -0,0 +1,3864 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive è un editor video non lineare. Questo è software libero ed è protetto dalla licenza GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Gli sviluppatori di Olive sono grati di informare che il codice sorgente del programma è scaricabile dal sito. + + + + ActionSearch + + + Search for action... + Cerca un'azione... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Impostazioni video avanzate + + + + Pixel Format: + Formato pixel: + + + + Threads: + Thread: + + + + Audio + + + %1 Audio + Audio %1 + + + + Recording %1 + Registrazione di %1 + + + + AudioNoiseEffect + + + Amount + Ammontare + + + + Mix + Miscela + + + + AutoCutSilenceDialog + + + Cut Silence + Taglia silenzio + + + + Attack Threshold: + Soglia d'attacco: + + + + Attack Time: + Tempo d'attacco: + + + + Release Threshold: + Soglia di rilascio: + + + + Release Time: + Tempo di rilascio: + + + + Cacher + + + + Could not open %1 - %2 + Impossibile aprire %1 - %2 + + + + ChannelLayoutName + + + Invalid + Non valido + + + + Mono + Mono + + + + Stereo + Stereo + + + + ClipPropertiesDialog + + + "%1" Properties + Proprietà di "%1" + + + + Multiple Clip Properties + Proprietà di clip multiple + + + + Name: + Nome: + + + + Duration: + Durata: + + + + (multiple) + (multiple) + + + + CollapsibleWidget + + + <untitled> + <senza titolo> + + + + ColorButton + + + Set Color + Imposta colore + + + + CornerPinEffect + + + Top Left + In alto a sinistra + + + + Top Right + In alto a destra + + + + Bottom Left + In basso a sinistra + + + + Bottom Right + In basso a destra + + + + Perspective + Prospettico + + + + DebugDialog + + + Debug Log + Log di debug + + + + DemoNotice + + + + Welcome to Olive! + Maschile riferito all'utente + Benvenuto in Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive è un editor video libero non lineare rilasciato sotto licenza GNU GPL. Se hai pagato per questo programma, sei stato truffato. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Il software è attualmente in ALFA; ciò significa che non è stabile ed è probabile che vada in crash, abbia errori o manchino alcune funzioni. Non offriamo alcuna garanzia, quindi usalo a tuo rischio. Puoi segnalare errori o richiedere funzionalità su %1 + + + + Thank you for trying Olive and we hope you enjoy it! + Grazie per aver provato Olive, speriamo che ti piaccia! + + + + Effect + + + Invalid effect + Effetto non valido + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + Nessun candidato per l'effetto "%1". Questo effetto potrebbe essere corrotto. Prova a reinstallare l'effetto o Olive. + + + Cu&t + &Taglia + + + &Copy + &Copia + + + Move &Up + Sposta in s&u + + + Move &Down + Sposta in &giù + + + D&elete + &Elimina + + + Load Settings From File + Carica le impostazioni da file + + + Save Settings to File + Salva le impostazioni su file + + + + Save Effect Settings + Salva impostazioni degli effetti + + + + + Effect XML Settings %1 + XML impostazioni effetti %1 + + + + Save Settings Failed + Salvataggio impostazioni fallito + + + + Failed to open "%1" for writing. + Impossibile aprire il file "%1" in scrittura. + + + + Load Effect Settings + Carica impostazioni effetto + + + + + Load Settings Failed + Caricamento impostazioni fallito + + + + Failed to open "%1" for reading. + Impossibile aprire "%1" in lettura. + + + + This settings file doesn't match this effect. + Questo file di impostazioni non corrisponde con questo effetto. + + + + EffectControls + + + Effects: + Effetti: + + + &Paste + &Incolla + + + + (none) + (nessuno) + + + + Add Video Effect + Aggiungi effetto video + + + + VIDEO EFFECTS + EFFETTI VIDEO + + + + Add Video Transition + Aggiungi transizione video + + + + Add Audio Effect + Aggiungi effetto video + + + + AUDIO EFFECTS + EFFETTI AUDIO + + + + Add Audio Transition + Aggiungi transizione audio + + + (Multiple clips selected) + (Più clip selezionate) + + + + EffectRow + + + Disable Keyframes + Disabilita fotogrammi chiave + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Disabilitare i fotogrammi chiave eliminerà tutti quelli attualmente esistenti. Sei sicuro di volerlo fare? + + + + EffectUI + + + %1 (Opening) + %1 (in apertura) + + + + %1 (Closing) + %1 (in chiusura) + + + + %1 (multiple) + %1 (multiple) + + + + Cu&t + &Taglia + + + + &Copy + &Copia + + + + Move &Up + Sposta in s&u + + + + Move &Down + Sposta in &giù + + + + D&elete + &Elimina + + + + Load Settings From File + Carica le impostazioni da file + + + + Save Settings to File + Salva le impostazioni su file + + + + EmbeddedFileChooser + + + File: + File: + + + + ExportDialog + + + Export "%1" + Esporta "%1" + Esporta "%1" + + + + Unknown codec name %1 + Nome del codec %1 sconosciuto + + + + Export Failed + Esportazione non riuscita + + + + Export failed - %1 + Esportazione non riuscita - %1 + + + + Invalid dimensions + Dimensioni non valide + + + + Export width and height must both be even numbers/divisible by 2. + La larghezza e l'altezza dell'esportazione devono essere pari/divisibili per due. + + + + Invalid codec + Codec non valido + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Impossibile determinare i parametri d'output per il codec selezionato. Questo è un errore, si prega di contattare gli sviluppatori. + + + + Invalid format + Formato non valido + + + + Couldn't determine output format. This is a bug, please contact the developers. + Impossibile determinare il formato di output. Questo è un errore, si prega di contattare gli sviluppatori. + + + + Export Media + Esporta media + + + + %p% (Total: %1:%2:%3) + %p% (totale: %1:%2:%3) + + + + %p% (ETA: %1:%2:%3) + %p% (tempo residuo %1:%2:%3) + + + + Quality-based (Constant Rate Factor) + Basata sulla qualità (CFR bitrate variabile) + + + + Constant Bitrate + Bitrate costante + + + + + Invalid Codec + Codec non valido + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Impossibile trovare un codificatore compatibile per questo codec. È facile che l'esportazione fallisca. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Impossibile trovare il formato dei pixel di questo codificatore. È facile che l'esportazione fallisca. + + + + Bitrate (Mbps): + Bitrate (Mbps): + + + + Quality (CRF): + Qualità (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Fattore di qualità: + +0 = senza perdita +17-18 = visivamente senza perdita (compresso, ma non si nota) +23 = alta qualità +51 = peggiore qualità possibile + + + + Target File Size (MB): + Grandezza file desiderata (MB): + + + + Format: + Formato: + + + + Range: + Intervallo: + + + + Entire Sequence + Sequenza completa + + + + In to Out + Zona selezionata + + + + Video + Video + + + + + Codec: + Codec: + + + + Width: + Larghezza: + + + + Height: + Altezza: + + + + Frame Rate: + Fotogrammi al secondo: + + + + Compression Type: + Tipo di compressione: + + + + Advanced + Avanzate + + + + Audio + Audio + + + + Sampling Rate: + Frequenza di campionamento: + + + + Bitrate (Kbps/CBR): + Bitrate (Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + errore nell'invio del fotogramma al codificatore (%1) + + + + failed to receive packet from encoder (%1) + errore nella ricezione di un pacchetto dal codificatore (%1) + + + + could not video encoder for %1 + impossibile trovare un codificatore video per %1 + + + + could not allocate video stream + impossibile allocare stream video + + + + could not allocate video encoding context + impossibile allocale contesto di codifica del video + + + + could not open output video encoder (%1) + impossibile aprire il codificatore video d'output (%1) + + + + could not copy video encoder parameters to output stream (%1) + impossibile copiare i parametri del codificatore video allo stream di output (%1) + + + + could not audio encoder for %1 + impossibile trovare un codificatore audio per %1 + + + + could not allocate audio stream + impossibile allocare lo stream audio + + + + could not allocate audio encoding context + impossibile allocale contesto di codifica dell'audio + + + + could not open output audio encoder (%1) + impossibile aprire il codificatore dell'output audio (%1) + + + + could not copy audio encoder parameters to output stream (%1) + impossibile copiare i parametri del codificatore audio allo stream di output (%1) + + + + could not allocate audio buffer (%1) + impossibile allocare il buffer audio (%1) + + + + could not create output format context + impossibile creare il contesto del formato d'output + + + + could not open output file (%1) + impossibile aprire il file di output (%1) + + + + could not write output file header (%1) + impossibile scrivere l'intestazione del file di output (%1) + + + + could not write output file trailer (%1) + impossibile scrivere la fine del file d'output (%1) + + + + FillLeftRightEffect + + + Type + Tipo + + + + Fill Left with Right + Riempi il sinistro con il destro + + + + Fill Right with Left + Riempi il destro con il sinistro + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Impossibile caricare il plugin Frei0r "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + NOTA: Non si possono caricare plugin Frei0r a 32 bit in una versione a 64 bit di Olive. Si prega di trovare la versione a 64 bit di questo plugin oppure di passare alla versione 32 bit di Olive. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + NOTA: Non si possono caricare plugin Frei0r a 64 bit in una versione a 32 bit di Olive. Si prega di trovare la versione a 32 bit di questo plugin oppure di passare alla versione 64 bit di Olive. + + + + Error loading Frei0r plugin + Errore nel caricamento plugin Frei0r + + + + GraphEditor + + + Graph Editor + Editor del grafico + + + + Linear + Lineare + + + + Bezier + Bézier + + + + Hold + Costante + + + + GraphView + + + Zoom to Selection + Ingrandisci la selezione + + + + Zoom to Show All + Ingrandisci per mostrare tutto + + + + Reset View + Reimposta ingrandimento + + + + InterlacingName + + + None (Progressive) + Nessuno (progressivo) + + + + Top Field First + Prima la linea in alto + + + + Bottom Field First + Prima la linea in basso + + + + Invalid + Non valido + + + + KeyframeNavigator + + + Enable Keyframes + Abilita fotogrammi chiave + + + + KeyframeView + + + Linear + Lineare + + + + Bezier + Bézier + + + + Hold + Costante + + + + LabelSlider + + + &Edit + &Modifica + + + + &Reset to Default + &Ripristina predefinito + + + + + Set Value + Imposta valore + + + + + New value: + Nuovo valore: + + + + LoadDialog + + + Loading... + Caricamento... + + + + Loading '%1'... + Caricamento di "%1"... + + + + Cancel + Annulla + + + + LoadThread + + + Version Mismatch + Mancata corrispondenza della versione + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Questo progetto è stato salvato con una versione diversa di Olive e potrebbe non essere compatibile con questa. Vuoi provare a caricarlo ugualmente? + + + + Invalid Clip Link + Link della clip non valido + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Questo progetto contiene un collegamento non valido a una clip. Potrebbe essere danneggiato. Vuoi continuare a caricarlo? + + + + %1 - Line: %2 Col: %3 + %1 - Linea: %2 Colonna: %3 + + + + User aborted loading + L'utente ha interrotto il caricamento + + + + XML Parsing Error + Errore nell'analisi XML + + + + Couldn't load '%1'. %2 + Impossibile caricare "%1". %2 + + + + Project Load Error + Errore nel caricamento del progetto + + + + Error loading project: %1 + Impossibile caricare il progetto: %1 + + + + MainWindow + + + Welcome to %1 + Benvenuti in %1 + + + + &File + &File + + + + &New + &Nuovo + + + + &Open Project + Apri pr&ogetto + + + + Clear Recent List + Svuota lista recenti + + + + Open Recent + Apri recenti + + + + &Save Project + &Salva progetto + + + + Save Project &As + S&alva progetto con nome + + + + &Import... + &Importa... + + + + &Export... + &Esporta... + + + + E&xit + Es&ci + + + + &Edit + &Modifica + + + + &Undo + &Annulla + + + + Redo + Rifai + + + + Select &All + Seleziona t&utto + + + + Deselect All + Deseleziona tutto + + + + Ripple to In Point + Taglia a catena fino al punto iniziale + + + + Ripple to Out Point + Intende il punto fine selezione o il cursore? + Taglia a catena dal punto finale + + + + Edit to In Point + Taglia fino al punto iniziale + + + + Edit to Out Point + Taglia dal punto finale + + + + Delete In/Out Point + Elimina tra l'inizio e fine selezione + + + + Ripple Delete In/Out Point + Elimina a catena tra l'inizio e fine selezione + + + + Set/Edit Marker + Imposta/modifica marcatore + + + + &View + &Visualizza + + + + Zoom In + Ingrandisci + + + + Zoom Out + Rimpicciolisci + + + + Increase Track Height + Aumenta l'altezza delle tracce + + + + Decrease Track Height + Diminuisci altezza delle tracce + + + + Toggle Show All + Commuta mostra tutti + + + + Track Lines + Linee tra le tracce + + + + Rectified Waveforms + Forme d'onda rettificate + + + + Frames + Fotogrammi + + + + Drop Frame + Salta fotogrammi + + + + Non-Drop Frame + Non saltare fotogrammi + + + + Milliseconds + Millisecondi + + + + Title/Action Safe Area + Area di sicurezza del titolo/azione + + + + Off + Disattivato + + + + Default + Predefinito + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + Personalizzato + + + + Full Screen + Schermo intero + + + + Full Screen Viewer + Visualizzatore a schermo intero + + + + &Playback + &Riproduzione + + + + Go to Start + Vai all'inizio + + + + Previous Frame + Fotogramma precedente + + + + Play/Pause + Riproduci/pausa + + + + Play In to Out + Riproduci tra inizio e fine selezione + + + + Next Frame + Fotogramma successivo + + + + Go to End + Vai alla fine + + + + Go to Previous Cut + Vai al taglio precedente + + + + Go to Next Cut + Vai al taglio successivo + + + + Go to In Point + Vai al punto di inizio selezione + + + + Go to Out Point + Vai al punto di fine selezione + + + + Shuttle Left + Scorri riproducendo verso sinistra + + + + Shuttle Stop + Ferma scorrimento riproduzione + + + + Shuttle Right + Scorri riproducendo verso destra + + + + Loop + Ciclico + + + + &Window + &Finestra + + + + Project + Progetto + + + + Effect Controls + Controllo effetti + + + + Timeline + Linea temporale + + + + Graph Editor + Editor del grafico + + + + Media Viewer + Visualizzatore media + + + + Sequence Viewer + Visualizzatore sequenza + + + + Maximize Panel + Massimizza pannello + + + + Lock Panels + Blocca pannelli + + + + Reset to Default Layout + Torna alla disposizione predefinita + + + + &Tools + S&trumenti + + + + Pointer Tool + Strumento puntatore + + + + Edit Tool + Strumento di modifica + + + + Ripple Tool + Strumento ridimensiona a catena + + + + Razor Tool + Strumento di taglio + + + + Slip Tool + Strumento di scivolamento + + + + Slide Tool + Strumento di scorrimento + + + + Hand Tool + Strumento mano + + + + Transition Tool + Strumento transizione + + + + Enable Snapping + Attiva bordi magnetici + + + + Auto-Cut Silence + Taglio automatico del silenzio + + + Selecting Also Seeks + Selezionando si sposta anche il cursore + + + Edit Tool Also Seeks + Lo strumento di modifica sposta anche il cursore + + + Edit Tool Selects Links + Lo strumento di modifica seleziona anche i collegamenti + + + Seek Also Selects + Spostare il cursore seleziona anche + + + Seek to the End of Pastes + Sposta cursore alla fine di ciò che viene incollato + + + Scroll Wheel Zooms + Ingrandisci con la rotellina del mouse + + + Enable Drag Files to Timeline + Permetti il trascinamento dei file alla linea temporale + + + Auto-Scale By Default + Scala automaticamente in maniera predefinita + + + Enable Seek to Import + Sposta cursore all'importazione + + + Audio Scrubbing + Da rivedere in base alla traduzione della linea verticale di riproduzione + Audio attivo durante il trascinamento + + + Enable Drop on Media to Replace + Permetti di rilasciare su un media per rimpiazzarlo + + + Enable Hover Focus + Abilita focus al passaggio + + + Ask For Name When Setting Marker + Chiedi un nome nell'impostazione del marcatore + + + + No Auto-Scroll + Disattiva scorrimento automatico + + + + Page Auto-Scroll + Scorrimento pagina automatico + + + + Smooth Auto-Scroll + Scorrimento automatico fluido + + + + Preferences + Impostazioni + + + + Clear Undo + Dimentica cronologia azioni + + + + &Help + &Aiuto + + + + A&ction Search + Ri&cerca azione + + + + Debug Log + Log di debug + + + + &About... + Inform&azioni... + + + + <untitled> + <senza titolo> + + + + Marker + + + Set Marker + Imposta marcatore + + + + Set clip marker name: + Imposta nome del marcatore della clip: + + + + Set sequence marker name: + Imposta nome del marcatore della sequenza: + + + + Media + + + New Folder + Nuova cartella + + + + Name: + Nome: + + + + Filename: + Nome file: + + + + Video Dimensions: + Dimensioni video: + + + + Frame Rate: + Velocità fotogrammi: + + + + %1 field(s) (%2 frame(s)) + %1 campo(i) (%2 fotogramma(i)) + + + + Interlacing: + Interlacciamento: + + + + Audio Frequency: + Frequenza audio: + + + + Audio Channels: + Canali audio: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Nome: %1 +Dimensioni video: %2x%3 +Velocità fotogrammi: %4 +Frequenza audio: %5 +Disposizione audio: %6 + + + + Name + Nome + + + + Duration + Durata + + + + Rate + Frequenza + + + + MediaPropertiesDialog + + + "%1" Properties + Proprietà di "%1" + + + + Tracks: + Tracce: + + + + Video %1: %2x%3 %4FPS + Video %1: %2x%3 %4FPS + + + + Audio %1: %2Hz %3 + Audio %1: %2Hz %3 + + + + %n channel(s) + + %n canale + %n canali + + + + + Conform to Frame Rate: + Conforme alla velocità dei fotogrammi: + + + + Alpha is Premultiplied + Canale alfa premoltiplicato + + + + Auto (%1) + Automatico (%1) + + + + Interlacing: + Interlacciamento: + + + + Name: + Nome: + + + + MenuHelper + + + &Project + &Progetto + + + + &Sequence + &Sequenza + + + + &Folder + C&artella + + + + Set In Point + Imposta punto di inizio selezione + + + + Set Out Point + Imposta punto di fine selezione + + + + Reset In Point + Azzera punto inizio selezione + + + + Reset Out Point + Azzera punto fine selezione + + + + Clear In/Out Point + Pulisci punti di inizio/fine selezione + + + + Add Default Transition + Aggiungi transizione predefinita + + + + Link/Unlink + Collega/scollega + + + + Enable/Disable + Attiva/disattiva + + + + Nest + Annida + + + + Cu&t + &Taglia + + + + Cop&y + &Copia + + + + + &Paste + &Incolla + + + + Paste Insert + Incolla e inserisci + + + + Duplicate + Duplica + + + + Delete + Elimina + + + + Ripple Delete + Elimina a catena + + + + Split + Dividi + + + + Invalid aspect ratio + Rapporto d'aspetto non valido + + + + The aspect ratio '%1' is invalid. Please try again. + Il rapporto d'aspetto "%1" non è valido. Riprovare. + + + + Enter custom aspect ratio + Inserisci rapporto d'aspetto personalizzato + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Inserisci il rapporto d'aspetto da usare per l'area di sicurezza (es. 16:9): + + + + NewSequenceDialog + + + Editing "%1" + Modifica di "%1" + + + + New Sequence + Nuova sequenza + + + + Preset: + Preimpostazioni: + + + + Film 4K + Film 4K + + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + Personalizzato + + + + Video + Video + + + + Width: + Larghezza: + + + + Height: + Altezza: + + + + Frame Rate: + Velocità fotogrammi: + + + + Pixel Aspect Ratio: + Proporzioni dei pixel: + + + + Square Pixels (1.0) + Pixel quadrati (1.0) + + + + Interlacing: + Interlacciamento: + + + + None (Progressive) + Nessuno (progressivo) + + + + Audio + Audio + + + + Sample Rate: + Frequenza di campionamento: + + + + Name: + Nome: + + + + OliveGlobal + + + Olive Project %1 + Progetto di Olive %1 + + + + Auto-recovery + Ripristino automatico + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive non è stato chiuso correttamente ed è stato trovato un file di ripristino. Desideri aprirlo? + + + + Open Project... + Apri progetto... + + + + Missing recent project + Progetto recente mancante + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Il progetto "%1" non esiste più. Vuoi rimuoverlo dalla lista dei progetti recenti? + + + + Save Project As... + Salva progetto con nome... + + + + Unsaved Project + Progetto non salvato + + + + This project has changed since it was last saved. Would you like to save it before closing? + Il progetto è stato modificato rispetto all'ultimo salvataggio. Vuoi salvarlo prima di chiuderlo? + + + + No active sequence + Nessuna sequenza attiva + + + + Please open the sequence to perform this action. + Si prega di aprire una sequenza per poter eseguire questa azione. + + + + No clips selected + Nessuna clip selezionata + + + + Select the clips you wish to auto-cut + Seleziona le clip che vuoi tagliare automaticamente + + + Please open the sequence you wish to export. + Si prega di aprire la sequenza che si desidera esportare. + + + + Missing Project File + File del progetto mancante + + + + Specified project '%1' does not exist. + Il progetto specificato "%1" non esiste. + + + + PanEffect + + + Pan + Trasla + + + + PreferencesDialog + + + Preferences + Impostazioni + + + + Default Sequence + Sequenza predefinita + + + + Invalid CSS File + File CSS non valido + + + + CSS file '%1' does not exist. + Il file CSS "%1" non esiste. + + + + Confirm Reset All Shortcuts + Conferma l'azzeramento di tutte le scorciatoie da tastiera + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Sei sicuro di voler riportare tutte le scorciatoie da tastiera ai valori iniziali? + + + + Import Keyboard Shortcuts + Importa scorciatoie da tastiera + + + + + Error saving shortcuts + Errore nel salvataggio delle scorciatoie + + + + Failed to open file for reading + Errore nell'apertura del file in lettura + + + + Export Keyboard Shortcuts + Esporta scorciatoie da tastiera + + + + Export Shortcuts + Esporta scorciatoie + + + + Shortcuts exported successfully + Scorciatoie esportate con successo + + + + Failed to open file for writing + Errore nell'apertura del file in scrittura + + + + Browse for CSS file + Sfoglia file CSS + + + + Delete All Previews + Elimina tutte le anteprime + + + + Are you sure you want to delete all previews? + Sei sicuro di voler eliminare tutte le anteprime? + + + + Previews Deleted + Anteprime eliminate + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + Tutte le anteprime sono state eliminate con successo. Potresti dover riaprire il progetto attuale affinché i cambiamenti abbiano effetto. + + + + Language: + Lingua: + + + + Default Sequence Settings + Impostazioni predefinite della sequenza + + + + Add Default Effects to New Clips + Aggiungi gli effetti predefiniti alle nuove clip + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + Riporta il cursore all'inizio quando si riproduce alla fine di una sequenza + + + + Selecting Also Seeks + Selezionando si sposta anche il cursore + + + + Edit Tool Also Seeks + Lo strumento di modifica sposta anche il cursore + + + + Edit Tool Selects Links + collegamenti o collegàti? + Lo strumento di modifica seleziona anche i collegamenti + + + + Seek Also Selects + Spostare il cursore seleziona anche + + + + Seek to the End of Pastes + Sposta cursore alla fine di ciò che viene incollato + + + + Scroll Wheel Zooms + Ingrandisci con la rotellina del mouse + + + + Hold CTRL to toggle this setting + Tieni premuto CTRL per commutare questa impostazione + + + + Invert Timeline Scroll Axes + Inverti assi di scorrimento della linea temporale + + + + Enable Drag Files to Timeline + Permetti il trascinamento dei file alla linea temporale + + + + Auto-Scale By Default + Scala automaticamente in maniera predefinita + + + + Auto-Seek to Imported Clips + Sposta il cursore alle clip importate + + + + Audio Scrubbing + Audio attivo durante il trascinamento cursore + + + + Drop Files on Media to Replace + Rilascia i file sui media per rimpiazzarli + + + + Enable Hover Focus + Abilita focus al passaggio + + + + Ask For Name When Setting Marker + Chiedi un nome nell'impostazione del marcatore + + + + Appearance + Aspetto + + + + Theme + Tema + + + + Olive Dark (Default) + Olive scuro (predefinito) + + + + Olive Light + Olive chiaro + + + + Native + Nativo + + + + Native (Light Icons) + Nativo (icone chiare) + + + + Use Native Menu Styling + Usa lo stile nativo per i menu + + + + Custom CSS: + CSS personalizzato: + + + + Browse + Sfoglia + + + + Image sequence formats: + Formati delle sequenze immagini: + + + + Audio Recording: + Registrazione audio: + + + + Mono + Mono + + + + Stereo + Stereo + + + + Effect Textbox Lines: + N° linee nelle caselle di testo degli effetti: + + + + Thumbnail Resolution: + Risoluzione anteprime: + + + + Waveform Resolution: + Risoluzione forma d'onda: + + + + Delete Previews + Elimina anteprime + + + + Use Software Fallbacks When Possible + tradurre o no software fallback? è linguaggio parecchio tecnico + Usa i software fallback quando possibile + + + + General + Generale + + + + Behavior + Comportamento + + + Seeking + Spostamento cursore + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + Spostamento cursore accurato +Mostra sempre il fotogramma corretto (il video potrebbe bloccarsi brevemente per caricare il fotogramma) + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + Spostamento veloce del cursore +Sposta velocemente il cursore (potrebbe mostrare fotogrammi non perfettamente accurati durante lo spostamento - non interessa la riproduzione/esportazione) + + + + Memory Usage + Uso della memoria + + + + Upcoming Frame Queue: + Fotogrammi seguenti in coda: + + + + + frames + fotogrammi + + + + + seconds + secondi + + + + Previous Frame Queue: + Fotogrammi precedenti in coda: + + + + Playback + Riproduzione + + + + Output Device: + Dispositivo d'uscita: + + + + + Default + Predefinito + + + + Input Device: + Dispositivo d'ingresso: + + + + Sample Rate: + Frequenza di campionamento: + + + + Audio + Audio + + + + Search for action or shortcut + Cerca un'azione o una scorciatoia + + + + Action + Azione + + + + Shortcut + Scorciatoia + + + + Import + Importa + + + + Export + Esporta + + + + Reset Selected + Reimposta quelle selezionate + + + + Reset All + Reimposta tutto + + + + Keyboard + Tastiera + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + Impossibile trovare stream audio/video validi + + + + Could not open file - %1 + Impossibile aprire il file - %1 + + + + Could not find stream information - %1 + Impossibile trovare le informazioni sullo stream - %1 + + + + Project + + + New + Nuovo + + + + Open Project + Apri progetto + + + + Save Project + Salva progetto + + + + Undo + Annulla + + + + Redo + Rifai + + + + Tree View + Vista ad albero + + + + Icon View + Vista ad icone + + + + List View + Vista a lista + + + + Search media, markers, etc. + Cerca media, marcatori, ecc. + + + + Project + Progetto + + + + Sequence + Sequenza + + + + Replace '%1' + Rimpiazza "%1" + + + + + All Files + Tutti i file + + + + + No active sequence + Nessuna sequenza attiva + + + + No sequence is active, please open the sequence you want to replace clips from. + Nessuna sequenza attiva, si prega di aprire quella da cui vuoi rimpiazzare le clip. + + + + Active sequence selected + Sequenza attiva selezionata + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + Non puoi inserire una sequenza dentro sé stessa, in questa sequenza non ci sarebbero clip di questo media. + + + + Rename '%1' + Rinomina "%1" + + + + Enter new name: + Inserisci un nuovo nome: + + + + Delete media in use? + Eliminare il media in uso? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + Il media "%1" è attualmente usato in "%2". Eliminandolo, toglierai tutte le sue istanze dalla sequenza. Sei sicuro di volerlo fare? + + + + Skip + Salta + + + + Import a Project + Importa un progetto + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" è un file di un progetto Olive. Verrà unito a questo progetto. Desideri continuare? + + + + Image sequence detected + Sequenza di immagini rilevata + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + Il file "%1" sembra far parte di una sequenza di immagini. Desideri importarla come tale? + + + + Import media... + Importa media... + + + + No sequence is active, please open the sequence you want to delete clips from. + Nessuna sequenza attiva, si prega di aprire la sequenza da cui vuoi eliminare le clip. + + + + ProxyDialog + + + Create Proxy + Crea clip rappresentativa + + + + Proxy + Clip rappresentativa + + + + Dimensions: + Dimensioni: + + + + Same Size as Source + Stessa dimensione del file originale + + + + Half Resolution (1/2) + Metà della risoluzione (1/2) + + + + Quarter Resolution (1/4) + Un quarto della risoluzione (1/4) + + + + Eighth Resolution (1/8) + Un ottavo della risoluzione (1/8) + + + + Sixteenth Resolution (1/16) + Un sedicesimo della risoluzione (1/16) + + + + Format: + Formato: + + + + ProRes HQ + ProRes HQ + + + + Location: + Posizione: + + + + Same as Source (in "%1" folder) + Stessa del file originale (nella cartella "%1") + + + + Proxy file exists + La clip rappresentativa esiste + + + + The file "%1" already exists. Do you wish to replace it? + Il file "%1" esiste già. Desideri sovrascriverlo? + + + + Custom Location + Posizione personalizzata + + + + ProxyGenerator + + + Finished generating proxy for "%1" + Generazione clip rappresentative di "%1" terminata + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Rimpiazza clip usando "%1" + + + + Select which media you want to replace this media's clips with: + Seleziona quale media vuoi usare per rimpiazzare le clip di questo media: + + + + Keep the same media in-points + Mantieni lo stesso media nei punti + + + + Replace + Rimpiazza + + + + Cancel + Annulla + + + + No media selected + Nessun media selezionato + + + + Please select a media to replace with or click 'Cancel'. + Si prega di selezionare una media per la sostituzione o di cliccare "Annulla". + + + + Same media selected + Stesso media selezionato + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Hai selezionato lo stesso media che stai cercando di rimpiazzare. Si prega di selezionarne un altro o di cliccare "Annulla". + + + + Folder selected + Cartella selezionata + + + + You cannot replace footage with a folder. + Non puoi rimpiazzare un filmato con una cartella. + + + + Active sequence selected + Sequenza attiva selezionata + + + + You cannot insert a sequence into itself. + Non puoi inserire una sequenza dentro sé stessa. + + + + RichTextEffect + + + Text + Testo + + + + Padding + Spaziatura + + + + Position + Posizione + + + + Vertical Align: + Allineamento verticale: + + + + Top + In alto + + + + Center + Al centro + + + + Bottom + In basso + + + + Auto-Scroll + Scorri automaticamente + + + + Off + Disattivato + + + + Up + Verso su + + + + Down + Verso giù + + + + Left + Verso sinistra + + + + Right + Verso destra + + + + Shadow + Ombra + + + + Shadow Color + Colore dell'ombra + + + + Shadow Angle + Angolo dell'ombra + + + + Shadow Distance + Distanza dell'ombra + + + + Shadow Softness + Morbidezza dell'ombra + + + + Shadow Opacity + Opacità dell'ombra + + + + Sequence + + + %1 (copy) + %1 (copia) + + + + ShakeEffect + + + Intensity + Intensità + + + + Rotation + Rotazione + + + + Frequency + Frequenza + + + + SolidEffect + + + Type + Tipo + + + + Solid Color + Colore a tinta unita + + + + SMPTE Bars + Barre SMPTE + + + + Checkerboard + A scacchi + + + + Opacity + Opacità + + + + Color + Colore + + + + Checkerboard Size + Dimensione scacchiera + + + + SourcesCommon + + + Import... + Importa... + + + + New + Nuovo + + + + View + Visualizza + + + + Tree View + Vista ad albero + + + + Icon View + Vista ad icone + + + + Show Toolbar + Mostra barra degli strumenti + + + + Show Sequences + Mostra sequenza + + + + Replace/Relink Media + Rimpiazza/ricollega media + + + + Reveal in Explorer + Mostra in Esplora risorse + + + + Reveal in Finder + Mostra in Finder + + + + Reveal in File Manager + Mostra nel gestore file + + + + Replace Clips Using This Media + Rimpiazza clip usando questo media + + + + Create Sequence With This Media + Crea sequenza con questo media + + + + Duplicate + Duplica + + + + Delete All Clips Using This Media + Elimina tutte le clip che usano questo media + + + + Proxy + Clip rappresentativa + + + + Generating proxy: %1% complete + Generazione clip rappresentative: %1% completo + + + + Create/Modify Proxy + Crea/modifica clip rappresentativa + + + + Create Proxy + Crea clip rappresentativa + + + + Modify Proxy + Modifica clip rappresentativa + + + + Restore Original + Ripristina l'originale + + + + Delete + Elimina + + + + Preview in Media Viewer + Anteprima nel Visualizzatore media + + + + Properties... + Proprietà... + + + + Replace Media + Rimpiazza media + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Hai rilasciato un file dentro "%1". Desideri rimpiazzarlo con quello rilasciato? + + + + Delete proxy + Elimina clip rappresentativa + + + + Would you like to delete the proxy file "%1" as well? + Desideri eliminare anche il file della clip rappresentativa "%1"? + + + + SpeedDialog + + + Speed/Duration + Velocità/durata + + + + Speed: + Velocità: + + + + Frame Rate: + Velocità fotogrammi: + + + + Duration: + Durata: + + + + Reverse + In senso inverso + + + + Maintain Audio Pitch + Mantieni la tonalità dell'audio + + + + Ripple Changes + Sposta clip successive a catena + + + + TextEditDialog + + + Edit Text + Modifica testo + + + + Thin + Sottile + + + + Extra Light + Molto leggero + + + + Light + Leggero + + + + Normal + Normale + + + + Medium + Medio + + + + Demi Bold + Grassetto corsivo + + + + Bold + Grassetto + + + + Extra Bold + Grassetto più spesso + + + + Black + Nero + + + + TextEditEx + + + Edit Text + Modifica testo + + + + &Edit Text + Modifica t&esto + + + + TextEffect + + + Text + Testo + + + + Font + Carattere + + + + Size + Dimensione + + + + Color + Colore + + + + Alignment + Allineamento + + + + Left + A sinistra + + + + + Center + Al centro + + + + Right + A destra + + + + Justify + Giustifica + + + + Top + In alto + + + + Bottom + In basso + + + + Word Wrap + A capo automatico + + + + Padding + Spaziatura + + + + Position + Posizione + + + + Outline + Bordo + + + + Outline Color + Colore bordo + + + + Outline Width + Larghezza bordo + + + + Shadow + Ombra + + + + Shadow Color + Colore dell'ombra + + + + Shadow Angle + Angolo dell'ombra + + + + Shadow Distance + Distanza dell'ombra + + + + Shadow Softness + Morbidezza dell'ombra + + + + Shadow Opacity + Opacità dell'ombra + + + + Sample Text + Testo di esempio + + + &Edit Text + Modifica t&esto + + + + TimecodeEffect + + + Timecode + Codice temporale + + + + Sequence + Sequenza + + + + Media + Media + + + + Scale + Scala + + + + Color + Colore + + + + Background Color + Colore di sfondo + + + + Background Opacity + Opacità dello sfondo + + + + Offset + Traslazione + + + + Prepend + Aggiungi all'inizio + + + + Timeline + + + Timeline: + Linea temporale: + + + + Nested Sequence + Sequenza annidata + + + + Effect already exists + L'effetto esiste già + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + La clip "%1" contiene già un effetto "%2". Vuoi rimpiazzarlo con quello incollato oppure aggiungerlo come effetto separato? + + + + Add + Aggiungi + + + + Replace + Rimpiazza + + + + Skip + Salta + + + + Do this for all conflicts found + Ripeti per ogni conflitto trovato + + + + Title... + Titolo... + + + + Solid Color... + Colore a tinta unita... + + + + Bars... + Barre... + + + + Tone... + Suono... + + + + Noise... + Rumore... + + + + Unsaved Project + Progetto non salvato + + + + You must save this project before you can record audio in it. + Devi salvare il progetto prima di poterci registrare dell'audio. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Fa' clic sulla linea temporale nel punto in cui vuoi iniziare la registrazione (trascina per limitare la registrazione in una certa finestra) + + + + (none) + (nessuno) + + + + Pointer Tool + Strumento puntatore + + + + Edit Tool + Strumento di modifica + + + + Ripple Tool + Su premier è tradotto come -strumento montaggio con scarto-. Valutare quale usare + Strumento ridimensiona a catena + + + + Razor Tool + Strumento di taglio + + + + Slip Tool + Strumento di scivolamento + + + + Slide Tool + Strumento di scorrimento + + + + Hand Tool + Strumento mano + + + + Transition Tool + Strumento transizione + + + + Snapping + Bordi magnetici + + + + Zoom In + Ingrandisci + + + + Zoom Out + Rimpicciolisci + + + + Record audio + Registra audio + + + + Add title, solid, bars, etc. + Aggiungi titolo, colori, barre ecc. + + + + TimelineHeader + + + Center Timecodes + Centra codici temporali + + + + TimelineWidget + + + &Undo + Ann&ulla + + + + &Redo + &Rifai + + + C&ut + &Taglia + + + Cop&y + &Copia + + + &Paste + &Incolla + + + R&ipple Delete + El&imina a catena + + + + Sequence Settings + Impostazioni sequenza + + + + &Speed/Duration + &Velocità/durata + + + Auto-s&cale + S&cala automaticamente + + + + &Reveal in Project + Most&ra nel progetto + + + R&ename + &Rinomina + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Inizio: %2 +Fine: %3 +Durata: %4 + + + Rename '%1' + Rinomina '%1' + + + Rename multiple clips + Rinomina più clip + + + Enter a new name for this clip: + Inserisci un nuovo nome per questa clip: + + + + R&ipple Delete Empty Space + El&imina spazio vuoto a catena + + + + Auto-Cut Silence + Taglio automatico del silenzio + + + + Auto-S&cale + S&cala automaticamente + + + + Properties + Proprietà + + + + Error + Errore + + + + Couldn't locate media wrapper for sequence. + Impossibile trovare contenitore media per la sequenza. + + + + Title + Titolo + + + + Solid Color + Colore a tinta unita + + + + Bars + Barre + + + + Tone + Suono + + + + Noise + Rumore + + + + Duration: + Durata: + + + + ToneEffect + + + Type + Tipo + + + + Sine + Seno + + + + Frequency + Frequenza + + + + Amount + Ammontare + + + + Mix + Miscela + + + + TransformEffect + + + Position + Posizione + + + + Scale + Scalatura + + + + Uniform Scale + Mantieni proporzioni + + + + Rotation + Rotazione + + + + Anchor Point + Punto di ancoraggio + + + + Opacity + Opacità + + + + Blend Mode + Modalità miscela + + + + Normal + Normale + + + Darken + Scurisci + + + Multiply + Moltiplica + + + Color Burn + Brucia colore + + + Lighten + Illumina + + + Screen + Scherma + + + Color Dodge + Scherma colore + + + Overlay + Sovrapponi + + + Soft Light + Luce leggera + + + Hard Light + Luce forte + + + Difference + Differenza + + + Exclusion + Esclusione + + + + Transition + + + Length + Lunghezza + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + È disponibile un aggiornamento sul sito di Olive. Visita www.olivevideoeditor.org per scaricarlo. + + + + VSTHost + + + + Error loading VST plugin + Errore nel caricamento del plugin VST + + + Failed to create VST reference + Errore nella creazione del riferimento VST + + + + Failed to load VST plugin "%1": %2 + Impossibile caricare il plugin VST "%1": %2 + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + NOTA: Non si possono caricare plugin VST a 32 bit in una versione a 64 bit di Olive. Si prega di trovare la versione a 64 bit di questo plugin oppure di passare alla versione 32 bit di Olive. + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + NOTA: Non si possono caricare plugin VST a 64 bit in una versione a 32 bit di Olive. Si prega di trovare la versione a 32 bit di questo plugin oppure di passare alla versione 64 bit di Olive. + + + + Failed to locate entry point for dynamic library. + Impossibile trovare punto d'ingresso per la libreria dinamica. + + + + VST Error + Errore VST + + + + Plugin's magic number is invalid + Il magic number del plugin non è valido + + + + Plugin + Plugin + + + + Interface + Interfaccia + + + + Show + Mostra + + + + VST Plugin + Plugin VST + + + + Viewer + + + Sequence Viewer + Visualizzatore sequenza + + + + Media Viewer + Visualizzatore media + + + + (none) + (nessuno) + + + + Drag video only + Sposta solamente il video + + + + Drag audio only + Sposta solamente l'audio + + + + ViewerWidget + + + Save Frame as Image... + Salva fotogramma come immagine... + + + + Show Fullscreen + Mostra a schermo intero + + + + Disable + Disattiva + + + + Screen %1: %2x%3 + Schermo %1: %2x%3 + + + + Zoom + Ingrandimento + + + + Fit + Adatta + + + + Custom + Personalizzato + + + + Close Media + Chiudi media + + + + Save Frame + Salva fotogramma + + + + Viewer Zoom + Ingrandimento visualizzatore + + + + Set Custom Zoom Value: + Imposta un valore di ingrandimento personalizzato: + + + + ViewerWindow + + + Exit Fullscreen + Esci dalla modalità a schermo intero + + + + VoidEffect + + + (unknown) + (sconosciuto) + + + + Missing Effect + Effetto mancante + + + + VolumeEffect + + + Volume + Volume + + + + transition + + + Invalid transition + Transizione non valida + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + Nessun candidato per la transizione "%1". Questa transizione potrebbe essere danneggiata. Prova a reinstallare la transizione o Olive. + + + diff --git a/app/ts/pt_BR.ts b/app/ts/pt_BR.ts new file mode 100644 index 000000000..0b7661ae6 --- /dev/null +++ b/app/ts/pt_BR.ts @@ -0,0 +1,4198 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive é um editor de vídeos não-linear. Este software é livre e protegido pela licença GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + A equipe do Olive informa que o código-fonte está disponível no site do projeto. + + + + ActionSearch + + + Search for action... + Pesquisar ação... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Configurações avançadas de vídeo + + + + Pixel Format: + Formato de pixel: + + + + Threads: + Threads: + + + + Audio + + + %1 Audio + Áudio %1 + + + + Recording %1 + Gravando %1 + + + + AudioNoiseEffect + + + Amount + Quantidade + + + + Mix + Mixar + + + + Noise + Ruído + + + + Generate audio noise that can be mixed with this clip. + Cria um ruído de áudio que pode ser mixado com este clipe. + + + + AutoCutSilenceDialog + + + Cut Silence + Cortar silêncio + + + + Attack Threshold: + Limiar de ataque: + + + + Attack Time: + Tempo de ataque: + + + + Release Threshold: + Limiar de liberação: + + + + Release Time: + Tempo de liberação: + + + + Cacher + + + + Could not open %1 - %2 + Não foi possível abrir %1 - %2 + + + + ChannelLayoutName + + + Invalid + Inválido + + + + Mono + Mono + + + + Stereo + Estéreo + + + + ClipPropertiesDialog + + + "%1" Properties + Propriedades "%1" + + + + Multiple Clip Properties + Propriedades de vários clipes + + + + Name: + Nome: + + + + Duration: + Duração: + + + + (multiple) + (vários) + + + + CollapsibleWidget + + + <untitled> + <sem título> + + + + ColorButton + + + Set Color + Definir cor + + + + CornerPinEffect + + + Top Left + Acima à esquerda + + + + Top Right + Acima à direita + + + + Bottom Left + Abaixo à esquerda + + + + Bottom Right + Abaixo à direita + + + + Perspective + Perspectiva + + + + Corner Pin + Posicionar borda + + + + Distort + Distorcer + + + + Distort/warp this clip by pinning each of its four corners. + Distorce este clipe reposicionando cada um dos seus quatro cantos. + + + + CrashDialog + + + We're very sorry, Olive has crashed. Please send the following data to developers: + Desculpa, o Olive acabou de travar. Por favor, envie os dados a seguir aos desenvolvedores: + + + + CrossDissolveTransition + + + Cross Dissolve + Dissolver cruzado + + + + Dissolves + Dissolver + + + + Dissolve clips evenly. + Dissolve clipes uniformemente. + + + + DebugDialog + + + Debug Log + Log de depuração + + + + DemoNotice + + + + Welcome to Olive! + Bem-vindo ao Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive é um editor de vídeos com licença GNU GPL. Se você pagou por este software, então foi vítima de um golpe. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Este programa está em fase ALFA, o que significa que ele é instável e pode travar, ter defeitos e não ter vários recursos. Não oferecemos garantia, então use por sua conta e risco. Pedimos que avise sobre falhas ou sugestões no endereço %1 + + + + Thank you for trying Olive and we hope you enjoy it! + Obrigado por utilizar o Olive. Esperamos que você aproveite! + + + + EffectControls + + + (none) + (nenhum) + + + + Effects: + Efeitos: + + + + Add Video Effect + Adicionar efeito de vídeo + + + + VIDEO EFFECTS + EFEITOS DE VÍDEO + + + + Add Video Transition + Adicionar transição de vídeo + + + + Add Audio Effect + Adicionar efeito de áudio + + + + AUDIO EFFECTS + EFEITOS DE ÁUDIO + + + + Add Audio Transition + Adicionar transição de áudio + + + + EffectUI + + + %1 (Opening) + %1 (Abrindo) + + + + %1 (Closing) + %1 (Fechando) + + + + %1 (multiple) + %1 (vários) + + + + Cu&t + C&ortar + + + + &Copy + &Copiar + + + + Move &Up + Mover para c&ima + + + + Move &Down + Mover para &baixo + + + + D&elete + &Excluir + + + + Load Settings From File + Carregar configurações do arquivo + + + + Save Settings to File + Salvar configurações para o arquivo + + + + EmbeddedFileChooser + + + File: + Arquivo: + + + + ExponentialFadeTransition + + + Exponential Fade + Atenuação exponencial + + + + An exponential audio fade that starts slow and ends fast. + Uma atenuação de áudio exponencial que começa lenta e termina rapidamente. + + + + ExportDialog + + + Export "%1" + Exportar "%1" + + + + Unknown codec name %1 + Nome de codec desconhecido %1 + + + + Export Failed + Exportação falhou + + + + Export failed - %1 + A exportação falhou - %1 + + + + Invalid dimensions + Dimensões inválidas + + + + Export width and height must both be even numbers/divisible by 2. + A largura e altura de exportação devem ser números pares/divisíveis por 2. + + + + Invalid codec + Codec inválido + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Não foi possível determinar os parâmetros de saída para o codec selecionado. Isso é um bug, favor avisar os desenvolvedores. + + + + Invalid format + Formato inválido + + + + Couldn't determine output format. This is a bug, please contact the developers. + Não foi possível determinar o formato de saída. Isso é um bug, favor avisar os desenvolvedores. + + + + Export Media + Exportar mídia + + + + %p% (Total: %1:%2:%3) + %p% (Total: %1:%2:%3) + + + + %p% (ETA: %1:%2:%3) + %p% (Tempo estimado: %1:%2:%3) + + + + Quality-based (Constant Rate Factor) + Baseado na qualidade (Fator de taxa constante/CRF) + + + + Constant Bitrate + Taxa de bits constante + + + + + Invalid Codec + Codec inválido + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Não foi possível encontrar um codificador adequado para este codec. A exportação provavelmente falhará. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Não foi possível encontrar o formato de pixel para este codificador. A exportação provavelmente falhará. + + + + Bitrate (Mbps): + Taxa de bits (Mbps): + + + + Quality (CRF): + Qualidade (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Fator de qualidade: + +0 = sem perdas +17-18 = visualmente sem perdas (comprimido, porém imperceptível) +23 = alta qualidade +51 = menor qualidade possível + + + + Target File Size (MB): + Tamanho do arquivo alvo (MB): + + + + Format: + Formato: + + + + Range: + Intervalo: + + + + Entire Sequence + Sequência inteira + + + + In to Out + Faixa de entrada/saída + + + + Video + Vídeo + + + + + Codec: + Codec: + + + + Width: + Largura: + + + + Height: + Altura: + + + + Frame Rate: + Taxa de quadros: + + + + Compression Type: + Tipo de compressão: + + + + Advanced + Avançado + + + + Audio + Áudio + + + + Sampling Rate: + Taxa de amostragem: + + + + Bitrate (Kbps/CBR): + Taxa de bits (Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + falha ao enviar quadro para o codificador (%1) + + + + failed to receive packet from encoder (%1) + falha ao receber pacote do codificador (%1) + + + + could not video encoder for %1 + não foi possível localizar o codificador de vídeo para %1 + + + + could not allocate video stream + não foi possível alocar o fluxo de vídeo + + + + could not allocate video encoding context + não foi possível alocar o contexto de codificação de vídeo + + + + could not open output video encoder (%1) + não foi possível abrir o codificador de vídeo de saída (%1) + + + + could not copy video encoder parameters to output stream (%1) + não foi possível copiar os parâmetros de codificação de vídeo para o fluxo de saída (%1) + + + + could not audio encoder for %1 + não foi possível localizar o codificador de áudio para %1 + + + + could not allocate audio stream + não foi possível alocar fluxo de áudio + + + + could not allocate audio encoding context + não foi possível alocar o contexto de codificação de áudio + + + + could not open output audio encoder (%1) + não foi possível abrir o codificador de áudio de saída (%1) + + + + could not copy audio encoder parameters to output stream (%1) + não foi possível copiar os parâmetros de codificação de áudio para o fluxo de saída (%1) + + + + could not allocate audio buffer (%1) + não foi possível alocar o buffer de áudio (%1) + + + + could not create output format context + não foi possível criar o contexto do formato de saída + + + + could not open output file (%1) + não foi possível abrir o arquivo de saída (%1) + + + + could not write output file header (%1) + não foi possível escrever o cabeçalho do arquivo de saída (%1) + + + + could not write output file trailer (%1) + não foi possível escrever o rodapé do arquivo de saída (%1) + + + + FillLeftRightEffect + + + Type + Tipo + + + + Fill Left with Right + Preencher esquerdo com o direito + + + + Fill Right with Left + Preencher direito com o esquerdo + + + + Fill Left/Right + Preencher esquerdo/direito + + + + Replaces either the left or right channel with the other + Substitui o canal esquerdo ou direito com o outro + + + + Frei0rEffect + + + Error loading Frei0r plugin + Erro ao carregar o plugin Frei0r + + + + Failed to load Frei0r plugin "%1": %2 + Falha ao carregar o plugin Frei0r %1: %2 + + + + GraphEditor + + + Graph Editor + Editor gráfico + + + + Linear + Linear + + + + Bezier + Bézier + + + + Hold + Constante + + + + GraphView + + + Zoom to Selection + Zoom para a seleção + + + + Zoom to Show All + Zoom para mostrar tudo + + + + Reset View + Redefinir visão + + + + InterlacingName + + + None (Progressive) + Nenhum (Progressivo) + + + + Upper Field First + Campo superior primeiro + + + + Lower Field First + Campo inferior primeiro + + + + Invalid + Inválido + + + + KeyframeNavigator + + + Enable Keyframes + Habilitar quadros-chave + + + + KeyframeView + + + Linear + Linear + + + + Bezier + Bézier + + + + Hold + Constante + + + + LabelSlider + + + &Edit + &Editar + + + + &Reset to Default + &Restaurar ao padrão + + + + + Set Value + Definir valor + + + + + New value: + Novo valor: + + + + LinearFadeTransition + + + Linear Fade + Atenuação linear + + + + An linear audio fade that fades evenly at a constant rate. + Uma atenuação de áudio linear que diminui de forma constante. + + + + LoadDialog + + + Loading... + Carregando... + + + + Loading '%1'... + Carregando '%1'... + + + + Cancel + Cancelar + + + + LoadThread + + + Version Mismatch + Versões diferentes + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Este projeto foi salvo numa versão diferente do Olive e pode não ser totalmente compatível com esta versão. Você deseja carregá-lo mesmo assim? + + + + %1 - Line: %2 Col: %3 + %1 - Linha: %2 Col: %3 + + + + User aborted loading + Abertura cancelada pelo usuário + + + + XML Parsing Error + Erro na análise do XML + + + + Couldn't load '%1'. %2 + Não foi possível carregar '%1'. %2 + + + + Project Load Error + Erro ao carregar projeto + + + + Error loading project: %1 + Não foi possível carregar o projeto: %1 + + + + LogarithmicFadeTransition + + + Logarithmic Fade + Atenuação logarítmica + + + + An logarithmic audio fade that starts fast and ends slow. + Uma atenuação de áudio logarítmica que inicia rápida e termina lentamente. + + + + MainWindow + + + OpenColorIO Config Error + Erro na configuração do OpenColorIO + + + + Failed to set OpenColorIO configuration: %1 + Falha ao definir a configuração do OpenColorIO: %1 + + + + Welcome to %1 + Bem-vindo ao %1 + + + + &File + &Arquivo + + + + &New + &Novo + + + + &Open Project + &Abrir projeto + + + + Clear Recent List + Limpar lista + + + + Open Recent + Abrir recente + + + + &Save Project + &Salvar projeto + + + + Save Project &As + Salvar projeto &como + + + + &Import... + &Importar... + + + + &Export... + &Exportar... + + + + E&xit + Sai&r + + + + &Edit + &Editar + + + + &Undo + &Desfazer + + + + Redo + Refazer + + + + Select &All + Selecionar &tudo + + + + Deselect All + Desmarcar + + + + Ripple to In Point + Ajustar em cadeia à esquerda + + + + Ripple to Out Point + Ajustar em cadeia à direita + + + + Edit to In Point + Modificar à esquerda + + + + Edit to Out Point + Modificar à direita + + + + Delete In/Out Point + Excluir faixa de entrada/saída + + + + Ripple Delete In/Out Point + Excluir faixa de entrada/saída em cadeia + + + + Set/Edit Marker + Definir/editar marcador + + + + &View + E&xibir + + + + Zoom In + Aumentar zoom + + + + Zoom Out + Diminuir zoom + + + + Increase Track Height + Aumentar altura da faixa + + + + Decrease Track Height + Diminuir altura da faixa + + + + Toggle Show All + Mostrar toda a sequência + + + + Rectified Waveforms + Formas de onda retificadas + + + + Frames + Quadros + + + + Drop Frame + Código de tempo (com descarte de quadro) + + + + Non-Drop Frame + Código de tempo (sem descarte de quadro) + + + + Milliseconds + Milissegundos + + + + Title/Action Safe Area + Área segura de título/ação + + + + Off + Desativado + + + + Default + Padrão + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + Personalizado + + + + Full Screen + Tela cheia + + + + Full Screen Viewer + Visualizador de tela cheia + + + + &Playback + &Reprodução + + + + Go to Start + Ir ao início + + + + Previous Frame + Quadro anterior + + + + Play/Pause + Reproduzir/pausar + + + + Play In to Out + Reproduzir na faixa de entrada/saída + + + + Next Frame + Próximo quadro + + + + Go to End + Ir ao final + + + + Go to Previous Cut + Ir ao corte anterior + + + + Go to Next Cut + Ir ao próximo corte + + + + Go to In Point + Ir ao ponto de entrada + + + + Go to Out Point + Ir ao ponto de saída + + + + Shuttle Left + Avançar reprodução pela esquerda + + + + Shuttle Stop + Parar reprodução + + + + Shuttle Right + Avançar reprodução pela direita + + + + Loop + Repetir + + + + &Window + &Janela + + + + Project + Projeto + + + + Effect Controls + Controle de efeitos + + + + Timeline + Linha do tempo + + + + Graph Editor + Editor gráfico + + + + Node Editor + Editor de nós + + + + Media Viewer + Visualizador de mídia + + + + Sequence Viewer + Visualizador de sequência + + + + Maximize Panel + Maximizar painel + + + + Lock Panels + Travar painéis + + + + Reset to Default Layout + Restaurar leiaute padrão + + + + &Tools + &Ferramentas + + + + Pointer Tool + Ferramenta Ponteiro + + + + Edit Tool + Ferramenta Modificar + + + + Ripple Tool + Ferramenta Ajustar em cadeia + + + + Razor Tool + Ferramenta Fatiar + + + + Slip Tool + Ferramenta Escorregar + + + + Slide Tool + Ferramenta Deslizar + + + + Hand Tool + Ferramenta Mão + + + + Transition Tool + Ferramenta Transição + + + + Enable Snapping + Ativar encaixe + + + + Auto-Cut Silence + Cortar silêncio automaticamente + + + + No Auto-Scroll + Sem rolagem automática + + + + Page Auto-Scroll + Rolagem por página + + + + Smooth Auto-Scroll + Rolagem suave + + + + Preferences + Preferências + + + + Clear Undo + Limpar histórico do desfazer + + + + &Help + Aj&uda + + + + A&ction Search + &Pesquisar ação + + + + Debug Log + Log de depuração + + + + &About... + &Sobre... + + + + <untitled> + <sem título> + + + + Marker + + + + Set Marker + Definir marcador + + + + Set clip marker name: + Defina o nome do marcador do clipe: + + + + Set sequence marker name: + Defina o nome do marcador da sequência: + + + + Media + + + New Folder + Nova pasta + + + + Name: + Nome: + + + + Filename: + Nome do arquivo: + + + + Video Dimensions: + Dimensões do vídeo: + + + + Frame Rate: + Taxa de quadros: + + + + %1 field(s) (%2 frame(s)) + %1 campo(s) (%2 quadro(s)) + + + + Interlacing: + Entrelaçamento: + + + + Audio Frequency: + Frequência de áudio: + + + + Audio Channels: + Canais de áudio: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Nome: %1 +Dimensões do vídeo: %2x%3 +Taxa de quadros: %4 +Frequência de áudio: %5 +Layout do áudio: %6 + + + + Name + Nome + + + + Duration + Duração + + + + Rate + Taxa + + + + MediaPropertiesDialog + + + "%1" Properties + Propriedades "%1" + + + + Tracks: + Faixas: + + + + Video %1: %2x%3 %4FPS + Vídeo %1: %2x%3 %4QPS + + + + Audio %1: %2Hz %3 + Áudio %1: %2Hz %3 + + + + %n channel(s) + + Canais: %n + + + + + + Conform to Frame Rate: + Ajustar taxa de quadros: + + + + Alpha is Premultiplied + Canal alfa é pré-multiplicado + + + + Auto (%1) + Automático (%1) + + + + Interlacing: + Entrelaçamento: + + + + Color Space: + Espaço de cor: + + + + Name: + Nome: + + + + MenuHelper + + + &Project + &Projeto + + + + &Sequence + &Sequência + + + + &Folder + P&asta + + + + Set In Point + Definir ponto de entrada + + + + Set Out Point + Definir ponto de saída + + + + Reset In Point + Redefinir ponto de entrada + + + + Reset Out Point + Redefinir ponto de saída + + + + Clear In/Out Point + Limpar pontos de entrada/saída + + + + Add Default Transition + Adicionar transição padrão + + + + Link/Unlink + Vincular/desvincular + + + + Enable/Disable + Ativar/desativar + + + + Nest + Aninhar + + + + Cu&t + &Recortar + + + + Cop&y + &Copiar + + + + + &Paste + C&olar + + + + Paste Insert + Colar e inserir + + + + Duplicate + Duplicar + + + + Delete + Excluir + + + + Ripple Delete + Excluir em cadeia + + + + Split + Dividir + + + + Invalid aspect ratio + Taxa de proporção inválida + + + + The aspect ratio '%1' is invalid. Please try again. + A proporção de tela '%1' é inválida. Por favor, tente novamente. + + + + Enter custom aspect ratio + Informe a proporção de tela personalizada + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Informe a proporção de tela para utilizar na área segura (ex.: 16:9): + + + + NewSequenceDialog + + + Editing "%1" + Editando "%1" + + + + New Sequence + Nova sequência + + + + Preset: + Predefinição: + + + + Film 4K + Filme 4K + + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + Personalizado + + + + Video + Vídeo + + + + Width: + Largura: + + + + Height: + Altura: + + + + Frame Rate: + Taxa de quadros: + + + + Pixel Aspect Ratio: + Taxa de proporção do pixel: + + + + Square Pixels (1.0) + Pixels quadrados (1.0) + + + + Interlacing: + Entrelaçamento: + + + + None (Progressive) + Nenhum (Progressivo) + + + + Audio + Áudio + + + + Sample Rate: + Taxa de amostragem: + + + + Name: + Nome: + + + + Node + + + Node + + + + + NodeEditor + + + Node Editor + Editor de nós + + + + NodeIO + + + Disable Keyframes + Desativar quadros-chave + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Desativar os quadros-chave apagará todos os quadros-chave atuais. Tem certeza que deseja fazer isso? + + + + NodeImageOutput + + + Texture + Textura + + + + Image Output + Saída de imagem + + + + Outputs + Saídas + + + + Used for outputting images outside of the node graph. + Usado para enviar imagens para fora do gráfico de nós. + + + + NodeMedia + + + Matrix + Matriz + + + + Texture + Textura + + + + Media + Mídia + + + + Inputs + Entradas + + + + Retrieve frames from a media source. + Recuperar quadros de uma fonte de mídia. + + + + NodeView + + + Node Editor + Editor de nós + + + + OldEffectNode + + + Save Effect Settings + Salvar configurações de efeitos + + + + + Effect XML Settings %1 + Configurações do efeito XML %1 + + + + Save Settings Failed + Falha ao salvar as configurações + + + + Failed to open "%1" for writing. + Falha ao abrir "%1" para escrita. + + + + Load Effect Settings + Carregar configurações de efeitos + + + + + Load Settings Failed + Falha ao carregar as configurações + + + + Failed to open "%1" for reading. + Falha ao abrir "%1" para leitura. + + + + This settings file doesn't match this effect. + Este arquivo de configurações não corresponde a este efeito. + + + + OliveGlobal + + + Olive Project %1 + Projeto do Olive %1 + + + + Auto-recovery + Recuperação automática + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + O Olive não fechou corretamente e localizou um arquivo de recuperação automática. Você deseja abrí-lo? + + + + Effect already exists + O efeito já existe + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + O clipe '%1' já contém o efeito '%2'. Você deseja substituí-lo ou adicioná-lo como um efeito separado? + + + + Add + Adicionar + + + + Replace + Substituir + + + + Skip + Ignorar + + + + Do this for all conflicts found + Faça isso para todos os conflitos encontrados + + + + Open Project... + Abrir projeto... + + + + Missing recent project + Projeto recente não encontrado + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + O projeto '%1' não existe mais. Deseja removê-lo da lista de projetos recentes? + + + + Save Project As... + Salvar projeto como... + + + + Unsaved Project + Projeto não salvo + + + + This project has changed since it was last saved. Would you like to save it before closing? + O projeto mudou desde que foi salvo pela última vez. Você deseja salvá-lo antes de fechar? + + + + Import media... + Importar mídia... + + + + All Files + Todos os arquivos + + + + Missing Project File + Arquivo de projeto ausente + + + + Specified project '%1' does not exist. + O projeto especificado '%1' não existe. + + + + No active sequence + Não há sequência ativa + + + + Please open the sequence to perform this action. + Por favor, abra uma sequência para executar esta ação. + + + + No clips selected + Não há clipe selecionado + + + + Select the clips you wish to auto-cut + Selecione os clipes que você deseja cortar automaticamente + + + + PanEffect + + + + Pan + Balanço + + + + Modifying the panning on a stereo audio clip. + Modificar o baçanço em um clipe de áudio estéreo. + + + + PreferencesDialog + + + Preferences + Preferências + + + + Default Sequence + Sequência padrão + + + + (None) + (nenhum) + + + + OpenColorIO Config Error + Erro na configuração do OpenColorIO + + + + Failed to set OpenColorIO configuration: %1 + Falha ao definor configuração do OpenColorIO: %1 + + + + Invalid CSS File + Arquivo CSS inválido + + + + CSS file '%1' does not exist. + Arquivo CSS '%1' não existe. + + + + Invalid OpenColorIO Configuration File + Arquivo de configuração do OpenColorIO inválido + + + + You must specify an OpenColorIO configuration file if color management is enabled. + Você deve especificar um arquivo de configuração do OpenColorIO caso o gerenciamento de cores esteja ativo. + + + + OpenColorIO configuration file '%1' does not exist. + O arquivo de configuração do OpenColorIO '%1' não existe. + + + + Confirm Reset All Shortcuts + Confirmar a redefinição de todos os atalhos + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Você deseja redefinir os atalhos de teclado para seus padrões? + + + + Import Keyboard Shortcuts + Importar atalhos de teclado + + + + + Error saving shortcuts + Erro ao salvar atalhos + + + + Failed to open file for reading + Falha ao abrir arquivo para leitura + + + + Export Keyboard Shortcuts + Exportar atalhos de teclado + + + + Export Shortcuts + Exportar atalhos + + + + Shortcuts exported successfully + Atalhos exportados com sucesso + + + + Failed to open file for writing + Falha ao abrir arquivo para escrita + + + + Browse for CSS file + Localizar arquivo CSS + + + + Browse for OpenColorIO configuration + Localizar arquivo de configuração do OpenColorIO + + + + Delete All Previews + Excluir todas as previsualizações + + + + Are you sure you want to delete all previews? + Você deseja excluir todas as previsualizações? + + + + Previews Deleted + Previsualizações apagadas + + + + All previews deleted successfully. You may have to re-open your current project for changes to take effect. + Todas as previsualizações foram excluídas com sucesso. Talvez seja necessário reabrir o projeto para que as alterações façam efeito. + + + + Language: + Idioma: + + + + Image sequence formats: + Formatos de sequência de imagem: + + + + Thumbnail Resolution: + Resolução da miniatura: + + + + Waveform Resolution: + Resolução da forma de onda: + + + + Delete Previews + Excluir previsualizações + + + + Use Software Fallbacks When Possible + Usar recursos de software quando possível + + + + Don't Use Proxies When Exporting + Não usar proxies ao exportar + + + + Use originals instead of proxies when exporting + Usar originais em vez de proxies ao exportar + + + + Default Sequence Settings + Configurações da sequência padrão + + + + General + Geral + + + + Behavior + Comportamento + + + + Add Default Effects to New Clips + Adicionar efeitos padrão para novos clipes + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + Mover o cursor para o início quando reproduzir no final da sequência + + + + Selecting Also Seeks + Selecionar também move o cursor + + + + Edit Tool Also Seeks + Ferramenta Modificar também move o cursor + + + + Edit Tool Selects Links + Ferramenta Modificar seleciona vínculos + + + + Seek Also Selects + Mover o cursor também seleciona + + + + Seek to the End of Pastes + Mover o cursor para o final do trecho colado + + + + Scroll Wheel Zooms + A roda do mouse controla o zoom + + + + Hold CTRL to toggle this setting + Mantenha a tecla CTRL pressionada para mudar esta configuração + + + + Invert Timeline Scroll Axes + Inverter eixos de rolagem na linha do tempo + + + + Enable Drag Files to Timeline + Arrastar arquivos diretamente à linha do tempo + + + + Auto-Scale By Default + Redimensionar automaticamente por padrão + + + + Auto-Seek to Imported Clips + Mover o cursor ao inserir um clipe na linha do tempo + + + + Audio Scrubbing + Reproduzir áudio ao mover o cursor + + + + Drop Files on Media to Replace + Arrastar arquivo sobre a mídia para substituí-la + + + + Enable Hover Focus + Foco segue o ponteiro do mouse + + + + Ask For Name When Setting Marker + Perguntar pelo nome quando definir o marcador + + + + Appearance + Aparência + + + + Theme + Tema + + + + Olive Dark (Default) + Olive Escuro (padrão) + + + + Olive Light + Olive Claro + + + + Native + Nativo + + + + Native (Light Icons) + Nativo (ícones claros) + + + + Use Native Menu Styling + Usar estilo de menu nativo + + + + Custom CSS: + CSS personalizado: + + + + + Browse + Procurar + + + + Effect Textbox Lines: + Linhas no campo de entrada de texto: + + + + Memory Usage + Uso da memória + + + + Upcoming Frame Queue: + Fila de quadros à frente: + + + + + frames + quadros + + + + + seconds + segundos + + + + Previous Frame Queue: + Fila de quadros anteriores: + + + + Playback + Reprodução + + + + Output Device: + Dispositivo de saída: + + + + + Default + Padrão + + + + Input Device: + Dispositivos de entrada: + + + + Sample Rate: + Taxa de amostragem: + + + + Audio Recording: + Gravação de áudio: + + + + Mono + Mono + + + + Stereo + Estéreo + + + + Audio + Áudio + + + + Enable Color Management + Habilitar gerenciamento de cores + + + + OpenColorIO Config File: + Arquivo de configuração do OpenColorIO: + + + + Default Input Color Space: + Espaço de cor de entrada padrão: + + + + Display: + Exibição: + + + + View: + Visualizar: + + + + Look: + Aparência: + + + + Bit Depth + Profundidade de bits + + + + Playback (Offline): + Reprodução (Offline): + + + + Export (Online): + Exportação (Online): + + + + Color Management + Gerenciamento de cores + + + + Search for action or shortcut + Pesquisar ação ou atalho + + + + Action + Ação + + + + Shortcut + Atalho + + + + Import + Importar + + + + Export + Exportar + + + + Reset Selected + Redefinir selecionado + + + + Reset All + Redefinir tudo + + + + Keyboard + Teclado + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + Falha ao encontrar um fluxo válido de áudio/vídeo + + + + Could not open file - %1 + Não foi possível abrir o arquivo - %1 + + + + Could not find stream information - %1 + Não foi possível encontrar informações do fluxo - %1 + + + + Project + + + New + Novo + + + + Open Project + Abrir projeto + + + + Save Project + Salvar projeto + + + + Undo + Desfazer + + + + Redo + Refazer + + + + Tree View + Visão em árvore + + + + Icon View + Visão em ícones + + + + List View + Visão em lista + + + + Search media, markers, etc. + Pesquisar mídia, marcadores, etc. + + + + Project + Projeto + + + + + No active sequence + Nenhuma sequência ativa + + + + No sequence is active, please open the sequence you want to replace clips from. + Nenhuma sequência está ativa. Por favor, abra a sequência na qual você deseja substituir os clipes. + + + + Active sequence selected + Sequência ativa selecionada + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + Você não pode inserir uma sequência dentro dela mesma. Todos os clipes dentro da sequência seriam perdidos. + + + + Rename '%1' + Renomear '%1' + + + + Enter new name: + Digite o novo nome: + + + + Delete media in use? + Excluir mídia em uso? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + A mídia '%1' está sendo usada em '%2'. A exclusão removerá todas as instâncias na sequência. Você deseja fazer isso? + + + + Skip + Ignorar + + + + No sequence is active, please open the sequence you want to delete clips from. + Nenhuma sequência está ativa. Por favor, abra a sequência na qual você deseja excluir os clipes. + + + + ProjectModel + + + Sequence %1 + Sequência %1 + + + + Import a Project + Importar um projeto + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" é um arquivo de projeto do Olive. Ele será mesclado com o seu projeto. Você deseja continuar? + + + + Image sequence detected + Sequência de imagens detectada + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + O arquivo '%1' parece ser parte de uma sequência de imagens. Você deseja importar toda a sequência? + + + + ProxyDialog + + + Create Proxy + Criar proxy + + + + Proxy + Proxy + + + + Dimensions: + Dimensões: + + + + Same Size as Source + Mesmo tamanho da fonte + + + + Half Resolution (1/2) + Metade da resolução (1/2) + + + + Quarter Resolution (1/4) + Um quarto da resolução (1/4) + + + + Eighth Resolution (1/8) + Um oitavo da resolução (1/2) + + + + Sixteenth Resolution (1/16) + Um desesseis-avos da resolução (1/16) + + + + Format: + Formato: + + + + ProRes HQ + ProRes HQ + + + + Location: + Localização: + + + + Same as Source (in "%1" folder) + No mesmo lugar que a fonte (no diretório "%1") + + + + Proxy file exists + Arquivo de proxy existe + + + + The file "%1" already exists. Do you wish to replace it? + O arquivo "%1" já existe. Você deseja substituí-lo? + + + + Custom Location + Escolher a localização + + + + ProxyGenerator + + + Finished generating proxy for "%1" + Terminamos a geração do proxy para "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Substituir clipes usando "%1" + + + + Select which media you want to replace this media's clips with: + Selecione a mídia que deseja usar para substituir: + + + + Keep the same media in-points + Manter os mesmos pontos de entrada da mídia + + + + Replace + Substituir + + + + Cancel + Cancelar + + + + No media selected + Mídia não selecionada + + + + Please select a media to replace with or click 'Cancel'. + Escolha uma mídia para substituir ou clique em 'Cancelar'. + + + + Same media selected + Mesma mídia selecionada + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Você selecionou a mesma mídia que deseja substituir. Escolha outra ou clique em 'Cancelar'. + + + + Folder selected + Pasta selecionada + + + + You cannot replace footage with a folder. + Você não pode substituir a gravação por uma pasta. + + + + Active sequence selected + Sequência ativa selecionada + + + + You cannot insert a sequence into itself. + Você não pode inserir uma sequência para dentro de si. + + + + RichTextEffect + + + Text + Texto + + + + Padding + Espaçamento + + + + Position + Posição + + + + Vertical Align: + Alinhamento vertical: + + + + Top + Em cima + + + + Center + Centro + + + + Bottom + Embaixo + + + + Auto-Scroll + Rolagem automática + + + + Off + Desligado + + + + Up + Para cima + + + + Down + Para baixo + + + + Left + Para a esquerda + + + + Right + Para a direita + + + + Shadow + Sombra + + + + Shadow Color + Cor da sombra + + + + Shadow Angle + Ângulo da sombra + + + + Shadow Distance + Distância da sombra + + + + Shadow Softness + Suavidade da sombra + + + + Shadow Opacity + Opacidade da sombra + + + + Rich Text + Texto formatado + + + + Render + Renderizar + + + + Render formatted rich text over a clip. + Renderiza um texto formatado em cima do clipe. + + + + Sequence + + + %1 (copy) + %1 (cópia) + + + + ShakeEffect + + + Intensity + Intensidade + + + + Rotation + Rotação + + + + Frequency + Frequência + + + + Shake + Tremer + + + + Distort + Distorcer + + + + Simulate a camera shake movement. + Simula o movimento de tremer a câmera. + + + + SolidEffect + + + Type + Tipo + + + + Solid Color + Cor sólida + + + + SMPTE Bars + Barras SMPTE + + + + Checkerboard + Xadrez + + + + Opacity + Opacidade + + + + Color + Cor + + + + Checkerboard Size + Tamanho do quadrado + + + + Solid + Sólido + + + + Render + Renderizar + + + + Render a solid color over this clip. + Renderiza uma cor sólida sobre este clipe. + + + + SourcesCommon + + + Import... + Importar... + + + + New + Novo + + + + View + Exibir + + + + Tree View + Exibição em árvore + + + + Icon View + Exibição em ícones + + + + Show Toolbar + Mostrar barra de tarefas + + + + Show Sequences + Mostrar sequências + + + + Replace/Relink Media + Substituir/revincular mídia + + + + Reveal in Explorer + Mostrar no Explorador de Arquivos + + + + Reveal in Finder + Mostrar no Finder + + + + Reveal in File Manager + Mostrar no gerenciador de arquivos + + + + Replace Clips Using This Media + Substituir clipes usando esta mídia + + + + Create Sequence With This Media + Criar sequência com esta mídia + + + + Duplicate + Duplicar + + + + Delete All Clips Using This Media + Excluir todos os clipes que usam esta mídia + + + + Proxy + Proxy + + + + Generating proxy: %1% complete + Geração de proxy: %1% completo + + + + Create/Modify Proxy + Criar/modificar proxy + + + + Create Proxy + Criar proxy + + + + Modify Proxy + Modificar proxy + + + + Restore Original + Restaurar original + + + + Delete + Excluir + + + + Preview in Media Viewer + Mostrar no visualizador de mídia + + + + Properties... + Propriedades... + + + + Replace '%1' + Substituir '%1' + + + + All Files + Todos os arquivos + + + + Replace Media + Substituir mídia + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Você arrastou um arquivo no lugar do '%1'. Deseja substituí-lo pelo arquivo arrastado? + + + + Delete proxy + Excluir proxy + + + + Would you like to delete the proxy file "%1" as well? + Você deseja excluir o arquivo de proxy "%1"? + + + + SpeedDialog + + + Speed/Duration + Velocidade/duração + + + + Speed: + Velocidade: + + + + Frame Rate: + Taxa de quadros: + + + + Duration: + Duração: + + + + Reverse + Inverter + + + + Maintain Audio Pitch + Manter o tom do áudio + + + + Ripple Changes + Mover clipes em cadeia + + + + TextEditDialog + + + Edit Text + Editar texto + + + + Thin + Fino + + + + Extra Light + Extraleve + + + + Light + Leve + + + + Normal + Regular + + + + Medium + Médio + + + + Demi Bold + Seminegrito + + + + Bold + Negrito + + + + Extra Bold + Extranegrito + + + + Black + Preto + + + + TextEditEx + + + Edit Text + Editar texto + + + + &Edit Text + &Editar texto + + + + TextEffect + + + + Text + Texto + + + + Font + Fonte + + + + Size + Tamanho + + + + Color + Cor + + + + Horizontal Alignment + Alinhamento horizontal + + + + Left + Esquerda + + + + + Center + Centro + + + + Right + Direita + + + + Justify + Justificado + + + + Vertical Alignment + Alinhamento vertical + + + + Top + Em cima + + + + Bottom + Embaixo + + + + Word Wrap + Quebra de linha automática + + + + Padding + Espaçamento + + + + Position + Posição + + + + Outline + Contorno + + + + Outline Color + Cor do contorno + + + + Outline Width + Largura do contorno + + + + Shadow + Sombra + + + + Shadow Color + Cor da sombra + + + + Shadow Angle + Ângulo da sombra + + + + Shadow Distance + Distância da sombra + + + + Shadow Softness + Suavidade da sombra + + + + Shadow Opacity + Opacidade da sombra + + + + Sample Text + Texto de exemplo + + + + Render + Renderizar + + + + Generate simple text over this clip + Cria um texto simples em cima do clipe + + + + TimecodeEffect + + + + Timecode + Código de tempo + + + + Sequence + Sequência + + + + Media + Mídia + + + + Scale + Escala + + + + Color + Cor + + + + Background Color + Cor do plano de fundo + + + + Background Opacity + Opacidade do plano de fundo + + + + Offset + Deslocamento + + + + Prepend + Texto no início + + + + Render + Renderizar + + + + Render the media or sequence timecode on this clip. + Renderiza o código de tempo da mídia ou da sequência neste clipe. + + + + Timeline + + + Pointer Tool + Ferramenta Ponteiro + + + + Edit Tool + Ferramenta Modificar + + + + Ripple Tool + Ferramenta Ajustar em cadeia + + + + Razor Tool + Ferramenta Fatiar + + + + Slip Tool + Ferramenta Escorregar + + + + Slide Tool + Ferramenta Deslizar + + + + Hand Tool + Ferramenta Mão + + + + Transition Tool + Ferramenta Transição + + + + Snapping + Encaixe + + + + Zoom In + Aumentar zoom + + + + Zoom Out + Diminuir zoom + + + + Record audio + Gravar áudio + + + + Add title, solid, bars, etc. + Adicionar título, cor sólida, barras, etc. + + + + Nested Sequence + Sequência aninhada + + + + Title... + Título... + + + + Solid Color... + Cor sólida... + + + + Bars... + Barras... + + + + Tone... + Tom... + + + + Noise... + Ruído... + + + + Unsaved Project + Projeto não salvo + + + + You must save this project before you can record audio in it. + Você precisa salvar este projeto antes de gravar áudio nele. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Clique na linha do tempo no ponto em que deseja iniciar a gravação (arraste para limitar a gravação a uma duração específica) + + + + Video Transitions + Transições de vídeo + + + + Audio Transitions + Transições de áudio + + + + Timeline: %1 + Linha do tempo: %1 + + + + (none) + (nenhum) + + + + TimelineHeader + + + Center Timecodes + Centralizar códigos de tempo + + + + TimelineLabel + + + Rename Track + Renomear faixa + + + + Enter the new name for this track + Digite o novo nome da faixa + + + + TimelineView + + + &Undo + &Desfazer + + + + &Redo + &Refazer + + + + R&ipple Delete Empty Space + &Excluir espaço em cadeia + + + + Sequence Settings + Configurações da sequência + + + + &Speed/Duration + &Velocidade/duração + + + + Auto-Cut Silence + Cortar silêncio automaticamente + + + + Auto-S&cale + &Ajustar escala automaticamente + + + + &Reveal in Project + &Mostrar no projeto + + + + Properties + Propriedades + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Início: %2 +Fim: %3 +Duração: %4 + + + + Error + Erro + + + + Couldn't locate media wrapper for sequence. + Não foi possível localizar o contêiner de mídia para a sequência. + + + + Title + Título + + + + Solid Color + Cor sólida + + + + Bars + Barras + + + + Tone + Tom + + + + Noise + Ruído + + + + Duration: + Duração: + + + + TimelineWidget + + + &Undo + &Desfazer + + + + &Redo + &Refazer + + + + R&ipple Delete Empty Space + &Excluir espaço em cadeia + + + + Sequence Settings + Configurações da sequência + + + + &Speed/Duration + &Velocidade/duração + + + + Auto-Cut Silence + Cortar silêncio automaticamente + + + + Auto-S&cale + &Ajustar escala automaticamente + + + + &Reveal in Project + &Mostrar no projeto + + + + Properties + Propriedades + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Início: %2 +Fim: %3 +Duração: %4 + + + + Error + Erro + + + + Couldn't locate media wrapper for sequence. + Não foi possível localizar o contêiner de mídia para a sequência. + + + + Title + Título + + + + Solid Color + Cor sólida + + + + Bars + Barras + + + + Tone + Tom + + + + Noise + Ruído + + + + Duration: + Duração: + + + + ToneEffect + + + Type + Tipo + + + + Sine + Senoidal + + + + Frequency + Frequência + + + + Amount + Quantidade + + + + Mix + Misturar + + + + Tone + Tom + + + + Generate a sine wave tone to mix into this clip's audio. + Cria um tom de onda senoidal para misturar no áudio deste clipe. + + + + Track + + + Video %1 + Vídeo %1 + + + + Audio %1 + Áudio %1 + + + + Subtitle %1 + Legenda %1 + + + + Unknown %1 + Desconhecido %1 + + + + TransformEffect + + + Position + Posição + + + + Scale + Escala + + + + Uniform Scale + Escala uniforme + + + + Rotation + Rotação + + + + Anchor Point + Ponto de ancoragem + + + + Opacity + Opacidade + + + + Transform + Transformar + + + + Distort + Distorcer + + + + Transform the position, scale, and rotation of this clip. + Transformar a posição, a escala e a rotação deste clipe. + + + + Transition + + + Length + Duração + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + Existe uma atualização disponível na página do Olive. Visite www.olivevideoeditor.org para fazer o download. + + + + VSTHost + + + + Error loading VST plugin + Erro ao carregar o plugin VST + + + + Failed to load VST plugin "%1": %2 + Não foi possível carregar o plugin VST "%1": %2 + + + + Failed to locate entry point for dynamic library. + Não foi possível localizar o ponto de entrada da biblioteca dinâmica. + + + + VST Error + Erro VST + + + + Plugin's magic number is invalid + O número mágico do plugin é inválido + + + + VST Plugin + Plugin VST + + + + Plugin + Plugin + + + + Interface + Interface + + + + Show + Mostrar + + + + VST Plugin 2.x + Plugin VST 2.x + + + + Use a VST 2.x plugin on this clip's audio. + Use um plugin VST 2.x neste clipe de áudio. + + + + Viewer + + + Viewer: %1 + Visualizador: %1 + + + + Failed to import recorded file + Falha ao importar o arquivo gravado + + + + An error occurred trying to import the recorded audio + Ocorreu um erro durante a importação do áudio gravado + + + + (none) + (nenhum) + + + + Drag video only + Arrastar apenas o vídeo + + + + Drag audio only + Arrastar apenas o áudio + + + + Sequence Viewer: %1 + Visualizador de sequência: %1 + + + + Media Viewer: %1 + Visualizador de mídia: %1 + + + + ViewerWidget + + + Save Frame as Image... + Salvar quadro como imagem... + + + + Show Fullscreen + Mostrar tela cheia + + + + Disable + Desativar + + + + Screen %1: %2x%3 + Tela %1: %2x%3 + + + + Zoom + Zoom + + + + Fit + Ajustar + + + + Custom + Personalizado + + + + Close Media + Fechar mídia + + + + Save Frame + Salvar quadro + + + + Viewer Zoom + Zoom do visualizador + + + + Set Custom Zoom Value: + Defina um valor de zoom personalizado: + + + + ViewerWindow + + + Exit Fullscreen + Sair da tela cheia + + + + VoidEffect + + + (unknown) + (desconhecido) + + + + Missing Effect + Efeito ausente + + + + VolumeEffect + + + + Volume + Volume + + + + Adjust the volume of this clip's audio + Ajusta o volume do áudio deste clipe + + + + bitdepths + + + 8-bit + Inteiro de 8 bits + + + + 16-bit Integer + Inteiro de 16 bits + + + + Half-Float (16-bit) + Ponto flutuante de 16 bits + + + + Full-Float (32-bit) + Ponto flutuante de 32 bits + + + diff --git a/app/ts/ru_RU.ts b/app/ts/ru_RU.ts new file mode 100644 index 000000000..a5749e97a --- /dev/null +++ b/app/ts/ru_RU.ts @@ -0,0 +1,3646 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive — нелинейный видеоредактор. Эта программа является свободной и защищена GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Исходный код Olive доступен для скачивания на сайте программы. + + + + ActionSearch + + + Search for action... + Найти действие… + + + + AdvancedVideoDialog + + + Advanced Video Settings + Дополнительные параметры видео + + + + Pixel Format: + Формат пикселей: + + + + Threads: + Потоков: + + + + Audio + + + %1 Audio + + + + + Recording %1 + Запись %1 + + + + AudioNoiseEffect + + + Amount + Количество + + + + Mix + Смешивание + + + + AutoCutSilenceDialog + + + Cut Silence + Вырезать тишину + + + + Attack Threshold: + Порог атаки: + + + + Attack Time: + Время атаки: + + + + Release Threshold: + Порог восстановления: + + + + Release Time: + Время восстановления: + + + + Cacher + + + + Could not open %1 - %2 + Не удалось открыть %1 - %2 + + + + ChannelLayoutName + + + Invalid + Некорректный + + + + Mono + Моно + + + + Stereo + Стерео + + + + ClipPropertiesDialog + + + "%1" Properties + Свойства "%1" + + + + Multiple Clip Properties + Свойства клипов + + + + Name: + Название: + + + + Duration: + Длительность: + + + + (multiple) + (больше одного) + + + + CollapsibleWidget + + + <untitled> + <без названия> + + + + ColorButton + + + Set Color + Установить цвет + + + + CornerPinEffect + + + Top Left + Вверху слева + + + + Top Right + Вверху справа + + + + Bottom Left + Внизу слева + + + + Bottom Right + Внизу справа + + + + Perspective + Перспектива + + + + DebugDialog + + + Debug Log + Журнал отладки + + + + DemoNotice + + + + Welcome to Olive! + Приветствуем в Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Это свободный нелинейный видеоредактор с открытым исходным кодом под лицензией GNU GPL. Если вы заплатили за эту программу, скорее всего вас обманули. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + На текущий момент программа находится на стадии альфы, т.е. она нестабильна, может часто падать и не иметь нужных вам функций. Мы не даём никаких гарантий, используйте на свой страх и риск. Сообщения об ошибках и запросы на новые функции мы принимаем здесь: %1 + + + + Thank you for trying Olive and we hope you enjoy it! + Спасибо за интерес к Olive. Надеемся, что программа вам понравится! + + + + Effect + + + Invalid effect + Некорректный эффект + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + + + + Save Effect Settings + Сохранить параметры эффекта + + + + + Effect XML Settings %1 + Файлы с параметрами эффектов %1 + + + + Save Settings Failed + Не удалось сохранить параметры + + + + Failed to open "%1" for writing. + Не удалось открыть "%1" для записи. + + + + Load Effect Settings + Загрузить параметры эффекта + + + + + Load Settings Failed + Не удалось загрузить параметры + + + + Failed to open "%1" for reading. + Не удалось открыть "%1" для чтения. + + + + This settings file doesn't match this effect. + Это файлс параметрами совсем другого эффекта. + + + + EffectControls + + + Effects: + Эффекты: + + + + (none) + (нет) + + + + Add Video Effect + Добавить видеоэффект + + + + VIDEO EFFECTS + ВИДЕОЭФФЕКТЫ + + + + Add Video Transition + Добавить видеопереход + + + + Add Audio Effect + Добавить аудиоэффект + + + + AUDIO EFFECTS + АУДИОЭФФЕКТЫ + + + + Add Audio Transition + Добавить аудиопереход + + + + EffectRow + + + Disable Keyframes + Отключить ключевые кадры + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Отключение приведёт к удалению всех текущих ключевых кадров. Вы уверены? + + + + EffectUI + + + %1 (Opening) + %1 (открывается) + + + + %1 (Closing) + %1 (закрывается) + + + + %1 (multiple) + %1 (больше одного) + + + + Cu&t + В&ырезать + + + + &Copy + &Скопировать + + + + Move &Up + &Поднять + + + + Move &Down + &Опустить + + + + D&elete + &Удалить + + + + Load Settings From File + Загрузить параметры из файла + + + + Save Settings to File + Сохранить параметры в файл + + + + EmbeddedFileChooser + + + File: + Файл: + + + + ExportDialog + + + Export "%1" + Экспортировать "%1" + + + + Unknown codec name %1 + + + + + Export Failed + Не удалось экспортировать + + + + Export failed - %1 + Не удалось экспортировать — %1 + + + + Invalid dimensions + Некорректный размер кадра + + + + Export width and height must both be even numbers/divisible by 2. + Ширина и высота кадра при экспорте должны делиться на 2 без остатка. + + + + Invalid codec + Некорректный кодек + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + + + + + Invalid format + Некорректный формат + + + + Couldn't determine output format. This is a bug, please contact the developers. + + + + + Export Media + Экспортировать проект + + + + %p% (Total: %1:%2:%3) + %p% (Итого: %1:%2:%3) + + + + %p% (ETA: %1:%2:%3) + %p% (Осталось: %1:%2:%3) + + + + Quality-based (Constant Rate Factor) + Качество (Constant Rate Factor) + + + + Constant Bitrate + Постоянная скорость потока + + + + + Invalid Codec + Некорректный кодек + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Не удалось найти подходящий кодировщик для этого кодека. Экспорт не гарантирован. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Не удалось найти пиксельный формат для этого кодировщика. Экспортировать скорее всего не получится. + + + + Bitrate (Mbps): + Скорость потока (Мбит/с): + + + + Quality (CRF): + Качество (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Показатель качества: + +0 = без потерь в качестве +17-18 = визуально без потерь, хотя есть сжатие +23 = высокое качество +51 = самое низкое качество + + + + Target File Size (MB): + Конечный размер файла (Мб): + + + + Format: + Формат: + + + + Range: + Диапазон: + + + + Entire Sequence + Вся последовательность + + + + In to Out + От входа от выхода + + + + Video + Видео + + + + + Codec: + Кодек: + + + + Width: + Ширина: + + + + Height: + Высота: + + + + Frame Rate: + Частота кадров: + + + + Compression Type: + Тип сжатия: + + + + Advanced + Дополнительно + + + + Audio + Звук + + + + Sampling Rate: + Частота дискретизации: + + + + Bitrate (Kbps/CBR): + Скорость потока (Кбит/с / CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + + + + + failed to receive packet from encoder (%1) + + + + + could not video encoder for %1 + + + + + could not allocate video stream + + + + + could not allocate video encoding context + + + + + could not open output video encoder (%1) + + + + + could not copy video encoder parameters to output stream (%1) + + + + + could not audio encoder for %1 + + + + + could not allocate audio stream + + + + + could not allocate audio encoding context + + + + + could not open output audio encoder (%1) + + + + + could not copy audio encoder parameters to output stream (%1) + + + + + could not allocate audio buffer (%1) + + + + + could not create output format context + + + + + could not open output file (%1) + + + + + could not write output file header (%1) + + + + + could not write output file trailer (%1) + + + + + FillLeftRightEffect + + + Type + Тип + + + + Fill Left with Right + Заполнить левый канал правым + + + + Fill Right with Left + Заполнить правый канал левым + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Не удалось загрузить плагшин Frei0r "%1": %2 + + + + Error loading Frei0r plugin + Ошибка при загрузке плагина Frei0r + + + + GraphEditor + + + Graph Editor + Редактор графов + + + + Linear + Линейный + + + + Bezier + Безье + + + + Hold + Константа + + + + GraphView + + + Zoom to Selection + Масштабировать в выделение + + + + Zoom to Show All + Масштабировать и показать всё + + + + Reset View + Сбросить масштаб + + + + InterlacingName + + + None (Progressive) + Нет (прогрессивно) + + + + Top Field First + Сначала верхнее поле + + + + Bottom Field First + Сначала нижнее поле + + + + Invalid + Некорректно + + + + KeyframeNavigator + + + Enable Keyframes + Включить ключевые кадры + + + + KeyframeView + + + Linear + Линейный + + + + Bezier + Безье + + + + Hold + Константа + + + + LabelSlider + + + &Edit + &Изменить + + + + &Reset to Default + С&бросить до исходного + + + + + Set Value + Установить значение + + + + + New value: + Новое значение: + + + + LoadDialog + + + Loading... + Загрузка… + + + + Loading '%1'... + Загружается '%1'... + + + + Cancel + Отмена + + + + LoadThread + + + Version Mismatch + Несовпадение версий + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Этот проект был сохранён в другой версии Olive, которая неполностью совместима с установленной у вас. Всё-таки попробовать загрузить? + + + + Invalid Clip Link + Некорректная связь клипов + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + В проекте обнаружена некорректная связь клипов. Всё-таки попробовать загрузить её? + + + + %1 - Line: %2 Col: %3 + %1 - Строка: %2 Столбец: %3 + + + + User aborted loading + Пользователь прервал загрузку + + + + XML Parsing Error + Ошибка разбора XML + + + + Couldn't load '%1'. %2 + Не удалось загрузить '%1'. %2 + + + + Project Load Error + Ошибка при загрузке проекта + + + + Error loading project: %1 + Ошибка при загрузке проекта: %1 + + + + MainWindow + + + Welcome to %1 + Приветствуем в %1 + + + + &File + &Файл + + + + &New + &Создать + + + + &Open Project + &Открыть проект + + + + Clear Recent List + Очистить список + + + + Open Recent + Открыть недавний + + + + &Save Project + Со&хранить проект + + + + Save Project &As + Сохранить проект &как + + + + &Import... + &Импортировать… + + + + &Export... + &Экспортировать… + + + + E&xit + В&ыход + + + + &Edit + &Правка + + + + &Undo + &Отменить + + + + Redo + Вернуть + + + + Select &All + Выд&елить всё + + + + Deselect All + Снять выделение + + + + Ripple to In Point + Сдвиг до точки входа + + + + Ripple to Out Point + Сдвиг до точки выхода + + + + Edit to In Point + Правка до точки входа + + + + Edit to Out Point + Правка до точки выхода + + + + Delete In/Out Point + Удалить точку входа/выхода + + + + Ripple Delete In/Out Point + Удалить со сдвигом точку входа/выхода + + + + Set/Edit Marker + Установить/Изменить маркер + + + + &View + &Вид + + + + Zoom In + Приблизить + + + + Zoom Out + Отдалить + + + + Increase Track Height + Увеличить высоту дорожки + + + + Decrease Track Height + Уменьшить высоту дорожки + + + + Toggle Show All + Показывать весь проект + + + + Track Lines + Линии дорожек + + + + Rectified Waveforms + Волновая форма от низа + + + + Frames + Кадры + + + + Drop Frame + С пропуском кадров + + + + Non-Drop Frame + Без пропуска кадров + + + + Milliseconds + Миллисекунды + + + + Title/Action Safe Area + Безопасная область + + + + Off + Выкл. + + + + Default + По умолчанию + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + Другая + + + + Full Screen + Полноэкранный режим + + + + Full Screen Viewer + Просмотр в полноэкранном режиме + + + + &Playback + Вос&произведение + + + + Go to Start + К началу + + + + Previous Frame + К предыдущему кадру + + + + Play/Pause + Воспроизведение/Пауза + + + + Play In to Out + Проиграть от входа до выхода + + + + Next Frame + К следующему кадру + + + + Go to End + В конец + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + К точке входа + + + + Go to Out Point + К точке выхода + + + + Shuttle Left + Уменьшить скорость + + + + Shuttle Stop + Пауза + + + + Shuttle Right + Увеличить скорость + + + + Loop + Петля + + + + &Window + &Окно + + + + Project + Проект + + + + Effect Controls + Управление эффектами + + + + Timeline + Монтажный стол + + + + Graph Editor + Редактор графов + + + + Media Viewer + Просмотр проекта + + + + Sequence Viewer + Просмотр последовательностей + + + + Maximize Panel + Развернуть панель + + + + Lock Panels + Закрепить панели + + + + Reset to Default Layout + Вернуть исходный вид панелей + + + + &Tools + &Инструменты + + + + Pointer Tool + Указатель + + + + Edit Tool + Выделение + + + + Ripple Tool + Монтаж со сдвигом + + + + Razor Tool + Подрезка + + + + Slip Tool + Прокрутка с совмещением + + + + Slide Tool + Прокрутка + + + + Hand Tool + Навигация + + + + Transition Tool + Переход + + + + Enable Snapping + Включить прилипание + + + + Auto-Cut Silence + Вырезать тишину + + + + No Auto-Scroll + Без автопрокрутки + + + + Page Auto-Scroll + Прокручивать перелистыванием + + + + Smooth Auto-Scroll + Прокручивать плавно + + + + Preferences + Параметры + + + + Clear Undo + Очистить историю изменений + + + + &Help + &Справка + + + + A&ction Search + &Найти команду + + + + Debug Log + Журнал отладки + + + + &About... + &О программе… + + + + <untitled> + <без названия> + + + + Marker + + + Set Marker + Установить маркер + + + + Set clip marker name: + Название маркера клипа: + + + + Set sequence marker name: + Название маркера последовательности: + + + + Media + + + New Folder + Новая папка + + + + Name: + Название: + + + + Filename: + Имя файла: + + + + Video Dimensions: + Размер кадров: + + + + Frame Rate: + Частота кадров: + + + + %1 field(s) (%2 frame(s)) + полей: %1 (кадров: %2) + + + + Interlacing: + Чересстрочность: + + + + Audio Frequency: + Частота звука: + + + + Audio Channels: + Звуковых каналов: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Название: %1 +Размер кадров: %2x%3 +Частота кадров: %4 +Частота звука: %5 +Звуковые каналы: %6 + + + + Name + Название + + + + Duration + Длительность + + + + Rate + Частота + + + + MediaPropertiesDialog + + + "%1" Properties + Свойства "%1" + + + + Tracks: + Дорожек: + + + + Video %1: %2x%3 %4FPS + Видео %1: %2x%3 %4к/с + + + + Audio %1: %2Hz %3 + Звук %1: %2Гц %3 + + + + %n channel(s) + + %n канал + %n канала + %n каналов + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + Предумноженный альфа-канал + + + + Auto (%1) + Авто (%1) + + + + Interlacing: + Чересстрочность: + + + + Name: + Название: + + + + MenuHelper + + + &Project + &Проект + + + + &Sequence + П&оследовательность + + + + &Folder + П&апка + + + + Set In Point + Установить точку входа + + + + Set Out Point + Установить точку выхода + + + + Reset In Point + Сбросить точку входа + + + + Reset Out Point + Сбросить точку выхода + + + + Clear In/Out Point + Очистить точку входа/выхода + + + + Add Default Transition + Добавить переход по умолчанию + + + + Link/Unlink + Связать/Убрать связь + + + + Enable/Disable + Включить/Отключить + + + + Nest + Вложить + + + + Cu&t + В&ырезать + + + + Cop&y + С&копировать + + + + + &Paste + &Вставить + + + + Paste Insert + + + + + Duplicate + Сделать копию + + + + Delete + Удалить + + + + Ripple Delete + Удалить со сдвигом + + + + Split + Разделить + + + + Invalid aspect ratio + Некорректное соотношение сторон + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + Введите другое соотношение сторон + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Введите соотношение сторон для этой безопасной области (например, 16:9) + + + + NewSequenceDialog + + + Editing "%1" + Правка "%1" + + + + New Sequence + Новая последовательность + + + + Preset: + Предстановка: + + + + Film 4K + Кино 4К + + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + Другое + + + + Video + Видео + + + + Width: + Ширина: + + + + Height: + Высота: + + + + Frame Rate: + Частота кадров: + + + + Pixel Aspect Ratio: + Соотношение сторон пикселя: + + + + Square Pixels (1.0) + Квадратные пиксели (1.0) + + + + Interlacing: + Чересстрочность: + + + + None (Progressive) + Нет (прогрессивно) + + + + Audio + Звук + + + + Sample Rate: + Частота дискретизации: + + + + Name: + Название: + + + + OliveGlobal + + + Olive Project %1 + Проект Olive %1 + + + + Auto-recovery + Автовосстановление + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive аварийно завершил работу, обнаружен файл автовосстановления. Открыть его? + + + + Open Project... + Открыть проект… + + + + Missing recent project + Отсутствует недавний проект + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Проект '%1' больше не существует. Удалить его из списка недавних? + + + + Save Project As... + Сохранить проект как… + + + + Unsaved Project + Несохранённый проект + + + + This project has changed since it was last saved. Would you like to save it before closing? + Проект был изменён с момента последнего сохранения. Хотите сохранить его перед закрытием? + + + + No active sequence + Нет активных последовательностей + + + + Please open the sequence to perform this action. + Откройте последовательность для выполнения этого действия. + + + + No clips selected + Клипы не выделены + + + + Select the clips you wish to auto-cut + Выделите клипы, в которых надо вырезать тишину + + + + Missing Project File + Отсутствует проектный файл + + + + Specified project '%1' does not exist. + Указанный проект '%1' не существует. + + + + PanEffect + + + Pan + Панорама + + + + PreferencesDialog + + + Preferences + Параметры + + + + Default Sequence + Последовательности по умолчанию + + + + Invalid CSS File + Некорректный файл CSS + + + + CSS file '%1' does not exist. + Файл CSS '%1' не существует. + + + + Confirm Reset All Shortcuts + Подтвердите действие + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Вы действительно хотите сбросить все клавиатурные комбинации к исходным значениям? + + + + Import Keyboard Shortcuts + Импортировать клавиатурные комбинации + + + + + Error saving shortcuts + Ошибка при сохранении клавиатурных комбинаций + + + + Failed to open file for reading + Не удалось открыть файл для чтения + + + + Export Keyboard Shortcuts + Экспортировать клавиатурные комбинации + + + + Export Shortcuts + Экспортировать клавиатурные комбинации + + + + Shortcuts exported successfully + Комбинации успешно экспортированы + + + + Failed to open file for writing + Не удалось открыть файл для записи + + + + Browse for CSS file + Указать файл CSS + + + + Delete All Previews + Удалить все миниатюры + + + + Are you sure you want to delete all previews? + Действительно удалить все миниатюры? + + + + Previews Deleted + Миниатюры удалены + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + Все миниатюры успешно удалены. Возможно, понадобится заново открыть проект, чтобы изменения вступили в силу. + + + + Language: + Язык: + + + + Default Sequence Settings + + + + + Add Default Effects to New Clips + Добавлять эффекты по умолчанию в новые клипы + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + + + + + Selecting Also Seeks + Выделение с перемоткой + + + + Edit Tool Also Seeks + Выделение с перемоткой + + + + Edit Tool Selects Links + Выделение выбирает связи + + + + Seek Also Selects + Перемотка с выделением + + + + Seek to the End of Pastes + Перемотка до конца вставок + + + + Scroll Wheel Zooms + Колесо мыши масштабирует монтажный стол + + + + Hold CTRL to toggle this setting + + + + + Invert Timeline Scroll Axes + + + + + Enable Drag Files to Timeline + Разрешить перетаскивание на монтажный стол извне + + + + Auto-Scale By Default + Автоматически масштабировать по умолчанию + + + + Auto-Seek to Imported Clips + + + + + Audio Scrubbing + Воспроизводить звук при прокрутке + + + + Drop Files on Media to Replace + + + + + Enable Hover Focus + Включить фокус наводкой + + + + Ask For Name When Setting Marker + Спрашивать имя маркера при добавлении + + + + Appearance + Внешний вид + + + + Theme + Тема + + + + Olive Dark (Default) + Olive Dark (по умолчанию) + + + + Olive Light + Olive Light + + + + Native + Системная + + + + Native (Light Icons) + Системная со светлыми значками + + + + Use Native Menu Styling + + + + + Custom CSS: + Свой CSS: + + + + Browse + Просмотр + + + + Image sequence formats: + Форматы изображений: + + + + Audio Recording: + Запись звука: + + + + Mono + Моно + + + + Stereo + Стерео + + + + Effect Textbox Lines: + Строк в редакторе титров: + + + + Thumbnail Resolution: + Разрешение миниатюр: + + + + Waveform Resolution: + Разрешение волновой формы: + + + + Delete Previews + Удалить миниатюры + + + + Use Software Fallbacks When Possible + По возможности использовать программную реализацию вместо аппаратной + + + + General + Общие + + + + Behavior + Поведение + + + + Memory Usage + Использование памяти + + + + Upcoming Frame Queue: + Очередь последующих кадров: + + + + + frames + кадров + + + + + seconds + секунд + + + + Previous Frame Queue: + Очередь предыдущих кадров: + + + + Playback + Воспроизведение + + + + Output Device: + Устройство выхода: + + + + + Default + По умолчанию + + + + Input Device: + Устройство входа: + + + + Sample Rate: + Частота дискретизации: + + + + Audio + Звук + + + + Search for action or shortcut + Искать действие или комбинацию клавиш + + + + Action + Действие + + + + Shortcut + Комбинация + + + + Import + Импортировать + + + + Export + Экспортировать + + + + Reset Selected + Сбросить выбранное + + + + Reset All + Сбросить все + + + + Keyboard + Клавиатурные комбинации + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + + + + + Could not open file - %1 + Не удалось открыть файл — %1 + + + + Could not find stream information - %1 + Не удалось найти информацию потока — %1 + + + + Project + + + New + Создать + + + + Open Project + Открыть проект + + + + Save Project + Сохранить проект + + + + Undo + Отменить + + + + Redo + Вернуть + + + + Tree View + В виде дерева + + + + Icon View + В виде миниатюр + + + + List View + В виде списка + + + + Search media, markers, etc. + Искать файлы, маркеры и т.д. + + + + Project + Проект + + + + Sequence + Последовательность + + + + Replace '%1' + Заменить '%1' + + + + + All Files + Все файлы + + + + + No active sequence + Нет активных последовательностей + + + + No sequence is active, please open the sequence you want to replace clips from. + Нет активных последовательностей. Откройте последовательность, в которой хотите заменить клипы. + + + + Active sequence selected + Выбрана активная последовательность + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + Вы не можете вставить последовательность в саму себя, так что клипы из этих файлов не могут попасть в эту последовательность. + + + + Rename '%1' + Переименовать '%1' + + + + Enter new name: + Введите новое название: + + + + Delete media in use? + Удалить используемые в проекте файлы? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + Файл '%1' уже используется в '%2'. Его удаление приведет к удалению всех его копий в выбранной последовательности. Вы точно этого хотите? + + + + Skip + Пропустить + + + + Import a Project + Импортировать проект + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" является проектом Olive и будет добавлен в этот проект. Продолжить? + + + + Image sequence detected + Обнаружена последовательность изображений + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + Похоже, что файл '%1' яавляется частью последовательности изображений. Загрузить его как таковой? + + + + Import media... + Импортировать медиафайлы… + + + + No sequence is active, please open the sequence you want to delete clips from. + Нет активных последовательностей. Откройте последовательность, из которой хотите удалить клипы. + + + + ProxyDialog + + + Create Proxy + Создать прокси + + + + Proxy + Прокси + + + + Dimensions: + Размер: + + + + Same Size as Source + В размере оригинала + + + + Half Resolution (1/2) + Половина оригинала (1/2) + + + + Quarter Resolution (1/4) + Четверть оригинала (1/4) + + + + Eighth Resolution (1/8) + Восьмая оригинала (1/8) + + + + Sixteenth Resolution (1/16) + Шестнадцатая оригинала (1/16) + + + + Format: + Формат: + + + + ProRes HQ + ProRes HQ + + + + Location: + Размещение: + + + + Same as Source (in "%1" folder) + Как в исходнике (в папке «%1») + + + + Proxy file exists + Прокси-файл уже существует + + + + The file "%1" already exists. Do you wish to replace it? + Файл «%1» уже существует. Заменить его? + + + + Custom Location + Другое размещение + + + + ProxyGenerator + + + Finished generating proxy for "%1" + Завершено создание прокси для "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Заменить клипы данными "%1" + + + + Select which media you want to replace this media's clips with: + Выберите файлы, которые хотите заменить клипы с этими файлами: + + + + Keep the same media in-points + Сохранить существующие точки входа + + + + Replace + Заменить + + + + Cancel + Отмена + + + + No media selected + Файлы не выбраны + + + + Please select a media to replace with or click 'Cancel'. + Выберите файлы для замены или нажмите кнопку «Отмена». + + + + Same media selected + Выбраны те же самые файлы + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Вы выбрали те же файлы, которые хотите заменить. Выберите что-то другое или нажмите кнопку «Отмена». + + + + Folder selected + Папка выбрана + + + + You cannot replace footage with a folder. + Вы не можете заменить видеосъёмку папкой. + + + + Active sequence selected + Выбрана активная последовательность + + + + You cannot insert a sequence into itself. + Вы не можете вставить последовательность в саму себя. + + + + RichTextEffect + + + Text + Текст + + + + Padding + Отступ + + + + Position + Позиция + + + + Vertical Align: + Верт. выравнивание: + + + + Top + Сверху + + + + Center + По центру + + + + Bottom + Снизу + + + + Auto-Scroll + Автопрокрутка + + + + Off + Выкл. + + + + Up + Вверх + + + + Down + Вниз + + + + Left + Влево + + + + Right + Вправо + + + + Shadow + Тень + + + + Shadow Color + Цвет тени + + + + Shadow Angle + Угол тени + + + + Shadow Distance + Длина тени + + + + Shadow Softness + Мягкость тени + + + + Shadow Opacity + Непрозрачность тени + + + + Sequence + + + %1 (copy) + %1 (копия) + + + + ShakeEffect + + + Intensity + Интенсивность + + + + Rotation + Вращение + + + + Frequency + Частота + + + + SolidEffect + + + Type + Тип + + + + Solid Color + Сплошная заливка + + + + SMPTE Bars + Таблица SMPTE + + + + Checkerboard + Шахматная доска + + + + Opacity + Непрозрачность + + + + Color + Цвет + + + + Checkerboard Size + Размер клеток + + + + SourcesCommon + + + Import... + Импортировать… + + + + New + Создать + + + + View + Вид + + + + Tree View + В виде таблицы + + + + Icon View + В виде миниатюр + + + + Show Toolbar + Показывать панель + + + + Show Sequences + Показывать последовательности + + + + Replace/Relink Media + Заменить/пересвязать файлы + + + + Reveal in Explorer + Открыть в Проводнике + + + + Reveal in Finder + Открыть в Finder + + + + Reveal in File Manager + Открыть в файловом менеджере + + + + Replace Clips Using This Media + Заменить клипы с этими файлами + + + + Create Sequence With This Media + Создать последовательность с этими файлами + + + + Duplicate + Создать копию + + + + Delete All Clips Using This Media + Удалить все клипы с этим файлом + + + + Proxy + Прокси + + + + Generating proxy: %1% complete + Создание прокси: завершено на %1% + + + + Create/Modify Proxy + Создать/Изменить прокси + + + + Create Proxy + Создать прокси + + + + Modify Proxy + Изменить прокси + + + + Restore Original + Восстановить оригинал + + + + Delete + Удалить + + + + Preview in Media Viewer + + + + + Properties... + Свойства… + + + + Replace Media + Заменить файлы + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Вы бросили файл в '%1'. Заменить на брошенное? + + + + Delete proxy + Удалить прокси + + + + Would you like to delete the proxy file "%1" as well? + Заодно удалить прокси-файл "%1"? + + + + SpeedDialog + + + Speed/Duration + Скорость/длительность + + + + Speed: + Скорость: + + + + Frame Rate: + Частота кадров: + + + + Duration: + Длительность: + + + + Reverse + Реверс + + + + Maintain Audio Pitch + Сохранять высоту тона + + + + Ripple Changes + Изменять со сдвигом + + + + TextEditDialog + + + Edit Text + Изменить текст + + + + Thin + + + + + Extra Light + + + + + Light + + + + + Normal + Обычный + + + + Medium + + + + + Demi Bold + + + + + Bold + + + + + Extra Bold + + + + + Black + + + + + TextEditEx + + + Edit Text + Изменить текст + + + + &Edit Text + &Изменить текст + + + + TextEffect + + + Text + Текст + + + + Font + Шрифт + + + + Size + Кегль + + + + Color + Цвет + + + + Alignment + Выравнивание + + + + Left + Слева + + + + + Center + По центру + + + + Right + Справа + + + + Justify + По ширине + + + + Top + Сверху + + + + Bottom + Снизу + + + + Word Wrap + Перенос строки + + + + Padding + Отступ + + + + Position + Позиция + + + + Outline + Обводка + + + + Outline Color + Цвет обводки + + + + Outline Width + Толщина обводки + + + + Shadow + Тень + + + + Shadow Color + Цвет тени + + + + Shadow Angle + Угол тени + + + + Shadow Distance + Длина тени + + + + Shadow Softness + Мягкость тени + + + + Shadow Opacity + Непрозрачность тени + + + + Sample Text + Образец текста + + + + TimecodeEffect + + + Timecode + Тайм-код + + + + Sequence + Последовательность + + + + Media + Файл + + + + Scale + Масштаб + + + + Color + Цвет + + + + Background Color + Цвет фона + + + + Background Opacity + Непрозрачность фона + + + + Offset + Смещение + + + + Prepend + Префикс + + + + Timeline + + + Timeline: + Монтажный стол: + + + + Effect already exists + Эффект уже добавлен + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + Клип '%1' уже содержит эффект '%2'. Хотите заменить его на вставляемый эффект или добавить вставляемый эффект как отдельный? + + + + Add + Добавить + + + + Replace + Заменить + + + + Skip + Пропустить + + + + Do this for all conflicts found + Применить для всех конфликтов + + + + Nested Sequence + Вложенная последовательность + + + + Title... + Титры… + + + + Solid Color... + Цветная заливка… + + + + Bars... + Испытательная таблица… + + + + Tone... + Звуковой сигнал… + + + + Noise... + Шум… + + + + Unsaved Project + Несохранённый проект + + + + You must save this project before you can record audio in it. + Перед записью звука необходимо сохранить проект. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Щелкните на монтажном столе в точке, от которой хотите начать запись звука. Перетащите курсор после щелчка, чтобы сразу задать длительность записи. + + + + Pointer Tool + Указатель + + + + Edit Tool + Выделение + + + + Ripple Tool + Монтаж со сдвигом + + + + Razor Tool + Подрезка + + + + Slip Tool + Прокрутка с совмещением + + + + Slide Tool + Прокрутка + + + + Hand Tool + Навигация + + + + Transition Tool + Переход + + + + Snapping + Прилипание + + + + Zoom In + Приблизить + + + + Zoom Out + Отдалить + + + + Record audio + Записать звук + + + + Add title, solid, bars, etc. + Добавить титры, заливку цветом, испытательную таблицу и т.д. + + + + (none) + (нет) + + + + TimelineHeader + + + Center Timecodes + Центрировать тайм-код + + + + TimelineWidget + + + &Undo + &Отменить + + + + &Redo + В&ернуть + + + + Sequence Settings + Параметры последовательности + + + + &Speed/Duration + С&корость/Длительность + + + + &Reveal in Project + &Показать в проекте + + + + Properties + Свойства + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Начало: %2 +Конец: %3 +Длительность: %4 + + + + R&ipple Delete Empty Space + &Удалить со сдвигом пустое пространство + + + + Auto-Cut Silence + Вырезать тишину + + + + Auto-S&cale + Авто&масштабирование + + + + Error + Ошибка + + + + Couldn't locate media wrapper for sequence. + + + + + Title + Титры + + + + Solid Color + Цветная заливка + + + + Bars + Испытательная таблица + + + + Tone + Звуковой сигнал + + + + Noise + Шум + + + + Duration: + Длительность: + + + + ToneEffect + + + Type + Тип + + + + Sine + Синусоида + + + + Frequency + Частота + + + + Amount + Количество + + + + Mix + Смешать + + + + TransformEffect + + + Position + Позиция + + + + Scale + Масштаб + + + + Uniform Scale + Сохранять пропорции + + + + Rotation + Вращение + + + + Anchor Point + Точка привязки + + + + Opacity + Непрозрачность + + + + Blend Mode + Режим смешивания + + + + Normal + Обычный + + + + Transition + + + Length + Длительность + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + На сайте Olive доступно обновление программы. Зайдите на www.olivevideoeditor.org, чтобы скачать его. + + + + VSTHost + + + + Error loading VST plugin + Ошибка при загрузке плагина VST + + + + Failed to load VST plugin "%1": %2 + + + + + Failed to locate entry point for dynamic library. + + + + + VST Error + Ошибка VST + + + + Plugin's magic number is invalid + + + + + Plugin + Плагин + + + + Interface + Интерфейс + + + + Show + Показать + + + + VST Plugin + Плагин VST + + + + Viewer + + + Sequence Viewer + Просмотр последовательностей + + + + Media Viewer + Просмотр проекта + + + + (none) + (нет) + + + + Drag video only + Перетаскивать только видео + + + + Drag audio only + Перетаскивать только звук + + + + ViewerWidget + + + Save Frame as Image... + Сохранить кадр как изображение… + + + + Show Fullscreen + Полноэкранный режим + + + + Disable + Отключить + + + + Screen %1: %2x%3 + Экран %1: %2×%3 + + + + Zoom + Масштаб + + + + Fit + Уместить + + + + Custom + Другой + + + + Close Media + Закрыть файл + + + + Save Frame + Сохранить кадр + + + + Viewer Zoom + Масштаб просмотра + + + + Set Custom Zoom Value: + Другое значение масштаба: + + + + ViewerWindow + + + Exit Fullscreen + Выйти из полноэкранного режима + + + + VoidEffect + + + (unknown) + (неизвестно) + + + + Missing Effect + Отсутствующий эффект + + + + VolumeEffect + + + Volume + Громкость + + + + transition + + + Invalid transition + Некорректный переход + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + diff --git a/app/ts/sr_SR.ts b/app/ts/sr_SR.ts new file mode 100644 index 000000000..b2d7e0dbf --- /dev/null +++ b/app/ts/sr_SR.ts @@ -0,0 +1,3703 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive је нелинеарни видео уређивач. Овај софтвер је слободан и заштићен GNU GPL-ом. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive тим је под обавезом да обавести своје кориснике да је Olive-ов изворни код доступан за преузимање са његове веб странице. + + + + ActionSearch + + + Search for action... + Потражите радњу... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Напредне видео поставке + + + + Pixel Format: + Формат пиксела: + + + + Threads: + + + + + Audio + + Audio + Аудио + + + Recording + Снимање + + + + %1 Audio + %1 Аудио + + + + Recording %1 + Снимање %1 + + + + AudioNoiseEffect + + + Amount + Количина + + + + Mix + Микс + + + + AutoCutSilenceDialog + + + Cut Silence + + + + + Attack Threshold: + + + + + Attack Time: + + + + + Release Threshold: + + + + + Release Time: + + + + + Cacher + + + + Could not open %1 - %2 + + + + + ChannelLayoutName + + + Invalid + Неважеће + + + + Mono + Моно + + + + Stereo + Стерео + + + + ClipPropertiesDialog + + + "%1" Properties + + + + + Multiple Clip Properties + + + + + Name: + + + + + Duration: + + + + + (multiple) + + + + + CollapsibleWidget + + + <untitled> + <неименовано> + + + + ColorButton + + + Set Color + Постави боју + + + + CornerPinEffect + + + Top Left + Горње лево + + + + Top Right + Горње десно + + + + Bottom Left + Доње лево + + + + Bottom Right + Доње десно + + + + Perspective + Перспектива + + + + DebugDialog + + + Debug Log + Запис за дебугирање + + + + DemoNotice + + + + Welcome to Olive! + Добродошли у Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive је слободан видео уређивач са отвореним изворним кодом издан под GNU GPL-ом. Ако сте платили за овај софтвер, ви сте били преварени. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Овај софтвер је тренутно у АЛФА стању, што значи да је нестабилан и веома је вероватно да ће се срушити, имати грешака и да не достаје неких могућности. Ми не даје никакву гаранцију, тако да користите на свој сопствени ризик. Молимо да пријавите све грешке и жељене функције на %1 + + + + Thank you for trying Olive and we hope you enjoy it! + Хвала што испробавате Olive и надамо се да ћете уживати у њему! + + + + Effect + + + Invalid effect + Неважећи ефекат + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + Нема кандидата за ефекат '%1'. Могуће је да је овај ефекат коруптиран. Покушајте поновно инсталирати њега или Olive. + + + Cu&t + &Режи + + + &Copy + &Копирај + + + Move &Up + Помери &горе + + + Move &Down + Помери &доле + + + D&elete + &Обриши + + + Load Settings From File + Учитај поставке из датотеке + + + Save Settings to File + Спаси поставке у датотеку + + + + Save Effect Settings + Спаси пиставке ефекта + + + + + Effect XML Settings %1 + XML поставке ефекта %1 + + + + Save Settings Failed + Спашавање поставки неуспешно + + + + Failed to open "%1" for writing. + Неуспешно отварање "%1" за уређивање. + + + + Load Effect Settings + Учитај поставке ефекта + + + + + Load Settings Failed + Учитавање поставки неуспешно + + + + Failed to open "%1" for reading. + Неуспешно отварање "%1" за читање. + + + + This settings file doesn't match this effect. + Ова датотека поставки није прикладна за овај ефекат. + + + + EffectControls + + + Effects: + Ефекти: + + + &Paste + &Залепи + + + + (none) + (нема) + + + + Add Video Effect + Додај видео ефекат + + + + VIDEO EFFECTS + Видео ефекти + + + + Add Video Transition + Додај видео прелаз + + + + Add Audio Effect + Додај аудио ефекат + + + + AUDIO EFFECTS + Аудио ефекти + + + + Add Audio Transition + Додај аудио прелаз + + + (Multiple clips selected) + (Више снимки је одабрано) + + + + EffectRow + + + Disable Keyframes + Онемогући кључне кадрове + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Онемогућавање кључних кадрова ће обрисати све тренутне кључне кадрове. Да ли сте сигурни да желите ово урадити? + + + + EffectUI + + + %1 (Opening) + + + + + %1 (Closing) + + + + + %1 (multiple) + + + + + Cu&t + &Режи + + + + &Copy + &Копирај + + + + Move &Up + Помери &горе + + + + Move &Down + Помери &доле + + + + D&elete + &Обриши + + + + Load Settings From File + Учитај поставке из датотеке + + + + Save Settings to File + Спаси поставке у датотеку + + + + EmbeddedFileChooser + + + File: + Датотека: + + + + ExportDialog + + + Export "%1" + Извоз "%1" + + + + Unknown codec name %1 + Непознато име кодека %1 + + + + Export Failed + Извоз неуспешан + + + + Export failed - %1 + Извоз неуспешан - %1 + + + + Invalid dimensions + Неважеће димензије + + + + Export width and height must both be even numbers/divisible by 2. + Висина и ширина извоза обе морају бити парни бројеви/дељиве са два. + + + + Invalid codec + Неважећи кодек + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Параметри одабраног кодека се нису могли одредити. Ово је грешка, молимо да контактирате девелопере. + + + + Invalid format + Неважећи формат + + + + Couldn't determine output format. This is a bug, please contact the developers. + Излазни формат се није могао одредити. Ово је грешка, молимо да контактирате девелопере. + + + + Export Media + Извоз медија + + + + %p% (Total: %1:%2:%3) + + + + + %p% (ETA: %1:%2:%3) + + + + + Quality-based (Constant Rate Factor) + Базирано на квалитети (Фактор сталне стопе/Constant Rate Factor) + + + + Constant Bitrate + Стална стопа битова + + + + + Invalid Codec + Неважећи кодек + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Трагање за пркладним кодером за овај кодек није успело. Извоз највероватније неће успети. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Трагање за прикладним форматом пиксела за овај кодек није успело. Извоз највероватније неће успети. + + + + Bitrate (Mbps): + Стопа битова (Mbps): + + + + Quality (CRF): + Квалитета (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Фактор квалитете: + +0 = беспрекорно +17-18 = оку беспрекорно (компримирано, али неприметљиво) +23 = висока квалитета +51 = најнижа квалитета могућа + + + + Target File Size (MB): + Жељена величина датотеке (MB): + + + + Format: + Формат: + + + + Range: + Распон: + + + + Entire Sequence + Читава секвенца + + + + In to Out + Од почетка до краја + + + + Video + Видео + + + + + Codec: + Кодек: + + + + Width: + Ширина: + + + + Height: + Висина: + + + + Frame Rate: + Оквирна стопа: + + + + Compression Type: + Тип компримације: + + + + Advanced + Напредно + + + + Audio + Аудио + + + + Sampling Rate: + Стопа узорака: + + + + Bitrate (Kbps/CBR): + Стопа битова (Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + Слање оквира кодеру није успело (%1) + + + + failed to receive packet from encoder (%1) + Примање пакета од кодера није успело (%1) + + + + could not video encoder for %1 + Није могао видео кодер за %1 + + + + could not allocate video stream + Видео ток се није могао заузети + + + + could not allocate video encoding context + Контекст видео кодирања се није могао заузети + + + + could not open output video encoder (%1) + Излазни видео кодер се није могао отворити (%1) + + + + could not copy video encoder parameters to output stream (%1) + Параметри видео кодера се нису могли копирати у излазни ток (%1) + + + + could not audio encoder for %1 + Није могао аудио кодер за %1 + + + + could not allocate audio stream + Аудио ток се није могао заузети + + + + could not allocate audio encoding context + Контекст аудио кодирања се није могао заузети + + + + could not open output audio encoder (%1) + Излаз аудио кодера се није могао отворити (%1) + + + + could not copy audio encoder parameters to output stream (%1) + Параметри аудио кодера се нису могли копирати у излазни ток (%1) + + + + could not allocate audio buffer (%1) + Аудио међуспремник се није могао заузети (%1) + + + + could not create output format context + Контекст излазног формата се није могао створити + + + + could not open output file (%1) + Излазна датотека се није могла отворити (%1) + + + + could not write output file header (%1) + Заглавље излазне датотеке се није могло исписати (%1) + + + + could not write output file trailer (%1) + Подножје излазне датотеке се није могло исписати (%1) + + + + FillLeftRightEffect + + + Type + Тип + + + + Fill Left with Right + Попуни лево са десним + + + + Fill Right with Left + Попуни десно са левим + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Учитавање Frei0r додатка није успело "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + ПАЖЊА: Ви не можете учитавати 32-битне Frei0r додатке у 64-битно издање Olive-a. Молимо нађите 64-битно издање ових додатака, или пређите на 32-битно издање Olive-а. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + ПАЖЊА: Ви не можете учитавати 64-битне Frei0r додатке у 32-битно издање Olive-a. Молимо нађите 32-битно издање ових додатака, или пређите на 64-битно издање Olive-а. + + + + Error loading Frei0r plugin + Грешка при учитавању Frei0r додатака + + + + GraphEditor + + + Graph Editor + Уређивач графикона + + + + Linear + Линеарно + + + + Bezier + Bezier + + + + Hold + Држи + + + + GraphView + + + Zoom to Selection + Повећај ка одабиру + + + + Zoom to Show All + Повећај ка свему + + + + Reset View + Врати првобитни приказ + + + + InterlacingName + + + None (Progressive) + Нема (прогресивно) + + + + Top Field First + Горње поље прво + + + + Bottom Field First + Доње поље прво + + + + Invalid + Неважеће + + + + KeyframeNavigator + + + Enable Keyframes + Омогући кључне кадрове + + + + KeyframeView + + + Linear + Линеарно + + + + Bezier + Bezier + + + + Hold + Држи + + + + LabelSlider + + + &Edit + + + + + &Reset to Default + + + + + + Set Value + Одреди вредност + + + + + New value: + Нова вредност: + + + + LoadDialog + + + Loading... + Учитавање... + + + + Loading '%1'... + Учитавање "%1"... + + + + Cancel + Прекини + + + + LoadThread + + + Version Mismatch + Верзије се не поклапају + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Овај проекат је био спашен у другачијој верзији Olive-а и могуће је да није у потпуности компатибилан са овом берзијом. Да ли још увек желите пробати учитати проекат? + + + + Invalid Clip Link + Неважећа веза снимке + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Овај проекат садржи неважећу везу снимке. Могуће је да је коруптиран. Да ли бисте хтели да га наставите учитавати? + + + + %1 - Line: %2 Col: %3 + %1 - Ред: %2 Колона: %3 + + + + User aborted loading + Корисник је прекинуо учитавање + + + + XML Parsing Error + Грешка у парсирању XML-а + + + + Couldn't load '%1'. %2 + "%1": %2 се није могло учитати + + + + Project Load Error + Грешка при учитавању проекта + + + + Error loading project: %1 + Грешка при учитавању проекта: %1 + + + + MainWindow + + + Welcome to %1 + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Clear Recent List + + + + + Open Recent + + + + + &Save Project + + + + + Save Project &As + + + + + &Import... + + + + + &Export... + + + + + E&xit + + + + + &Edit + + + + + &Undo + + + + + Redo + + + + Cu&t + &Режи + + + &Paste + &Залепи + + + + Select &All + + + + + Deselect All + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Track Lines + + + + + Rectified Waveforms + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Title/Action Safe Area + + + + + Off + + + + + Default + + + + + 4:3 + + + + + 16:9 + + + + + Custom + + + + + Full Screen + + + + + Full Screen Viewer + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + + + Loop + + + + + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + Уређивач графикона + + + + Media Viewer + + + + + Sequence Viewer + + + + + Maximize Panel + + + + + Lock Panels + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Auto-Cut Silence + + + + + No Auto-Scroll + + + + + Page Auto-Scroll + + + + + Smooth Auto-Scroll + + + + + Preferences + + + + + Clear Undo + + + + + &Help + + + + + A&ction Search + + + + + Debug Log + Запис за дебугирање + + + + &About... + + + + + <untitled> + <неименовано> + + + + Marker + + + Set Marker + + + + + Set clip marker name: + + + + + Set sequence marker name: + + + + + Media + + + New Folder + + + + + Name: + + + + + Filename: + + + + + Video Dimensions: + + + + + Frame Rate: + Оквирна стопа: + + + + %1 field(s) (%2 frame(s)) + + + + + Interlacing: + + + + + Audio Frequency: + + + + + Audio Channels: + + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + + + + + Name + + + + + Duration + + + + + Rate + + + + + MediaPropertiesDialog + + + "%1" Properties + + + + + Tracks: + + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + + + + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + + + + + Auto (%1) + + + + + Interlacing: + + + + + Name: + + + + + MenuHelper + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Set In Point + + + + + Set Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Cu&t + &Режи + + + + Cop&y + + + + + + &Paste + &Залепи + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Invalid aspect ratio + + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + + + NewSequenceDialog + + + Editing "%1" + + + + + New Sequence + + + + + Preset: + + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + + + + + Video + Видео + + + + Width: + Ширина: + + + + Height: + Висина: + + + + Frame Rate: + Оквирна стопа: + + + + Pixel Aspect Ratio: + + + + + Square Pixels (1.0) + + + + + Interlacing: + + + + + None (Progressive) + Нема (прогресивно) + + + + Audio + Аудио + + + + Sample Rate: + + + + + Name: + + + + + OliveGlobal + + + Olive Project %1 + + + + + Auto-recovery + + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + + + + + Open Project... + + + + + Missing recent project + + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + + + + + Save Project As... + + + + + Unsaved Project + + + + + This project has changed since it was last saved. Would you like to save it before closing? + + + + + No active sequence + + + + + Please open the sequence to perform this action. + + + + + No clips selected + + + + + Select the clips you wish to auto-cut + + + + + Missing Project File + + + + + Specified project '%1' does not exist. + + + + + PanEffect + + + Pan + + + + + PreferencesDialog + + + Preferences + + + + + Default Sequence + + + + + Invalid CSS File + + + + + CSS file '%1' does not exist. + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + Browse for CSS file + + + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + + Language: + + + + + Default Sequence Settings + + + + + Add Default Effects to New Clips + + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + + + + + Hold CTRL to toggle this setting + + + + + Invert Timeline Scroll Axes + + + + + Enable Drag Files to Timeline + + + + + Auto-Scale By Default + + + + + Auto-Seek to Imported Clips + + + + + Audio Scrubbing + + + + + Drop Files on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + + + + + Appearance + + + + + Theme + + + + + Olive Dark (Default) + + + + + Olive Light + + + + + Native + + + + + Native (Light Icons) + + + + + Use Native Menu Styling + + + + + Custom CSS: + + + + + Browse + + + + + Image sequence formats: + + + + + Audio Recording: + + + + + Mono + Моно + + + + Stereo + Стерео + + + + Effect Textbox Lines: + + + + + Thumbnail Resolution: + + + + + Waveform Resolution: + + + + + Delete Previews + + + + + Use Software Fallbacks When Possible + + + + + General + + + + + Behavior + + + + + Memory Usage + + + + + Upcoming Frame Queue: + + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + + + + + Playback + + + + + Output Device: + + + + + + Default + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio + Аудио + + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Keyboard + + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + + + + + Could not open file - %1 + + + + + Could not find stream information - %1 + + + + + Project + + + New + + + + + Open Project + + + + + Save Project + + + + + Undo + + + + + Redo + + + + + Tree View + + + + + Icon View + + + + + List View + + + + + Search media, markers, etc. + + + + + Project + + + + + Sequence + + + + + Replace '%1' + + + + + + All Files + + + + + + No active sequence + + + + + No sequence is active, please open the sequence you want to replace clips from. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + + + + + Rename '%1' + + + + + Enter new name: + + + + + Delete media in use? + + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + + + + + Skip + + + + + Import a Project + + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + + + + + Image sequence detected + + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + + + + + Import media... + + + + + No sequence is active, please open the sequence you want to delete clips from. + + + + + ProxyDialog + + + Create Proxy + + + + + Proxy + + + + + Dimensions: + + + + + Same Size as Source + + + + + Half Resolution (1/2) + + + + + Quarter Resolution (1/4) + + + + + Eighth Resolution (1/8) + + + + + Sixteenth Resolution (1/16) + + + + + Format: + Формат: + + + + ProRes HQ + + + + + Location: + + + + + Same as Source (in "%1" folder) + + + + + Proxy file exists + + + + + The file "%1" already exists. Do you wish to replace it? + + + + + Custom Location + + + + + ProxyGenerator + + + Finished generating proxy for "%1" + + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + + + + + Select which media you want to replace this media's clips with: + + + + + Keep the same media in-points + + + + + Replace + + + + + Cancel + Прекини + + + + No media selected + + + + + Please select a media to replace with or click 'Cancel'. + + + + + Same media selected + + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + + + + + Folder selected + + + + + You cannot replace footage with a folder. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself. + + + + + RichTextEffect + + + Text + + + + + Padding + + + + + Position + + + + + Vertical Align: + + + + + Top + + + + + Center + + + + + Bottom + + + + + Auto-Scroll + + + + + Off + + + + + Up + + + + + Down + + + + + Left + + + + + Right + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Angle + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sequence + + + %1 (copy) + + + + + ShakeEffect + + + Intensity + + + + + Rotation + + + + + Frequency + + + + + SolidEffect + + + Type + Тип + + + + Solid Color + + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + + + + + Color + + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + + + + + New + + + + + View + + + + + Tree View + + + + + Icon View + + + + + Show Toolbar + + + + + Show Sequences + + + + + Replace/Relink Media + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Replace Clips Using This Media + + + + + Create Sequence With This Media + + + + + Duplicate + + + + + Delete All Clips Using This Media + + + + + Proxy + + + + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + + Create Proxy + + + + + Modify Proxy + + + + + Restore Original + + + + + Delete + + + + + Preview in Media Viewer + + + + + Properties... + + + + + Replace Media + + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + + + + SpeedDialog + + + Speed/Duration + + + + + Speed: + + + + + Frame Rate: + Оквирна стопа: + + + + Duration: + + + + + Reverse + + + + + Maintain Audio Pitch + + + + + Ripple Changes + + + + + TextEditDialog + + + Edit Text + + + + + Thin + + + + + Extra Light + + + + + Light + + + + + Normal + + + + + Medium + + + + + Demi Bold + + + + + Bold + + + + + Extra Bold + + + + + Black + + + + + TextEditEx + + + Edit Text + + + + + &Edit Text + + + + + TextEffect + + + Text + + + + + Font + + + + + Size + + + + + Color + + + + + Alignment + + + + + Left + + + + + + Center + + + + + Right + + + + + Justify + + + + + Top + + + + + Bottom + + + + + Word Wrap + + + + + Padding + + + + + Position + + + + + Outline + + + + + Outline Color + + + + + Outline Width + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Angle + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sample Text + + + + + TimecodeEffect + + + Timecode + + + + + Sequence + + + + + Media + + + + + Scale + + + + + Color + + + + + Background Color + + + + + Background Opacity + + + + + Offset + + + + + Prepend + + + + + Timeline + + + Nested Sequence + + + + + Timeline: + + + + + Effect already exists + + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + + + + + Add + + + + + Replace + + + + + Skip + + + + + Do this for all conflicts found + + + + + Title... + + + + + Solid Color... + + + + + Bars... + + + + + Tone... + + + + + Noise... + + + + + Unsaved Project + + + + + You must save this project before you can record audio in it. + + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + + + + + (none) + (нема) + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Snapping + + + + + Zoom In + + + + + Zoom Out + + + + + Record audio + + + + + Add title, solid, bars, etc. + + + + + TimelineHeader + + + Center Timecodes + + + + + TimelineWidget + + + &Undo + + + + + &Redo + + + + &Paste + &Залепи + + + + Sequence Settings + + + + + &Speed/Duration + + + + + &Reveal in Project + + + + + %1 +Start: %2 +End: %3 +Duration: %4 + + + + + R&ipple Delete Empty Space + + + + + Auto-Cut Silence + + + + + Auto-S&cale + + + + + Properties + + + + + Error + + + + + Couldn't locate media wrapper for sequence. + + + + + Title + + + + + Solid Color + + + + + Bars + + + + + Tone + + + + + Noise + + + + + Duration: + + + + + ToneEffect + + + Type + Тип + + + + Sine + + + + + Frequency + + + + + Amount + Количина + + + + Mix + Микс + + + + TransformEffect + + + Position + + + + + Scale + + + + + Uniform Scale + + + + + Rotation + + + + + Anchor Point + + + + + Opacity + + + + + Blend Mode + + + + + Normal + + + + + Transition + + + Length + + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + + + + + VSTHost + + + + Error loading VST plugin + + + + + Failed to load VST plugin "%1": %2 + + + + + Failed to locate entry point for dynamic library. + + + + + VST Error + + + + + Plugin's magic number is invalid + + + + + Plugin + + + + + Interface + + + + + Show + + + + + VST Plugin + + + + + Viewer + + + Sequence Viewer + + + + + Media Viewer + + + + + (none) + (нема) + + + + Drag video only + + + + + Drag audio only + + + + + ViewerWidget + + + Save Frame as Image... + + + + + Show Fullscreen + + + + + Disable + + + + + Screen %1: %2x%3 + + + + + Zoom + + + + + Fit + + + + + Custom + + + + + Close Media + + + + + Save Frame + + + + + Viewer Zoom + + + + + Set Custom Zoom Value: + + + + + ViewerWindow + + + Exit Fullscreen + + + + + VoidEffect + + + (unknown) + + + + + Missing Effect + + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + diff --git a/app/ts/tr_TR.ts b/app/ts/tr_TR.ts new file mode 100644 index 000000000..461c962ea --- /dev/null +++ b/app/ts/tr_TR.ts @@ -0,0 +1,3813 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive doğrusal olmayan bir video editörüdür. Bu yazılım GNU GPL tarafından ücretsiz ve korunmaktadır. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive Takımı, kullanıcılara Olive kaynak kodunun web sitesinden indirilmek üzere kullanılabilir olduğunu bildirmek zorundadır. + + + + ActionSearch + + + Search for action... + İşlem Ara... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Gelişmiş Video Ayarları + + + + Pixel Format: + Piksel Biçimi: + + + + Threads: + İş Parçacığı: + + + + Audio + + + %1 Audio + rafine + %1 Ses + + + + Recording %1 + Kayıt %1 + + + + AudioNoiseEffect + + + Amount + Miktar + + + + Mix + Karıştır + + + + AutoCutSilenceDialog + + + Cut Silence + Sessizlik + + + + Attack Threshold: + Hamleyi Eşitle: + + + + Attack Time: + Hamle Tarihi: + + + + Release Threshold: + Sürüm Eşik: + + + + Release Time: + Sürüm Tarihi: + + + + Cacher + + + + Could not open %1 - %2 + Dosya açılamadı %1 - %2 + + + + ChannelLayoutName + + + Invalid + Rafine + Yanlış + + + + Mono + Моno + + + + Stereo + Stereo + + + + ClipPropertiesDialog + + + "%1" Properties + Rafine + Ayarlar "%1" + + + + Multiple Clip Properties + Rafine + Çoklu klip parametreleri + + + + Name: + Ad: + + + + Duration: + Uzunluk: + + + + (multiple) + rafine + (çoklu) + + + + CollapsibleWidget + + + <untitled> + <Adsız> + + + + ColorButton + + + Set Color + Renk Tanımla + + + + CornerPinEffect + + + Top Left + Sol Üst + + + + Top Right + Sağ Üst + + + + Bottom Left + Sol Alt + + + + Bottom Right + Sağ Alt + + + + Perspective + Perspektif + + + + DebugDialog + + + Debug Log + Hata Ayıklama Günlüğü + + + + DemoNotice + + + + Welcome to Olive! + Olive'e Hoşgeldiniz! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive, GNU GPL kapsamında yayınlanan ücretsiz bir açık kaynaklı video editörüdür. Bu yazılımın parasını ödediyseniz, kandırılmış olursunuz. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Bu yazılım ALFA aşamasında, hatalar ve eksik özelliklere sahip kararsız ve çökmesine çok muhtemel olduğu anlamına gelir.Hiçbir garanti sunmuyoruz, bu yüzden kendi sorumluluğunuzda kullanın. Lütfen %1 adresindeki hata veya özellik isteklerini bildirin + + + + Thank you for trying Olive and we hope you enjoy it! + Olive'i denediğiniz için teşekkür ederiz ve beğeneceğinizi umuyoruz! + + + + Effect + + + Invalid effect + Geçersiz efekt + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + Etki için aday yok '%1'. Bu etki bozulmuş olabilir. Yeniden kurmayı ya da Olive'i deneyin. + + + + Save Effect Settings + Efekt Ayarlarını Kaydet + + + + + Effect XML Settings %1 + Efekt XML Ayarları %1 + + + + Save Settings Failed + Ayarları Kaydetme Başarısız + + + + Failed to open "%1" for writing. + Açılamadı "%1" yazmak için. + + + + Load Effect Settings + Efekt Ayarlarını Yükle + + + + + Load Settings Failed + Yükleme Ayarları Başarısız Oldu + + + + Failed to open "%1" for reading. + Açılamadı "%1" Okumak için. + + + + This settings file doesn't match this effect. + Bu ayar dosyası doesn't bu efekt ile eşleşmiyor + + + + EffectControls + + + (none) + (пусто) + + + + Effects: + Efekt: + + + + Add Video Effect + Video Efekti Ekle + + + + VIDEO EFFECTS + VİDEO EFEKT + + + + Add Video Transition + Video Geçişi Ekle + + + + Add Audio Effect + Ses Efekti Ekleme + + + + AUDIO EFFECTS + SES EFEKTİ + + + + Add Audio Transition + Ses Geçişi Ekle + + + + EffectRow + + + Disable Keyframes + Anahtar Kareleri Devre Dışı Bırak + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Anahtar kareleri devre dışı bırakmak geçerli tüm anahtar kareleri siler. Bunu yapmak istediğinden emin misin? + + + + EfektUI + + + %1 (Opening) + rafine + %1 (Açılış) + + + + %1 (Closing) + rafine + %1 (Kapanış) + + + + %1 (multiple) + rafine + %1 (çoklu) + + + + Cu&t + Sen&kestin + + + + &Copy + &Kopya + + + + Move &Up + Yukarı &Taşı + + + + Move &Down + Aşağı &Taşı + + + + D&elete + S&il + + + + Load Settings From File + Ayarları Dosyadan Yükle + + + + Save Settings to File + Ayarları Dosyaya Kaydet + + + + EmbeddedFileChooser + + + File: + Dosya: + + + + İhraçDiyalog + + + Export "%1" + İhraç "%1" + + + + Unknown codec name %1 + Bilinmeyen kodlayıcı adı %1 + + + + Export Failed + Dışa Aktarma Başarısız Oldu + + + + Export failed - %1 + Dışa aktarma başarısız oldu - %1 + + + + Invalid dimensions + Geçersiz boyutlar + + + + Export width and height must both be even numbers/divisible by 2. + İhracat genişliğinin ve yüksekliğinin her ikisi ikinci sayılar/bölünebilir olmalıdır. + + + + Invalid codec + Geçersiz kodek + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Seçilen kod çözücünün çıktı parametrelerini belirleyemedi. Bu bir hatadır, lütfen geliştiricilere başvurun.. + + + + Invalid format + Geçersiz format + + + + Couldn't determine output format. This is a bug, please contact the developers. + Çıkış formatı belirlenemiyor. Bu bir hata, geliştiricilerle irtibata geçiniz. + + + + Export Media + Rafine + Medyayı Dışa Aktar + + + + %p% (Total: %1:%2:%3) + Rafine + %p% (Toplam: %1:%2:%3) + + + + %p% (ETA: %1:%2:%3) + %p% (Durdu: %1:%2:%3) + + + + Quality-based (Constant Rate Factor) + Rafine + Kalite (Sabit Hız Faktörü) + + + + Constant Bitrate + Sabit bit hızı + + + + + Invalid Codec + Geçersiz Codec + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Bu codec bileşeni için uygun bir kodlayıcı bulunamadı. İhracat muhtemelen başarısız olacak. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Bu kodlayıcı için piksel formatı bulunamadı. İhracat muhtemelen başarısız olacak. + + + + Bitrate (Mbps): + Akış hızı (Мбіт/с): + + + + Quality (CRF): + Kalite (CRF): + + + + Kalite Faktörü: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Kalite Katsayısı: + +0 = без втрат +17-18 = візульно без втрат (стиснуто, але майже непомітно) +23 = висока якість +51 = найнижча можлива якість + + + + Target File Size (MB): + Hedef Dosya Boyutu (MB): + + + + Format: + Biçim: + + + + Range: + Menzil: + + + + Entire Sequence + Tam Sıra + + + + In to Out + Girişten Çıkışa + + + + Video + Video + + + + + Codec: + Kodek: + + + + Width: + Genişlik: + + + + Height: + Yükseklik: + + + + Frame Rate: + Kare Hızı: + + + + Compression Type: + Sıkıştırma Tipi: + + + + Advanced + Gelişmiş + + + + Audio + Ses + + + + Sampling Rate: + Örnekleme oranı: + + + + Bitrate (Kbps/CBR): + Bit hızı (Kbps/CBR): + + + + İhraçThread + + + failed to send frame to encoder (%1) + kodlayıcıya çerçeve gönderilemedi (%1) + + + + failed to receive packet from encoder (%1) + kodlayıcıdan paket alınamadı (%1) + + + + could not video encoder for %1 + için video kodlayıcı açılamadı %1 + + + + could not allocate video stream + video akışı ayrılamadı + + + + could not allocate video encoding context + video kodlama içeriği ayrılamadı + + + + could not open output video encoder (%1) + çıkış video kodlayıcı açılamadı (%1) + + + + could not copy video encoder parameters to output stream (%1) + video kodlayıcı parametreleri çıktı akışına kopyalanamadı (%1) + + + + could not audio encoder for %1 + için ses kodlayıcı açılamadı %1 + + + + could not allocate audio stream + ses akışı ayrılamadı + + + + could not allocate audio encoding context + ses kodlama içeriği ayrılamadı + + + + could not open output audio encoder (%1) + çıkış ses kodlayıcı açılamadı (%1) + + + + could not copy audio encoder parameters to output stream (%1) + ses kodlayıcı parametreleri çıktı akışına kopyalanamadı (%1) + + + + could not allocate audio buffer (%1) + ses arabelleği ayrılamadı (%1) + + + + could not create output format context + çıktı formatı bağlamı oluşturulamadı + + + + could not open output file (%1) + çıktı dosyası açılamadı (%1) + + + + could not write output file header (%1) + çıktı dosyası başlığı yazamadı (%1) + + + + could not write output file trailer (%1) + rafine + çıktı dosyası fragmanını yazamadı (%1) + + + + SolSağEfektiDoldurun + + + Type + Tür + + + + Fill Left with Right + Sağa Sola Doldur + + + + Fill Right with Left + Sağdaki kanalı Sola doğru doldur + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Frei0r eklentisi yüklenemedi "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + NOT: 32-bit Frei0r eklentilerini 64-bit Olive inşa edemezsiniz. Lütfen bu eklentinin 64 bit sürümünü bulun veya 32 bit Olive ürününe geçin. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + NOT: 64-bit Frei0r eklentilerini 32-bit Olive'de indiremezsiniz. Bu eklentinin 64 bit sürümünü bulun veya Olive'in 64 bit sürümünü yükleyin. + + + + Error loading Frei0r plugin + Frei0r eklentisi yüklenirken hata oluştu + + + + GraphEditor + + + Graph Editor + Grafik Editörü + + + + Linear + Doğrusal + + + + Bezier + Bezier + + + + Hold + Rafine + Oldu + + + + GraphView + + + Zoom to Selection + Seçime Yakınlaştır + + + + Zoom to Show All + Ölçekle ve her şeyi göster + + + + Reset View + Görünümü Sıfırla + + + + InterlacingName + + + None (Progressive) + Merhaba (İlerleyen) + + + + Top Field First + İlk önce üst alan + + + + Bottom Field First + Önce Alt Alan + + + + Invalid + Geçersiz + + + + KeyframeNavigator + + + Enable Keyframes + Anahtar Kareleri Etkinleştir + + + + KeyframeView + + + Linear + Doğrusal + + + + Bezier + Bezier + + + + Hold + Rafine + Oldu + + + + LabelSlider + + + &Edit + &Düzenle + + + + &Reset to Default + rafine + &Varsayılana sıfırla + + + + + Set Value + Değeri Ayarla + + + + + New value: + Yeni değer: + + + + LoadDialog + + + Loading... + Yüklüyor... + + + + Loading '%1'... + Yüklüyor '%1'... + + + + Cancel + rafine + İptal + + + + LoadThread + + + Version Mismatch + Sürüm uyuşmazlığı + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Bu proje Olive'in farklı bir sürümünde kaydedildi ve bu sürümle tam olarak uyumlu olmayabilir. Yine de yüklemeyi denemek ister misiniz? + + + + Invalid Clip Link + Geçersiz Klip Bağlantısı + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Bu proje geçersiz bir klip bağlantısı içeriyor. Bozulabilir. Yüklemeye devam etmek ister misiniz? + + + + %1 - Line: %2 Col: %3 + %1 - Sıra: %2 Kolon: %3 + + + + User aborted loading + Kullanıcı iptal edildi + + + + XML Parsing Error + XML Ayrıştırma Hatası + + + + Couldn't load '%1'. %2 + Yüklenemdi '%1'. %2 + + + + Project Load Error + Proje Yükleme Hatası + + + + Error loading project: %1 + Proje yüklenirken hata oluştu: %1 + + + + MainWindow + + + Welcome to %1 + Hoşgeldiniz %1 + + + + &File + &Dosya + + + + &New + &Yeni + + + + &Open Project + &Proje Aç + + + + Clear Recent List + Geçmişi temizle + + + + Open Recent + Son Aç + + + + &Save Project + &Projeyi Kaydet + + + + Save Project &As + Projeyi Farklı &Kaydet + + + + &Import... + &Dışa aktar... + + + + &Export... + &İhraç... + + + + E&xit + Çı&kış + + + + &Edit + &Düzenle + + + + &Undo + &Geri al + + + + Redo + Yinele + + + + Select &All + Tümünü &Seç + + + + Deselect All + Hiçbirini seçme + + + + Ripple to In Point + Giriş noktasına taşı + + + + Ripple to Out Point + Çıkış noktasına taşı + + + + Edit to In Point + Giriş noktasına Düzenle + + + + Edit to Out Point + Çıkış Noktasına göre Düzenle + + + + Delete In/Out Point + Giriş/Çıkış Noktasını Silin + + + + Ripple Delete In/Out Point + Dalgalanma Silme Giriş/Çıkış Noktası + + + + Set/Edit Marker + İşaretleyiciyi Kur/Düzenle + + + + &View + &Görünüm + + + + Zoom In + Yakınlaştır + + + + Zoom Out + Uzaklaştır + + + + Increase Track Height + İz Yüksekliğini Artır + + + + Decrease Track Height + Parça Yüksekliğini Azalt + + + + Toggle Show All + rafine + Tümünü Göster'e Geçiş Yap + + + + Track Lines + İz Hatları + + + + Rectified Waveforms + Alt Dalga Şekli + + + + Frames + Çerçeve + + + + Drop Frame + Başlangıç Çerçevesi + + + + Non-Drop Frame + Alt Düşmeyen Çerçeve + + + + Milliseconds + Milisaniyeler + + + + Title/Action Safe Area + rafine + Güvenli Başlık/Aksiyon Alan + + + + Off + Kapalı + + + + Default + Varsayılan + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + Özel + + + + Full Screen + Tam Ekran Modu + + + + Full Screen Viewer + Tam Ekran Görüntüleyici Modunda + + + + &Playback + Yeniden&Oynat + + + + Go to Start + Başlaş Git + + + + Previous Frame + Önceki Çerçeve + + + + Play/Pause + Oynat/Durdur + + + + Play In to Out + Dışarıda Oynat + + + + Next Frame + Sonraki Çerçeve + + + + Go to End + Sona Git + + + + Go to Previous Cut + Önceki bölüme git + + + + Go to Next Cut + Snraki bölüme git + + + + Go to In Point + Giriş noktasına git + + + + Go to Out Point + Çıkış noktasına git + + + + Shuttle Left + rafine + Hız Azaltma + + + + Shuttle Stop + rafine + Durma + + + + Shuttle Right + rafine + Hızını arttır + + + + Loop + rafine + Döngü tekrarlayın + + + + &Window + &Pencere + + + + Project + Proje + + + + Effect Controls + Efekt Kontrolleri + + + + Timeline + Montaj Masası + + + + Graph Editor + Grafik Editörü + + + + Media Viewer + rafine + Medya Dosyası Tarayıcısı + + + + Sequence Viewer + rafine + Sıra Görüntüleyici + + + + Maximize Panel + Paneli Büyüt + + + + Lock Panels + Paneli Kilitle + + + + Reset to Default Layout + Panel'i Varsayılan Düzen'e Sıfırla + + + + &Tools + &Araçlar + + + + Pointer Tool + rafine + İşaretçi Aracı + + + + Edit Tool + Düzenleme Aracı + + + + Ripple Tool + Makas ve Montaj Aracı + + + + Razor Tool + Budama + + + + Slip Tool + Kaydırma Aracı + + + + Slide Tool + Kaydırma + + + + Hand Tool + rafine + Yol Bulma Aracı + + + + Transition Tool + Geçiş + + + + Enable Snapping + Yapıştırmayı Etkinleştir + + + + Auto-Cut Silence + Otomatik Kesim Sessizliği + + + Selecting Also Seeks + Kaydırma ile seçim + + + Edit Tool Also Seeks + rafine + Kaydırma ile seçim + + + Edit Tool Selects Links + Seçim, bağlantıları seçer + + + Seek Also Selects + Ayrıca Arayın + + + Seek to the End of Pastes + Eklerin sonuna gidin + + + Scroll Wheel Zooms + rafine + Fare tekerleği montaj tablasını ölçeklendirir + + + Hold CTRL to toggle this setting + Bu ayarı değiştirmek için CTRL tuşunu basılı tutun + + + Invert Timeline Scroll Axes + rafine + Zaman Çizelgesi Kaydırma Eksenlerini Ters Çevir + + + Enable Drag Files to Timeline + rafine + Sürükle Dosyaları Zaman Çizelgesi'ne Etkinleştir + + + Auto-Scale By Default + Varsayılan Olarak Otomatik Ölçeklendir + + + Enable Seek to Import + rafine + Alınacak Arama'yı Etkinleştir + + + Audio Scrubbing + Kaydırırken ses çal + + + Enable Drop on Media to Replace + Уточнити + Değiştirilecek Medyada Bırakmayı Etkinleştir + + + Enable Hover Focus + Odağı Aç + + + Ask For Name When Setting Marker + İşaretleyiciyi Ayarlarken Ad İste + + + + No Auto-Scroll + Otomatik Kaydırma Yok + + + + Page Auto-Scroll + Sayfa Otomatik Kaydırma + + + + Smooth Auto-Scroll + Düzgün Otomatik Kaydırma + + + + Preferences + Ayarlar + + + + Clear Undo + Değişikliklerin geçmişini temizle + + + + &Help + &Yardım + + + + A&ction Search + Et&kin Arama + + + + Debug Log + Hata ayıklama günlüğü + + + + &About... + &Program Hakkında... + + + + <untitled> + <başlıksız> + + + + Marker + + + Set Marker + İşaretçiyi ayarla + + + + Set clip marker name: + Klip İşaretçisi Adı: + + + + Set sequence marker name: + Sıra işaretleyicisinin adını ayarla: + + + + Media + + + New Folder + Yeni Dosya + + + + Name: + Ad: + + + + Filename: + Dosyaadı: + + + + Video Dimensions: + Video Boyutları: + + + + Frame Rate: + Kare Hızı: + + + + %1 field(s) (%2 frame(s)) + rafine + alanlar: %1 (çerçeveler: %2) + + + + Interlacing: + Tarama: + + + + Audio Frequency: + Ses Frekansı: + + + + Audio Channels: + Ses Kanalı: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Ad: %1 +Video Boyutu: %2x%3 +Kare Hızı: %4 +Ses Frekansı: %5 +Ses Kanalları: %6 + + + + Name + Ad + + + + Duration + Süre + + + + Rate + Oran + + + + MediaPropertiesDialog + + + "%1" Properties + Sahne Özellikleri "%1" + + + + Tracks: + İzler: + + + + Video %1: %2x%3 %4FPS + Video %1: %2x%3 %4FPS + + + + Audio %1: %2Hz %3 + Ses %1: %2Hz %3 + + + + %n channel(s) + + %n kanal + %n kanallar + %n kanallar + + + + + Conform to Frame Rate: + Kare Hızına Uygunluk: + + + + Alpha is Premultiplied + rafine + Alfa, Önceden Gerçekleştirildi + + + + Auto (%1) + Otomatik (%1) + + + + Interlacing: + Geçmeli Tarama: + + + + Name: + Ad: + + + + MenuHelper + + + &Project + &Proje + + + + &Sequence + &Sıra + + + + &Folder + &Dosya + + + + Set In Point + Giriş Noktasını Ayarla + + + + Set Out Point + Çıkış Noktasını Ayarla + + + + Reset In Point + Giriş noktasını sıfırla + + + + Reset Out Point + Çıkış Noktasını Sıfırla + + + + Clear In/Out Point + Giriş/Çıkış Noktasını Temizle + + + + Add Default Transition + Varsayılan Geçiş Ekle + + + + Link/Unlink + Bağlantı/Bağlantıyı Kes + + + + Enable/Disable + Etkin/Devredışı + + + + Nest + Yuvarla + + + + Cu&t + Kes&s + + + + Cop&y + K&opya + + + + + &Paste + &Yapıştır + + + + Paste Insert + rafine + Yapıştır Ekle + + + + Duplicate + Yinele + + + + Delete + Sil + + + + Ripple Delete + Dalgacığı Sil + + + + Split + Böl + + + + Invalid aspect ratio + Geçersiz en boy oranı + + + + The aspect ratio '%1' is invalid. Please try again. + En boy oranı '%1' geçersizdir. Lütfen tekrar deneyin. + + + + Enter custom aspect ratio + Özel en boy oranını girin + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Başlık/işlem güvenli alanı için kullanılacak en boy oranını girin (misal, 16:9): + + + + NewSequenceDialog + + + Editing "%1" + Kurgu "%1" + + + + New Sequence + Yeni Sıra + + + + Preset: + Уточнити + Önayar: + + + + Film 4K + Film 4К + + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + Özel + + + + Video + Video + + + + Width: + Genişlik: + + + + Height: + Yükseklik: + + + + Frame Rate: + Kare Hızı: + + + + Pixel Aspect Ratio: + Piksel en boy oranı: + + + + Square Pixels (1.0) + Kare Piksel (1.0) + + + + Interlacing: + Karıştır: + + + + None (Progressive) + Merhaba (ilerleyen) + + + + Audio + Ses + + + + Sample Rate: + Aynı Oran: + + + + Name: + Ad: + + + + OliveGlobal + + + Olive Project %1 + Olive Proje %1 + + + + Auto-recovery + Otomatik-kurtarma + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive düzgün kapanmadı veya çöktü ve otomatik kurtarma dosyası buldu. Açmak istermisin? + + + + Open Project... + Proje Aç... + + + + Missing recent project + Son Proje Eksik + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Proje '%1' artık yok. Son projeler listesinden kaldırmak ister misiniz? + + + + Save Project As... + Projeyi farklı kaydet... + + + + Unsaved Project + Kaydedilmemiş Proje + + + + This project has changed since it was last saved. Would you like to save it before closing? + Bu proje son kurtarıldığından bu yana değişti. Kapatmadan önce kaydetmek ister misiniz? + + + + No active sequence + Aktif dizi yok + + + + Please open the sequence to perform this action. + Lütfen bu işlemi gerçekleştirmek için sırayı açın. + + + + No clips selected + Seçili klip yok + + + + Select the clips you wish to auto-cut + rafine + Otomatik kesmek istediğiniz klipleri seçin + + + Please open the sequence you wish to export. + Lütfen dışa aktarmak istediğiniz sırayı açın. + + + + Missing Project File + Eksik Proje Dosyası + + + + Specified project '%1' does not exist. + Belirtilen '%1' proje yok. + + + + PanEffect + + + Pan + rafine + Panorama + + + + PreferencesDialog + + + Preferences + Ayarlar + + + + Default Sequence + Varsayılan Sıra + + + + Invalid CSS File + Geçersiz CSS Dosyası + + + + CSS file '%1' does not exist. + CSS dosyası '%1' yok. + + + + Confirm Reset All Shortcuts + Tüm Kısayolları Sıfırlamayı Onayla + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Tüm klavye kısayollarını varsayılan ayarlarına sıfırlamak istediğinizden emin misiniz? + + + + Import Keyboard Shortcuts + Klavye Kısayollarını İçe Aktar + + + + + Error saving shortcuts + Kısayollar kaydedilirken hata oluştu + + + + Failed to open file for reading + Dosya okumak için açılamadı + + + + Export Keyboard Shortcuts + Klavye Kısayollarını Dışa Aktar + + + + Export Shortcuts + Kısayolları Dışa Aktar + + + + Shortcuts exported successfully + Kısayollar başarıyla verildi + + + + Failed to open file for writing + Dosya yazma için açılamadı + + + + Browse for CSS file + CSS dosyasına göz atın + + + + Delete All Previews + Tüm Önizlemeleri Sil + + + + Are you sure you want to delete all previews? + Tüm önizlemeleri silmek istediğinize emin misiniz? + + + + Previews Deleted + Önizlemeler Silindi + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + rafine + Tüm önizlemeler başarıyla silindi. Değişikliklerin geçerli olması için mevcut projenizi yeniden açmanız gerekebilir. + + + + Language: + Dil: + + + + Image sequence formats: + Görüntü sırası formatları: + + + + Thumbnail Resolution: + Küçük Resim Çözünürlüğü: + + + + Waveform Resolution: + Dalga biçimi çözünürlük: + + + + Delete Previews + Önizlemeleri Sil + + + + Use Software Fallbacks When Possible + Mümkün olduğunda yazılım uygulamasını kullanın + + + + Default Sequence Settings + Varsayılan Sıralama Ayarları + + + + General + Genel + + + + Behavior + Davranış + + + + Add Default Effects to New Clips + Yeni Kliplere Varsayılan Efektler Ekleme + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + Bir Sıranın Sonunda Oynarken Başlangıcı Otomatik Olarak Ara + + + + Selecting Also Seeks + Ayrıca Seçme + + + + Edit Tool Also Seeks + Düzenleme Aracında Aranıyor + + + + Edit Tool Selects Links + Düzenleme Aracı Bağlantıları Seçer + + + + Seek Also Selects + Ayrıca Arayınor + + + + Seek to the End of Pastes + Eklerin sonuna gidin açın + + + + Scroll Wheel Zooms + Kaydırma Tekerleği Yakınlaştırmaları + + + + Hold CTRL to toggle this setting + Bu ayarı değiştirmek için CTRL tuşunu basılı tutun + + + + Invert Timeline Scroll Axes + Zaman Çizelgesi Kaydırma Eksenlerini Ters Çevir + + + + Enable Drag Files to Timeline + rafine + Dosyaları sürükleyerek kurulum tablosuna etkinleştirin + + + + Auto-Scale By Default + Otomatik ölçeklendirme varsayılanı + + + + Auto-Seek to Imported Clips + Уточнити + Alınan Kliplere Otomatik Arama + + + + Audio Scrubbing + Kaydırırken ses çal + + + + Drop Files on Media to Replace + Уточнити + Medyada Değiştirilecek Dosyaları Bırak + + + + Enable Hover Focus + Vurgulu Odağı Etkinleştir + + + + Ask For Name When Setting Marker + İşaretleyiciyi Ayarlarken Ad İste + + + + Appearance + Görünüm + + + + Theme + Tema + + + + Olive Dark (Default) + Olive Kara (типово) + + + + Olive Light + Olive Hafif + + + + Native + rafine + Yerel + + + + Native (Light Icons) + Уточнити + Yerel (Hafif Simgeler) + + + + Use Native Menu Styling + rafine + Yerel Menü Stilini Kullan + + + + Custom CSS: + Özel CSS: + + + + Browse + rafine + Göz at + + + + Effect Textbox Lines: + Efekt Metin Kutusu Satırları: + + + Seeking + Konumlandırma + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + Doğru Arama +Her zaman doğru çerçeveyi göster (doğru çerçeve alındıkça görsel kısaca yavaşlayabilir) + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + Hızlı konumlandırma +Hızlı konumlandırma (belki yanlış çerçeve ekranı-oynatmayı etkilemez) + + + + Memory Usage + Hafıza kullanımı + + + + Upcoming Frame Queue: + Yaklaşan Çerçeve Kuyruğu: + + + + + frames + Çerçeve + + + + + seconds + saniye + + + + Previous Frame Queue: + Önceki Çerçeve Sırası: + + + + Playback + Yeniden Oynat + + + + Output Device: + Çıkış Cihazı: + + + + + Default + Varsayılan + + + + Input Device: + Giriş aygıtı: + + + + Sample Rate: + Aynı oran: + + + + Audio Recording: + Ses Kayıt: + + + + Mono + Mono + + + + Stereo + Stereo + + + + Audio + Ses + + + + Search for action or shortcut + İşlem veya kısayol ara + + + + Action + Faaliyet + + + + Shortcut + Klavye Kısayol + + + + Import + Dışa Aktar + + + + Export + İhraç + + + + Reset Selected + Seçileni Sıfırla + + + + Reset All + Tümünü Sıfırla + + + + Keyboard + Klavye Kısayolları + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + Geçerli herhangi bir video/ses akışı bulunamadı + + + + Could not open file - %1 + Dosya açılamadı — %1 + + + + Could not find stream information - %1 + Akış bilgisi bulunamadı — %1 + + + + Project + + + New + Yeni + + + + Open Project + Proje Aç + + + + Save Project + Projeyi Kaydet + + + + Undo + Geri Al + + + + Redo + Yinele + + + + Tree View + Ağaç Görünümü + + + + Icon View + Simge Görünümü + + + + List View + Liste Görünümü + + + + Search media, markers, etc. + Medya, işaretleyiciler vb. + + + + Project + Proje + + + + Sequence + Düzen + + + + Replace '%1' + Değiştir '%1' + + + + + All Files + Tüm Dosyalar + + + + + No active sequence + Etkin sıra yok + + + + No sequence is active, please open the sequence you want to replace clips from. + Hiçbir dizi etkin değil, lütfen klipleri değiştirmek istediğiniz sırayı açın.. + + + + Active sequence selected + Aktif sıra seçildi + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + rafine + Kendi içine bir dizi ekleyemezsiniz, bu nedenle bu ortamın hiçbir klibi bu sıralamada olmaz. + + + + Rename '%1' + Yeni ad ver '%1' + + + + Enter new name: + Yeni ad girin: + + + + Delete media in use? + rafine + Kullanılan medyayı sil? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + Medya '% 1'; şu anda '% 2' içinde kullanılmaktadır '%2'. Silme, dizideki tüm örnekleri siler. Bunu yapmak istediğinden emin misin? + + + + Skip + Atla + + + + Import a Project + Projeyi İçe Aktar + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" bir Olive proje dosyasıdır. Bu proje ile birleşecek. Devam etmek istiyor musun? + + + + Image sequence detected + Görüntü sırası algılandı + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + Dosya '%1' bir görüntü dizisinin parçası gibi görünüyor.. Bu şekilde ithal etmek ister misiniz? + + + + Import media... + Medyayı içe aktar... + + + + No sequence is active, please open the sequence you want to delete clips from. + Aktif dizi yok. Klipleri kaldırmak istediğiniz sırayı açın. + + + + ProxyDialog + + + Create Proxy + Vekil Oluştur + + + + Proxy + Vekil + + + + Dimensions: + Boyutlar: + + + + Same Size as Source + Kaynakla Aynı Boyut + + + + Half Resolution (1/2) + Yarısının Çözünürlüğü (1/2) + + + + Quarter Resolution (1/4) + Çeyrek Çözünürlük (1/4) + + + + Eighth Resolution (1/8) + Sekizinci Çözünürlük (1/8) + + + + Sixteenth Resolution (1/16) + Onaltıncı Çözünürlük (1/16) + + + + Format: + Biçim: + + + + ProRes HQ + ProRes HD + + + + Location: + Konum: + + + + Same as Source (in "%1" folder) + Kaynakla aynı (dosya "%1" içinde ) + + + + Proxy file exists + Vekil dosyası var + + + + The file "%1" already exists. Do you wish to replace it? + Dosya "%1" zaten var. Değiştirmek ister misiniz? + + + + Custom Location + Özel Konum + + + + ProxyGenerator + + + Finished generating proxy for "%1" + İçin tam bir vekil oluşturma "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Üzerindeki klipleri değiştir "%1" + + + + Select which media you want to replace this media's clips with: + Bu ortamın kliplerini hangi ortamla değiştirmek istediğinizi seçin: + + + + Keep the same media in-points + Aynı ortamı yerinde tutun + + + + Replace + Değiştir + + + + Cancel + İptal + + + + No media selected + Medya seçilmedi + + + + Please select a media to replace with or click 'Cancel'. + Lütfen değiştirmek için bir medya seçin veya tıklayın «İptal». + + + + Same media selected + Aynı ortam seçildi + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Değiştirdiğiniz medyayı seçtiniz. Lütfen farklı bir tane seçin veya tıklayın «İptal». + + + + Folder selected + Klasör seçildi + + + + You cannot replace footage with a folder. + Görüntüleri bir klasörle değiştiremezsiniz. + + + + Active sequence selected + Aktif sıra seçildi + + + + You cannot insert a sequence into itself. + Kendi içinde bir sıra ekleyemezsiniz. + + + + RichTextEffect + + + Text + Metin + + + + Padding + rafine + Dolgu + + + + Position + Pozisyon + + + + Vertical Align: + Dikey Hizala: + + + + Top + Üst + + + + Center + Merkez + + + + Bottom + Alt + + + + Auto-Scroll + Ototomatik-kaydırma + + + + Off + Kapalı + + + + Up + Yukarı + + + + Down + Aşağı + + + + Left + Sola + + + + Right + Sağa + + + + Shadow + Gölge + + + + Shadow Color + Gölge Rengi + + + + Shadow Angle + Gölge Açısı + + + + Shadow Distance + Gölge Mesafesi + + + + Shadow Softness + Gölge Yumuşaklığı + + + + Shadow Opacity + Gölge Opaklığı + + + + Sequence + + + %1 (copy) + %1 (kopya) + + + + ShakeEffect + + + Intensity + Yoğunluk + + + + Rotation + Dönüş + + + + Frequency + Frekans + + + + SolidEffect + + + Type + Tür + + + + Solid Color + Koyu Renk + + + + SMPTE Bars + SMPTE Çubuğu + + + + Checkerboard + Santrançtahtası + + + + Opacity + Opaklık + + + + Color + Renk + + + + Checkerboard Size + Hücre boyutu + + + + SourcesCommon + + + Import... + İthal... + + + + New + Yeni + + + + View + Gör + + + + Tree View + Ağaç Görünümü + + + + Icon View + Simge Görünümü + + + + Show Toolbar + Araç Çubuğunu Göster + + + + Show Sequences + Sıraları Göster + + + + Replace/Relink Media + rafine + Medyayı Değiştir/Yeniden Bağla + + + + Reveal in Explorer + Gezgin içinde Göster + + + + Reveal in Finder + Bul içinde Göster + + + + Reveal in File Manager + Dosya Yöneticisinde Göster + + + + Replace Clips Using This Media + rafine + Bu Medyayı Kullanarak Klipleri Değiştir + + + + Create Sequence With This Media + Bu dosyalarla bir sıra oluşturun + + + + Duplicate + Benzer + + + + Delete All Clips Using This Media + rafine + Bu Medyayı Kullanarak Tüm Klipleri Sil + + + + Proxy + Vekil + + + + Generating proxy: %1% complete + Vekil oluşturma: Tamamlandı %1% + + + + Create/Modify Proxy + Vekil Oluştur/Değiştir + + + + Create Proxy + Vekil Oluştur + + + + Modify Proxy + Vekil'i Değiştir + + + + Restore Original + Orijinali Geri Yükle + + + + Delete + Sil + + + + Preview in Media Viewer + Medya Görüntüleyicide Önizleme + + + + Properties... + Sahne Özellikleri... + + + + Replace Media + Medyayı Değiştir + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Dosyayı. '%1'. Bu dosyayı değiştirmek istiyor musunuz? + + + + Delete proxy + Vekil Sunucu + + + + Would you like to delete the proxy file "%1" as well? + Vekil dosyasını silmek ister misiniz? "%1"? + + + + SpeedDialog + + + Speed/Duration + Hız/Süre + + + + Speed: + Hız: + + + + Frame Rate: + Kare hızı: + + + + Duration: + Süre: + + + + Reverse + Ters + + + + Maintain Audio Pitch + Ses Alanını Koru + + + + Ripple Changes + Dalgalanma Değişiklikleri + + + + TextEditDialog + + + Edit Text + Metni Düzenle + + + + Thin + rafine + İnce + + + + Extra Light + rafine + Ekstra Işık + + + + Light + rafine + Işık + + + + Normal + rafine + Normal + + + + Medium + rafine + Orta + + + + Demi Bold + rafine + Yarı Kalın + + + + Bold + rafine + Kalın + + + + Extra Bold + rafine + Ekstra Kalın + + + + Black + rafine + Kara + + + + TextEditEx + + + Edit Text + Metni Düzenle + + + + &Edit Text + &Metni Düzenle + + + + TextEffect + + + Text + Metin + + + + Font + Yazıtipi + + + + Size + Boyut + + + + Color + Renk + + + + Alignment + Hizalama + + + + Left + Sol + + + + + Center + Merkez + + + + Right + Sağ + + + + Justify + Yaslama + + + + Top + Üstte + + + + Bottom + Alt + + + + Word Wrap + Sözcük Kaydır + + + + Padding + Dolgu + + + + Position + Pozisyon + + + + Outline + Taslak + + + + Outline Color + anahat Renk + + + + Outline Width + Anahat Genişliği + + + + Shadow + Gölge + + + + Shadow Color + Gölge Renk + + + + Shadow Angle + Gölge Açısı + + + + Shadow Distance + Gölge Mesafesi + + + + Shadow Softness + Gölge Yumuşaklığı + + + + Shadow Opacity + Gölge Opaklığı + + + + Sample Text + Örnek yazı + + + + TimecodeEffect + + + Timecode + Zaman-kodu + + + + Sequence + Sıra + + + + Media + Dosya + + + + Scale + Ölçü + + + + Color + Renk + + + + Background Color + Arkaplan Rengi + + + + Background Opacity + Arkaplan Opaklığı + + + + Offset + Kaydırma + + + + Prepend + Başına Ekle + + + + Timeline + + + Pointer Tool + İşaretçi Aracı + + + + Edit Tool + Düzenleme Aracı + + + + Ripple Tool + Dalgalanma Aracı + + + + Razor Tool + Kırpma + + + + Slip Tool + Ofset kaydırma + + + + Slide Tool + Kaydırma Aracı + + + + Hand Tool + Yol Bul + + + + Transition Tool + Geçiş + + + + Snapping + Yapışma + + + + Zoom In + Yakınlaştır + + + + Zoom Out + Uzaklaştırmak + + + + Record audio + Ses kaydı + + + + Add title, solid, bars, etc. + Başlık, katı, çubuk vb. Ekleyin. + + + + Nested Sequence + İç içe sıra + + + + Effect already exists + Efekt zaten eklenmiş + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + Klip '%1' zaten bir efekt '%2' içeriyor. Yapıştırılanla değiştirmek veya ayrı bir efekt olarak eklemek ister misiniz? + + + + Add + Ekle + + + + Replace + Değiştir + + + + Skip + Atlama + + + + Do this for all conflicts found + Bulunan tüm çatışmalar için bunu yap + + + + Title... + Başlık... + + + + Solid Color... + Koyu Renk... + + + + Bars... + Test Masası... + + + + Tone... + Ton… + + + + Noise... + Gürültü... + + + + Unsaved Project + Kaydedilmemiş Proje + + + + You must save this project before you can record audio in it. + Ses kaydı yapmadan önce bu projeyi kaydetmelisiniz. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Kaydı başlatmak istediğiniz zaman çizelgesine tıklayın (kaydı belirli bir zaman dilimine sınırlamak için sürükleyin) + + + + Timeline: + Montaj Masası: + + + + (none) + (boş) + + + + TimelineHeader + + + Center Timecodes + Tarih Kodunuortala + + + + TimelineWidget + + + &Undo + &Geri Al + + + + &Redo + &Yinele + + + + R&ipple Delete Empty Space + Уточнити + D&algalanma Boş Alanı Sil + + + + Sequence Settings + Sıra Ayarları + + + + &Speed/Duration + &Hız/Süre + + + Auto-s&cale + Авто&масштабування + + + + Auto-Cut Silence + Otomatik Kesme Sessizliği + + + + Auto-S&cale + Otomatik&ölçeklendirme + + + + &Reveal in Project + rafine + &Projede Göster + + + + Properties + Sahne Özellikleri + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Başlat: %2 +Son: %3 +Süre: %4 + + + + Error + Hata + + + + Couldn't locate media wrapper for sequence. + Dizi için ortam sargısı bulunamadı. + + + + Title + Başlık + + + + Solid Color + Koyu Renk + + + + Bars + Test Çubuğu + + + + Tone + Ton + + + + Noise + Gürültü + + + + Duration: + Süre: + + + + ToneEffect + + + Type + Тür + + + + Sine + Sinüs + + + + Frequency + Frekans + + + + Amount + Toplam + + + + Mix + Karıştır + + + + TransformEffect + + + Position + Pozisyon + + + + Scale + Ölçek + + + + Uniform Scale + Tek tip ölçek + + + + Rotation + Dönme + + + + Anchor Point + Dayanak noktası + + + + Opacity + Opaklık + + + + Blend Mode + Karıştırma modu + + + + Normal + Normal + + + + Transition + + + Length + Süre + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + Olive web sitesinde bir güncelleme mevcut. İndirmek için www.olivevideoeditor.org adresini ziyaret edin. + + + + VSTHost + + + + Error loading VST plugin + VST eklentisi yüklenirken hata oluştu + + + Failed to create VST reference + VST referansı oluşturulamadı + + + + Failed to load VST plugin "%1": %2 + VST eklentisi yüklenemedi "%1": %2 + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + NOT: 64-bit Olive'de 32-bit VST eklentilerini indiremezsiniz. Bu eklentinin 64 bit sürümünü bulun veya Olive'in 32 bit sürümünü yükleyin. + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + NOT: 64-bit VST eklentilerini 32-bit bir Olive yapısına yükleyebilirsiniz. Lütfen bu eklentinin 32 bit sürümünü bulun veya 64 bit Olive ürününe geçin. + + + + Failed to locate entry point for dynamic library. + Dinamik kütüphane için giriş noktası bulunamadı. + + + + VST Error + VST Hata + + + + Plugin's magic number is invalid + Eklentinin sihirli numarası geçersiz + + + + VST Plugin + VST Eklenti + + + + Plugin + Eklenti + + + + Interface + Arayüz + + + + Show + Göster + + + + Viewer + + + (none) + (hiçbiri) + + + + Drag video only + Yalnızca video sürükleyin + + + + Drag audio only + Yalnızca sesi sürükleyin + + + + Sequence Viewer + Sıra Görüntüleyici + + + + Media Viewer + Medya Görüntüleyici + + + + ViewerWidget + + + Save Frame as Image... + Çerçeveyi Görüntü Olarak Kaydet... + + + + Show Fullscreen + Tam ekran modu + + + + Disable + Devre Dışı + + + + Screen %1: %2x%3 + Ekran %1: %2x%3 + + + + Zoom + Yakınlaştır + + + + Fit + Sığdır + + + + Custom + Özel + + + + Close Media + Medyayı Kapat + + + + Save Frame + Çerçeveyi Kaydet + + + + Viewer Zoom + Görüntüleyici Yakınlaştırma + + + + Set Custom Zoom Value: + Özel Yakınlaştırma Değerini Ayarla: + + + + ViewerWindow + + + Exit Fullscreen + Tam ekrandan çık + + + + VoidEffect + + + (unknown) + (bilinmiyor) + + + + Missing Effect + Kayıp Efekt + + + + VolumeEffect + + + Volume + Ses Seviyesi + + + + transition + + + Invalid transition + Geçersiz geçiş + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + Geçiş için aday yok '%1'. Bu geçiş bozuk olabilir. Yeniden kurmayı ya da Olive'i deneyin. + + + diff --git a/app/ts/uk_UK.ts b/app/ts/uk_UK.ts new file mode 100644 index 000000000..1a0c8e664 --- /dev/null +++ b/app/ts/uk_UK.ts @@ -0,0 +1,3813 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive є нелінійним редактором відео. Це програмне забезпечення є вільним і захищено ліцензією GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive Team інформує користувачів про те що джерельний код Olive є доступним для завантаження на сайті проекту. + + + + ActionSearch + + + Search for action... + Знайти дію... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Розширені налаштування відео + + + + Pixel Format: + Формат пікселів: + + + + Threads: + Потоки: + + + + Audio + + + %1 Audio + Уточнити + %1 Аудіо + + + + Recording %1 + Запис %1 + + + + AudioNoiseEffect + + + Amount + Кількість + + + + Mix + Змішування + + + + AutoCutSilenceDialog + + + Cut Silence + Вирізати тишу + + + + Attack Threshold: + Поріг атаки: + + + + Attack Time: + Час атаки: + + + + Release Threshold: + Поріг відновлення: + + + + Release Time: + Час відновлення: + + + + Cacher + + + + Could not open %1 - %2 + Не вдалося відкрити %1 - %2 + + + + ChannelLayoutName + + + Invalid + Уточнити + Некоректний + + + + Mono + Моно + + + + Stereo + Стерео + + + + ClipPropertiesDialog + + + "%1" Properties + Уточнити + Параметри "%1" + + + + Multiple Clip Properties + Уточнити + Параметри множинного кліпа + + + + Name: + Назва: + + + + Duration: + Тривалість: + + + + (multiple) + Уточнити + (множинний) + + + + CollapsibleWidget + + + <untitled> + <без назви> + + + + ColorButton + + + Set Color + Визначити колір + + + + CornerPinEffect + + + Top Left + Верхній Лівий + + + + Top Right + Верхній Правий + + + + Bottom Left + Нижній Лівий + + + + Bottom Right + Нижній Правий + + + + Perspective + Перспектива + + + + DebugDialog + + + Debug Log + Журнал злагодження + + + + DemoNotice + + + + Welcome to Olive! + Ласкаво просимо в Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive є вільним нелінійним редактором відео створеним на умовах ліцензії GNU GPL. Якщо ви платили за це програмне забезпечення, то вас обманули. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + Це програмне забезпечення наразі в стадії АЛЬФА і це означає що програма є нестабільною і може працювати некоректно, має помилки та відсутні функції. Ми не несемо відповідальності тож викикористовуйте програму на власний ризик. Будь-ласка, повідомляйте нам про помилки та бажані функції через %1 + + + + Thank you for trying Olive and we hope you enjoy it! + Дякуємо що спробували і маємо надію що вам сподобаєтся Olive! + + + + Effect + + + Invalid effect + Некоректний ефект + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + Відсутній відповідник для ефекту '%1'. Цей ефект можливо пошкоджений. Спробуйте перевстановити його або ж Olive. + + + + Save Effect Settings + Зберегти налаштування ефектів + + + + + Effect XML Settings %1 + Файли з налаштуваннями ефектів %1 + + + + Save Settings Failed + Не вдалося зберегти налаштування + + + + Failed to open "%1" for writing. + Не вдалося відкрити "%1" для запису. + + + + Load Effect Settings + Завантажити налаштування ефектів + + + + + Load Settings Failed + Не вдалося завантажити налаштування + + + + Failed to open "%1" for reading. + Не вдалося відкрити "%1" для зчитування. + + + + This settings file doesn't match this effect. + Цей файл налаштувань не підходить для даного ефекта. + + + + EffectControls + + + (none) + (пусто) + + + + Effects: + Ефекти: + + + + Add Video Effect + Додати відеоефект + + + + VIDEO EFFECTS + ВІДЕОЕФЕКТИ + + + + Add Video Transition + Додати відеоперехід + + + + Add Audio Effect + Додати аудіоефект + + + + AUDIO EFFECTS + АУДІОЕФЕКТИ + + + + Add Audio Transition + Додати аудіоперехід + + + + EffectRow + + + Disable Keyframes + Вимкнути ключові кадри + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Вимкнення ключових кадрів видалить усі існуючі ключові кадри. Ви впевнені що хочете зробити це? + + + + EffectUI + + + %1 (Opening) + Уточнити + %1 (Відкривання) + + + + %1 (Closing) + Уточнити + %1 (Закривання) + + + + %1 (multiple) + Уточнити + %1 (множинний) + + + + Cu&t + Ви&різати + + + + &Copy + &Копіювати + + + + Move &Up + Перемістити В&низ + + + + Move &Down + Перемістити В&гору + + + + D&elete + Ви&далити + + + + Load Settings From File + Завантажити налаштування з файла + + + + Save Settings to File + Зберегти налаштування у файл + + + + EmbeddedFileChooser + + + File: + Файл: + + + + ExportDialog + + + Export "%1" + Експортувати "%1" + + + + Unknown codec name %1 + Невідома назва кодека %1 + + + + Export Failed + Не вдалося експортувати + + + + Export failed - %1 + Не вдалося експортувати - %1 + + + + Invalid dimensions + Некоректні розміри кадра + + + + Export width and height must both be even numbers/divisible by 2. + Для експорту значення ширини та висоти повинні бути цілими парними числами. + + + + Invalid codec + Некоректний кодек + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Неможливо визначити вихідні параметри для обраного кодека. Це помилка, будь-ласка, зв'яжітся з розробниками. + + + + Invalid format + Некоректний формат + + + + Couldn't determine output format. This is a bug, please contact the developers. + Неможливо визначити вихідний формат. Це помилка, будь-ласка, зв'яжітся з розробниками. + + + + Export Media + Уточнити + Експортувати медіафайл + + + + %p% (Total: %1:%2:%3) + Уточнити + %p% (Загалом: %1:%2:%3) + + + + %p% (ETA: %1:%2:%3) + %p% (Залишилося: %1:%2:%3) + + + + Quality-based (Constant Rate Factor) + Уточнити + Якість (Constant Rate Factor) + + + + Constant Bitrate + Стала швидкість потока + + + + + Invalid Codec + Некоректний кодек + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + Не вдалося знайти відповідний кодувальник для цього кодека. Експорт може бути некоректним. + + + + Failed to find pixel format for this encoder. Export will likely fail. + Не вдалося знайти формат пікселів для цього кодувальника. Експорт може бути некоректним. + + + + Bitrate (Mbps): + Швидкість потока (Мбіт/с): + + + + Quality (CRF): + Якість (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Коефіцієнт Якості: + +0 = без втрат +17-18 = візульно без втрат (стиснуто, але майже непомітно) +23 = висока якість +51 = найнижча можлива якість + + + + Target File Size (MB): + Кінцевий розмір файла (Мб): + + + + Format: + Формат: + + + + Range: + Діапазон: + + + + Entire Sequence + Уся послідовність + + + + In to Out + Від входу до виходу + + + + Video + Відео + + + + + Codec: + Кодек: + + + + Width: + Ширина: + + + + Height: + Висота: + + + + Frame Rate: + Частота кадрів: + + + + Compression Type: + Тип cтискання: + + + + Advanced + Додатково + + + + Audio + Аудіо + + + + Sampling Rate: + Частота дискретизації: + + + + Bitrate (Kbps/CBR): + Швидкість потока (Кбіт/с / CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + не вдалося надіслати кадр до кодувальника (%1) + + + + failed to receive packet from encoder (%1) + не вдалося отримати пакет від кодувальника (%1) + + + + could not video encoder for %1 + не вдалося знайти кодувальник відео для %1 + + + + could not allocate video stream + не вдалося встановити поток відео + + + + could not allocate video encoding context + не вдалося встановити контекст кодувльника відео + + + + could not open output video encoder (%1) + не вдалося відкрити вихідний кодувальник відео (%1) + + + + could not copy video encoder parameters to output stream (%1) + не вдалося скопіювати параметри кодувальника відео для вихідного потоку (%1) + + + + could not audio encoder for %1 + не вдалося знайти кодувальник аудіо для %1 + + + + could not allocate audio stream + не вдалося встановити поток аудіо + + + + could not allocate audio encoding context + не вдалося встановити контекст кодувльника аудіо + + + + could not open output audio encoder (%1) + не вдалося відкрити вихідний кодувальник аудіо (%1) + + + + could not copy audio encoder parameters to output stream (%1) + не вдалося скопіювати параметри кодувальника аудіо для вихідного потоку (%1) + + + + could not allocate audio buffer (%1) + не вдалося встановити буфер аудіо (%1) + + + + could not create output format context + не вдалося створити контекст вихідного формату + + + + could not open output file (%1) + не вдалося відкрити вихідний файл (%1) + + + + could not write output file header (%1) + не вдалося записати заголовок вихідного файлу (%1) + + + + could not write output file trailer (%1) + Уточнити + не вдалося записати кінець вихідного файла (%1) + + + + FillLeftRightEffect + + + Type + Тип + + + + Fill Left with Right + Заповнити лівий канал правим + + + + Fill Right with Left + Заповнити правий канал лівим + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Не вдалося завантажити плагін Frei0r "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + ПРИМІТКА: Ви не можете завантажувати 32-розрядні плагіни Frei0r у 64-розрядний Olive. Знайдіть 64-розрядну версію цього плагіна або встановіть 32-розрядну версію Olive. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + ПРИМІТКА: Ви не можете завантажувати 64-розрядні плагіни Frei0r у 32-розрядний Olive. Знайдіть 64-розрядну версію цього плагіна або встановіть 64-розрядну версію Olive. + + + + Error loading Frei0r plugin + Помилка при завантаженні плагіна Frei0r + + + + GraphEditor + + + Graph Editor + Редактор графів + + + + Linear + Лінійний + + + + Bezier + Безьє + + + + Hold + Уточнити + Стала + + + + GraphView + + + Zoom to Selection + Масштабувати до виділеного + + + + Zoom to Show All + Масштабувати і показати все + + + + Reset View + Скинути масштабування + + + + InterlacingName + + + None (Progressive) + Ні (прогресивно) + + + + Top Field First + Спочатку верхне поле + + + + Bottom Field First + Спочатку нижнє поле + + + + Invalid + Некоректно + + + + KeyframeNavigator + + + Enable Keyframes + Увімкнути ключові кадри + + + + KeyframeView + + + Linear + Лінійний + + + + Bezier + Безьє + + + + Hold + Уточнити + Стала + + + + LabelSlider + + + &Edit + &Редагувати + + + + &Reset to Default + Уточнити + &Скинути до стандартних + + + + + Set Value + Встановити значення + + + + + New value: + Нове значення: + + + + LoadDialog + + + Loading... + Завантаження... + + + + Loading '%1'... + Завантажується '%1'... + + + + Cancel + Уточнити + Відміна + + + + LoadThread + + + Version Mismatch + Невідповіність версій + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Цей проект булр збережено в іншій версії Olive, котра неповністью сумісна з наявною версією. Ви все ж хочете спробувати завантажити цей проект? + + + + Invalid Clip Link + Некоректний зв'язок кліпів + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + У проекті виявлено некоректний зв'язок кліпів. Ви хочете продовжити завантаження? + + + + %1 - Line: %2 Col: %3 + %1 - Рядок: %2 Стовпчик: %3 + + + + User aborted loading + Завантаження зупинено користувачем + + + + XML Parsing Error + Помилка розбору XML + + + + Couldn't load '%1'. %2 + Не вдалося завантажити '%1'. %2 + + + + Project Load Error + Помилка при завантаженні проекта + + + + Error loading project: %1 + Помилка при завантаженні проекта: %1 + + + + MainWindow + + + Welcome to %1 + Вітаємо в %1 + + + + &File + &Файл + + + + &New + &Новий + + + + &Open Project + &Відкрити проект + + + + Clear Recent List + Очистити історію + + + + Open Recent + Відкрити недавній + + + + &Save Project + &Зберегти проект + + + + Save Project &As + Зберегти проект &як + + + + &Import... + &Імпортувати... + + + + &Export... + &Експортувати... + + + + E&xit + Ви&хід + + + + &Edit + &Редагування + + + + &Undo + &Відмінити + + + + Redo + Повернути + + + + Select &All + Виділити &усе + + + + Deselect All + Скасувати виділення + + + + Ripple to In Point + Зсунути до точки входу + + + + Ripple to Out Point + Зсунути до точки виходу + + + + Edit to In Point + Редагування до точки входу + + + + Edit to Out Point + Редагування до точки виходу + + + + Delete In/Out Point + Видалити точку входу/виходу + + + + Ripple Delete In/Out Point + Видалити зі зміщенням точку входу/виходу + + + + Set/Edit Marker + Встановити/Редагувати маркер + + + + &View + &Вигляд + + + + Zoom In + Наблизити + + + + Zoom Out + Віддалити + + + + Increase Track Height + Збільшити висоту доріжки + + + + Decrease Track Height + Зменшити висоту доріжки + + + + Toggle Show All + Уточнити + Показувати увесь проект + + + + Track Lines + Лінії доріжок + + + + Rectified Waveforms + Хвильова форма від низу + + + + Frames + Кадри + + + + Drop Frame + З пропусканням кадрів + + + + Non-Drop Frame + Без пропускання кадрів + + + + Milliseconds + Мілісекунди + + + + Title/Action Safe Area + Уточнити + Безпечна зона титрів/ефекта + + + + Off + Вимкнено + + + + Default + Типово + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + Інше + + + + Full Screen + Повноекранний режим + + + + Full Screen Viewer + Перегляд в повноекранному режимі + + + + &Playback + Від&творення + + + + Go to Start + На початок + + + + Previous Frame + Попередній кадр + + + + Play/Pause + Відтворення/Пауза + + + + Play In to Out + Відтворити від входу до виходу + + + + Next Frame + Наступний кадр + + + + Go to End + У кінець + + + + Go to Previous Cut + До попереднього розрізу + + + + Go to Next Cut + До наступного розрізу + + + + Go to In Point + До точки входу + + + + Go to Out Point + До точки виходу + + + + Shuttle Left + Уточнити + Зменшити швидкість + + + + Shuttle Stop + Уточнити + Пауза + + + + Shuttle Right + Уточнити + Збільшити швидкість + + + + Loop + Уточнити + Повторення петлі + + + + &Window + &Вікно + + + + Project + Проект + + + + Effect Controls + Керування ефектами + + + + Timeline + Монтажний стіл + + + + Graph Editor + Редактор графів + + + + Media Viewer + Уточнити + Переглядач медіа файлів + + + + Sequence Viewer + Уточнити + Переглядач послідовності + + + + Maximize Panel + Розгорнути панель + + + + Lock Panels + Зафіксувати панель + + + + Reset to Default Layout + Повернути початкове розташування панелей + + + + &Tools + &Інструменти + + + + Pointer Tool + Уточнити + Вказівник + + + + Edit Tool + Виділення + + + + Ripple Tool + Монтаж зі зсувом + + + + Razor Tool + Підрізка + + + + Slip Tool + Прокручування зі зміщенням + + + + Slide Tool + Прокручування + + + + Hand Tool + Уточнити + Навігація + + + + Transition Tool + Перехід + + + + Enable Snapping + Увімкнути прилипання + + + + Auto-Cut Silence + Автовирізання тиші + + + Selecting Also Seeks + Виділення з прокручуванням + + + Edit Tool Also Seeks + Уточнити + Виділення з прокручуванням + + + Edit Tool Selects Links + Виділення обирає зв'язки + + + Seek Also Selects + Прокручування з виділенням + + + Seek to the End of Pastes + Прокручування до кінця вставок + + + Scroll Wheel Zooms + Уточнити + Колесо миші масштабує монтажний стіл + + + Hold CTRL to toggle this setting + Утримуйте CTRL для перемикання цього налаштування + + + Invert Timeline Scroll Axes + Уточнити + Інвертувати напрямки прокручування монтажного столу + + + Enable Drag Files to Timeline + Уточнити + Увімкнути перетягування файлів на монтажний стіл + + + Auto-Scale By Default + Автомасштабування за умовчанням + + + Enable Seek to Import + Уточнити + Увімкнути прокручування для імпортування + + + Audio Scrubbing + Відтворювати звук під час прокручування + + + Enable Drop on Media to Replace + Уточнити + Увімкнути перетягування на медіа для заміни + + + Enable Hover Focus + Увімкнути фокус наведенням + + + Ask For Name When Setting Marker + Запитувати назву маркера при додаванні + + + + No Auto-Scroll + Без автопрокручування + + + + Page Auto-Scroll + Авторокручування перегортанням + + + + Smooth Auto-Scroll + Плавне автопрокручування + + + + Preferences + Параметри + + + + Clear Undo + Очистити історію змін + + + + &Help + &Довідка + + + + A&ction Search + По&шук дії + + + + Debug Log + Журнал злагодження + + + + &About... + &Про програму... + + + + <untitled> + <без назви> + + + + Marker + + + Set Marker + Встановити маркер + + + + Set clip marker name: + Назва маркера кліпу: + + + + Set sequence marker name: + Назва маркера послідовності: + + + + Media + + + New Folder + Нова тека + + + + Name: + Назва: + + + + Filename: + Ім'я файла: + + + + Video Dimensions: + Розмір кадрів: + + + + Frame Rate: + Частота кадрів: + + + + %1 field(s) (%2 frame(s)) + Уточнити + полів: %1 (кадрів: %2) + + + + Interlacing: + Черезрядковість: + + + + Audio Frequency: + Частота звука: + + + + Audio Channels: + Звукові канали: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Назва: %1 +Розмір кадрів: %2x%3 +Частота кадрів: %4 +Частота звука: %5 +Звукові канали: %6 + + + + Name + Назва + + + + Duration + Тривалість + + + + Rate + Частота + + + + MediaPropertiesDialog + + + "%1" Properties + Властивості "%1" + + + + Tracks: + Доріжок: + + + + Video %1: %2x%3 %4FPS + Відео %1: %2x%3 %4к/c + + + + Audio %1: %2Hz %3 + Аудіо %1: %2Гц %3 + + + + %n channel(s) + + %n канал + %n канали + %n каналів + + + + + Conform to Frame Rate: + Підігнати до частоти кадрів: + + + + Alpha is Premultiplied + Уточнити + Альфа-значення помножено у зворотньому порядку + + + + Auto (%1) + Авто (%1) + + + + Interlacing: + Черезрядковість: + + + + Name: + Назва: + + + + MenuHelper + + + &Project + &Проект + + + + &Sequence + П&ослідовність + + + + &Folder + Т&ека + + + + Set In Point + Встановити точку входа + + + + Set Out Point + Встановити точку вихода + + + + Reset In Point + Скинути точку входа + + + + Reset Out Point + Скинути точку вихода + + + + Clear In/Out Point + Очистити точку входа/вихода + + + + Add Default Transition + Додати типовий перехід + + + + Link/Unlink + Зв'язати/Прибрати зв'язок + + + + Enable/Disable + Увімкнути/Вимкнути + + + + Nest + Вкласти + + + + Cu&t + Ви&різати + + + + Cop&y + С&копіювати + + + + + &Paste + В&ставити + + + + Paste Insert + Уточнити + Вставити з заміною + + + + Duplicate + Дюблювати + + + + Delete + Видалити + + + + Ripple Delete + Видалити зі зміщенням + + + + Split + Розділити + + + + Invalid aspect ratio + Некоректні пропорції сторін + + + + The aspect ratio '%1' is invalid. Please try again. + Пропорції сторін '%1' є некоректними. Будь-ласка, спробуйте ще раз. + + + + Enter custom aspect ratio + Встановіть інші пропорції сторін + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Встановіть пропорції сторін для безпечної зони титрів/ефекта (наприклад, 16:9): + + + + NewSequenceDialog + + + Editing "%1" + Редагування "%1" + + + + New Sequence + Нова послідовність + + + + Preset: + Уточнити + Профіль: + + + + Film 4K + Фільм 4К + + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + Інше + + + + Video + Відео + + + + Width: + Ширина: + + + + Height: + Висота: + + + + Frame Rate: + Частота кадрів: + + + + Pixel Aspect Ratio: + Пропорції сторін пікселів: + + + + Square Pixels (1.0) + Квадратні пікселі (1.0) + + + + Interlacing: + Черезрядковість: + + + + None (Progressive) + Ні (прогресивно) + + + + Audio + Аудіо + + + + Sample Rate: + Частота дискретизації: + + + + Name: + Назва: + + + + OliveGlobal + + + Olive Project %1 + Olive Проект %1 + + + + Auto-recovery + Автовідновлення + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive аварійно завершив роботу і виявив файл автовідновлення. Відкрити його? + + + + Open Project... + Відкрити проект... + + + + Missing recent project + Відсутній недавній проект + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Проект '%1' більше не існує. Видалити його з історії? + + + + Save Project As... + Зберегти проект як... + + + + Unsaved Project + Незбережений проект + + + + This project has changed since it was last saved. Would you like to save it before closing? + Проект було змінено з момента останнього збереження. Хочете зберегти його перед закриттям? + + + + No active sequence + Немає активних послідовностей + + + + Please open the sequence to perform this action. + Відкрийте послідовність для застосування цієї дії. + + + + No clips selected + Не обрано кліпи + + + + Select the clips you wish to auto-cut + Уточнити + Оберіть кліпи для автовирізання + + + Please open the sequence you wish to export. + Будь-ласка, відкрийте послідовність котру хочете експортувати. + + + + Missing Project File + Відсутній файл проекта + + + + Specified project '%1' does not exist. + Вказаний проект '%1' не існує. + + + + PanEffect + + + Pan + Уточнити + Панорама + + + + PreferencesDialog + + + Preferences + Параметри + + + + Default Sequence + Типова послідовність + + + + Invalid CSS File + Некоректний файл CSS + + + + CSS file '%1' does not exist. + Файл CSS '%1' не існує. + + + + Confirm Reset All Shortcuts + Підтвердіть скидання всіх комбінацій клавіш + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Ви дійсно хочете скинути всі комбінації клавіш до типових значень? + + + + Import Keyboard Shortcuts + Імпортувати комбінації клавіш + + + + + Error saving shortcuts + Помилка при збереженні комбінацій клавіш + + + + Failed to open file for reading + Не вдалося відкрити файл для читання + + + + Export Keyboard Shortcuts + Експортувати комбінації клавіш + + + + Export Shortcuts + Експортувати комбінації клавіш + + + + Shortcuts exported successfully + Комбінації клавіш експортовано + + + + Failed to open file for writing + Не вдалося відкрити файл для запису + + + + Browse for CSS file + Обрати файл CSS + + + + Delete All Previews + Видалити усі мініатюри + + + + Are you sure you want to delete all previews? + Дійсно видалити усі мініатюри? + + + + Previews Deleted + Мініатюри видалено + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + Уточнити + Усі мініатюри видалено. Можливо знадобится перевідкрити поточний проект для того щоб зміни вступили в силу. + + + + Language: + Мова: + + + + Image sequence formats: + Формати зображень: + + + + Thumbnail Resolution: + Розмір мініатюр: + + + + Waveform Resolution: + Деталізація форми хвиль: + + + + Delete Previews + Видалити мініатюри + + + + Use Software Fallbacks When Possible + По можливості використовувати програмну реалізацію + + + + Default Sequence Settings + Типові налаштування послідовності + + + + General + Загальні + + + + Behavior + Поведінка + + + + Add Default Effects to New Clips + Додавати типові ефекти для нових кліпів + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + Автопрокручувати на початок при відворенні з кінця послідовності + + + + Selecting Also Seeks + Виділення з прокручуванням + + + + Edit Tool Also Seeks + Виділення з прокручуванням + + + + Edit Tool Selects Links + Виділення обирає зв'язки + + + + Seek Also Selects + Прокручування з виділенням + + + + Seek to the End of Pastes + Прокручування до кінця вставок + + + + Scroll Wheel Zooms + Колесо миші масштабує монтажний стіл + + + + Hold CTRL to toggle this setting + Утримуйте CTRL для перемикання цього налаштування + + + + Invert Timeline Scroll Axes + Інвертувати напрямки прокручування монтажного столу + + + + Enable Drag Files to Timeline + Уточнити + Увімкнути перетягування файлів на монтажний стіл + + + + Auto-Scale By Default + Автомасштабування за умовчанням + + + + Auto-Seek to Imported Clips + Уточнити + Автопрокручувати до імпортованих кліпів + + + + Audio Scrubbing + Відтворювати звук під час прокручування + + + + Drop Files on Media to Replace + Уточнити + Перетягування файлів на медіа для заміни + + + + Enable Hover Focus + Увімкнути фокус наведенням + + + + Ask For Name When Setting Marker + Запитувати назву маркера при додаванні + + + + Appearance + Вигляд + + + + Theme + Тема + + + + Olive Dark (Default) + Olive Dark (типово) + + + + Olive Light + Olive Light + + + + Native + Уточнити + Native + + + + Native (Light Icons) + Уточнити + Native (світлі іконки) + + + + Use Native Menu Styling + Уточнити + Використовувати стиль меню Native + + + + Custom CSS: + Інший CSS: + + + + Browse + Уточнити + Обрати + + + + Effect Textbox Lines: + Кількість рядків у полі вводу тексту: + + + Seeking + Позиціонування + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + Точне позиціонування +Завжди показувати правильний кадр (відображення може уповільнюватися) + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + Швидке позиціонування +Позиціонувати швидко (можливе неточне відображення кадрів - не впливає на відтворення) + + + + Memory Usage + Використання пам'яті + + + + Upcoming Frame Queue: + Резервування послідуючих кадрів: + + + + + frames + кадрів + + + + + seconds + секунд + + + + Previous Frame Queue: + Резервування попередніх кадрів: + + + + Playback + Відтворення + + + + Output Device: + Пристрій виводу: + + + + + Default + Типово + + + + Input Device: + Пристрій вводу: + + + + Sample Rate: + Частота дискретизації: + + + + Audio Recording: + Запис звука: + + + + Mono + Моно + + + + Stereo + Стерео + + + + Audio + Аудіо + + + + Search for action or shortcut + Знайти дію або комбінацію клавіш + + + + Action + Дія + + + + Shortcut + Комбінація клавіш + + + + Import + Імпортувати + + + + Export + Експортувати + + + + Reset Selected + Скинути виділення + + + + Reset All + Скинути все + + + + Keyboard + Комбінації клавіш + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + Не вдалося знайти коректні відео/аудіо потоки + + + + Could not open file - %1 + Не вдалося відкрити файл — %1 + + + + Could not find stream information - %1 + Не вдалося знайти інформацію потоку — %1 + + + + Project + + + New + Створити + + + + Open Project + Відкрити проект + + + + Save Project + Зберегти проект + + + + Undo + Відмінити + + + + Redo + Повернути + + + + Tree View + У вигляді таблиці + + + + Icon View + У вигляді мініатюр + + + + List View + У вигляді списку + + + + Search media, markers, etc. + Шукати файли, маркери, і т.п. + + + + Project + Проект + + + + Sequence + Послідовність + + + + Replace '%1' + Замінити '%1' + + + + + All Files + Усі файли + + + + + No active sequence + Немає активних послідовностей + + + + No sequence is active, please open the sequence you want to replace clips from. + Немає активних послідовносте. Відкрийте послідовність в якій хочете замінити кліпи. + + + + Active sequence selected + Обрано активну послідовність + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + Уточнити + Ви не можете вставити послідовність в саму себе, тож кліпи з цих файлів не можуть бути вставлені в цю послідовність. + + + + Rename '%1' + Перейменувати '%1' + + + + Enter new name: + Введіть нову назву: + + + + Delete media in use? + Уточнити + Видалити використані у проекті файли? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + Файл '%1' вже використовується у '%2'. Його видалення приведе до видалення усіх його копій у вибраній послідовності. Ви точно цього хочете? + + + + Skip + Пропустити + + + + Import a Project + Імпортувати проект + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" є файлом проекту Olive. Його буде об'єднано з поточним проектом. Ви хочете продовжити? + + + + Image sequence detected + Виявлено послідовність зображень + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + Схоже що файл '%1' є частиною послідовності зображень. Імпортувати його як є? + + + + Import media... + Імпортувати медіафайли... + + + + No sequence is active, please open the sequence you want to delete clips from. + Немає активних послідовносте. Відкрийте послідовність з якої хочете видалити кліпи. + + + + ProxyDialog + + + Create Proxy + Створити проксі + + + + Proxy + Проксі + + + + Dimensions: + Розміри: + + + + Same Size as Source + Оригінальний розмір + + + + Half Resolution (1/2) + Половина оригінала (1/2) + + + + Quarter Resolution (1/4) + Чверть оригіналу (1/4) + + + + Eighth Resolution (1/8) + Восьма оригиніалу (1/8) + + + + Sixteenth Resolution (1/16) + Шістнадцята оригіналу (1/16) + + + + Format: + Формат: + + + + ProRes HQ + ProRes HQ + + + + Location: + Розташування: + + + + Same as Source (in "%1" folder) + Як в оригіналі (у теці "%1") + + + + Proxy file exists + Проксі-файл вже існує + + + + The file "%1" already exists. Do you wish to replace it? + Файл "%1" вже існує. Замінити його? + + + + Custom Location + Інше місцезнаходження + + + + ProxyGenerator + + + Finished generating proxy for "%1" + Завершено створення проксі для "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Замінити кліпи на "%1" + + + + Select which media you want to replace this media's clips with: + Оберіть файли, які хочете замінити у кліпах з цими файлами: + + + + Keep the same media in-points + Зберегти існуючі точки входу + + + + Replace + Замінити + + + + Cancel + Відмінити + + + + No media selected + Не обрано медіафайли + + + + Please select a media to replace with or click 'Cancel'. + Оберіть медіафайли для заміни та натисніть «Відміна». + + + + Same media selected + Обрано ті ж самі файли + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Ви обрали ті ж самі файли, що й хочете замінити. Оберіть якісь інші файли або ж натисніть «Відміна». + + + + Folder selected + Теку обрано + + + + You cannot replace footage with a folder. + Ви не можете замінити відеоряд текою. + + + + Active sequence selected + Обрано активну послідовність + + + + You cannot insert a sequence into itself. + Ви не можете вставити послідовність в саму себе. + + + + RichTextEffect + + + Text + Текст + + + + Padding + Уточнити + Відступ + + + + Position + Позиція + + + + Vertical Align: + Верктикальне вирівнювання: + + + + Top + Вгорі + + + + Center + По центру + + + + Bottom + Внизу + + + + Auto-Scroll + Автопрокручування + + + + Off + Вимкнено + + + + Up + Вгору + + + + Down + Вниз + + + + Left + Вліво + + + + Right + Вправо + + + + Shadow + Тінь + + + + Shadow Color + Колір тіні + + + + Shadow Angle + Кут падіння тіні + + + + Shadow Distance + Відстань до тіні + + + + Shadow Softness + Розсіювання тіні + + + + Shadow Opacity + Непрозорість тіні + + + + Sequence + + + %1 (copy) + %1 (копія) + + + + ShakeEffect + + + Intensity + Інтенсивність + + + + Rotation + Обертання + + + + Frequency + Частота + + + + SolidEffect + + + Type + Тип + + + + Solid Color + Суцільна заливка + + + + SMPTE Bars + Таблиця SMPTE + + + + Checkerboard + Шахівниця + + + + Opacity + Непрозорість + + + + Color + Колір + + + + Checkerboard Size + Розмір клітинок + + + + SourcesCommon + + + Import... + Імпортувати... + + + + New + Створити + + + + View + Вигляд + + + + Tree View + У вигляді таблиці + + + + Icon View + У вигляді мініатюр + + + + Show Toolbar + Показувати панель + + + + Show Sequences + Показувати послідовності + + + + Replace/Relink Media + Уточнити + Замінити/Перезв'язати файли + + + + Reveal in Explorer + Відкрити у Explorer + + + + Reveal in Finder + Відкрити у Finder + + + + Reveal in File Manager + Відкрити у менеджері файлів + + + + Replace Clips Using This Media + Уточнити + Замінити кліпи з цими файлами + + + + Create Sequence With This Media + Створити послідовність з цими файлами + + + + Duplicate + Дублювати + + + + Delete All Clips Using This Media + Уточнити + Видалити усі кліпи з цими файлами + + + + Proxy + Проксі + + + + Generating proxy: %1% complete + Створення проксі: завершено на %1% + + + + Create/Modify Proxy + Створити/Змінити проксі + + + + Create Proxy + Створити проксі + + + + Modify Proxy + Змінити проксі + + + + Restore Original + Відновити оригінал + + + + Delete + Видалити + + + + Preview in Media Viewer + Переглянути у Переглядачі медіа файлів + + + + Properties... + Властивості... + + + + Replace Media + Замінити медіафайли + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Ви перетягнули файл на '%1'. Ви хочете замінити на цей файл? + + + + Delete proxy + Видалити проксі + + + + Would you like to delete the proxy file "%1" as well? + Заразом видалити проксі-файл "%1"? + + + + SpeedDialog + + + Speed/Duration + Швидкість/Тривалість + + + + Speed: + Швидкість: + + + + Frame Rate: + Частота кадрів: + + + + Duration: + Тривалість: + + + + Reverse + Реверс + + + + Maintain Audio Pitch + Зберегти висоту тона + + + + Ripple Changes + Змінювати зі зміщенням + + + + TextEditDialog + + + Edit Text + Змінити текст + + + + Thin + Уточнити + Thin + + + + Extra Light + Уточнити + Extra Light + + + + Light + Уточнити + Light + + + + Normal + Уточнити + Normal + + + + Medium + Уточнити + Medium + + + + Demi Bold + Уточнити + Demi Bold + + + + Bold + Уточнити + Bold + + + + Extra Bold + Уточнити + Extra Bold + + + + Black + Уточнити + Black + + + + TextEditEx + + + Edit Text + Редагувати текст + + + + &Edit Text + &Редагувати Текст + + + + TextEffect + + + Text + Текст + + + + Font + Шрифт + + + + Size + Розмір + + + + Color + Колір + + + + Alignment + Вирівнювання + + + + Left + Ліворуч + + + + + Center + По центру + + + + Right + Праворуч + + + + Justify + По ширині + + + + Top + Вгорі + + + + Bottom + Внизу + + + + Word Wrap + Перенесення слів + + + + Padding + Відступ + + + + Position + Позиція + + + + Outline + Контури + + + + Outline Color + Колір контурів + + + + Outline Width + Ширина контурів + + + + Shadow + Тінь + + + + Shadow Color + Колір тіні + + + + Shadow Angle + Кут падіння тіні + + + + Shadow Distance + Відстань до тіні + + + + Shadow Softness + Розсіювання тіні + + + + Shadow Opacity + Непрозорість тіні + + + + Sample Text + Зразок тексту + + + + TimecodeEffect + + + Timecode + Тайм-код + + + + Sequence + Послідовність + + + + Media + Файл + + + + Scale + Масштаб + + + + Color + Колір + + + + Background Color + Колір фону + + + + Background Opacity + Непрозорість фону + + + + Offset + Зміщення + + + + Prepend + Префікс + + + + Timeline + + + Pointer Tool + Вказівник + + + + Edit Tool + Виділення + + + + Ripple Tool + Монтаж зі зміщенням + + + + Razor Tool + Підрізання + + + + Slip Tool + Прокручування зі зміщенням + + + + Slide Tool + Прокручування + + + + Hand Tool + Навігація + + + + Transition Tool + Перехід + + + + Snapping + Прилипання + + + + Zoom In + Наблизити + + + + Zoom Out + Віддалити + + + + Record audio + Запис звука + + + + Add title, solid, bars, etc. + Додати титри, заливку, тестову таблицю, і т.п. + + + + Nested Sequence + Вкладена послідовність + + + + Effect already exists + Ефект уже додано + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + Кліп '%1' уже містить ефект '%2'. Хочете замінити його на вставлюваний чи додати цей ефект як окремий? + + + + Add + Додати + + + + Replace + Замінити + + + + Skip + Пропустити + + + + Do this for all conflicts found + Застосувати для всіх конфліктів + + + + Title... + Титри... + + + + Solid Color... + Суцільна заливка... + + + + Bars... + Тестова таблиця... + + + + Tone... + Звуковой сигнал… + + + + Noise... + Шум... + + + + Unsaved Project + Незбережений проект + + + + You must save this project before you can record audio in it. + Перед записом звука необхідно зберегти проект. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Клікніть на монтажному столі у точці, куди хочете почати запис звука (перетягніть курсор після кліка щоб відразу встановити тривалість запису) + + + + Timeline: + Монтажний стіл: + + + + (none) + (пусто) + + + + TimelineHeader + + + Center Timecodes + Центрувати тайм-код + + + + TimelineWidget + + + &Undo + &Відмінити + + + + &Redo + По&вернути + + + + R&ipple Delete Empty Space + Уточнити + Видалити зі зміщенням порожнє &місце + + + + Sequence Settings + Налаштування послідовності + + + + &Speed/Duration + &Швидкість/Тривалість + + + Auto-s&cale + Авто&масштабування + + + + Auto-Cut Silence + Автовирізання тиші + + + + Auto-S&cale + Авто&масштабування + + + + &Reveal in Project + Уточнити + &Показати у проекті + + + + Properties + Властивості + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Початок: %2 +Кінець: %3 +Тривалість: %4 + + + + Error + Помилка + + + + Couldn't locate media wrapper for sequence. + Не вдається визначити обробник медіа для послідовності. + + + + Title + Титри + + + + Solid Color + Суцільна заливка + + + + Bars + Тестова таблиця + + + + Tone + Звуковой сигнал + + + + Noise + Шум + + + + Duration: + Тривалість: + + + + ToneEffect + + + Type + Тип + + + + Sine + Синусоїда + + + + Frequency + Частота + + + + Amount + Кількість + + + + Mix + Змішування + + + + TransformEffect + + + Position + Позиція + + + + Scale + Масштаб + + + + Uniform Scale + Пропорційний масштаб + + + + Rotation + Обертання + + + + Anchor Point + Якірна точка + + + + Opacity + Непрозорість + + + + Blend Mode + Режим змішування + + + + Normal + Звичайний + + + + Transition + + + Length + Тривалість + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + Оновлення доступне на сайті Olive. Відвідайте www.olivevideoeditor.org для завантаження. + + + + VSTHost + + + + Error loading VST plugin + Помилка при завантаженні плагіна VST + + + Failed to create VST reference + Не вдалося створити зв'язок VST + + + + Failed to load VST plugin "%1": %2 + Не вдалося завантажити плагін VST "%1": %2 + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + ПРИМІТКА: Ви не можете завантажувати 32-розрядні плагіни VST у 64-розрядний Olive. Знайдіть 64-розрядну версію цього плагіна або встановіть 32-розрядну версію Olive. + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + ПРИМІТКА: Ви не можете завантажувати 64-розрядні плагіни VST у 32-розрядний Olive. Знайдіть 64-розрядну версію цього плагіна або встановіть 64-розрядну версію Olive. + + + + Failed to locate entry point for dynamic library. + Не вдалося визначити вхідну точку для динамічної бібліотеки. + + + + VST Error + Помилка VST + + + + Plugin's magic number is invalid + Магічний номер плагіна некоректний + + + + VST Plugin + Плагін VST + + + + Plugin + Плагін + + + + Interface + Інтерфейс + + + + Show + Показати + + + + Viewer + + + (none) + (пусто) + + + + Drag video only + Перетягнути лише відео + + + + Drag audio only + Перетягнути лише аудіо + + + + Sequence Viewer + Переглядач послідовності + + + + Media Viewer + Переглядач медіа файлів + + + + ViewerWidget + + + Save Frame as Image... + Зберегти кадр як зображення... + + + + Show Fullscreen + Повноекранний режим + + + + Disable + Вимкнути + + + + Screen %1: %2x%3 + Екран %1: %2x%3 + + + + Zoom + Масштаб + + + + Fit + Підігнати + + + + Custom + Інше + + + + Close Media + Закрити файл + + + + Save Frame + Зберегти кадр + + + + Viewer Zoom + Масштаб перегляду + + + + Set Custom Zoom Value: + Інше значення масштаба: + + + + ViewerWindow + + + Exit Fullscreen + Вийти з повноекранного режиму + + + + VoidEffect + + + (unknown) + (невідомо) + + + + Missing Effect + Відсутній ефект + + + + VolumeEffect + + + Volume + Гучність + + + + transition + + + Invalid transition + Некоректний перехід + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + Немає кандидата для переходу '%1'. Цей перехід може бути некоректний. Спробуйте перевстановити його або ж Olive. + + + diff --git a/app/ts/zh_CN.ts b/app/ts/zh_CN.ts new file mode 100755 index 000000000..b48cd9c50 --- /dev/null +++ b/app/ts/zh_CN.ts @@ -0,0 +1,3759 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive是免费的非线性视频编辑器.基于GNU通用公共许可证(GNU GPL)条款发布. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive团队有义务告知用户可以从官网下载olive的源码.翻译者已尝试用通俗易明的方式进行翻译,希望大家使用愉快.请支持自由开源软件谢谢. + + + + ActionSearch + + + Search for action... + 功能搜索... + + + + AdvancedVideoDialog + + + Advanced Video Settings + 高级视频设置 + + + + Pixel Format: + 视频格式: + + + + Threads: + 线程数量: + + + + Audio + + + %1 Audio + 音频渲染 + %1 音频 + + + + Recording %1 + 录音中 %1 + + + + AudioNoiseEffect + + + Amount + 质量 + + + + Mix + 混合 + + + + AutoCutSilenceDialog + + + Cut Silence + 静噪分离 + + + + Attack Threshold: + 触发阀值: + + + + Attack Time: + 触发时间: + + + + Release Threshold: + 释放阀值: + + + + Release Time: + 释放时间: + + + + Cacher + + + + Could not open %1 - %2 + 无法打开 %1 - %2 + + + + ChannelLayoutName + + + Invalid + 媒体文件损坏或者无效 + 媒体无效 + + + + Mono + 单声道 + + + + Stereo + 立体声 + + + + ClipPropertiesDialog + + + "%1" Properties + 处理中 "%1" + + + + Multiple Clip Properties + 多个片段属性 + + + + Name: + 名称: + + + + Duration: + 片段长度: + + + + (multiple) + 多个特效 + (多个) + + + + CollapsibleWidget + + + <untitled> + <无标题> + + + + ColorButton + + + Set Color + 选择颜色 + + + + CornerPinEffect + + + Top Left + 左上角 + + + + Top Right + 右上角 + + + + Bottom Left + 左下角 + + + + Bottom Right + 右下角 + + + + Perspective + 透视图 + + + + DebugDialog + + + Debug Log + 调试日志 + + + + DemoNotice + + + + Welcome to Olive! + 欢迎来到Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive是一个自由开源的视频编辑器.基于GNU通用公共许可证(GNU GPL)条款发布.如果你购买了这个软件,你就被蒙骗了. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + 这个软件目前处于ALPHA版本的开发阶段,意味着功能尚未稳定并且有漏洞以至于崩溃,功能并不完善.我们不会承担任何责任,所有风险皆自行承担.若发现不足的地方请向此处报告: %1 + + + + Thank you for trying Olive and we hope you enjoy it! + 谢谢您选择Olive,尽情享受吧! + + + + Effect + + + Invalid effect + 无效的特效 + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + 特效无法使用 '%1'. Ц此特效可能已经损坏. 请尝试重新安装Olive. + + + + Save Effect Settings + 保存特效设定档 + + + + + Effect XML Settings %1 + 特效设定中 %1 + + + + Save Settings Failed + 保存设定失败 + + + + Failed to open "%1" for writing. + 无法打开 "%1" 用于写入. + + + + Load Effect Settings + 加载特效设定档 + + + + + Load Settings Failed + 加载设定档失败 + + + + Failed to open "%1" for reading. + 无法打开 "%1" 用于读取. + + + + This settings file doesn't match this effect. + 设定档不匹配于此特效 + + + + EffectControls + + + (none) + (无) + + + + Effects: + 特效: + + + + Add Video Effect + 添加视频效果 + + + + VIDEO EFFECTS + 视频特效 + + + + Add Video Transition + 添加视频转场效果 + + + + Add Audio Effect + 添加音频效果 + + + + AUDIO EFFECTS + 音频效果 + + + + Add Audio Transition + 添加音频转场效果 + + + + EffectRow + + + Disable Keyframes + 禁用关键帧/动画补间 + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + 所有禁用的关键帧/动画补间将会被删除. 确认这么做? + + + + EffectUI + + + %1 (Opening) + 打开特效 + %1 (正在打开) + + + + %1 (Closing) + 关闭特效 + %1 (正在关闭) + + + + %1 (multiple) + 多个特效 + %1 (多个) + + + + Cu&t + 剪切(&T) + + + + &Copy + 复制(&C) + + + + Move &Up + 向上移动(&U) + + + + Move &Down + 向下移动(&D) + + + + D&elete + 删除(&E) + + + + Load Settings From File + 从文件加载设置 + + + + Save Settings to File + 保存设置到文件 + + + + EmbeddedFileChooser + + + File: + 文件: + + + + ExportDialog + + + Export "%1" + 汇出 "%1" + + + + Unknown codec name %1 + 未知的编解码器 %1 + + + + Export Failed + 汇出失败 + + + + Export failed - %1 + 汇出失败 - %1 + + + + Invalid dimensions + 无效的大小 + + + + Export width and height must both be even numbers/divisible by 2. + 导出宽度和高度必须都是偶数/能被2整除. + + + + Invalid codec + 无效的编解码器 + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + 无法确定所选编解码器的输出参数.这是一个bug,请联系开发人员. + + + + Invalid format + 无效的格式 + + + + Couldn't determine output format. This is a bug, please contact the developers. + 无法确定输出格式.这是一个bug,请联系开发人员. + + + + Export Media + 输出媒体 + + + + %p% (Total: %1:%2:%3) + 总量 + %p% (总计: %1:%2:%3) + + + + %p% (ETA: %1:%2:%3) + %p% (估计所需时间: %1:%2:%3) + + + + Quality-based (Constant Rate Factor) + 速率 + 质量(恒定速率因子) + + + + Constant Bitrate + 恒定比特率 + + + + + Invalid Codec + 无效的编解码器 + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + 无法为此格式匹配编解码器.输出有可能会失败. + + + + Failed to find pixel format for this encoder. Export will likely fail. + 未能找到此编码器的像素格式.输出有可能会失败. + + + + Bitrate (Mbps): + 比特率 (Mbp/s): + + + + Quality (CRF): + 质量 (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + 质量因素: + +0 = 无损耗 +17-18 = 无法察觉的损耗 (压缩,但不明显) +23 = 高品质 +51 = 最低品质 + + + + Target File Size (MB): + 输出文件大小 (MB): + + + + Format: + 格式: + + + + Range: + 范围: + + + + Entire Sequence + 整个片段 + + + + In to Out + 已选择的时间段 + + + + Video + 视频 + + + + + Codec: + 编解码器: + + + + Width: + 宽度: + + + + Height: + 高度: + + + + Frame Rate: + 帧率: + + + + Compression Type: + 压缩类型: + + + + Advanced + 高级 + + + + Audio + 音频 + + + + Sampling Rate: + 采样率: + + + + Bitrate (Kbps/CBR): + 比特率 ((Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + 发送帧到编码器失败 (%1) + + + + failed to receive packet from encoder (%1) + 无法从编码器接收数据包 (%1) + + + + could not video encoder for %1 + 无视频编解码器 %1 + + + + could not allocate video stream + 无法分配视频流 + + + + could not allocate video encoding context + 无法分配视频编码上下文 + + + + could not open output video encoder (%1) + 无法打开输出视频编码器 (%1) + + + + could not copy video encoder parameters to output stream (%1) + 无法将视频编码器参数复制到输出流 (%1) + + + + could not audio encoder for %1 + не вдалося знайти кодувальник аудіо для %1 + + + + could not allocate audio stream + 无法分配音频流 + + + + could not allocate audio encoding context + 无法分配音频编码上下文 + + + + could not open output audio encoder (%1) + 无法打开输出音频编码器 (%1) + + + + could not copy audio encoder parameters to output stream (%1) + 无法将音频编码器参数复制到输出流 (%1) + + + + could not allocate audio buffer (%1) + 无法分配音频缓冲区 (%1) + + + + could not create output format context + 无法分配音频缓冲区 + + + + could not open output file (%1) + 无法打开输出文件 (%1) + + + + could not write output file header (%1) + 无法写入输出文件标题 (%1) + + + + could not write output file trailer (%1) + 无法写入输出文件 + 无法写入输出文件预告片 (%1) + + + + FillLeftRightEffect + + + Type + 类型 + + + + Fill Left with Right + 从左到右填满 + + + + Fill Right with Left + 从右到左填满 + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + 无法加载 плагін 插件 "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + 警告:您不能将32位的Frei0r插件加载到64位的Olive构建中.请找到这个插件的64位版本或切换到32位的Olive构建版本. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + 警告:您不能将64位的Frei0r插件加载到32位的Olive构建中.请找到这个插件的32位版本或切换到64位构建的Olive. + + + + Error loading Frei0r plugin + 加载Frei0插件时发生错误 + + + + GraphEditor + + + Graph Editor + 图形编辑器 + + + + Linear + 线性 + + + + Bezier + 贝塞尔曲线 + + + + Hold + 保留 + + + + GraphView + + + Zoom to Selection + 缩放选择 + + + + Zoom to Show All + 放大显示所有 + + + + Reset View + 重置视图 + + + + InterlacingName + + + None (Progressive) + 无 (进度) + + + + Top Field First + 顶端区域优先 + + + + Bottom Field First + 底部区域优先 + + + + Invalid + 无效 + + + + KeyframeNavigator + + + Enable Keyframes + 开启关键帧/动画补间 + + + + KeyframeView + + + Linear + 线性 + + + + Bezier + 贝塞尔曲线 + + + + Hold + 保留 + + + + LabelSlider + + + &Edit + 输入值(&E) + + + + &Reset to Default + 重置为默认(&R) + + + + + Set Value + 设定值 + + + + + New value: + 新值: + + + + LoadDialog + + + Loading... + 加载中... + + + + Loading '%1'... + 加载中 '%1'... + + + + Cancel + 取消 + + + + LoadThread + + + Version Mismatch + 版本不匹配 + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + 此项目用Olive的另一个版本保存,可能与此版本不完全兼容.无论如何,您想尝试加载它吗? + + + + Invalid Clip Link + 无效的视频链接 + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + 此项目包含无效的剪辑链接.可能已经损坏.您要继续装吗? + + + + %1 - Line: %2 Col: %3 + %1 - 行: %2 列: %3 + + + + User aborted loading + 用户终止加载 + + + + XML Parsing Error + XML解析错误 + + + + Couldn't load '%1'. %2 + 无法加载%1'. %2 + + + + Project Load Error + 项目加载错误 + + + + Error loading project: %1 + 加载项目是发生错误: %1 + + + + MainWindow + + + Welcome to %1 + 欢迎来到 %1 + + + + &File + 文件(&F) + + + + &New + 新建(&N) + + + + &Open Project + 打开项目(&O) + + + + Clear Recent List + 清除最近的列表 + + + + Open Recent + 打开最近的列表 + + + + &Save Project + 保存项目(&S) + + + + Save Project &As + 保存项目为(&A) + + + + &Import... + 输入(&I) + + + + &Export... + 输出(&E) + + + + E&xit + 退出(&I) + + + + &Edit + 编辑(&E) + + + + &Undo + 撤销(&U) + + + + Redo + 重做 + + + + Select &All + 选择全部(&A) + + + + Deselect All + 取消选择所有 + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + 删除标记的区域 + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + 设置/编辑标记 + + + + &View + 视图(&V) + + + + Zoom In + 放大 + + + + Zoom Out + 缩小 + + + + Increase Track Height + 增加轨道高度 + + + + Decrease Track Height + 降低轨道高度 + + + + Toggle Show All + 轨道全部显示 + + + + Track Lines + 轨道线 + + + + Rectified Waveforms + 整流波形 + + + + Frames + + + + + Drop Frame + 丢失的帧 + + + + + Non-Drop Frame + 保留的帧 + + + + + Milliseconds + 毫秒 + + + + Title/Action Safe Area + 字幕/行动安全区域 + + + + Off + 关闭 + + + + Default + 默认 + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + 自定义 + + + + Full Screen + 全屏 + + + + Full Screen Viewer + 全屏预览 + + + + &Playback + 回放(&P) + + + + Go to Start + 回到起始帧 + + + + Previous Frame + 前一帧 + + + + Play/Pause + 播放/暂停 + + + + Play In to Out + 播放已标记的区域 + + + + Next Frame + 下一帧 + + + + Go to End + 转到结束帧 + + + + Go to Previous Cut + 切换到之前的位置 + + + + Go to Next Cut + 转到下一个位置 + + + + Go to In Point + 转到时间的起始标记处 + + + + Go to Out Point + 转到时间的结束标记处 + + + + Shuttle Left + 向左播放 + + + + Shuttle Stop + 停止播放 + + + + Shuttle Right + 向右播放 + + + + Loop + 循环播放 + + + + &Window + 窗口(&W) + + + + Project + 项目 + + + + Effect Controls + 效果控制 + + + + Timeline + 时间轴 + + + + Graph Editor + 图形编辑器 + + + + Media Viewer + 媒体查看器 + + + + Sequence Viewer + 片段查看器 + + + + Maximize Panel + 最大化面板 + + + + Lock Panels + 锁定面板 + + + + Reset to Default Layout + 重置为默认布局 + + + + &Tools + 工具(&T) + + + + Pointer Tool + 选择/移动/默认 + + + + Edit Tool + 选择部分 + + + + Ripple Tool + 涟漪的工具 + + + + Razor Tool + 剪刀 + + + + Slip Tool + 滑动工具 + + + + Slide Tool + 幻灯片工具 + + + + Hand Tool + 移动时间轴 + + + + Transition Tool + 转场/过渡效果 + + + + Enable Snapping + 开启边缘吸合/自动对齐 + + + + Auto-Cut Silence + 噪声分离 + + + Selecting Also Seeks + + + + Edit Tool Also Seeks + + + + Edit Tool Selects Links + + + + Seek Also Selects + + + + Seek to the End of Pastes + + + + Scroll Wheel Zooms + + + + Hold CTRL to toggle this setting + 按住CTRL切换至此设置 + + + Invert Timeline Scroll Axes + 反转时间轴滚动轴 + + + Enable Drag Files to Timeline + 启用拖动文件到时间轴 + + + Auto-Scale By Default + 默认情况下自动缩放 + + + Enable Seek to Import + + + + Audio Scrubbing + 拖动音频同时播放 + + + Enable Drop on Media to Replace + 开启拖动到媒体上面后替换该媒体 + + + Enable Hover Focus + 启用悬停焦点 + + + Ask For Name When Setting Marker + 设置标记时询问名称 + + + + No Auto-Scroll + 关闭时间轴自动滚动 + + + + Page Auto-Scroll + 页面时间轴自动滚动 + + + + Smooth Auto-Scroll + 时间轴自动平滑滚动 + + + + Preferences + 首选项 + + + + Clear Undo + 清除撤消 + + + + &Help + 帮助(&H) + + + + A&ction Search + 功能查找(&C) + + + + Debug Log + 调试日志 + + + + &About... + 关于(&A) + + + + <untitled> + <无标题> + + + + Marker + + + Set Marker + 设置标记 + + + + Set clip marker name: + 设置该剪辑标记的名称: + + + + Set sequence marker name: + 设置序列标记名称: + + + + Media + + + New Folder + 新建文件夹 + + + + Name: + 名称: + + + + Filename: + 文件名: + + + + Video Dimensions: + 视频大小: + + + + Frame Rate: + 帧速率: + + + + %1 field(s) (%2 frame(s)) + + + + + Interlacing: + + + + + Audio Frequency: + 音频频率: + + + + Audio Channels: + 音频通道: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + 名称: %1 +视频大小: %2x%3 +帧率:: %4 +音频: %5 +音频布局: %6 + + + + Name + 名称 + + + + Duration + 持续时间 + + + + Rate + 速率 + + + + MediaPropertiesDialog + + + "%1" Properties + 属性 "%1" + + + + Tracks: + 轨道: + + + + Video %1: %2x%3 %4FPS + 视频 %1: %2x%3 %4FPS + + + + Audio %1: %2Hz %3 + 音频 %1: %2Hz %3 + + + + %n channel(s) + + %n 通道 + + + + + Conform to Frame Rate: + 符合帧率: + + + + Alpha is Premultiplied + + + + + Auto (%1) + 自动 (%1) + + + + Interlacing: + + + + + Name: + 名称: + + + + MenuHelper + + + &Project + 项目(&P) + + + + &Sequence + 片段(&S) + + + + &Folder + 目录(&F) + + + + Set In Point + 设置时间的起始标记 + + + + Set Out Point + 设置时间的结束标记 + + + + Reset In Point + 重置时间的起始标记 + + + + Reset Out Point + 重置时间的结束标记 + + + + Clear In/Out Point + 清除时间标记 + + + + Add Default Transition + 添加默认的转场效果 + + + + Link/Unlink + 链接/取消链接音频和视频 + + + + Enable/Disable + 启用/禁用 + + + + Nest + 嵌套 + + + + Cu&t + 剪切(&T) + + + + Cop&y + 复制(&Y) + + + + + &Paste + 粘帖(&P) + + + + Paste Insert + 插入式粘贴 + + + + Duplicate + 复制 + + + + Delete + 删除 + + + + Ripple Delete + 抽出片段并删除 + + + + Split + 切断 + + + + Invalid aspect ratio + 无效的长宽比 + + + + The aspect ratio '%1' is invalid. Please try again. + 长宽比无效 '%1', 请再试一次. + + + + Enter custom aspect ratio + 输入自定义纵横比 + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + 输入字幕/动作安全区使用的纵横比 (例子, 16:9): + + + + NewSequenceDialog + + + Editing "%1" + 编辑中 "%1" + + + + New Sequence + 新片段 + + + + Preset: + 预置: + + + + Film 4K + 4k电影 + + + + TV 4K (Ultra HD/2160p) + 4K电视 (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + 自定义 + + + + Video + 视频 + + + + Width: + 宽度: + + + + Height: + 高度: + + + + Frame Rate: + 帧速率: + + + + Pixel Aspect Ratio: + 像素长宽比 + + + + Square Pixels (1.0) + 像素长宽比 (1.0) + + + + Interlacing: + + + + + None (Progressive) + + + + + Audio + 音频 + + + + Sample Rate: + 采样率: + + + + Name: + 名称: + + + + OliveGlobal + + + Olive Project %1 + Olive 项目 %1 + + + + Auto-recovery + 自动恢复 + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive没有被正确关闭并检测到一个自动恢复文件,你要打开吗? + + + + Open Project... + 打开项目... + + + + Missing recent project + 缺少最近的项目 + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + 这个项目 '%1' 已经不存在了。您想把它从最近的项目列表中删除吗? + + + + Save Project As... + 保存项目为... + + + + Unsaved Project + 未保存的项目 + + + + This project has changed since it was last saved. Would you like to save it before closing? + 这个项目自从上次保存以来已经发生了变化,您想在关门前保存吗? + + + + No active sequence + 没有已激活的片段 + + + + Please open the sequence to perform this action. + 请打开片段以执行这个功能. + + + + No clips selected + 没有剪辑被选择 + + + + Select the clips you wish to auto-cut + 选择剪辑以自动剪裁 + + + Please open the sequence you wish to export. + 请打开要输出的片段. + + + + Missing Project File + В丢失的项目文件 + + + + Specified project '%1' does not exist. + 指定的项目 '%1' 未找到. + + + + PanEffect + + + Pan + 左右平衡/平移 + + + + PreferencesDialog + + + Preferences + 首选项 + + + + Default Sequence + 默认片段 + + + + Invalid CSS File + 无效的CSS文件 + + + + CSS file '%1' does not exist. + CSS文件 '%1' 不存在. + + + + Confirm Reset All Shortcuts + 确认重置所有快捷键 + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + 您确定要将所有键盘快捷键重置为默认值吗? + + + + Import Keyboard Shortcuts + 导入键盘快捷键配置 + + + + + Error saving shortcuts + 保存键盘快捷键是发生错误 + + + + Failed to open file for reading + 无法读取文件 + + + + Export Keyboard Shortcuts + 汇出键盘快捷键配置 + + + + Export Shortcuts + 汇出快捷键 + + + + Shortcuts exported successfully + 快捷键成功汇出 + + + + Failed to open file for writing + 无法写入文件 + + + + Browse for CSS file + 浏览CSS文件 + + + + Delete All Previews + 删除所有预览 + + + + Are you sure you want to delete all previews? + 您确定要删除所有预览吗? + + + + Previews Deleted + 预览成功删除 + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + 所有预览成功删除,重新打开当前项目以生效. + + + + Language: + 语言: + + + + Image sequence formats: + 图形片段个是: + + + + Thumbnail Resolution: + 缩略图分辨率: + + + + Waveform Resolution: + 音频波形分辨率 + + + + Delete Previews + 删除预览 + + + + Use Software Fallbacks When Possible + 尽量用软件回放 + + + + Default Sequence Settings + 默认的片段设置 + + + + General + 一般 + + + + Behavior + 行为 + + + + Add Default Effects to New Clips + 添加默认效果到新的剪辑 + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + 当播放结束后自动回到开始位置 + + + + Selecting Also Seeks + 选择并查找 + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + 滚轮缩放 + + + + Hold CTRL to toggle this setting + CTRL键和滚轮同时使用实现同样的效果 + + + + Invert Timeline Scroll Axes + 反转时间轴滚动轴 + + + + Enable Drag Files to Timeline + 开启拖放文件到时间轴 + + + + Auto-Scale By Default + 默认情况下自动缩放 + + + + Auto-Seek to Imported Clips + 自动寻找并导入剪辑 + + + + Audio Scrubbing + 拖动音频同时播放 + + + + Drop Files on Media to Replace + 拖放文件以代替媒体 + + + + Enable Hover Focus + 启用悬停焦点 + + + + Ask For Name When Setting Marker + 设置标记时询问名称 + + + + Appearance + 外观 + + + + Theme + 主题 + + + + Olive Dark (Default) + Olive 暗色 (默认) + + + + Olive Light + Olive 明亮 + + + + Native + 原生 + + + + Native (Light Icons) + 原生 (明亮图标) + + + + Use Native Menu Styling + 使用原生菜单风格 + + + + Custom CSS: + 自定义 CSS: + + + + Browse + 浏览 + + + + Effect Textbox Lines: + 文本框线效果: + + + Seeking + 查找中 + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + 精准查找 +总是显示当前按的帧 (视觉可能会在检索到正确的帧时暂停) + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + 快速查找 +查找得更快 (搜索时可能会短暂显示不准确的帧—不影响回放/导出) + + + + Memory Usage + 内存使用 + + + + Upcoming Frame Queue: + 即将到来的帧队列: + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + 前一帧队列: + + + + Playback + 回放 + + + + Output Device: + 输出设备: + + + + + Default + 默认 + + + + Input Device: + 输入设备: + + + + Sample Rate: + 采样率: + + + + Audio Recording: + 音频录制: + + + + Mono + 单声道 + + + + Stereo + 立体声 + + + + Audio + 音频 + + + + Search for action or shortcut + 搜索功能或者快捷键 + + + + Action + 功能 + + + + Shortcut + 快捷键 + + + + Import + 输入 + + + + Export + 汇出 + + + + Reset Selected + 重新选择 + + + + Reset All + 全部重设 + + + + Keyboard + 键盘 + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + 未能找到任何有效的视频/音频流 + + + + Could not open file - %1 + 无法打开文件 — %1 + + + + Could not find stream information - %1 + 无法找到流信息 — %1 + + + + Project + + + New + 新建 + + + + Open Project + 打开项目 + + + + Save Project + 保存项目 + + + + Undo + 撤销 + + + + Redo + 重做 + + + + Tree View + 详细视图 + + + + Icon View + 缩略图 + + + + List View + 列表视图 + + + + Search media, markers, etc. + 搜索媒体,标记等. + + + + Project + 项目 + + + + Sequence + 片段 + + + + Replace '%1' + 代替 '%1' + + + + + All Files + 全部文件 + + + + + No active sequence + 没有已激活的片段 + + + + No sequence is active, please open the sequence you want to replace clips from. + 没有片段处于激活状态,请打开要代替剪辑的片段. + + + + Active sequence selected + 激活选择的片段 + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + 无法插入该片段至自己当中,所以这个媒体的剪辑不会在这个片段中. + + + + Rename '%1' + 重命名 '%1' + + + + Enter new name: + 输入新的名称: + + + + Delete media in use? + 删除使用中的媒体? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + 此媒体 '%1' 正在被使用于 '%2'. 删除它将删除片段中的所有实例. В你确定你要这么做吗? + + + + Skip + 跳过 + + + + Import a Project + 导入一个项目 + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" 是Olive项目文件. 它将与这个项目合并. 你想继续吗? + + + + Image sequence detected + 图像片段检测 + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + 该文件 '%1' 似乎是图像片段中的一部分. 您要按原样代替吗? + + + + Import media... + 输入媒体... + + + + No sequence is active, please open the sequence you want to delete clips from. + 没有片段处于激活状态,请打开要从中删除剪辑的片段. + + + + ProxyDialog + + + Create Proxy + 创建代理 + + + + Proxy + 代理 + + + + Dimensions: + 大小: + + + + Same Size as Source + 使用与来源相同的大小 + + + + Half Resolution (1/2) + 一半的分辨率 (1/2) + + + + Quarter Resolution (1/4) + 四分之一的分辨率 (1/4) + + + + Eighth Resolution (1/8) + 八分之一的分辨率 (1/8) + + + + Sixteenth Resolution (1/16) + 十六分之一的分辨率 (1/16) + + + + Format: + 个格式: + + + + ProRes HQ + ProRes HQ + + + + Location: + 位置: + + + + Same as Source (in "%1" folder) + 使用与来源相同的大小 (在 "%1" 目录) + + + + Proxy file exists + 代理文件存在 + + + + The file "%1" already exists. Do you wish to replace it? + 该文件 "%1" 已经存在. 你想代替它吗? + + + + Custom Location + 自定义路径 + + + + ProxyGenerator + + + Finished generating proxy for "%1" + 完成生成代理 "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + 取代剪辑使用 "%1" + + + + Select which media you want to replace this media's clips with: + 选择要替换此媒体的媒体: + + + + Keep the same media in-points + 保持相同的媒体插入点 + + + + Replace + 取代 + + + + Cancel + 取消 + + + + No media selected + 没有已选择的媒体 + + + + Please select a media to replace with or click 'Cancel'. + 请选择一个媒体替代或取消. + + + + Same media selected + 相同的媒体被选择 + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + 你选择了相同的媒体代替.请选择其他或者取消. + + + + Folder selected + 目录选择 + + + + You cannot replace footage with a folder. + 您无法用文件夹替换素材. + + + + Active sequence selected + 激活的片段已经被选择 + + + + You cannot insert a sequence into itself. + 无法插入该片段至自己当中. + + + + RichTextEffect + + + Text + 文本格式 + + + + Padding + 填充 + + + + Position + 位置 + + + + Vertical Align: + 垂直对齐: + + + + Top + 顶部 + + + + Center + 中心点 + + + + Bottom + 底下 + + + + Auto-Scroll + 自动卷动 + + + + Off + 关闭 + + + + Up + + + + + Down + + + + + Left + + + + + Right + + + + + Shadow + 阴影 + + + + Shadow Color + 阴影颜色 + + + + Shadow Angle + 阴影角度 + + + + Shadow Distance + 阴影距离 + + + + Shadow Softness + 阴影柔软化 + + + + Shadow Opacity + 阴影透明度 + + + + Sequence + + + %1 (copy) + %1 (复制) + + + + ShakeEffect + + + Intensity + 强度 + + + + Rotation + 旋转 + + + + Frequency + 频率 + + + + SolidEffect + + + Type + 类型 + + + + Solid Color + 纯色 + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + 透明度 + + + + Color + 颜色 + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + 输入... + + + + New + 新建 + + + + View + 视图 + + + + Tree View + 树视图 + + + + Icon View + 图标视图 + + + + Show Toolbar + 显示工具栏 + + + + Show Sequences + 显示片段 + + + + Replace/Relink Media + 替换/重新链接媒体 + + + + Reveal in Explorer + 在浏览器中预览 + + + + Reveal in Finder + 在查找当中预览 + + + + Reveal in File Manager + 在文件管理器中预览 + + + + Replace Clips Using This Media + 使用此媒体替换剪辑 + + + + Create Sequence With This Media + 使用此媒体创建片段 + + + + Duplicate + 复制 + + + + Delete All Clips Using This Media + 删除所有使用此问题的剪辑 + + + + Proxy + 代理 + + + + Generating proxy: %1% complete + 生成代理: %1% 完成 + + + + Create/Modify Proxy + 创建/修改代理 + + + + Create Proxy + 创建代理 + + + + Modify Proxy + 修改代理 + + + + Restore Original + 还原为原始尺寸 + + + + Delete + 删除 + + + + Preview in Media Viewer + 在媒体浏览器中预览 + + + + Properties... + 属性... + + + + Replace Media + 取代媒体 + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + 你拖放了一个文件到 '%1'. 你要取代它吗? + + + + Delete proxy + 删除代理 + + + + Would you like to delete the proxy file "%1" as well? + 您要删除代理文件吗 "%1"? + + + + SpeedDialog + + + Speed/Duration + 速度/持续时间 + + + + Speed: + 速度: + + + + Frame Rate: + 帧速率: + + + + Duration: + 持续时间: + + + + Reverse + 反向 + + + + Maintain Audio Pitch + 保持音频音调 + + + + Ripple Changes + 波纹变化 + + + + TextEditDialog + + + Edit Text + 编辑文本格式 + + + + Thin + + + + + Extra Light + 加亮 + + + + Light + + + + + Normal + 正常 + + + + Medium + 中等 + + + + Demi Bold + + + + + Bold + 粗体 + + + + Extra Bold + 加粗 + + + + Black + + + + + TextEditEx + + + Edit Text + 编辑文本 + + + + &Edit Text + 编辑文本(&E) + + + + TextEffect + + + Text + 文本 + + + + Font + 字体 + + + + Size + 大小 + + + + Color + 颜色 + + + + Alignment + 校准 + + + + Left + + + + + + Center + 中心 + + + + Right + + + + + Justify + 整理版面 + + + + Top + 顶部 + + + + Bottom + 底下 + + + + Word Wrap + 自动换行 + + + + Padding + 填充 + + + + Position + 位置 + + + + Outline + 轮廓 + + + + Outline Color + 轮廓颜色 + + + + Outline Width + 轮廓宽 + + + + Shadow + 阴影 + + + + Shadow Color + 阴影颜色 + + + + Shadow Angle + 阴影角度 + + + + Shadow Distance + 阴影距离 + + + + Shadow Softness + 阴影柔软化 + + + + Shadow Opacity + 阴影透明度 + + + + Sample Text + 文字样本 + + + + TimecodeEffect + + + Timecode + + + + + Sequence + 片段 + + + + Media + 媒体 + + + + Scale + 缩放 + + + + Color + 颜色 + + + + Background Color + 背景颜色 + + + + Background Opacity + 背景透明度 + + + + Offset + 补偿 + + + + Prepend + 前置 + + + + Timeline + + + Pointer Tool + 选择/移动/默认 + + + + Edit Tool + 选择部分 + + + + Ripple Tool + 涟漪的工具 + + + + Razor Tool + 剪刀 + + + + Slip Tool + 滑动工具 + + + + Slide Tool + 幻灯片工具 + + + + Hand Tool + 手形工具 + + + + Transition Tool + 过度/转场效果 + + + + Snapping + 边缘吸合/自动对齐 + + + + Zoom In + 放大 + + + + Zoom Out + 缩小 + + + + Record audio + 录制声音 + + + + Add title, solid, bars, etc. + 添加字幕,实体,栏等. + + + + Nested Sequence + 嵌套的片段 + + + + Effect already exists + 特效已经存在 + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + 剪辑 '%1' 已经包含了 '%2'效果. 您是想替换它,还是作为单独的效果加入? + + + + Add + 添加 + + + + Replace + 取代 + + + + Skip + 跳过 + + + + Do this for all conflicts found + 对所有发现的冲突都这样做吗 + + + + Title... + 字幕... + + + + Solid Color... + 单色... + + + + Bars... + 栏... + + + + Tone... + 增强… + + + + Noise... + 噪音... + + + + Unsaved Project + 未保存的项目 + + + + You must save this project before you can record audio in it. + 必须先保存此项目,才能在其中录制音频. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + 单击要开始录制的时间轴(拖动可将录制限制在某个时间段) + + + + Timeline: + 时间轴: + + + + (none) + (无) + + + + TimelineHeader + + + Center Timecodes + 以时间区间/点显示 + + + + TimelineWidget + + + &Undo + 撤销(&U) + + + + &Redo + 重做(&R) + + + + R&ipple Delete Empty Space + 连接片段/去除空白空间(&I) + + + + Sequence Settings + 片段设置 + + + + &Speed/Duration + 速度/持续时间(&S) + + + Auto-s&cale + 自动缩放(&C) + + + + Auto-Cut Silence + 噪声分离 + + + + Auto-S&cale + 自动缩放(&C) + + + + &Reveal in Project + 在项目库中显示(&R) + + + + Properties + 属性 + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +起点: %2 +终止: %3 +持续时间: %4 + + + + Error + 错误 + + + + Couldn't locate media wrapper for sequence. + 无法找到片段的媒体包装器. + + + + Title + 字幕 + + + + Solid Color + 单色 + + + + Bars + + + + + Tone + + + + + Noise + 噪音 + + + + Duration: + 持续时间: + + + + ToneEffect + + + Type + 类型 + + + + Sine + 正弦 + + + + Frequency + 频率 + + + + Amount + 数量 + + + + Mix + 混合 + + + + TransformEffect + + + Position + 位置 + + + + Scale + 缩放 + + + + Uniform Scale + 统一缩放的大小 + + + + Rotation + 旋转 + + + + Anchor Point + 锚点 + + + + Opacity + 透明度 + + + + Blend Mode + 混合模式 + + + + Normal + 标准 + + + + Transition + + + Length + 长度 + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + 发现新版本.请访问www.olivevideoeditor.org下载. + + + + VSTHost + + + + Error loading VST plugin + 加载VST插件按时发生错误 + + + Failed to create VST reference + 无法创建VST参考 + + + + Failed to load VST plugin "%1": %2 + 无法加载VST插件 "%1": %2 + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + 警告: 您不能将32位VST插件加载到64位Olive构建中。请找到这个插件的64位版本或切换到32位的Olive构建版本. + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + 警告: 您不能将64位VST插件加载到32位Olive构建中。请找到这个插件的32位版本或切换到64位的Olive构建版本. + + + + Failed to locate entry point for dynamic library. + 未能找到动态库的入口点. + + + + VST Error + VST发生错误 + + + + Plugin's magic number is invalid + 插件的幻数无效 + + + + VST Plugin + VST插件 + + + + Plugin + 插件 + + + + Interface + 用户界面 + + + + Show + 显示 + + + + Viewer + + + (none) + (无) + + + + Drag video only + 只拖放视频 + + + + Drag audio only + 只拖放音频 + + + + Sequence Viewer + 片段预览 + + + + Media Viewer + 媒体预览 + + + + ViewerWidget + + + Save Frame as Image... + 保存帧为图像... + + + + Show Fullscreen + 全屏模式 + + + + Disable + 关闭 + + + + Screen %1: %2x%3 + 放映 %1: %2x%3 + + + + Zoom + 缩放 + + + + Fit + 适合 + + + + Custom + 自定义 + + + + Close Media + 关闭媒体 + + + + Save Frame + 保存帧 + + + + Viewer Zoom + 预览缩放 + + + + Set Custom Zoom Value: + 设置自己定义缩放: + + + + ViewerWindow + + + Exit Fullscreen + 退出全屏 + + + + VoidEffect + + + (unknown) + (未知) + + + + Missing Effect + 缺失特效 + + + + VolumeEffect + + + Volume + 音量 + + + + transition + + + Invalid transition + 无效的转场效果 + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + 没有适合做转场效果的条件 '%1'. 该效果的插件可能已经损坏. 请尝试重新安装它或者Olive. + + + diff --git a/app/ts/zh_TW.ts b/app/ts/zh_TW.ts new file mode 100755 index 000000000..e784bb2bc --- /dev/null +++ b/app/ts/zh_TW.ts @@ -0,0 +1,3759 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive是免費的非線性視頻編輯器.基于GNU通用公共許可證(GNU GPL)條款發佈. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive團隊有義務告知用戶可以從官網下載olive的源碼.翻譯者已嘗試用通俗易明的方式進行翻譯,希望大家使用愉快.請支持自由開源軟件謝謝. + + + + ActionSearch + + + Search for action... + 功能搜索... + + + + AdvancedVideoDialog + + + Advanced Video Settings + 高級視頻設置 + + + + Pixel Format: + 視頻格式: + + + + Threads: + 綫程數量: + + + + Audio + + + %1 Audio + 音頻渲染 + %1 音頻 + + + + Recording %1 + 錄音中 %1 + + + + AudioNoiseEffect + + + Amount + 質量 + + + + Mix + 混合 + + + + AutoCutSilenceDialog + + + Cut Silence + 靜噪分離 + + + + Attack Threshold: + 觸發閥值: + + + + Attack Time: + 觸發時間: + + + + Release Threshold: + 釋放閥值: + + + + Release Time: + 釋放時間: + + + + Cacher + + + + Could not open %1 - %2 + 無法打開 %1 - %2 + + + + ChannelLayoutName + + + Invalid + 媒體檔案損壞或者無效 + 媒體無效 + + + + Mono + 單聲道 + + + + Stereo + 立體聲 + + + + ClipPropertiesDialog + + + "%1" Properties + 處理中 "%1" + + + + Multiple Clip Properties + 多個片段屬性 + + + + Name: + 名稱: + + + + Duration: + 片段長度: + + + + (multiple) + 多個特效 + (多個) + + + + CollapsibleWidget + + + <untitled> + <無標題> + + + + ColorButton + + + Set Color + 選擇顏色 + + + + CornerPinEffect + + + Top Left + 左上角 + + + + Top Right + 右上角 + + + + Bottom Left + 左下角 + + + + Bottom Right + 右下角 + + + + Perspective + 透視圖 + + + + DebugDialog + + + Debug Log + 調試日誌 + + + + DemoNotice + + + + Welcome to Olive! + 歡迎來到Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + Olive是一個自由開源的視頻編輯器.基于GNU通用公共許可證(GNU GPL)條款發佈.如果你購買了這個軟件,你就被矇騙了. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + 這個軟件目前處于ALPHA版本的開發階段,意味着功能尚未穩定並且有漏洞以至于崩潰,功能並不完善.我們不會承擔任何責任,所有風險皆自行承擔.若發現不足的地方請向此處報告: %1 + + + + Thank you for trying Olive and we hope you enjoy it! + 謝謝您選擇Olive,盡情享受吧! + + + + Effect + + + Invalid effect + 無效的特效 + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + 特效無法使用 '%1'. Ц此特效可能已經損壞. 請嘗試重新安裝Olive. + + + + Save Effect Settings + 保存特效設定檔 + + + + + Effect XML Settings %1 + 特效設定中 %1 + + + + Save Settings Failed + 保存設定失敗 + + + + Failed to open "%1" for writing. + 無法打開 "%1" 用於寫入. + + + + Load Effect Settings + 加載特效設定檔 + + + + + Load Settings Failed + 加載設定檔失敗 + + + + Failed to open "%1" for reading. + 無法打開 "%1" 用於讀取. + + + + This settings file doesn't match this effect. + 設定檔不匹配于此特效 + + + + EffectControls + + + (none) + (無) + + + + Effects: + 特效: + + + + Add Video Effect + 添加視頻效果 + + + + VIDEO EFFECTS + 視頻特效 + + + + Add Video Transition + 添加視頻轉場效果 + + + + Add Audio Effect + 添加音頻效果 + + + + AUDIO EFFECTS + 音頻效果 + + + + Add Audio Transition + 添加音頻轉場效果 + + + + EffectRow + + + Disable Keyframes + 禁用關鍵幀/動畫補間 + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + 所有禁用的關鍵幀/動畫補間將會被刪除. 確認這麼做? + + + + EffectUI + + + %1 (Opening) + 打開特效 + %1 (正在打開) + + + + %1 (Closing) + 關閉特效 + %1 (正在關閉) + + + + %1 (multiple) + 多個特效 + %1 (多個) + + + + Cu&t + 剪切(&T) + + + + &Copy + 複製(&C) + + + + Move &Up + 向上移動(&U) + + + + Move &Down + 向下移動(&D) + + + + D&elete + 刪除(&E) + + + + Load Settings From File + 從檔案加載設置 + + + + Save Settings to File + 保存設置到檔案 + + + + EmbeddedFileChooser + + + File: + 檔案: + + + + ExportDialog + + + Export "%1" + 匯出 "%1" + + + + Unknown codec name %1 + 未知的編解碼器 %1 + + + + Export Failed + 匯出失敗 + + + + Export failed - %1 + 匯出失敗 - %1 + + + + Invalid dimensions + 無效的大小 + + + + Export width and height must both be even numbers/divisible by 2. + 導出寬度和高度必須都是偶數/能被2整除. + + + + Invalid codec + 無效的編解碼器 + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + 無法確定所選編解碼器的輸出參數.這是一個bug,請聯繫開發人員. + + + + Invalid format + 無效的格式 + + + + Couldn't determine output format. This is a bug, please contact the developers. + 無法確定輸出格式.這是一個bug,請聯繫開發人員. + + + + Export Media + 匯出媒體 + + + + %p% (Total: %1:%2:%3) + 總量 + %p% (總計: %1:%2:%3) + + + + %p% (ETA: %1:%2:%3) + %p% (估計所需時間: %1:%2:%3) + + + + Quality-based (Constant Rate Factor) + 速率 + 質量(恆定速率因子) + + + + Constant Bitrate + 恆定比特率 + + + + + Invalid Codec + 無效的編解碼器 + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + 無法為此格式匹配編解碼器.輸出有可能會失敗. + + + + Failed to find pixel format for this encoder. Export will likely fail. + 未能找到此編碼器的像素格式.輸出有可能會失敗. + + + + Bitrate (Mbps): + 比特率 (Mbp/s): + + + + Quality (CRF): + 質量 (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + 質量因素: + +0 = 無損耗 +17-18 = 無法察覺的損耗 (壓縮,但不明顯) +23 = 高品質 +51 = 最低品質 + + + + Target File Size (MB): + 輸出檔案大小 (MB): + + + + Format: + 格式: + + + + Range: + 範圍: + + + + Entire Sequence + 整個片段 + + + + In to Out + 已選擇的時間段 + + + + Video + 視頻 + + + + + Codec: + 編解碼器: + + + + Width: + 寬度: + + + + Height: + 高度: + + + + Frame Rate: + 幀率: + + + + Compression Type: + 壓縮類型: + + + + Advanced + 高級 + + + + Audio + 音頻 + + + + Sampling Rate: + 採樣率: + + + + Bitrate (Kbps/CBR): + 比特率 ((Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + 發送幀到編碼器失敗 (%1) + + + + failed to receive packet from encoder (%1) + 無法從編碼器接收數據包 (%1) + + + + could not video encoder for %1 + 無視頻編解碼器 %1 + + + + could not allocate video stream + 無法分配視頻流 + + + + could not allocate video encoding context + 無法分配視頻編碼上下文 + + + + could not open output video encoder (%1) + 無法打開輸出視頻編碼器 (%1) + + + + could not copy video encoder parameters to output stream (%1) + 無法將視頻編碼器參數複製到輸出流 (%1) + + + + could not audio encoder for %1 + не вдалося знайти кодувальник аудіо для %1 + + + + could not allocate audio stream + 無法分配音頻流 + + + + could not allocate audio encoding context + 無法分配音頻編碼上下文 + + + + could not open output audio encoder (%1) + 無法打開輸出音頻編碼器 (%1) + + + + could not copy audio encoder parameters to output stream (%1) + 無法將音頻編碼器參數複製到輸出流 (%1) + + + + could not allocate audio buffer (%1) + 無法分配音頻緩衝區 (%1) + + + + could not create output format context + 無法分配音頻緩衝區 + + + + could not open output file (%1) + 無法打開輸出檔案 (%1) + + + + could not write output file header (%1) + 無法寫入輸出檔案標題 (%1) + + + + could not write output file trailer (%1) + 無法寫入輸出檔案 + 無法寫入輸出檔案預告片 (%1) + + + + FillLeftRightEffect + + + Type + 類型 + + + + Fill Left with Right + 從左到右填滿 + + + + Fill Right with Left + 從右到左填滿 + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + 無法加載 плагін 插件 "%1": %2 + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + 警告:您不能將32位的Frei0r插件加載到64位的Olive構建中.請找到這個插件的64位版本或切換到32位的Olive構建版本. + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + 警告:您不能將64位的Frei0r插件加載到32位的Olive構建中.請找到這個插件的32位版本或切換到64位構建的Olive. + + + + Error loading Frei0r plugin + 加載Frei0插件時發生錯誤 + + + + GraphEditor + + + Graph Editor + 圖形編輯器 + + + + Linear + 線性 + + + + Bezier + 貝塞爾曲綫 + + + + Hold + 保留 + + + + GraphView + + + Zoom to Selection + 縮放選擇 + + + + Zoom to Show All + 放大顯示所有 + + + + Reset View + 重置視圖 + + + + InterlacingName + + + None (Progressive) + 無 (進度) + + + + Top Field First + 頂端區域優先 + + + + Bottom Field First + 底部區域優先 + + + + Invalid + 無效 + + + + KeyframeNavigator + + + Enable Keyframes + 開啟關鍵幀/動畫補間 + + + + KeyframeView + + + Linear + 線性 + + + + Bezier + 貝塞爾曲綫 + + + + Hold + 保留 + + + + LabelSlider + + + &Edit + 輸入值(&E) + + + + &Reset to Default + 重置為預設(&R) + + + + + Set Value + 設定值 + + + + + New value: + 新值: + + + + LoadDialog + + + Loading... + 加載中... + + + + Loading '%1'... + 加載中 '%1'... + + + + Cancel + 取消 + + + + LoadThread + + + Version Mismatch + 版本不匹配 + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + 此項目用Olive的另一個版本保存,可能與此版本不完全兼容.無論如何,您想嘗試加載它嗎? + + + + Invalid Clip Link + 無效的視頻連結 + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + 此項目包含無效的剪輯連結.可能已經損壞.您要繼續裝嗎? + + + + %1 - Line: %2 Col: %3 + %1 - 行: %2 列: %3 + + + + User aborted loading + 用戶終止加載 + + + + XML Parsing Error + XML解析錯誤 + + + + Couldn't load '%1'. %2 + 無法加載%1'. %2 + + + + Project Load Error + 項目加載錯誤 + + + + Error loading project: %1 + 加載項目是發生錯誤: %1 + + + + MainWindow + + + Welcome to %1 + 歡迎來到 %1 + + + + &File + 檔案(&F) + + + + &New + 新建(&N) + + + + &Open Project + 打開項目(&O) + + + + Clear Recent List + 清除最近的列表 + + + + Open Recent + 打開最近的列表 + + + + &Save Project + 保存項目(&S) + + + + Save Project &As + 保存項目為(&A) + + + + &Import... + 匯入(&I) + + + + &Export... + 匯出(&E) + + + + E&xit + 退出(&I) + + + + &Edit + 編輯(&E) + + + + &Undo + 撤銷(&U) + + + + Redo + 重做 + + + + Select &All + 選擇全部(&A) + + + + Deselect All + 取消選擇所有 + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + 刪除標記的區域 + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + 設置/編輯標記 + + + + &View + 視圖(&V) + + + + Zoom In + 放大 + + + + Zoom Out + 縮小 + + + + Increase Track Height + 增加軌道高度 + + + + Decrease Track Height + 降低軌道高度 + + + + Toggle Show All + 軌道全部顯示 + + + + Track Lines + 軌道綫 + + + + Rectified Waveforms + 整流波形 + + + + Frames + + + + + Drop Frame + 丟失的幀 + + + + + Non-Drop Frame + 保留的幀 + + + + + Milliseconds + 毫秒 + + + + Title/Action Safe Area + 字幕/行動安全區域 + + + + Off + 關閉 + + + + Default + 預設 + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + 自定義 + + + + Full Screen + 全屏 + + + + Full Screen Viewer + 全屏預覽 + + + + &Playback + 回放(&P) + + + + Go to Start + 回到起始幀 + + + + Previous Frame + 前一幀 + + + + Play/Pause + 播放/暫停 + + + + Play In to Out + 播放已標記的區域 + + + + Next Frame + 下一幀 + + + + Go to End + 轉到結束幀 + + + + Go to Previous Cut + 切換到之前的位置 + + + + Go to Next Cut + 轉到下一個位置 + + + + Go to In Point + 轉到時間的起始標記處 + + + + Go to Out Point + 轉到時間的結束標記處 + + + + Shuttle Left + 向左播放 + + + + Shuttle Stop + 停止播放 + + + + Shuttle Right + 向右播放 + + + + Loop + 循環播放 + + + + &Window + 窗口(&W) + + + + Project + 項目 + + + + Effect Controls + 效果控制 + + + + Timeline + 時間軸 + + + + Graph Editor + 圖形編輯器 + + + + Media Viewer + 媒體查看器 + + + + Sequence Viewer + 片段查看器 + + + + Maximize Panel + 最大化面板 + + + + Lock Panels + 鎖定面板 + + + + Reset to Default Layout + 重置為預設佈局 + + + + &Tools + 工具(&T) + + + + Pointer Tool + 選擇/移動/預設 + + + + Edit Tool + 選擇部分 + + + + Ripple Tool + 漣漪的工具 + + + + Razor Tool + 剪刀 + + + + Slip Tool + 滑動工具 + + + + Slide Tool + 幻燈片工具 + + + + Hand Tool + 移動時間軸 + + + + Transition Tool + 轉場/過渡效果 + + + + Enable Snapping + 開啟邊緣吸合/自動對齊 + + + + Auto-Cut Silence + 雜訊分離 + + + Selecting Also Seeks + + + + Edit Tool Also Seeks + + + + Edit Tool Selects Links + + + + Seek Also Selects + + + + Seek to the End of Pastes + + + + Scroll Wheel Zooms + + + + Hold CTRL to toggle this setting + 按住CTRL切換至此設置 + + + Invert Timeline Scroll Axes + 反轉時間軸滾動軸 + + + Enable Drag Files to Timeline + 啟用拖動檔案到時間軸 + + + Auto-Scale By Default + 預設情況下自動縮放 + + + Enable Seek to Import + + + + Audio Scrubbing + 拖動音頻同時播放 + + + Enable Drop on Media to Replace + 開啟拖動到媒體上面後替換該媒體 + + + Enable Hover Focus + 啟用懸停焦點 + + + Ask For Name When Setting Marker + 設置標記時詢問名稱 + + + + No Auto-Scroll + 關閉時間軸自動滾動 + + + + Page Auto-Scroll + 頁面時間軸自動滾動 + + + + Smooth Auto-Scroll + 時間軸自動平滑滾動 + + + + Preferences + 首選項 + + + + Clear Undo + 清除撤消 + + + + &Help + 幫助(&H) + + + + A&ction Search + 功能查找(&C) + + + + Debug Log + 調試日誌 + + + + &About... + 關於(&A) + + + + <untitled> + <無標題> + + + + Marker + + + Set Marker + 設置標記 + + + + Set clip marker name: + 設置該剪輯標記的名稱: + + + + Set sequence marker name: + 設置序列標記名稱: + + + + Media + + + New Folder + 新建檔案夾 + + + + Name: + 名稱: + + + + Filename: + 檔案名: + + + + Video Dimensions: + 視頻大小: + + + + Frame Rate: + 幀速率: + + + + %1 field(s) (%2 frame(s)) + + + + + Interlacing: + + + + + Audio Frequency: + 音頻頻率: + + + + Audio Channels: + 音頻通道: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + 名稱: %1 +視頻大小: %2x%3 +幀率:: %4 +音頻: %5 +音頻佈局: %6 + + + + Name + 名稱 + + + + Duration + 持續時間 + + + + Rate + 速率 + + + + MediaPropertiesDialog + + + "%1" Properties + 屬性 "%1" + + + + Tracks: + 軌道: + + + + Video %1: %2x%3 %4FPS + 視頻 %1: %2x%3 %4FPS + + + + Audio %1: %2Hz %3 + 音頻 %1: %2Hz %3 + + + + %n channel(s) + + %n 通道 + + + + + Conform to Frame Rate: + 符合幀率: + + + + Alpha is Premultiplied + + + + + Auto (%1) + 自動 (%1) + + + + Interlacing: + + + + + Name: + 名稱: + + + + MenuHelper + + + &Project + 項目(&P) + + + + &Sequence + 片段(&S) + + + + &Folder + 目錄(&F) + + + + Set In Point + 設置時間的起始標記 + + + + Set Out Point + 設置時間的結束標記 + + + + Reset In Point + 重置時間的起始標記 + + + + Reset Out Point + 重置時間的結束標記 + + + + Clear In/Out Point + 清除時間標記 + + + + Add Default Transition + 添加預設的轉場效果 + + + + Link/Unlink + 連結/取消連結音頻和視頻 + + + + Enable/Disable + 啟用/禁用 + + + + Nest + 嵌套 + + + + Cu&t + 剪切(&T) + + + + Cop&y + 複製(&Y) + + + + + &Paste + 粘帖(&P) + + + + Paste Insert + 插入式粘貼 + + + + Duplicate + 複製 + + + + Delete + 刪除 + + + + Ripple Delete + 抽出片段並刪除 + + + + Split + 切斷 + + + + Invalid aspect ratio + 無效的長寬比 + + + + The aspect ratio '%1' is invalid. Please try again. + 長寬比無效 '%1', 請再試一次. + + + + Enter custom aspect ratio + 輸入自定義縱橫比 + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + 輸入字幕/動作安全區使用的縱橫比 (例子, 16:9): + + + + NewSequenceDialog + + + Editing "%1" + 編輯中 "%1" + + + + New Sequence + 新片段 + + + + Preset: + 預置: + + + + Film 4K + 4k電影 + + + + TV 4K (Ultra HD/2160p) + 4K電視 (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + 自定義 + + + + Video + 視頻 + + + + Width: + 寬度: + + + + Height: + 高度: + + + + Frame Rate: + 幀速率: + + + + Pixel Aspect Ratio: + 像素長寬比 + + + + Square Pixels (1.0) + 像素長寬比 (1.0) + + + + Interlacing: + + + + + None (Progressive) + + + + + Audio + 音頻 + + + + Sample Rate: + 採樣率: + + + + Name: + 名稱: + + + + OliveGlobal + + + Olive Project %1 + Olive 項目 %1 + + + + Auto-recovery + 自動恢復 + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive沒有被正確關閉並檢測到一個自動恢復檔案,你要打開嗎? + + + + Open Project... + 打開項目... + + + + Missing recent project + 缺少最近的項目 + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + 這個項目 '%1' 已經不存在了。您想把它從最近的項目列表中刪除嗎? + + + + Save Project As... + 保存項目為... + + + + Unsaved Project + 未保存的項目 + + + + This project has changed since it was last saved. Would you like to save it before closing? + 這個項目自從上次保存以來已經發生了變化,您想在關門前保存嗎? + + + + No active sequence + 沒有已激活的片段 + + + + Please open the sequence to perform this action. + 請打開片段以執行這個功能. + + + + No clips selected + 沒有剪輯被選擇 + + + + Select the clips you wish to auto-cut + 選擇剪輯以自動剪裁 + + + Please open the sequence you wish to export. + 請打開要輸出的片段. + + + + Missing Project File + В丟失的項目檔案 + + + + Specified project '%1' does not exist. + 指定的項目 '%1' 未找到. + + + + PanEffect + + + Pan + 左右平衡/平移 + + + + PreferencesDialog + + + Preferences + 首選項 + + + + Default Sequence + 預設片段 + + + + Invalid CSS File + 無效的CSS檔案 + + + + CSS file '%1' does not exist. + CSS檔案 '%1' 不存在. + + + + Confirm Reset All Shortcuts + 確認重置所有快捷鍵 + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + 您確定要將所有鍵盤快捷鍵重置為預設值嗎? + + + + Import Keyboard Shortcuts + 導入鍵盤快捷鍵配置 + + + + + Error saving shortcuts + 保存鍵盤快捷鍵是發生錯誤 + + + + Failed to open file for reading + 無法讀取檔案 + + + + Export Keyboard Shortcuts + 匯出鍵盤快捷鍵配置 + + + + Export Shortcuts + 匯出快捷鍵 + + + + Shortcuts exported successfully + 快捷鍵成功匯出 + + + + Failed to open file for writing + 無法寫入檔案 + + + + Browse for CSS file + 瀏覽CSS檔案 + + + + Delete All Previews + 刪除所有預覽 + + + + Are you sure you want to delete all previews? + 您確定要刪除所有預覽嗎? + + + + Previews Deleted + 預覽成功刪除 + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + 所有預覽成功刪除,重新打開當前項目以生效. + + + + Language: + 語言: + + + + Image sequence formats: + 圖形片段個是: + + + + Thumbnail Resolution: + 縮略圖分辨率: + + + + Waveform Resolution: + 音頻波形分辨率 + + + + Delete Previews + 刪除預覽 + + + + Use Software Fallbacks When Possible + 儘量用軟件回放 + + + + Default Sequence Settings + 預設的片段設置 + + + + General + 一般 + + + + Behavior + 行為 + + + + Add Default Effects to New Clips + 添加預設效果到新的剪輯 + + + + Automatically Seek to the Beginning When Playing at the End of a Sequence + 當播放結束後自動回到開始位置 + + + + Selecting Also Seeks + 選擇並查找 + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + 滾輪縮放 + + + + Hold CTRL to toggle this setting + CTRL鍵和滾輪同時使用實現同樣的效果 + + + + Invert Timeline Scroll Axes + 反轉時間軸滾動軸 + + + + Enable Drag Files to Timeline + 開啟拖放檔案到時間軸 + + + + Auto-Scale By Default + 預設情況下自動縮放 + + + + Auto-Seek to Imported Clips + 自動尋找並導入剪輯 + + + + Audio Scrubbing + 拖動音頻同時播放 + + + + Drop Files on Media to Replace + 拖放檔案以代替媒體 + + + + Enable Hover Focus + 啟用懸停焦點 + + + + Ask For Name When Setting Marker + 設置標記時詢問名稱 + + + + Appearance + 外觀 + + + + Theme + 主題 + + + + Olive Dark (Default) + Olive 暗色 (預設) + + + + Olive Light + Olive 明亮 + + + + Native + 原生 + + + + Native (Light Icons) + 原生 (明亮表徵圖) + + + + Use Native Menu Styling + 使用原生菜單風格 + + + + Custom CSS: + 自定義 CSS: + + + + Browse + 瀏覽 + + + + Effect Textbox Lines: + 文本框線效果: + + + Seeking + 查找中 + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + 精準查找 +總是顯示當前按的幀 (視覺可能會在檢索到正確的幀時暫停) + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + 快速查找 +查找得更快 (搜索時可能會短暫顯示不准確的幀—不影響回放/導出) + + + + Memory Usage + 內存使用 + + + + Upcoming Frame Queue: + 即將到來的幀隊列: + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + 前一幀隊列: + + + + Playback + 回放 + + + + Output Device: + 輸出設備: + + + + + Default + 預設 + + + + Input Device: + 輸入設備: + + + + Sample Rate: + 採樣率: + + + + Audio Recording: + 音頻錄製: + + + + Mono + 單聲道 + + + + Stereo + 立體聲 + + + + Audio + 音頻 + + + + Search for action or shortcut + 搜索功能或者快捷鍵 + + + + Action + 功能 + + + + Shortcut + 快捷鍵 + + + + Import + 匯入 + + + + Export + 匯出 + + + + Reset Selected + 重新選擇 + + + + Reset All + 全部重設 + + + + Keyboard + 鍵盤 + + + + PreviewGenerator + + + Failed to find any valid video/audio streams + 未能找到任何有效的視頻/音頻流 + + + + Could not open file - %1 + 無法打開檔案 — %1 + + + + Could not find stream information - %1 + 無法找到流信息 — %1 + + + + Project + + + New + 新建 + + + + Open Project + 打開項目 + + + + Save Project + 保存項目 + + + + Undo + 撤銷 + + + + Redo + 重做 + + + + Tree View + 詳細視圖 + + + + Icon View + 縮略圖 + + + + List View + 列表視圖 + + + + Search media, markers, etc. + 搜索媒體,標記等. + + + + Project + 項目 + + + + Sequence + 片段 + + + + Replace '%1' + 代替 '%1' + + + + + All Files + 全部檔案 + + + + + No active sequence + 沒有已激活的片段 + + + + No sequence is active, please open the sequence you want to replace clips from. + 沒有片段處于激活狀態,請打開要代替剪輯的片段. + + + + Active sequence selected + 激活選擇的片段 + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + 無法插入該片段至自己當中,所以這個媒體的剪輯不會在這個片段中. + + + + Rename '%1' + 重命名 '%1' + + + + Enter new name: + 輸入新的名稱: + + + + Delete media in use? + 刪除使用中的媒體? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + 此媒體 '%1' 正在被使用於 '%2'. 刪除它將刪除片段中的所有實例. В你確定你要這麼做嗎? + + + + Skip + 跳過 + + + + Import a Project + 導入一個項目 + + + + "%1" is an Olive project file. It will merge with this project. Do you wish to continue? + "%1" 是Olive項目檔案. 它將與這個項目合併. 你想繼續嗎? + + + + Image sequence detected + 圖像片段檢測 + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + 該檔案 '%1' 似乎是圖像片段中的一部分. 您要按原樣代替嗎? + + + + Import media... + 匯入媒體... + + + + No sequence is active, please open the sequence you want to delete clips from. + 沒有片段處于激活狀態,請打開要從中刪除剪輯的片段. + + + + ProxyDialog + + + Create Proxy + 創建代理 + + + + Proxy + 代理 + + + + Dimensions: + 大小: + + + + Same Size as Source + 使用與來源相同的大小 + + + + Half Resolution (1/2) + 一半的分辨率 (1/2) + + + + Quarter Resolution (1/4) + 四分之一的分辨率 (1/4) + + + + Eighth Resolution (1/8) + 八分之一的分辨率 (1/8) + + + + Sixteenth Resolution (1/16) + 十六分之一的分辨率 (1/16) + + + + Format: + 個格式: + + + + ProRes HQ + ProRes HQ + + + + Location: + 位置: + + + + Same as Source (in "%1" folder) + 使用與來源相同的大小 (在 "%1" 目錄) + + + + Proxy file exists + 代理檔案存在 + + + + The file "%1" already exists. Do you wish to replace it? + 該檔案 "%1" 已經存在. 你想代替它嗎? + + + + Custom Location + 自定義路徑 + + + + ProxyGenerator + + + Finished generating proxy for "%1" + 完成生成代理 "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + 取代剪輯使用 "%1" + + + + Select which media you want to replace this media's clips with: + 選擇要替換此媒體的媒體: + + + + Keep the same media in-points + 保持相同的媒體插入點 + + + + Replace + 取代 + + + + Cancel + 取消 + + + + No media selected + 沒有已選擇的媒體 + + + + Please select a media to replace with or click 'Cancel'. + 請選擇一個媒體替代或取消. + + + + Same media selected + 相同的媒體被選擇 + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + 你選擇了相同的媒體代替.請選擇其他或者取消. + + + + Folder selected + 目錄選擇 + + + + You cannot replace footage with a folder. + 您無法用檔案夾替換素材. + + + + Active sequence selected + 激活的片段已經被選擇 + + + + You cannot insert a sequence into itself. + 無法插入該片段至自己當中. + + + + RichTextEffect + + + Text + 文本格式化 + + + + Padding + 填充 + + + + Position + 位置 + + + + Vertical Align: + 垂直對齊: + + + + Top + 頂部 + + + + Center + 中心點 + + + + Bottom + 底下 + + + + Auto-Scroll + 自動捲動 + + + + Off + 關閉 + + + + Up + + + + + Down + + + + + Left + + + + + Right + + + + + Shadow + 陰影 + + + + Shadow Color + 陰影顏色 + + + + Shadow Angle + 陰影角度 + + + + Shadow Distance + 陰影距離 + + + + Shadow Softness + 陰影柔軟化 + + + + Shadow Opacity + 陰影透明度 + + + + Sequence + + + %1 (copy) + %1 (複製) + + + + ShakeEffect + + + Intensity + 強度 + + + + Rotation + 旋轉 + + + + Frequency + 頻率 + + + + SolidEffect + + + Type + 類型 + + + + Solid Color + 純色 + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + 透明度 + + + + Color + 顏色 + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + 匯入... + + + + New + 新建 + + + + View + 視圖 + + + + Tree View + 樹視圖 + + + + Icon View + 表徵圖視圖 + + + + Show Toolbar + 顯示工具欄 + + + + Show Sequences + 顯示片段 + + + + Replace/Relink Media + 替換/重新連結媒體 + + + + Reveal in Explorer + 在瀏覽器中預覽 + + + + Reveal in Finder + 在查找當中預覽 + + + + Reveal in File Manager + 在檔案管理器中預覽 + + + + Replace Clips Using This Media + 使用此媒體替換剪輯 + + + + Create Sequence With This Media + 使用此媒體創建片段 + + + + Duplicate + 複製 + + + + Delete All Clips Using This Media + 刪除所有使用此問題的剪輯 + + + + Proxy + 代理 + + + + Generating proxy: %1% complete + 生成代理: %1% 完成 + + + + Create/Modify Proxy + 創建/修改代理 + + + + Create Proxy + 創建代理 + + + + Modify Proxy + 修改代理 + + + + Restore Original + 還原為原始尺寸 + + + + Delete + 刪除 + + + + Preview in Media Viewer + 在媒體瀏覽器中預覽 + + + + Properties... + 屬性... + + + + Replace Media + 取代媒體 + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + 你拖放了一個檔案到 '%1'. 你要取代它嗎? + + + + Delete proxy + 刪除代理 + + + + Would you like to delete the proxy file "%1" as well? + 您要刪除代理檔案嗎 "%1"? + + + + SpeedDialog + + + Speed/Duration + 速度/持續時間 + + + + Speed: + 速度: + + + + Frame Rate: + 幀速率: + + + + Duration: + 持續時間: + + + + Reverse + 反向 + + + + Maintain Audio Pitch + 保持音頻音調 + + + + Ripple Changes + 波紋變化 + + + + TextEditDialog + + + Edit Text + 編輯文本格式 + + + + Thin + + + + + Extra Light + 加亮 + + + + Light + + + + + Normal + 正常 + + + + Medium + 中等 + + + + Demi Bold + + + + + Bold + 粗體 + + + + Extra Bold + 加粗 + + + + Black + + + + + TextEditEx + + + Edit Text + 編輯文本 + + + + &Edit Text + 編輯文本(&E) + + + + TextEffect + + + Text + 文本 + + + + Font + 字型 + + + + Size + 大小 + + + + Color + 顏色 + + + + Alignment + 校準 + + + + Left + + + + + + Center + 中心 + + + + Right + + + + + Justify + 整理版面 + + + + Top + 頂部 + + + + Bottom + 底下 + + + + Word Wrap + 自動換行 + + + + Padding + 填充 + + + + Position + 位置 + + + + Outline + 輪廓 + + + + Outline Color + 輪廓顏色 + + + + Outline Width + 輪廓寬 + + + + Shadow + 陰影 + + + + Shadow Color + 陰影顏色 + + + + Shadow Angle + 陰影角度 + + + + Shadow Distance + 陰影距離 + + + + Shadow Softness + 陰影柔軟化 + + + + Shadow Opacity + 陰影透明度 + + + + Sample Text + 文字樣本 + + + + TimecodeEffect + + + Timecode + + + + + Sequence + 片段 + + + + Media + 媒體 + + + + Scale + 縮放 + + + + Color + 顏色 + + + + Background Color + 背景顏色 + + + + Background Opacity + 背景透明度 + + + + Offset + 補償 + + + + Prepend + 前置 + + + + Timeline + + + Pointer Tool + 選擇/移動/預設 + + + + Edit Tool + 選擇部分 + + + + Ripple Tool + 漣漪的工具 + + + + Razor Tool + 剪刀 + + + + Slip Tool + 滑動工具 + + + + Slide Tool + 幻燈片工具 + + + + Hand Tool + 手形工具 + + + + Transition Tool + 過度/轉場效果 + + + + Snapping + 邊緣吸合/自動對齊 + + + + Zoom In + 放大 + + + + Zoom Out + 縮小 + + + + Record audio + 錄製聲音 + + + + Add title, solid, bars, etc. + 添加字幕,實體,欄等. + + + + Nested Sequence + 嵌套的片段 + + + + Effect already exists + 特效已經存在 + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + 剪輯 '%1' 已經包含了 '%2'效果. 您是想替換它,還是作為單獨的效果加入? + + + + Add + 添加 + + + + Replace + 取代 + + + + Skip + 跳過 + + + + Do this for all conflicts found + 對所有發現的衝突都這樣做嗎 + + + + Title... + 字幕... + + + + Solid Color... + 單色... + + + + Bars... + 欄... + + + + Tone... + 增強… + + + + Noise... + 噪音... + + + + Unsaved Project + 未保存的項目 + + + + You must save this project before you can record audio in it. + 必須先保存此項目,才能在其中錄製音頻. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + 單擊要開始錄製的時間軸(拖動可將錄製限制在某個時間段) + + + + Timeline: + 時間軸: + + + + (none) + (無) + + + + TimelineHeader + + + Center Timecodes + 以時間區間/點顯示 + + + + TimelineWidget + + + &Undo + 撤銷(&U) + + + + &Redo + 重做(&R) + + + + R&ipple Delete Empty Space + 連接片段/去除空白空間(&I) + + + + Sequence Settings + 片段設置 + + + + &Speed/Duration + 速度/持續時間(&S) + + + Auto-s&cale + 自動縮放(&C) + + + + Auto-Cut Silence + 雜訊分離 + + + + Auto-S&cale + 自動縮放(&C) + + + + &Reveal in Project + 在項目庫中顯示(&R) + + + + Properties + 屬性 + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +起點: %2 +終止: %3 +持續時間: %4 + + + + Error + 錯誤 + + + + Couldn't locate media wrapper for sequence. + 無法找到片段的媒體包裝器. + + + + Title + 字幕 + + + + Solid Color + 單色 + + + + Bars + + + + + Tone + + + + + Noise + 噪音 + + + + Duration: + 持續時間: + + + + ToneEffect + + + Type + 類型 + + + + Sine + 正弦 + + + + Frequency + 頻率 + + + + Amount + 數量 + + + + Mix + 混合 + + + + TransformEffect + + + Position + 位置 + + + + Scale + 縮放 + + + + Uniform Scale + 統一縮放的大小 + + + + Rotation + 旋轉 + + + + Anchor Point + 錨點 + + + + Opacity + 透明度 + + + + Blend Mode + 混合模式 + + + + Normal + 標準 + + + + Transition + + + Length + 長度 + + + + UpdateNotification + + + An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + 發現新版本.請訪問www.olivevideoeditor.org下載. + + + + VSTHost + + + + Error loading VST plugin + 加載VST插件按時發生錯誤 + + + Failed to create VST reference + 無法創建VST參考 + + + + Failed to load VST plugin "%1": %2 + 無法加載VST插件 "%1": %2 + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + 警告: 您不能將32位VST插件加載到64位Olive構建中。請找到這個插件的64位版本或切換到32位的Olive構建版本. + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + 警告: 您不能將64位VST插件加載到32位Olive構建中。請找到這個插件的32位版本或切換到64位的Olive構建版本. + + + + Failed to locate entry point for dynamic library. + 未能找到動態庫的入口點. + + + + VST Error + VST發生錯誤 + + + + Plugin's magic number is invalid + 插件的幻數無效 + + + + VST Plugin + VST插件 + + + + Plugin + 插件 + + + + Interface + 用戶界面 + + + + Show + 顯示 + + + + Viewer + + + (none) + (無) + + + + Drag video only + 只拖放視頻 + + + + Drag audio only + 只拖放音頻 + + + + Sequence Viewer + 片段預覽 + + + + Media Viewer + 媒體預覽 + + + + ViewerWidget + + + Save Frame as Image... + 保存幀為圖像... + + + + Show Fullscreen + 全屏模式 + + + + Disable + 關閉 + + + + Screen %1: %2x%3 + 放映 %1: %2x%3 + + + + Zoom + 縮放 + + + + Fit + 適合 + + + + Custom + 自定義 + + + + Close Media + 關閉媒體 + + + + Save Frame + 保存幀 + + + + Viewer Zoom + 預覽縮放 + + + + Set Custom Zoom Value: + 設置自己定義縮放: + + + + ViewerWindow + + + Exit Fullscreen + 退出全屏 + + + + VoidEffect + + + (unknown) + (未知) + + + + Missing Effect + 缺失特效 + + + + VolumeEffect + + + Volume + 音量 + + + + transition + + + Invalid transition + 無效的轉場效果 + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + 沒有適合做轉場效果的條件 '%1'. 該效果的插件可能已經損壞. 請嘗試重新安裝它或者Olive. + + + From 214ecebd5f4df10b357178bcd5b46e7e93473fdd Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Tue, 17 Nov 2020 21:03:41 +0300 Subject: [PATCH 64/72] Update old translations with -noobsolete, that should give translators a start --- app/ts/ar_AR.ts | 8307 +++++++++++++++++++++++-------------------- app/ts/bs_BS.ts | 7865 +++++++++++++++++++++++------------------ app/ts/cs_CS.ts | 7461 +++++++++++++++++++-------------------- app/ts/de_DE.ts | 8279 +++++++++++++++++++++++-------------------- app/ts/en_US.ts | 36 +- app/ts/es_ES.ts | 8906 ++++++++++++++++++++++++----------------------- app/ts/fr_FR.ts | 8270 +++++++++++++++++++++++-------------------- app/ts/id_ID.ts | 8167 ++++++++++++++++++++++++------------------- app/ts/it_IT.ts | 8245 ++++++++++++++++++++++++------------------- app/ts/pt_BR.ts | 8711 +++++++++++++++++++++++---------------------- app/ts/ru_RU.ts | 8001 ++++++++++++++++++++++++------------------ app/ts/sr_SR.ts | 7852 +++++++++++++++++++++++------------------ app/ts/tr_TR.ts | 8194 ++++++++++++++++++++++++------------------- app/ts/uk_UK.ts | 8194 ++++++++++++++++++++++++------------------- app/ts/zh_CN.ts | 8118 +++++++++++++++++++++++------------------- app/ts/zh_TW.ts | 8118 +++++++++++++++++++++++------------------- 16 files changed, 67319 insertions(+), 55405 deletions(-) diff --git a/app/ts/ar_AR.ts b/app/ts/ar_AR.ts index 490994f47..42663dcfa 100644 --- a/app/ts/ar_AR.ts +++ b/app/ts/ar_AR.ts @@ -2,4129 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - زيتون هو محرر فيديو غير خطي. هذا البرنامج حر ومحمي بموجب رخصة جنو العمومية. - - - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - فريق زيتون ملزم بإخبار مستخدميه بأن الشفرة المصدرية لزيتون متوفرة للتنزيل عبر موقعه الإلكتروني. - - - - ActionSearch - - - Search for action... - ابحث عن إجراء... - - - - AdvancedVideoDialog - - - Advanced Video Settings + + %1 Hz - - Pixel Format: - - - - - Threads: - - - - - Audio - - Audio - الصوت - - - Recording - تسجيل - - - - %1 Audio - - - - - Recording %1 - - - - - AudioNoiseEffect - - - Amount - المقدار - - - - Mix - دمج - - - - AutoCutSilenceDialog - - - Cut Silence - - - - - Attack Threshold: - - - - - Attack Time: - - - - - Release Threshold: - - - - - Release Time: - - - - - Cacher - - - - Could not open %1 - %2 - - - - - ChannelLayoutName - - - Invalid - معطوب - - - + Mono - اُحادي + اُحادي - + Stereo - مُجسم - - - - ClipPropertiesDialog - - - "%1" Properties - "%1" الخصائص + مُجسم - - Multiple Clip Properties - + + 2.1 + 2.1 - - Name: - اﻷسم: + + 5.1 + 5.1 - - Duration: - المدة: + + 7.1 + 7.1 - - (multiple) + + Unknown (0x%1) - CollapsibleWidget + Config - - <untitled> - <غير معنون> - - - - ColorButton - - - Set Color - حدد اللون - - - - CornerPinEffect - - - Top Left - اعلى اليسار - - - - Top Right - اعلى اليمين - - - - Bottom Left - ادنى اليسار - - - - Bottom Right - ادنى اليمين - - - - Perspective - منظور - - - - DebugDialog - - - Debug Log - سجل التنقيح - - - - DemoNotice - - - - Welcome to Olive! - مرحباً في زيتون! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - زيتون هو محرر فيديو حر ومفتوح المصدر تحت مظلة رخصة رخصة جنو العمومية. أن دفعت ﻷجل الحصول على هذا البرنامج فقد غُششت. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - هذا البرنامج في مرحلة ألفا حالياً حيث تعني أنه غير مستقر وفي اﻷعم اﻷغلب عرضة للتحطم, به علل, ويفتقر لبعض المميزات. نحن لا نوفر ضمانة لذا أستخدمهُ على مسؤوليتك. رجاءً بلغ أي علل أو طلب مميزات على %1 - - - - Thank you for trying Olive and we hope you enjoy it! - شكراً لتجربتك زيتون ونحن نأمل أن تستمتع به! - - - - Effect - - - Invalid effect - تأثير غير صالح - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - لا وجود للتأثير '%1'. هذا التأثير قد يكون فاسد حاول إعادة تثبيته مجدداً أو زيتون. - - - Cu&t - قط&ع - - - &Copy - &نسخ - - - Move &Up - حرك &للاعلى - - - Move &Down - حرك &لﻷسفل - - - D&elete - ح&ذف - - - Load Settings From File - حمل اﻹعدادات من ملف - - - Save Settings to File - أحفظ اﻷعدادات في ملف - - - - Save Effect Settings - أحفظ أعدادات المؤثر - - - - - Effect XML Settings %1 - غير إعدادات XML %1 - - - - Save Settings Failed - حفظ اﻷعدادات فشل - - - - Failed to open "%1" for writing. - فشل فتح "%1" للكتابة. - - - - Load Effect Settings - تحميل أعدادات المؤثر - - - - - Load Settings Failed - تحميل اﻹعدادات فشل - - - - Failed to open "%1" for reading. - فشل في فتح "%1" للقراءة. - - - - This settings file doesn't match this effect. - ملف اﻷعدادات هذا لا يطابق هذا المؤثر. - - - - EffectControls - - - Effects: - المؤثرات: - - - &Paste - &لصق - - - - (none) - (لا شيء) - - - - Add Video Effect - أضف موثر فيديو - - - - VIDEO EFFECTS - موثرات الفيديو - - - - Add Video Transition - أضف أنتقالة فيديو - - - - Add Audio Effect - أضف موثر صوت - - - - AUDIO EFFECTS - موثرات الصوت - - - - Add Audio Transition - أضف أنتقالة صوت - - - (Multiple clips selected) - (مقاطع عديدة محددة) - - - - EffectRow - - - Disable Keyframes - عطّل اﻹطارت المفتاحية - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - تعطيل اﻹطارات المفتاحية سوف يحذف جميع اﻹطارات المفتاحية الحالية هل أنت متأكد من ما ستقدم عليه؟ - - - - EffectUI - - - %1 (Opening) + + Error loading settings - - %1 (Closing) - - - - - %1 (multiple) - - - - - Cu&t - قط&ع - - - - &Copy - &نسخ - - - - Move &Up - حرك &للاعلى - - - - Move &Down - حرك &لﻷسفل - - - - D&elete - ح&ذف - - - - Load Settings From File - حمل اﻹعدادات من ملف - - - - Save Settings to File - أحفظ اﻷعدادات في ملف - - - - EmbeddedFileChooser - - - File: - ملف: - - - - ExportDialog - - - Export "%1" - صدّر "%1" - - - - Unknown codec name %1 - - - - - Export Failed - فشل التصدير - - - - Export failed - %1 - فشل تصدير - %1 - - - - Invalid dimensions - أبعاد خاطئة - - - - Export width and height must both be even numbers/divisible by 2. - تصدير العرض والطول يجب أن يكون عدد زوجي/قابل للقسمة ب 2. - - - - Invalid codec - مرماز غير صالح - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - لم يتم التعرف على خيارات الإخراج للمرماز المحدد. هذه علة, رجاءً تواصل مع المطورين. - - - - Invalid format - صيغة غير صالحة - - - - Couldn't determine output format. This is a bug, please contact the developers. - لم يتم التعرف على صيغة اﻹخراج. هذه علة, رجاءً تواصل مع المطورين. - - - - Export Media - صدّر الوسائط - - - - %p% (Total: %1:%2:%3) - - - - - %p% (ETA: %1:%2:%3) - - - - - Quality-based (Constant Rate Factor) - (عامل النسبة الثابت) أعتماداً-بالجودة - - - - Constant Bitrate - نسبة بت ثابتة - - - - - Invalid Codec - - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - - - - - Failed to find pixel format for this encoder. Export will likely fail. - - - - - Bitrate (Mbps): - نسبة البت (مب/ث): - - - - Quality (CRF): - الجودة (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - عامل الجودة: - -0 = بدون خسارة -17-18 = بدون خسارة بصرية (مضغوط, لكن غير متأثر) -23 = جودة عالية -51 = أقل جودة ممكنة - - - - Target File Size (MB): - حجم الملف الهدف (مب): - - - - Format: - صيغة: - - - - Range: - المدى: - - - - Entire Sequence - كل المقطع - - - - In to Out - الدخل إلى الخرج - - - - Video - فيديو - - - - - Codec: - مرماز: - - - - Width: - العرض: - - - - Height: - الطول: - - - - Frame Rate: - نسبة الإطارات: - - - - Compression Type: - نوع الضغط: - - - - Advanced +%1 - - Audio - الصوت - - - - Sampling Rate: - معدل الإعتيان: - - - - Bitrate (Kbps/CBR): - نسبة البت (Kbps/CBR): - - - - ExportThread - - - failed to send frame to encoder (%1) - فشل إرسال اﻹطار للمُرمز.(%1) - - - - failed to receive packet from encoder (%1) - فشل إستلام الرزمة من المُرمز (%1) - - - - could not video encoder for %1 - لم يجد مُرمز فيديو ل %1 - - - - could not allocate video stream - لم يستطع تخصيص بث فيديو - - - - could not allocate video encoding context - للمراجعة - لم يستطع تخصيص سياق ترميز فيديو - - - - could not open output video encoder (%1) - لم يتم فتح مرمّز مخرجات فيديو (%1) - - - - could not copy video encoder parameters to output stream (%1) - لم يتم نسخ عوامل مرمّز الفيديو لبث المخرجات (%1) - - - - could not audio encoder for %1 - لم يستطع ترميز فيديو ل %1 - - - - could not allocate audio stream - لم يستطع تخصيص بث صوت - - - - could not allocate audio encoding context - لم يستطع تخصيص سياق ترميز صوت - - - - could not open output audio encoder (%1) - لم يتم فتح مرمّز مخرجات صوت (%1) - - - - could not copy audio encoder parameters to output stream (%1) - لم يتم نسخ عوامل مرمّز الصوت لبث المخرجات (%1) - - - - could not allocate audio buffer (%1) - لم يستطع تخصيص حافظة صوت (%1) - - - - could not create output format context - لم يستطع إنشاء سياق صيغة الصوت - - - - could not open output file (%1) - لم يستطع فتح ملف اﻹخراج (%1) - - - - could not write output file header (%1) - لم يستطع كتابة مخرجات ترويسة الملف (%1) - - - - could not write output file trailer (%1) - لم يستطع كتابة مخرجات ملحقة الملف (%1) - - - - FillLeftRightEffect - - - Type - النوع - - - - Fill Left with Right - املأ اليسار مع اليمين - - - - Fill Right with Left - املأ اليمين مع اليسار - - - - Frei0rEffect - - - Failed to load Frei0r plugin "%1": %2 - فشل في تحميل إضافة Frei0r "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - ملحوظة: لا يمكنك تحميل إضافة Frei0r 32-بت لنسخة زيتون مبنية ل64-بت. رجاءً جد نسخة 64-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 32-بت. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - ملحوظة: لا يمكنك تحميل إضافة Frei0r 64-بت لنسخة زيتون مبنية ل32-بت. رجاءً جد نسخة 32-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 64-بت. - - - - Error loading Frei0r plugin - خطأ تحميل إضافة Frei0r - - - - GraphEditor - - - Graph Editor - محرر المخطط - - - - Linear - خطي - - - - Bezier - بيزير - - - - Hold - أمسك - - - - GraphView - - - Zoom to Selection - قرّب للمُحدد - - - - Zoom to Show All - تقريب لرؤية الكل - - - - Reset View - صفّر الرؤية - - - - InterlacingName - - - None (Progressive) - لا شيء (متفاقم) - - - - Top Field First - الحقل العلوي أولاً - - - - Bottom Field First - الحقل السفلي أولاً - - - - Invalid - غير صالح - - - - KeyframeNavigator - - - Enable Keyframes - فعّل اﻹطارات المفتاحية - - - - KeyframeView - - - Linear - خطي - - - - Bezier - بيزير - - - - Hold - أمسك - - - - LabelSlider - - - &Edit - &تعديل - - - - &Reset to Default + + Error saving settings - - - Set Value - حدد القيمة - - - - - New value: - قيمة جديدة: - - - - LoadDialog - - - Loading... - تحميل... - - - - Loading '%1'... - تحميل '%1'... - - - - Cancel - إلغاء - - - - LoadThread - - - Version Mismatch - عدم تطابق النسخة - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - هذا المشروع كان محفوظاً بنسخة مختلفة من زيتون وقد لا تكون متوافقة بشكل كامل مع هذه النسخة. هل تريد محاولة تحميله على إي حال؟ - - - - Invalid Clip Link - رابط مقطع غير صالح - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - هذا المشروع يحوي رابط مقطع غير صالح. قد يكون معطوباً. هل تريد اﻷستمرار بتحميله؟ - - - - %1 - Line: %2 Col: %3 - %1 - سطر: %2 عمود: %3 - - - - User aborted loading - المسخدم أجهض التحميل - - - - XML Parsing Error - خطأ تحليل XML - - - - Couldn't load '%1'. %2 - تعثر تحميل '%1'. %2 - - - - Project Load Error - خطأ تحميل المشروع - - - - Error loading project: %1 - خطأ تحميل المشروع: %1 - - - - MainWindow - - - Welcome to %1 - مرحباً في %1 - - - Auto-recovery - اﻷستعادة التلقائية - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - زيتون لم يغلق بشكل سليم وتم التعرف على ملف اﻷستعادة التلقائة. هل تريد فتحه؟ - - - &Project - &المشروع - - - &Sequence - &مقطع - - - &Folder - &مجلد - - - Set In Point - ضع في نقطة - - - Set Out Point - ضع خارج نقطة - - - Reset In Point - صفر في النقطة - - - Reset Out Point - صفّر النقطة - - - Clear In/Out Point - محو نقطة الدخل/الخرج - - - No active sequence - لا مقاطع نشطة - - - Please open the sequence you wish to export. - رجاءً أفتح المقطع المراد تصديره. - - - Save Project As... - أحفظ المشروع ك... - - - Unsaved Project - مشروع غير محفوظ - - - This project has changed since it was last saved. Would you like to save it before closing? - هذا المشروع غُيِرَ منذ أخر مرة. أتريد حفظه قبل اﻹغلاق؟ - - - - &File - &ملف - - - - &New - &جديد - - - - &Open Project - &أفتح مشروع - - - - Clear Recent List - أفرغ قائمة مؤخراً - - - - Open Recent - أفتح مؤخراً - - - - &Save Project - &أحفظ المشروع - - - - Save Project &As - أحفظ المشروع &ك - - - - &Import... - &أستيراد - - - - &Export... - &تصدير - - - - E&xit - خ&روج - - - - &Edit - &تعديل - - - - &Undo - &تراجع - - - - Redo - أعد - - - Cu&t - قط&ع - - - Cop&y - &نسخ - - - &Paste - &لصق - - - Paste Insert - ألصق أدرج - - - Duplicate - أستنساخ - - - Delete - حذف - - - Ripple Delete - حذف موجة - - - Split - أنقسام - - - - Select &All - تحديد &الكل - - - - Deselect All - إلغاء تحديد الكل - - - Add Default Transition - أضف اﻷنتقال الأفتراضي - - - Link/Unlink - ربط/فصل - - - Enable/Disable - تفعيل/تعطيل - - - Nest - للمراجعة - تداخل - - - - Ripple to In Point - موجة لنقطة إدخال - - - - Ripple to Out Point - موجة لنقطة إخراج - - - - Edit to In Point - عدّل لنقطة إدخال - - - - Edit to Out Point - عدّل لنقطة إخراج - - - - Delete In/Out Point - محو نقطة الدخل/الخرج - - - - Ripple Delete In/Out Point - موجة حذف نقطة الإدخال/الإخراج - - - - Set/Edit Marker - حدد/عدّل اﻹشارات - - - - &View - &أظهر - - - - Zoom In - تقريب - - - - Zoom Out - أبتعاد - - - - Increase Track Height - زدّ طول المسار - - - - Decrease Track Height - قلل طول المسار - - - - Toggle Show All - فعل إظهار الكل - - - - Track Lines - تعقب السطور - - - - Rectified Waveforms - أشكال موجية متناوبة - - - - Frames - اﻹطارات - - - - Drop Frame - أفلت إطار - - - - Non-Drop Frame - إطار غير مُفلت - - - - Milliseconds - جزء من الثانية - - - - Title/Action Safe Area - عنوان/إجراء المنطقة الآمنة - - - - Off - مطفئ - - - - Default - إفتراضي - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - مخصوص - - - - Full Screen - ملء الشاشة - - - - Full Screen Viewer - عارض ملء الشاشة - - - - &Playback - &الترديد - - - - Go to Start - أذهب للبداية - - - - Previous Frame - الإطار السابق - - - - Play/Pause - تشغيل/أستئناف - - - - Play In to Out - شغل من الإدخال إلى الإخراج - - - - Next Frame - اﻹطار التالي - - - - Go to End - أذهب للنهاية - - - - Go to Previous Cut - أذهب للقطعة السابقة - - - - Go to Next Cut - أذهب للقطعة التالية - - - - Go to In Point - أذهب لنقطة إدخال - - - - Go to Out Point - أذهب لنقطة إخراج - - - - Shuttle Left - توشع اليسار - - - - Shuttle Stop - إيقاف التوشع - - - - Shuttle Right - توشع اليمين - - - - Loop - حلقة - - - - &Window - &نافذة - - - - Project - المشروع - - - - Effect Controls - تحكمات المؤثر - - - - Timeline - الخط الزمني - - - - Graph Editor - محرر المخطط - - - - Media Viewer - عارض الوسائط - - - - Sequence Viewer - عارض المقطع - - - - Maximize Panel - ضخّم اللائحة - - - - Lock Panels - - - - - Reset to Default Layout - صفّر للتخطيط المبدئي - - - - &Tools - &اﻷدوات - - - - Pointer Tool - أداة المؤشر - - - - Edit Tool - أداة التحرير - - - - Ripple Tool - أداة الموجة - - - - Razor Tool - أداة القطع - - - - Slip Tool - أداة المنزلقة - - - - Slide Tool - أداة الشريحة - - - - Hand Tool - أداة اليد - - - - Transition Tool - أداة اﻷنتقال - - - - Enable Snapping - فعّل السحب - - - - Auto-Cut Silence - - - - Selecting Also Seeks - للمراجعة - تحديد العروضات إيضاً - - - Edit Tool Also Seeks - أداة التحرير تعرض إيضاً - - - Edit Tool Selects Links - أداة التحرير تحدد الروابط - - - Seek Also Selects - للمراجعة - العرض يحدد إيضاً - - - Seek to the End of Pastes - أعرض لنهاية الملصوقات - - - Scroll Wheel Zooms - العجلة الدوراة تُقرّب - - - Enable Drag Files to Timeline - أسمح بسحب الملفات للخط الزمني - - - Auto-Scale By Default - التحجيم-التلقائي إفتراضياً - - - Enable Seek to Import - للمراجعة - أسمح للعرض بالإستيراد - - - Audio Scrubbing - حكّ شريط الصوت - - - Enable Drop on Media to Replace - أسمح برمي الوسائط للأستبدال - - - Enable Hover Focus - فعّل التركيز الحائم - - - Ask For Name When Setting Marker - أسال عن اﻷسم حين وضع المؤشر - - - - No Auto-Scroll - لا أنزلاق التلقائي - - - - Page Auto-Scroll - أنزلاق الصفحة التلقائي - - - - Smooth Auto-Scroll - الأنزلاق التلقائي الناعم - - - - Preferences - التفضيلات - - - - Clear Undo - أمسح التراجُعات - - - - &Help - &مساعدة - - - - A&ction Search - ب&حث إجراء - - - - Debug Log - سجل التنقيح - - - - &About... - &حول... - - - - <untitled> - <غير معنون> - - - Open Project... - أفتح مشروع... - - - Missing recent project - مشروع ماضي ضائع - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - المشروع '%1' غير بعد اﻷن. هل ترغب بحذفه من من قائمة مشاريع مؤخراً؟ - - - Invalid aspect ratio - معدل نسبة غير صالح - - - The aspect ratio '%1' is invalid. Please try again. - معدل النسبة '%1' غير صالح. حاول مجدداً. - - - Enter custom aspect ratio - أدخل نسبة معدل مخصصة - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - أدخل معدل النسبة لأستعماله في العنوان/الإجراء المنطقة الآمنة (كــ. 16:9): - - - Nested Sequence - مقطع متشعب - - - - Marker - - - Set Marker - ضع وسم - - - - Set clip marker name: - ضع أسم وسم المقطوعة: - - - - Set sequence marker name: - ضع أسم وسم المقطع: - - - - Media - - - New Folder - مجلد جديد - - - - Name: - اﻷسم: - - - - Filename: - أسم الملف: - - - - Video Dimensions: - أبعاد الفيديو: - - - - Frame Rate: - معدل اﻹطارات: - - - %1 fields (%2 frames) - %1 الحقل (%2 إطارات) - - - - %1 field(s) (%2 frame(s)) - - - - - Interlacing: - المشابكة: - - - - Audio Frequency: - تردد الصوت: - - - - Audio Channels: - قنوات الصوت: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - اﻷسم: %1 -أبعاد الفيديو: %2x%3 -معدل اﻹطارات: %4 -تردد الصوت: %5 -تخطيط الصوت: %6 - - - - Name - اﻷسم - - - - Duration - المدة - - - - Rate - النسبة - - - - MediaPropertiesDialog - - - "%1" Properties - "%1" الخصائص - - - - Tracks: - المقطوعات: - - - - Video %1: %2x%3 %4FPS - فيديو %1: %2x%3 %4إطار/ث - - - Audio %1: %2Hz %3 channels - الصوت %1: %2هرتز %3 قنوات - - - - Audio %1: %2Hz %3 - - - - - %n channel(s) - - - - - - - - - - - - Conform to Frame Rate: - المصادقة لمستوى اﻹطارات: - - - - Alpha is Premultiplied - ألفا مضاعفة مسبقاً - - - - Auto (%1) - تلقائي (%1) - - - - Interlacing: - المشابكة: - - - - Name: - اﻷسم: - - - - MenuHelper - - - &Project - &المشروع - - - - &Sequence - &مقطع - - - - &Folder - &مجلد - - - - Set In Point - ضع في نقطة - - - - Set Out Point - ضع خارج نقطة - - - - Reset In Point - صفر في النقطة - - - - Reset Out Point - صفّر النقطة - - - - Clear In/Out Point - محو نقطة الدخل/الخرج - - - - Add Default Transition - أضف اﻷنتقال الأفتراضي - - - - Link/Unlink - ربط/فصل - - - - Enable/Disable - تفعيل/تعطيل - - - - Nest - تداخل - - - - Cu&t - قط&ع - - - - Cop&y - &نسخ - - - - - &Paste - &لصق - - - - Paste Insert - ألصق أدرج - - - - Duplicate - أستنساخ - - - - Delete - حذف - - - - Ripple Delete - حذف موجة - - - - Split - أنقسام - - - - Invalid aspect ratio - معدل نسبة غير صالح - - - - The aspect ratio '%1' is invalid. Please try again. - معدل النسبة '%1' غير صالح. حاول مجدداً. - - - - Enter custom aspect ratio - أدخل نسبة معدل مخصصة - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - أدخل معدل النسبة لأستعماله في العنوان/الإجراء المنطقة الآمنة (كــ. 16:9): - - - - NewSequenceDialog - - - Editing "%1" - تعديل "%1" - - - - New Sequence - مقطع جديد - - - - Preset: - قالب: - - - - Film 4K - فلم 4K - - - - TV 4K (Ultra HD/2160p) - 4K تلفاز (أقصى-عالي الدقة/2160p) - - - - 1080p - - - - - 720p - - - - - 480p - - - - - 360p - - - - - 240p - - - - - 144p - - - - - NTSC (480i) - - - - - PAL (576i) - - - - - Custom - مخصوص - - - - Video - فيديو - - - - Width: - العرض: - - - - Height: - الطول: - - - - Frame Rate: - معدل اﻹطارات: - - - - Pixel Aspect Ratio: - للمراجعة - معدل نسبة البيكسل: - - - - Square Pixels (1.0) - بكسيل مربع (1.0) - - - - Interlacing: - المشابكة: - - - - None (Progressive) - لا شيء (متفاقم) - - - - Audio - الصوت - - - - Sample Rate: - معدل الإعتيان: - - - - Name: - اﻷسم: - - - - OliveGlobal - - - Olive Project %1 - - - - - Auto-recovery - اﻷستعادة التلقائية - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - زيتون لم يغلق بشكل سليم وتم التعرف على ملف اﻷستعادة التلقائة. هل تريد فتحه؟ - - - - Open Project... - أفتح مشروع... - - - - Missing recent project - مشروع ماضي ضائع - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - المشروع '%1' غير بعد اﻷن. هل ترغب بحذفه من من قائمة مشاريع مؤخراً؟ - - - - Save Project As... - أحفظ المشروع ك... - - - - Unsaved Project - مشروع غير محفوظ - - - - This project has changed since it was last saved. Would you like to save it before closing? - هذا المشروع غُيِرَ منذ أخر مرة. أتريد حفظه قبل اﻹغلاق؟ - - - - No active sequence - لا مقاطع نشطة - - - - Please open the sequence to perform this action. - - - - - No clips selected - - - - - Select the clips you wish to auto-cut - - - - Please open the sequence you wish to export. - رجاءً أفتح المقطع المراد تصديره. - - - - Missing Project File - - - - - Specified project '%1' does not exist. + + Failed to save application settings. The application may lack write permissions to this location. - PanEffect + Footage - - Pan - بحاجة لمتابعة - تسطّح + + %1 FPS + + + + + %1 Hz + + + + + Filename: %1 + + + + + This footage is not valid for use + - Playback + ImportTool - Generating Proxy: %1% - توليد وسيط: %1% + + Don't ask me again + + + + + No Active Sequence + + + + + No sequence is currently open. Would you like to create one? + + + + + Automatically Detect Parameters From Footage + + + + + Set Parameters Manually + - PreferencesDialog + MoveItemCommand - - Preferences - التفضيلات - - - - Invalid CSS File - ملف CSS غير صالح - - - - CSS file '%1' does not exist. - ملف CSS '%1' غير موجود. - - - Warning - تحذير - - - Some changed settings will require restarting Olive to take effect - بعض اﻹعدادات المعدلة تتطلب من زيتون إعادة التشغيل لتأخذ تأثيرها - - - - Confirm Reset All Shortcuts - أكّد تصفير كل اﻹختصارات - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - هل أنت متأكد أنك ترغب بتصفير جميع أختصارات لوحة المفاتيح لقيمهم اﻹفتراضية؟ - - - - Import Keyboard Shortcuts - أستيراد أخصارات لوحة المفاتيح - - - - - Error saving shortcuts - خطأ حفظ اﻹختصارات - - - - Failed to open file for reading - فشل في فتح الملف للقراءة - - - - Export Keyboard Shortcuts - تصدير أختصارات لوحة المفاتيح - - - - Export Shortcuts - تصدير اﻹختصارات - - - - Shortcuts exported successfully - صُدرت اﻷختصارات بنجاح - - - - Failed to open file for writing - فشل في فتح الملف للكتابة - - - - Browse for CSS file - أبحث عن ملف CSS - - - - Delete All Previews + + Move Item - - - Are you sure you want to delete all previews? - - - - - Previews Deleted - - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - - - - - Language: - اللغة: - - - - Default Sequence Settings - - - - - Add Default Effects to New Clips - - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - - - - - Selecting Also Seeks - تحديد العروضات إيضاً - - - - Edit Tool Also Seeks - أداة التحرير تعرض إيضاً - - - - Edit Tool Selects Links - أداة التحرير تحدد الروابط - - - - Seek Also Selects - العرض يحدد إيضاً - - - - Seek to the End of Pastes - أعرض لنهاية الملصوقات - - - - Scroll Wheel Zooms - العجلة الدوراة تُقرّب - - - - Hold CTRL to toggle this setting - - - - - Invert Timeline Scroll Axes - - - - - Enable Drag Files to Timeline - أسمح بسحب الملفات للخط الزمني - - - - Auto-Scale By Default - التحجيم-التلقائي إفتراضياً - - - - Auto-Seek to Imported Clips - - - - - Audio Scrubbing - حكّ شريط الصوت - - - - Drop Files on Media to Replace - - - - - Enable Hover Focus - فعّل التركيز الحائم - - - - Ask For Name When Setting Marker - أسال عن اﻷسم حين وضع المؤشر - - - - Appearance - - - - - Theme - - - - - Olive Dark (Default) - - - - - Olive Light - - - - - Native - - - - - Native (Light Icons) - - - - - Use Native Menu Styling - - - - - Custom CSS: - CSS مخصوص: - - - - Browse - تصفّح - - - - Image sequence formats: - صيغ صور المقاطع: - - - - Audio Recording: - تسجيل الصوت: - - - - Mono - اُحادي - - - - Stereo - مُجسم - - - - Effect Textbox Lines: - للمراجعة - أثر بسطور صندوق النص: - - - - Default Sequence - - - - - Thumbnail Resolution: - دقّة الصورة المصغرة: - - - - Waveform Resolution: - دقّة الشكل الموجي: - - - - Delete Previews - - - - - Use Software Fallbacks When Possible - أستعمل معالجة البرمجيات حين اﻹمكان - - - - General - عام - - - - Behavior - السلوك - - - Disable Multithreading on Images - عطل تعدد المعالجات بالصور - - - Seeking - للمراجعة - التنزيل - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - للمراجعة - عرض دقيق -دوماً أظهر اﻹطار الصحيح (البصريات قد تتوقف بإيجاز كلما تستجلب اﻹطارات بدقة) - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - للمراجعة الشديدة - سرعة النقل -أنقل بسرعة (قد يعمق روئية اﻹطارات غير الصحيحة - لا يؤثر الترديد/تصدير) - - - - Memory Usage - أستعمال الذاكرة - - - - Upcoming Frame Queue: - إطار الصف القادم: - - - - - frames - اﻹطارات - - - - - seconds - الثوان - - - - Previous Frame Queue: - إطار الصف السابق: - - - - Playback - للمراجعة - الترديد - - - - Output Device: - جهاز اﻹخراج: - - - - - Default - إفتراضي - - - - Input Device: - جهاز اﻹدخال: - - - - Sample Rate: - معدل الإعتيان: - - - - Audio - الصوت - - - - Search for action or shortcut - ابحث عن إجراء أو أختصار - - - - Action - إجراء - - - - Shortcut - أختصار - - - - Import - أستيراد - - - - Export - تصدير - - - - Reset Selected - صفّر المحدد - - - - Reset All - صفّر الجميع - - - - Keyboard - لوحة المفاتيح - - PreviewGenerator + NodeCopyPasteWidget - - Failed to find any valid video/audio streams + + Error pasting nodes - - Could not open file - %1 - لا يمكن فتح الملف - %1 - - - - Could not find stream information - %1 - لم يتم العثور على ملومات التدفق - %1 + + Failed to paste nodes: %1 + - Project + NodeFactory - - New - جديد - - - - Open Project + + None - - - Save Project - - - - - Undo - - - - - Redo - أعد - - - - Tree View - مظهر الشجرة - - - - Icon View - مظهر الإيقونات - - - - List View - - - - - Search media, markers, etc. - بحث وسائط, علامات, إلخ. - - - - Project - المشروع - - - - Sequence - مقطع - - - - Replace '%1' - أستبدل '%1' - - - - - All Files - كل الملفات - - - - - No active sequence - لا مقاطع نشطة - - - - No sequence is active, please open the sequence you want to replace clips from. - لا مقطع نشط, رجاءً أفتح المقطع التي تريد أستبدال الجزء منه. - - - - Active sequence selected - مقطع نشط محدد - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - لا يمكنك إدراج المقطع بنفسه, لذا لا جزئيات من هذه الوسائط ستكون بهذا المقطع. - - - - Rename '%1' - أعد تسمية '%1' - - - - Enter new name: - أدخل اﻷسم الجديد: - - - - Delete media in use? - أحذف الوسائط المستعملة؟ - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - الوسائط '%1' حالياً مستعملة ب '%2'. حذفه سوف يحذف جميع حالات المقطع. هل أنت متأكد أنك تريد فعل هذا؟ - - - - Skip - تخطى - - - - Import a Project - - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - - - - - Image sequence detected - تم التعرف على مقاطع صور - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - الملف '%1' يبدو كأنه جزء من سلسلة صور. هل تريد أستيراده هكذا؟ - - - - Import media... - أستيراد وسائط... - - - - No sequence is active, please open the sequence you want to delete clips from. - لا مقطع نشط, رجاءً أفتح المقطع المراد حذف جزء منه. - - ProxyDialog + NodeViewItem - - Create Proxy - أنشئ وسيط - - - - Proxy - وسيط - - - - Dimensions: - اﻷبعاد: - - - - Same Size as Source - نفس حجم المصدر - - - - Half Resolution (1/2) - نصف الدقّة (1/2) - - - - Quarter Resolution (1/4) - ربع الدقّة (1/4) - - - - Eighth Resolution (1/8) - ثُمن الدقة (1/8) - - - - Sixteenth Resolution (1/16) - ستة أعشار الدقّة (1/16) - - - - Format: - صيغة: - - - - ProRes HQ - جودة عالية أحترافية (ProRes HQ) - - - - Location: - الموقع: - - - - Same as Source (in "%1" folder) - مثل المصدر (في مجلد "%1") - - - - Proxy file exists - ملف الوسيط موجود - - - - The file "%1" already exists. Do you wish to replace it? - الملف "%1" موجود مسبقاً. هل ترغب بأستبداله؟ - - - - Custom Location - موقع مخصوص + + %1... + - ProxyGenerator + PresetManager - - Finished generating proxy for "%1" - أنتهى توليد وسيط إلى "%1" + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + - ReplaceClipMediaDialog + RatioDialog - - Replace clips using "%1" - أستبدل المقاطع بأستعمال "%1" + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Select which media you want to replace this media's clips with: - أختار إي الوسائط تريد أستبدالها لمقاطع الوسائط هذخ مع: + + Invalid custom ratio + - - Keep the same media in-points - ضع ذات الوسائط في نقاط - - - - Replace - أستبدل - - - - Cancel - إلغاء - - - - No media selected - لا وسائط محددة - - - - Please select a media to replace with or click 'Cancel'. - رجاءً أختر الوسائط للأستبدال مع أو أنقر 'إلغاء'. - - - - Same media selected - ذات الوسائط مختارة - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - أخترت ذات الوسائط المراد أستبدالها. رجاءً أختر غيرها أو أنقر 'إلغاء'. - - - - Folder selected - مجلد محدد - - - - You cannot replace footage with a folder. - لا يمكنك أستبدال اللقطات مع مجلد. - - - - Active sequence selected - مقاطع نشطة محددة - - - - You cannot insert a sequence into itself. - لا يسعك إدراج مقطع في نفسه. + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - RichTextEffect + RenameItemCommand - - Text - النص - - - - Padding + + Rename Item - - - Position - الموضع - - - - Vertical Align: - - - - - Top - أعلى - - - - Center - المركز - - - - Bottom - القاع - - - - Auto-Scroll - - - - - Off - مطفئ - - - - Up - - - - - Down - - - - - Left - يسار - - - - Right - يمين - - - - Shadow - الظل - - - - Shadow Color - لون الظل - - - - Shadow Angle - - - - - Shadow Distance - مسافة الظل - - - - Shadow Softness - نعومة الظل - - - - Shadow Opacity - عتمة الظل - Sequence - - %1 (copy) - %1 (نسخ) + + %1 FPS + - ShakeEffect + Stream - - Intensity - للمراجعة(كثافة أم شدة) - الكثافة - - - - Rotation - الدوران - - - - Frequency - التردد - - - - SolidEffect - - - Type - النوع - - - - Solid Color - لون صلب - - - - SMPTE Bars - ألواح SMPTE - - - - Checkerboard - لوح التدقيق - - - - Opacity - العتمة - - - - Color - اللون - - - - Checkerboard Size - حجم لوح التدقيق - - - - SourcesCommon - - - Import... - أستيراد... - - - - New - جديد - - - - View - أظهر - - - - Tree View - مظهر الشجرة - - - - Icon View - مظهر الإيقونات - - - - Show Toolbar - أظهر لوح اﻷدوات - - - - Show Sequences - أظهر المقاطع - - - - Replace/Relink Media - أستبدل/أعد ربط الوسائط - - - - Reveal in Explorer - أظهر في الكاشف - - - - Reveal in Finder - أظهر في البحث - - - - Reveal in File Manager - أظهر بمتصفح الملفات - - - - Replace Clips Using This Media - أستبدل المقاطع مستعملاً هذه الوسائط - - - - Create Sequence With This Media - أنشئ مقطع مع هذه الوسائط - - - - Duplicate - أستنساخ - - - - Delete All Clips Using This Media - أحذف جميع هذه المقاطع المستعملة هذه الوسائط - - - - Proxy - وسيط - - - - Generating proxy: %1% complete - توليد الوسيط: %1% أكتمل - - - - Create/Modify Proxy - أنشئ/غيّر وسيط - - - - Create Proxy - أنشئ وسيط - - - - Modify Proxy - غيّر الوسيط - - - - Restore Original - أستعد اﻷصل - - - - Delete - حذف - - - - Preview in Media Viewer + + %1: Audio - %2 Channels, %3Hz - - Properties... - الخصائص... + + %1: Unknown + - - Replace Media - أستبدل الوسائط + + %1: Image - %2x%3 + - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - أنت أوقعت ملفً على '%1' هل تريد أستبداله مع الملف المرمي؟ - - - - Delete proxy - حذف وسيط - - - - Would you like to delete the proxy file "%1" as well? - هل تريد حذف ملف الوسيط "%1" إيضاً؟ + + %1: Video - %2x%3 + - SpeedDialog + TimelineViewBlockItem - Dialog - الحوار + + %1 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Speed: - السرعة: + + Bars + ألواح - + + Solid + + + + + Title + عنوان + + + + Tone + نغّم + + + + Unknown + + + + + VideoParams + + + 8-bit + + + + + 16-bit Integer + + + + + Half-Float (16-bit) + + + + + Full-Float (32-bit) + + + + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + + + + + main + + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + qm-file + + + + + Project to open on startup + + + + + olive::AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + زيتون هو محرر فيديو غير خطي. هذا البرنامج حر ومحمي بموجب رخصة جنو العمومية. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + فريق زيتون ملزم بإخبار مستخدميه بأن الشفرة المصدرية لزيتون متوفرة للتنزيل عبر موقعه الإلكتروني. + + + + olive::ActionSearch + + + Search for action... + ابحث عن إجراء... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + الصوت + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + + Length + + + + + Media In + + + + + Enabled + + + + + Speed + + + + + olive::BlurFilterNode + + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + + + + + olive::ClipBlock + + + Clip + + + + + A time-based node that represents a media source. + + + + + Buffer + + + + + olive::ColorDialog + + + Select Color + + + + + olive::ColorSpaceChooser + + + Color Management + + + + + Input: + + + + + Color Space: + + + + + Display: + + + + + View: + + + + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + مجلد جديد + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + + + + + + Error + خطأ + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + خطي + + + + Bezier + بيزير + + + + Hold + أمسك + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + + + + + Pixel + + + + + Pixel Format: + + + + + Performance + + + + + Threads: + + + + + olive::ExportAudioTab + + + Codec: + مرماز: + + + + Sample Rate: + معدل الإعتيان: + + + + Channel Layout: + + + + + Format: + صيغة: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + أسم الملف: + + + + Browse for exported file filename + + + + + Preset: + قالب: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + المدى: + + + + Entire Sequence + كل المقطع + + + + In to Out + الدخل إلى الخرج + + + + Format: + صيغة: + + + + Export Video + + + + + Export Audio + + + + + Video + فيديو + + + + Audio + الصوت + + + + + Export + تصدير + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + العرض: + + + + Height: + الطول: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + + Fit + وائم + + + + Stretch + + + + + Crop + + + + Frame Rate: - معدل اﻹطارات: - - - - Duration: - المدة: - - - - Speed/Duration - السرعة/المدّة - - - - Reverse - معكوس - - - - Maintain Audio Pitch - للمراجعة - حافظ على حدة الصوت - - - - Ripple Changes - تغيرات الموجة - - - - TextEditDialog - - - Edit Text - عدّل النص - - - - Thin - - Extra Light + + Pixel Aspect Ratio: + معدل نسبة البيكسل: + + + + Interlacing: + المشابكة: + + + + Quality: - - Light + + Codec - - Normal - عادي + + Codec: + مرماز: - - Medium - - - - - Demi Bold - - - - - Bold - - - - - Extra Bold - - - - - Black + + Advanced - TextEditEx + olive::FloatSlider - - Edit Text - عدّل النص - - - - &Edit Text - &عدل النص - - - - TextEffect - - - Text - النص - - - - Font - الخط - - - - Size - الحجم - - - - Color - اللون - - - - Alignment - محاذاة - - - - Left - يسار - - - - - Center - المركز - - - - Right - يمين - - - - Justify - تسوية - - - - Top - أعلى - - - - Bottom - القاع - - - - Word Wrap - لُف الكلمة - - - - Padding + + %1 dB - + + %1% + + + + + olive::FootagePropertiesDialog + + + "%1" Properties + "%1" الخصائص + + + + Name: + اﻷسم: + + + + Tracks: + المقطوعات: + + + + olive::FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + تصفّح + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + كل الملفات + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + حجم الملف الهدف (مب): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + لا شيء (متفاقم) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + خطي + + + + Hold + أمسك + + + + Bezier + بيزير + + + + olive::KeyframeViewBase + + + Linear + خطي + + + + Bezier + بيزير + + + + Hold + أمسك + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + &أحفظ المشروع + + + + Save Project &As + أحفظ المشروع &ك + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + &ملف + + + + &New + &جديد + + + + &Open Project + &أفتح مشروع + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &أستيراد + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + خ&روج + + + + &Edit + &تعديل + + + + Insert + + + + + Overwrite + + + + + Select &All + تحديد &الكل + + + + Deselect All + إلغاء تحديد الكل + + + + Ripple to In Point + موجة لنقطة إدخال + + + + Ripple to Out Point + موجة لنقطة إخراج + + + + Edit to In Point + عدّل لنقطة إدخال + + + + Edit to Out Point + عدّل لنقطة إخراج + + + + Delete In/Out Point + محو نقطة الدخل/الخرج + + + + Ripple Delete In/Out Point + موجة حذف نقطة الإدخال/الإخراج + + + + Set/Edit Marker + حدد/عدّل اﻹشارات + + + + &View + &أظهر + + + + Zoom In + تقريب + + + + Zoom Out + أبتعاد + + + + Increase Track Height + زدّ طول المسار + + + + Decrease Track Height + قلل طول المسار + + + + Toggle Show All + فعل إظهار الكل + + + + Full Screen + ملء الشاشة + + + + Full Screen Viewer + عارض ملء الشاشة + + + + &Playback + &الترديد + + + + Go to Start + أذهب للبداية + + + + Previous Frame + الإطار السابق + + + + Play/Pause + تشغيل/أستئناف + + + + Play In to Out + شغل من الإدخال إلى الإخراج + + + + Next Frame + اﻹطار التالي + + + + Go to End + أذهب للنهاية + + + + Go to Previous Cut + أذهب للقطعة السابقة + + + + Go to Next Cut + أذهب للقطعة التالية + + + + Go to In Point + أذهب لنقطة إدخال + + + + Go to Out Point + أذهب لنقطة إخراج + + + + Shuttle Left + توشع اليسار + + + + Shuttle Stop + إيقاف التوشع + + + + Shuttle Right + توشع اليمين + + + + Loop + حلقة + + + + &Sequence + &مقطع + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + ضخّم اللائحة + + + + Lock Panels + + + + + Reset to Default Layout + صفّر للتخطيط المبدئي + + + + &Tools + &اﻷدوات + + + + Pointer Tool + أداة المؤشر + + + + Edit Tool + أداة التحرير + + + + Ripple Tool + أداة الموجة + + + + Rolling Tool + + + + + Razor Tool + أداة القطع + + + + Slip Tool + أداة المنزلقة + + + + Slide Tool + أداة الشريحة + + + + Hand Tool + أداة اليد + + + + Zoom Tool + + + + + Transition Tool + أداة اﻷنتقال + + + + Enable Snapping + فعّل السحب + + + + Preferences + التفضيلات + + + + &Help + &مساعدة + + + + A&ction Search + ب&حث إجراء + + + + Send &Feedback... + + + + + &About... + &حول... + + + + olive::MainStatusBar + + + Welcome to %1 %2 + مرحباً في %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + أظهر + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + أضف + + + + Subtract + + + + + Multiply + ضاعف + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + Position الموضع - - Outline - الخلاصة + + Rotation + الدوران - - Outline Color - لون الخلاصة + + Scale + المقياس - - Outline Width - عرض الخلاصة + + Uniform Scale + المقياس الموحد - - Shadow - الظل + + Anchor Point + نقطة المرساة + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + &المشروع - - Shadow Color - لون الظل + + &Sequence + &مقطع - - Shadow Angle + + &Folder + &مجلد + + + + Cu&t + قط&ع + + + + Cop&y + &نسخ + + + + &Paste + &لصق + + + + Paste Insert + ألصق أدرج + + + + Duplicate + أستنساخ + + + + Delete + حذف + + + + Ripple Delete + حذف موجة + + + + Split + أنقسام + + + + Set In Point + ضع في نقطة + + + + Set Out Point + ضع خارج نقطة + + + + Reset In Point + صفر في النقطة + + + + Reset Out Point + صفّر النقطة + + + + Clear In/Out Point + محو نقطة الدخل/الخرج + + + + Add Default Transition + أضف اﻷنتقال الأفتراضي + + + + Link/Unlink + ربط/فصل + + + + Enable/Disable + تفعيل/تعطيل + + + + Nest + تداخل + + + + Frames + اﻹطارات + + + + Drop Frame + أفلت إطار + + + + Non-Drop Frame + إطار غير مُفلت + + + + Milliseconds + جزء من الثانية + + + + Seconds + + + + + olive::MergeNode + + + Merge - - Shadow Distance - مسافة الظل + + Merge two textures together. + - - Shadow Softness - نعومة الظل + + Base + - - Shadow Opacity - عتمة الظل - - - - Sample Text - عينة نص - - - &Edit Text - &عدل النص + + Blend + - TimecodeEffect + olive::Node - - Timecode - شفرة الوقت + + Input + - - Sequence - مقطع + + Output + - - Media - الوسائط + + General + عام - - Scale - المقياس + + Math + - + Color - اللون + اللون - - Background Color - لون الخلفية + + Filter + - - Background Opacity - عتمة الخلفية + + Timeline + الخط الزمني - - Offset - اﻷزاحة + + Generator + - - Prepend - باحجة للمراجعة - البادئة + + Channel + + + + + Transition + + + + + Uncategorized + - Timeline + olive::NodeInput - - Timeline: - الخط الزمني: + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + - <none> - <لا شيء> + + None + - - Nested Sequence - مقطع متشعب + + Integer + - - Effect already exists - المؤثر موجود مسبقاً + + Float + - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - المقطع '%1' يحتوي على المؤثر '%2'. هل تفضل أستبداله مع الملصوق أو إضافته كمؤثر منفصل؟ + + Rational + - + + Boolean + + + + + Color + اللون + + + + Matrix + + + + + Text + النص + + + + Font + الخط + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + تحذير + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + + (unknown) + (غير معلوم) + + + + olive::NodeTreeView + + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + Add - أضف + أضف + + + + olive::PanNode + + + + Pan + تسطّح - - Replace - أستبدل + + Adjust the stereo panning of an audio source. + - - Skip - تخطى + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + - - Do this for all conflicts found - أفعل هذا مع كل التعارضات الموجودة - - - - Title... - العنوان... - - - - Solid Color... - بحاجة لمتابعة - لون صلب... - - - - Bars... - ألواح... - - - - Tone... - نغّم... - - - - Noise... - ضجيج... - - - - Unsaved Project - مشروع غير محفوظ - - - - You must save this project before you can record audio in it. - يجب عليك حفظ المشروع قبل تسجيل الصوت فيه. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - أنقر على الخط الزمني حيث تريد بدء التسجيل (أسحب لوضع حد للتسجيل في إطار وقت معين) - - - + (none) (لا شيء) - - Pointer Tool - أداة المؤشر - - - - Edit Tool - أداة التحرير - - - - Ripple Tool - أداة الموجة - - - - Razor Tool - أداة القطع - - - - Slip Tool - بحاجة لمتابعة - أداة المنزلقة - - - - Slide Tool - أداة الشريحة - - - - Hand Tool - أداة اليد - - - - Transition Tool - أداة اﻷنتقال - - - - Snapping - بحاجة لمتابعة - الساحبة - - - - Zoom In - تقريب - - - - Zoom Out - أبتعاد - - - - Record audio - سجّل الصوت - - - - Add title, solid, bars, etc. - أضف عنوان, صلب, ألواح, إلخ. + + (multiple) + - TimelineHeader + olive::PathWidget - - Center Timecodes - وسّط رمز الوقت + + Browse + تصفّح + + + + Browse for path + - TimelineWidget + olive::PixelAspectRatioComboBox - - &Undo - &تراجع - - - - &Redo - &أعد - - - C&ut - قط&ع - - - Cop&y - &نسخ - - - &Paste - &لصق - - - R&ipple Delete - حذف مو&جة - - - - Sequence Settings - اﻷعدادات المقطع - - - - &Speed/Duration - &السرعة/المدّة - - - Auto-s&cale - التحجيم-التلقا&ئي - - - Enable/Disable - تفعيل/تعطيل - - - Link/Unlink - ربط/فصل - - - &Nest - &تداخل - - - - &Reveal in Project - &أبرّز في المشروع - - - R&ename - أ&عد تسمية - - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -بدء: %2 -أنتهاء: %3 -المدة: %4 - - - Rename '%1' - أعد تسمية '%1' - - - Rename multiple clips - أعد تسمية عدة مقاطع - - - Enter a new name for this clip: - أدخل أسم جديد لهذا المقطع: - - - - R&ipple Delete Empty Space + + Set Custom Pixel Aspect Ratio - - Auto-Cut Silence + + Custom... - - Auto-S&cale + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + اللون + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon - + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + اللون + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + جهاز اﻹخراج: + + + + Input Device: + جهاز اﻹدخال: + + + + Sample Rate: + معدل الإعتيان: + + + + Audio Recording: + تسجيل الصوت: + + + + Mono + اُحادي + + + + Stereo + مُجسم + + + + Refresh Devices + + + + + Please wait... + + + + + Default + إفتراضي + + + + olive::PreferencesBehaviorTab + + + Behavior + السلوك + + + + General + عام + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + الصوت + + + + Enable audio scrubbing + + + + + Timeline + الخط الزمني + + + + Auto-Seek to Imported Clips + + + + + Edit Tool Also Seeks + أداة التحرير تعرض إيضاً + + + + Edit Tool Selects Links + أداة التحرير تحدد الروابط + + + + Enable Drag Files to Timeline + أسمح بسحب الملفات للخط الزمني + + + + Invert Timeline Scroll Axes + + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + العرض يحدد إيضاً + + + + Seek to the End of Pastes + أعرض لنهاية الملصوقات + + + + Selecting Also Seeks + تحديد العروضات إيضاً + + + + Playback + الترديد + + + + Ask For Name When Setting Marker + أسال عن اﻷسم حين وضع المؤشر + + + + Automatically rewind at the end of a sequence + + + + + Project + المشروع + + + + Drop Files on Media to Replace + + + + + Nodes + + + + + Add Default Effects to New Clips + + + + + Auto-Scale By Default + التحجيم-التلقائي إفتراضياً + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + التفضيلات + + + + General + عام + + + + Appearance + + + + + Behavior + السلوك + + + + Disk + + + + + Audio + الصوت + + + + Keyboard + لوحة المفاتيح + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + اللغة: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + ابحث عن إجراء أو أختصار + + + + Action + إجراء + + + + Shortcut + أختصار + + + + Import + أستيراد + + + + Export + تصدير + + + + Reset Selected + صفّر المحدد + + + + Reset All + صفّر الجميع + + + + Confirm Reset All Shortcuts + أكّد تصفير كل اﻹختصارات + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + هل أنت متأكد أنك ترغب بتصفير جميع أختصارات لوحة المفاتيح لقيمهم اﻹفتراضية؟ + + + + Import Keyboard Shortcuts + أستيراد أخصارات لوحة المفاتيح + + + + + Error saving shortcuts + خطأ حفظ اﻹختصارات + + + + Failed to open file for reading + فشل في فتح الملف للقراءة + + + + Export Keyboard Shortcuts + تصدير أختصارات لوحة المفاتيح + + + + Export Shortcuts + تصدير اﻹختصارات + + + + Shortcuts exported successfully + صُدرت اﻷختصارات بنجاح + + + + Failed to open file for writing + فشل في فتح الملف للكتابة + + + + olive::ProgressDialog + + + Cancel + إلغاء + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &جديد + + + + &Import... + &أستيراد + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + أظهر في الكاشف + + + + Reveal in Finder + أظهر في البحث + + + + Reveal in File Manager + أظهر بمتصفح الملفات + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + المشروع + + + + (none) + (لا شيء) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + تصفّح + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + + + + + Save Project + + + + + Undo + + + + + Redo + أعد + + + + Search media, markers, etc. + بحث وسائط, علامات, إلخ. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + اﻷسم + + + + Duration + المدة + + + + Rate + النسبة + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + اﻷسم: + + + + New Sequence + مقطع جديد + + + + Editing "%1" + تعديل "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + فيديو + + + + Width: + العرض: + + + + Height: + الطول: + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + معدل نسبة البيكسل: + + + + Interlacing: + المشابكة: + + + + Audio + الصوت + + + + Sample Rate: + معدل الإعتيان: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + عارض المقطع + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + اللون + + + + olive::StringSlider + + + (none) + (لا شيء) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + اللون + + + + Radius + + + + + Opacity + العتمة + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + عينة نص + + + + + Text + النص + + + + Generate rich text. + + + + + Font + الخط + + + + Font Size + + + + + Color + اللون + + + + Vertical Align + + + + + Top + أعلى + + + + Center + المركز + + + + Bottom + القاع + + + + olive::TimeBasedPanel + + + (none) + (لا شيء) + + + + olive::TimeBasedWidget + + + Set Marker + ضع وسم + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + الخط الزمني + + + + olive::TimelineWidget + + + Properties - - Error - خطأ - - - - Couldn't locate media wrapper for sequence. - لم يتم رصد موقع غلاف الوسائط للمقطع. - - - - Title - عنوان - - - - Solid Color - لون صلب - - - - Bars - ألواح - - - - Tone - نغّم - - - - Noise - ضجيج - - - - Duration: - المدة: + + Use Audio Time Units + - ToneEffect + olive::ToolPanel - - Type - نوع + + Tools + + + + + olive::Toolbar + + + Pointer Tool + أداة المؤشر - + + Edit Tool + أداة التحرير + + + + Ripple Tool + أداة الموجة + + + + Rolling Tool + + + + + Razor Tool + أداة القطع + + + + Slip Tool + أداة المنزلقة + + + + Slide Tool + أداة الشريحة + + + + Hand Tool + أداة اليد + + + + Zoom Tool + + + + + Transition Tool + أداة اﻷنتقال + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + خطي + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + Sine - - Frequency - التردد + + Cosine + - - Amount - مقدار + + Tangent + - - Mix - دمج - - - - TransformEffect - - - Position - الموضع + + Inverse Sine + - - Scale - المقياس + + Inverse Cosine + - - Uniform Scale - المقياس الموحد + + Inverse Tangent + - - Rotation - الدوران + + Hyperbolic Sine + - - Anchor Point - نقطة المرساة + + Hyperbolic Cosine + - - Opacity - العتمة + + Hyperbolic Tangent + - - Blend Mode - طور المزج - - - - Normal - عادي - - - Darken - ظلّم - - - Multiply - ضاعف - - - Color Burn - حرق اللون - - - Linear Burn - حرق خطي - - - Lighten - خفّف - - - Screen - شاشة - - - Color Dodge - بحاجة لمتابعة - تلفيق اللون - - - Linear Dodge (Add) - تلفيق خطي (أضف) - - - Overlay - غطاء - - - Soft Light - ضوء ناعم - - - Hard Light - ضوء خشن - - - Vivid Light - بحاجة لمتابعة - ضوء حيوي - - - Linear Light - ضوء خطي - - - Pin Light - بحاجة لمتابعة - ضوء الدبوس - - - Hard Mix - بحاجة لمتابعة - دمج صلب - - - Difference - فرق - - - Exclusion - حصر - - - Reflect - أنعكاس - - - Substract - طرح - - - Average - متوسط - - - Glow - توهج - - - Negation - نفي - - - Phoenix - فينيكس - - - - Transition - - Length: - الطول: - - - - Length + + Method - UpdateNotification + olive::VideoDividerComboBox - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + + Full + + + + + 1/%1 + 1/%1 + + + + olive::VideoInput + + + Video Input + + + + + Video + فيديو + + + + Import a video footage stream. - VSTHost + olive::VideoStreamProperties - - - Error loading VST plugin - خطأ تحميل إضافة VST - - - Failed to create VST reference - فشل إنشاء مرجع VST - - - - Failed to load VST plugin "%1": %2 - فشب تحميل إضافة VST "%1": %2 - - - NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - ملحوظة: لا يمكنك تحميل إضافة VST 32-بت لنسخة زيتون مبنية ل64-بت. رجاءً جد نسخة 64-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 32-بت. - - - NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - ملحوظة: لا يمكنك تحميل إضافة VST 64-بت لنسخة زيتون مبنية ل32-بت. رجاءً جد نسخة 32-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 64-بت. - - - - Failed to locate entry point for dynamic library. + + Pixel Aspect: - - VST Error - خطأ VST + + Interlacing: + المشابكة: - - Plugin's magic number is invalid - رقم اﻹضافة السحري غير صالح - - - - Plugin - إضافة - - - - Interface - واجهة - - - - Show - أظهر - - - - VST Plugin - إضافة VST - - - - Viewer - - - Sequence Viewer - عارض المقطع - - - - Media Viewer - عارض الوسائط - - - - (none) - (لا شيء) - - - - Drag video only + + Color Space: - - Drag audio only + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. - ViewerWidget + olive::ViewerOutput - - Save Frame as Image... - احفظ اﻹطار كصورة... + + Viewer + - - Show Fullscreen - أظهر ملء الشاشة + + Interface between a Viewer panel and the node system. + - - Disable - تعطيل + + Texture + - - Screen %1: %2x%3 - الشاشة %1: %2x%3 + + Samples + - + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + خطأ + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + Zoom - قرّب + قرّب - + Fit - وائم + وائم - - Custom - مخصوص + + %1% + - - Close Media - أغلق الوسائط + + Full Screen + ملء الشاشة - - Save Frame - أحفظ اﻹطار + + Screen %1: %2x%3 + الشاشة %1: %2x%3 - - Viewer Zoom - تقريب الرؤية + + Deinterlace + - - Set Custom Zoom Value: - حدد قيمة تقريب مخصصة: + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + مطفئ + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + - ViewerWindow + olive::VolumeNode - - Exit Fullscreen - الخروج من ملء الشاشة - - - - VoidEffect - - - (unknown) - (غير معلوم) - - - - Missing Effect - تأثير مفقود - - - - VolumeEffect - - + + Volume - درجة الصوت - - - - transition - - - Invalid transition - أنتقال غير صالح + درجة الصوت - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - لا مرشح للأنتقال '%1'. هذه اﻷنتقالة قد تكون فاسدة. جرب إعادة تثبيتها أو زيتون. + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/bs_BS.ts b/app/ts/bs_BS.ts index d05f177b3..a3be64250 100644 --- a/app/ts/bs_BS.ts +++ b/app/ts/bs_BS.ts @@ -2,3714 +2,4765 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - To the best of my knowledge, there is no translation for free as in libre that sounds quite as nicely as slobodan. - Olive je nelinearni video uređivač. Ovaj software je slobodan i zaštićen GNU GPL-om. - - - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Olive tim je pod obavezom da obavijesti svoje korisnike da je Olive-ov izvorni kod dostupan za preuzimanje sa njegove web stranice - - - - ActionSearch - - - Search for action... - Potražite radnju... - - - - AdvancedVideoDialog - - - Advanced Video Settings - Napredne video postavke - - - - Pixel Format: - Format piksela: - - - - Threads: - - - - - Audio - - Audio - Audio - - - Recording - Snimanje - - - - %1 Audio - %1 Audio - - - - Recording %1 - Snimanje %1 - - - - AudioNoiseEffect - - - Amount - Količina - - - - Mix - Miks - - - - AutoCutSilenceDialog - - - Cut Silence + + %1 Hz - - Attack Threshold: - - - - - Attack Time: - - - - - Release Threshold: - - - - - Release Time: - - - - - Cacher - - - - Could not open %1 - %2 - - - - - ChannelLayoutName - - - Invalid - Nevažeće - - - + Mono - Mono + Mono - + Stereo - Stereo + Stereo - - - ClipPropertiesDialog - - "%1" Properties + + 2.1 - - Multiple Clip Properties + + 5.1 - - Name: + + 7.1 - - Duration: - - - - - (multiple) + + Unknown (0x%1) - CollapsibleWidget + Config - - <untitled> - <neimenovano> - - - - ColorButton - - - Set Color - Postavi boju - - - - CornerPinEffect - - - Top Left - Gornje lijevo - - - - Top Right - Gornje desno - - - - Bottom Left - Donje lijevo - - - - Bottom Right - Donje desno - - - - Perspective - Perspektiva - - - - DebugDialog - - - Debug Log - Zapis za debugiranje - - - - DemoNotice - - - - Welcome to Olive! - Dobrodošli u Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive je slobodan video uređivač sa otvorenim izvornim kodom izdan pod GNU GPL-om. Ako ste platili za ovaj software, vi ste bili prevareni. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Ovaj software je trenutno u ALFA stanju, što znači da je nestabilan i veoma je vjerovatno da će se srušiti, imati greške i da ne dostaje nekih mogućnosti. Mi ne dajemo nikakvu garanciju, tako da koristite na svoj sopstveni rizik. Molimo da prijavite sve greške i željene funkcije na %1 - - - - Thank you for trying Olive and we hope you enjoy it! - Hvala što isprobavate Olive i nadamo se da ćete uživati u njemu! - - - - Effect - - - Invalid effect - Nevažeći efekat - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - Nema kandidata za efekat '%1'. Moguće je da je ovaj efekat koruptiran. Pokušajte ponovno instalirati njega ili Olive. - - - Cu&t - I'll have to check back on this later to see how it works with the keyboard in practice - &Reži - - - &Copy - &Kopiraj - - - Move &Up - Pomjeri &gore - - - Move &Down - Pomjeri &dolje - - - D&elete - &Obriši - - - Load Settings From File - Učitaj postavke iz datoteke - - - Save Settings to File - Spasi postavke u datoteku - - - - Save Effect Settings - Spasi postavke efekata - - - - - Effect XML Settings %1 - XML postavke-efekta %1 - - - - Save Settings Failed - Spašavanje postavki neuspješno - - - - Failed to open "%1" for writing. - Neuspješno otvaranje "%1" za uređivanje. - - - - Load Effect Settings - Učitaj postavke efekta - - - - - Load Settings Failed - Učitavanje postavki neuspješno - - - - Failed to open "%1" for reading. - Neuspješno otvaranje "%1" za čitanje. - - - - This settings file doesn't match this effect. - Ova datoteka postavki nije prikladna za ovaj efekat. - - - - EffectControls - - - Effects: - Efekti: - - - &Paste - &Zalijepi - - - - (none) - (nema) - - - - Add Video Effect - Dodaj video efekat - - - - VIDEO EFFECTS - VIDEO EFEKTI - - - - Add Video Transition - Dodaj video prelaz - - - - Add Audio Effect - Dodaj audio efekat - - - - AUDIO EFFECTS - AUDIO EFEKTI - - - - Add Audio Transition - Dodaj audio prelaz - - - (Multiple clips selected) - (Vše snimki je odabrano) - - - - EffectRow - - - Disable Keyframes - Onemogući ključne kadrove - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Onemogućavanje ključnih kadrova će obrisati sve trenutne ključne kadrove. Da li ste sigurni da želite ovo uraditi? - - - - EffectUI - - - %1 (Opening) + + Error loading settings - - %1 (Closing) - - - - - %1 (multiple) - - - - - Cu&t - &Reži - - - - &Copy - &Kopiraj - - - - Move &Up - Pomjeri &gore - - - - Move &Down - Pomjeri &dolje - - - - D&elete - &Obriši - - - - Load Settings From File - Učitaj postavke iz datoteke - - - - Save Settings to File - Spasi postavke u datoteku - - - - EmbeddedFileChooser - - - File: - Datoteka: - - - - ExportDialog - - - Export "%1" - Izvoz "%1" - - - - Unknown codec name %1 - Nepoznato ime kodeka %1 - - - - Export Failed - Izvoz neuspješan - - - - Export failed - %1 - Izvoz neuspješan - %1 - - - - Invalid dimensions - Nevažeće dimenzije - - - - Export width and height must both be even numbers/divisible by 2. - Visina i širina izvoza obje moraju biti parni brojevi/djeljive sa dva. - - - - Invalid codec - Nevažeći kodek - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Parametri odabranog kodeka se nisu mogli odrediti. Ovo je greška, molimo da kontaktirate developere. - - - - Invalid format - Nevažeći format - - - - Couldn't determine output format. This is a bug, please contact the developers. - Izlazni format se nije mogao odrediti. Ovo je greška, molimo da kontaktirate developere. - - - - Export Media - Izvoz medija - - - - %p% (Total: %1:%2:%3) - - - - - %p% (ETA: %1:%2:%3) - - - - - Quality-based (Constant Rate Factor) - Bazirano na kvaliteti (Faktor stalne stope/Constant Rate Factor) - - - - Constant Bitrate - Stalna stopa bitova - - - - - Invalid Codec - Nevažeći kodek - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Traganje za prikladnim koderom za ovaj kodek nije uspjelo. Izvoz najvjerovatnije neće uspjeti. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Traganje za prikladnim formatom piksela za ovaj kodek nije uspjelo. Izvoz najvjerovatnije neće uspjeti. - - - - Bitrate (Mbps): - Stopa bitova (Mbps): - - - - Quality (CRF): - Kvaliteta (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Faktor kvalitete: - -0 = besprijekorno -17-18 = oku besprijekorno (komprimirano, ali neprimjetno) -23 = visoka kvaliteta -51 = najniža kvaliteta moguća - - - - Target File Size (MB): - Željena veličina datoteke (MB): - - - - Format: - Format: - - - - Range: - Raspon: - - - - Entire Sequence - Čitava sekvenca - - - - In to Out - I have no clue what to call this really, it only plays sound, but that's not in the name, so I can't mention sound, so I assume that "in" and "out" reference the in and out points respectively. - Od početka do kraja - - - - Video - Video - - - - - Codec: - Kodek: - - - - Width: - Širina: - - - - Height: - Visina: - - - - Frame Rate: - Okvirna stopa: - - - - Compression Type: - Tip komprimacije: - - - - Advanced - Napredno - - - - Audio - Audio - - - - Sampling Rate: - Stopa uzoraka: - - - - Bitrate (Kbps/CBR): - Stopa bitova (Kbps/CBR): - - - - ExportThread - - - failed to send frame to encoder (%1) - Slanje okvira koderu nije uspjelo (%1) - - - - failed to receive packet from encoder (%1) - Primanje paketa od kodera nije uspjelo (%1) - - - - could not video encoder for %1 - Nije mogao video koder za %1 - - - - could not allocate video stream - Video tok se nije mogao zauzeti - - - - could not allocate video encoding context - Kontekst video kodiranja se nije moago zauzeti - - - - could not open output video encoder (%1) - Izlazni video koder se nije moago otvoriti (%1) - - - - could not copy video encoder parameters to output stream (%1) - Parametri video kodera se nisu mogli kopirati u izlazni tok (%1) - - - - could not audio encoder for %1 - Not sure if there should be anything in between "not" and "audio" - Nije mogao audio koder za %1 - - - - could not allocate audio stream - Audio tok se nije mogao zauzeti - - - - could not allocate audio encoding context - Kontekst audio kodiranja se nije mogao zauzeti - - - - could not open output audio encoder (%1) - Izlaz audio kodera se nije mogao otvoriti (%1) - - - - could not copy audio encoder parameters to output stream (%1) - Parametri audio kodera se nisu mogli kopirati u izlazni tok (%1) - - - - could not allocate audio buffer (%1) - Audio međuspremnik se nije mogao zauzeti (%1) - - - - could not create output format context - Kontekst izlaznog formata se nije mogao stvoriti - - - - could not open output file (%1) - Izlazna datoteka se nije mogla otvoriti (%1) - - - - could not write output file header (%1) - Zaglavlje izlazne datoteke se nije moglo ispisati (%1) - - - - could not write output file trailer (%1) - Zaglavlje izlazne datoteke se nije moglo ispisati (%1) - - - - FillLeftRightEffect - - - Type - Tip - - - - Fill Left with Right - Popuni lijevo sa desnim - - - - Fill Right with Left - Popuni desno sa lijevim - - - - Frei0rEffect - - - Failed to load Frei0r plugin "%1": %2 - Not sure if that's completely accurate, as I have not seen this dialog and the text itself is somewhat ambiguous regarding the placeholders' functions - Učitavanje Frei0r dodatka nije uspjelo "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - PAŽNJA: Vi ne možete učitavati 32-bitne Frei0r dodatke u 64-bitno izdanje Olive-a. Molimo nađite 64-bitno izdanje ovih dodataka, ili pređite na 32-bitno izdanje Olive-a. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - PAŽNJA: Vi ne možete učitavati 64-bitne Frei0r dodatke u 32-bitno izdanje Olive-a. Molimo nađite 32-bitno izdanje ovih dodataka, ili pređite na 64-bitno izdanje Olive-a. - - - - Error loading Frei0r plugin - Greška pri učitavanju Frei0r dodataka - - - - GraphEditor - - - Graph Editor - Uređivač grafikona - - - - Linear - Linearno - - - - Bezier - Bezier - - - - Hold - Drži - - - - GraphView - - - Zoom to Selection - Povećaj ka odabiru - - - - Zoom to Show All - Povećaj ka svemu - - - - Reset View - Vrati prvobitni prikaz - - - - InterlacingName - - - None (Progressive) - Nema (progresivno) - - - - Top Field First - Gornje polje prvo - - - - Bottom Field First - Donje polje prvo - - - - Invalid - Nevažeće - - - - KeyframeNavigator - - - Enable Keyframes - Omogući ključne kadrove - - - - KeyframeView - - - Linear - Linearno - - - - Bezier - Bezier - - - - Hold - Drži - - - - LabelSlider - - - &Edit - - - - - &Reset to Default - - - - - - Set Value - Odredi vrijednost - - - - - New value: - Nova vrijednost: - - - - LoadDialog - - - Loading... - Učitavanje... - - - - Loading '%1'... - Učitavanje "%1"... - - - - Cancel - Prekini - - - - LoadThread - - - Version Mismatch - Verzije se ne poklapaju - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Ovaj projekat je bio spašen u drugačijoj verziji Olive-a i moguće je da nije u potpunosti kompatibilan sa ovom verzijom. Da li još uvijek želite probati učitati projekat? - - - - Invalid Clip Link - Nevažeća veza snimke - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Ovaj projekat sadrži nevažeću vezu snimke. Moguće je da je koruptiran. Da li biste htjeli da ga nastavite učitavati? - - - - %1 - Line: %2 Col: %3 - %1 - Red: %2 Kolona: %3 - - - - User aborted loading - Korisnik je prekinuo učitavanje - - - - XML Parsing Error - Greška u parsiranju XML-a - - - - Couldn't load '%1'. %2 - "%1": %2 se nije moglo učitati - - - - Project Load Error - Greška pri učitavanju projekta - - - - Error loading project: %1 - Greška pri učitavanju projekta: %1 - - - - MainWindow - - - Welcome to %1 - Dobrodišli u %1 - - - Auto-recovery - Automatski oporavak - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive se nije pravilno zatvorio i datoteka za automatsko obnavljanje je primjećena. Da li želite da ju otvorite? - - - - &File - - - - - &New - - - - - &Open Project - - - - - Clear Recent List - - - - - Open Recent - - - - - &Save Project - - - - - Save Project &As - - - - - &Import... - - - - - &Export... - - - - - E&xit - - - - - &Edit - - - - - &Undo - - - - - Redo - - - - Cu&t - &Reži - - - &Paste - &Zalijepi - - - - Select &All - - - - - Deselect All - - - - - Ripple to In Point - - - - - Ripple to Out Point - - - - - Edit to In Point - - - - - Edit to Out Point - - - - - Delete In/Out Point - - - - - Ripple Delete In/Out Point - - - - - Set/Edit Marker - - - - - &View - - - - - Zoom In - - - - - Zoom Out - - - - - Increase Track Height - - - - - Decrease Track Height - - - - - Toggle Show All - - - - - Track Lines - - - - - Rectified Waveforms - - - - - Frames - - - - - Drop Frame - - - - - Non-Drop Frame - - - - - Milliseconds - - - - - Title/Action Safe Area - - - - - Off - - - - - Default - - - - - 4:3 - - - - - 16:9 - - - - - Custom - - - - - Full Screen - - - - - Full Screen Viewer - - - - - &Playback - - - - - Go to Start - - - - - Previous Frame - - - - - Play/Pause - - - - - Play In to Out - - - - - Next Frame - - - - - Go to End - - - - - Go to Previous Cut - - - - - Go to Next Cut - - - - - Go to In Point - - - - - Go to Out Point - - - - - Shuttle Left - - - - - Shuttle Stop - - - - - Shuttle Right - - - - - Loop - - - - - &Window - - - - - Project - - - - - Effect Controls - - - - - Timeline - - - - - Graph Editor - Uređivač grafikona - - - - Media Viewer - - - - - Sequence Viewer - - - - - Maximize Panel - - - - - Lock Panels - - - - - Reset to Default Layout - - - - - &Tools - - - - - Pointer Tool - - - - - Edit Tool - - - - - Ripple Tool - - - - - Razor Tool - - - - - Slip Tool - - - - - Slide Tool - - - - - Hand Tool - - - - - Transition Tool - - - - - Enable Snapping - - - - - Auto-Cut Silence - - - - - No Auto-Scroll - - - - - Page Auto-Scroll - - - - - Smooth Auto-Scroll - - - - - Preferences - - - - - Clear Undo - - - - - &Help - - - - - A&ction Search - - - - - Debug Log - Zapis za debugiranje - - - - &About... - - - - - <untitled> - <neimenovano> - - - - Marker - - - Set Marker +%1 - - Set clip marker name: + + Error saving settings - - Set sequence marker name: + + Failed to save application settings. The application may lack write permissions to this location. - Media + Footage - - New Folder + + %1 FPS - - Name: + + %1 Hz - - Filename: + + Filename: %1 - - Video Dimensions: - - - - - Frame Rate: - Okvirna stopa: - - - - %1 field(s) (%2 frame(s)) - - - - - Interlacing: - - - - - Audio Frequency: - - - - - Audio Channels: - - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - - - - - Name - - - - - Duration - - - - - Rate + + This footage is not valid for use - MediaPropertiesDialog + ImportTool - - "%1" Properties + + Don't ask me again - - Tracks: + + No Active Sequence - - Video %1: %2x%3 %4FPS + + No sequence is currently open. Would you like to create one? - - Audio %1: %2Hz %3 - - - - - %n channel(s) - - - - - - - - - Conform to Frame Rate: + + Automatically Detect Parameters From Footage - - Alpha is Premultiplied - - - - - Auto (%1) - - - - - Interlacing: - - - - - Name: + + Set Parameters Manually - MenuHelper + MoveItemCommand - - &Project - - - - - &Sequence - - - - - &Folder - - - - - Set In Point - - - - - Set Out Point - - - - - Reset In Point - - - - - Reset Out Point - - - - - Clear In/Out Point - - - - - Add Default Transition - - - - - Link/Unlink - - - - - Enable/Disable - - - - - Nest - - - - - Cu&t - &Reži - - - - Cop&y - - - - - - &Paste - &Zalijepi - - - - Paste Insert - - - - - Duplicate - - - - - Delete - - - - - Ripple Delete - - - - - Split - - - - - Invalid aspect ratio - - - - - The aspect ratio '%1' is invalid. Please try again. - - - - - Enter custom aspect ratio - - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + Move Item - NewSequenceDialog + NodeCopyPasteWidget - - Editing "%1" + + Error pasting nodes - - New Sequence - - - - - Preset: - - - - - Film 4K - - - - - TV 4K (Ultra HD/2160p) - - - - - 1080p - - - - - 720p - - - - - 480p - - - - - 360p - - - - - 240p - - - - - 144p - - - - - NTSC (480i) - - - - - PAL (576i) - - - - - Custom - - - - - Video - Video - - - - Width: - Širina: - - - - Height: - Visina: - - - - Frame Rate: - Okvirna stopa: - - - - Pixel Aspect Ratio: - - - - - Square Pixels (1.0) - - - - - Interlacing: - - - - - None (Progressive) - Nema (progresivno) - - - - Audio - Audio - - - - Sample Rate: - - - - - Name: + + Failed to paste nodes: %1 - OliveGlobal + NodeFactory - - Olive Project %1 - - - - - Auto-recovery - Automatski oporavak - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive se nije pravilno zatvorio i datoteka za automatsko obnavljanje je primjećena. Da li želite da ju otvorite? - - - - Open Project... - - - - - Missing recent project - - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - - - - - Save Project As... - - - - - Unsaved Project - - - - - This project has changed since it was last saved. Would you like to save it before closing? - - - - - No active sequence - - - - - Please open the sequence to perform this action. - - - - - No clips selected - - - - - Select the clips you wish to auto-cut - - - - - Missing Project File - - - - - Specified project '%1' does not exist. + + None - PanEffect + NodeViewItem - - Pan + + %1... - PreferencesDialog + PresetManager - - Preferences + + Save Preset - - Default Sequence + + Set preset name: - - Invalid CSS File + + Invalid preset name - - CSS file '%1' does not exist. + + You must enter a preset name - - Confirm Reset All Shortcuts + + Preset exists - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - - - - - Import Keyboard Shortcuts - - - - - - Error saving shortcuts - - - - - Failed to open file for reading - - - - - Export Keyboard Shortcuts - - - - - Export Shortcuts - - - - - Shortcuts exported successfully - - - - - Failed to open file for writing - - - - - Browse for CSS file - - - - - Delete All Previews - - - - - Are you sure you want to delete all previews? - - - - - Previews Deleted - - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - - - - - Language: - - - - - Default Sequence Settings - - - - - Add Default Effects to New Clips - - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - - - - - Selecting Also Seeks - - - - - Edit Tool Also Seeks - - - - - Edit Tool Selects Links - - - - - Seek Also Selects - - - - - Seek to the End of Pastes - - - - - Scroll Wheel Zooms - - - - - Hold CTRL to toggle this setting - - - - - Invert Timeline Scroll Axes - - - - - Enable Drag Files to Timeline - - - - - Auto-Scale By Default - - - - - Auto-Seek to Imported Clips - - - - - Audio Scrubbing - - - - - Drop Files on Media to Replace - - - - - Enable Hover Focus - - - - - Ask For Name When Setting Marker - - - - - Appearance - - - - - Theme - - - - - Olive Dark (Default) - - - - - Olive Light - - - - - Native - - - - - Native (Light Icons) - - - - - Use Native Menu Styling - - - - - Custom CSS: - - - - - Browse - - - - - Image sequence formats: - - - - - Audio Recording: - - - - - Mono - Mono - - - - Stereo - Stereo - - - - Effect Textbox Lines: - - - - - Thumbnail Resolution: - - - - - Waveform Resolution: - - - - - Delete Previews - - - - - Use Software Fallbacks When Possible - - - - - General - - - - - Behavior - - - - - Memory Usage - - - - - Upcoming Frame Queue: - - - - - - frames - - - - - - seconds - - - - - Previous Frame Queue: - - - - - Playback - - - - - Output Device: - - - - - - Default - - - - - Input Device: - - - - - Sample Rate: - - - - - Audio - Audio - - - - Search for action or shortcut - - - - - Action - - - - - Shortcut - - - - - Import - - - - - Export - - - - - Reset Selected - - - - - Reset All - - - - - Keyboard + + A preset with this name already exists. Would you like to replace it? - PreviewGenerator + RatioDialog - - Failed to find any valid video/audio streams + + Enter custom ratio (e.g. "4:3", "16/9", etc.): - - Could not open file - %1 + + Invalid custom ratio - - Could not find stream information - %1 + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. - Project + RenameItemCommand - - New - - - - - Open Project - - - - - Save Project - - - - - Undo - - - - - Redo - - - - - Tree View - - - - - Icon View - - - - - List View - - - - - Search media, markers, etc. - - - - - Project - - - - - Sequence - - - - - Replace '%1' - - - - - - All Files - - - - - - No active sequence - - - - - No sequence is active, please open the sequence you want to replace clips from. - - - - - Active sequence selected - - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - - - - - Rename '%1' - - - - - Enter new name: - - - - - Delete media in use? - - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - - - - - Skip - - - - - Import a Project - - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - - - - - Image sequence detected - - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - - - - - Import media... - - - - - No sequence is active, please open the sequence you want to delete clips from. - - - - - ProxyDialog - - - Create Proxy - - - - - Proxy - - - - - Dimensions: - - - - - Same Size as Source - - - - - Half Resolution (1/2) - - - - - Quarter Resolution (1/4) - - - - - Eighth Resolution (1/8) - - - - - Sixteenth Resolution (1/16) - - - - - Format: - Format: - - - - ProRes HQ - - - - - Location: - - - - - Same as Source (in "%1" folder) - - - - - Proxy file exists - - - - - The file "%1" already exists. Do you wish to replace it? - - - - - Custom Location - - - - - ProxyGenerator - - - Finished generating proxy for "%1" - - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - - - - - Select which media you want to replace this media's clips with: - - - - - Keep the same media in-points - - - - - Replace - - - - - Cancel - Prekini - - - - No media selected - - - - - Please select a media to replace with or click 'Cancel'. - - - - - Same media selected - - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - - - - - Folder selected - - - - - You cannot replace footage with a folder. - - - - - Active sequence selected - - - - - You cannot insert a sequence into itself. - - - - - RichTextEffect - - - Text - - - - - Padding - - - - - Position - - - - - Vertical Align: - - - - - Top - - - - - Center - - - - - Bottom - - - - - Auto-Scroll - - - - - Off - - - - - Up - - - - - Down - - - - - Left - - - - - Right - - - - - Shadow - - - - - Shadow Color - - - - - Shadow Angle - - - - - Shadow Distance - - - - - Shadow Softness - - - - - Shadow Opacity + + Rename Item Sequence - - %1 (copy) + + %1 FPS - ShakeEffect + Stream - - Intensity + + %1: Audio - %2 Channels, %3Hz - - Rotation + + %1: Unknown - - Frequency + + %1: Image - %2x%3 + + + + + %1: Video - %2x%3 - SolidEffect + TimelineViewBlockItem - - Type - Tip - - - - Solid Color - - - - - SMPTE Bars - - - - - Checkerboard - - - - - Opacity - - - - - Color - - - - - Checkerboard Size - - - - - SourcesCommon - - - Import... - - - - - New - - - - - View - - - - - Tree View - - - - - Icon View - - - - - Show Toolbar - - - - - Show Sequences - - - - - Replace/Relink Media - - - - - Reveal in Explorer - - - - - Reveal in Finder - - - - - Reveal in File Manager - - - - - Replace Clips Using This Media - - - - - Create Sequence With This Media - - - - - Duplicate - - - - - Delete All Clips Using This Media - - - - - Proxy - - - - - Generating proxy: %1% complete - - - - - Create/Modify Proxy - - - - - Create Proxy - - - - - Modify Proxy - - - - - Restore Original - - - - - Delete - - - - - Preview in Media Viewer - - - - - Properties... - - - - - Replace Media - - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - - - - - Delete proxy - - - - - Would you like to delete the proxy file "%1" as well? - - - - - SpeedDialog - - - Speed/Duration - - - - - Speed: - - - - - Frame Rate: - Okvirna stopa: - - - - Duration: - - - - - Reverse - - - - - Maintain Audio Pitch - - - - - Ripple Changes - - - - - TextEditDialog - - - Edit Text - - - - - Thin - - - - - Extra Light - - - - - Light - - - - - Normal - - - - - Medium - - - - - Demi Bold - - - - - Bold - - - - - Extra Bold - - - - - Black - - - - - TextEditEx - - - Edit Text - - - - - &Edit Text - - - - - TextEffect - - - Text - - - - - Font - - - - - Size - - - - - Color - - - - - Alignment - - - - - Left - - - - - - Center - - - - - Right - - - - - Justify - - - - - Top - - - - - Bottom - - - - - Word Wrap - - - - - Padding - - - - - Position - - - - - Outline - - - - - Outline Color - - - - - Outline Width - - - - - Shadow - - - - - Shadow Color - - - - - Shadow Angle - - - - - Shadow Distance - - - - - Shadow Softness - - - - - Shadow Opacity - - - - - Sample Text - - - - - TimecodeEffect - - - Timecode - - - - - Sequence - - - - - Media - - - - - Scale - - - - - Color - - - - - Background Color - - - - - Background Opacity - - - - - Offset - - - - - Prepend - - - - - Timeline - - - Nested Sequence - - - - - Timeline: - - - - - Effect already exists - - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - - - - - Add - - - - - Replace - - - - - Skip - - - - - Do this for all conflicts found - - - - - Title... - - - - - Solid Color... - - - - - Bars... - - - - - Tone... - - - - - Noise... - - - - - Unsaved Project - - - - - You must save this project before you can record audio in it. - - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - - - - - (none) - (nema) - - - - Pointer Tool - - - - - Edit Tool - - - - - Ripple Tool - - - - - Razor Tool - - - - - Slip Tool - - - - - Slide Tool - - - - - Hand Tool - - - - - Transition Tool - - - - - Snapping - - - - - Zoom In - - - - - Zoom Out - - - - - Record audio - - - - - Add title, solid, bars, etc. - - - - - TimelineHeader - - - Center Timecodes - - - - - TimelineWidget - - - &Undo - - - - - &Redo - - - - &Paste - &Zalijepi - - - - Sequence Settings - - - - - &Speed/Duration - - - - - &Reveal in Project - - - - + %1 -Start: %2 -End: %3 -Duration: %4 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty - - R&ipple Delete Empty Space - - - - - Auto-Cut Silence - - - - - Auto-S&cale - - - - - Properties - - - - - Error - - - - - Couldn't locate media wrapper for sequence. - - - - - Title - - - - - Solid Color - - - - + Bars - + + Solid + + + + + Title + + + + Tone - - Noise - - - - - Duration: + + Unknown - ToneEffect + VideoParams - - Type - Tip - - - - Sine + + 8-bit - - Frequency + + 16-bit Integer - - Amount - Količina - - - - Mix - Miks - - - - TransformEffect - - - Position + + Half-Float (16-bit) - - Scale + + Full-Float (32-bit) - - Uniform Scale + + Unknown (0x%1) - - Rotation + + %1 FPS - - Anchor Point + + Square Pixels (%1) - - Opacity + + NTSC Standard (%1) - - Blend Mode + + NTSC Widescreen (%1) - - Normal + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) - Transition + main - + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + qm-file + + + + + Project to open on startup + + + + + olive::AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive je nelinearni video uređivač. Ovaj software je slobodan i zaštićen GNU GPL-om. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive tim je pod obavezom da obavijesti svoje korisnike da je Olive-ov izvorni kod dostupan za preuzimanje sa njegove web stranice + + + + olive::ActionSearch + + + Search for action... + Potražite radnju... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Audio + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + Length - - - UpdateNotification - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + + Media In + + + + + Enabled + + + + + Speed - VSTHost + olive::BlurFilterNode - - - Error loading VST plugin + + Blur - - Failed to load VST plugin "%1": %2 + + Blurs an image. - - Failed to locate entry point for dynamic library. + + Input - - VST Error + + Method - - Plugin's magic number is invalid + + Box - - Plugin + + Gaussian - - Interface + + Radius - - Show + + Horizontal - - VST Plugin + + Vertical + + + + + Repeat Edge Pixels - Viewer + olive::ClipBlock - - Sequence Viewer + + Clip - - Media Viewer + + A time-based node that represents a media source. - - (none) - (nema) - - - - Drag video only - - - - - Drag audio only + + Buffer - ViewerWidget + olive::ColorDialog - - Save Frame as Image... + + Select Color + + + + + olive::ColorSpaceChooser + + + Color Management - - Show Fullscreen + + Input: - - Disable + + Color Space: - - Screen %1: %2x%3 + + Display: - - Zoom + + View: - + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + + + + + + Error + + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Linearno + + + + Bezier + Bezier + + + + Hold + Drži + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Napredno + + + + Pixel + + + + + Pixel Format: + Format piksela: + + + + Performance + + + + + Threads: + + + + + olive::ExportAudioTab + + + Codec: + Kodek: + + + + Sample Rate: + + + + + Channel Layout: + + + + + Format: + Format: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + + + + + Browse for exported file filename + + + + + Preset: + + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Raspon: + + + + Entire Sequence + Čitava sekvenca + + + + In to Out + Od početka do kraja + + + + Format: + Format: + + + + Export Video + + + + + Export Audio + + + + + Video + Video + + + + Audio + Audio + + + + + Export + + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Širina: + + + + Height: + Visina: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + Fit - - Custom + + Stretch - - Close Media + + Crop - - Save Frame + + Frame Rate: + Okvirna stopa: + + + + Pixel Aspect Ratio: - - Viewer Zoom + + Interlacing: - - Set Custom Zoom Value: + + Quality: + + + + + Codec + + + + + Codec: + Kodek: + + + + Advanced + Napredno + + + + olive::FloatSlider + + + %1 dB + + + + + %1% - ViewerWindow + olive::FootagePropertiesDialog - - Exit Fullscreen + + "%1" Properties + + + + + Name: + + + + + Tracks: - VoidEffect + olive::FootageRelinkDialog - + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Željena veličina datoteke (MB): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Nema (progresivno) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Linearno + + + + Hold + Drži + + + + Bezier + Bezier + + + + olive::KeyframeViewBase + + + Linear + Linearno + + + + Bezier + Bezier + + + + Hold + Drži + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + + + + + Save Project &As + + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + + + + + &Edit + + + + + Insert + + + + + Overwrite + + + + + Select &All + + + + + Deselect All + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Full Screen + + + + + Full Screen Viewer + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + + + Loop + + + + + &Sequence + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + + + + + Lock Panels + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Preferences + + + + + &Help + + + + + A&ction Search + + + + + Send &Feedback... + + + + + &About... + + + + + olive::MainStatusBar + + + Welcome to %1 %2 + Dobrodišli u %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + + + + + Rotation + + + + + Scale + + + + + Uniform Scale + + + + + Anchor Point + + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Cu&t + &Reži + + + + Cop&y + + + + + &Paste + &Zalijepi + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Set In Point + + + + + Set Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + + + + + Math + + + + + Color + + + + + Filter + + + + + Timeline + + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + + + + + Matrix + + + + + Text + + + + + Font + + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Tip + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + (unknown) + + + olive::NodeTreeView - - Missing Effect + + Nodes - VolumeEffect + olive::NodeView - + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + + + + + olive::PanNode + + + + Pan + + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (nema) + + + + (multiple) + + + + + olive::PathWidget + + + Browse + + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio Recording: + + + + + Mono + Mono + + + + Stereo + Stereo + + + + Refresh Devices + + + + + Please wait... + + + + + Default + + + + + olive::PreferencesBehaviorTab + + + Behavior + + + + + General + + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Audio + + + + Enable audio scrubbing + + + + + Timeline + + + + + Auto-Seek to Imported Clips + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Enable Drag Files to Timeline + + + + + Invert Timeline Scroll Axes + + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Selecting Also Seeks + + + + + Playback + + + + + Ask For Name When Setting Marker + + + + + Automatically rewind at the end of a sequence + + + + + Project + + + + + Drop Files on Media to Replace + + + + + Nodes + + + + + Add Default Effects to New Clips + + + + + Auto-Scale By Default + + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + + + + + General + + + + + Appearance + + + + + Behavior + + + + + Disk + + + + + Audio + Audio + + + + Keyboard + + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + olive::ProgressDialog + + + Cancel + Prekini + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + + + + + &Import... + + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + + + + + (none) + (nema) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + + + + + Save Project + + + + + Undo + + + + + Redo + + + + + Search media, markers, etc. + + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + + + + + Duration + + + + + Rate + + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + + + + + New Sequence + + + + + Editing "%1" + + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Video + + + + Width: + Širina: + + + + Height: + Visina: + + + + Frame Rate: + Okvirna stopa: + + + + Pixel Aspect Ratio: + + + + + Interlacing: + + + + + Audio + Audio + + + + Sample Rate: + + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + + + + + 720p + + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + + + + + olive::StringSlider + + + (none) + (nema) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + + + + + Radius + + + + + Opacity + + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + + + + + + Text + + + + + Generate rich text. + + + + + Font + + + + + Font Size + + + + + Color + + + + + Vertical Align + + + + + Top + + + + + Center + + + + + Bottom + + + + + olive::TimeBasedPanel + + + (none) + (nema) + + + + olive::TimeBasedWidget + + + Set Marker + + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + + + + + olive::TimelineWidget + + + + Properties + + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Linearno + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + + + + + olive::VideoInput + + + Video Input + + + + + Video + Video + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + Okvirna stopa: + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + + + + + Fit + + + + + %1% + + + + + Full Screen + + + + + Screen %1: %2x%3 + + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + Volume - - - transition - - Invalid transition + + Adjusts the volume of an audio source. - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + Samples diff --git a/app/ts/cs_CS.ts b/app/ts/cs_CS.ts index ab43bae78..92a3b007a 100644 --- a/app/ts/cs_CS.ts +++ b/app/ts/cs_CS.ts @@ -2,3840 +2,3889 @@ - AboutDialog + AudioParams - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive je nelineární editor obrazového záznamu. Tento program je zdarma a chráněn GNU GPL. + %1 Hz + - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Družstvo Olive se dává na vědomí, že zdrojové kódy Olive jsou dostupné pro stažení na internetové stránce projektu. - - - - ActionSearch - - Search for action... - Hledat činnost... - - - - AdvancedVideoDialog - - Advanced Video Settings - Pokročilá nastavení obrazu - - - Pixel Format: - Formát pixelu: - - - Threads: - Vlákna: - - - - Audio - - %1 Audio - %1 Zvuk - - - Recording %1 - Nahrávání %1 - - - - AudioNoiseEffect - - Mix - Smíchat - - - Amount - Množství - - - Noise - Šum - - - Generate audio noise that can be mixed with this clip. - Vytvořit zvukový šum, který může být smíchán s tímto záběrem. - - - - AutoCutSilenceDialog - - Cut Silence - Ořezat ticho - - - Attack Threshold: - Práh náběhu: - - - Attack Time: - Čas náběhu: - - - Release Threshold: - Práh uvolnění: - - - Release Time: - Čas uvolnění: - - - - Cacher - - Could not open %1 - %2 - Nepodařilo se otevřít %1 - %2 - - - - ChannelLayoutName Mono - Mono - - - Invalid - Neplatný + Mono Stereo - Stereo + Stereo + + + 2.1 + 1080p {2.1?} + + + 5.1 + 1080p {5.1?} + + + 7.1 + 1080p {7.1?} + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - "%1" Properties - "%1" Vlastnosti + Error loading settings + - Multiple Clip Properties - Vlastnosti více záběrů - - - Name: - Název: - - - Duration: - Doba trvání: - - - (multiple) - (více) - - - - CollapsibleWidget - - <untitled> - - - - - ColorButton - - Set Color - Nastavit barvu - - - - CornerPinEffect - - Top Right - Nahoře vpravo - - - Bottom Left - Dole vlevo - - - Top Left - Nahoře vlevo - - - Perspective - Perspektiva - - - Bottom Right - Dole vpravo - - - Corner Pin - Rohový špendlík - - - Distort - Zprohýbat - - - Distort/warp this clip by pinning each of its four corners. - Pokřivit/Zkroutit tento záběr přišpendlením každého z jeho čtyř rohů. - - - - CrashDialog - - We're very sorry, Olive has crashed. Please send the following data to developers: - Je nám to velice líto. Olive spadl. Následující údaje, prosím, zašlete vývojářům: - - - - CrossDissolveTransition - - Cross Dissolve - Prolínat obraz křížem - - - Dissolves - Prolínání obrazu - - - Dissolve clips evenly. - Prolínat záběry rovnoměrně. - - - - DebugDialog - - Debug Log - Zápis ladění - - - - DemoNotice - - Welcome to Olive! - Vítejte v Olive! - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Tento program je v současnosti v Alfa verzi, což znamená, že je nestálý a velice pravděpodobně náchylný k pádům, má chyby a chybí mu funkce. Není poskytována žádná záruka, takže jej používejte na vlastní nebezpečí. Hlašte, prosím, jakékoli chyby nebo žádosti o funkce na %1 - - - Thank you for trying Olive and we hope you enjoy it! - Děkujeme vám za zkoušení Olive. Přejeme si, aby vám dělal radost! - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive je editor obrazového záznamu s otevřeným zdrojovým kódem vydaný pod GNU GPL. - - - - Effect - - Cu&t - Vyjmou&t - - - &Copy - &Kopírovat - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - Žádný uchazeč pro efekt '%1'. Tento přechod může být poškozen. Pokuste se jej nebo Olive znovu nainstalovat. - - - Invalid effect - Neplatný efekt - - - Load Settings From File - Nahrát nastavení ze souboru - - - Load Effect Settings - Nahrát nastavení efektu - - - Move &Up - Posunout &nahoru - - - D&elete - S&mazat - - - Move &Down - Posunout &dolů - - - Save Settings Failed - Nastavení se nepodařilo uložit - - - Save Effect Settings - Uložit nastavení efektu - - - Load Settings Failed - Nastavení se nepodařilo nahrát - - - This settings file doesn't match this effect. - Tento soubor s nastavením neodpovídá tomuto efektu. - - - Effect XML Settings %1 - Nastavení XML efektu %1 - - - Failed to open "%1" for reading. - Nepodařilo se otevřít "%1" pro čtení. - - - Save Settings to File - Uložit nastavení do souboru - - - Failed to open "%1" for writing. - Nepodařilo se otevřít "%1" pro zápis. - - - - EffectControls - - Add Audio Effect - Přidat zvukový efekt - - - Add Video Effect - Přidat obrazový efekt - - - &Paste - &Vložit - - - (none) - (žádný) - - - VIDEO EFFECTS - OBRAZOVÉ EFEKTY - - - Add Audio Transition - Přidat zvukový přechod - - - Add Video Transition - Přidat obrazový přechod - - - Effects: - Efekty: - - - (Multiple clips selected) - (vybráno více záběrů) - - - AUDIO EFFECTS - ZVUKOVÉ EFEKTY - - - - EffectRow - - Disable Keyframes - Zakázat klíčové snímky - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Zákázání klíčových snímků smaže všechny nynější klíčové snímky. Opravdu to chcete udělat? - - - - EffectUI - - %1 (Opening) - %1 (otevření) - - - %1 (Closing) - %1 (zavření) - - - %1 (multiple) - %1 (více) - - - Cu&t - Vyjmou&t - - - &Copy - &Kopírovat - - - Move &Up - Posunout &nahoru - - - Move &Down - Posunout &dolů - - - D&elete - S&mazat - - - Load Settings From File - Nahrát nastavení ze souboru - - - Save Settings to File - Uložit nastavení do souboru - - - - EmbeddedFileChooser - - File: - Soubor: - - - - ExponentialFadeTransition - - Exponential Fade - Exponenciální prolínání - - - An exponential audio fade that starts slow and ends fast. - Exponenciální prolínání zvuku, které začíná pomalu a končí rychle. - - - - ExportDialog - - Audio - Zvuk - - - Video - Obraz - - - Sampling Rate: - Rychlost vzorkování: - - - Invalid dimensions - Neplatné rozměry - - - Export Media - Vyvést záznam - - - Invalid format - Neplatný formát - - - Quality Factor: + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Faktor kvality: - -0 = bezztrátová -17-18 = beze ztrát na obraze (komprimace, ale nepozorovatelná) -23 = vysoká jakost -51 = nejnižší možná jakost +%1 + - Constant Bitrate - Stálý datový tok + Error saving settings + - Codec: - Kodek: - - - Couldn't determine output format. This is a bug, please contact the developers. - Nepodařilo se určit výstupní formát. Toto je chyba. Spojte se, prosím, s vývojáři. - - - Range: - Rozsah: - - - Width: - Šířka: - - - Invalid Codec - Neplatný kodek - - - Invalid codec - Neplatný kodek - - - Frame Rate: - Snímkování: - - - Entire Sequence - Celý úryvek (sled záběrů) - - - In to Out - Vstup do výstupu - - - Export Failed - Nepodařilo se vyvést - - - Unknown codec name %1 - Neznámý název kodeku %1 - - - Target File Size (MB): - Velikost cílového souboru (MB): - - - Bitrate (Mbps): - Datový tok (MB/s): - - - Compression Type: - Typ komprese: - - - Export "%1" - Vyvést "%1" - - - Export width and height must both be even numbers/divisible by 2. - Šířka a výška pro vyvedení musí být sudá čísla dělitelná 2. - - - Quality (CRF): - Kvalita (CRF): - - - Quality-based (Constant Rate Factor) - Kvalita (Constant Rate Factor) - - - Export failed - %1 - Nepodařilo se vyvést - %1 - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Nepodařilo se určit výstupní parametry pro vybraný kodek. Toto je chyba. Spojte se, prosím, s vývojáři. - - - Advanced - Pokročilé - - - Bitrate (Kbps/CBR): - Datový tok (KB/s/stálý datový tok): - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Nepodařilo se najít vhodný kodér pro tento kodek. Vyvedení pravděpodobně selže. - - - Failed to find pixel format for this encoder. Export will likely fail. - Nepodařilo se najít formát pixelu pro tento kodér. Vyvedení pravděpodobně selže. - - - Format: - Formát: - - - Height: - Výška: - - - %p% (Total: %1:%2:%3) - %p% (Celkem: %1:%2:%3) - - - %p% (ETA: %1:%2:%3) - %p% (odhadovaný čas dokončení: %1:%2:%3) + Failed to save application settings. The application may lack write permissions to this location. + - ExportThread + Footage - could not create output format context - Nepodařilo se vytvořit kontext výstupního formátu + %1 FPS + - could not open output file (%1) - Nepodařilo se otevřít výstupní soubor (%1) + %1 Hz + - failed to receive packet from encoder (%1) - Chyba při přijetí paketu od kodéru (%1) + Filename: %1 + - could not copy audio encoder parameters to output stream (%1) - Nepodařilo se kopírovat parametry kodéru zvuku do výstupního proudu (%1) - - - could not allocate audio encoding context - Nepodařilo se přiřadit kontext kódování zvuku - - - could not copy video encoder parameters to output stream (%1) - Nepodařilo se kopírovat parametry kodéru obrazu do výstupního proudu (%1) - - - failed to send frame to encoder (%1) - Chyba při poslání snímku kodéru (%1) - - - could not open output audio encoder (%1) - Nepodařilo se otevřít kodér zvuku (%1) - - - could not write output file trailer (%1) - Nepodařilo se zapsat ukázku výstupního souboru (%1) - - - could not audio encoder for %1 - Nepodařilo se najít kodér zvuku pro %1 - - - could not allocate video encoding context - Nepodařilo se přiřadit kontext kódování obrazu - - - could not write output file header (%1) - Nepodařilo se zapsat hlavičku výstupního souboru (%1) - - - could not video encoder for %1 - Nepodařilo se najít kodér obrazu pro %1 - - - could not allocate video stream - Nepodařilo se přiřadit datový proud obrazu - - - could not open output video encoder (%1) - Nepodařilo se otevřít kodér obrazu (%1) - - - could not allocate audio buffer (%1) - Nepodařilo se přiřadit vyrovnávací paměť zvuku (%1) - - - could not allocate audio stream - Nepodařilo se přiřadit datový proud zvuku + This footage is not valid for use + - FFmpegDecoder + ImportTool - Failed to find appropriate decoder for this codec (%1 :: %2) - Nepodařilo se najít vhodný dekodér pro tento kodek (%1 :: %2) + Don't ask me again + - Failed to allocate codec context (%1 :: %2) - Nepodařilo se přiřadit kontext kódeku (%1 :: %2) + No Active Sequence + - Error decoding %1 - %2 %3 - Chyba při dekódování %1 - %2 %3 + No sequence is currently open. Would you like to create one? + + + + Automatically Detect Parameters From Footage + + + + Set Parameters Manually + - FillLeftRightEffect + MoveItemCommand - Type - Typ - - - Fill Left with Right - Vyplnit levý pravým - - - Fill Right with Left - Vyplnit pravý levým - - - Fill Left/Right - Vyplnit levý/pravý - - - Replaces either the left or right channel with the other - Nahradí buď levý nebo pravý kanál druhým + Move Item + - Frei0rEffect + NodeCopyPasteWidget - Failed to load Frei0r plugin "%1": %2 - Nepodařilo se nahrát přídavný modul Frei0r "%1": %2 + Error pasting nodes + - Error loading Frei0r plugin - Chyba při nahrávání přídavného modulu Frei0r - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - Poznámka: Nemůžete nahrát 64 bitové přídavné moduly Frei0r do 32 bitového sestavení Olive. Najděte, prosím, 32 bitovou verzi tohoto přídavného modulu nebo přepněte na 64 bitové sestavení Olive. - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - Poznámka: Nemůžete nahrát 32 bitové přídavné moduly Frei0r do 64 bitového sestavení Olive. Najděte, prosím, 64 bitovou verzi tohoto přídavného modulu nebo přepněte na 32 bitové sestavení Olive. + Failed to paste nodes: %1 + - GraphEditor + NodeFactory - Hold - Držet - - - Graph Editor - Editor grafu - - - Bezier - Bézier - - - Linear - Lineární + None + - GraphView + NodeViewItem - Zoom to Show All - Přiblížit pro ukázání všeho - - - Zoom to Selection - Přiblížit na výběr - - - Reset View - Obnovit výchozí zvětšení + %1... + - InterlacingName + PresetManager - Invalid - Neplatný + Save Preset + - Top Field First - Nejprve horní pole + Set preset name: + - None (Progressive) - Žádný (progresivní) + Invalid preset name + - Bottom Field First - Nejprve dolní pole + You must enter a preset name + - Upper Field First - Nejprve horní pole + Preset exists + - Lower Field First - Nejprve dolní pole + A preset with this name already exists. Would you like to replace it? + - KeyframeNavigator + RatioDialog - Enable Keyframes - Povolit klíčové snímky + Enter custom ratio (e.g. "4:3", "16/9", etc.): + + + + Invalid custom ratio + + + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - KeyframeView + RenameItemCommand - Hold - Držet - - - Bezier - Bézier - - - Linear - Lineární - - - - LabelSlider - - Set Value - Nastavit hodnotu - - - New value: - Nová hodnota: - - - &Edit - Úp&ravy - - - &Reset to Default - &Obnovit výchozí - - - - LinearFadeTransition - - Linear Fade - Lineární prolínání - - - An linear audio fade that fades evenly at a constant rate. - Lineární prolínání zvuku, které rovnoměrně při stálé rychlosti. - - - - LoadDialog - - Cancel - Zrušit - - - Loading... - Nahrává se... - - - Loading '%1'... - Nahrává se '%1'... - - - - LoadThread - - Invalid Clip Link - Neplatný odkaz na záběr - - - %1 - Line: %2 Col: %3 - %1 - Řádek: %2 Sloupec: %3 - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Tento projekt obsahuje neplatný odkaz na záběr. Tento může být poškozen. Chcete pokračovat v jeho nahrávání? - - - Project Load Error - Chyba při nahrávání projektu - - - Couldn't load '%1'. %2 - Nepodařilo se nahrát '%1'. %2 - - - Version Mismatch - Rozdílná verze - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Tento projekt byl uložen v jiné verzi Olive a nemusí být plně slučitelný s touto verzí. Přesto se jej chcete pokusit nahrát? - - - Error loading project: %1 - Chyba při nahrávání projektu: %1 - - - User aborted loading - Uživatelem přerušené nahrávání - - - XML Parsing Error - Chyba při zpracování XML - - - - LogarithmicFadeTransition - - Logarithmic Fade - Logaritmické prolínání - - - An logarithmic audio fade that starts fast and ends slow. - Logaritmické prolínání zvuku, které začíná rychle a končí pomalu. - - - - MainWindow - - 4:3 - 4:3 - - - Off - Vypnuto - - - &New - &Nový - - - 16:9 - 16:9 - - - Loop - Smyčka - - - Redo - Znovu - - - Slip Tool - Roztočení se ztotožněním - - - &Edit - Úp&ravy - - - &File - &Soubor - - - &Help - Nápo&věda - - - &Undo - &Zpět - - - &View - &Pohled - - - Timeline - Časová osa - - - E&xit - &Ukončit - - - Graph Editor - Editor grafu - - - Edit Tool - Nástroj pro úpravy - - - Media Viewer - Prohlížeč záznamu - - - Go to Start - Jít na začátek - - - Go to In Point - Jít na bod začátku - - - Zoom In - Přiblížit - - - Clear Recent List - Vyprázdnit seznam naposledy otevřených souborů - - - Edit to Out Point - Upravit po bod konce - - - Go to Out Point - Jít na bod konce - - - Seek to the End of Pastes - Vyhledávat po konec vložení - - - Ripple Tool - Vložení a posunutí - - - Enable Drag Files to Timeline - Povolit tažení souborů na časovou osu - - - Drop Frame - Zahodit snímek - - - &Playback - &Přehrávání - - - Title/Action Safe Area - Bezpečná oblast - - - Audio Scrubbing - Přehrávání zvuku při tažení ukazatele - - - &Tools - &Nástroje - - - Ripple to In Point - Vložit a posunout k bodu začátku - - - Enable Snapping - Povolit přichytávání - - - No Auto-Scroll - Žádné automatické projíždění - - - Auto-Scale By Default - Automaticky měnit velikost - - - Set/Edit Marker - Nastavit/Upravit značku - - - Non-Drop Frame - Nezahodit snímek - - - Hand Tool - Ručička - - - Toggle Show All - Přepnout ukázání všeho - - - Custom - Vlastní - - - Frames - Snímky - - - Lock Panels - Uzamknout panely - - - Play In to Out - Přehrát od začátku po konec - - - Scroll Wheel Zooms - Kolečko myši přibližuje - - - Page Auto-Scroll - Stránkové automatické projíždění - - - Full Screen - Celá obrazovka - - - Open Recent - Otevřít nedávné - - - Edit to In Point - Upravit po bod začátku - - - Razor Tool - Nástroj břitvy - - - Next Frame - Další snímek - - - Zoom Out - Oddálit - - - Go to Previous Cut - Jít na předchozí záběr - - - &Export... - &Vyvést... - - - &Import... - &Zavést... - - - Project - Projekt - - - Go to End - Jít na konec - - - Enable Hover Focus - Povolit zaměření při přejetí - - - Shuttle Stop - Zastavit pendlování - - - Shuttle Left - Jezdit tam a zpět vlevo - - - Delete In/Out Point - Smazat bod začátku/konce - - - Clear Undo - Vyprázdnit minulost kroků zpět - - - Ripple Delete In/Out Point - Vytáhnout bod začátku/konce - - - Full Screen Viewer - Prohlížeč na celou obrazovku - - - Ripple to Out Point - Vložit a posunout k bodu konce - - - Enable Seek to Import - Povolit vyhledávání k zavedení - - - Edit Tool Selects Links - Nástroj pro úpravy vybírá odkazy - - - A&ction Search - Hledání č&inností - - - Pointer Tool - Ukazovátko - - - &About... - &O programu... - - - Debug Log - Zápis ladění - - - Selecting Also Seeks - Výběr také vyhledává - - - Select &All - Vybrat &vše - - - Slide Tool - Roztočení - - - Welcome to %1 - Vítejte v %1 - - - Default - Výchozí - - - Reset to Default Layout - Obnovit výchozí rozvržení - - - Effect Controls - Ovládání efektů - - - Enable Drop on Media to Replace - Povolit upuštění na záznam pro nahrazení - - - <untitled> - <bez názvu> - - - Rectified Waveforms - Vlnový tvar odspodu - - - Decrease Track Height - Zmenšit výšku stopy - - - Increase Track Height - Zvětšit výšku stopy - - - &Window - &Okno - - - Ask For Name When Setting Marker - Požádat o název při nastavení značky - - - &Save Project - &Uložit projekt - - - Play/Pause - Přehrát/Pozastavit - - - Preferences - Nastavení - - - Save Project &As - Uložit projekt j&ako - - - &Open Project - &Otevřít projekt - - - Milliseconds - Milisekundy - - - Track Lines - Řádky stop - - - Sequence Viewer - Prohlížeč úryvku (sledu záběrů) - - - Smooth Auto-Scroll - Jemné automatické projíždění - - - Previous Frame - Předchozí snímek - - - Go to Next Cut - Jít na další záběr - - - Seek Also Selects - Vyhledávání také vybírá - - - Transition Tool - Přechod - - - Shuttle Right - Jezdit tam a zpět vpravo - - - Deselect All - Zrušit výběr všeho - - - Maximize Panel - Zvětšit panel - - - Edit Tool Also Seeks - Nástroj pro úpravy také vyhledává - - - Auto-Cut Silence - Ořezat ticho automaticky - - - OpenColorIO Config Error - Chyba nastavení OpenColorIO - - - Failed to set OpenColorIO configuration: %1 - Nepodařilo se nastavit nastavení OpenColorIO: %1 - - - Node Editor - Editor uzlu - - - - Marker - - Set Marker - Nastavit značku - - - Set clip marker name: - Nastavit název značky záběru: - - - Set sequence marker name: - Nastavit název značky úryvku (sledu záběrů): - - - - Media - - Name - Název - - - Rate - Rychlost - - - Name: - Název: - - - Filename: - Název souboru: - - - Video Dimensions: - Rozměry obrazu: - - - New Folder - Nová složka - - - Frame Rate: - Snímkování: - - - Interlacing: - Prokládání: - - - Audio Frequency: - Kmitočet zvuku: - - - %1 field(s) (%2 frame(s)) - %1 pole(í) (%2 snímek(y)) - - - Duration - Doba trvání - - - Audio Channels: - Zvukové kanály: - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Název: %1 -Rozměry obrazu: %2x%3 -Snímkování: %4 -Kmitočet zvuku: %5 -Rozložení zvuku: %6 - - - - MediaPropertiesDialog - - Name: - Název: - - - Video %1: %2x%3 %4FPS - Obraz %1: %2x%3 %4 FPS - - - Alpha is Premultiplied - Alfa je předznásobena - - - "%1" Properties - "%1" Vlastnosti - - - Interlacing: - Prokládání: - - - Audio %1: %2Hz %3 - Zvuk %1: %2Hz %3 - - - %n channel(s) - - %n kanál - %n kanály - %n kanálů - - - - Auto (%1) - Auto (%1) - - - Conform to Frame Rate: - Odpovídá snímkování: - - - Tracks: - Stopy: - - - Color Space: - Barevný prostor: - - - - MenuHelper - - Cu&t - Vyjmou&t - - - Nest - Vnořovat - - - The aspect ratio '%1' is invalid. Please try again. - Poměr stran '%1' je neplatný. Zkuste to, prosím, znovu. - - - Cop&y - &Kopírovat - - - Split - Rozdělit - - - Paste Insert - Vložit/Přidat - - - Add Default Transition - Přidat výchozí přechod - - - &Paste - &Vložit - - - Delete - Smazat - - - Link/Unlink - Spojit/Oddělit - - - Invalid aspect ratio - Neplatný poměr stran - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Zadejte poměr stran k použití pro bezpečnou oblast (např. 16:9): - - - Set In Point - Nastavit bod začátku - - - Clear In/Out Point - Vymazat bod začátku/konce - - - Enter custom aspect ratio - Zadat vlastní poměr stran - - - Duplicate - Zdvojit - - - &Project - &Projekt - - - &Folder - &Složka - - - &Sequence - Ú&ryvek - - - Reset In Point - Obnovit výchozí bod začátku - - - Ripple Delete - Vytáhnout - - - Enable/Disable - Povolit/Zakázat - - - Set Out Point - Nastavit bod konce - - - Reset Out Point - Obnovit výchozí bod konce - - - - NewSequenceDialog - - 144p - 144p - - - 240p - 240p - - - 360p - 360p - - - 480p - 480p - - - 720p - 720p - - - Editing "%1" - Upravení "%1" - - - 1080p - 1080p - - - Audio - Zvuk - - - Name: - Název: - - - Video - Obraz - - - TV 4K (Ultra HD/2160p) - TV 4K (Ultra HD/2160p) - - - PAL (576i) - PAL (576i) - - - NTSC (480i) - NTSC (480i) - - - None (Progressive) - Žádné (progresivní) - - - Custom - Vlastní - - - Width: - Šířka: - - - Frame Rate: - Snímkování: - - - Interlacing: - Prokládání: - - - Preset: - Přednastavení: - - - New Sequence - Nový úryvek (sled záběrů) - - - Pixel Aspect Ratio: - Poměr stran pixelu: - - - Square Pixels (1.0) - Čtvercové pixely (1.0) - - - Sample Rate: - Vzorkovací kmitočet: - - - Film 4K - Film 4K - - - Height: - Výška: - - - - Node - - Node - Uzel - - - - NodeBlock - - Previous - Předchozí - - - Next - Další - - - Block - Blok - - - - NodeEditor - - Node Editor - Editor uzlu - - - - NodeIO - - Disable Keyframes - Zakázat klíčové snímky - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Zákázání klíčových snímků smaže všechny nynější klíčové snímky. Opravdu to chcete udělat? - - - - NodeMedia - - Matrix - Matice - - - Texture - Povrch - - - Media - Záznam - - - - NodeTexturePassthru - - Texture - Povrch - - - Image Output - Výstup obrázku - - - - NodeVideoClip - - Texture - Povrch - - - - NodeView - - Node Editor - Editor uzlu - - - - OldEffectNode - - Save Effect Settings - Uložit nastavení efektu - - - Effect XML Settings %1 - Nastavení XML efektu %1 - - - Save Settings Failed - Nastavení se nepodařilo uložit - - - Failed to open "%1" for writing. - Nepodařilo se otevřít "%1" pro zápis. - - - Load Effect Settings - Nahrát nastavení efektu - - - Load Settings Failed - Nastavení se nepodařilo nahrát - - - Failed to open "%1" for reading. - Nepodařilo se otevřít "%1" pro čtení. - - - This settings file doesn't match this effect. - Tento soubor s nastavením neodpovídá tomuto efektu. - - - - OliveGlobal - - Auto-recovery - Automatické obnovení - - - Save Project As... - Uložit projekt jako... - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive nebyl zavřen řádně a byl zjištěn soubor pro automatické obnovení. Chcete jej otevřít? - - - Missing recent project - Chybí nedávný projekt - - - Please open the sequence you wish to export. - Otevřete, prosím, úryvek (sled záběrů), jejž chcete vyvést. - - - This project has changed since it was last saved. Would you like to save it before closing? - Tento projekt se od doby, kdy byl naposledy uložen, změnil. Chcete jej před zavřením uložit? - - - Open Project... - Otevřít projekt... - - - Olive Project %1 - Projekt Olive %1 - - - No active sequence - Žádný činný úryvek (sled záběrů) - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Projekt '%1' už neexistuje. Chcete jej odstranit ze seznamu nedávných projektů? - - - Unsaved Project - Neuložený projekt - - - Missing Project File - Chybí soubor projektu - - - Specified project '%1' does not exist. - Daný projekt '%1' neexistuje. - - - Please open the sequence to perform this action. - Otevřete, prosím, úryvek (sled záběrů), pro provedení této činnosti. - - - No clips selected - Nevybrány žádné záběry - - - Select the clips you wish to auto-cut - Vyberte záběry, které chcete automaticky ořezat - - - Effect already exists - Efekt již existuje - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - Záběr '%1' již obsahuje '%2' efekt. Chcete jej nahradit vloženým nebo jej přidat jako samostatný efekt? - - - Add - Přidat - - - Replace - Nahradit - - - Skip - Přeskočit - - - Do this for all conflicts found - Použít na všechny nalezené střety - - - Import media... - Zavést záznam... - - - All Files - Všechny soubory - - - - PanEffect - - Pan - Vyvážení - - - Modifying the panning on a stereo audio clip. - Změna vyvážení na stereo zvukovém záběru. - - - - PreferencesDialog - - Mono - Mono - - - Export Shortcuts - Vyvést zkratky - - - Audio - Zvuk - - - Invalid CSS File - Neplatný soubor CSS - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - Všechny náhledy byly úspěšně smazány. Možná budete muset nynější projekt otevřít znovu, aby se změny projevily. - - - Thumbnail Resolution: - Rozlišení náhledu: - - - Playback - Přehrávání - - - Search for action or shortcut - Hledat činnosti nebo klávesové zkratky - - - Sample Rate: - Vzorkovací kmitočet: - - - Waveform Resolution: - Rozlišení tvaru vlny: - - - Use Software Fallbacks When Possible - Zajištění skrze softwarovou zálohu - - - Action - Činnost - - - Browse - Procházet - - - Export - Vyvést - - - Language: - Jazyk: - - - Import - Zavést - - - Effect Textbox Lines: - Řádky textového pole efektu: - - - Stereo - Stereo - - - Custom CSS: - Vlastní CSS: - - - Delete All Previews - Smazat všechny náhledy - - - Previews Deleted - Náhledy smazány - - - Output Device: - Výstupní zařízení: - - - Audio Recording: - Nahrávání zvuku: - - - frames - snímků - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - Rychlé vyhledávání -Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - neovlivňuje přehrávání/vyvádění) - - - Browse for CSS file - Hledat soubor CSS - - - Export Keyboard Shortcuts - Vyvést klávesové zkratky - - - Reset Selected - Obnovit výchozí hodnotu u vybraného - - - Failed to open file for writing - Soubor se nepodařilo otevřít pro zápis - - - Shortcuts exported successfully - Zkratky úspěšně vyvedeny - - - seconds - sekund - - - Seeking - Vyhledávání - - - Reset All - Obnovit výchozí hodnotu u všeho - - - Delete Previews - Smazat náhledy - - - Input Device: - Vstupní zařízení: - - - Confirm Reset All Shortcuts - Potvrdit obnovení výchozího nastavení všech klávesových zkratek - - - Default - Výchozí - - - Upcoming Frame Queue: - Nadcházející řada snímků: - - - Import Keyboard Shortcuts - Zavést klávesové zkratky - - - Behavior - Chování - - - Image sequence formats: - Formáty obrázkového úryvku (sledu záběrů): - - - Error saving shortcuts - Chyba při ukládání klávesových zkratek - - - Preferences - Nastavení - - - Keyboard - Klávesnice - - - Previous Frame Queue: - Předchozí řada snímků: - - - Are you sure you want to delete all previews? - Opravdu chcete smazat všechny náhledy? - - - General - Obecné - - - Memory Usage - Využití paměti - - - CSS file '%1' does not exist. - Soubor CSS '%1' neexistuje. - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - Přesné vyhledávání -Vždy ukazovat správný snímek (obraz se při získávání správného snímku může na krátkou dobu pozastavit) - - - Failed to open file for reading - Soubor se nepodařilo otevřít pro čtení - - - Shortcut - Zkratka - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - Jste si jistý, že chcete vrátit nastavení všech klávesových zkratek do jejich výchozího stavu? - - - Default Sequence - Výchozí úryvek (sled záběrů) - - - Default Sequence Settings - Nastavení pro výchozí úryvek (sled záběrů) - - - Add Default Effects to New Clips - Přidat výchozí efekty do nových záběrů - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - Přetočit automaticky na začátek při přehrávání na konci úryvku (sledu záběrů) - - - Selecting Also Seeks - Výběr také přetáčí - - - Edit Tool Also Seeks - Nástroj pro úpravy také přetáčí - - - Edit Tool Selects Links - Nástroj pro úpravy vybírá odkazy - - - Seek Also Selects - Přetáčení také vybírá - - - Seek to the End of Pastes - Přetáčet po konec vložení - - - Scroll Wheel Zooms - Kolečko myši přibližuje - - - Hold CTRL to toggle this setting - Podržet Ctrl pro přepnutí tohoto nastavení - - - Invert Timeline Scroll Axes - Obrátit osy projíždění časovou osu - - - Enable Drag Files to Timeline - Povolit tažení souborů na časovou osu - - - Auto-Scale By Default - Automaticky měnit velikost - - - Auto-Seek to Imported Clips - Přetáčet automaticky k zavedeným záběrům - - - Audio Scrubbing - Přehrávání zvuku při tažení ukazatele - - - Drop Files on Media to Replace - Upustit soubory na záznam pro nahrazení - - - Enable Hover Focus - Povolit zaměření při přejetí - - - Ask For Name When Setting Marker - Požádat o název při nastavení značky - - - Appearance - Vzhled - - - Theme - Motiv - - - Olive Dark (Default) - Tmavá olivová (výchozí) - - - Olive Light - Světlá olivová - - - Native - Původní - - - Native (Light Icons) - Původní (světlé ikony) - - - Use Native Menu Styling - Použít původní styl nabídky - - - (None) - (žádný) - - - OpenColorIO Config Error - Chyba nastavení OpenColorIO - - - Failed to set OpenColorIO configuration: %1 - Nepodařilo se nastavit nastavení OpenColorIO: %1 - - - Invalid OpenColorIO Configuration File - Neplatný soubor s nastavením OpenColorIO - - - You must specify an OpenColorIO configuration file if color management is enabled. - Musíte zadat soubor s nastavením OpenColorIO, pakliže je povolena správa barev. - - - OpenColorIO configuration file '%1' does not exist. - Soubor s nastavením OpenColorIO '%1' není. - - - Browse for OpenColorIO configuration - Procházet pro nastavení OpenColorIO - - - All previews deleted successfully. You may have to re-open your current project for changes to take effect. - Všechny náhledy byly úspěšně smazány. Možná budete muset nynější projekt otevřít znovu, aby se změny projevily. - - - Don't Use Proxies When Exporting - Nepoužívat při vyvádění náhrady - - - Use originals instead of proxies when exporting - Namísto náhrad při vyvádění používat originály - - - Enable Color Management - Povolit správu barev - - - OpenColorIO Config File: - Otevřít soubor s nastavením OpenColorIO: - - - Default Input Color Space: - Výchozí vstupní barevný prostor: - - - Display: - Zobrazení: - - - View: - Pohled: - - - Look: - Vzhled: - - - Bit Depth - Bitová hloubka - - - Playback (Offline): - Přehrávání (nepřipojeno): - - - Export (Online): - Vyvedení (připojeno): - - - Color Management - Správa barev - - - - PreviewGenerator - - Could not find stream information - %1 - Nepodařilo se najít údaje o proudu - %1 - - - Could not open file - %1 - Nepodařilo se otevřít soubor - %1 - - - Failed to find any valid video/audio streams - Nepodařilo se najít žádné platné obrazové/zvukové proudy - - - - Project - - Skip - Přeskočit - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - Záznam '%1' se nyní používá v '%2'. Jeho smazání odstraní všechny instance v úryvku (sledu záběrů). Opravdu to chcete udělat? - - - Delete media in use? - Smazat používaný záznam? - - - Image sequence detected - Zjištěn obrázkový úryvek (sled záběrů) - - - Rename '%1' - Přejmenovat '%1' - - - Active sequence selected - Vybrán činný úryvek (sled záběrů) - - - Enter new name: - Zadat nový název: - - - Search media, markers, etc. - Hledat záznam, značky atd. - - - Project - Projekt - - - Sequence - Úryvek - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - Úryvek (sled záběrů) nemůžete vložit do něj samého, aby žádné záběry z tohoto záznamu nebyly v tomto úryvku (sledu záběrů). - - - Import media... - Zavést záznam... - - - No active sequence - Žádný činný úryvek (sled záběrů) - - - No sequence is active, please open the sequence you want to delete clips from. - Žádný úryvek (sled záběrů) není činný. Otevřete, prosím, úryvek (sled záběrů), ve kterém chcete smazat záběry. - - - Replace '%1' - Nahradit '%1' - - - All Files - Všechny soubory - - - No sequence is active, please open the sequence you want to replace clips from. - Žádný úryvek (sled záběrů) není činný. Otevřete, prosím, úryvek (sled záběrů), ve kterém chcete nahradit záběry. - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - Soubor '%1' se zdá být součástí obrázkového úryvku (sledu záběrů). Chcete jej zavést jako takový? - - - New - Nový - - - Open Project - Otevřít projekt - - - Save Project - Uložit projekt - - - Undo - Zpět - - - Redo - Znovu - - - Tree View - Stromový pohled - - - Icon View - Pohled s ikonami - - - List View - Pohled se seznamem - - - - ProjectModel - - Sequence %1 - Úryvek %1 - - - Import a Project - Zavést projekt - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" je soubor s projektem Olive. Sloučí se s tímto projektem. Chcete pokračovat? - - - Image sequence detected - Zjištěn obrázkový úryvek (sled záběrů) - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - Soubor '%1' se zdá být součástí obrázkového úryvku (sledu záběrů). Chcete jej zavést jako takový? - - - - ProxyDialog - - Proxy - Proxy - - - Eighth Resolution (1/8) - Osminové rozlišení (1/8) - - - Create Proxy - Vytvořit proxy - - - Sixteenth Resolution (1/16) - Šestnáctinové rozlišení (1/16) - - - ProRes HQ - ProRes HQ - - - The file "%1" already exists. Do you wish to replace it? - Soubor "%1" již existuje. Chcete jej nahradit? - - - Dimensions: - Rozměry: - - - Half Resolution (1/2) - Poloviční rozlišení (1/2) - - - Location: - Umístění: - - - Same as Source (in "%1" folder) - Stejné jako zdroj (ve složce "%1") - - - Format: - Formát: - - - Quarter Resolution (1/4) - Čtvrtinové rozlišení (1/4) - - - Proxy file exists - Soubor proxy existuje - - - Same Size as Source - Stejná velikost jako zdroj - - - Custom Location - Vlastní umístění - - - - ProxyGenerator - - Finished generating proxy for "%1" - Dokončeno vytvoření proxy pro "%1" - - - - ReplaceClipMediaDialog - - No media selected - Nevybrán žádný záznam - - - You cannot replace footage with a folder. - Záběry nemůžete nahradit složkou. - - - Active sequence selected - Vybrán činný úryvek (sled záběrů) - - - Cancel - Zrušit - - - Please select a media to replace with or click 'Cancel'. - Vyberte, prosím, záznam k nahrazení nebo klepněte na Zrušit. - - - You cannot insert a sequence into itself. - Nemůžete vložit úryvek (sled záběrů) do něj samého. - - - Replace - Nahradit - - - Same media selected - Vybrán stejný záznam - - - Folder selected - Složka vybrána - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Vybral jste stejný záznam, jejž chcete nahradit. Vyberte, prosím, jiný nebo klepněte na Zrušit. - - - Replace clips using "%1" - Nahradit záběry pomocí "%1" - - - Keep the same media in-points - Zachovat stejné začáteční body záznamu - - - Select which media you want to replace this media's clips with: - Vyberte, kterým záznamem chcete nahradit záběry tohoto záznamu: - - - - RichTextEffect - - Text - Text - - - Padding - Odstup - - - Position - Poloha - - - Vertical Align: - Svislé zarovnání: - - - Top - Nahoře - - - Center - Na střed - - - Bottom - Dole - - - Auto-Scroll - Automatické projíždění - - - Off - Vypnuto - - - Up - Nahoru - - - Down - Dolů - - - Left - Vlevo - - - Right - Vpravo - - - Shadow - Stín - - - Shadow Color - Barva stínu - - - Shadow Angle - Úhel stínu - - - Shadow Distance - Vzdálenost stínu - - - Shadow Softness - Měkkost stínu - - - Shadow Opacity - Neprůhlednost stínu - - - Rich Text - Formátovaný text - - - Render - Vykreslit - - - Render formatted rich text over a clip. - Vykreslit formátovaný text nad záběrem. + Rename Item + Sequence - %1 (copy) - %1 (kopírovat) + %1 FPS + - ShakeEffect + Stream - Rotation - Otočení + %1: Audio - %2 Channels, %3Hz + - Intensity - Síla + %1: Unknown + - Frequency - Četnost + %1: Image - %2x%3 + - Shake - Zatřást - - - Distort - Zkřivit - - - Simulate a camera shake movement. - Napodobit pohyb při zatřesení kamerou. + %1: Video - %2x%3 + - SolidEffect + TimelineViewBlockItem - Type - Typ + %1 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + Empty + - Color - Barva - - - Solid Color - Plná barva - - - Opacity - Neprůhlednost - - - Checkerboard - Šachovnice - - - SMPTE Bars - Pruhy SMPTE - - - Checkerboard Size - Velikost šachovnice + Bars + Pruhy Solid - Plná - - - Render - Vykreslit - - - Render a solid color over this clip. - Vykreslit plnou barvu nad tímto záběrem. - - - - SourcesCommon - - New - Nový - - - View - Pohled - - - Proxy - Proxy - - - Show Toolbar - Ukázat nástrojový pruh - - - Create/Modify Proxy - Vytvořit/Změnit proxy - - - Restore Original - Obnovit původní - - - Delete proxy - Smazat proxy - - - Create Proxy - Vytvořit proxy - - - Create Sequence With This Media - Vytvořit úryvek (sled záběrů) pomocí tohoto záznamu - - - Reveal in Explorer - Ukázat v průzkumníku - - - Delete - Smazat - - - Replace/Relink Media - Nahradit/Znovuspojit záznamy - - - Icon View - Pohled s ikonami - - - Delete All Clips Using This Media - Smazat všechny záběry pomocí tohoto záznamu - - - Duplicate - Zdvojit - - - Import... - Zavést... - - - Show Sequences - Ukázat úryvky (sledy záběrů) - - - Preview in Media Viewer - Náhled v prohlížeči záznamu - - - Replace Clips Using This Media - Nahradit záběry pomocí tohoto záznamu - - - Tree View - Stromový pohled - - - Generating proxy: %1% complete - Vytvoření proxy: %1% hotovo - - - Reveal in File Manager - Ukázat ve správci souborů - - - Properties... - Vlastnosti... - - - Modify Proxy - Změnit proxy - - - Replace Media - Nahradit záznam - - - Reveal in Finder - Ukázat v hledači - - - Would you like to delete the proxy file "%1" as well? - Chcete smazat i soubor proxy "%1"? - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Upustil jste soubor na '%1'. Chcete jej nahradit upuštěným souborem? - - - Replace '%1' - Nahradit '%1' - - - All Files - Všechny soubory - - - - SpeedDialog - - Speed: - Rychlost: - - - Frame Rate: - Snímkování: - - - Duration: - Doba trvání: - - - Reverse - Obrátit - - - Maintain Audio Pitch - Udržovat výšku tónu zvuku - - - Ripple Changes - Změny vytažení - - - Speed/Duration - Rychlost/Doba trvání - - - - TextEditDialog - - Edit Text - Upravit text - - - Thin - Tenké - - - Extra Light - Mimořádně lehké - - - Light - Lehké - - - Normal - Normální - - - Medium - Střední - - - Demi Bold - Polotučné - - - Bold - Tučné - - - Extra Bold - Mimořádně tučné - - - Black - Černé - - - - TextEditEx - - Edit Text - Upravit text - - - &Edit Text - &Upravit text - - - - TextEffect - - Top - Nahoře - - - Font - Písmo - - - Left - Vlevo - - - Size - Velikost - - - Text - Text - - - Color - Barva - - - Right - Vpravo - - - &Edit Text - &Upravit text - - - Outline Color - Barva obrysu - - - Outline Width - Šířka obrysu - - - Justify - Do bloku - - - Sample Text - Text příkladu - - - Shadow Softness - Měkkost stínu - - - Bottom - Dole - - - Center - Na střed - - - Shadow - Stín - - - Outline - Obrys - - - Shadow Distance - Vzdálenost stínu - - - Shadow Opacity - Neprůhlednost stínu - - - Word Wrap - Zalamování slov - - - Shadow Color - Barva stínu - - - Shadow Angle - Úhel stínu - - - Alignment - Zarovnání - - - Padding - Odstup - - - Position - Poloha - - - Horizontal Alignment - Vodorovné zarovnání - - - Vertical Alignment - Svislé zarovnání - - - Render - Vykreslit - - - Generate simple text over this clip - Vytvořit jednoduchý text nad tímto záběrem. - - - - TimecodeEffect - - Timecode - Časový kód - - - Color - Barva - - - Media - Záznamy - - - Scale - Měřítko - - - Offset - Posun - - - Prepend - Uvést na začátku - - - Background Color - Barva pozadí - - - Background Opacity - Neprůhlednost pozadí - - - Sequence - Úryvek - - - Render - Vykreslit - - - Render the media or sequence timecode on this clip. - Vykreslit časový kód záznamu nebo úryvku na tomto záběru. - - - - Timeline - - Add - Přidat - - - Skip - Přeskočit - - - Slip Tool - Roztočení se ztotožněním - - - Edit Tool - Nástroj pro úpravy - - - Title... - Název... - - - Zoom In - Přiblížit - - - Ripple Tool - Nástroj pro vložení a posunutí - - - (none) - (žádný) - - - Record audio - Nahrát zvuk - - - Solid Color... - Plná barva... - - - Hand Tool - Nástroj ručičky - - - Snapping - Přichytávání - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Klepněte na časovou osu, kde chcete začít s nahráváním (táhněte pro omezení nahrávky na určitý časový snímek) - - - Noise... - Šum... - - - Nested Sequence - Vnořený úryvek (sled záběrů) - - - Razor Tool - Nástroj břitvy - - - Zoom Out - Oddálit - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - Záběr '%1' již obsahuje '%2' efekt. Chcete jej nahradit vloženým nebo jej přidat jako samostatný efekt? - - - Bars... - Pruhy... - - - Replace - Nahradit - - - Pointer Tool - Nástroj ukazovátka - - - You must save this project before you can record audio in it. - Musíte tento projekt uložit, předtím než do něj můžete nahrát zvuk. - - - Effect already exists - Efekt již existuje - - - Slide Tool - Roztočení - - - Add title, solid, bars, etc. - Přidat název, plnou barvu, pruhy atd. - - - Tone... - Tón... - - - Do this for all conflicts found - Použít na všechny nalezené střety - - - Timeline: - Časová osa: - - - Unsaved Project - Neuložený projekt - - - Transition Tool - Nástroj pro přechod - - - Video Transitions - Obrazové přechody - - - Audio Transitions - Zvukové přechody - - - Timeline: %1 - Časová osa: %1 - - - - TimelineHeader - - Center Timecodes - Vystředit časové kódy - - - - TimelineLabel - - Rename Track - Přejmenovat stopu - - - Enter the new name for this track - Zadejte nový název pro tuto stopu - - - - TimelineView - - &Undo - &Zpět - - - &Redo - &Znovu - - - R&ipple Delete Empty Space - &Vytáhnout (smazat a posunout) prázdný prostor - - - Sequence Settings - Nastavení úryvku (sledu záběrů) - - - &Speed/Duration - &Rychlost/Doba trvání - - - Auto-Cut Silence - Ořezat ticho automaticky - - - Auto-S&cale - Automatická &změna velikosti - - - &Reveal in Project - &Odkrýt v projektu - - - Properties - Vlastnosti - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Začátek: %2 -Konec: %3 -Doba trvání: %4 - - - Error - Chyba - - - Couldn't locate media wrapper for sequence. - Nepodařilo se najít obal záznamu pro tento úryvek (sled záběrů). + Plná Title - Název - - - Solid Color - Plná barva - - - Bars - Pruhy + Název Tone - Tón + Tón - Noise - Šum - - - Duration: - Doba trvání: + Unknown + - TimelineWidget - - C&ut - Vyj&mout - - - Bars - Pruhy - - - Tone - Tón - - - &Redo - &Znovu - - - &Undo - &Zpět - - - Cop&y - &Kopírovat - - - Error - Chyba - - - Noise - Šum - - - Title - Název - - - Sequence Settings - Nastavení úryvku (sledu záběrů) - - - &Paste - &Vložit - - - &Reveal in Project - &Odkrýt v projektu - - - Rename '%1' - Přejmenovat '%1' - - - Auto-s&cale - Automatická &změna velikosti - - - R&ename - &Přejmenovat - - - Solid Color - Plná barva - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Začátek: %2 -Konec: %3 -Doba trvání: %4 - - - Rename multiple clips - Přejmenovat více záběrů - - - Enter a new name for this clip: - zadejte nový název pro tento záběr: - - - Duration: - Doba trvání: - - - R&ipple Delete - &Vytáhnout (smazat a posunout) - - - &Speed/Duration - &Rychlost/Doba trvání - - - Couldn't locate media wrapper for sequence. - Nepodařilo se najít obal záznamu pro tento úryvek (sled záběrů). - - - R&ipple Delete Empty Space - &Vytáhnout (smazat a posunout) prázdný prostor - - - Auto-Cut Silence - Ořezat ticho automaticky - - - Auto-S&cale - Automatická &změna velikosti - - - Properties - Vlastnosti - - - - ToneEffect - - Mix - Směs - - - Type - Typ - - - Amount - Množství - - - Frequency - Kmitočet - - - Sine - Sinus - - - Tone - Tón - - - Generate a sine wave tone to mix into this clip's audio. - Vytvořit tón sinové vlny k zamíchání do zvuku tohoto záběru. - - - - Track - - Video %1 - Obraz %1 - - - Audio %1 - Zvuk %1 - - - Subtitle %1 - Titulek %1 - - - Unknown %1 - Neznámý %1 - - - - TransformEffect - - Glow - Záře - - - Pin Light - Připíchnout světlo - - - Scale - Měřítko - - - Anchor Point - Bod ukotvení - - - Linear Light - Přímé světlo - - - Lighten - Vypálit - - - Uniform Scale - Jednotné měřítko - - - Color Dodge - Uskočení barvy - - - Blend Mode - Režim mísení - - - Darken - Ztmavit - - - Normal - Normální - - - Screen - Obrazovka - - - Vivid Light - Jasné světlo - - - Color Burn - Vypálení barvy - - - Hard Light - Ostré světlo - - - Soft Light - Tlumené světlo - - - Linear Dodge (Add) - Lineární uskočení (Přidat) - - - Opacity - Neprůhlednost - - - Position - Poloha - - - Rotation - Otočení - - - Overlay - Překrytí - - - Phoenix - Fénix - - - Linear Burn - Přímé vypálení - - - Hard Mix - Tvrdá směs - - - Reflect - Zrcadlit - - - Average - Průměr - - - Substract - Odečíst - - - Exclusion - Ohraničení - - - Negation - Odmítnutí - - - Multiply - Znásobit - - - Difference - Rozdíl - - - Transform - Přeměnit - - - Distort - Zkřivit - - - Transform the position, scale, and rotation of this clip. - Přeměnit polohu, rozměry a otočení tohoto záběru. - - - - Transition - - Length - Délka - - - - UpdateNotification - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - Na internetové stránce Olive je dostupná aktualizace. Pro její stažení navštivte www.olivevideoeditor.org. - - - - VSTHost - - Show - Ukázat - - - Error loading VST plugin - Chyba při nahrávání přídavného modulu VST - - - Plugin's magic number is invalid - Kouzelné číslo přídavného modulu je neplatné - - - NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - Poznámka: Nemůžete nahrát 64 bitové přídavné moduly VST do 32 bitového sestavení Olive. Najděte, prosím, 32 bitovou verzi tohoto přídavného modulu nebo přepněte na 64 bitové sestavení Olive. - - - Plugin - Přídavný modul - - - VST Plugin - Přídavný modul VST - - - VST Error - Chyba VST - - - Interface - Rozhraní - - - NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - Poznámka: Nemůžete nahrát 32 bitové přídavné moduly VST do 64 bitového sestavení Olive. Najděte, prosím, 64 bitovou verzi tohoto přídavného modulu nebo přepněte na 32 bitové sestavení Olive. - - - Failed to locate entry point for dynamic library. - Nepodařilo se najít vstupní bod pro dynamickou knihovnu. - - - Failed to create VST reference - Nepodařilo se vytvořit odkaz na VST - - - Failed to load VST plugin "%1": %2 - Nepodařilo se nahrát přídavný modul "%1": %2 - - - VST Plugin 2.x - Přídavný modul VST 2.x - - - Use a VST 2.x plugin on this clip's audio. - Použít na zvuk tohoto záběru přídavný modul VST 2.x. - - - - Viewer - - Media Viewer - Prohlížeč záznamu - - - (none) - (žádný) - - - Sequence Viewer - Prohlížeč úryvku (sledu záběrů) - - - Drag video only - Táhnout pouze obraz - - - Drag audio only - Táhnout pouze zvuk - - - Viewer: %1 - Prohlížeč: %1 - - - Failed to import recorded file - Nepodařilo se zavést nahraný soubor - - - An error occurred trying to import the recorded audio - Při pokusu o zavedení nahraného souboru se vyskytla chyba - - - Sequence Viewer: %1 - Prohlížeč úryvku (sledu záběrů): %1 - - - Media Viewer: %1 - Prohlížeč záznamu: %1 - - - - ViewerWidget - - Fit - Vejít se - - - Zoom - Zvětšení - - - Save Frame as Image... - Uložit snímek jako obrázek... - - - Custom - Vlastní - - - Show Fullscreen - Ukázat na celou obrazovku - - - Close Media - Zavřít záznam - - - Save Frame - Uložit snímek - - - Screen %1: %2x%3 - Obrazovka %1: %2x%3 - - - Set Custom Zoom Value: - Nastavit vlastní hodnotu zvětšení: - - - Disable - Zakázat - - - Viewer Zoom - Zvětšení prohlížeče - - - - ViewerWindow - - Exit Fullscreen - Opustit celou obrazovku - - - - VoidEffect - - Missing Effect - Chybí efekt - - - (unknown) - (neznámý) - - - - VolumeEffect - - Volume - Hlasitost - - - Adjust the volume of this clip's audio - Upravit hlasitost zvuku tohoto záběru - - - - bitdepths + VideoParams 8-bit - 8-bitů + 8-bitů 16-bit Integer - 16-bitů celé číslo + 16-bitů celé číslo Half-Float (16-bit) - Poloviční plovoucí (16-bitů) + Poloviční plovoucí (16-bitů) Full-Float (32-bit) - Celý plovoucí (32-bitů) + Celý plovoucí (32-bitů) + + + Unknown (0x%1) + + + + %1 FPS + + + + Square Pixels (%1) + + + + NTSC Standard (%1) + + + + NTSC Widescreen (%1) + + + + PAL Standard (%1) + + + + PAL Widescreen (%1) + + + + HD Anamorphic 1080 (%1) + - transition + main - Invalid transition - Neplatný přechod + Show this help text + - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - Žádný uchazeč o přechod '%1'. Tento přechod může být poškozen. Pokuste se jej nebo Olive znovu nainstalovat. + Show application version + + + + Start in full-screen mode + + + + Export only (No GUI) + + + + Override language with file + + + + qm-file + + + + Project to open on startup + + + + + olive::AboutDialog + + About %1 + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive je nelineární editor obrazového záznamu. Tento program je zdarma a chráněn GNU GPL. + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Družstvo Olive se dává na vědomí, že zdrojové kódy Olive jsou dostupné pro stažení na internetové stránce projektu. + + + + olive::ActionSearch + + Search for action... + Hledat činnost... + + + + olive::AudioInput + + Audio Input + + + + Audio + Zvuk + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + Audio Monitor + + + + + olive::Block + + Length + Délka + + + Media In + + + + Enabled + + + + Speed + + + + + olive::BlurFilterNode + + Blur + + + + Blurs an image. + + + + Input + + + + Method + + + + Box + + + + Gaussian + + + + Radius + + + + Horizontal + + + + Vertical + + + + Repeat Edge Pixels + + + + + olive::ClipBlock + + Clip + + + + A time-based node that represents a media source. + + + + Buffer + + + + + olive::ColorDialog + + Select Color + + + + + olive::ColorSpaceChooser + + Color Management + Správa barev + + + Input: + + + + Color Space: + Barevný prostor: + + + Display: + Zobrazení: + + + View: + Pohled: + + + Look: + Vzhled: + + + (None) + (žádný) + + + + olive::ColorValuesTab + + Red + + + + Green + + + + Blue + + + + + olive::ColorValuesWidget + + Preview + + + + Input + + + + Reference + + + + Display + + + + + olive::ConformTask + + Conforming Audio %1:%2 + + + + + olive::Core + + Import error + + + + Nothing to import + + + + Importing... + + + + Import footage... + + + + Failed to import footage + + + + Failed to find active Project panel + + + + No Active Project + + + + No project is currently open to set the properties for + + + + Failed to create new folder + + + + Failed to find active project + + + + New Folder + Nová složka + + + Failed to create new sequence + + + + Possible image sequence detected + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + You must specify a project file to export + + + + Specified project does not exist + + + + Project contains no sequences, nothing to export + + + + This project has multiple sequences. Which do you wish to export? + + + + Enter number (or %1 to cancel): + + + + Invalid sequence number + + + + Export succeeded + + + + Export failed: %1 + + + + Project failed to load: %1 + + + + Failed to open startup file + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + Missing OpenTimelineIO Libraries + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + Save Project + Uložit projekt + + + Error + Chyba + + + This Sequence is empty. There is nothing to export. + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + Olive Project + + + + OpenTimelineIO + + + + Save Project As + + + + Load Project + + + + Label Node + + + + Set node label + + + + Sequence %1 + Úryvek %1 + + + Cannot open recent project + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + Unsaved Changes + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + Save + + + + Save All + + + + Don't Save + + + + Don't Save All + + + + Failed to cache sequence + + + + No active viewer found with this sequence. + + + + Open Project + Otevřít projekt + + + + olive::CrashHandlerDialog + + Olive + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + Crash Report: + + + + Send Error Report + + + + Don't Send + + + + Waiting for crash report to be generated... + + + + Upload Failed + + + + Failed to send error report. Please try again later. + + + + No Crash Summary + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + Cross Dissolve + Prolínat obraz křížem + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + Curve Editor + + + + + olive::CurveView + + Zoom to Fit + + + + + olive::CurveWidget + + Linear + Lineární + + + Bezier + Bézier + + + Hold + Držet + + + + olive::DipToColorTransition + + Dip To Color + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + Disk Cache: %1 + + + + Disk Cache Settings + + + + Maximum Disk Cache: + + + + %1 GB + + + + Clear Disk Cache + + + + Automatically clear disk cache on close + + + + Are you sure you want to clear the disk cache in '%1'? + + + + Disk Cache Cleared + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + Disk Cache Error + + + + Unable to set custom application disk cache. Using default instead. + + + + Disk Cache + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + Elapsed: %1 + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + Advanced + Pokročilé + + + Pixel + + + + Pixel Format: + Formát pixelu: + + + Performance + + + + Threads: + Vlákna: + + + + olive::ExportAudioTab + + Codec: + Kodek: + + + Sample Rate: + Vzorkovací kmitočet: + + + Channel Layout: + + + + Format: + Formát: + + + + olive::ExportCodec + + DNxHD + + + + H.264 + + + + H.265 + + + + OpenEXR + + + + PNG + + + + ProRes + + + + TIFF + + + + MP2 + + + + MP3 + + + + AAC + + + + PCM (Uncompressed) + + + + Unknown + + + + + olive::ExportDialog + + Filename: + Název souboru: + + + Browse for exported file filename + + + + Preset: + Přednastavení: + + + Same As Source - High Quality + + + + Same As Source - Medium Quality + + + + Same As Source - Low Quality + + + + Range: + Rozsah: + + + Entire Sequence + Celý úryvek (sled záběrů) + + + In to Out + Vstup do výstupu + + + Format: + Formát: + + + Export Video + + + + Export Audio + + + + Video + Obraz + + + Audio + Zvuk + + + Export + Vyvést + + + Preview + + + + Invalid parameters + + + + Both video and audio are disabled. There's nothing to export. + + + + Invalid filename + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + Failed to create output directory + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + Confirm Overwrite + + + + The file "%1" already exists. Do you want to overwrite it? + + + + Invalid Parameters + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + DNxHD + + + + Matroska Video + + + + MPEG-4 Video + + + + OpenEXR + + + + PNG + + + + TIFF + + + + QuickTime + + + + Unknown + + + + + olive::ExportTask + + Exporting "%1" + + + + Failed to create encoder + + + + Failed to open file + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + Basic + + + + Width: + Šířka: + + + Height: + Výška: + + + Maintain Aspect Ratio: + + + + Scaling Method: + + + + Fit + Vejít se + + + Stretch + + + + Crop + + + + Frame Rate: + Snímkování: + + + Pixel Aspect Ratio: + Poměr stran pixelu: + + + Interlacing: + Prokládání: + + + Quality: + + + + Codec + + + + Codec: + Kodek: + + + Advanced + Pokročilé + + + + olive::FloatSlider + + %1 dB + + + + %1% + + + + + olive::FootagePropertiesDialog + + "%1" Properties + "%1" Vlastnosti + + + Name: + Název: + + + Tracks: + Stopy: + + + + olive::FootageRelinkDialog + + Footage + + + + Filename + + + + Actions + + + + Browse + Procházet + + + Relink Footage + + + + Relink "%1" + + + + All Files + Všechny soubory + + + + olive::FootageViewerPanel + + Footage Viewer + + + + + olive::GapBlock + + Gap + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + Target Bit Rate (Mbps): + + + + Maximum Bit Rate (Mbps): + + + + Two-Pass + + + + + olive::H264FileSizeSection + + Target File Size (MB): + Velikost cílového souboru (MB): + + + Two-Pass + + + + + olive::H264Section + + Compression Method: + + + + Constant Rate Factor + + + + Target Bit Rate + + + + Target File Size + + + + + olive::ImageSection + + Image Sequence: + + + + + olive::InterlacedComboBox + + None (Progressive) + + + + Top-Field First + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + Keyframe Properties + + + + In: + + + + Out: + + + + Linear + Lineární + + + Hold + Držet + + + Bezier + Bézier + + + + olive::KeyframeViewBase + + Linear + Lineární + + + Bezier + Bézier + + + Hold + Držet + + + P&roperties + + + + + olive::LoadOTIOTask + + Failed to load OpenTimelineIO from file "%1" + + + + Unknown OpenTimelineIO root element + + + + Failed to load clip + + + + + olive::MainMenu + + &Save '%1' + + + + Save '%1' &As + + + + Close '%1' + + + + Close All Except '%1' + + + + &Save Project + &Uložit projekt + + + Save Project &As + Uložit projekt j&ako + + + Close Project + + + + Close All Except Current Project + + + + (None) + (žádný) + + + &File + &Soubor + + + &New + &Nový + + + &Open Project + &Otevřít projekt + + + Open &Recent + + + + &Clear Recent List + + + + Sa&ve All Projects + + + + &Import... + &Zavést... + + + &Export + + + + &Media... + + + + &Project Properties... + + + + Close All Projects + + + + E&xit + &Ukončit + + + &Edit + Úp&ravy + + + Insert + + + + Overwrite + + + + Select &All + Vybrat &vše + + + Deselect All + Zrušit výběr všeho + + + Ripple to In Point + Vložit a posunout k bodu začátku + + + Ripple to Out Point + Vložit a posunout k bodu konce + + + Edit to In Point + Upravit po bod začátku + + + Edit to Out Point + Upravit po bod konce + + + Delete In/Out Point + Smazat bod začátku/konce + + + Ripple Delete In/Out Point + Vytáhnout bod začátku/konce + + + Set/Edit Marker + Nastavit/Upravit značku + + + &View + &Pohled + + + Zoom In + Přiblížit + + + Zoom Out + Oddálit + + + Increase Track Height + Zvětšit výšku stopy + + + Decrease Track Height + Zmenšit výšku stopy + + + Toggle Show All + Přepnout ukázání všeho + + + Full Screen + Celá obrazovka + + + Full Screen Viewer + Prohlížeč na celou obrazovku + + + &Playback + &Přehrávání + + + Go to Start + Jít na začátek + + + Previous Frame + Předchozí snímek + + + Play/Pause + Přehrát/Pozastavit + + + Play In to Out + Přehrát od začátku po konec + + + Next Frame + Další snímek + + + Go to End + Jít na konec + + + Go to Previous Cut + Jít na předchozí záběr + + + Go to Next Cut + Jít na další záběr + + + Go to In Point + Jít na bod začátku + + + Go to Out Point + Jít na bod konce + + + Shuttle Left + Jezdit tam a zpět vlevo + + + Shuttle Stop + Zastavit pendlování + + + Shuttle Right + Jezdit tam a zpět vpravo + + + Loop + Smyčka + + + &Sequence + Ú&ryvek + + + Cache Entire Sequence + + + + Cache Sequence In/Out + + + + Maximize Panel + Zvětšit panel + + + Lock Panels + Uzamknout panely + + + Reset to Default Layout + Obnovit výchozí rozvržení + + + &Tools + &Nástroje + + + Pointer Tool + + + + Edit Tool + Nástroj pro úpravy + + + Ripple Tool + + + + Rolling Tool + + + + Razor Tool + Nástroj břitvy + + + Slip Tool + Roztočení se ztotožněním + + + Slide Tool + Roztočení + + + Hand Tool + + + + Zoom Tool + + + + Transition Tool + + + + Enable Snapping + Povolit přichytávání + + + Preferences + Nastavení + + + &Help + Nápo&věda + + + A&ction Search + Hledání č&inností + + + Send &Feedback... + + + + &About... + &O programu... + + + + olive::MainStatusBar + + Welcome to %1 %2 + Vítejte v %1 %2 + + + Running %1 background tasks + + + + + olive::MainWindow + + Driver Warning + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + Color Space + + + + No color manager connected + + + + Display + + + + View + Pohled + + + Look + + + + (None) + (žádný) + + + OpenColorIO Error + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + Display + + + + Reference + + + + + olive::MathNode + + Math + + + + Perform a mathematical operation between two values. + + + + Method + + + + Value + + + + Add + Přidat + + + Subtract + + + + Multiply + Znásobit + + + Divide + + + + Power + + + + + olive::MatrixGenerator + + Orthographic Matrix + + + + Ortho + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + Position + Poloha + + + Rotation + Otočení + + + Scale + Měřítko + + + Uniform Scale + Jednotné měřítko + + + Anchor Point + Bod ukotvení + + + + olive::MediaInput + + Footage + + + + + olive::MenuShared + + &Project + &Projekt + + + &Sequence + Ú&ryvek + + + &Folder + &Složka + + + Cu&t + Vyjmou&t + + + Cop&y + &Kopírovat + + + &Paste + &Vložit + + + Paste Insert + Vložit/Přidat + + + Duplicate + Zdvojit + + + Delete + Smazat + + + Ripple Delete + Vytáhnout + + + Split + Rozdělit + + + Set In Point + Nastavit bod začátku + + + Set Out Point + Nastavit bod konce + + + Reset In Point + Obnovit výchozí bod začátku + + + Reset Out Point + Obnovit výchozí bod konce + + + Clear In/Out Point + Vymazat bod začátku/konce + + + Add Default Transition + Přidat výchozí přechod + + + Link/Unlink + Spojit/Oddělit + + + Enable/Disable + Povolit/Zakázat + + + Nest + Vnořovat + + + Frames + Snímky + + + Drop Frame + Zahodit snímek + + + Non-Drop Frame + Nezahodit snímek + + + Milliseconds + Milisekundy + + + Seconds + + + + + olive::MergeNode + + Merge + + + + Merge two textures together. + + + + Base + + + + Blend + + + + + olive::Node + + Input + + + + Output + + + + General + Obecné + + + Math + + + + Color + Barva + + + Filter + + + + Timeline + Časová osa + + + Generator + + + + Channel + + + + Transition + + + + Uncategorized + + + + + olive::NodeInput + + Input + + + + + olive::NodeOutput + + Output + + + + + olive::NodePanel + + Node Editor + Editor uzlu + + + + olive::NodeParam + + Value + + + + None + + + + Integer + + + + Float + + + + Rational + + + + Boolean + + + + Color + Barva + + + Matrix + Matice + + + Text + Text + + + Font + Písmo + + + File + + + + Texture + Povrch + + + Samples + + + + Footage + + + + Vector 2D + + + + Vector 3D + + + + Vector 4D + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + Connected to + + + + Nothing + + + + Disconnect + + + + + olive::NodeParamViewItem + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + %1: + + + + + olive::NodeParamViewKeyframeControl + + Warning + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + Table View + + + + + olive::NodeTableView + + Type + Typ + + + Source + + + + R/X + + + + G/Y + + + + B/Z + + + + A/W + + + + (unknown) + (neznámý) + + + + olive::NodeTreeView + + Nodes + + + + + olive::NodeView + + Label + + + + Auto-Position + + + + Smooth Edges + + + + Filter + + + + Show All + + + + Show Selected Blocks Only + + + + Direction + + + + Top to Bottom + + + + Bottom to Top + + + + Left to Right + + + + Right to Left + + + + Add + Přidat + + + + olive::PanNode + + Pan + Vyvážení + + + Adjust the stereo panning of an audio source. + + + + Samples + + + + + olive::PanelWidget + + %1: %2 + + + + + olive::ParamPanel + + Parameter Editor + + + + (none) + (žádný) + + + (multiple) + (více) + + + + olive::PathWidget + + Browse + Procházet + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + Set Custom Pixel Aspect Ratio + + + + Custom... + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + Color + Barva + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + Polygon + + + + Generate a 2D polygon of any amount of points. + + + + Points + + + + Color + Barva + + + + olive::PreCacheTask + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + Theme + Motiv + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + Output Device: + Výstupní zařízení: + + + Input Device: + Vstupní zařízení: + + + Sample Rate: + Vzorkovací kmitočet: + + + Audio Recording: + Nahrávání zvuku: + + + Mono + Mono + + + Stereo + Stereo + + + Refresh Devices + + + + Please wait... + + + + Default + Výchozí + + + + olive::PreferencesBehaviorTab + + Behavior + Chování + + + General + Obecné + + + Enable hover focus + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + Scroll wheel zooms by default instead of scrolling + + + + Holding CTRL while using Olive toggles this setting + + + + Audio + Zvuk + + + Enable audio scrubbing + + + + Timeline + Časová osa + + + Auto-Seek to Imported Clips + Přetáčet automaticky k zavedeným záběrům + + + Edit Tool Also Seeks + + + + Edit Tool Selects Links + Nástroj pro úpravy vybírá odkazy + + + Enable Drag Files to Timeline + Povolit tažení souborů na časovou osu + + + Invert Timeline Scroll Axes + Obrátit osy projíždění časovou osu + + + Hold ALT on any UI element to switch scrolling axes + + + + Seek Also Selects + + + + Seek to the End of Pastes + + + + Selecting Also Seeks + + + + Playback + Přehrávání + + + Ask For Name When Setting Marker + Požádat o název při nastavení značky + + + Automatically rewind at the end of a sequence + + + + Project + Projekt + + + Drop Files on Media to Replace + Upustit soubory na záznam pro nahrazení + + + Nodes + + + + Add Default Effects to New Clips + Přidat výchozí efekty do nových záběrů + + + Auto-Scale By Default + Automaticky měnit velikost + + + Splitting Clips Copies Dependencies + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + Preferences + Nastavení + + + General + Obecné + + + Appearance + Vzhled + + + Behavior + Chování + + + Disk + + + + Audio + Zvuk + + + Keyboard + Klávesnice + + + + olive::PreferencesDiskTab + + Disk Management + + + + Disk Cache Location: + + + + Disk Cache Settings + + + + Cache Behavior + + + + Cache Ahead: + + + + %1 seconds + + + + Cache Behind: + + + + Disk Cache + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + Language: + Jazyk: + + + Auto-Scroll Method: + + + + None + + + + Page Scrolling + + + + Smooth Scrolling + + + + Rectified Waveforms: + + + + Default Still Image Length: + + + + %1 seconds + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + Search for action or shortcut + Hledat činnosti nebo klávesové zkratky + + + Action + Činnost + + + Shortcut + Zkratka + + + Import + Zavést + + + Export + Vyvést + + + Reset Selected + Obnovit výchozí hodnotu u vybraného + + + Reset All + Obnovit výchozí hodnotu u všeho + + + Confirm Reset All Shortcuts + Potvrdit obnovení výchozího nastavení všech klávesových zkratek + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Jste si jistý, že chcete vrátit nastavení všech klávesových zkratek do jejich výchozího stavu? + + + Import Keyboard Shortcuts + Zavést klávesové zkratky + + + Error saving shortcuts + Chyba při ukládání klávesových zkratek + + + Failed to open file for reading + Soubor se nepodařilo otevřít pro čtení + + + Export Keyboard Shortcuts + Vyvést klávesové zkratky + + + Export Shortcuts + Vyvést zkratky + + + Shortcuts exported successfully + Zkratky úspěšně vyvedeny + + + Failed to open file for writing + Soubor se nepodařilo otevřít pro zápis + + + + olive::ProgressDialog + + Cancel + Zrušit + + + + olive::Project + + (untitled) + + + + + olive::ProjectExplorer + + &New + &Nový + + + &Import... + &Zavést... + + + &Project Properties... + + + + Open in New Tab + + + + Open in New Window + + + + Reveal in Explorer + Ukázat v průzkumníku + + + Reveal in Finder + Ukázat v hledači + + + Reveal in File Manager + Ukázat ve správci souborů + + + Pre-Cache + + + + No sequences exist in project + + + + For "%1" + + + + P&roperties + + + + Confirm Footage Deletion + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + Offline Footage + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + Import Error + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + Loading '%1' + + + + + olive::ProjectLoadTask + + This project is newer than this version of Olive and cannot be opened. + + + + This project is from a version of Olive that is no longer supported in this version. + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + Folder + + + + Project + Projekt + + + (none) + (žádný) + + + + olive::ProjectPropertiesDialog + + Project Properties for '%1' + + + + OpenColorIO Configuration: + + + + (default) + + + + Default Input Color Space: + Výchozí vstupní barevný prostor: + + + Browse + Procházet + + + Color Management + Správa barev + + + Use Default Location + + + + Store Alongside Project + + + + Use Custom Location: + + + + Disk Cache Settings + + + + "Store alignside project" functionality not implemented yet + + + + Disk Cache + + + + OpenColorIO Config Error + Chyba nastavení OpenColorIO + + + Failed to set OpenColorIO configuration: %1 + Nepodařilo se nastavit nastavení OpenColorIO: %1 + + + Invalid path + + + + The cache path is invalid. Please check it and try again. + + + + Browse for OpenColorIO configuration + Procházet pro nastavení OpenColorIO + + + + olive::ProjectSaveTask + + Saving '%1' + + + + Failed to write XML data + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + New... + + + + Open Project + Otevřít projekt + + + Save Project + Uložit projekt + + + Undo + Zpět + + + Redo + Znovu + + + Search media, markers, etc. + Hledat záznam, značky atd. + + + Switch to Tree View + + + + Switch to List View + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + Name + Název + + + Duration + Doba trvání + + + Rate + Rychlost + + + Move Items + + + + + olive::RenderCancelDialog + + Waiting for workers to finish... + + + + Renderer + + + + + olive::RichTextDialog + + B + + + + Bold + Tučné + + + I + + + + Italic + + + + U + + + + Underline + + + + S + + + + Strikethrough + + + + Font Family + + + + Font Size + + + + L + + + + Left Align + + + + C + + + + Center Align + + + + R + + + + Right Align + + + + J + + + + Justify Align + + + + + olive::SaveOTIOTask + + Exporting project to OpenTimelineIO + + + + Project contains no sequences to export. + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + Waveform + + + + Histogram + + + + Scope + + + + + olive::SequenceDialog + + Name: + Název: + + + New Sequence + Nový úryvek (sled záběrů) + + + Editing "%1" + Upravení "%1" + + + Error editing Sequence + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + Video + Obraz + + + Width: + Šířka: + + + Height: + Výška: + + + Frame Rate: + Snímkování: + + + Pixel Aspect Ratio: + Poměr stran pixelu: + + + Interlacing: + Prokládání: + + + Audio + Zvuk + + + Sample Rate: + Vzorkovací kmitočet: + + + Channels: + + + + Preview + + + + Resolution: + + + + Quality: + + + + Save Preset + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + Preset + + + + My Presets + + + + 4K UHD + + + + 1080p + 1080p + + + 720p + 720p + + + NTSC + + + + PAL + + + + %1 23.976 FPS + + + + %1 25 FPS + + + + %1 29.97 FPS + + + + %1 50 FPS + + + + %1 59.94 FPS + + + + %1 Standard + + + + %1 Widescreen + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + Sequence Viewer + Prohlížeč úryvku (sledu záběrů) + + + + olive::SliderBase + + Invalid Value + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + Solid + Plná + + + Generate a solid color. + + + + Color + Barva + + + + olive::StringSlider + + (none) + (žádný) + + + + olive::StrokeFilterNode + + Stroke + + + + Creates a stroke outline around an image. + + + + Input + + + + Color + Barva + + + Radius + + + + Opacity + Neprůhlednost + + + Inner + + + + + olive::Task + + Task + + + + Unknown error + + + + + olive::TaskDialog + + Task Failed + + + + + olive::TaskManagerPanel + + Task Manager + + + + + olive::TaskViewItem + + Error: %1 + + + + + olive::TextGenerator + + Sample Text + Text příkladu + + + Text + Text + + + Generate rich text. + + + + Font + Písmo + + + Font Size + + + + Color + Barva + + + Vertical Align + + + + Top + Nahoře + + + Center + Na střed + + + Bottom + Dole + + + + olive::TimeBasedPanel + + (none) + (žádný) + + + + olive::TimeBasedWidget + + Set Marker + Nastavit značku + + + Marker name: + + + + + olive::TimeInput + + Time + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + Timeline + Časová osa + + + + olive::TimelineWidget + + Properties + Vlastnosti + + + Use Audio Time Units + + + + + olive::ToolPanel + + Tools + + + + + olive::Toolbar + + Pointer Tool + + + + Edit Tool + Nástroj pro úpravy + + + Ripple Tool + + + + Rolling Tool + + + + Razor Tool + Nástroj břitvy + + + Slip Tool + Roztočení se ztotožněním + + + Slide Tool + Roztočení + + + Hand Tool + + + + Zoom Tool + + + + Transition Tool + + + + Record Tool + + + + Add Tool + + + + Toggle Snapping + + + + + olive::TrackOutput + + Track + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + Blocks + + + + Muted + + + + Video %1 + Obraz %1 + + + Audio %1 + Zvuk %1 + + + Subtitle %1 + Titulek %1 + + + Track %1 + + + + + olive::TrackViewItem + + M + + + + L + + + + + olive::TransitionBlock + + From + + + + To + + + + Curve + + + + Linear + Lineární + + + Exponential + + + + Logarithmic + + + + + olive::TrigonometryNode + + Trigonometry + + + + Perform a trigonometry operation on a value. + + + + Sine + Sinus + + + Cosine + + + + Tangent + + + + Inverse Sine + + + + Inverse Cosine + + + + Inverse Tangent + + + + Hyperbolic Sine + + + + Hyperbolic Cosine + + + + Hyperbolic Tangent + + + + Method + + + + + olive::VideoDividerComboBox + + Full + + + + 1/%1 + 1080p {1/%1?} + + + + olive::VideoInput + + Video Input + + + + Video + Obraz + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + Pixel Aspect: + + + + Interlacing: + Prokládání: + + + Color Space: + Barevný prostor: + + + Default (%1) + + + + Premultiplied Alpha + + + + Image Sequence + + + + Start Index: + + + + End Index: + + + + Frame Rate: + Snímkování: + + + Invalid Configuration + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + Viewer + + + + Interface between a Viewer panel and the node system. + + + + Texture + Povrch + + + Samples + + + + Video Tracks + + + + Audio Tracks + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + Viewer + + + + + olive::ViewerWidget + + Error + Chyba + + + No in or out points are set to cache. + + + + Safe Margins + + + + Zoom + Zvětšení + + + Fit + Vejít se + + + %1% + + + + Full Screen + Celá obrazovka + + + Screen %1: %2x%3 + Obrazovka %1: %2x%3 + + + Deinterlace + + + + Scopes + + + + Cache + + + + Auto-Cache + + + + Pause Auto-Cache During Playback + + + + Cache Entire Sequence + + + + Cache Sequence In/Out + + + + Off + Vypnuto + + + On + + + + Custom Aspect + + + + Show Audio Waveform + + + + + olive::VolumeNode + + Volume + Hlasitost + + + Adjusts the volume of an audio source. + + + + Samples + diff --git a/app/ts/de_DE.ts b/app/ts/de_DE.ts index 4dd5c3bcd..a565f5c74 100644 --- a/app/ts/de_DE.ts +++ b/app/ts/de_DE.ts @@ -2,4157 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive ist ein nicht-lineares Videoschnittprogramm. Diese Software ist frei und durch die GNU GPL geschützt. - - - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Das Olive Team ist dazu verpflichtet, die Nutzer darüber zu informieren, dass der Quellcode von der Webseite heruntergeladen werden kann. - - - - ActionSearch - - - Search for action... - Nach Aktion suchen... - - - - AdvancedVideoDialog - - - Advanced Video Settings - Erweiterte Video-Einstellungen - - - - Pixel Format: - Pixelformat: - - - - Threads: - Threads: - - - - Audio - - Audio - Same as in english - Audio - - - Recording - Aufnahme - - - - %1 Audio - %1 Audio - - - - Recording %1 - %1 aufnehmen - - - - AudioNoiseEffect - - - Amount - In this case the intensity is meant - Stärke - - - - Mix - Same as in english? - Mix - - - - AutoCutSilenceDialog - - - Cut Silence + + %1 Hz - - Attack Threshold: - - - - - Attack Time: - - - - - Release Threshold: - - - - - Release Time: - - - - - Cacher - - - - Could not open %1 - %2 - Konnte %1 nicht öffnen - %2 - - - - ChannelLayoutName - - - Invalid - ungültig - - - + Mono - Same as in english - Mono + Mono - + Stereo - Same as in english - Stereo + Stereo + + + + 2.1 + 144p {2.1?} + + + + 5.1 + 144p {5.1?} + + + + 7.1 + 144p {7.1?} + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - "%1" Eigenschaften - - - - Multiple Clip Properties + + Error loading settings - - Name: - Name: - - - - Duration: - Dauer: - - - - (multiple) - (mehrere) - - - - CollapsibleWidget - - - <untitled> - <unbenannt> - - - - ColorButton - - - Set Color - Farbe übernehmen - - - - CornerPinEffect - - - Top Left - Oben Links - - - - Top Right - Oben Rechts - - - - Bottom Left - Unten Links - - - - Bottom Right - Unten Rechts - - - - Perspective - Perspektive - - - - DebugDialog - - - Debug Log - Could be also different but is understandable in german - Debug-Log - - - - DemoNotice - - - - Welcome to Olive! - Willkommen in Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive ist ein freies, offenes Videoschnittprogramm welches unter der GNU GPL lizensiert ist. Sofern Sie für diese Software bezahlt haben, wurden Sie betrogen. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Diese Software ist aktuell in einem ALPHA-Stadium, was bedeutet, dass die Software instabil ist, abstürzen könnte, Fehler enthält und einige Funktionen fehlen. Wir leisten keine Garantie, die Benutzung der Software erfolgt auf eigenes Risiko. Bitte melden Sie Fehler oder Funktionswünsche auf %1 - - - - Thank you for trying Olive and we hope you enjoy it! - Danke das Sie Olive ausprobieren, wir hoffen es gefällt Ihnen! - - - - Effect - - - Invalid effect - Ungültiger Effekt - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - The last sentence does not make real sense in german. I changed it to "a reinstallation is recommended" - Kein Kandidat für Effekt '%1'. Dieser Effekt ist möglicherweise beschädigt. Eine Neuinstallation wird empfohlen. - - - Cu&t - &Ausschneiden - - - &Copy - &Kopieren - - - Move &Up - Nach &oben - - - Move &Down - Nach &unten - - - D&elete - L&öschen - - - Load Settings From File - Einstellungen aus Datei laden - - - Save Settings to File - Einstellungen in Datei speichern - - - - Save Effect Settings - Effekt-Einstellungen speichern - - - - - Effect XML Settings %1 - XML Effekt-Einstellungen %1 - - - - Save Settings Failed - Speichern der Einstellungen fehlgeschlagen - - - - Failed to open "%1" for writing. - Fehler beim Öffnen von "%1" - - - - Load Effect Settings - Effekt-Einstellungen laden - - - - - Load Settings Failed - Laden von Einstellungen fehlgeschlagen - - - - Failed to open "%1" for reading. - Fehler beim Öffnen von "%1" - - - - This settings file doesn't match this effect. - Die Einstellungsdatei stimmt nicht mit diesem Effekt überein. - - - - EffectControls - - - Effects: - Effekte: - - - &Paste - &Einfügen - - - - (none) - (keine) - - - - Add Video Effect - Video-Effekt hinzufügen - - - - VIDEO EFFECTS - VIDEO-EFFEKTE - - - - Add Video Transition - Video-Übergang hinzufügen - - - - Add Audio Effect - Audio-Effekt hinzufügen - - - - AUDIO EFFECTS - AUDIO-EFFEKTE - - - - Add Audio Transition - Audio-Übergang hinzufügen - - - (Multiple clips selected) - (mehrere Clips ausgewählt) - - - - EffectRow - - - Disable Keyframes - Keyframes deaktivieren - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Ein Deaktivieren von Keyframes löscht alle aktuellen Keyframes. Sind Sie sicher? - - - - EffectUI - - - %1 (Opening) - - - - - %1 (Closing) - - - - - %1 (multiple) - - - - - Cu&t - &Ausschneiden - - - - &Copy - &Kopieren - - - - Move &Up - Nach &oben - - - - Move &Down - Nach &unten - - - - D&elete - L&öschen - - - - Load Settings From File - Einstellungen aus Datei laden - - - - Save Settings to File - Einstellungen in Datei speichern - - - - EmbeddedFileChooser - - - File: - Datei: - - - - ExportDialog - - - Export "%1" - Exportieren von "%1" - - - - Unknown codec name %1 - Unbekannter Codec-Name %1 - - - - Export Failed - Exportieren fehlgeschlagen - - - - Export failed - %1 - Exportieren fehlgeschlagen - %1 - - - - Invalid dimensions - Ungültige Dimensionen - - - - Export width and height must both be even numbers/divisible by 2. - Breite und Höhe müssen Zahlen sein, die durch 2 teilbar sind. - - - - Invalid codec - Ungültiger Codec - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Ausgabe-Parameter für den ausgewählten Codec konnte nicht erkannt werden. Dies ist ein Fehler, bitte kontaktieren Sie den Entwickler. - - - - Invalid format - Ungültiges Format - - - - Couldn't determine output format. This is a bug, please contact the developers. - Ausgabe-Format konnte nicht erkannt werden. Dies ist ein Fehler, bitte kontaktieren Sie den Entwickler. - - - - Export Media - In german it would be not good to add media to the title - Exportieren - - - - %p% (Total: %1:%2:%3) - - - - - %p% (ETA: %1:%2:%3) - - - - - Quality-based (Constant Rate Factor) - Qualität (Constant Rate Factor) - - - - Constant Bitrate - Konstante Bitrate - - - - - Invalid Codec - Ungültiger Codec - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Es wurde kein passender Encoder für diesen Codec gefunden. Exportieren könnte fehlschlagen. - - - - Failed to find pixel format for this encoder. Export will likely fail. - - - - - Bitrate (Mbps): - Bitrate (Mbps): - - - - Quality (CRF): - Qualität (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Qualitätsfaktor: - -0 = verlustfrei (lossless) -17-18 = optisch verlustfrei (komprimiert, aber nicht bemerkbar) -23 = höchste Qualität -51 = kleinstmögliche Qualität - - - - Target File Size (MB): - Ziel-Dateigröße (MB): - - - - Format: - Same as in english - Format: - - - - Range: - Bereich: - - - - Entire Sequence - Komplette Sequenz - - - - In to Out - In to Out - - - - Video - Same as in english - Video - - - - - Codec: - Same as in english - Codec: - - - - Width: - Breite: - - - - Height: - Höhe: - - - - Frame Rate: - Bildfrequenz: - - - - Compression Type: - Komprimierungsverfahren: - - - - Advanced - Erweitert - - - - Audio - Audio - - - - Sampling Rate: - Abtastrate: - - - - Bitrate (Kbps/CBR): - Same as in english - Bitrate (Kbps/CBR): - - - - ExportThread - - - failed to send frame to encoder (%1) - Fehler beim Senden des Frames zum Encoder (%1) - - - - failed to receive packet from encoder (%1) - Fehler beim Empfangen des Pakets vom Encoder (%1) - - - - could not video encoder for %1 - Video-Encoder für %1 konnte nicht gefunden werden - - - - could not allocate video stream - Videostream konnte nicht zugewiesen werden - - - - could not allocate video encoding context +%1 - - could not open output video encoder (%1) - Video-Encoder konnte nicht geöffnet werden (%1) - - - - could not copy video encoder parameters to output stream (%1) - Video-Encoder-Parameter konnten nicht in den Ausgabe-Stream kopiert werden (%1) - - - - could not audio encoder for %1 - Audio-Encoder für %1 konnte nicht gefunden werden - - - - could not allocate audio stream - Audiostream konnte nicht zugewiesen werden - - - - could not allocate audio encoding context - Audio-Encoding-Kontext konnte nicht zugewiesen werden - - - - could not open output audio encoder (%1) - Audio-Encoder konnte nicht geöffnet werden (%1) - - - - could not copy audio encoder parameters to output stream (%1) - Audio-Encoder-Parameter konnten nicht in den Ausgabe-Stream kopiert werden (%1) - - - - could not allocate audio buffer (%1) - Audio-Buffer konnte nicht zugewiesen werden (%1) - - - - could not create output format context - Ausgabe-Format-Kontext konnte nicht erstellt werden - - - - could not open output file (%1) - Ausgabe konnte nicht geöffnet werden (%1) - - - - could not write output file header (%1) - Ausgabe-Datei-Header konnte nicht geschrieben werden (%1) - - - - could not write output file trailer (%1) - Ausgabe-Datei-Trailer konnte nicht geschrieben werden (%1) - - - - FillLeftRightEffect - - - Type - Typ - - - - Fill Left with Right - Linke Seite mit Rechter füllen - - - - Fill Right with Left - Rechte Seite mit Linker füllen - - - - Frei0rEffect - - - Failed to load Frei0r plugin "%1": %2 - Frei0r plugin konnte nicht geladen werden (%1:%2) - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - HINWEIS: Sie können keine 32-bit Frei0r Plugins in einer 64-bit Version von Olive laden. Sie benötigen entweder eine 64-bit Version des Plugins oder eine 32-bit Version von Olive. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - HINWEIS: Sie können keine 64-bit Frei0r Plugins in einer 32-bit Version von Olive laden. Sie benötigen entweder eine 32-bit Version des Plugins oder eine 64-bit Version von Olive. - - - - Error loading Frei0r plugin - Fehler beim Laden des Frei0r Plugins - - - - GraphEditor - - - Graph Editor - Grafischer Editor - - - - Linear - Same as in english - Linear - - - - Bezier - Same as in english - Bezier - - - - Hold - Does this make sense? (is a handle button meant?) - Halten - - - - GraphView - - - Zoom to Selection - In die Auswahl zoomen - - - - Zoom to Show All - Zommen, um alles anzuzeigen - - - - Reset View - Ansicht zurücksetzen - - - - InterlacingName - - - None (Progressive) - Keine (Progressive) - - - - Top Field First - Oberes Feld zuerst - - - - Bottom Field First - Unteres Feld zuerst - - - - Invalid - Ungültig - - - - KeyframeNavigator - - - Enable Keyframes - Keyframes aktivieren - - - - KeyframeView - - - Linear - Same as in english - Linear - - - - Bezier - Same as in english - Bezier - - - - Hold - Does this make sense? - Halten - - - - LabelSlider - - - &Edit - &Bearbeiten - - - - &Reset to Default + + Error saving settings - - - Set Value - Wert ändern - - - - - New value: - Neuer Wert: - - - - LoadDialog - - - Loading... - Lädt... - - - - Loading '%1'... - Lädt '%1'... - - - - Cancel - Abbrechen - - - - LoadThread - - - Version Mismatch - Unterschiedliche Versionen - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Dieses Projekt wurde mit einer anderen Version von Olive gespeichert und ist möglicherweise nicht vollständig kompatibel. Wollen Sie trotzdem versuchen, es zu laden? - - - - Invalid Clip Link - Ungültiger Clip Link - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Sounds better in German but has same sense - Dieses Projekt enthält eine ungültige Verlinkung zu einem Clip. Das Projekt ist möglicherweise beschädigt. Wollen Sie es dennoch versuchen? - - - - %1 - Line: %2 Col: %3 - %1 - Zeile: %2 Spalte: %3 - - - - User aborted loading - Ladevorgang durch Nutzer abgebrochen - - - - XML Parsing Error - Does not make sense to translate this - XML Parsing Error - - - - Couldn't load '%1'. %2 - '%1' konnte nicht geladen werden. (%2) - - - - Project Load Error - Projektladefehler - - - - Error loading project: %1 - Fehler beim Laden des Projektes: %1 - - - - MainWindow - - Auto-recovery - Auto-Wiederherstellung - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive wurde nicht richtig beendet und eine Wiederherstellungsdatei wurde gefunden. Möchten Sie diese öffnen? - - - &Project - &Projekt - - - &Sequence - &Sequenz - - - &Folder - &Ordner - - - Set In Point - Also for following translations: Not sure if sense is matched - Anfangspunkt festlegen - - - Set Out Point - Endpunkt festlegen - - - Enable/Disable In/Out Point - Anfangs-/Endpunkt aktivieren/deaktiviern - - - - Welcome to %1 - Willkommen in %1 - - - Reset In Point - Anfangspunkt zurücksetzen - - - Reset Out Point - Endpunkt zurücksetzen - - - Clear In/Out Point - Anfangs-/Endpunkt löschen - - - No active sequence - Keine aktive Sequenz - - - Please open the sequence you wish to export. - Bitte öffnen Sie die Sequenz, die Sie exportieren möchten. - - - Save Project As... - Projekt speichern als... - - - Unsaved Project - Ungespeichertes Projekt - - - This project has changed since it was last saved. Would you like to save it before closing? - Das Projekt enthält ungespeicherte Änderungen. Wollen Sie diese jetzt speichern? - - - - &File - &Datei - - - - &New - &Neu - - - - &Open Project - Projekt &öffnen - - - - Clear Recent List - 'Zuletzt geöffnet' leeren - - - - Open Recent - Zuletzt Verwendete öffnen - - - - &Save Project - &Projekt speichern - - - - Save Project &As - Projekt speichern &als... - - - - &Import... - &Importieren... - - - - &Export... - &Exportieren - - - - E&xit - B&eenden - - - - &Edit - &Bearbeiten - - - - &Undo - &Rückgängig - - - - Redo - Wiederholen - - - Cu&t - &Ausschneiden - - - Cop&y - &Kopieren - - - &Paste - &Einfügen - - - Duplicate - Duplizieren - - - Delete - Löschen - - - Ripple Delete - In Premiere's translations its also called "Ripple Delete" - Ripple Delete - - - Split - Teilen - - - - Select &All - Alles &auswählen - - - - Deselect All - Auswahl aufheben - - - Add Default Transition - Standardübergang einfügen - - - Link/Unlink - Verbinden/Trennen - - - Enable/Disable - Einblenden/Ausblenden - - - Nest - Schachteln - - - - Ripple to In Point - - - - - Ripple to Out Point - - - - - Edit to In Point - - - - - Edit to Out Point - - - - - Delete In/Out Point - - - - - Ripple Delete In/Out Point - - - - - Set/Edit Marker - Marker setzen/bearbeiten - - - - &View - &Ansicht - - - - Zoom In - Hereinzoomen - - - - Zoom Out - Herauszoomen - - - - Increase Track Height - Spurhöhe erhöhen - - - - Decrease Track Height - Spurhöhe verringern - - - - Toggle Show All - - - - - Track Lines - Spurlinien - - - - Rectified Waveforms - Nachgebesserte Waveforms - - - - Frames - Frames - - - - Drop Frame - Same word used in German - Drop Frame - - - - Non-Drop Frame - Same word used in German - Non-Drop Frame - - - - Milliseconds - Millisekunden - - - - Title/Action Safe Area - Sicherer Titelbereich - - - - Off - Aus - - - - Default - Standard - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - Benutzerdefiniert - - - - Full Screen - Vollbild - - - - Full Screen Viewer - Does this make sense? - Vollbild-Viewer - - - - &Playback - Should we translate this? Playback is also known - &Wiedergabe - - - - Go to Start - Zum Start gehen - - - - Previous Frame - Vorheriger Frame - - - - Play/Pause - Does not make sense to translate - Play/Pause - - - - Play In to Out - Von Anfang bis Ende wiedergeben - - - - Next Frame - Nächster Frame - - - - Go to End - Zum Ende springen - - - - Go to Previous Cut - Zum vorherigen Schnitt springen - - - - Go to Next Cut - Zum nächsten Schnitt springen - - - - Go to In Point - Zum Anfangspunkt springen - - - - Go to Out Point - Zum Endpunkt springen - - - - Shuttle Left - - - - - Shuttle Stop - - - - - Shuttle Right - - - - - Auto-Cut Silence - - - - Decrease Speed - Geschwindigkeit verringern - - - Pause - Same as in english - Pause - - - Increase Speed - Geschwindigkeit erhöhen - - - - Loop - Schleife - - - - &Window - &Fenster - - - - Project - Projekt - - - - Effect Controls - Effektsteuerung - - - - Timeline - Same as in english - Timeline - - - - Graph Editor - Grafischer Editor - - - - Media Viewer - Does this make sense to translate? - Media Viewer - - - - Sequence Viewer - Does this make sense to translate? - Sequence Viewer - - - - Maximize Panel - Panel maximieren - - - - Lock Panels - Panel sperren - - - - Reset to Default Layout - Zum Standard-Layout zurücksetzen - - - - &Tools - &Werkzeuge - - - - Pointer Tool - Does this make sense? - Zeiger - - - - Edit Tool - Bearbeitungs-Werkzeug - - - - Ripple Tool - Same as 'Ripple Delete' - Ripple-Werkzeug - - - - Razor Tool - Schneide-Werkzeug - - - - Slip Tool - - - - - Slide Tool - - - - - Hand Tool - Hand-Werkzeug - - - - Transition Tool - Übergangs-Werkzeug - - - - Enable Snapping - Snapping aktivieren - - - Scroll Wheel Zooms - Could be better - Scrollrad zoomt - - - Enable Drag Files to Timeline - Dateien auf Timeline ziehen aktivieren - - - Auto-Scale By Default - Skaliere automatisch - - - Audio Scrubbing - Same as in english - Audio Scrubbing - - - Enable Drop on Media to Replace - Auf Medien zum Ersetzen ziehen aktivieren - - - Ask For Name When Setting Marker - Nach Namen fragen, wenn Marker gesetzt wird - - - - No Auto-Scroll - Kein Auto-Scroll - - - - Page Auto-Scroll - Seiten Auto-Scroll - - - - Smooth Auto-Scroll - Weiches Auto-Scroll - - - - Preferences - Einstellungen - - - - Clear Undo - Rückgängig-Historie leeren - - - - &Help - &Hilfe - - - - A&ction Search - &Aktionensuche - - - - Debug Log - Same as in english - Debug-Log - - - - &About... - &Über... - - - - <untitled> - <unbenannt> - - - Open Project... - Projekt öffnen... - - - Missing recent project - Zuletzt geöffnetes Projekt existiert nicht - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie es aus der Liste entfernen? - - - Invalid aspect ratio - Ungültiges Seitenverhältnis - - - The aspect ratio '%1' is invalid. Please try again. - Das Seitenverhältnis '%1' ist ungültig. Bitte versuchen Sie es erneut. - - - Enter custom aspect ratio - Benutzerdefiniertes Seitenverhältnis eingeben - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Geben Sie das Seitenverhältnis für den sicheren Bereich ein (z.B. 16:9): - - - Nested Sequence - Geschachtelte Sequenz - - - - Marker - - - Set Marker - Marker setzen - - - - Set clip marker name: - - - - - Set sequence marker name: + + Failed to save application settings. The application may lack write permissions to this location. - Media + Footage - - New Folder - Neuer Ordner: - - - - Name: - Name: - - - - Filename: - Dateiname: - - - - Video Dimensions: - Video-Dimensionen: - - - - Frame Rate: - Bildrate: - - - %1 fields (%2 frames) - %1 Felder (%2 frames) - - - - %1 field(s) (%2 frame(s)) + + %1 FPS - - Interlacing: - Same as in english - Interlacing: + + %1 Hz + - - Audio Frequency: - Audiofrequenz: + + Filename: %1 + - - Audio Channels: - Audiokanäle: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Name: %1 -Video-Dimensionen: %2x%3 -Bildrate: %4 -Audiofrequenz: %5 -Audio Layout: %6 - - - - Name - Name - - - - Duration - Dauer - - - - Rate - Same as in english, differently spoken, but same meaning - Rate + + This footage is not valid for use + - MediaPropertiesDialog + ImportTool - - "%1" Properties - "%1" Eigenschaften + + Don't ask me again + - - Tracks: - Spuren: + + No Active Sequence + - - Video %1: %2x%3 %4FPS - Same as in english - Video %1: %2x%3 %4FPS + + No sequence is currently open. Would you like to create one? + - Audio %1: %2Hz %3 channels - Audio %1: %2Hz %3 Kanäle + + Automatically Detect Parameters From Footage + - - Audio %1: %2Hz %3 - Audio %1: %2Hz %3 - - - - %n channel(s) - - %n Kanal - %n Kanäle - - - - - Conform to Frame Rate: - Entspricht Bildrate: - - - - Alpha is Premultiplied - Alpha ist vormultipliziert - - - - Auto (%1) - Same? - Auto (%1) - - - - Interlacing: - Same as in english - Interlacing: - - - - Name: - Same as in english - Name: + + Set Parameters Manually + - MenuHelper + MoveItemCommand - - &Project - &Projekt - - - - &Sequence - &Sequenz - - - - &Folder - &Ordner - - - - Set In Point - Anfangspunkt festlegen - - - - Set Out Point - Endpunkt festlegen - - - - Reset In Point - Anfangspunkt zurücksetzen - - - - Reset Out Point - Endpunkt zurücksetzen - - - - Clear In/Out Point - Anfangs-/Endpunkt löschen - - - - Add Default Transition - Standardübergang einfügen - - - - Link/Unlink - Verbinden/Trennen - - - - Enable/Disable - Einblenden/Ausblenden - - - - Nest - Schachteln - - - - Cu&t - &Ausschneiden - - - - Cop&y - &Kopieren - - - - - &Paste - &Einfügen - - - - Paste Insert + + Move Item - - - Duplicate - Duplizieren - - - - Delete - Löschen - - - - Ripple Delete - Ripple Delete - - - - Split - Teilen - - - - Invalid aspect ratio - Ungültiges Seitenverhältnis - - - - The aspect ratio '%1' is invalid. Please try again. - Das Seitenverhältnis '%1' ist ungültig. Bitte versuchen Sie es erneut. - - - - Enter custom aspect ratio - Benutzerdefiniertes Seitenverhältnis eingeben - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Geben Sie das Seitenverhältnis für den sicheren Bereich ein (z.B. 16:9): - - NewSequenceDialog + NodeCopyPasteWidget - - Editing "%1" - Bearbeitung von "%1" + + Error pasting nodes + - - New Sequence - Neue Sequenz - - - - Preset: - Could be also preset - Vorgabe: - - - - Film 4K - Film 4K - - - - TV 4K (Ultra HD/2160p) - TV 4K (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - Benutzerdefiniert - - - - Video - Same as in english - Video - - - - Width: - Breite: - - - - Height: - Höhe: - - - - Frame Rate: - Bildrate: - - - - Pixel Aspect Ratio: - Pixel-Seitenverhältnis: - - - - Square Pixels (1.0) - Quadratische Pixel (1.0) - - - - Interlacing: - Same as in english - Interlacing: - - - - None (Progressive) - Keine (Progressive) - - - - Audio - Same as in english - Audio - - - - Sample Rate: - Abtastrate: - - - - Name: - Name: + + Failed to paste nodes: %1 + - OliveGlobal + NodeFactory - - Olive Project %1 - Olive-Projekt %1 - - - - Auto-recovery - Auto-Wiederherstellung - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive wurde nicht richtig beendet und eine Wiederherstellungsdatei wurde gefunden. Möchten Sie diese öffnen? - - - - Open Project... - Projekt öffnen... - - - - Missing recent project - Zuletzt geöffnetes Projekt existiert nicht - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie es aus der Liste entfernen? - - - - Save Project As... - Projekt speichern als... - - - - Unsaved Project - Ungespeichertes Projekt - - - - This project has changed since it was last saved. Would you like to save it before closing? - Das Projekt enthält ungespeicherte Änderungen. Wollen Sie diese jetzt speichern? - - - - No active sequence - Keine aktive Sequenz - - - - Please open the sequence to perform this action. - Bitte öffnen Sie die Sequenz um diese Aktion auszuführen. - - - - No clips selected - Keine Clips ausgewählt - - - - Select the clips you wish to auto-cut + + None - - Please open the sequence you wish to export. - Bitte öffnen Sie die Sequenz, die Sie exportieren möchten. - - - - Missing Project File - Projektdatei fehlt - - - - Specified project '%1' does not exist. - Das Projekt '%1' existiert nicht. - - PanEffect + NodeViewItem - - Pan - Schwenken + + %1... + - Playback + PresetManager - Generating Proxy: %1% - Proxy wird generiert: %1% + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + - PreferencesDialog + RatioDialog - - Preferences - Einstellungen - - - - Invalid CSS File - Ungültige CSS Datei - - - - CSS file '%1' does not exist. - CSS Datei '%1' existiert nicht. - - - Warning - Achtung - - - Some changed settings will require restarting Olive to take effect - Einige Änderungen erfordern einen Neustart von Olive, um angwendet zu werden - - - - Confirm Reset All Shortcuts - Bestätige das Zurücksetzen aller Shortcuts - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - Sind Sie sicher, dass Sie alle Tastatur-Shortcuts zurücksetzen wollen? - - - - Import Keyboard Shortcuts - Tastatur-Shortcuts importieren - - - - - Error saving shortcuts - Fehler beim Speichern der Shortcuts - - - - Failed to open file for reading - Fehler beim öffnen der Datei - - - - Export Keyboard Shortcuts - Tastatur-Shortcuts exportieren - - - - Export Shortcuts - Shortcuts exportieren - - - - Shortcuts exported successfully - Shortcuts wurden erfolgreich exportiert - - - - Failed to open file for writing - Fehler beim Schreiben der Datei - - - - Browse for CSS file - Nach CSS Datei suchen - - - - Delete All Previews + + Enter custom ratio (e.g. "4:3", "16/9", etc.): - - Are you sure you want to delete all previews? + + Invalid custom ratio - - Previews Deleted + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - - - - - Language: - Sprache: - - - - Default Sequence Settings - Sequenzeinstellungen auf Standard setzen - - - - Add Default Effects to New Clips - - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - - - - - Selecting Also Seeks - - - - - Edit Tool Also Seeks - - - - - Edit Tool Selects Links - - - - - Seek Also Selects - - - - - Seek to the End of Pastes - - - - - Scroll Wheel Zooms - Scrollrad zoomt - - - - Hold CTRL to toggle this setting - Halten Sie STRG um diese Einstellung anzuzeigen - - - - Invert Timeline Scroll Axes - - - - - Enable Drag Files to Timeline - Dateien auf Timeline ziehen aktivieren - - - - Auto-Scale By Default - Skaliere automatisch - - - - Auto-Seek to Imported Clips - - - - - Audio Scrubbing - Audio Scrubbing - - - - Drop Files on Media to Replace - - - - - Enable Hover Focus - - - - - Ask For Name When Setting Marker - Nach Namen fragen, wenn Marker gesetzt wird - - - - Appearance - Erscheinungsbild - - - - Theme - Thema - - - - Olive Dark (Default) - Olive Dunkel (Standard) - - - - Olive Light - Olive Hell - - - - Native - Nativ (System UI) - - - - Native (Light Icons) - Nativ (Helle Icons) - - - - Use Native Menu Styling - - - - - Custom CSS: - Benutzerdefiniertes CSS: - - - - Browse - Durchsuchen - - - - Image sequence formats: - Bilddateiformate: - - - - Audio Recording: - Audioaufnahmen: - - - - Mono - Same as in english - Mono - - - - Stereo - Same as in english - Stereo - - - - Effect Textbox Lines: - Effekt Textbox-Linien: - - - - Default Sequence - Standard Sequenz: - - - - Thumbnail Resolution: - Thumbnail-Auflösung: - - - - Waveform Resolution: - - - - - Delete Previews - - - - - Use Software Fallbacks When Possible - Absicherung durch Software-Defaults - - - - General - Allgemein - - - - Behavior - Verhalten - - - Disable Multithreading on Images - Multithreading auf Bildern deaktiviern - - - Seeking - Suche - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - Genaue Suche -Zeigt immer den richtigen Frame (kann optisch kurzzeitig anhalten, wenn Frame abgefragt wird) - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - Schnelle Suche -Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Plaback aus) - - - - Memory Usage - Speicherauslastung - - - - Upcoming Frame Queue: - Anstehende Frame-Warteschlange: - - - - - frames - Could also use 'Bilder' - Frames - - - - - seconds - Sekunden - - - - Previous Frame Queue: - Vorherige Frame-Warteschlange: - - - - Playback - Wiedergabe - - - - Output Device: - Ausgabegerät: - - - - - Default - Standard - - - - Input Device: - Eingabegerät: - - - - Sample Rate: - Abtastrate: - - - - Audio - Audio - - - - Search for action or shortcut - Nach Eintrag oder Shortcut suchen - - - - Action - Eintrag - - - - Shortcut - Shortcut - - - - Import - Importieren - - - - Export - Exportieren - - - - Reset Selected - Ausgewählte zurücksetzen - - - - Reset All - Alle zurücksetzen - - - - Keyboard - Tastatur - - PreviewGenerator + RenameItemCommand - - Failed to find any valid video/audio streams + + Rename Item - - - Could not open file - %1 - Konnte Datei nicht öffnen - %1 - - - - Could not find stream information - %1 - Konnte Stream-Informationen nicht finden - %1 - - - - Project - - - New - Neu - - - - Open Project - Projekt öffnen - - - - Save Project - Projekt speichern - - - - Undo - - - - - Redo - Wiederholen - - - - Tree View - Tree View - - - - Icon View - Icon View - - - - List View - - - - - Search media, markers, etc. - - - - - Project - Projekt - - - - Sequence - Sequenz - - - - Replace '%1' - Ersetze '%1' - - - - - All Files - Alle Dateien - - - - - No active sequence - Keine aktive Sequenz - - - - No sequence is active, please open the sequence you want to replace clips from. - Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips ersetzen möchten. - - - - Active sequence selected - Aktive Sequenz ausgewählt - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - Sequenz kann nicht sich selbst zugewiesen werden, da es keine Medien enthalten würde. - - - - Rename '%1' - '%1' umbenennen - - - - Enter new name: - Neuen Namen eingeben: - - - - Delete media in use? - Verwendete Datei löschen? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - Die Datei '%1' wird aktuell in '%2' benutzt. Wenn Sie sie löschen, werden alle Instanzen in der Sequenz entfernt. Sind Sie sicher? - - - - Skip - Überspringen - - - - Import a Project - Ein Projekt importieren - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" ist eine Olive-Projektdatei. Das Projekt wird automatisch mit diesem Projekt zusammengeführt. Möchten Sie fortfahren? - - - - Image sequence detected - Bildsequenz erkannt - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - Die Datei '%1' scheint eine Bildsequenz zu enthalten. Möchten Sie sie als solche importieren? - - - - Import media... - Medien importieren... - - - - No sequence is active, please open the sequence you want to delete clips from. - Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips löschen möchten. - - - - ProxyDialog - - - Create Proxy - Proxy erstellen - - - - Proxy - Same as in english - Proxy - - - - Dimensions: - Dimensionen: - - - - Same Size as Source - Selbe Größe wie Quelle - - - - Half Resolution (1/2) - - - - - Quarter Resolution (1/4) - - - - - Eighth Resolution (1/8) - - - - - Sixteenth Resolution (1/16) - - - - - Format: - Format: - - - - ProRes HQ - ProRes HQ - - - - Location: - Pfad: - - - - Same as Source (in "%1" folder) - Genau wie Quelle (in Ordner "%1") - - - - Proxy file exists - Proxy-Datei existiert bereits - - - - The file "%1" already exists. Do you wish to replace it? - Die Datei "%1" existiert bereits. Möchten Sie sie ersetzen? - - - - Custom Location - Benutzerdefinierter Pfad - - - - ProxyGenerator - - - Finished generating proxy for "%1" - Proxy-Generierung für "%1" wurde abgeschlossen - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - Ersetze Clips unter Verwendung von "%1" - - - - Select which media you want to replace this media's clips with: - Wählen Sie, welche Medien mit den Clips dieser Medien ersetzt werden sollen - - - - Keep the same media in-points - Anfangspunkte der Medien behalten - - - - Replace - Ersetzen - - - - Cancel - Abbrechen - - - - No media selected - Keine Medien ausgewählt - - - - Please select a media to replace with or click 'Cancel'. - Bitten wählen Sie Medien zum Ersetzen aus oder klicken Sie auf 'Abbrechen'. - - - - Same media selected - Identische Medien ausgewählt - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Sie haben die gleichen Medien ausgewählt, die Sie ersetzen möchten. Bitte wählen Sie andere Medien oder klicken Sie auf 'Abbrechen'. - - - - Folder selected - Ordner ausgewählt - - - - You cannot replace footage with a folder. - Sie können Footage nicht mit einem Ordner austauschen. - - - - Active sequence selected - Aktive Sequenz ausgewählt - - - - You cannot insert a sequence into itself. - Sie können keine Sequenz in die selbe einsetzen. - - - - RichTextEffect - - - Text - Text - - - - Padding - - - - - Position - Position - - - - Vertical Align: - Vertikale Ausrichtung: - - - - Top - Oben - - - - Center - Mitte - - - - Bottom - Unten - - - - Auto-Scroll - - - - - Off - Aus - - - - Up - Hoch - - - - Down - Runter - - - - Left - Links - - - - Right - Rechts - - - - Shadow - Schatten - - - - Shadow Color - Schattenfarbe - - - - Shadow Angle - - - - - Shadow Distance - Schattenentfernung - - - - Shadow Softness - Schattensoftness - - - - Shadow Opacity - Schattendeckkraft - Sequence - - %1 (copy) - %1 (kopieren) + + %1 FPS + - ShakeEffect + Stream - - Intensity - Intentsität + + %1: Audio - %2 Channels, %3Hz + - - Rotation - Sames as in english, but differently spoken - Rotation + + %1: Unknown + - - Frequency - Frequenz + + %1: Image - %2x%3 + + + + + %1: Video - %2x%3 + - SolidEffect + TimelineViewBlockItem - - Type - Typ - - - - Solid Color - AE and Premiere handle this in the same way - Solid - - - - SMPTE Bars - SMPTE Farbstreifen - - - - Checkerboard - Schachbrettmuster - - - - Opacity - Deckkraft - - - - Color - Farbe - - - - Checkerboard Size - Größe Schachbrettmuster + + %1 + +In: %2 +Out: %3 +Length: %4 + - SourcesCommon + Tool - - Import... - Importieren... + + Empty + - - New - Neu + + Bars + Balken - - View - Ansicht + + Solid + - - Tree View - A translation would be not recommended due to misunderstanding - Tree View + + Title + Titel - - Icon View - A translation would be not recommended due to misunderstanding - Icon View + + Tone + Ton - - Show Toolbar - Toolbar anzeigen - - - - Show Sequences - Sequenzen anzeigen - - - - Replace/Relink Media - Medien ersetzen/neu verbinden - - - - Reveal in Explorer - Im Explorer anzeigen - - - - Reveal in Finder - Im Finder anzeigen - - - - Reveal in File Manager - Im File Manager anzeigen - - - - Replace Clips Using This Media - Ersetze Clips die diese Medien benutzen - - - - Create Sequence With This Media - Sequenz mit diesen Medien erstellen - - - - Duplicate - Duplizieren - - - - Delete All Clips Using This Media - Alle Clips, die diese Medien enthalten löschen - - - - Proxy - Proxy - - - - Generating proxy: %1% complete - Proxy wird generiert: %1% fertig - - - - Create/Modify Proxy - Erstelle/Modifiziere Proxy - - - - Create Proxy - Proxy erstellen - - - - Modify Proxy - Proxy modifizieren - - - - Restore Original - Original wiederherstellen - - - - Delete - Löschen - - - - Preview in Media Viewer - Vorschau im Media Viewer - - - - Properties... - Eigenschaften... - - - - Replace Media - Medien ersetzen - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Sie haben eine Datei auf '%1' gezogen. Möchten Sie diese ersetzen? - - - - Delete proxy - Proxy löschen - - - - Would you like to delete the proxy file "%1" as well? - Möchten Sie die Proxy-Datei "%1" ebenfalls löschen? + + Unknown + - SpeedDialog + VideoParams - - Speed/Duration - Geschwindigkeit/Dauer + + 8-bit + - - Speed: - Geschwindigkeit: + + 16-bit Integer + - + + Half-Float (16-bit) + + + + + Full-Float (32-bit) + + + + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + + + + + main + + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + qm-file + + + + + Project to open on startup + + + + + olive::AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive ist ein nicht-lineares Videoschnittprogramm. Diese Software ist frei und durch die GNU GPL geschützt. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Das Olive Team ist dazu verpflichtet, die Nutzer darüber zu informieren, dass der Quellcode von der Webseite heruntergeladen werden kann. + + + + olive::ActionSearch + + + Search for action... + Nach Aktion suchen... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Audio + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + + Length + Länge + + + + Media In + + + + + Enabled + + + + + Speed + + + + + olive::BlurFilterNode + + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + + + + + olive::ClipBlock + + + Clip + + + + + A time-based node that represents a media source. + + + + + Buffer + + + + + olive::ColorDialog + + + Select Color + + + + + olive::ColorSpaceChooser + + + Color Management + + + + + Input: + + + + + Color Space: + + + + + Display: + + + + + View: + + + + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + Neuer Ordner: + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + Projekt speichern + + + + + Error + Fehler + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + Projekt öffnen + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Linear + + + + Bezier + Bezier + + + + Hold + Halten + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Erweitert + + + + Pixel + + + + + Pixel Format: + Pixelformat: + + + + Performance + + + + + Threads: + Threads: + + + + olive::ExportAudioTab + + + Codec: + Codec: + + + + Sample Rate: + Abtastrate: + + + + Channel Layout: + + + + + Format: + Format: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + Dateiname: + + + + Browse for exported file filename + + + + + Preset: + Vorgabe: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Bereich: + + + + Entire Sequence + Komplette Sequenz + + + + In to Out + In to Out + + + + Format: + Format: + + + + Export Video + + + + + Export Audio + + + + + Video + Video + + + + Audio + Audio + + + + + Export + Exportieren + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Breite: + + + + Height: + Höhe: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + + Fit + Einpassen + + + + Stretch + + + + + Crop + + + + Frame Rate: - Bildrate: + - - Duration: - Dauer: + + Pixel Aspect Ratio: + Pixel-Seitenverhältnis: - - Reverse - Rückwärts + + Interlacing: + Interlacing: - - Maintain Audio Pitch - Tonhöhe erhalten + + Quality: + - - Ripple Changes - Ripple-Änderungen + + Codec + + + + + Codec: + Codec: + + + + Advanced + Erweitert - TextEditDialog + olive::FloatSlider - - Edit Text - Text bearbeiten - - - - Thin - Dünn - - - - Extra Light + + %1 dB - - Light - - - - - Normal - Normal - - - - Medium - - - - - Demi Bold - - - - - Bold - - - - - Extra Bold - - - - - Black + + %1% - TextEditEx + olive::FootagePropertiesDialog - - Edit Text - Text bearbeiten + + "%1" Properties + "%1" Eigenschaften - - &Edit Text - &Text bearbeiten + + Name: + Name: + + + + Tracks: + Spuren: - TextEffect + olive::FootageRelinkDialog - - Text - Same as in english - Text - - - - Font - Schriftart - - - - Size - Größe - - - - Color - Farbe - - - - Alignment - Ausrichtung - - - - Left - Links - - - - - Center - Mitte - - - - Right - Rechts - - - - Justify - Ausrichten - - - - Top - Oben - - - - Bottom - Unten - - - - Word Wrap - Zeilenumbruch - - - - Padding + + Footage - - Position - Position - - - - Outline - Umriss - - - - Outline Color - Umrissfarbe - - - - Outline Width - Umrissbreite - - - - Shadow - Schatten - - - - Shadow Color - Schattenfarbe - - - - Shadow Angle + + Filename - - Shadow Distance - Schattenentfernung + + Actions + - - Shadow Softness - Schattensoftness + + Browse + Durchsuchen - - Shadow Opacity - Schattendeckkraft + + Relink Footage + - - Sample Text - Beispieltext + + Relink "%1" + - &Edit Text - &Text bearbeiten + + All Files + Alle Dateien - TimecodeEffect + olive::FootageViewerPanel - - Timecode - Zeitstempel - - - - Sequence - Sequenz - - - - Media - Medien - - - - Scale - Skalierung - - - - Color - Farbe - - - - Background Color - Hintergrundfarbe - - - - Background Opacity - Hintergrunddeckkraft - - - - Offset - Versatz - - - - Prepend - Voreinstellung + + Footage Viewer + - Timeline + olive::GapBlock - - Timeline: - Makes no sense to translate - Timeline: + + Gap + - <none> - <keine> + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + - - Effect already exists - Effekt existiert bereits + + Maximum Bit Rate (Mbps): + - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - Der Clip '%1' enthält bereits den Effekt '%2'. Möchten Sie diesen ersetzen oder ihn als separaten Effekt hinzufügen? + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Ziel-Dateigröße (MB): - - Add - Hinzufügen + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + - - Replace - Ersetzen + + Constant Rate Factor + - - Skip - Überspringen + + Target Bit Rate + - - Do this for all conflicts found - Auf alle gefundenen Konflikte anwenden + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Keine (Progressive) - Set Marker - Marker setzen + + Top-Field First + - Set marker name: - Marker-Name setzen: + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + - - Title... - Titel... + + In: + - - Solid Color... - Solid... + + Out: + - - Bars... - Balken... + + Linear + Linear - - Tone... - Ton... + + Hold + Halten - - Noise... - Rauschen... + + Bezier + Bezier + + + + olive::KeyframeViewBase + + + Linear + Linear - - Unsaved Project - Ungespeichertes Projekt + + Bezier + Bezier - - You must save this project before you can record audio in it. - Sie müssen das Projekt speichern, bevor Sie Audio aufnehmen können. + + Hold + Halten - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Klicken Sie auf die Timeline, an welcher Stelle Sie mit der Aufnahme beginnen möchten (Ziehen, um das Limit der Aufnahme auf einen bestimmten Timeframe zu setzen) + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + - + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + &Projekt speichern + + + + Save Project &As + Projekt speichern &als... + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + &Datei + + + + &New + &Neu + + + + &Open Project + Projekt &öffnen + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &Importieren... + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + B&eenden + + + + &Edit + &Bearbeiten + + + + Insert + + + + + Overwrite + + + + + Select &All + Alles &auswählen + + + + Deselect All + Auswahl aufheben + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + Marker setzen/bearbeiten + + + + &View + &Ansicht + + + + Zoom In + + + + + Zoom Out + Herauszoomen + + + + Increase Track Height + Spurhöhe erhöhen + + + + Decrease Track Height + Spurhöhe verringern + + + + Toggle Show All + + + + + Full Screen + Vollbild + + + + Full Screen Viewer + Vollbild-Viewer + + + + &Playback + &Wiedergabe + + + + Go to Start + Zum Start gehen + + + + Previous Frame + Vorheriger Frame + + + + Play/Pause + Play/Pause + + + + Play In to Out + Von Anfang bis Ende wiedergeben + + + + Next Frame + Nächster Frame + + + + Go to End + Zum Ende springen + + + + Go to Previous Cut + Zum vorherigen Schnitt springen + + + + Go to Next Cut + Zum nächsten Schnitt springen + + + + Go to In Point + Zum Anfangspunkt springen + + + + Go to Out Point + Zum Endpunkt springen + + + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + + + Loop + Schleife + + + + &Sequence + &Sequenz + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + Panel maximieren + + + + Lock Panels + Panel sperren + + + + Reset to Default Layout + Zum Standard-Layout zurücksetzen + + + + &Tools + &Werkzeuge + + + Pointer Tool - Pointer-Werkzeug + - + Edit Tool - Bearbeitungs-Werkzeug + Bearbeitungs-Werkzeug - + Ripple Tool - Ripple-Werkzeug + Ripple-Werkzeug - + + Rolling Tool + + + + Razor Tool - Schneide-Werkzeug + Schneide-Werkzeug - + Slip Tool - + Slide Tool - + Hand Tool - Hand-Werkzeug + Hand-Werkzeug - + + Zoom Tool + + + + Transition Tool - Übergangs-Werkzeug + Übergangs-Werkzeug - - Snapping - Same as in english - Snapping + + Enable Snapping + Snapping aktivieren - - Zoom In - Hereinzommen + + Preferences + Einstellungen - - Zoom Out - Herauszoomen + + &Help + &Hilfe - - Record audio - Audio aufnehmen + + A&ction Search + &Aktionensuche - - Add title, solid, bars, etc. - Titel, Solid, Balken, etc. Hinzufügen - - - - Nested Sequence - Geschachtelte Sequenz - - - - (none) - (keine) - - - - TimelineHeader - - - Center Timecodes - Timecodes zentrieren - - - - TimelineWidget - - - &Undo - &Rückgängig - - - - &Redo + + Send &Feedback... - C&ut - &Ausschneiden - - - Cop&y - &Kopieren - - - &Paste - &Einfügen - - - R&ipple Delete - Taken from Premiere - R&ipple Delete - - - - Sequence Settings - Sequenz-Einstellungen - - - - &Speed/Duration - &Geschwindigkeit/Dauer - - - Auto-s&cale - Auto-&Skalierung - - - Enable/Disable - Einblenden/Ausblenden - - - Link/Unlink - Verbinden/Trennen - - - - &Reveal in Project - &Im Projekt anzeigen - - - R&ename - U&mbenennen - - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Start: %2 -Ende: %3 -Dauer: %4 - - - Rename '%1' - '%1' umbenennen - - - Rename multiple clips - Mehrere Clips umbenennen - - - Enter a new name for this clip: - Geben Sie einen neuen Namen für den Clip ein: - - - - R&ipple Delete Empty Space - - - - - Auto-Cut Silence - - - - - Auto-S&cale - - - - - Properties - Eigenschaften - - - - Error - Fehler - - - - Couldn't locate media wrapper for sequence. - Konnte den Medienwrapper für diese Sequenz nicht finden. - - - - Title - Titel - - - - Solid Color - Solid - - - - Bars - Balken - - - - Tone - Ton - - - - Noise - Rauschen - - - - Duration: - Dauer: + + &About... + &Über... - ToneEffect + olive::MainStatusBar - - Type - Typ + + Welcome to %1 %2 + Willkommen in %1 %2 - - Sine - Sinus - - - - Frequency - Frequenz - - - - Amount - Menge - - - - Mix - Same as in english - Mix + + Running %1 background tasks + - TransformEffect + olive::MainWindow - - Position - Same as in english, differently spoken - Position + + Driver Warning + - - Scale - Skalierung + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + - - Uniform Scale - Einheitliche Skalierung + + No color manager connected + - - Rotation - Same as in english, differently spoken - Rotation + + Display + - - Anchor Point - Ankerpunkt + + View + Ansicht - - Opacity - Deckkraft + + Look + - - Blend Mode - Mischmodus + + (None) + - - Normal - Same as in english, differently spoken - Normal + + OpenColorIO Error + - Darken - Verdunkeln + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + Hinzufügen + + + + Subtract + + + + Multiply - Vervielfachen + Vervielfachen - Color Burn - Makes no sense to translate - Color Burn - - - Linear Burn - Makes no sense to translate - Linear Burn - - - Lighten - Aufhellen - - - Screen - Makes no sense to translate - Screen - - - Color Dodge - Color-Dodge - - - Linear Dodge (Add) - Addieren - - - Overlay - Überlagern - - - Soft Light - Weiches Licht - - - Hard Light - Hartes Licht - - - Vivid Light - Lebhaftes Licht - - - Linear Light - Lineares Licht - - - Pin Light - Scharfes Licht - - - Hard Mix - Hartes Mischen - - - Difference - Differenz - - - Exclusion - Ausgrenzung - - - Reflect - Spiegeln - - - Substract - Abziehen - - - Average - Durschnitt - - - Glow - Leuchten - - - Negation - Negativ - - - Phoenix - Same as in english - Phoenix - - - - Transition - - Length: - Länge: - - - - Length - Länge - - - - UpdateNotification - - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - Ein Update ist für Olive ist verfügbar. Besuchen Sie www.olivevideoeditor.org um es herunterzuladen. - - - - VSTHost - - - - Error loading VST plugin - Fehler beim Laden des VST Plugins - - - Failed to create VST reference - Fehler beim Herstellen einer VST Referenz - - - - Failed to load VST plugin "%1": %2 - Fehler beim Laden des VST Plugins "%1":%2 - - - NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - HINWEIS: Sie können keine 32-bit VST Plugins in einer 64-bit Version von Olive laden. Sie benötigen entweder eine 64-bit Version des Plugins oder eine 32-bit Version von Olive. - - - NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - HINWEIS: Sie können keine 64-bit VST Plugins in einer 32-bit Version von Olive laden. Sie benötigen entweder eine 32-bit Version des Plugins oder eine 64-bit Version von Olive. - - - - Failed to locate entry point for dynamic library. - Kein Einstiegspunkt für dynamische Bibliothek gefunden. - - - - VST Error - VST Fehler - - - - Plugin's magic number is invalid - Die Magic Number des Plugins ist ungültig - - - - Plugin - Same as in english - Plugin - - - - Interface - Benutzeroberfläche - - - - Show - Anzeigen - - - - VST Plugin - Same as in english - VST Plugin - - - - Viewer - - - Sequence Viewer - Sequenz-Viewer - - - - Media Viewer - Medien-Viewer - - - - (none) - (keine) - - - - Drag video only + + Divide - - Drag audio only + + Power - ViewerWidget + olive::MatrixGenerator - - Save Frame as Image... - Frame als Bild speichern... + + Orthographic Matrix + - - Show Fullscreen - Vollbildschirm + + Ortho + - - Disable - Ausblenden + + Generate an orthographic matrix using position, rotation, and scale. + - - Screen %1: %2x%3 - Screen %1:%2x%3 + + Position + Position - - Zoom - Same as in english - Zoom + + Rotation + Rotation - - Fit - Einpassen + + Scale + Skalierung - - Custom - Benutzerdefiniert + + Uniform Scale + Einheitliche Skalierung - - Close Media - Medien schließen - - - - Save Frame - Frame speichern - - - - Viewer Zoom - Makes no sense to translate - Viewer Zoom - - - - Set Custom Zoom Value: - Benutzerdefinierten Zoomwert angeben + + Anchor Point + Ankerpunkt - ViewerWindow + olive::MediaInput - - Exit Fullscreen - Vollbild verlassen + + Footage + - VoidEffect + olive::MenuShared - + + &Project + &Projekt + + + + &Sequence + &Sequenz + + + + &Folder + &Ordner + + + + Cu&t + &Ausschneiden + + + + Cop&y + &Kopieren + + + + &Paste + &Einfügen + + + + Paste Insert + + + + + Duplicate + Duplizieren + + + + Delete + Löschen + + + + Ripple Delete + Ripple Delete + + + + Split + Teilen + + + + Set In Point + Anfangspunkt festlegen + + + + Set Out Point + Endpunkt festlegen + + + + Reset In Point + Anfangspunkt zurücksetzen + + + + Reset Out Point + Endpunkt zurücksetzen + + + + Clear In/Out Point + Anfangs-/Endpunkt löschen + + + + Add Default Transition + Standardübergang einfügen + + + + Link/Unlink + Verbinden/Trennen + + + + Enable/Disable + Einblenden/Ausblenden + + + + Nest + Schachteln + + + + Frames + Frames + + + + Drop Frame + Drop Frame + + + + Non-Drop Frame + Non-Drop Frame + + + + Milliseconds + Millisekunden + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + Allgemein + + + + Math + + + + + Color + Farbe + + + + Filter + + + + + Timeline + Timeline + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + Farbe + + + + Matrix + + + + + Text + Text + + + + Font + Schriftart + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + Achtung + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Typ + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + (unknown) - (unbekannt) - - - - Missing Effect - Effekt fehlt + (unbekannt) - VolumeEffect + olive::NodeTreeView - + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + Hinzufügen + + + + olive::PanNode + + + + Pan + Schwenken + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (keine) + + + + (multiple) + (mehrere) + + + + olive::PathWidget + + + Browse + Durchsuchen + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + Farbe + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + Farbe + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + Thema + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + Ausgabegerät: + + + + Input Device: + Eingabegerät: + + + + Sample Rate: + Abtastrate: + + + + Audio Recording: + Audioaufnahmen: + + + + Mono + Mono + + + + Stereo + Stereo + + + + Refresh Devices + + + + + Please wait... + + + + + Default + Standard + + + + olive::PreferencesBehaviorTab + + + Behavior + Verhalten + + + + General + Allgemein + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Audio + + + + Enable audio scrubbing + + + + + Timeline + Timeline + + + + Auto-Seek to Imported Clips + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Enable Drag Files to Timeline + Dateien auf Timeline ziehen aktivieren + + + + Invert Timeline Scroll Axes + + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Selecting Also Seeks + + + + + Playback + Wiedergabe + + + + Ask For Name When Setting Marker + Nach Namen fragen, wenn Marker gesetzt wird + + + + Automatically rewind at the end of a sequence + + + + + Project + Projekt + + + + Drop Files on Media to Replace + + + + + Nodes + + + + + Add Default Effects to New Clips + + + + + Auto-Scale By Default + Skaliere automatisch + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + Einstellungen + + + + General + Allgemein + + + + Appearance + Erscheinungsbild + + + + Behavior + Verhalten + + + + Disk + + + + + Audio + Audio + + + + Keyboard + Tastatur + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + Sprache: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + Nach Eintrag oder Shortcut suchen + + + + Action + Eintrag + + + + Shortcut + Shortcut + + + + Import + Importieren + + + + Export + Exportieren + + + + Reset Selected + Ausgewählte zurücksetzen + + + + Reset All + Alle zurücksetzen + + + + Confirm Reset All Shortcuts + Bestätige das Zurücksetzen aller Shortcuts + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Sind Sie sicher, dass Sie alle Tastatur-Shortcuts zurücksetzen wollen? + + + + Import Keyboard Shortcuts + Tastatur-Shortcuts importieren + + + + + Error saving shortcuts + Fehler beim Speichern der Shortcuts + + + + Failed to open file for reading + Fehler beim öffnen der Datei + + + + Export Keyboard Shortcuts + Tastatur-Shortcuts exportieren + + + + Export Shortcuts + Shortcuts exportieren + + + + Shortcuts exported successfully + Shortcuts wurden erfolgreich exportiert + + + + Failed to open file for writing + Fehler beim Schreiben der Datei + + + + olive::ProgressDialog + + + Cancel + Abbrechen + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &Neu + + + + &Import... + &Importieren... + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + Im Explorer anzeigen + + + + Reveal in Finder + Im Finder anzeigen + + + + Reveal in File Manager + Im File Manager anzeigen + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + Projekt + + + + (none) + (keine) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + Durchsuchen + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + Projekt öffnen + + + + Save Project + Projekt speichern + + + + Undo + + + + + Redo + Wiederholen + + + + Search media, markers, etc. + + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + Name + + + + Duration + Dauer + + + + Rate + Rate + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + Name: + + + + New Sequence + Neue Sequenz + + + + Editing "%1" + Bearbeitung von "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Video + + + + Width: + Breite: + + + + Height: + Höhe: + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + Pixel-Seitenverhältnis: + + + + Interlacing: + Interlacing: + + + + Audio + Audio + + + + Sample Rate: + Abtastrate: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + Farbe + + + + olive::StringSlider + + + (none) + (keine) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + Farbe + + + + Radius + + + + + Opacity + Deckkraft + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + Beispieltext + + + + + Text + Text + + + + Generate rich text. + + + + + Font + Schriftart + + + + Font Size + + + + + Color + Farbe + + + + Vertical Align + + + + + Top + Oben + + + + Center + Mitte + + + + Bottom + Unten + + + + olive::TimeBasedPanel + + + (none) + (keine) + + + + olive::TimeBasedWidget + + + Set Marker + Marker setzen + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + Timeline + + + + olive::TimelineWidget + + + + Properties + Eigenschaften + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + + + + + Edit Tool + Bearbeitungs-Werkzeug + + + + Ripple Tool + Ripple-Werkzeug + + + + Rolling Tool + + + + + Razor Tool + Schneide-Werkzeug + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + Hand-Werkzeug + + + + Zoom Tool + + + + + Transition Tool + Übergangs-Werkzeug + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Linear + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + Sinus + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + Video + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + Interlacing: + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + Fehler + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + Zoom + + + + Fit + Einpassen + + + + %1% + + + + + Full Screen + Vollbild + + + + Screen %1: %2x%3 + Screen %1:%2x%3 + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + Aus + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + Volume - Lautstärke - - - - transition - - - Invalid transition - Ungültiger Übergang + Lautstärke - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - Kein Kandidat für den Übergang '%1'. Der Übergang ist möglicherweise beschädigt. Eine Neuinstallation wird empfohlen. + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/en_US.ts b/app/ts/en_US.ts index ef4523a3d..6e8cb8d60 100644 --- a/app/ts/en_US.ts +++ b/app/ts/en_US.ts @@ -759,13 +759,13 @@ Length: %4 - + Missing OpenTimelineIO Libraries - + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. @@ -803,82 +803,82 @@ Make sure a sequence is loaded and it has a connected Viewer node. - + Save Project As - + Load Project - + Label Node - + Set node label - + Sequence %1 - + Cannot open recent project - + The project "%1" doesn't exist. Would you like to remove this file from the recent list? - + Unsaved Changes - + The project '%1' has unsaved changes. Would you like to save them? - + Save - + Save All - + Don't Save - + Don't Save All - + Failed to cache sequence - + No active viewer found with this sequence. - + Open Project diff --git a/app/ts/es_ES.ts b/app/ts/es_ES.ts index 6897bae59..c655010ac 100644 --- a/app/ts/es_ES.ts +++ b/app/ts/es_ES.ts @@ -2,4436 +2,4770 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive es un editor de vídeo no lineal. Esta aplicación es gratuita y está protegida bajo la licencia GNU GPL. + + %1 Hz + - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - El equipo de Olive está obligado a informar a los usuarios que el código fuente de la aplicación esta disponible para su descarga desde su sitio web. - - - - ActionSearch - - - Search for action... - Búsqueda de acción... - - - - AdvancedVideoDialog - - - Advanced Video Settings - Configuraciones Avanzadas de Vídeo - - - - Pixel Format: - Formato de Píxel: - - - - Threads: - Hilos (Threads): - - - - Audio - - - %1 Audio - %1 Audio - - - - Recording %1 - Grabación %1 - - - - AudioNoiseEffect - - - Amount - Cantidad - - - - Mix - Mezclar - - - - Noise - Ruido - - - - Generate audio noise that can be mixed with this clip. - Generar ruido de audio que se puede mezclar con este clip. - - - - AutoCutSilenceDialog - - - Cut Silence - Corte de silencio - - - - Attack Threshold: - Umbral de ataque: - - - - Attack Time: - Tiempo de ataque: - - - - Release Threshold: - Umbral de liberación: - - - - Release Time: - Tiempo de liberación: - - - - Cacher - - - - Could not open %1 - %2 - No se pudo abrir %1 - %2 - - - - ChannelLayoutName - - - Invalid - Inválido - - - + Mono - Monoaural + - + Stereo - Estéreo + + + + + 2.1 + 144p {2.1?} + + + + 5.1 + 144p {5.1?} + + + + 7.1 + 144p {7.1?} + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - "%1" Propiedades + + Error loading settings + - - Multiple Clip Properties - Propiedades de múltiples clips - - - - Name: - Nombre: - - - - Duration: - Duración: - - - - (multiple) - (múltiple) - - - - CollapsibleWidget - - - <untitled> - <SinTítulo> - - - - ColorButton - - - Set Color - Establecer color - - - - CornerPinEffect - - - Top Left - Arriba Izquierda - - - - Top Right - Arriba Derecha - - - - Bottom Left - Abajo Izquierda - - - - Bottom Right - Abajo Derecha - - - - Perspective - Perspectiva - - - - Corner Pin - Fijar Esquinas Para Deformar (Corner Pin) - - - - Distort - Distorsionar - - - - Distort/warp this clip by pinning each of its four corners. - Distorsionar/deformar este clip fijando cada una de sus cuatro esquinas. - - - - CrashDialog - - - We're very sorry, Olive has crashed. Please send the following data to developers: - Lo sentimos mucho, se ha producido un error en la aplicación. Por favor envíe los siguientes datos a los desarrolladores de Olive para falcilitar la resolución del problema, gracias: - - - - CrossDissolveTransition - - - Cross Dissolve - Fundido Cruzado - - - - Dissolves - Fundido - - - - Dissolve clips evenly. - Fundir uniformemente los clips. - - - - DebugDialog - - - Debug Log - Registro de depuración - - - - DemoNotice - - - - Welcome to Olive! - ¡Bienvenido a Olive Video Editor! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive es un editor de video gratuito de código abierto lanzado bajo la licencia GPL de GNU. Si ha pagado por este software, ha sido estafado. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Este software se encuentra actualmente en desarrollo y es una versión ALPHA, lo que significa que es inestable y es muy probable que se bloquee, tenga errores y carezca de algunas características. No podemos ofrecerle ninguna garantía, así que úselo bajo su propia responsabilidad. Por favor, informe de cualquier error y no dude en notificarnos características que le gustaría que se incluyan en la aplicación en la siguiente web %1 - - - - Thank you for trying Olive and we hope you enjoy it! - ¡Gracias por probar Olive Vídeo Editor, esperamos que lo disfrutes! - - - - EffectControls - - - Effects: - Efectos: - - - - (none) - (ninguno) - - - - Add Video Effect - Añadir Efecto de Vídeo - - - - VIDEO EFFECTS - EFECTOS DE VÍDEO - - - - Add Video Transition - Añadir Transición de Vídeo - - - - Add Audio Effect - Añadir Efecto de Audio - - - - AUDIO EFFECTS - EFECTOS DE AUDIO - - - - Add Audio Transition - Añadir Transición de Audio - - - - EffectUI - - - %1 (Opening) - %1 (Abriendo) - - - - %1 (Closing) - %1 (Cerrando) - - - - %1 (multiple) - %1 (múltiple) - - - - Cu&t - Cor&tar - - - - &Copy - &Copiar - - - - Move &Up - Mover Arriba (&Up) - - - - Move &Down - Mover Abajo (&Down) - - - - D&elete - &Eliminar - - - - Load Settings From File - Cargar configuración predefinida desde un archivo - - - - Save Settings to File - Guardar configuración predefinida en un archivo - - - - EmbeddedFileChooser - - - File: - Archivo: - - - - ExponentialFadeTransition - - - Exponential Fade - Desvanecimiento exponencial - - - - An exponential audio fade that starts slow and ends fast. - Desvanecimiento de audio exponencial, comienza lento y termina rápido. - - - - ExportDialog - - - Export "%1" - Exportar "%1" - - - - Unknown codec name %1 - Nombre de códec desconocido %1 - - - - Export Failed - La exportación ha fallado - - - - Export failed - %1 - La exportación ha fallado - %1 - - - - Invalid dimensions - Dimensiones no válidas - - - - Export width and height must both be even numbers/divisible by 2. - El ancho y el alto de la exportación deben ser números pares/divisibles entre 2. - - - - Invalid codec - Códec no valido - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - No se pudieron determinar los parámetros de salida para el códec seleccionado. Si esto es un error, por favor, póngase en contacto con los desarrolladores. - - - - Invalid format - Formato no válido - - - - Couldn't determine output format. This is a bug, please contact the developers. - No se pudo determinar el formato de salida. Si esto es un error, por favor, póngase en contacto con los desarrolladores. - - - - Export Media - Exportar Medios - - - - %p% (Total: %1:%2:%3) - %p% (Total: %1:%2:%3) - - - - %p% (ETA: %1:%2:%3) - %p% (ETA: %1:%2:%3) - - - - Quality-based (Constant Rate Factor) - Basado en la Calidad de Factor de Ratio Constante - - - - Constant Bitrate - Velocidad de bits constante - - - - - Invalid Codec - Códec no valido - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Error al encontrar un codificador adecuado para este códec. La exportación probablemente fallará. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Error al encontrar el formato de píxel adecuado para este codificador. La exportación probablemente fallará. - - - - Bitrate (Mbps): - Velocidad de Bits (Mbps): - - - - Quality (CRF): - Calidad (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Factor de Calidad: - -0 = Sin pérdida, sin compresión. (La mejor calidad pero mayor tamaño de archivo) -17-18 = Muy alta calidad, sin pérdida visual. (RECOMENDADO) (Comprimido, pero de manera imperceptible.) -23 = Alta calidad (Recomendado en la mayoría de casos para mantener una buena relación calidad tamaño) -51 = La peor calidad posible (No se recomienda salvo excepciónes donde sea más importante el menor tamaño de archivo que la calidad del vídeo) +%1 + - - Target File Size (MB): - Tamaño del archivo de destino (MB): + + Error saving settings + - - Format: - Formato: - - - - Range: - Rango: - - - - Entire Sequence - Secuencia entera - - - - In to Out - De entrada a salida - - - - Video - Vídeo - - - - - Codec: - Codificación (Códec): - - - - Width: - Ancho: - - - - Height: - Alto: - - - - Frame Rate: - Fotogramas por segundo: - - - - Compression Type: - Tipo de Compresión: - - - - Advanced - Avanzado - - - - Audio - Audio - - - - Sampling Rate: - Tasa de muestreo: - - - - Bitrate (Kbps/CBR): - Velocidad de bits (Kbps / CBR): + + Failed to save application settings. The application may lack write permissions to this location. + - ExportThread + Footage - - failed to send frame to encoder (%1) - Error al enviar los fotogramas al codificador (%1) + + %1 FPS + - - failed to receive packet from encoder (%1) - Error al recibir el paquete del codificador (%1) + + %1 Hz + - - could not video encoder for %1 - No se ha podido codificar el vídeo para %1 + + Filename: %1 + - - could not allocate video stream - no se pudo asignar el flujo de video - - - - could not allocate video encoding context - no se pudo asignar el flujo de video - - - - could not open output video encoder (%1) - no se pudo abrir el codificador para el vídeo de salida (%1) - - - - could not copy video encoder parameters to output stream (%1) - no se pudieron copiar los parámetros del codificador de video para este flujo de salida (%1) - - - - could not audio encoder for %1 - no se pudo codificar el audio para %1 - - - - could not allocate audio stream - no se pudo asignar el flujo de audio - - - - could not allocate audio encoding context - no se pudo asignar el contexto de codificación de audio - - - - could not open output audio encoder (%1) - no se pudo abrir el codificador de audio de salida (%1) - - - - could not copy audio encoder parameters to output stream (%1) - no se pudieron copiar los parámetros del codificador de audio al flujo de salida (%1) - - - - could not allocate audio buffer (%1) - no se pudo asignar el búfer de audio (%1) - - - - could not create output format context - no se pudo crear el contexto del formato de salida - - - - could not open output file (%1) - no se pudo abrir el archvo de salida (%1) - - - - could not write output file header (%1) - no se pudo escribir la cabecera del archivo de salida (%1) - - - - could not write output file trailer (%1) - no se pudo escribir el final del archivo de salida (%1) + + This footage is not valid for use + - FFmpegDecoder + ImportTool - - Failed to find appropriate decoder for this codec (%1 :: %2) - No se pudo encontrar un decodificador adecuado para este códec (%1 :: %2) + + Don't ask me again + - - Failed to allocate codec context (%1 :: %2) - Error al asignar el contexto del códec (%1 :: %2) + + No Active Sequence + - - Error decoding %1 - %2 %3 - Error al decodificar %1 - %2 %3 + + No sequence is currently open. Would you like to create one? + + + + + Automatically Detect Parameters From Footage + + + + + Set Parameters Manually + - FillLeftRightEffect + MoveItemCommand - - Type - Tipo - - - - Fill Left with Right - Rellena a la izquierda con la derecha - - - - Fill Right with Left - Rellena a la derecha con la izquierda - - - - Fill Left/Right - Rellenar Izquierda/Derecha - - - - Replaces either the left or right channel with the other - Reemplaza el canal izquierdo o derecho con el otro + + Move Item + - Frei0rEffect + NodeCopyPasteWidget - - Failed to load Frei0r plugin "%1": %2 - Falló la carga del plugin Frei0r "%1": %2 + + Error pasting nodes + - - Error loading Frei0r plugin - Error al cargar el plugin Frei0r + + Failed to paste nodes: %1 + - GraphEditor + NodeFactory - - Graph Editor - Editor Gráfico - - - - Linear - Lineal - - - - Bezier - Bézier - - - - Hold - Mantener + + None + - GraphView + NodeViewItem - - Zoom to Selection - Ampliar a la selección - - - - Zoom to Show All - Mostrar todo - - - - Reset View - Resetear vista + + %1... + - InterlacingName + PresetManager - - None (Progressive) - Ninguno (Progresivo) + + Save Preset + - - Upper Field First - Campo superior primero + + Set preset name: + - - Lower Field First - Campo inferior primero + + Invalid preset name + - - Invalid - No válido + + You must enter a preset name + - - Top Field First - Campo de arriba primero + + Preset exists + - - Bottom Field First - Campo de abajo primero + + A preset with this name already exists. Would you like to replace it? + - KeyframeNavigator + RatioDialog - - Enable Keyframes - Habilitar fotogramas clave + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + + + + + Invalid custom ratio + + + + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - KeyframeView + RenameItemCommand - - Linear - Lineal - - - - Bezier - Bézier - - - - Hold - Mantener - - - - LabelSlider - - - &Edit - &Editar - - - - &Reset to Default - &Restablecer a Predeterminados - - - - - Set Value - Establecer Valor - - - - - New value: - Nuevo Valor: - - - - LinearFadeTransition - - - Linear Fade - Fundido Lineal - - - - An linear audio fade that fades evenly at a constant rate. - Desvanecimiento lineal del audio a una velocidad constante. - - - - LoadDialog - - - Loading... - Cargando... - - - - Loading '%1'... - Cargando '%1'... - - - - Cancel - Cancelar - - - - LoadThread - - - Version Mismatch - La versión no coincide - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Este proyecto se guardó en una versión diferente de Olive y puede que no sea totalmente compatible con esta versión ¿Deseas intentar abrirlo de todos modos? - - - - %1 - Line: %2 Col: %3 - %1 - Línea: %2 Col: %3 - - - - User aborted loading - Carga cancelada por el usuario - - - - XML Parsing Error - Error de análisis XML - - - - Couldn't load '%1'. %2 - No se pudo cargar '%1'. %2 - - - - Project Load Error - La carga del proyecto falló - - - - Error loading project: %1 - Error al cargar el proyecto: %1 - - - - Invalid Clip Link - Enlace al clip inválido - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Este proyecto contiene un enlace de clip no válido. Puede haberse movido o estar corrupto. ¿Te gustaría seguir cargándolo? - - - - LogarithmicFadeTransition - - - Logarithmic Fade - Desvanecimiento logarítmico - - - - An logarithmic audio fade that starts fast and ends slow. - Un desvanecimiento de audio logarítmico que comienza rápido y termina lentamente. - - - - MainWindow - - - Welcome to %1 - Bienvenido a %1 - - - - &File - &Archivo - - - - &New - &Nuevo - - - - &Open Project - &Abrir Proyecto - - - - Clear Recent List - Limpiar lista de recientes - - - - Open Recent - Abrir Recientes - - - - &Save Project - &Guardar Proyecto - - - - Save Project &As - G&uardar Proyecto Como - - - - &Import... - &Importar... - - - - &Export... - &Exportar... - - - - E&xit - &Cerrar la aplicación - - - - &Edit - &Editar - - - - &Undo - Deshacer Cambios (&Undo) - - - - Redo - Rehacer Cambios - - - - Select &All - Seleccion&ar Todo - - - - Deselect All - Deseleccionar Todo - - - - Ripple to In Point - Extraer desde el punto de inicio del clip - - - - Ripple to Out Point - Extraer desde el punto final del clip - - - - Edit to In Point - Eliminar desde el punto de inicio del clip - - - - Edit to Out Point - Eliminar desde el punto final del clip - - - - Delete In/Out Point - Eliminar lo comprendido entre los puntos de Entrada/Salida - - - - Track Lines - Ver líneas de las pistas - - - - Ripple Delete In/Out Point - Extraer lo comprendido entre los puntos de Entrada/Salida - - - - Set/Edit Marker - Establecer/Editar Marcador - - - - &View - &Ver - - - - Zoom In - Ampliar - - - - Zoom Out - Reducir - - - - Increase Track Height - Aumentar la altura de la pista - - - - Decrease Track Height - Disminuir la altura de la pista - - - - Toggle Show All - Alternar Mostrar Todo - - - - OpenColorIO Config Error - Error de configuración de OpenColorIO - - - - Failed to set OpenColorIO configuration: %1 - Error al establecer la configuración de OpenColorIO: %1 - - - - Rectified Waveforms - Ondas de audio recortadas - - - - Frames - Fotogramas - - - - Drop Frame - Descartar fotograma (Drop Frame) - - - - Non-Drop Frame - No descartar fotograma (Non-Drop Frame) - - - - Milliseconds - Milisegundos - - - - Title/Action Safe Area - Area segura para Titulos y Acción - - - - Off - Apagado - - - - Default - Por defecto - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - Personalizado - - - - Full Screen - Pantalla completa - - - - Full Screen Viewer - Visor a pantalla completa - - - - &Playback - &Reproducción - - - - Go to Start - Ir al inicio - - - - Previous Frame - Fotograma anterior - - - - Play/Pause - Reproducir/Pausar - - - - Play In to Out - Reproducir desde la marca de entrada a la marca de salida - - - - Next Frame - Siguiente fotograma - - - - Go to End - Ir al final - - - - Go to Previous Cut - Ir al corte anterior - - - - Go to Next Cut - Ir al siguiente corte - - - - Go to In Point - Ir al punto de entrada - - - - Go to Out Point - Ir al punto de salida - - - - Shuttle Left - Reproducir hacia la Izquierda (Inversa) - - - - Shuttle Stop - Parar la Reproducción - - - - Shuttle Right - Reproducir hacia la Derecha (Normal) - - - - Loop - Bucle (Loop) - - - - &Window - Ve&ntana - - - - Project - Proyecto - - - - Effect Controls - Controles de efectos - - - - Timeline - Línea de Tiempo - - - - Graph Editor - Editor Gráfico - - - - Node Editor - Editor de Nodos - - - - Media Viewer - Visor de Medios - - - - Sequence Viewer - Visor de Secuencias - - - - Maximize Panel - Maximizar Panel - - - - Lock Panels - Bloquear Paneles - - - - Reset to Default Layout - Restaurar valores por defecto de la interfaz - - - - &Tools - &Herramientas - - - - Pointer Tool - Puntero de Selección/Edición/Mover Clips - - - - Edit Tool - Herramienta de Selección - - - - Ripple Tool - Herramienta para Enrrollar/Desenrrollar - - - - Razor Tool - Herramienta de Corte - - - - Slip Tool - Deslizar clip sin desplazar - - - - Slide Tool - Desplazar clip afectando a los clips contiguos - - - - Hand Tool - Mano para ajustar la vista (No afecta a la edición) - - - - Transition Tool - Herramienta para Inserción de Transiciones - - - - Enable Snapping - Habilitar Imán de Ajuste - - - - Auto-Cut Silence - Auto Cortar en los Silencios - - - - No Auto-Scroll - Sin desplazamiento automático - - - - Page Auto-Scroll - Desplazamiento automático de páginas - - - - Smooth Auto-Scroll - Desplazamiento automático suave - - - - Preferences - Preferencias - - - - Clear Undo - Limpiar historial de Deshacer - - - - &Help - A&yuda - - - - A&ction Search - &Buscar - - - - Debug Log - Registro de depuración - - - - &About... - &Acerca de... - - - - <untitled> - <SinTítulo> - - - - Marker - - - - Set Marker - Establecer Marca - - - - Set clip marker name: - Establecer el nombre del marcador de clip: - - - - Set sequence marker name: - Establecer el nombre del marcador de secuencia: - - - - Media - - - New Folder - Nueva Carpeta - - - - Name: - Nombre: - - - - Filename: - Nombre de Archivo: - - - - Video Dimensions: - Dimensiones de Vídeo: - - - - Frame Rate: - Fotogramas por Segundo: - - - - %1 field(s) (%2 frame(s)) - %1 Campo(s) (%2 Fotograma(s)) - - - - Interlacing: - Entrelazado: - - - - Audio Frequency: - Frecuencia del Audio: - - - - Audio Channels: - Canales de Audio: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Nombre: %1 -Dimensiones del Vídeo: %2x%3 -Fotogramas por Segundo: %4 -Frecuencia del Audio: %5 -Audio: %6 - - - - Name - Nombre - - - - Duration - Duración - - - - Rate - Velocidad - - - - MediaPropertiesDialog - - - "%1" Properties - "%1" Propiedades - - - - Tracks: - Pistas: - - - - Video %1: %2x%3 %4FPS - Vídeo %1: %2x%3 %4FPS - - - - Audio %1: %2Hz %3 - Audio %1: %2Hz %3 - - - - %n channel(s) - - %n canal - %n canales - - - - - Conform to Frame Rate: - Conforme a la velocidad de fotogramas: - - - - Alpha is Premultiplied - Canal Alfa Premultiplicado - - - - Auto (%1) - Automático (%1) - - - - Interlacing: - Entrelazado: - - - - Color Space: - Espacio de color: - - - - Name: - Nombre: - - - - MenuHelper - - - &Project - &Proyecto - - - - &Sequence - &Sequencia - - - - &Folder - &Carpeta - - - - Set In Point - Establecer punto de entrada - - - - Set Out Point - Establecer punto de salida - - - - Reset In Point - Resetear punto de entrada - - - - Reset Out Point - Resetear punto de salida - - - - Clear In/Out Point - Limpiar puntos de Entrada/Salida - - - - Add Default Transition - Añadir Transición predeterminada - - - - Link/Unlink - Unir/Separar clips seleccionados - - - - Enable/Disable - Habilitar/Deshabilitar clips seleccionados - - - - Nest - Anidar selección en una secuencia - - - - Cu&t - Cortar (&x) - - - - Cop&y - &Copiar - - - - - &Paste - &Pegar - - - - Paste Insert - Insertar (Pegar) - - - - Duplicate - Duplicar - - - - Delete - Eliminar Selección (No elimina el hueco) - - - - Ripple Delete - Extraer Selección (Elimina el hueco) - - - - Split - Dividir clips - - - - Invalid aspect ratio - Relación de aspecto no válida - - - - The aspect ratio '%1' is invalid. Please try again. - La relación de aspecto '%1' no es válida. Inténtalo de nuevo. - - - - Enter custom aspect ratio - Introduzca una relación de aspecto personalizada - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Ingrese la relación de aspecto a usar para el área segura de título/acción (por ejemplo, 16:9): - - - - NewSequenceDialog - - - Editing "%1" - Edición "%1" - - - - New Sequence - Nueva Secuencia - - - - Preset: - Preestablecidos: - - - - Film 4K - Película 4K - - - - TV 4K (Ultra HD/2160p) - TV 4K (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - Personalizado - - - - Video - Vídeo - - - - Width: - Ancho: - - - - Height: - Alto: - - - - Frame Rate: - Velocidad de Fotogramas (FPS): - - - - Pixel Aspect Ratio: - Relación de aspecto de píxeles: - - - - Square Pixels (1.0) - Píxeles cuadrados (1.0) - - - - Interlacing: - Entrelazado: - - - - None (Progressive) - Ninguno (Progresivo) - - - - Audio - Audio - - - - Sample Rate: - Frecuencia de muestreo: - - - - Name: - Name: - - - - Node - - - Node - Nodo - - - - NodeBlock - - - Previous - Anterior - - - - Next - Siguiente - - - - Block - Bloquear - - - - NodeEditor - - - Node Editor - Editor de Nodos - - - - NodeIO - - - Disable Keyframes - Desconectar Fotogramas Clave - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - ¡Al desactivar los fotogramas clave se eliminarán todos los fotogramas clave actuales! ¿Seguro que quieres hacer esto? - - - - NodeMedia - - - Matrix - Matriz - - - - Texture - Textura - - - - Media - Medios - - - - NodeTexturePassthru - - - - Texture - Textura - - - - Image Output - Salida de imagen - - - - NodeVideoClip - - - - Texture - Textura - - - - NodeView - - - Node Editor - Editor de Nodos - - - - OldEffectNode - - - Save Effect Settings - Guardar Ajustes del Efecto - - - - - Effect XML Settings %1 - Configuración de efectos XML %1 - - - - Save Settings Failed - El guardado de los ajustes a fallado - - - - Failed to open "%1" for writing. - Error al abrir "%1" para escribir. - - - - Load Effect Settings - Cargar Ajustes del Efecto - - - - - Load Settings Failed - La carga de los ajustes ha fallado - - - - Failed to open "%1" for reading. - Error al abrir "%1" para leer. - - - - This settings file doesn't match this effect. - Este archivo de configuración no es valido para este efecto. - - - - OliveGlobal - - - Olive Project %1 - Proyecto de Olive %1 - - - - Auto-recovery - Recuperación Automática - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive no se cerró correctamente y se generó un archivo de recuperación automática. ¿Deseas abrirlo? - - - - Effect already exists - Effect already exists - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - El clip '%1' ya contiene un efecto '%2'. ¿Desea reemplazarlo con el que está pegando o agregarlo como un efecto separado? - - - - Add - Añadir - - - - Replace - Reemplazar - - - - Skip - Omitir - - - - Do this for all conflicts found - Haga esto para todos los conflictos encontrados - - - - Open Project... - Abrir Preyecto... - - - - Missing recent project - No se encuentra este proyecto reciente, si lo ha movido de su ubicación desde que lo guardo por última vez deberá abrirlo manualmente - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - El proyecto '%1' ya no existe. ¿Deseas eliminarlo de la lista de proyectos recientes? - - - - Save Project As... - Guardar Proyecto Como... - - - - Unsaved Project - Proyecto no guardado - - - - This project has changed since it was last saved. Would you like to save it before closing? - ¡ADVERTENCIA! Se han realizado cambios desde la última vez que se guardó. ¿Deseas guardar éstos antes de cerrar? - - - - Import media... - Importar Medios... - - - - All Files - Todos los Archivos - - - - No active sequence - Ninguna Secuaencia Activa - - - - Please open the sequence to perform this action. - Por favor, abra la secuencia para realizar esta acción. - - - - No clips selected - Ningún Clip Seleccionado - - - - Select the clips you wish to auto-cut - Seleccione los clips que desea cortar automáticamente - - - - Missing Project File - No se encuentra el archivo de proyecto - - - - Specified project '%1' does not exist. - El proyecto especificado '%1' no existe. - - - - PanEffect - - - - Pan - Panorámica - - - - Modifying the panning on a stereo audio clip. - Modificar la panorámica en un clip de audio estéreo. - - - - PreferencesDialog - - - Preferences - Preferencias - - - - Default Sequence - Secuencia Predeterminada - - - - Invalid CSS File - Archivo CSS NO válido - - - - CSS file '%1' does not exist. - El archivo CSS '%1' NO existe. - - - - Confirm Reset All Shortcuts - Confirmar restablecer todos los accesos directos - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - ¿Está seguro de que desea restablecer todos los métodos abreviados de teclado a sus valores predeterminados? - - - - Import Keyboard Shortcuts - Importar Accesos Rápidos de Teclado - - - - - Error saving shortcuts - Error al guardar los Accesos Rápidos - - - - Failed to open file for reading - Error al abrir el archivo de lectura - - - - Export Keyboard Shortcuts - Exportar los Accesos Rápidos de Teclado - - - - Export Shortcuts - Exportar Accesos Rápidos - - - - Shortcuts exported successfully - Atajos exportados exitosamente - - - - Failed to open file for writing - Error al abrir el archivo para escribir - - - - Browse for CSS file - Buscar el archivo CSS - - - - Delete All Previews - Eliminar todas las vistas previas - - - - Are you sure you want to delete all previews? - ¿Estás seguro de que deseas eliminar todas las vistas previas? - - - - Previews Deleted - Vistas previas eliminadas - - - - Language: - Idioma: - - - - Default Sequence Settings - Configuración predeterminada -de las secuencias - - - - Add Default Effects to New Clips - Añadir efectos predeterminados a los nuevos clips - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - Ir al principio cuando iniciamos la reproducción -con el cursor al final de la secuencia - - - - Selecting Also Seeks - Al seleccionar un clip -poner el cursor en su inico - - - - Edit Tool Also Seeks - Poner el cursor de reproducción -al inicio de la selección - - - - Edit Tool Selects Links - La selección incluye -los clips vinculados - - - - Seek Also Selects - El cursor de reproducción -selecciona los clips que cruza - - - - Seek to the End of Pastes - Desplazar el cursor al final de lo pegado - - - - Scroll Wheel Zooms - Usar rueda del ratón para hacer zoom - - - - Hold CTRL to toggle this setting - Mantenga presionada la tecla CTRL para cambiar esta configuración - - - - Invert Timeline Scroll Axes - Rueda del ratón desplaza la línea de tiempo - - - - Enable Drag Files to Timeline - Habilitar poder arrastrar archivos a la línea de tiempo - - - - Auto-Scale By Default - Escala automática por defecto - - - - Auto-Seek to Imported Clips - Búsqueda automática de clips importados - - - - Audio Scrubbing - Limpiar o depurar Audio - - - - Drop Files on Media to Replace - Colocar archivos de medios para reemplazar - - - - Enable Hover Focus - Habilitar Enfoque flotante - - - - Ask For Name When Setting Marker - Preguntar por el nombre al insertar un marcador - - - - Appearance - Apariencia - - - - Theme - Tema - - - - Olive Dark (Default) - Olive Oscuro (Por defecto) - - - - Olive Light - Olive Claro - - - - Native - Nativo del sistema - - - - Native (Light Icons) - Nativo con Iconos Claros - - - - Use Native Menu Styling - Usar el estilo de menú nativo - - - - Custom CSS: - CSS Personalizado: - - - - - Browse - Buscar - - - - Image sequence formats: - Secuencia de imágenes. -Formatos: - - - - Audio Recording: - Grabación de audio en: - - - - Mono - Monoaural (1 canal) - - - - Stereo - Estéreo (2 canales) - - - - Effect Textbox Lines: - Efectos de inserción de Texto. -Líneas de los Cuadros de Texto: - - - - (None) - (Nada) - - - - OpenColorIO Config Error - Error de configuración de OpenColorIO - - - - Failed to set OpenColorIO configuration: %1 - Error al establecer la configuración de OpenColorIO: %1 - - - - Invalid OpenColorIO Configuration File - Archivo de configuración de OpenColorIO no válido - - - - You must specify an OpenColorIO configuration file if color management is enabled. - Debe especificar un archivo de configuración de OpenColorIO si la administración de color está habilitada. - - - - OpenColorIO configuration file '%1' does not exist. - El archivo de configuración de OpenColorIO '%1' no existe. - - - - Browse for OpenColorIO configuration - Buscar la configuración OpenColorIO - - - - All previews deleted successfully. You may have to re-open your current project for changes to take effect. - Todas las vistas previas eliminadas con éxito. Es posible que tenga que volver a abrir su proyecto actual para que los cambios surtan efecto. - - - - Thumbnail Resolution: - Resolución miniaturas: - - - - Waveform Resolution: - Resolución Onda de Audio: - - - - Delete Previews - Eliminar vistas previas - - - - Use Software Fallbacks When Possible - Use los recursos de software cuando sea posible - - - - Don't Use Proxies When Exporting - No use proxies al exportar - - - - Use originals instead of proxies when exporting - Use originales en lugar de proxies al exportar - - - - General - General - - - - Behavior - Comportamiento - - - - Memory Usage - Uso de Memoria - - - - Upcoming Frame Queue: - Cargar cola de fotogramas en: - - - - - frames - Fotogramas - - - - - seconds - segundos - - - - Previous Frame Queue: - Cola de fotogramas anteriores en: - - - - Playback - Reproducir - - - - Output Device: - Dispositivo de Salida: - - - - - Default - Por defecto - - - - Input Device: - Dispositivo de Entrada: - - - - Sample Rate: - Frecuencia de muestreo: - - - - Audio - Audio - - - - Enable Color Management - Habilitar la gestión del color - - - - OpenColorIO Config File: - Archivo de configuración de OpenColorIO: - - - - Default Input Color Space: - Espacio de color de entrada predeterminado: - - - - Display: - Monitor: - - - - View: - Ver: - - - - Look: - Mira: - - - - Bit Depth - Profundidad de bits - - - - Playback (Offline): - Reproducción (sin conexión): - - - - Export (Online): - Exportar (sin conexión): - - - - Color Management - Manejo del color - - - - Search for action or shortcut - Buscar acción o atajo - - - - Action - Acción - - - - Shortcut - Atajo - - - - Import - Importar - - - - Export - Exportar - - - - Reset Selected - Restablecer lo Seleccionado - - - - Reset All - Restablecer Todo - - - - Keyboard - Atajos de Teclado - - - - PreviewGenerator - - - Failed to find any valid video/audio streams - Error al encontrar cualquier transmisión de video/audio válida - - - - Could not open file - %1 - No se pudo abrir el archivo -%1 - - - - Could not find stream information - %1 - No se pudo encontrar la información de la secuencia -%1 - - - - Project - - - New - Nuevo - - - - Open Project - Abrir Proyecto - - - - Save Project - Guardar Proyecto - - - - Undo - Deshacer los cambiós - - - - Redo - Reacer los cambios - - - - Tree View - Ver en árbol - - - - Icon View - Ver como iconos - - - - List View - Ver en modo lista - - - - Search media, markers, etc. - Buscar archivos multimedia, marcas, etc. - - - - Project - Proyecto - - - - - No active sequence - Sin secuencia activa - - - - No sequence is active, please open the sequence you want to replace clips from. - Ninguna secuencia está activa, abra la secuencia desde la que desea reemplazar los clips. - - - - Active sequence selected - Secuencia activa seleccionada - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - No puede insertar una secuencia en sí misma, por lo que no habrá clips de este medio en esta secuencia. - - - - Rename '%1' - Renombrar '%1' - - - - Enter new name: - Introduzca un nuevo nombre: - - - - Delete media in use? - ¿Realmente quieres borrar este archivo que está en uso? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - El medio '%1' se usa actualmente en '%2'. Al eliminarlo se eliminarán todas las instancias en la secuencia. ¿Seguro que quieres hacer esto? - - - - Skip - Saltar/Omitir - - - - No sequence is active, please open the sequence you want to delete clips from. - Ninguna secuencia está activa, abra la secuencia de la que desea eliminar los clips. - - - - Sequence - Secuencia - - - - Replace '%1' - Reemplazar '%1' - - - - - All Files - Todos los archivos - - - - Import a Project - Importar un proyecto - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" es un archivo de proyecto de Olive. Se fusionará con este proyecto. ¿Desea continuar? - - - - Image sequence detected - Secuencia de imágenes detectada - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - El archivo '%1' parece ser parte de una secuencia de imágenes. ¿Te gustaría importarlo como tal? - - - - Import media... - Importar Medios... - - - - ProjectModel - - - Sequence %1 - Secuencia %1 - - - - Import a Project - Importar un proyecto - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" es un archivo de proyecto de Olive. Se fusionará con este proyecto. ¿Desea continuar? - - - - Image sequence detected - Secuencia de Imágenes Detectada - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - El archivo '%1' parece ser parte de una secuencia de imágenes. ¿Te gustaría importarlo como tal? - - - - ProxyDialog - - - Create Proxy - Crear Proxy - - - - Proxy - Proxy - - - - Dimensions: - Dimensiones: - - - - Same Size as Source - Mismo tamaño que la fuente - - - - Half Resolution (1/2) - Resolución a la mitad (1/2) - - - - Quarter Resolution (1/4) - Resolución a un cuarto (1/4) - - - - Eighth Resolution (1/8) - Resolución a un octavo (1/8) - - - - Sixteenth Resolution (1/16) - Resolución a un dieciseisavo (1/16) - - - - Format: - Formato: - - - - ProRes HQ - ProRes HQ - - - - Location: - Localización: - - - - Same as Source (in "%1" folder) - Igual que la fuente (en la carpeta "%1") - - - - Proxy file exists - El archivo proxy existe - - - - The file "%1" already exists. Do you wish to replace it? - El archivo "%1" ya existe. ¿Desea reemplazarlo? - - - - Custom Location - Ubicación Personalizada - - - - ProxyGenerator - - - Finished generating proxy for "%1" - Terminado de generar el proxy para "%1" - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - Reemplazar clips usando "%1" - - - - Select which media you want to replace this media's clips with: - Seleccione el medio con el que desea reemplazar los clips de este medio por: - - - - Keep the same media in-points - Mantener los mismos puntos de entrada de medios - - - - Replace - Reemplazar - - - - Cancel - Cancelar - - - - No media selected - Ningún medio seleccionado - - - - Please select a media to replace with or click 'Cancel'. - Seleccione un medio para reemplazar o haga clic en "Cancelar". - - - - Same media selected - Mismo medio seleccionado - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Seleccionó el mismo medio que está reemplazando. Por favor, seleccione uno diferente o haga clic en 'Cancelar'. - - - - Folder selected - Carpeta Seleccionada - - - - You cannot replace footage with a folder. - No puedes reemplazar las imágenes con una carpeta. - - - - Active sequence selected - Secuencia activa seleccionada - - - - You cannot insert a sequence into itself. - No puedes insertar una secuencia en sí misma. - - - - RichTextEffect - - - Text - Texto - - - - Padding - Márgenes - - - - Position - Posición - - - - Vertical Align: - Alineación Vertical: - - - - Top - Arriba - - - - Center - Centro - - - - Bottom - Abajo - - - - Auto-Scroll - Desplazamiento automático - - - - Off - Apagado - - - - Up - Arriba - - - - Down - Abajo - - - - Left - Izquierda - - - - Right - Derecha - - - - Shadow - Sombra - - - - Shadow Color - Color de la Sombra - - - - Shadow Angle - Angulo de la Sombra - - - - Shadow Distance - Distancia de la Sombra - - - - Shadow Softness - Suavizado de la Sombra - - - - Shadow Opacity - Opacidad de la Sombra - - - - Rich Text - Texto enriquecido - - - - Render - Renderizar (Calcular) - - - - Render formatted rich text over a clip. - Renderizar texto enriquecido formateado sobre un clip. + + Rename Item + Sequence - - %1 (copy) - %1 (copiar) + + %1 FPS + - ShakeEffect + Stream - - Intensity - Intensidad + + %1: Audio - %2 Channels, %3Hz + - - Rotation - Rotación + + %1: Unknown + - - Frequency - Frecuencia + + %1: Image - %2x%3 + - - Shake - Temblor/Movimiento - - - - Distort - Distorsionar - - - - Simulate a camera shake movement. - Simular movimiento de la cámara. + + %1: Video - %2x%3 + - SolidEffect + TimelineViewBlockItem - - Type - Tipo + + %1 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Solid Color - Color Sólido + + Bars + Barras - - SMPTE Bars - Barras SMPTE - - - - Checkerboard - Tablero de damas - - - - Opacity - Opacidad - - - - Color - Color - - - - Checkerboard Size - Tamaño de los cuadros - - - + Solid - Sólido + Sólido - - Render - Renderizar/Calcular - - - - Render a solid color over this clip. - Renderiza un color sólido sobre este clip. - - - - SourcesCommon - - - Import... - Impotar... - - - - New - Nuevo - - - - View - Ver - - - - Tree View - Vista en árbol - - - - Icon View - Vista de Icono - - - - Show Toolbar - Mostrar la barra de herramientas - - - - Show Sequences - Mostrar Secuencias - - - - Replace/Relink Media - Reemplazar/Revincular Medios - - - - Reveal in Explorer - Revelar en el explorador - - - - Reveal in Finder - Revelar en el buscador - - - - Reveal in File Manager - Revelar en el administrador de archivos - - - - Replace Clips Using This Media - Reemplazar clips utilizando este medio - - - - Create Sequence With This Media - Crear secuencia con este medio - - - - Duplicate - Duplicar - - - - Delete All Clips Using This Media - Eliminar todos los clips que utilizan este medio - - - - Proxy - Trabajar con Proxy - - - - Generating proxy: %1% complete - Generando proxy: %1% completado - - - - Create/Modify Proxy - Crear/Modificar Proxy - - - - Create Proxy - Crear Proxy - - - - Modify Proxy - Modificar Proxy - - - - Restore Original - Restaurar Original - - - - Delete - Eliminar - - - - Preview in Media Viewer - Previsualizar en el visor de medios - - - - Properties... - Propiedades... - - - - Replace '%1' - Reemplazar '%1' - - - - All Files - Todos los archivos - - - - Replace Media - Reemplazar medios - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Has colocado un archivo en '%1'. ¿Te gustaría reemplazarlo con el archivo caído? - - - - Delete proxy - Eliminar Proxy - - - - Would you like to delete the proxy file "%1" as well? - ¿Desea eliminar el archivo proxy "%1" también? - - - - SpeedDialog - - - Speed/Duration - Velocidad/Duración - - - - Speed: - Velocidad: - - - - Frame Rate: - Velocidad -Fotogramas: - - - - Duration: - Duración: - - - - Reverse - Invertir Dirección - - - - Maintain Audio Pitch - Mantener el Tono del Audio - - - - Ripple Changes - Desplazar clips contiguos - - - - TextEditDialog - - - Edit Text - Editar texto - - - - Thin - Fino - - - - Extra Light - Extra Fino - - - - Light - Suave - - - - Normal - Normal - - - - Medium - Medio - - - - Demi Bold - Semi Negrita - - - - Bold - Negrita - - - - Extra Bold - Extra Negrita - - - - Black - Grueso - - - - TextEditEx - - - Edit Text - Editar Texto - - - - &Edit Text - &Editar Texto - - - - TextEffect - - - - Text - Texto - - - - Font - Fuente - - - - Size - Tamaño - - - - Color - Color - - - - Horizontal Alignment - Alineación Horizontal - - - - Left - Izquierda - - - - - Center - Centrado - - - - Right - Derecha - - - - Justify - Justificado - - - - Vertical Alignment - Alineación Vertical - - - - Top - Arriba - - - - Bottom - Abajo - - - - Alignment - Alineación - - - - Word Wrap - Ajuste de línea - - - - Padding - Márgenes - - - - Position - Posición - - - - Outline - Contorno - - - - Outline Color - Color Contorno - - - - Outline Width - Ancho del Contorno - - - - Shadow - Sombra - - - - Shadow Color - Color Sombra - - - - Shadow Angle - Ángulo Sombra - - - - Shadow Distance - Distancia Sombra - - - - Shadow Softness - Suavidad Sombra - - - - Shadow Opacity - Opacidad Sombra - - - - Sample Text - Texto de ejemplo - - - - Render - Renderizar - - - - Generate simple text over this clip - Generar texto simple sobre este clip - - - - TimecodeEffect - - - - Timecode - Código de Tiempo - - - - Sequence - Secuencia - - - - Media - Clip - - - - Scale - Escala - - - - Color - Color - - - - Background Color - Color del Fondo - - - - Background Opacity - Opacidad del Fondo - - - - Offset - Compensar x-y - - - - Prepend - Anteponer - - - - Render - Renderizar - - - - Render the media or sequence timecode on this clip. - Renderice el código de tiempo de los medios, o la secuencia, en este clip. - - - - Timeline - - - Timeline: - Línea de Tiempo: - - - - Nested Sequence - Secuencia Anidada - - - - Title... - Título... - - - - Solid Color... - Color Sólido... - - - - Bars... - Barras... - - - - Tone... - Tono... - - - - Noise... - Ruido... - - - - Unsaved Project - Proyecto sin guardar - - - - You must save this project before you can record audio in it. - Debe guardar este proyecto antes de poder grabar audio en él. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Haga clic en la línea de tiempo donde desea iniciar la grabación (arrastre para limitar la grabación a un determinado período de tiempo) - - - - Video Transitions - Transiciones de Vídeo - - - - Audio Transitions - Transiciones de Audio - - - - Timeline: %1 - Linea de Tiempo: %1 - - - - (none) - (Ninguno) - - - - Pointer Tool - Puntero de Selección/Edición/Mover Clips - - - - Edit Tool - Herramienta de Selección - - - - Ripple Tool - Herramienta para Enrrollar/Desenrrollar - - - - Razor Tool - Herramienta de corte - - - - Slip Tool - Deslizar clip sin desplazar - - - - Slide Tool - Desplazar clip afectando a los clips contiguos - - - - Hand Tool - Herramienta de Mano - - - - Transition Tool - Herramienta para Inserción de Transiciones - - - - Snapping - Imantar - - - - Zoom In - Acercar (Zoom) - - - - Zoom Out - Alejar (Zoom) - - - - Record audio - Grabar Audio - - - - Add title, solid, bars, etc. - Añadir clip de:. - - - - Effect already exists - El efecto ya existe - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - El clip '%1' ya contiene el efecto '%2'. ¿Desea reemplazarlo con el pegado o agregarlo como un efecto separado? - - - - Add - Añadir - - - - Replace - Reemplazar - - - - Skip - Omitir - - - - Do this for all conflicts found - Haga esto para todos los conflictos encontrados - - - - TimelineHeader - - - Center Timecodes - Centrar Código de Tiempo - - - - TimelineLabel - - - Rename Track - Renombrar Pista - - - - Enter the new name for this track - Introduzca el nuevo nombre para esta pista - - - - TimelineView - - - &Undo - &Deshacer - - - - &Redo - &Rehacer - - - - R&ipple Delete Empty Space - &Eliminar espacio vacío - - - - Sequence Settings - Ajustes de la Secuencia - - - - &Speed/Duration - Cambiar &Velocidad/Duración - - - - Auto-Cut Silence - Auto Cortar en los Silencios - - - - Auto-S&cale - Escala Aut&omática - - - - &Reveal in Project - &Revelar en Proyecto - - - - Properties - Propiedades - - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Inicio: %2 -Final: %3 -Duración: %4 - - - - Error - Error - - - - Couldn't locate media wrapper for sequence. - No se pudo localizar el contenedor de medios para la secuencia. - - - + Title - Título + Título - - Solid Color - Color Sólido - - - - Bars - Barras - - - + Tone - Tono + Tono - - Noise - Ruido - - - - Duration: - Duración: + + Unknown + - TimelineWidget + VideoParams - - &Undo - &Deshacer - - - - &Redo - &Rehacer - - - - Sequence Settings - Ajustes de la Secuencia - - - - &Speed/Duration - Cambiar &Velocidad/Duración - - - - &Reveal in Project - &Revelar en Proyecto - - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Inicio: %2 -Final: %3 -Duración: %4 - - - - R&ipple Delete Empty Space - &Eliminar espacio vacío - - - - Auto-Cut Silence - Auto Cortar en los Silencios - - - - Auto-S&cale - Escala Aut&omática - - - - Properties - Propiedades - - - - Error - Error - - - - Couldn't locate media wrapper for sequence. - No se pudo localizar el contenedor de medios para la secuencia. - - - - Title - Título - - - - Solid Color - Color Sólido - - - - Bars - Barras - - - - Tone - Tono - - - - Noise - Ruido - - - - Duration: - Duración: - - - - ToneEffect - - - Type - Tipo - - - - Sine - Sinusoidal - - - - Frequency - Frecuencia - - - - Amount - Cantidad - - - - Mix - Mezclar - - - - Tone - Tono - - - - Generate a sine wave tone to mix into this clip's audio. - Genera un tono de onda sinusoidal para mezclarlo con el audio de este clip. - - - - Track - - - Video %1 - Vídeo %1 - - - - Audio %1 - Audio %1 - - - - Subtitle %1 - Subtítulo %1 - - - - Unknown %1 - Desconocido %1 - - - - TransformEffect - - - Position - Posición - - - - Scale - Escala - - - - Uniform Scale - Escala Uniforme - - - - Rotation - Rotación - - - - Anchor Point - Punto de Ancla - - - - Opacity - Opacidad - - - - Transform - Transformación - - - - Distort - Distorsionar - - - - Transform the position, scale, and rotation of this clip. - Transformar la posición, escala y rotación de este clip. - - - - Blend Mode - Modo de Fusión - - - - Normal - Normal - - - - Transition - - - Length - Longitud - - - - UpdateNotification - - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - Una actualización está disponible en el sitio web de Olive. Visita www.olivevideoeditor.org para descargarla. - - - - Invalid transition - Transición No Válida - - - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - Ningún candidato para la transición '%1'. Esta transición puede estar corrupta. Intenta volver a instalarla o reinstala Olive. - - - - VSTHost - - - - Error loading VST plugin - Error al cargar el Plugin VST - - - - Failed to load VST plugin "%1": %2 - Falló la carga del complemento VST "%1":%2 - - - - Failed to locate entry point for dynamic library. - Error al localizar el punto de entrada para la librería dinámica. - - - - VST Error - VST Error - - - - Plugin's magic number is invalid - El número mágico de Plugin no es válido - - - - Plugin - Plugin - - - - Interface - Interface - - - - Show - Mostrar - - - - VST Plugin 2.x - VST Plugin 2.x - - - - Use a VST 2.x plugin on this clip's audio. - Utilice un Plugin VST 2.x en el audio de este clip. - - - - VST Plugin - Plugin VST - - - - Viewer - - - Viewer: %1 - Visionar: %1 - - - - Failed to import recorded file - No se pudo importar el archivo grabado - - - - An error occurred trying to import the recorded audio - Se ha producido un error al intentar importar el audio grabado - - - - (none) - (ninguno) - - - - Drag video only - Sólo arrastrar Vídeo - - - - Drag audio only - Sólo arrastrar Audio - - - - Sequence Viewer: %1 - Visor de secuencia:%1 - - - - Media Viewer: %1 - Visor de Medios: %1 - - - - Sequence Viewer - Visor de Secuencias - - - - Media Viewer - Visor de Medios - - - - ViewerWidget - - - Save Frame as Image... - Guardar fotograma como imagen... - - - - Show Fullscreen - Pantalla Completa - - - - Disable - Desconectar - - - - Screen %1: %2x%3 - Pantalla %1: %2x%3 - - - - Zoom - Zoom - - - - Fit - Ajuste Automático - - - - Custom - Personalizado - - - - Close Media - Cerrar Medios - - - - Save Frame - Guardar Fotograma - - - - Viewer Zoom - Visor de Zoom - - - - Set Custom Zoom Value: - Establecer valor de zoom personalizado: - - - - ViewerWindow - - - Exit Fullscreen - Salir de la Pantalla Completa - - - - VoidEffect - - - (unknown) - (Desconocido) - - - - Missing Effect - Efecto faltante - - - - VolumeEffect - - - - Volume - Volumen - - - - Adjust the volume of this clip's audio - Ajusta el volumen de los clips de audio - - - - bitdepths - - + 8-bit - 8-bit + 8-bit - + 16-bit Integer - 16-bit Entero + 16-bit Entero - + Half-Float (16-bit) - Medio-Coma-Flotante (16-bit) + Medio-Coma-Flotante (16-bit) - + Full-Float (32-bit) - Máximo-Coma-Flotante (32-bit) + Máximo-Coma-Flotante (32-bit) + + + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + - Effect + main - - Invalid effect - Efecto no válido + + Show this help text + - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - Ningún candidato para el efecto '%1'. Este efecto parece estar corrupto. Pruebe a reinstalarlo o reinstale Olive. + + Show application version + - - Save Effect Settings - Guardar los ajustes del efecto + + Start in full-screen mode + - - - Effect XML Settings %1 - Ajustes XML del efecto %1 + + Export only (No GUI) + - - Save Settings Failed - Falló guardar los ajustes + + Override language with file + - - Failed to open "%1" for writing. - Falló la apertura "%1" para escritura. + + qm-file + - - Load Effect Settings - Cargar los ajuste del efecto - - - - - Load Settings Failed - Falló la carga de los ajustes - - - - Failed to open "%1" for reading. - Falló la apertura "%1" para lectura. - - - - This settings file doesn't match this effect. - Estos ajustes no son para este efecto. + + Project to open on startup + - EffectRow + olive::AboutDialog - - Disable Keyframes - Desactivar fotogramas clave + + About %1 + - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - ¡Desconectar los fotogramas clave los eliminará! ¿Relamente los quieres eliminar? + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive es un editor de vídeo no lineal. Esta aplicación es gratuita y está protegida bajo la licencia GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + El equipo de Olive está obligado a informar a los usuarios que el código fuente de la aplicación esta disponible para su descarga desde su sitio web. + + + + olive::ActionSearch + + + Search for action... + Búsqueda de acción... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Audio + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + + Length + Longitud + + + + Media In + + + + + Enabled + + + + + Speed + + + + + olive::BlurFilterNode + + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + + + + + olive::ClipBlock + + + Clip + + + + + A time-based node that represents a media source. + + + + + Buffer + + + + + olive::ColorDialog + + + Select Color + + + + + olive::ColorSpaceChooser + + + Color Management + Manejo del color + + + + Input: + + + + + Color Space: + Espacio de color: + + + + Display: + Monitor: + + + + View: + Ver: + + + + Look: + Mira: + + + + (None) + (Nada) + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + Nueva Carpeta + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + Guardar Proyecto + + + + + Error + Error + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + Secuencia %1 + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + Abrir Proyecto + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + Fundido Cruzado + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Lineal + + + + Bezier + Bézier + + + + Hold + Mantener + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Avanzado + + + + Pixel + + + + + Pixel Format: + Formato de Píxel: + + + + Performance + + + + + Threads: + Hilos (Threads): + + + + olive::ExportAudioTab + + + Codec: + Codificación (Códec): + + + + Sample Rate: + Frecuencia de muestreo: + + + + Channel Layout: + + + + + Format: + Formato: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + Nombre de Archivo: + + + + Browse for exported file filename + + + + + Preset: + Preestablecidos: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Rango: + + + + Entire Sequence + Secuencia entera + + + + In to Out + De entrada a salida + + + + Format: + Formato: + + + + Export Video + + + + + Export Audio + + + + + Video + Vídeo + + + + Audio + Audio + + + + + Export + Exportar + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Ancho: + + + + Height: + Alto: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + + Fit + Ajuste Automático + + + + Stretch + + + + + Crop + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + Relación de aspecto de píxeles: + + + + Interlacing: + Entrelazado: + + + + Quality: + + + + + Codec + + + + + Codec: + Codificación (Códec): + + + + Advanced + Avanzado + + + + olive::FloatSlider + + + %1 dB + + + + + %1% + + + + + olive::FootagePropertiesDialog + + + "%1" Properties + "%1" Propiedades + + + + Name: + + + + + Tracks: + Pistas: + + + + olive::FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + Buscar + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Tamaño del archivo de destino (MB): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Ninguno (Progresivo) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Lineal + + + + Hold + Mantener + + + + Bezier + Bézier + + + + olive::KeyframeViewBase + + + Linear + Lineal + + + + Bezier + Bézier + + + + Hold + Mantener + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + &Guardar Proyecto + + + + Save Project &As + G&uardar Proyecto Como + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + (Nada) + + + + &File + &Archivo + + + + &New + &Nuevo + + + + &Open Project + &Abrir Proyecto + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &Importar... + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + &Cerrar la aplicación + + + + &Edit + &Editar + + + + Insert + + + + + Overwrite + + + + + Select &All + Seleccion&ar Todo + + + + Deselect All + Deseleccionar Todo + + + + Ripple to In Point + Extraer desde el punto de inicio del clip + + + + Ripple to Out Point + Extraer desde el punto final del clip + + + + Edit to In Point + Eliminar desde el punto de inicio del clip + + + + Edit to Out Point + Eliminar desde el punto final del clip + + + + Delete In/Out Point + Eliminar lo comprendido entre los puntos de Entrada/Salida + + + + Ripple Delete In/Out Point + Extraer lo comprendido entre los puntos de Entrada/Salida + + + + Set/Edit Marker + Establecer/Editar Marcador + + + + &View + &Ver + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + Aumentar la altura de la pista + + + + Decrease Track Height + Disminuir la altura de la pista + + + + Toggle Show All + Alternar Mostrar Todo + + + + Full Screen + Pantalla completa + + + + Full Screen Viewer + Visor a pantalla completa + + + + &Playback + &Reproducción + + + + Go to Start + Ir al inicio + + + + Previous Frame + Fotograma anterior + + + + Play/Pause + Reproducir/Pausar + + + + Play In to Out + Reproducir desde la marca de entrada a la marca de salida + + + + Next Frame + Siguiente fotograma + + + + Go to End + Ir al final + + + + Go to Previous Cut + Ir al corte anterior + + + + Go to Next Cut + Ir al siguiente corte + + + + Go to In Point + Ir al punto de entrada + + + + Go to Out Point + Ir al punto de salida + + + + Shuttle Left + Reproducir hacia la Izquierda (Inversa) + + + + Shuttle Stop + Parar la Reproducción + + + + Shuttle Right + Reproducir hacia la Derecha (Normal) + + + + Loop + Bucle (Loop) + + + + &Sequence + &Sequencia + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + Maximizar Panel + + + + Lock Panels + Bloquear Paneles + + + + Reset to Default Layout + Restaurar valores por defecto de la interfaz + + + + &Tools + &Herramientas + + + + Pointer Tool + Puntero de Selección/Edición/Mover Clips + + + + Edit Tool + Herramienta de Selección + + + + Ripple Tool + Herramienta para Enrrollar/Desenrrollar + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + Deslizar clip sin desplazar + + + + Slide Tool + Desplazar clip afectando a los clips contiguos + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + Herramienta para Inserción de Transiciones + + + + Enable Snapping + Habilitar Imán de Ajuste + + + + Preferences + Preferencias + + + + &Help + A&yuda + + + + A&ction Search + &Buscar + + + + Send &Feedback... + + + + + &About... + &Acerca de... + + + + olive::MainStatusBar + + + Welcome to %1 %2 + Bienvenido a %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + Ver + + + + Look + + + + + (None) + (Nada) + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + Añadir + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + Posición + + + + Rotation + Rotación + + + + Scale + Escala + + + + Uniform Scale + Escala Uniforme + + + + Anchor Point + Punto de Ancla + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + &Proyecto + + + + &Sequence + &Sequencia + + + + &Folder + &Carpeta + + + + Cu&t + + + + + Cop&y + &Copiar + + + + &Paste + &Pegar + + + + Paste Insert + Insertar (Pegar) + + + + Duplicate + Duplicar + + + + Delete + + + + + Ripple Delete + Extraer Selección (Elimina el hueco) + + + + Split + Dividir clips + + + + Set In Point + Establecer punto de entrada + + + + Set Out Point + Establecer punto de salida + + + + Reset In Point + Resetear punto de entrada + + + + Reset Out Point + Resetear punto de salida + + + + Clear In/Out Point + Limpiar puntos de Entrada/Salida + + + + Add Default Transition + Añadir Transición predeterminada + + + + Link/Unlink + Unir/Separar clips seleccionados + + + + Enable/Disable + Habilitar/Deshabilitar clips seleccionados + + + + Nest + Anidar selección en una secuencia + + + + Frames + Fotogramas + + + + Drop Frame + Descartar fotograma (Drop Frame) + + + + Non-Drop Frame + No descartar fotograma (Non-Drop Frame) + + + + Milliseconds + Milisegundos + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + General + + + + Math + + + + + Color + Color + + + + Filter + + + + + Timeline + Línea de Tiempo + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + Editor de Nodos + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + Color + + + + Matrix + Matriz + + + + Text + Texto + + + + Font + Fuente + + + + File + + + + + Texture + Textura + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Tipo + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + + (unknown) + (Desconocido) + + + + olive::NodeTreeView + + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + Añadir + + + + olive::PanNode + + + + Pan + Panorámica + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + + + + + (multiple) + (múltiple) + + + + olive::PathWidget + + + Browse + Buscar + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + Color + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + Color + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + Tema + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + Dispositivo de Salida: + + + + Input Device: + Dispositivo de Entrada: + + + + Sample Rate: + Frecuencia de muestreo: + + + + Audio Recording: + Grabación de audio en: + + + + Mono + + + + + Stereo + + + + + Refresh Devices + + + + + Please wait... + + + + + Default + Por defecto + + + + olive::PreferencesBehaviorTab + + + Behavior + Comportamiento + + + + General + General + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Audio + + + + Enable audio scrubbing + + + + + Timeline + Línea de Tiempo + + + + Auto-Seek to Imported Clips + Búsqueda automática de clips importados + + + + Edit Tool Also Seeks + Poner el cursor de reproducción +al inicio de la selección + + + + Edit Tool Selects Links + La selección incluye +los clips vinculados + + + + Enable Drag Files to Timeline + Habilitar poder arrastrar archivos a la línea de tiempo + + + + Invert Timeline Scroll Axes + Rueda del ratón desplaza la línea de tiempo + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + El cursor de reproducción +selecciona los clips que cruza + + + + Seek to the End of Pastes + Desplazar el cursor al final de lo pegado + + + + Selecting Also Seeks + Al seleccionar un clip +poner el cursor en su inico + + + + Playback + Reproducir + + + + Ask For Name When Setting Marker + Preguntar por el nombre al insertar un marcador + + + + Automatically rewind at the end of a sequence + + + + + Project + Proyecto + + + + Drop Files on Media to Replace + Colocar archivos de medios para reemplazar + + + + Nodes + + + + + Add Default Effects to New Clips + Añadir efectos predeterminados a los nuevos clips + + + + Auto-Scale By Default + Escala automática por defecto + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + Preferencias + + + + General + General + + + + Appearance + Apariencia + + + + Behavior + Comportamiento + + + + Disk + + + + + Audio + Audio + + + + Keyboard + Atajos de Teclado + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + Idioma: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + Buscar acción o atajo + + + + Action + Acción + + + + Shortcut + Atajo + + + + Import + Importar + + + + Export + Exportar + + + + Reset Selected + Restablecer lo Seleccionado + + + + Reset All + Restablecer Todo + + + + Confirm Reset All Shortcuts + Confirmar restablecer todos los accesos directos + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + ¿Está seguro de que desea restablecer todos los métodos abreviados de teclado a sus valores predeterminados? + + + + Import Keyboard Shortcuts + Importar Accesos Rápidos de Teclado + + + + + Error saving shortcuts + Error al guardar los Accesos Rápidos + + + + Failed to open file for reading + Error al abrir el archivo de lectura + + + + Export Keyboard Shortcuts + Exportar los Accesos Rápidos de Teclado + + + + Export Shortcuts + Exportar Accesos Rápidos + + + + Shortcuts exported successfully + Atajos exportados exitosamente + + + + Failed to open file for writing + Error al abrir el archivo para escribir + + + + olive::ProgressDialog + + + Cancel + Cancelar + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &Nuevo + + + + &Import... + &Importar... + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + Revelar en el explorador + + + + Reveal in Finder + Revelar en el buscador + + + + Reveal in File Manager + Revelar en el administrador de archivos + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + Proyecto + + + + (none) + + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + Espacio de color de entrada predeterminado: + + + + Browse + Buscar + + + + Color Management + Manejo del color + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + Error de configuración de OpenColorIO + + + + Failed to set OpenColorIO configuration: %1 + Error al establecer la configuración de OpenColorIO: %1 + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + Buscar la configuración OpenColorIO + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + Abrir Proyecto + + + + Save Project + Guardar Proyecto + + + + Undo + Deshacer los cambiós + + + + Redo + + + + + Search media, markers, etc. + Buscar archivos multimedia, marcas, etc. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + Nombre + + + + Duration + Duración + + + + Rate + Velocidad + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + Negrita + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + + + + + New Sequence + Nueva Secuencia + + + + Editing "%1" + Edición "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Vídeo + + + + Width: + Ancho: + + + + Height: + Alto: + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + Relación de aspecto de píxeles: + + + + Interlacing: + Entrelazado: + + + + Audio + Audio + + + + Sample Rate: + Frecuencia de muestreo: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + Visor de Secuencias + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + Sólido + + + + Generate a solid color. + + + + + Color + Color + + + + olive::StringSlider + + + (none) + + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + Color + + + + Radius + + + + + Opacity + Opacidad + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + Texto de ejemplo + + + + + Text + Texto + + + + Generate rich text. + + + + + Font + Fuente + + + + Font Size + + + + + Color + Color + + + + Vertical Align + + + + + Top + Arriba + + + + Center + + + + + Bottom + Abajo + + + + olive::TimeBasedPanel + + + (none) + + + + + olive::TimeBasedWidget + + + Set Marker + Establecer Marca + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + Línea de Tiempo + + + + olive::TimelineWidget + + + + Properties + Propiedades + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + Puntero de Selección/Edición/Mover Clips + + + + Edit Tool + Herramienta de Selección + + + + Ripple Tool + Herramienta para Enrrollar/Desenrrollar + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + Deslizar clip sin desplazar + + + + Slide Tool + Desplazar clip afectando a los clips contiguos + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + Herramienta para Inserción de Transiciones + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + Vídeo %1 + + + + Audio %1 + Audio %1 + + + + Subtitle %1 + Subtítulo %1 + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Lineal + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + Sinusoidal + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + Vídeo + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + Entrelazado: + + + + Color Space: + Espacio de color: + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + Textura + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + Error + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + Zoom + + + + Fit + Ajuste Automático + + + + %1% + + + + + Full Screen + Pantalla completa + + + + Screen %1: %2x%3 + Pantalla %1: %2x%3 + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + Apagado + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + + Volume + Volumen + + + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/fr_FR.ts b/app/ts/fr_FR.ts index 19af75204..730dd10ce 100644 --- a/app/ts/fr_FR.ts +++ b/app/ts/fr_FR.ts @@ -2,4092 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive est un logiciel de montage non-linéaire. Ce logiciel est libre et protégé par la licence GNU GPL. - - - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - L'équipe d'Olive vous informe que le code source d'Olive est disponible au téléchargement sur son site Web. - - - - ActionSearch - - - Search for action... - Rechercher une action… - - - - AdvancedVideoDialog - - - Advanced Video Settings - Paramètres vidéo avancés - - - - Pixel Format: - Format de pixel : - - - - Threads: - - - - - Audio - - Audio - Audio - - - Recording - Enregistrement audio - - - - %1 Audio + + %1 Hz - - Recording %1 - - - - - AudioNoiseEffect - - - Amount - Quantité - - - - Mix - Mélanger - - - - AutoCutSilenceDialog - - - Cut Silence - - - - - Attack Threshold: - - - - - Attack Time: - - - - - Release Threshold: - - - - - Release Time: - - - - - Cacher - - - - Could not open %1 - %2 - - - - - ChannelLayoutName - - - Invalid - Invalide - - - + Mono - Mono + Mono - + Stereo - Stéréo - - - - ClipPropertiesDialog - - - "%1" Properties - "%1" Propriétés + Stéréo - - Multiple Clip Properties - + + 2.1 + 144p {2.1?} - - Name: - Nom : + + 5.1 + 144p {5.1?} - - Duration: - Durée : + + 7.1 + 144p {7.1?} - - (multiple) + + Unknown (0x%1) - CollapsibleWidget + Config - - <untitled> - &lt;Sans titre&gt; - - - - ColorButton - - - Set Color - Définir la couleur - - - - CornerPinEffect - - - Top Left - En haut à gauche - - - - Top Right - En haut à droite - - - - Bottom Left - En bas à gauche - - - - Bottom Right - En bas à droite - - - - Perspective - Perspective - - - - DebugDialog - - - Debug Log - Journal de débogage - - - - DemoNotice - - - - Welcome to Olive! - Bienvenue dans Olive ! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive est un logiciel libre et open-source distribué sous la licence GNU GPL. Si vous avez payé pour ce logiciel, vous avez été victime d'un scam. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Ce logiciel est actuellement en ALPHA, ce qui signifie qu'il a de grandes chances de planter, d'avoir des bugs ou de manquer de certaines fonctions. Nous n'offrons aucune garantie, utilisez-le à vos propres risques. Merci de nous rapporter tout bug ou demande d'ajout d'une fonctionnalité à %1 - - - - Thank you for trying Olive and we hope you enjoy it! - Merci d'utiliser Olive, nous espérons que vous l'apprécierez ! - - - - Effect - - - Invalid effect - Effet invalide - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - Aucun candidat pour l'effet '%1'. C'est effet est peut-être corrompu. Essayez de le réinstaller, ou de réinstaller Olive. - - - Cu&t - &Couper - - - &Copy - Cop&ier - - - Move &Up - Déplacer vers le &haut - - - Move &Down - Déplacer vers le &bas - - - D&elete - &Supprimer - - - Load Settings From File - Charger les paramètres - - - Save Settings to File - Enregistrer les paramètres - - - - Save Effect Settings - Enregistrer les paramètres d'effet - - - - - Effect XML Settings %1 - Paramètres d'effet XML %1 - - - - Save Settings Failed - L'enregistrement des paramètres a échoué - - - - Failed to open "%1" for writing. - Impossible d'écrire dans "%1". - - - - Load Effect Settings - Charger les paramètres d'effet - - - - - Load Settings Failed - Le chargement des paramètres a échoué - - - - Failed to open "%1" for reading. - Impossible de lire "%1". - - - - This settings file doesn't match this effect. - Ce fichier de paramètre ne correspond pas à cet effet. - - - - EffectControls - - - Effects: - Effets : - - - &Paste - C&oller - - - - (none) - (aucun) - - - - Add Video Effect - Ajouter un effet vidéo - - - - VIDEO EFFECTS - EFFETS VIDÉO - - - - Add Video Transition - Ajouter une transition vidéo - - - - Add Audio Effect - Ajouter un effet audio - - - - AUDIO EFFECTS - EFFETS AUDIO - - - - Add Audio Transition - Ajouter une transition audio - - - (Multiple clips selected) - (Clips multiples sélectionnés) - - - - EffectRow - - - Disable Keyframes - Désactiver les images-clés - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Désactiver les images-clés supprimera toutes les images-clés courantes. Êtes-vous sûr⋅e de vouloir cela ? - - - - EffectUI - - - %1 (Opening) + + Error loading settings - - %1 (Closing) - - - - - %1 (multiple) - - - - - Cu&t - &Couper - - - - &Copy - Cop&ier - - - - Move &Up - Déplacer vers le &haut - - - - Move &Down - Déplacer vers le &bas - - - - D&elete - &Supprimer - - - - Load Settings From File - Charger les paramètres - - - - Save Settings to File - Enregistrer les paramètres - - - - EmbeddedFileChooser - - - File: - Fichier : - - - - ExportDialog - - - Export "%1" - Exporter "%1" - - - - Unknown codec name %1 - Nom de codec inconnu %1 - - - - Export Failed - L'export a échoué - - - - Export failed - %1 - Export échoué - %1 - - - - Invalid dimensions - Dimensions invalides - - - - Export width and height must both be even numbers/divisible by 2. - La largeur et la hauteur d'export doivent être des nombres pairs/divisibles par 2. - - - - Invalid codec - Codec invalide - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Impossible de déterminer les paramètres de sortie pour le codec sélectionné. Ceci est un bug, merci de contacter les développeurs. - - - - Invalid format - Format invalide - - - - Couldn't determine output format. This is a bug, please contact the developers. - Impossible de déterminer le format de sortie. Ceci est un bug, merci de contacter les développeurs. - - - - Export Media - Exporter le média - - - - %p% (Total: %1:%2:%3) - - - - - %p% (ETA: %1:%2:%3) - - - - - Quality-based (Constant Rate Factor) - Qualitatif (Constant Rate Factor) - - - - Constant Bitrate - Débit binaire constant - - - - - Invalid Codec - Codec invalide - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Impossible de trouver un encodeur approprié pour ce codec. L'export risque de planter. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Impossible de trouver un format de pixel pour cet encodeur. L'export risque de planter. - - - - Bitrate (Mbps): - Débit binaire (Mbps) : - - - - Quality (CRF): - Qualité (CRF) : - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Facteur de qualité : - -0 = sans perte -17-18 = visuellement sans perte (compressé, mais imperceptible) -23 = haute qualité -51 = qualité la plus basse - - - - Target File Size (MB): - Taille du fichier cible (Mo) : - - - - Format: - Format : - - - - Range: - Plage : - - - - Entire Sequence - Séquence entière - - - - In to Out - Du point d'entrée au point de sortie - - - - Video - Vidéo - - - - - Codec: - Codec : - - - - Width: - Largeur : - - - - Height: - Hauteur : - - - - Frame Rate: - Images par seconde : - - - - Compression Type: - Type de compression : - - - - Advanced - Avancé - - - - Audio - Audio - - - - Sampling Rate: - Taux d'échantillonnage : - - - - Bitrate (Kbps/CBR): - Débit binaire (Kbps/CBR) : - - - - ExportThread - - - failed to send frame to encoder (%1) - Échec de l'envoi d'une image vers l'encodeur (%1) - - - - failed to receive packet from encoder (%1) - Échec de la réception d'un paquet depuis l'encodeur (%1) - - - - could not video encoder for %1 - Impossible d'encoder la vidéo pour %1 - - - - could not allocate video stream - impossible d'allouer le flux vidéo - - - - could not allocate video encoding context - impossible d'allouer le contexte d'encodage vidéo - - - - could not open output video encoder (%1) - impossible d'ouvrir l'encodeur vidéo de sortie (%1) - - - - could not copy video encoder parameters to output stream (%1) - impossible de copier les paramètres d'encodage vidéo vers le flux de sortie (%1) - - - - could not audio encoder for %1 - impossible d'encoder l'audio pour %1 - - - - could not allocate audio stream - impossible d'allouer le flux audio - - - - could not allocate audio encoding context - impossible d'allouer le contexte d'encodage audio - - - - could not open output audio encoder (%1) - impossible d'ouvrir l'encodeur audio de sortie (%1) - - - - could not copy audio encoder parameters to output stream (%1) - impossible de copier les paramètres d'encodage audio vers le flux de sortie (%1) - - - - could not allocate audio buffer (%1) - impossible d'allouer le buffer audio (%1) - - - - could not create output format context - impossible de créer le contexte du format de sortie - - - - could not open output file (%1) - impossible d'ouvrir le fichier de sortie (%1) - - - - could not write output file header (%1) - impossible d'écrire l'en-tête du fichier de sortie (%1) - - - - could not write output file trailer (%1) - impossible d'écrire le trailer du fichier (%1) - - - - FillLeftRightEffect - - - Type - Type - - - - Fill Left with Right - Remplir la gauche avec la droite - - - - Fill Right with Left - Remplir la droite avec la gauche - - - - Frei0rEffect - - - Failed to load Frei0r plugin "%1": %2 - Impossible de charger le plugin Frei0r "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - NOTE : Vous ne pouvez pas charger de plugin Frei0r 32-bit dans la version 64-bit d'Olive. Essayez de trouver une version 64-bit de ce plugin ou basculez vers Olive 32-bit. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - NOTE : Vous ne pouvez pas charger de plugin Frei0r 64-bit dans la version 32-bit d'Olive. Essayez de trouver une version 32-bit de ce plugin ou basculez vers Olive 64-bit. - - - - Error loading Frei0r plugin - Erreur durant le chargement du plugin Frei0r - - - - GraphEditor - - - Graph Editor - Éditeur de graphes - - - - Linear - Linéaire - - - - Bezier - Bézier - - - - Hold - Maintenir - - - - GraphView - - - Zoom to Selection - Zoomer sur la sélection - - - - Zoom to Show All - Zoomer pour tout montrer - - - - Reset View - Réinitialiser la vue - - - - InterlacingName - - - None (Progressive) - Aucun (Progressif) - - - - Top Field First - Trame supérieure en premier - - - - Bottom Field First - Trame inférieure en premier - - - - Invalid - Invalide - - - - KeyframeNavigator - - - Enable Keyframes - Activer les images-clés - - - - KeyframeView - - - Linear - Linéaire - - - - Bezier - Bézier - - - - Hold - Maintenir - - - - LabelSlider - - - &Edit - &Édition - - - - &Reset to Default +%1 - - - Set Value - Définir la valeur - - - - - New value: - Nouvelle valeur : - - - - LoadDialog - - - Loading... - Cargement… - - - - Loading '%1'... - Chargement '%1'… - - - - Cancel - Annuler - - - - LoadThread - - - Version Mismatch - Incompatibilité de version - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Ce projet a été enregistré avec une version différente d'Olive et peut ne pas être totalement compatible avec celle-ci. Voulez-vous essayer de l'ouvrir malgré tout ? - - - - Invalid Clip Link - Lien du clip invalide - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Ce projet contient un lien de clip invalide. Il peut être corrompu. Voulez-vous l'ouvrir malgré tout ? - - - - %1 - Line: %2 Col: %3 - %1 - Ligne : %2 Col. : %3 - - - - User aborted loading - L'utilisateur a abandonné le chargement - - - - XML Parsing Error - Erreur de parsage XML - - - - Couldn't load '%1'. %2 - Impossible de charger '%1'. %2 - - - - Project Load Error - Erreur dans le chargement du projet - - - - Error loading project: %1 - Erreur lors du chargement du projet : %1 - - - - MainWindow - - Auto-recovery - Récupération automatique - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive ne s'est pas fermé convenablement et un fichier de récupépration a été détecté. Souhaitez-vous l'ouvrir ? - - - &Project - &Projet - - - &Sequence - &Séquence - - - &Folder - &Dossier - - - Set In Point - Définir le point d'entrée - - - Set Out Point - Définir le point de sortie - - - - Welcome to %1 - Bienvenue à %1 - - - Reset In Point - Réinitialiser le point d'entrée - - - Reset Out Point - Réinitialiser le point de sortie - - - Clear In/Out Point - Effacer le point d'entrée/de sortie - - - No active sequence - Pas de séquence active - - - Please open the sequence you wish to export. - Veuillez ouvrir la séquence que vous souhaitez exporter. - - - Save Project As... - Enregistrer sous… - - - Unsaved Project - Projet non-sauvegardé - - - This project has changed since it was last saved. Would you like to save it before closing? - Ce projet a été modifié depuis la dernière sauvegarde. Souhaitez-vous l'enregistrer avant de fermer ? - - - - &File - &Fichier - - - - &New - &Nouveau - - - - &Open Project - &Ouvrir un projet - - - - Clear Recent List - Nettoyer la liste des projets récents - - - - Open Recent - Ouvrir un projet récent - - - - &Save Project - &Enregistrer le projet - - - - Save Project &As - Enregistrer le projet &sous - - - - &Import... - &Importer… - - - - &Export... - &Exporter… - - - - E&xit - &Quitter - - - - &Edit - &Édition - - - - &Undo - &Annuler - - - - Redo - Rétablir - - - Cu&t - &Couper - - - Cop&y - Cop&ier - - - &Paste - C&oller - - - Paste Insert - Coller et Insérer - - - Duplicate - Dupliquer - - - Delete - Supprimer - - - Ripple Delete - Supprimer et raccorder - - - Split - Séparer - - - - Select &All - Sélectionner &tout - - - - Deselect All - Tout désélectionner - - - Add Default Transition - Ajouter la transition par défaut - - - Link/Unlink - Lier/Délier - - - Enable/Disable - Activer/Désactiver - - - Nest - Imbriquer - - - - Ripple to In Point - Not literal, but it says what it is - Propager au point d'entrée - - - - Ripple to Out Point - Not literal, but it says what it is - Propager au point de sortie - - - - Edit to In Point - Éditer comme point d'entrée - - - - Edit to Out Point - Éditer comme point de sortie - - - - Delete In/Out Point - Supprimer les points d'entrée/de sortie - - - - Ripple Delete In/Out Point - Supprimer et raccorder au point d'entrée/de sortie - - - - Set/Edit Marker - Définir/Éditer un marqueur - - - - &View - &Affichage - - - - Zoom In - Zommer - - - - Zoom Out - Dézoomer - - - - Increase Track Height - Augmenter la hauteur de piste - - - - Decrease Track Height - Diminuer la hauteur de piste - - - - Toggle Show All - Vue d'ensemble - - - - Track Lines - Contours des pistes - - - - Rectified Waveforms - Formes d'onde ajustées - - - - Frames - Images - - - - Drop Frame - Drop Frame - - - - Non-Drop Frame - Non-Drop Frame - - - - Milliseconds - Millisecondes - - - - Title/Action Safe Area - Zone sûre de titre/d'action - - - - Off - Désactivée - - - - Default - Par défaut - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - Personnalisée - - - - Full Screen - Plein-écran - - - - Full Screen Viewer - Lecteur en plein écran - - - - &Playback - &Lecture - - - - Go to Start - Aller au début - - - - Previous Frame - Image précédente - - - - Play/Pause - Lire/Pause - - - - Play In to Out - Lire entre les points d'entrée et de sortie - - - - Next Frame - Image suivante - - - - Go to End - Aller à la fin - - - - Go to Previous Cut - Aller au point d'édition précédent - - - - Go to Next Cut - Aller au point d'édition suivant - - - - Go to In Point - Aller au point d'entrée - - - - Go to Out Point - Aller au point de sortie - - - - Shuttle Left - Jouer vers la gauche - - - - Shuttle Stop - Arrêter - - - - Shuttle Right - Jouer vers la droite - - - - Loop - Boucle - - - - &Window - &Fenêtre - - - - Project - Projet - - - - Effect Controls - Propriétés des effets - - - - Timeline - Ligne du temps - - - - Graph Editor - Éditeur de graphes - - - - Media Viewer - Lecteur de média - - - - Sequence Viewer - Lecteur de séquence - - - - Maximize Panel - Agrandir le panneau - - - - Lock Panels + + Error saving settings - - Reset to Default Layout - Restaurer la disposition par défaut - - - - &Tools - &Outils - - - - Pointer Tool - Curseur - - - - Edit Tool - Éditer - - - - Ripple Tool - Propagation - - - - Razor Tool - Cutter - - - - Slip Tool - Déplacer dessous - - - - Slide Tool - Déplacer dessus - - - - Hand Tool - Main - - - - Transition Tool - Transition - - - - Enable Snapping - Autoriser le magnétisme - - - - Auto-Cut Silence - - - - Selecting Also Seeks - Sélectionner déplace la tête de lecture - - - Edit Tool Also Seeks - Éditer déplace la tête de lecture - - - Edit Tool Selects Links - Éditer sélectionne les liens - - - Seek Also Selects - Sélectionner avec la tête de lecture - - - Seek to the End of Pastes - Placer la tête de lecture après le collage - - - Scroll Wheel Zooms - Zoomer avec la molette - - - Enable Drag Files to Timeline - Autoriser le dépôt de fichier sur la ligne de temps - - - Auto-Scale By Default - Échelle automatique par défaut - - - Enable Seek to Import - Déplacer la tête de lecture à l'import - - - Audio Scrubbing - Lire l'audio au déplacement de la tête de lecture - - - Enable Drop on Media to Replace - Déposer sur un média pour le remplacer - - - Enable Hover Focus - Activer le focus au survol - - - Ask For Name When Setting Marker - Demander un nom à la création d'un marqueur - - - - No Auto-Scroll - Pas de défilement automatique - - - - Page Auto-Scroll - Défilement paginé - - - - Smooth Auto-Scroll - Défilement doux - - - - Preferences - Préférences - - - - Clear Undo - Nettoyer la pile d'annulation - - - - &Help - &Aide - - - - A&ction Search - Chercher une a&ction - - - - Debug Log - Journal de débogage - - - - &About... - &À propos… - - - - <untitled> - &lt;Sans titre&gt; - - - Open Project... - Ouvrir un projet… - - - Missing recent project - Projet récent manquant - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Le projet '%1' n'existe plus. Voulez-vous le retirer de la liste des projets récents ? - - - Invalid aspect ratio - Ratio d'image invalide - - - The aspect ratio '%1' is invalid. Please try again. - Le ratio d'image '%1' est invalide. Merci de réessayer à nouveau. - - - Enter custom aspect ratio - Entrez un ratio d'image personnalisé - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Entrez le ratio de la zone sûre de titre/d'action (ex: 16:9) : - - - Nested Sequence - Séquence imbriquée - - - - Marker - - - Set Marker - Définir un marqueur - - - - Set clip marker name: - Définir le nom du marqueur de clip : - - - - Set sequence marker name: - Définir le nom du marqueur de séquence : - - - - Media - - - New Folder - Nouveau dossier - - - - Name: - Nom : - - - - Filename: - Nom de fichier : - - - - Video Dimensions: - Dimensions de la vidéo : - - - - Frame Rate: - Images par seconde : - - - - %1 field(s) (%2 frame(s)) - %1 trame(s) (%2 image(s)) - - - - Interlacing: - Entrelacement : - - - - Audio Frequency: - Fréquence audio : - - - - Audio Channels: - Canaux audio : - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Nom : %1 -Dimensions vidéo : %2x%3 -Images par seconde : %4 -Fréquence audio: %5 -Canaux audio : %6 - - - - Name - Nom - - - - Duration - Durée - - - - Rate - Images par seconde - - - - MediaPropertiesDialog - - - "%1" Properties - "%1" Propriétés - - - - Tracks: - Pistes : - - - - Video %1: %2x%3 %4FPS - Vidéo %1 : %2×%3 %4 i/s - - - - Audio %1: %2Hz %3 - Audio %1 : %2 Hz %3 - - - - %n channel(s) - - %n canal - %n canaux - - - - - Conform to Frame Rate: - Conformer aux images par seconde : - - - - Alpha is Premultiplied - Le canal alpha est prémultiplié - - - - Auto (%1) - Auto (%1) - - - - Interlacing: - Entrelacement : - - - - Name: - Nom : - - - - MenuHelper - - - &Project - &Projet - - - - &Sequence - &Séquence - - - - &Folder - &Dossier - - - - Set In Point - Définir le point d'entrée - - - - Set Out Point - Définir le point de sortie - - - - Reset In Point - Réinitialiser le point d'entrée - - - - Reset Out Point - Réinitialiser le point de sortie - - - - Clear In/Out Point - Effacer le point d'entrée/de sortie - - - - Add Default Transition - Ajouter la transition par défaut - - - - Link/Unlink - Lier/Délier - - - - Enable/Disable - Activer/Désactiver - - - - Nest - Imbriquer - - - - Cu&t - &Couper - - - - Cop&y - Cop&ier - - - - - &Paste - C&oller - - - - Paste Insert - Coller et Insérer - - - - Duplicate - Dupliquer - - - - Delete - Supprimer - - - - Ripple Delete - Supprimer et raccorder - - - - Split - Séparer - - - - Invalid aspect ratio - Ratio d'image invalide - - - - The aspect ratio '%1' is invalid. Please try again. - Le ratio d'image '%1' est invalide. Merci de réessayer à nouveau. - - - - Enter custom aspect ratio - Entrez un ratio d'image personnalisé - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Entrez le ratio de la zone sûre de titre/d'action (ex: 16:9) : - - - - NewSequenceDialog - - - Editing "%1" - Édition "%1" - - - - New Sequence - Nouvelle séquence - - - - Preset: - Préréglage : - - - - Film 4K - Film 4K - - - - TV 4K (Ultra HD/2160p) - TV 4K (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - Personnalisé - - - - Video - Vidéo - - - - Width: - Largeur : - - - - Height: - Hauteur : - - - - Frame Rate: - Images par seconde : - - - - Pixel Aspect Ratio: - Ratio des pixels : - - - - Square Pixels (1.0) - Pixels carré (1,0) - - - - Interlacing: - Entrelacement : - - - - None (Progressive) - Aucun (Progressif) - - - - Audio - Audio - - - - Sample Rate: - Taux d'échantillonnage : - - - - Name: - Nom : - - - - OliveGlobal - - - Olive Project %1 - - - - - Auto-recovery - Récupération automatique - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive ne s'est pas fermé convenablement et un fichier de récupépration a été détecté. Souhaitez-vous l'ouvrir ? - - - - Open Project... - Ouvrir un projet… - - - - Missing recent project - Projet récent manquant - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Le projet '%1' n'existe plus. Voulez-vous le retirer de la liste des projets récents ? - - - - Save Project As... - Enregistrer sous… - - - - Unsaved Project - Projet non-sauvegardé - - - - This project has changed since it was last saved. Would you like to save it before closing? - Ce projet a été modifié depuis la dernière sauvegarde. Souhaitez-vous l'enregistrer avant de fermer ? - - - - No active sequence - Pas de séquence active - - - - Please open the sequence to perform this action. - - - - - No clips selected - - - - - Select the clips you wish to auto-cut - - - - Please open the sequence you wish to export. - Veuillez ouvrir la séquence que vous souhaitez exporter. - - - - Missing Project File - - - - - Specified project '%1' does not exist. + + Failed to save application settings. The application may lack write permissions to this location. - PanEffect + Footage - - Pan - Panoramique + + %1 FPS + + + + + %1 Hz + + + + + Filename: %1 + + + + + This footage is not valid for use + - Playback + ImportTool - Generating Proxy: %1% - Génération du proxy : %1% + + Don't ask me again + + + + + No Active Sequence + + + + + No sequence is currently open. Would you like to create one? + + + + + Automatically Detect Parameters From Footage + + + + + Set Parameters Manually + - PreferencesDialog + MoveItemCommand - - Preferences - Préférences - - - - Invalid CSS File - Fichier CSS invalide - - - - CSS file '%1' does not exist. - Le fichier CSS '%1' n'existe pas. - - - Warning - Avertissement - - - Some changed settings will require restarting Olive to take effect - Certains paramètres modifiés nécessitent le redémarrage d'Olive pour prendre effet - - - - Confirm Reset All Shortcuts - Confirmez la réinitialisation de tous les raccourcis clavier - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - Êtes-vous sûr⋅e de vouloir réinitialiser tous les raccourcis clavier à leur valeur par défaut ? - - - - Import Keyboard Shortcuts - Importer les raccourcis clavier - - - - - Error saving shortcuts - Erreur dans l'enregistrement des raccourcis - - - - Failed to open file for reading - Échec de l'ouverture du fichier - - - - Export Keyboard Shortcuts - Exporter les raccourcis clavier - - - - Export Shortcuts - Exporter les raccourcis - - - - Shortcuts exported successfully - Les raccourcis ont été exporté avec succès - - - - Failed to open file for writing - Échec de l'ouverture du fichier - - - - Browse for CSS file - Choisir un fichier CSS - - - - Delete All Previews - Supprimer toutes les prévisualisations - - - - Are you sure you want to delete all previews? - Êtes-vous sûr⋅e de vouloir supprimer toutes les prévisualisations ? - - - - Previews Deleted - Prévisualisations supprimées - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - Toutes les prévisualisations ont été supprimées avec succès. Il est possible que vous deviez ré-ouvrir le projet actuel pour que les changements prennent effet. - - - - Language: - Langue : - - - - Default Sequence Settings + + Move Item - - - Add Default Effects to New Clips - - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - - - - - Selecting Also Seeks - Sélectionner déplace la tête de lecture - - - - Edit Tool Also Seeks - Éditer déplace la tête de lecture - - - - Edit Tool Selects Links - Éditer sélectionne les liens - - - - Seek Also Selects - Sélectionner avec la tête de lecture - - - - Seek to the End of Pastes - Placer la tête de lecture après le collage - - - - Scroll Wheel Zooms - Zoomer avec la molette - - - - Hold CTRL to toggle this setting - - - - - Invert Timeline Scroll Axes - - - - - Enable Drag Files to Timeline - Autoriser le dépôt de fichier sur la ligne de temps - - - - Auto-Scale By Default - Échelle automatique par défaut - - - - Auto-Seek to Imported Clips - - - - - Audio Scrubbing - Lire l'audio au déplacement de la tête de lecture - - - - Drop Files on Media to Replace - - - - - Enable Hover Focus - Activer le focus au survol - - - - Ask For Name When Setting Marker - Demander un nom à la création d'un marqueur - - - - Appearance - - - - - Theme - - - - - Olive Dark (Default) - - - - - Olive Light - - - - - Native - - - - - Native (Light Icons) - - - - - Use Native Menu Styling - - - - - Custom CSS: - CSS personnalisé : - - - - Browse - Parcourir - - - - Image sequence formats: - Formats de séquence d'image : - - - - Audio Recording: - Enregistrement audio : - - - - Mono - Mono - - - - Stereo - Stéréo - - - - Effect Textbox Lines: - Lignes des boîtes de texte d'effet : - - - - Default Sequence - - - - - Thumbnail Resolution: - Résolution des miniatures : - - - - Waveform Resolution: - Résolution des formes d'onde : - - - - Delete Previews - Supprimer les prévisualisations - - - - Use Software Fallbacks When Possible - Utiliser les solutions de repli logicielles quand cela est possible - - - - General - Général - - - - Behavior - Comportement - - - Seeking - Tête de lecture - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - Recherche fidèle -Tojours montrer l'image exacte (la prévisualisation peut se mettre en pause brièvement quand la bonne image est en cours de récupération) - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - Recherhe rapide -Montrer rapidement (la prévisualition peut montrer brièvement des images imprécises lors du déplacement de la tête de lecture − cela n'affecte pas la lecture et l'export) - - - - Memory Usage - Utilisation de la mémoire - - - - Upcoming Frame Queue: - File d'image à venir : - - - - - frames - images - - - - - seconds - secondes - - - - Previous Frame Queue: - File d'image précédentes : - - - - Playback - Lecture - - - - Output Device: - Système de sortie : - - - - - Default - Défaut - - - - Input Device: - Système d'entrée : - - - - Sample Rate: - Taux d'échantillonnage : - - - - Audio - Audio - - - - Search for action or shortcut - Rechercher une action ou un raccourci - - - - Action - Action - - - - Shortcut - Raccourci - - - - Import - Importer - - - - Export - Exporter - - - - Reset Selected - Réinitialiser la sélection - - - - Reset All - Tout réinitialiser - - - - Keyboard - Clavier - - PreviewGenerator + NodeCopyPasteWidget - - Failed to find any valid video/audio streams + + Error pasting nodes - - Could not open file - %1 - Impossible d'ouvrir le fichier - %1 - - - - Could not find stream information - %1 - Impossible de trouver les informations de flux - %1 + + Failed to paste nodes: %1 + - Project + NodeFactory - - New - Nouveau - - - - Open Project + + None - - - Save Project - - - - - Undo - - - - - Redo - Rétablir - - - - Tree View - Vue arborescente - - - - Icon View - Vue par icônes - - - - List View - - - - - Search media, markers, etc. - Rechercher des médias, marqueurs, etc. - - - - Project - Projet - - - - Sequence - Séquence - - - - Replace '%1' - Remplacer '%1' - - - - - All Files - Tous les fichiers - - - - - No active sequence - Pas de séquence active - - - - No sequence is active, please open the sequence you want to replace clips from. - Pas de séquence active, veuillez ouvrir la séquence dont vous souhaitez modifier les clips. - - - - Active sequence selected - Séquence active sélectionnée - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - Vous ne pouvez pas insérer une séquence à l'intérieur d'elle-même, donc aucun clip de ce média ne peut être dans cette séquence. - - - - Rename '%1' - Renommer '%1' - - - - Enter new name: - Entrez le nouveau nom : - - - - Delete media in use? - Supprimer un média en cours d'utilisation ? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - Le média '%1' est actuellement utilisé dans '%2', le supprimer effacera toutes les instances dans la séquence. Êtes-vous sûr⋅e de vouloir cela ? - - - - Skip - Passer - - - - Import a Project - - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - - - - - Image sequence detected - Séquence d'image détectée - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - Le fichier '%1' semble faire partie d'une séquence d'image. Voulez-vous l'importer comme tel ? - - - - Import media... - Importer un média… - - - - No sequence is active, please open the sequence you want to delete clips from. - Aucune séquence n'est active, veuillez sélectionner la séquence dont vous souhaitez supprimer les clips. - - ProxyDialog + NodeViewItem - - Create Proxy - Créer un proxy - - - - Proxy - Proxy - - - - Dimensions: - Dimensions : - - - - Same Size as Source - Même taille que la source - - - - Half Resolution (1/2) - Moitié de la résolution (1/2) - - - - Quarter Resolution (1/4) - Quart de la résolution (1/4) - - - - Eighth Resolution (1/8) - Huitième de la résolution (1/8) - - - - Sixteenth Resolution (1/16) - Seizième de la résolution (1/16) - - - - Format: - Format : - - - - ProRes HQ - ProRes HQ - - - - Location: - Chemin : - - - - Same as Source (in "%1" folder) - Comme la source (dans le dossier "%1") - - - - Proxy file exists - Un fichier de proxy existe - - - - The file "%1" already exists. Do you wish to replace it? - Le fichier "%1" existe déjà. Voulez-vous le remplacer ? - - - - Custom Location - Chemin personnalisé + + %1... + - ProxyGenerator + PresetManager - - Finished generating proxy for "%1" - Génération du proxy pour "%1" terminée + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + - ReplaceClipMediaDialog + RatioDialog - - Replace clips using "%1" - Remplacer les clips par "%1" + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Select which media you want to replace this media's clips with: - Sélectionnez quel média vous souhaitez utiliser pour remplacer les clips de ce média : + + Invalid custom ratio + - - Keep the same media in-points - Garder les mêmes points d'entrée du média - - - - Replace - Remplacer - - - - Cancel - Annuler - - - - No media selected - Aucun média sélectionné - - - - Please select a media to replace with or click 'Cancel'. - Veuillez sélectionner un média avec lequel remplacer ou choisir 'Annuler'. - - - - Same media selected - Même média sélectionné - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Vous avez sélectionné le même média que celui que vous souhaitez remplacer. Veuillez sélectionner un autre média ou cliquer sur 'Annuler'. - - - - Folder selected - Dossier sélectionné - - - - You cannot replace footage with a folder. - Vous ne pouvez pas remplacer un média par un dossier. - - - - Active sequence selected - Séquence active sélectionnée - - - - You cannot insert a sequence into itself. - Vous ne pouvez pas insérer une séquence dans elle-même. + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - RichTextEffect + RenameItemCommand - - Text - Texte - - - - Padding + + Rename Item - - - Position - Position - - - - Vertical Align: - - - - - Top - En haut - - - - Center - Centrer - - - - Bottom - En bas - - - - Auto-Scroll - - - - - Off - Désactivée - - - - Up - - - - - Down - - - - - Left - À gauche - - - - Right - À droite - - - - Shadow - Ombre - - - - Shadow Color - Couleur de l'ombre - - - - Shadow Angle - - - - - Shadow Distance - Distance de l'ombre - - - - Shadow Softness - Douceur de l'ombre - - - - Shadow Opacity - Opacité de l'ombre - Sequence - - %1 (copy) - %1 (copy) + + %1 FPS + - ShakeEffect + Stream - - Intensity - Intensité - - - - Rotation - Rotation - - - - Frequency - Fréquence - - - - SolidEffect - - - Type - Type - - - - Solid Color - Couleur unie - - - - SMPTE Bars - Barres SMPTE - - - - Checkerboard - Damier - - - - Opacity - Opacité - - - - Color - Couleur - - - - Checkerboard Size - Taille du damier - - - - SourcesCommon - - - Import... - Importer… - - - - New - Nouveau - - - - View - Affichage - - - - Tree View - Vue arborescente - - - - Icon View - Vue par icônes - - - - Show Toolbar - Afficher la barre d'outils - - - - Show Sequences - Afficher les séquences - - - - Replace/Relink Media - Remplacer/Relier le média - - - - Reveal in Explorer - Montrer dans l'explorateur - - - - Reveal in Finder - Montrer dans le Finder - - - - Reveal in File Manager - Montrer dans le gestionnaire de fichiers - - - - Replace Clips Using This Media - Remplacer les clips utilisant ce média - - - - Create Sequence With This Media - Créer une séquence à partir de ce média - - - - Duplicate - Dupliquer - - - - Delete All Clips Using This Media - Supprimer tous les clips utilisant ce média - - - - Proxy - Proxy - - - - Generating proxy: %1% complete - Génération du proxy: %1% achevée - - - - Create/Modify Proxy - Créer/Modifier le proxy - - - - Create Proxy - Créer le proxy - - - - Modify Proxy - Modifier le proxy - - - - Restore Original - Restaurer l'original - - - - Delete - Supprimer - - - - Preview in Media Viewer + + %1: Audio - %2 Channels, %3Hz - - Properties... - Propriétés… + + %1: Unknown + - - Replace Media - Remplacer le média + + %1: Image - %2x%3 + - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Vous avez déposé un fichier sur '%1'. Souhaitez-vous le remplacer par le fichier déposé ? - - - - Delete proxy - Supprimer le proxy - - - - Would you like to delete the proxy file "%1" as well? - Souhaitez-vous aussi supprimer le fichier de proxy "%1" ? + + %1: Video - %2x%3 + - SpeedDialog + TimelineViewBlockItem - - Speed/Duration - Vitesse/Durée + + %1 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Speed: - Vitesse : + + Bars + Barres - + + Solid + + + + + Title + Titre + + + + Tone + Ton + + + + Unknown + + + + + VideoParams + + + 8-bit + + + + + 16-bit Integer + + + + + Half-Float (16-bit) + + + + + Full-Float (32-bit) + + + + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + + + + + main + + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + qm-file + + + + + Project to open on startup + + + + + olive::AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive est un logiciel de montage non-linéaire. Ce logiciel est libre et protégé par la licence GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + L'équipe d'Olive vous informe que le code source d'Olive est disponible au téléchargement sur son site Web. + + + + olive::ActionSearch + + + Search for action... + Rechercher une action… + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Audio + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + + Length + Longueur + + + + Media In + + + + + Enabled + + + + + Speed + + + + + olive::BlurFilterNode + + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + + + + + olive::ClipBlock + + + Clip + + + + + A time-based node that represents a media source. + + + + + Buffer + + + + + olive::ColorDialog + + + Select Color + + + + + olive::ColorSpaceChooser + + + Color Management + + + + + Input: + + + + + Color Space: + + + + + Display: + + + + + View: + + + + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + Nouveau dossier + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + + + + + + Error + Erreur + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Linéaire + + + + Bezier + Bézier + + + + Hold + Maintenir + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Avancé + + + + Pixel + + + + + Pixel Format: + Format de pixel : + + + + Performance + + + + + Threads: + + + + + olive::ExportAudioTab + + + Codec: + Codec : + + + + Sample Rate: + Taux d'échantillonnage : + + + + Channel Layout: + + + + + Format: + Format : + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + Nom de fichier : + + + + Browse for exported file filename + + + + + Preset: + Préréglage : + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Plage : + + + + Entire Sequence + Séquence entière + + + + In to Out + Du point d'entrée au point de sortie + + + + Format: + Format : + + + + Export Video + + + + + Export Audio + + + + + Video + Vidéo + + + + Audio + Audio + + + + + Export + Exporter + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Largeur : + + + + Height: + Hauteur : + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + + Fit + Ajuster + + + + Stretch + + + + + Crop + + + + Frame Rate: - Images par seconde : + Images par seconde : - - Duration: - Durée : + + Pixel Aspect Ratio: + Ratio des pixels : - - Reverse - Inverser + + Interlacing: + Entrelacement : - - Maintain Audio Pitch - Maintenir la hauteur audio + + Quality: + - - Ripple Changes - Propager les changements + + Codec + + + + + Codec: + Codec : + + + + Advanced + Avancé - TextEditDialog + olive::FloatSlider - - Edit Text - Éditer le texte - - - - Thin + + %1 dB - - Extra Light - - - - - Light - - - - - Normal - Normal - - - - Medium - - - - - Demi Bold - - - - - Bold - - - - - Extra Bold - - - - - Black + + %1% - TextEditEx + olive::FootagePropertiesDialog - - Edit Text - Éditer le texte + + "%1" Properties + "%1" Propriétés - - &Edit Text - &Modifier le texte + + Name: + Nom : + + + + Tracks: + Pistes : - TextEffect + olive::FootageRelinkDialog - - Text - Texte - - - - Font - Police - - - - Size - Taille - - - - Color - Couleur - - - - Alignment - Allignement - - - - Left - À gauche - - - - - Center - Centrer - - - - Right - À droite - - - - Justify - Justifié - - - - Top - En haut - - - - Bottom - En bas - - - - Word Wrap - Retour automatique - - - - Padding + + Footage - + + Filename + + + + + Actions + + + + + Browse + Parcourir + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + Tous les fichiers + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Taille du fichier cible (Mo) : + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Aucun (Progressif) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Linéaire + + + + Hold + Maintenir + + + + Bezier + Bézier + + + + olive::KeyframeViewBase + + + Linear + Linéaire + + + + Bezier + Bézier + + + + Hold + Maintenir + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + &Enregistrer le projet + + + + Save Project &As + Enregistrer le projet &sous + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + &Fichier + + + + &New + &Nouveau + + + + &Open Project + &Ouvrir un projet + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &Importer… + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + &Quitter + + + + &Edit + &Édition + + + + Insert + + + + + Overwrite + + + + + Select &All + Sélectionner &tout + + + + Deselect All + Tout désélectionner + + + + Ripple to In Point + Propager au point d'entrée + + + + Ripple to Out Point + Propager au point de sortie + + + + Edit to In Point + Éditer comme point d'entrée + + + + Edit to Out Point + Éditer comme point de sortie + + + + Delete In/Out Point + Supprimer les points d'entrée/de sortie + + + + Ripple Delete In/Out Point + Supprimer et raccorder au point d'entrée/de sortie + + + + Set/Edit Marker + Définir/Éditer un marqueur + + + + &View + &Affichage + + + + Zoom In + + + + + Zoom Out + Dézoomer + + + + Increase Track Height + Augmenter la hauteur de piste + + + + Decrease Track Height + Diminuer la hauteur de piste + + + + Toggle Show All + Vue d'ensemble + + + + Full Screen + Plein-écran + + + + Full Screen Viewer + Lecteur en plein écran + + + + &Playback + &Lecture + + + + Go to Start + Aller au début + + + + Previous Frame + Image précédente + + + + Play/Pause + Lire/Pause + + + + Play In to Out + Lire entre les points d'entrée et de sortie + + + + Next Frame + Image suivante + + + + Go to End + Aller à la fin + + + + Go to Previous Cut + Aller au point d'édition précédent + + + + Go to Next Cut + Aller au point d'édition suivant + + + + Go to In Point + Aller au point d'entrée + + + + Go to Out Point + Aller au point de sortie + + + + Shuttle Left + Jouer vers la gauche + + + + Shuttle Stop + Arrêter + + + + Shuttle Right + Jouer vers la droite + + + + Loop + Boucle + + + + &Sequence + &Séquence + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + Agrandir le panneau + + + + Lock Panels + + + + + Reset to Default Layout + Restaurer la disposition par défaut + + + + &Tools + &Outils + + + + Pointer Tool + Curseur + + + + Edit Tool + Éditer + + + + Ripple Tool + Propagation + + + + Rolling Tool + + + + + Razor Tool + Cutter + + + + Slip Tool + Déplacer dessous + + + + Slide Tool + Déplacer dessus + + + + Hand Tool + Main + + + + Zoom Tool + + + + + Transition Tool + Transition + + + + Enable Snapping + Autoriser le magnétisme + + + + Preferences + Préférences + + + + &Help + &Aide + + + + A&ction Search + Chercher une a&ction + + + + Send &Feedback... + + + + + &About... + &À propos… + + + + olive::MainStatusBar + + + Welcome to %1 %2 + Bienvenue à %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + Affichage + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + Ajouter + + + + Subtract + + + + + Multiply + Multiplier + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + Position Position - - Outline - Contour + + Rotation + Rotation - - Outline Color - Couleur du contour + + Scale + Échelle - - Outline Width - Épaisseur du contour + + Uniform Scale + Échelle uniforme - - Shadow - Ombre + + Anchor Point + Point d'ancrage + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + &Projet - - Shadow Color - Couleur de l'ombre + + &Sequence + &Séquence - - Shadow Angle + + &Folder + &Dossier + + + + Cu&t + &Couper + + + + Cop&y + Cop&ier + + + + &Paste + C&oller + + + + Paste Insert + Coller et Insérer + + + + Duplicate + Dupliquer + + + + Delete + Supprimer + + + + Ripple Delete + Supprimer et raccorder + + + + Split + Séparer + + + + Set In Point + Définir le point d'entrée + + + + Set Out Point + Définir le point de sortie + + + + Reset In Point + Réinitialiser le point d'entrée + + + + Reset Out Point + Réinitialiser le point de sortie + + + + Clear In/Out Point + Effacer le point d'entrée/de sortie + + + + Add Default Transition + Ajouter la transition par défaut + + + + Link/Unlink + Lier/Délier + + + + Enable/Disable + Activer/Désactiver + + + + Nest + Imbriquer + + + + Frames + Images + + + + Drop Frame + Drop Frame + + + + Non-Drop Frame + Non-Drop Frame + + + + Milliseconds + Millisecondes + + + + Seconds + + + + + olive::MergeNode + + + Merge - - Shadow Distance - Distance de l'ombre + + Merge two textures together. + - - Shadow Softness - Douceur de l'ombre + + Base + - - Shadow Opacity - Opacité de l'ombre - - - - Sample Text - Texte d'exemple - - - &Edit Text - &Modifier le texte + + Blend + - TimecodeEffect + olive::Node - - Timecode - Code temporel + + Input + - - Sequence - Séquence + + Output + - - Media - Média + + General + Général - - Scale - Échelle + + Math + - + Color - Couleur + Couleur - - Background Color - Couleur d'arrière-plan + + Filter + - - Background Opacity - Opacité de l'arrière-plan + + Timeline + Ligne du temps - - Offset - Écart + + Generator + - - Prepend - Préfixe + + Channel + + + + + Transition + + + + + Uncategorized + - Timeline + olive::NodeInput - - Timeline: - Ligne du temps : + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + - <none> - <aucun> + + None + - - Nested Sequence - Séquence imbriquée + + Integer + - - Effect already exists - L'effet existe déjà + + Float + - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - Le clip '%1' contient déjà un effet '%2'. SOuhaitez-vous le remplacer par l'effet du presse-papier ou ajouter celui comme un effet distinct ? + + Rational + - + + Boolean + + + + + Color + Couleur + + + + Matrix + + + + + Text + Texte + + + + Font + Police + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + Avertissement + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Type + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + + (unknown) + (inconnu) + + + + olive::NodeTreeView + + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + Add - Ajouter + Ajouter + + + + olive::PanNode + + + + Pan + Panoramique - - Replace - Remplacer + + Adjust the stereo panning of an audio source. + - - Skip - Passer + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + - - Do this for all conflicts found - Faire ceci pour tous les conflits - - - - Title... - Titre… - - - - Solid Color... - Couleur unie… - - - - Bars... - Barres… - - - - Tone... - Ton… - - - - Noise... - Bruit… - - - - Unsaved Project - Projet non-sauvegardé - - - - You must save this project before you can record audio in it. - Vous devez sauvegarder ce projet avant d'effectuer un enregistrement audio à l'intérieur. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Cliquez sur la ligne du temps là où vous souhaitez commencer l'enregistrement (tirez pour limiter l'enregistrement jusqu'à une certaine image) - - - + (none) (aucun) - - Pointer Tool - Curseur - - - - Edit Tool - Éditer - - - - Ripple Tool - Propagation - - - - Razor Tool - Cutter - - - - Slip Tool - Déplacer dessous - - - - Slide Tool - Déplacer dessus - - - - Hand Tool - Main - - - - Transition Tool - Transition - - - - Snapping - Magnétisme - - - - Zoom In - Zoomer - - - - Zoom Out - Dézoomer - - - - Record audio - Enregistrement audio - - - - Add title, solid, bars, etc. - Ajouter un titre, une couleur unie, des barres, etc. + + (multiple) + - TimelineHeader + olive::PathWidget - - Center Timecodes - Centrer les codes temporels + + Browse + Parcourir + + + + Browse for path + - TimelineWidget + olive::PixelAspectRatioComboBox - - &Undo - Ann&uler - - - - &Redo - &Rétablir - - - C&ut - &Couper - - - Cop&y - Cop&ier - - - &Paste - C&oller - - - R&ipple Delete - Supprimer et r&accorder - - - - Sequence Settings - Paramètres de la séquence - - - - &Speed/Duration - &Vitesse/Durée - - - Auto-s&cale - Échelle automati&que - - - Enable/Disable - Activer/Désactiver - - - Link/Unlink - Lier/Délier - - - &Nest - Im&briquer - - - - &Reveal in Project - &Révéler dans le projet - - - R&ename - R&enommer - - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Début : %2 -Fin : %3 -Durée : %4 - - - Rename '%1' - Renommer '%1' - - - Rename multiple clips - Renommer plusieurs clips - - - Enter a new name for this clip: - Entrez un nouveau nom pour ce clip : - - - - R&ipple Delete Empty Space + + Set Custom Pixel Aspect Ratio - - Auto-Cut Silence + + Custom... - - Auto-S&cale + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + Couleur + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon - + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + Couleur + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + Système de sortie : + + + + Input Device: + Système d'entrée : + + + + Sample Rate: + Taux d'échantillonnage : + + + + Audio Recording: + Enregistrement audio : + + + + Mono + Mono + + + + Stereo + Stéréo + + + + Refresh Devices + + + + + Please wait... + + + + + Default + + + + + olive::PreferencesBehaviorTab + + + Behavior + Comportement + + + + General + Général + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Audio + + + + Enable audio scrubbing + + + + + Timeline + Ligne du temps + + + + Auto-Seek to Imported Clips + + + + + Edit Tool Also Seeks + Éditer déplace la tête de lecture + + + + Edit Tool Selects Links + Éditer sélectionne les liens + + + + Enable Drag Files to Timeline + Autoriser le dépôt de fichier sur la ligne de temps + + + + Invert Timeline Scroll Axes + + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + Sélectionner avec la tête de lecture + + + + Seek to the End of Pastes + Placer la tête de lecture après le collage + + + + Selecting Also Seeks + Sélectionner déplace la tête de lecture + + + + Playback + Lecture + + + + Ask For Name When Setting Marker + Demander un nom à la création d'un marqueur + + + + Automatically rewind at the end of a sequence + + + + + Project + Projet + + + + Drop Files on Media to Replace + + + + + Nodes + + + + + Add Default Effects to New Clips + + + + + Auto-Scale By Default + Échelle automatique par défaut + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + Préférences + + + + General + Général + + + + Appearance + + + + + Behavior + Comportement + + + + Disk + + + + + Audio + Audio + + + + Keyboard + Clavier + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + Langue : + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + Rechercher une action ou un raccourci + + + + Action + Action + + + + Shortcut + Raccourci + + + + Import + Importer + + + + Export + Exporter + + + + Reset Selected + Réinitialiser la sélection + + + + Reset All + Tout réinitialiser + + + + Confirm Reset All Shortcuts + Confirmez la réinitialisation de tous les raccourcis clavier + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Êtes-vous sûr⋅e de vouloir réinitialiser tous les raccourcis clavier à leur valeur par défaut ? + + + + Import Keyboard Shortcuts + Importer les raccourcis clavier + + + + + Error saving shortcuts + Erreur dans l'enregistrement des raccourcis + + + + Failed to open file for reading + Échec de l'ouverture du fichier + + + + Export Keyboard Shortcuts + Exporter les raccourcis clavier + + + + Export Shortcuts + Exporter les raccourcis + + + + Shortcuts exported successfully + Les raccourcis ont été exporté avec succès + + + + Failed to open file for writing + Échec de l'ouverture du fichier + + + + olive::ProgressDialog + + + Cancel + Annuler + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &Nouveau + + + + &Import... + &Importer… + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + Montrer dans l'explorateur + + + + Reveal in Finder + Montrer dans le Finder + + + + Reveal in File Manager + Montrer dans le gestionnaire de fichiers + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + Projet + + + + (none) + (aucun) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + Parcourir + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + + + + + Save Project + + + + + Undo + + + + + Redo + Rétablir + + + + Search media, markers, etc. + Rechercher des médias, marqueurs, etc. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + Nom + + + + Duration + Durée + + + + Rate + Images par seconde + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + Nom : + + + + New Sequence + Nouvelle séquence + + + + Editing "%1" + Édition "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Vidéo + + + + Width: + Largeur : + + + + Height: + Hauteur : + + + + Frame Rate: + Images par seconde : + + + + Pixel Aspect Ratio: + Ratio des pixels : + + + + Interlacing: + Entrelacement : + + + + Audio + Audio + + + + Sample Rate: + Taux d'échantillonnage : + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + Lecteur de séquence + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + Couleur + + + + olive::StringSlider + + + (none) + (aucun) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + Couleur + + + + Radius + + + + + Opacity + Opacité + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + Texte d'exemple + + + + + Text + Texte + + + + Generate rich text. + + + + + Font + Police + + + + Font Size + + + + + Color + Couleur + + + + Vertical Align + + + + + Top + En haut + + + + Center + Centrer + + + + Bottom + En bas + + + + olive::TimeBasedPanel + + + (none) + (aucun) + + + + olive::TimeBasedWidget + + + Set Marker + Définir un marqueur + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + Ligne du temps + + + + olive::TimelineWidget + + + Properties - - Error - Erreur - - - - Couldn't locate media wrapper for sequence. - Impossible de localiser le conteneurdu média de cette séquence. - - - - Title - Titre - - - - Solid Color - Couleur unie - - - - Bars - Barres - - - - Tone - Ton - - - - Noise - Bruit - - - - Duration: - Durée : + + Use Audio Time Units + - ToneEffect + olive::ToolPanel - - Type - Type + + Tools + + + + + olive::Toolbar + + + Pointer Tool + Curseur - + + Edit Tool + Éditer + + + + Ripple Tool + Propagation + + + + Rolling Tool + + + + + Razor Tool + Cutter + + + + Slip Tool + Déplacer dessous + + + + Slide Tool + Déplacer dessus + + + + Hand Tool + Main + + + + Zoom Tool + + + + + Transition Tool + Transition + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Linéaire + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + Sine - - Frequency - Fréquence + + Cosine + - - Amount - Quantité + + Tangent + - - Mix - Mélange - - - - TransformEffect - - - Position - Position + + Inverse Sine + - - Scale - Échelle + + Inverse Cosine + - - Uniform Scale - Échelle uniforme + + Inverse Tangent + - - Rotation - Rotation + + Hyperbolic Sine + - - Anchor Point - Point d'ancrage + + Hyperbolic Cosine + - - Opacity - Opacité + + Hyperbolic Tangent + - - Blend Mode - Mode de fusion - - - - Normal - Normal - - - Darken - Assombrir - - - Multiply - Multiplier - - - Color Burn - Not literal but same translation as Adobe - Densité couleur + - - - Linear Burn - Not literal but same translation as Adobe - Densité linéaire + - - - Lighten - Éclaircir - - - Screen - Not literal but same translation as Adobe - Superposition - - - Color Dodge - Not literal but same translation as Adobe - Densité couleur - - - - Linear Dodge (Add) - Not literal but same translation as Adobe - Densité linéaire - - - - Overlay - Incrustation - - - Soft Light - Not literal but same translation as Adobe - Lumière tamisée - - - Hard Light - Lumière crue - - - Vivid Light - Lumière vive - - - Linear Light - Lumière linéaire - - - Pin Light - Not literal but same translation as Adobe - Lumière ponctuelle - - - Hard Mix - Mélange maximal - - - Difference - Différence - - - Exclusion - Exclusion - - - Reflect - Réflexion - - - Substract - Soustraction - - - Average - Moyenne - - - Glow - Lueur - - - Negation - Négation - - - Phoenix - Phénix - - - - Transition - - - Length - Longueur - - - - UpdateNotification - - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + + Method - VSTHost + olive::VideoDividerComboBox - - - Error loading VST plugin - Erreur lors du chargement du plugin VST - - - Failed to create VST reference - Impossible de créer la référence VST - - - - Failed to load VST plugin "%1": %2 - Impossible de charger le plugin VST "%1": %2 - - - NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - NOTE : Vous ne pouvez pas charger de plugin VST 32-bit avec la version 64-bit d'Olive. Essayez de trouver une version 64-bit de ce plugin ou basculez sur la version 32-bit d'Olive. - - - NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - NOTE : Vous ne pouvez pas charger de plugin VST 64-bit avec la version 32-bit d'Olive. Essayez de trouver une version 32-bit de ce plugin ou basculez sur la version 64-bit d'Olive. - - - - Failed to locate entry point for dynamic library. - Impossible de localiser le point d'entrée de la bibliothèque dynamique. - - - - VST Error - Erreur VST - - - - Plugin's magic number is invalid - Le nombre magique du plugin est invalide - - - - Plugin - Plugin - - - - Interface - Interface - - - - Show - Montrer - - - - VST Plugin - Plugin VST - - - - Viewer - - - Sequence Viewer - Lecteur de séquence - - - - Media Viewer - Lecteur de média - - - - (none) - (aucun) - - - - Drag video only + + Full - - Drag audio only + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + Vidéo + + + + Import a video footage stream. - ViewerWidget + olive::VideoStreamProperties - - Save Frame as Image... - Enregistrer l'image… + + Pixel Aspect: + - - Show Fullscreen - Montrer en plein écran + + Interlacing: + Entrelacement : - - Disable - Désactiver + + Color Space: + - - Screen %1: %2x%3 - Écran %1: %2x%3 + + Default (%1) + - + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + Images par seconde : + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + Erreur + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + Zoom - Zoom + Zoom - + Fit - Ajuster + Ajuster - - Custom - Personnalisé + + %1% + - - Close Media - Fermer le média + + Full Screen + Plein-écran - - Save Frame - Enregistrer l'image + + Screen %1: %2x%3 + Écran %1: %2x%3 - - Viewer Zoom - Zoom du lecteur + + Deinterlace + - - Set Custom Zoom Value: - Définir une valeur de zoom personnalisée : + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + Désactivée + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + - ViewerWindow + olive::VolumeNode - - Exit Fullscreen - Quitter le mode plein-écran - - - - VoidEffect - - - (unknown) - (inconnu) - - - - Missing Effect - Effet manquant - - - - VolumeEffect - - + + Volume - Volume - - - - transition - - - Invalid transition - Transition invalide + Volume - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - Aucun candidat pour la transition '%1'. Cette transition est peut-être corrompue. Essayez de la réinstaller, ou de réinstaller Olive. + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/id_ID.ts b/app/ts/id_ID.ts index 7030215c5..6c9bc644e 100644 --- a/app/ts/id_ID.ts +++ b/app/ts/id_ID.ts @@ -2,3787 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive adalah aplikasi pengedit video yang bersifat non-linier. Aplikasi ini bebas, gratis, dan terlindungi GNU GPL. + + %1 Hz + - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Olive Team berkewajiban memberitahu pengguna bahwa kode sumber aplikasi ini dapat diunduh dari situs resminya. - - - - ActionSearch - - - Search for action... - Cari Aksi... - - - - AdvancedVideoDialog - - - Advanced Video Settings - Pengaturan Video Lanjutan - - - - Pixel Format: - Bentuk piksel: - - - - Threads: - Jumlah thread/utas: - - - - Audio - - - %1 Audio - Audio %1 - - - - Recording %1 - Merekam %1 - - - - AudioNoiseEffect - - - Amount - Kenyaringan - - - - Mix - - - - - AutoCutSilenceDialog - - - Cut Silence - Potong Senyap - - - - Attack Threshold: - Ambang Mula: - - - - Attack Time: - Waktu Mula: - - - - Release Threshold: - Ambang Akhir: - - - - Release Time: - Waktu Akhir: - - - - Cacher - - - - Could not open %1 - %2 - Tidak dapat membuka %1 - %2 - - - - ChannelLayoutName - - - Invalid - Salah - - - + Mono - Mono + Mono - + Stereo - Stereo + Stereo + + + + 2.1 + + + + + 5.1 + + + + + 7.1 + + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - Properti untuk "%1" + + Error loading settings + - - Multiple Clip Properties - Properti untuk Beberapa Klip - - - - Name: - Nama: - - - - Duration: - Durasi: - - - - (multiple) - (beberapa) - - - - CollapsibleWidget - - - <untitled> - <belum dinamai> - - - - ColorButton - - - Set Color - Pilih Warna - - - - CornerPinEffect - - - Top Left - Kiri Atas - - - - Top Right - Kanan Atas - - - - Bottom Left - Kiri Bawah - - - - Bottom Right - Kanan Bawah - - - - Perspective - Perspektif - - - - DebugDialog - - - Debug Log - Awakutu (Debug) - - - - DemoNotice - - - - Welcome to Olive! - Selamat datang di Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - differentiate "free" as in "free of charge" and "free" as in "freedom/libre" - Olive adalah aplikasi edit video yang bebas, gratis dan terbuka sumbernya, terlisensi GNU GPL. Jika Anda membayar untuk aplikasi ini, Anda telah tertipu. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Aplikasi ini masih dalam tahap ALPHA, artinya aplikasi ini belum stabil dan kemungkinan besar akan crash, memiliki bug atau kutu, dan banyak fitur yang belum ada. Kami tidak menjamin apapun, jadi Anda dipersilahkan menggunakan aplikasi ini dengan menanggung resikonya. Jika menemukan bug/kutu atau ingin meminta suatu fitur, silahkan lapor di %1 - - - - Thank you for trying Olive and we hope you enjoy it! - Terima kasih Anda telah mencoba Olive dan kami harap Anda menyukainya! - - - - Effect - - - Invalid effect - Efek tidak ada - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - Tidak ada kandidat untuk efek '%1'. Efek mungkin korup. Coba menginstal ulang efek tersebut, atau menginstal ulang Olive. - - - Cu&t - &Potong - - - Move &Up - Pindah ke &Atas - - - Move &Down - Pindah ke &Bawah - - - D&elete - &Hapus - - - Load Settings From File - Buka Pengaturan Efek dari File - - - Save Settings to File - Simpan Pengaturan ke File - - - - Save Effect Settings - Simpan Pengaturan Efek - - - - - Effect XML Settings %1 - Pengaturan XML Efek %1 - - - - Save Settings Failed - Gagal Menyimpan Pengaturan - - - - Failed to open "%1" for writing. - Gagal menulis file "%1". - - - - Load Effect Settings - Buka Pengaturan Efek - - - - - Load Settings Failed - Gagal Membuka Pengaturan - - - - Failed to open "%1" for reading. - considering changing "file" to the defined equivalent "berkas", but it might not be familiar to most people - Gagal membaca file "%1". - - - - This settings file doesn't match this effect. - File pengaturan ini tidak cocok dengan efek yang dipilih. - - - - EffectControls - - &Paste - &Tempel - - - - (none) - (tidak ada) - - - - Effects: - Efek: - - - - Add Video Effect - Masukkan Efek Video - - - - VIDEO EFFECTS - EFEK VIDEO - - - - Add Video Transition - Masukkan Transisi Video - - - - Add Audio Effect - Masukkan Efek Audio - - - - AUDIO EFFECTS - EFEK AUDIO - - - - Add Audio Transition - Masukkan Transisi Audio - - - (Multiple clips selected) - (Beberapa klip terseleksi) - - - - EffectRow - - - Disable Keyframes - Matikan Keyframe - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Mematikan keyframe akan menghapus semua keyframe di efek ini. Benarkah Anda ingin melakukan hal tersebut? - - - - EffectUI - - - %1 (Opening) - %1 (Membuka) - - - - %1 (Closing) - %1 (Menutup) - - - - %1 (multiple) - %1 (beberapa) - - - - Cu&t - &Potong - - - - &Copy - &Salin - - - - Move &Up - Pindah ke &Atas - - - - Move &Down - Pindah ke &Bawah - - - - D&elete - &Hapus - - - - Load Settings From File - Buka Pengaturan Efek dari File - - - - Save Settings to File - Simpan Pengaturan ke File - - - - EmbeddedFileChooser - - - File: - - - - - ExportDialog - - - Export "%1" - Ekspor "%1" - - - - Unknown codec name %1 - Kodek %1 tidak diketahui - - - - Export Failed - Gagal Mengekspor - - - - Export failed - %1 - Gagal mengekspor - %1 - - - - Invalid dimensions - Dimensi salah - - - - Export width and height must both be even numbers/divisible by 2. - Lebar dan tinggi video ekspor harus genap/habis dibagi 2. - - - - Invalid codec - Kodek salah - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Tidak dapat menset pengaturan keluaran/output. Ini merupakan kesalahan, silahkan hubungi pengembang aplikasi. - - - - Invalid format - Format salah - - - - Couldn't determine output format. This is a bug, please contact the developers. - Tidak dapat memilih format keluaran/output. Ini merupakan kutu/bug, silahkan hubungi pengembang aplikasi. - - - - Export Media - Ekspor Media - - - - %p% (Total: %1:%2:%3) - %p% (Lama: %1:%2:%3) - - - - %p% (ETA: %1:%2:%3) - %p% (Perkiraan: %1:%2:%3) - - - - Quality-based (Constant Rate Factor) - Berbasis kualitas (CRF) - - - - Constant Bitrate - Laju bit konstan (CBR) - - - - - Invalid Codec - Kodek Salah - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Tidak dapat mencari enkoder yang cocok untuk kodek ini. Ekspor kemungkinan gagal. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Tidak dapat menentukan format piksel untuk enkoder ini. Ekspor kemungkinan gagal. - - - - Bitrate (Mbps): - Laju bit (Mbps): - - - - Quality (CRF): - Kualitas (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Faktor kualitas: - -0 = lossless / tidak terkompresi -17-18 = lossless secara visual (masih terkompresi namun tidak terlihat pecah-pecah) -23 = kualitas tinggi -51 = kualitas paling rendah +%1 + - - Target File Size (MB): - Ukuran File yang Ditargetkan (MB): + + Error saving settings + - - Format: - - - - - Range: - Sepanjang: - - - - Entire Sequence - Seluruh rangkaian - - - - In to Out - Masuk hingga Keluar - - - - Video - - - - - - Codec: - Kodek: - - - - Width: - Lebar: - - - - Height: - Tinggi: - - - - Frame Rate: - Laju frame (fps): - - - - Compression Type: - Jenis Kompresi: - - - - Advanced - Pengaturan Lanjut - - - - Audio - - - - - Sampling Rate: - Laju sampel: - - - - Bitrate (Kbps/CBR): - Laju bit (Kbps/CBR): + + Failed to save application settings. The application may lack write permissions to this location. + - ExportThread + Footage - - failed to send frame to encoder (%1) - gagal mengirim frame ke enkoder (%1) + + %1 FPS + - - failed to receive packet from encoder (%1) - gagal menerima paket dari enkoder (%1) + + %1 Hz + - - could not video encoder for %1 - tidak dapat mencari enkoder video untuk %1 + + Filename: %1 + - - could not allocate video stream - tidak dapat mengalokasikan stream video - - - - could not allocate video encoding context - tidak dapat mengalokasikan konteks mengenkode video - - - - could not open output video encoder (%1) - tidak dapat membuka enkoder video keluaran (%1) - - - - could not copy video encoder parameters to output stream (%1) - tidak dapat menyalin parameter enkoder video ke stream keluaran (%1) - - - - could not audio encoder for %1 - tidak dapat mencari enkoder audio untuk %1 - - - - could not allocate audio stream - tidak dapat mengalokasikan stream audio - - - - could not allocate audio encoding context - tidak dapat mengalokasikan konteks mengenkode audio - - - - could not open output audio encoder (%1) - tidak dapat membuka enkoder audio keluaran (%1) - - - - could not copy audio encoder parameters to output stream (%1) - tidak dapat menyalin parameter enkoder audio ke stream keluaran (%1) - - - - could not allocate audio buffer (%1) - tidak dapat mengalokasikan buffer audio (%1) - - - - could not create output format context - tidak dapat membuat konteks format keluaran - - - - could not open output file (%1) - tidak dapat membuka file keluaran (%1) - - - - could not write output file header (%1) - tidak dapat menulis header untuk file keluaran (%1) - - - - could not write output file trailer (%1) - tidak dapat menulis trailer untuk file keluaran (%1) + + This footage is not valid for use + - FillLeftRightEffect + ImportTool - - Type - Tipe + + Don't ask me again + - - Fill Left with Right - Penuhi Suara Kiri dengan Kanan + + No Active Sequence + - - Fill Right with Left - Penuhi Suara Kanan dengan Kiri + + No sequence is currently open. Would you like to create one? + + + + + Automatically Detect Parameters From Footage + + + + + Set Parameters Manually + - Frei0rEffect + MoveItemCommand - - Failed to load Frei0r plugin "%1": %2 - Gagal membuka plugin Frei0r "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - CATATAN: Plugin Frei0r 32-bit tidak dapat dibuka dalam Olive versi 64-bit. Silahkan mencari versi 64-bit dari plugin ini atau instal Olive versi 32-bit. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - CATATAN: Plugin Frei0r 64-bit tidak dapat dibuka dalam Olive versi 32-bit. Silahkan mencari versi 32-bit dari plugin ini atau instal Olive versi 64-bit. - - - - Error loading Frei0r plugin - Gagal membuka plugin Frei0r + + Move Item + - GraphEditor + NodeCopyPasteWidget - - Graph Editor - Pengedit Grafik + + Error pasting nodes + - - Linear - Linier - - - - Bezier - Kurva Bezier - - - - Hold - Tahan + + Failed to paste nodes: %1 + - GraphView + NodeFactory - - Zoom to Selection - Perbesar ke Seleksi - - - - Zoom to Show All - Perlihatkan Semua - - - - Reset View - Kembalikan Seperti Semula + + None + - InterlacingName + NodeViewItem - - None (Progressive) - Tidak ada (Progresif) - - - - Top Field First - Utamakan Bidang Atas - - - - Bottom Field First - Utamakan Bidang Bawah - - - - Invalid - Salah + + %1... + - KeyframeNavigator + PresetManager - - Enable Keyframes - Nyalakan Keyframe + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + - KeyframeView + RatioDialog - - Linear - Linier + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Bezier - + + Invalid custom ratio + - - Hold - Tahan + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - LabelSlider + RenameItemCommand - - &Edit - - - - - &Reset to Default - &Kembalikan seperti Semula - - - - - Set Value - Ubah Jumlah - - - - - New value: - "value" actually would be "harga" or "nilai" but it probably won't fit - Jumlah: - - - - LoadDialog - - - Loading... - Memuat... - - - - Loading '%1'... - Memuat '%1'... - - - - Cancel - Batalkan - - - - LoadThread - - - Version Mismatch - Versi Tak Cocok - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Proyek ini disimpan menggunakan versi Olive yang lain dan mungkin tidak sepenuhnya kompatibel dengan versi ini. Tetap dibuka? - - - - Invalid Clip Link - Tautan Klip Salah - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Proyek ini terdapat tautan klip yang salah, kemungkinan korup. Tetap dibuka? - - - - %1 - Line: %2 Col: %3 - %1 - Baris: %2 Kolom: %3 - - - - User aborted loading - Pengguna membatalkan pemuatan proyek - - - - XML Parsing Error - Gagal Membaca XML - - - - Couldn't load '%1'. %2 - Tidak dapat membaca '%1'. %2 - - - - Project Load Error - Gagal Memuat Proyek - - - - Error loading project: %1 - Gagal memuat proyek: %1 - - - - MainWindow - - - Welcome to %1 - Selamat datang di %1 - - - - &File - - - - - &New - &Buat - - - - &Open Project - Buka &Proyek - - - - Clear Recent List - Hapus Daftar "Terakhir Dibuka" - - - - Open Recent - Terakhir Dibuka - - - - &Save Project - &Simpan Proyek - - - - Save Project &As - Simpan Proyek Seba&gai - - - - &Import... - &Impor... - - - - &Export... - &Ekspor... - - - - E&xit - &Keluar - - - - &Edit - - - - - &Undo - &Urung - - - - Redo - Ulangi - - - - Select &All - Seleksi &Semua - - - - Deselect All - Batalkan Semua Seleksi - - - - Ripple to In Point - Atur hingga Titik Masuk - - - - Ripple to Out Point - Atur hingga Titik Keluar - - - - Edit to In Point - Edit ke Titik Masuk - - - - Edit to Out Point - Edit ke Titik Keluar - - - - Delete In/Out Point - Hapus Titik Masuk/Keluar - - - - Ripple Delete In/Out Point - Hapus dan Sesuaikan Titik Masuk/Keluar - - - - Set/Edit Marker - Set/Edit Penanda - - - - &View - &Tampilan - - - - Zoom In - Perbesar Tampilan - - - - Zoom Out - Perkecil Tampilan - - - - Increase Track Height - Lebarkan Trek - - - - Decrease Track Height - Persempit Trek - - - - Toggle Show All - "show all" - Perlihatkan Semua - - - - Track Lines - Garis Trek - - - - Rectified Waveforms - "flatten" or "center at bottom" - Visualisasi Audio Rata Bawah - - - - Frames - Frame - - - - Drop Frame - - - - - Non-Drop Frame - - - - - Milliseconds - Milisekon - - - - Title/Action Safe Area - Area Aman Judul/Aksi - - - - Off - Matikan - - - - Default - - - - - 4:3 - - - - - 16:9 - - - - - Custom - Kustom - - - - Full Screen - Layar Penuh - - - - Full Screen Viewer - Penampil Layar Penuh - - - - &Playback - &Pemutaran - - - - Go to Start - Lompat ke Awal - - - - Previous Frame - Frame sebelumnya - - - - Play/Pause - Mainkan/Berhenti - - - - Play In to Out - Mainkan dari Titik Masuk hingga Keluar - - - - Next Frame - Frame Berikutnya - - - - Go to End - Lompat ke Akhir - - - - Go to Previous Cut - Lompat ke Cut Sebelumnya - - - - Go to Next Cut - Lompat ke Cut Berikutnya - - - - Go to In Point - Lompat ke Titik Masuk - - - - Go to Out Point - Lompat ke Titik Keluar - - - - Shuttle Left - Jalankan ke Kiri - - - - Shuttle Stop - Hentikan jalan - - - - Shuttle Right - Jalankan ke Kanan - - - - Loop - Putar secara Berulang - - - - &Window - &Jendela - - - - Project - Proyek - - - - Effect Controls - Pengaturan Efek - - - - Timeline - Garis Waktu - - - - Graph Editor - Pengedit Grafik - - - - Media Viewer - Penampil Media - - - - Sequence Viewer - Penampil Rangkaian - - - - Maximize Panel - Lebarkan Panel - - - - Lock Panels - Kunci Panel - - - - Reset to Default Layout - Kembalikan Layout Semula - - - - &Tools - &Alat - - - - Pointer Tool - Alat Tunjuk - - - - Edit Tool - Alat Edit - - - - Ripple Tool - Alat Pengatur - - - - Razor Tool - Alat Potong - - - - Slip Tool - Alat Slip - - - - Slide Tool - Alat Geser Klip - - - - Hand Tool - Alat Geser Tampilan - - - - Transition Tool - Alat Transisi - - - - Enable Snapping - Nyalakan Lekatan - - - - Auto-Cut Silence - Potong Audio Senyap - - - Selecting Also Seeks - idk how to translate this - Menyeleksi Juga Menggeser - - - Edit Tool Also Seeks - Alat Edit Juga Menggeser - - - Edit Tool Selects Links - Alat Edit Menyeleksi Tautan - - - Seek Also Selects - Menggeser Juga Menyeleksi - - - Seek to the End of Pastes - Geser hingga Akhir Tempelan - - - Scroll Wheel Zooms - Scroll Wheel Memperbesar/Memperkecil Tampilan - - - Hold CTRL to toggle this setting - Tekan CTRL untuk mengaktifkan pengaturan ini - - - Invert Timeline Scroll Axes - Balikkan Arah Gulir Garis Waktu - - - Enable Drag Files to Timeline - Seret dan Lepas file ke Timeline - - - Auto-Scale By Default - Atur Ukuran Video sebagai Default - - - Enable Seek to Import - Nyalakan Geser-untuk-Impor - - - Audio Scrubbing - Nyalakan Audio Scrubbing - - - Enable Drop on Media to Replace - Seret pada Media untuk Menggantikan - - - Enable Hover Focus - Nyalakan Fokus Melayang - - - Ask For Name When Setting Marker - Tanyakan Nama ketika Menaruh Penanda - - - - No Auto-Scroll - Matikan Gulir Otomatis - - - - Page Auto-Scroll - Gulir Halaman Otomatis - - - - Smooth Auto-Scroll - Gulir Halus Otomatis - - - - Preferences - Preferensi - - - - Clear Undo - Hapus Daftar Urung (Undo) - - - - &Help - &Bantuan - - - - A&ction Search - &Cari Aksi - - - - Debug Log - Awakutu / Debug - - - - &About... - &Tentang... - - - - <untitled> - <belum dinamai> - - - - Marker - - - Set Marker - Masukkan Penanda - - - - Set clip marker name: - Masukkan nama penanda: - - - - Set sequence marker name: - Masukkan nama penanda rangkaian: - - - - Media - - - New Folder - Folder Baru - - - - Name: - Nama: - - - - Filename: - Nama file: - - - - Video Dimensions: - Dimensi Video: - - - - Frame Rate: - Laju frame: - - - - %1 field(s) (%2 frame(s)) - %1 baris (%2 frame) - - - - Interlacing: - Mode interlace: - - - - Audio Frequency: - Frekuensi Audio: - - - - Audio Channels: - Kanal Audio: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Nama: %1 -Dimensi Video: %2x%3 -Laju Frame: %4 -Frekuensi Audio: %5 -Tata Audio: %6 - - - - Name - Nama - - - - Duration - Durasi - - - - Rate - Laju - - - - MediaPropertiesDialog - - - "%1" Properties - Properti "%1" - - - - Tracks: - Daftar trek: - - - - Video %1: %2x%3 %4FPS - - - - - Audio %1: %2Hz %3 - - - - - %n channel(s) - - %n kanal - - - - - Conform to Frame Rate: - Ubah laju frame menjadi: - - - - Alpha is Premultiplied - Idk how to translate this either - Alpha dipremultiplikasi - - - - Auto (%1) - - - - - Interlacing: - Mode interlace: - - - - Name: - Nama: - - - - MenuHelper - - - &Project - &Proyek Baru - - - - &Sequence - &Rangkaian Baru - - - - &Folder - &Folder Baru - - - - Set In Point - Set Titik Masuk - - - - Set Out Point - Set Titik Keluar - - - - Reset In Point - Kembalikan Titik Masuk - - - - Reset Out Point - Kembalikan Titik Keluar - - - - Clear In/Out Point - Hapus Titik Masuk/Keluar - - - - Add Default Transition - Masukkan Transisi Biasa - - - - Link/Unlink - Tautkan/Lepaskan - - - - Enable/Disable - Nyalakan/Matikan - - - - Nest - Sarangkan - - - - Cu&t - &Potong - - - - Cop&y - &Salin - - - - - &Paste - &Tempel - - - - Paste Insert - Tempel dan Masukkan - - - - Duplicate - Gandakan - - - - Delete - Hapus - - - - Ripple Delete - literally the function of ripple delete: "delete and adjust" - Hapus dan Sesuaikan - - - - Split - Pisahkan - - - - Invalid aspect ratio - Rasio aspek salah - - - - The aspect ratio '%1' is invalid. Please try again. - Rasio aspek '%1' salah. Silahkan coba lagi. - - - - Enter custom aspect ratio - Masukkan rasio aspek kustom - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Masukkan rasio aspek yang ingin dipakai untuk area aman judul/aksi (contohnya 16:9): - - - - NewSequenceDialog - - - Editing "%1" - Mengedit "%1" - - - - New Sequence - Rangkaian Baru - - - - Preset: - - - - - Film 4K - - - - - TV 4K (Ultra HD/2160p) - - - - - 1080p - - - - - 720p - - - - - 480p - - - - - 360p - - - - - 240p - - - - - 144p - - - - - NTSC (480i) - - - - - PAL (576i) - - - - - Custom - Kustom - - - - Video - - - - - Width: - Lebar: - - - - Height: - Tinggi: - - - - Frame Rate: - Laju frame (fps): - - - - Pixel Aspect Ratio: - Rasio aspek piksel: - - - - Square Pixels (1.0) - Persegi (1.0) - - - - Interlacing: - Mode interlace: - - - - None (Progressive) - Tidak ada (Progresif) - - - - Audio - - - - - Sample Rate: - Laju sampel: - - - - Name: - Nama: - - - - OliveGlobal - - - Olive Project %1 - Proyek Olive %1 - - - - Auto-recovery - Auto-pulih - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive tidak ditutup sebagaimana mestinya, dan ditemukan sebuah file auto-pulih. Buka? - - - - Open Project... - Buka Proyek... - - - - Missing recent project - Proyek Terakhir Tidak Ada - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Proyek '%1' tidak ada lagi. Hapus dari daftar "proyek terakhir"? - - - - Save Project As... - Simpan Proyek Sebagai... - - - - Unsaved Project - Proyek Belum Disimpan - - - - This project has changed since it was last saved. Would you like to save it before closing? - Proyek ini diubah sejak terakhir disimpan. Simpan sebelum ditutup? - - - - No active sequence - Tidak ada rangkaian aktif - - - - Please open the sequence to perform this action. - Buka dahulu rangkaian untuk melakukan aksi ini. - - - - No clips selected - Tidak ada klip yang diseleksi - - - - Select the clips you wish to auto-cut - Silahkan seleksi terlebih dahulu klip-klip yang Anda ingin potong secara otomatis - - - Please open the sequence you wish to export. - Buka dahulu rangkaian/sequence yang ingin diekspor. - - - - Missing Project File - File Proyek Tidak Ada - - - - Specified project '%1' does not exist. - Proyek yang dipilih, '%1', tidak ditemukan. - - - - PanEffect - - - Pan - Geser/Pan - - - - PreferencesDialog - - - Preferences - Preferensi - - - - Default Sequence - Rangkaian Default - - - - Invalid CSS File - File CSS Salah - - - - CSS file '%1' does not exist. - Tidak ditemukan file CSS '%1'. - - - - Confirm Reset All Shortcuts - Konfirmasi - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - Anda akan mengembalikan semua pintasan keyboard seperti semula. Lanjut? - - - - Import Keyboard Shortcuts - Impor Pintasan Keyboard - - - - - Error saving shortcuts - Gagal menyimpan pintasan - - - - Failed to open file for reading - Gagal membuka file - - - - Export Keyboard Shortcuts - Ekspor Pintasan Keyboard - - - - Export Shortcuts - Ekspor Pintasan - - - - Shortcuts exported successfully - Pintasan berhasil diekspor - - - - Failed to open file for writing - Gagal membaca file - - - - Browse for CSS file - Buka file CSS - - - - Delete All Previews - Hapus Semua Pratinjau - - - - Are you sure you want to delete all previews? - Yakin menghapus semua pratinjau? - - - - Previews Deleted - Pratinjau Dihapus - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - Semua pratinjau berhasil dihapus. Anda mungkin perlu membuka proyek kembali. - - - - Language: - Bahasa: - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - Pindahkan kursor secara otomatis ke awal ketika mencapai akhir rangkaian - - - - Selecting Also Seeks - Menyeleksi juga menggeser - - - - Edit Tool Also Seeks - Alat Edit juga menggeser - - - - Edit Tool Selects Links - Alat Edit menyeleksi tautan - - - - Seek Also Selects - Menggeser juga menyeleksi - - - - Seek to the End of Pastes - Geser hingga akhir tempelan - - - - Scroll Wheel Zooms - Scroll Wheel memperbesar/memperkecil tampilan - - - - Hold CTRL to toggle this setting - Tekan CTRL untuk mengaktifkan pengaturan ini - - - - Invert Timeline Scroll Axes - Balikkan arah gulir Garis Waktu - - - - Enable Drag Files to Timeline - Seret dan Lepas file ke Garis Waktu - - - - Auto-Scale By Default - Atur ukuran video secara default - - - - Auto-Seek to Imported Clips - Geser hingga awal klip yang diimpor - - - - Audio Scrubbing - Nyalakan Audio Scrubbing - - - - Drop Files on Media to Replace - Lepas file pada media untuk menggantikan - - - - Enable Hover Focus - Nyalakan fokus melayang - - - - Ask For Name When Setting Marker - Tanyakan nama ketika menaruh penanda - - - - Custom CSS: - CSS Kustom: - - - - Browse - Telusur - - - - Image sequence formats: - Format rangkaian gambar: - - - - Audio Recording: - Rekaman audio: - - - - Mono - - - - - Stereo - Stereo - - - - Effect Textbox Lines: - Baris Teks Efek: - - - - Thumbnail Resolution: - according to kbbi it should be "keluku" but not a lot of people know that - Resolusi thumbnail: - - - - Waveform Resolution: - Resolusi waveform: - - - - Delete Previews - Hapus Pratinjau - - - - Use Software Fallbacks When Possible - Gunakan software fallback sebisa mungkin - - - - Default Sequence Settings - Pengaturan Rangkaian - - - - General - - - - - Behavior - Kelakuan - - - - Add Default Effects to New Clips - Tambahkan efek-efek biasa pada klip baru - - - - Appearance - Penampilan - - - - Theme - Tema - - - - Olive Dark (Default) - Gelap (Default) - - - - Olive Light - Terang - - - - Native - Selaras/native - - - - Native (Light Icons) - Selaras (Ikon Terang) - - - - Use Native Menu Styling - Gunakan gaya menu Selaras - - - Seeking - "geser" may not be understood well - Tampilan Frame - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - Tampilan Akurat -Selalu tampilkan frame yang sebenarnya (dapat terhenti sejenak sembari mencari frame yang benar) - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - Tampilan Cepat -Tampilkan frame dengan cepat (dapat menampilkan frame yang salah ketika menggeser kursor di timeline - tidak berpengaruh pada pemutaran/ekspor) - - - - Memory Usage - Pemakaian Memori - - - - Upcoming Frame Queue: - Antrian frame ke depan: - - - - - frames - frame - - - - - seconds - detik - - - - Previous Frame Queue: - Antrian frame ke belakang: - - - - Playback - Pemutaran - - - - Output Device: - Peranti output: - - - - - Default - - - - - Input Device: - Peranti masukan: - - - - Sample Rate: - Laju sampel: - - - - Audio - - - - - Search for action or shortcut - Cari aksi atau pintasan - - - - Action - Aksi - - - - Shortcut - Pintasan - - - - Import - Impor - - - - Export - Ekspor - - - - Reset Selected - Kembalikan Terseleksi - - - - Reset All - Kembalikan Semua - - - - Keyboard - - - - - PreviewGenerator - - - Failed to find any valid video/audio streams - Gagal mencari stream video/audio yang benar - - - - Could not open file - %1 - Tidak dapat membuka file - %1 - - - - Could not find stream information - %1 - Tidak dapat mencari informasi stream - %1 - - - - Project - - - New - "make" instead of "new", for readability - Buat - - - - Open Project - Buka Proyek - - - - Save Project - Simpan Proyek - - - - Undo - Urung - - - - Redo - Ulangi - - - - Tree View - Tampilan Pohon - - - - Icon View - Tampilan Ikon - - - - List View - Tampilan Daftar - - - - Search media, markers, etc. - Cari media, penanda, dll. - - - - Project - Proyek - - - - Sequence - Rangkaian - - - - Replace '%1' - Ganti '%1' - - - - - All Files - Semua file - - - - - No active sequence - Tidak ada rangkaian aktif - - - - No sequence is active, please open the sequence you want to replace clips from. - Tidak ada rangkaian aktif, silahkan buka rangkaian yang akan diganti klipnya. - - - - Active sequence selected - Rangkaian aktif terseleksi - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - Anda tak dapat memasukkan rangkaian ke dalam rangkaian itu sendiri, jadi tidak ada klip sejenis ini dalam rangkaian. - - - - Rename '%1' - Ganti nama '%1' - - - - Enter new name: - Masukkan nama pengganti: - - - - Delete media in use? - Hapus media yang sedang dipakai? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - Media '%1' sedang dipakai dalam '%2'. Menghapus media tersebut akan menghapus semua kemunculan media dalam rangkaian. Yakin akan melakukan hal tersebut? - - - - Skip - Lewati - - - - Import a Project - Impor Proyek - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" adalah file proyek Olive. File tersebut akan tergabung dengan proyek ini. Lanjutkan? - - - - Image sequence detected - Rangkaian gambar terdeteksi - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - File '%1' sepertinya merupakan rangkaian gambar. Impor sebagai rangkaian gambar? - - - - Import media... - Impor media... - - - - No sequence is active, please open the sequence you want to delete clips from. - Tidak ada rangkaian aktif, silahkan buka rangkaian yang Anda ingin hapus klipnya. - - - - ProxyDialog - - - Create Proxy - Buat Proksi - - - - Proxy - Proksi - - - - Dimensions: - Ukuran: - - - - Same Size as Source - Sama dengan Sumber - - - - Half Resolution (1/2) - Resolusi setengah (1/2) - - - - Quarter Resolution (1/4) - Resolusi seperempat (1/4) - - - - Eighth Resolution (1/8) - Resolusi seperdelapan (1/8) - - - - Sixteenth Resolution (1/16) - Resolusi seperenambelas (1/16) - - - - Format: - - - - - ProRes HQ - - - - - Location: - Lokasi: - - - - Same as Source (in "%1" folder) - Sama dengan Sumber (dalam folder "%1") - - - - Proxy file exists - File proksi sudah ada - - - - The file "%1" already exists. Do you wish to replace it? - File "%1" sudah ada. Ganti? - - - - Custom Location - Lokasi Kustom - - - - ProxyGenerator - - - Finished generating proxy for "%1" - Selesai membuat proksi untuk "%1" - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - Ganti klip yang menggunakan "%1" - - - - Select which media you want to replace this media's clips with: - Pilih media pengganti: - - - - Keep the same media in-points - Samakan titik masuk media - - - - Replace - Ganti - - - - Cancel - Batalkan - - - - No media selected - Tidak ada media yang diseleksi - - - - Please select a media to replace with or click 'Cancel'. - Pilih media pengganti atau klik "Batalkan". - - - - Same media selected - Terseleksi media yang sama - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Anda menyeleksi media yang sama dengan yang akan diganti. Silahkan pilih yang lain atau klik "Batalkan". - - - - Folder selected - Folder terseleksi - - - - You cannot replace footage with a folder. - Anda tidak dapat mengganti media dengan folder. - - - - Active sequence selected - Rangkaian aktif terseleksi - - - - You cannot insert a sequence into itself. - Anda tidak dapat memasukkan rangkaian pada rangkaian itu sendiri. - - - - RichTextEffect - - - Text - Teks - - - - Padding - Ruang Border - - - - Position - Posisi - - - - Vertical Align: - Rata Vertikal: - - - - Top - Atas - - - - Center - Tengah - - - - Bottom - Bawah - - - - Auto-Scroll - Gulir otomatis - - - - Off - Matikan - - - - Up - Ke atas - - - - Down - Ke bawah - - - - Left - Ke kiri - - - - Right - Ke kanan - - - - Shadow - Bayangan - - - - Shadow Color - Warna Bayangan - - - - Shadow Angle - Arah Bayangan - - - - Shadow Distance - Jarak Bayangan - - - - Shadow Softness - Kehalusan Bayangan - - - - Shadow Opacity - "opacity" is a hard word to find a suitable meaning for - Intensitas Bayangan + + Rename Item + Sequence - - %1 (copy) - %1 (salinan) - - - - ShakeEffect - - - Intensity - Intensitas - - - - Rotation - Rotasi - - - - Frequency - Frekuensi - - - - SolidEffect - - - Type - Tipe - - - - Solid Color - Warna - - - - SMPTE Bars - - - - - Checkerboard - Kotak-Kotak - - - - Opacity - - - - - Color - Warna - - - - Checkerboard Size - Ukuran Kotak-Kotak - - - - SourcesCommon - - - Import... - Impor... - - - - New - thought it'd made more sense to have the user read it as "buat -> rangkaian baru" ("create new sequence"), instead of "baru -> rangkaian" - Buat - - - - View - Tampilan - - - - Tree View - Tampilan Pohon - - - - Icon View - Tampilan Ikon - - - - Show Toolbar - Tampilkan Toolbar - - - - Show Sequences - Tampilkan Rangkaian - - - - Replace/Relink Media - Ganti/Taut Media - - - - Reveal in Explorer - Buka di Explorer - - - - Reveal in Finder - Buka di Finder - - - - Reveal in File Manager - Buka di Manajer Berkas - - - - Replace Clips Using This Media - Ganti Semua Klip yang Menggunakan Media Ini - - - - Create Sequence With This Media - Buat Rangkaian dengan Media Ini - - - - Duplicate - Gandakan - - - - Delete All Clips Using This Media - Hapus Semua Klip yang Menggunakan Media Ini - - - - Proxy - Proksi - - - - Generating proxy: %1% complete - Membuat proksi: %1% - - - - Create/Modify Proxy - Buat/Ubah Proksi - - - - Create Proxy - Buat Proksi - - - - Modify Proxy - Ubah Proksi - - - - Restore Original - Kembalikan Seperti Semula - - - - Delete - Hapus - - - - Preview in Media Viewer - Pratayang di Penampil Media - - - - Properties... - Properti... - - - - Replace Media - Ganti Media - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Anda menjatuhkan file ke '%1'. Ganti klip dengan file tersebut? - - - - Delete proxy - Hapus proksi - - - - Would you like to delete the proxy file "%1" as well? - Hapus file proksi "%1" juga? - - - - SpeedDialog - - - Speed/Duration - Kecepatan/Durasi - - - - Speed: - Kecepatan: - - - - Frame Rate: - Laju frame (fps): - - - - Duration: - Durasi: - - - - Reverse - Terbalik - - - - Maintain Audio Pitch - Tahan Pitch - - - - Ripple Changes + + %1 FPS - TextEditDialog + Stream - - Edit Text - Edit Teks - - - - Thin + + %1: Audio - %2 Channels, %3Hz - - Extra Light + + %1: Unknown - - Light + + %1: Image - %2x%3 - - Normal - - - - - Medium - - - - - Demi Bold - - - - - Bold - - - - - Extra Bold - - - - - Black + + %1: Video - %2x%3 - TextEditEx + TimelineViewBlockItem - - Edit Text - Edit Teks - - - - &Edit Text - &Edit Teks - - - - TextEffect - - - Text - Teks - - - - Font - Fon - - - - Size - Ukuran - - - - Color - Warna - - - - Alignment - Rata - - - - Left - Kiri - - - - - Center - Tengah - - - - Right - Kanan - - - - Justify - Kanan-Kiri - - - - Top - Atas - - - - Bottom - Bawah - - - - Word Wrap - "bungkus kata" is also possible but feels weird - Sesuaikan Lebar Kata - - - - Padding - Ruang Border - - - - Position - Posisi - - - - Outline - Garis Teks - - - - Outline Color - Warna Garis - - - - Outline Width - Ketebalan Garis - - - - Shadow - Bayangan - - - - Shadow Color - Warna Bayangan - - - - Shadow Angle - Arah Bayangan - - - - Shadow Distance - Jarak Bayangan - - - - Shadow Softness - Kehalusan Bayangan - - - - Shadow Opacity - Intensitas Bayangan - - - - Sample Text - Masukkan teks disini - - - - TimecodeEffect - - - Timecode - Kode Waktu - - - - Sequence - Rangkaian - - - - Media - - - - - Scale - Ukuran - - - - Color - Warna - - - - Background Color - Warna Latar - - - - Background Opacity - Transparansi Latar - - - - Offset - Penggeseran - - - - Prepend - Teks Sebelum - - - - Timeline - - - Pointer Tool - Alat Tunjuk - - - - Edit Tool - Alat Edit - - - - Ripple Tool - Alat Pengatur - - - - Razor Tool - Alat Potong - - - - Slip Tool - Alat Slip - - - - Slide Tool - Alat Geser Klip - - - - Hand Tool - Alat Geser Tampilan - - - - Transition Tool - Alat Transisi - - - - Snapping - Lekatan - - - - Zoom In - Perbesar Tampilan - - - - Zoom Out - Perkecil Tampilan - - - - Record audio - Rekam suara - - - - Add title, solid, bars, etc. - Masukkan judul, warna, bars, dll. - - - - Nested Sequence - Rangkaian Bersarang - - - - Effect already exists - Efek sudah ada - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - Klip '%1' sudah memiliki efek '%2'. Ganti dengan yang akan ditempel atau tambahkan sebagai efek sendiri? - - - - Add - Tambah - - - - Replace - Ganti - - - - Skip - Lewati - - - - Do this for all conflicts found - Lakukan untuk semua konflik yang ditemukan - - - - Title... - Judul... - - - - Solid Color... - Warna... - - - - Bars... - - - - - Tone... - Nada... - - - - Noise... - - - - - Unsaved Project - Proyek Belum Disimpan - - - - You must save this project before you can record audio in it. - Proyek ini harus disimpan sebelum merekam suara. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Klik tempat dimana Anda akan mulai merekam (seret untuk membatasi rekaman dalam waktu tertentu) - - - - Timeline: - Garis Waktu: - - - - (none) - (tidak ada) - - - - TimelineHeader - - - Center Timecodes - Ratakan Kode Waktu - - - - TimelineWidget - - - &Undo - "takjadi" and "batalkan" are also possible translations - &Urung - - - - &Redo - "kembalikan" is also possible - &Ulangi - - - &Paste - &Tempel - - - - R&ipple Delete Empty Space - Hapus dan Sesuaikan Ruang &Kosong - - - - Sequence Settings - Pengaturan Rangkaian - - - - &Speed/Duration - &Kecepatan/Durasi - - - Auto-s&cale - Per&besar otomatis - - - - Auto-Cut Silence - Potong Audio Senyap - - - - Auto-S&cale - Per&besar Otomatis - - - - &Reveal in Project - &Buka di Proyek - - - - Properties - Properti - - - + %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Mulai: %2 -Akhir: %3 -Durasi: %4 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Error - - - - - Couldn't locate media wrapper for sequence. - Tidak dapat mencari bungkus media untuk rangkaian. - - - - Title - Judul - - - - Solid Color - Warna - - - + Bars - + + Solid + + + + + Title + Judul + + + Tone - Nada + Nada - - Noise - Noise - - - - Duration: - Durasi: + + Unknown + - ToneEffect + VideoParams - - Type - Tipe + + 8-bit + - - Sine - Sinus + + 16-bit Integer + - - Frequency - Frekuensi + + Half-Float (16-bit) + - - Amount - Kenyaringan + + Full-Float (32-bit) + - - Mix - Campur + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + - TransformEffect + main - + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + qm-file + + + + + Project to open on startup + + + + + olive::AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive adalah aplikasi pengedit video yang bersifat non-linier. Aplikasi ini bebas, gratis, dan terlindungi GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive Team berkewajiban memberitahu pengguna bahwa kode sumber aplikasi ini dapat diunduh dari situs resminya. + + + + olive::ActionSearch + + + Search for action... + Cari Aksi... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + + Length + Panjang + + + + Media In + + + + + Enabled + + + + + Speed + + + + + olive::BlurFilterNode + + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + + + + + olive::ClipBlock + + + Clip + + + + + A time-based node that represents a media source. + + + + + Buffer + + + + + olive::ColorDialog + + + Select Color + + + + + olive::ColorSpaceChooser + + + Color Management + + + + + Input: + + + + + Color Space: + + + + + Display: + + + + + View: + + + + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + Folder Baru + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + Simpan Proyek + + + + + Error + + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + Buka Proyek + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Linier + + + + Bezier + Kurva Bezier + + + + Hold + Tahan + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Pengaturan Lanjut + + + + Pixel + + + + + Pixel Format: + Bentuk piksel: + + + + Performance + + + + + Threads: + Jumlah thread/utas: + + + + olive::ExportAudioTab + + + Codec: + Kodek: + + + + Sample Rate: + Laju sampel: + + + + Channel Layout: + + + + + Format: + + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + Nama file: + + + + Browse for exported file filename + + + + + Preset: + + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Sepanjang: + + + + Entire Sequence + Seluruh rangkaian + + + + In to Out + Masuk hingga Keluar + + + + Format: + + + + + Export Video + + + + + Export Audio + + + + + Video + + + + + Audio + + + + + + Export + Ekspor + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Lebar: + + + + Height: + Tinggi: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + + Fit + Pas + + + + Stretch + + + + + Crop + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + Rasio aspek piksel: + + + + Interlacing: + Mode interlace: + + + + Quality: + + + + + Codec + + + + + Codec: + Kodek: + + + + Advanced + Pengaturan Lanjut + + + + olive::FloatSlider + + + %1 dB + + + + + %1% + + + + + olive::FootagePropertiesDialog + + + "%1" Properties + + + + + Name: + Nama: + + + + Tracks: + Daftar trek: + + + + olive::FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + Telusur + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + Semua file + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Ukuran File yang Ditargetkan (MB): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Tidak ada (Progresif) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Linier + + + + Hold + Tahan + + + + Bezier + Kurva Bezier + + + + olive::KeyframeViewBase + + + Linear + Linier + + + + Bezier + Kurva Bezier + + + + Hold + Tahan + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + &Simpan Proyek + + + + Save Project &As + Simpan Proyek Seba&gai + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + + + + + &New + &Buat + + + + &Open Project + Buka &Proyek + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &Impor... + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + &Keluar + + + + &Edit + + + + + Insert + + + + + Overwrite + + + + + Select &All + Seleksi &Semua + + + + Deselect All + Batalkan Semua Seleksi + + + + Ripple to In Point + Atur hingga Titik Masuk + + + + Ripple to Out Point + Atur hingga Titik Keluar + + + + Edit to In Point + Edit ke Titik Masuk + + + + Edit to Out Point + Edit ke Titik Keluar + + + + Delete In/Out Point + Hapus Titik Masuk/Keluar + + + + Ripple Delete In/Out Point + Hapus dan Sesuaikan Titik Masuk/Keluar + + + + Set/Edit Marker + Set/Edit Penanda + + + + &View + &Tampilan + + + + Zoom In + Perbesar Tampilan + + + + Zoom Out + Perkecil Tampilan + + + + Increase Track Height + Lebarkan Trek + + + + Decrease Track Height + Persempit Trek + + + + Toggle Show All + Perlihatkan Semua + + + + Full Screen + Layar Penuh + + + + Full Screen Viewer + Penampil Layar Penuh + + + + &Playback + &Pemutaran + + + + Go to Start + Lompat ke Awal + + + + Previous Frame + Frame sebelumnya + + + + Play/Pause + Mainkan/Berhenti + + + + Play In to Out + Mainkan dari Titik Masuk hingga Keluar + + + + Next Frame + Frame Berikutnya + + + + Go to End + Lompat ke Akhir + + + + Go to Previous Cut + Lompat ke Cut Sebelumnya + + + + Go to Next Cut + Lompat ke Cut Berikutnya + + + + Go to In Point + Lompat ke Titik Masuk + + + + Go to Out Point + Lompat ke Titik Keluar + + + + Shuttle Left + Jalankan ke Kiri + + + + Shuttle Stop + Hentikan jalan + + + + Shuttle Right + Jalankan ke Kanan + + + + Loop + Putar secara Berulang + + + + &Sequence + &Rangkaian Baru + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + Lebarkan Panel + + + + Lock Panels + Kunci Panel + + + + Reset to Default Layout + Kembalikan Layout Semula + + + + &Tools + &Alat + + + + Pointer Tool + Alat Tunjuk + + + + Edit Tool + Alat Edit + + + + Ripple Tool + Alat Pengatur + + + + Rolling Tool + + + + + Razor Tool + Alat Potong + + + + Slip Tool + Alat Slip + + + + Slide Tool + Alat Geser Klip + + + + Hand Tool + Alat Geser Tampilan + + + + Zoom Tool + + + + + Transition Tool + Alat Transisi + + + + Enable Snapping + Nyalakan Lekatan + + + + Preferences + Preferensi + + + + &Help + &Bantuan + + + + A&ction Search + &Cari Aksi + + + + Send &Feedback... + + + + + &About... + &Tentang... + + + + olive::MainStatusBar + + + Welcome to %1 %2 + Selamat datang di %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + Tampilan + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + Tambah + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + Position - Posisi + Posisi - - Scale - Ukuran - - - - Uniform Scale - Ukuran Merata - - - + Rotation - Rotasi + Rotasi - + + Scale + Ukuran + + + + Uniform Scale + Ukuran Merata + + + Anchor Point - Titik Poros + Titik Poros + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + &Proyek Baru - + + &Sequence + &Rangkaian Baru + + + + &Folder + &Folder Baru + + + + Cu&t + &Potong + + + + Cop&y + &Salin + + + + &Paste + &Tempel + + + + Paste Insert + Tempel dan Masukkan + + + + Duplicate + Gandakan + + + + Delete + Hapus + + + + Ripple Delete + Hapus dan Sesuaikan + + + + Split + Pisahkan + + + + Set In Point + Set Titik Masuk + + + + Set Out Point + Set Titik Keluar + + + + Reset In Point + Kembalikan Titik Masuk + + + + Reset Out Point + Kembalikan Titik Keluar + + + + Clear In/Out Point + Hapus Titik Masuk/Keluar + + + + Add Default Transition + Masukkan Transisi Biasa + + + + Link/Unlink + Tautkan/Lepaskan + + + + Enable/Disable + Nyalakan/Matikan + + + + Nest + Sarangkan + + + + Frames + Frame + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + Milisekon + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + + + + + Math + + + + + Color + Warna + + + + Filter + + + + + Timeline + Garis Waktu + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + Warna + + + + Matrix + + + + + Text + Teks + + + + Font + Fon + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Tipe + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + + (unknown) + (tidak diketahui) + + + + olive::NodeTreeView + + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + Tambah + + + + olive::PanNode + + + + Pan + Geser/Pan + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (tidak ada) + + + + (multiple) + (beberapa) + + + + olive::PathWidget + + + Browse + Telusur + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + Warna + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + Warna + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + Tema + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + Peranti output: + + + + Input Device: + Peranti masukan: + + + + Sample Rate: + Laju sampel: + + + + Audio Recording: + Rekaman audio: + + + + Mono + Mono + + + + Stereo + Stereo + + + + Refresh Devices + + + + + Please wait... + + + + + Default + + + + + olive::PreferencesBehaviorTab + + + Behavior + Kelakuan + + + + General + + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + + + + + Enable audio scrubbing + + + + + Timeline + Garis Waktu + + + + Auto-Seek to Imported Clips + Geser hingga awal klip yang diimpor + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Enable Drag Files to Timeline + + + + + Invert Timeline Scroll Axes + + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Selecting Also Seeks + + + + + Playback + Pemutaran + + + + Ask For Name When Setting Marker + + + + + Automatically rewind at the end of a sequence + + + + + Project + Proyek + + + + Drop Files on Media to Replace + Lepas file pada media untuk menggantikan + + + + Nodes + + + + + Add Default Effects to New Clips + Tambahkan efek-efek biasa pada klip baru + + + + Auto-Scale By Default + + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + Preferensi + + + + General + + + + + Appearance + Penampilan + + + + Behavior + Kelakuan + + + + Disk + + + + + Audio + + + + + Keyboard + + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + Bahasa: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + Cari aksi atau pintasan + + + + Action + Aksi + + + + Shortcut + Pintasan + + + + Import + Impor + + + + Export + Ekspor + + + + Reset Selected + Kembalikan Terseleksi + + + + Reset All + Kembalikan Semua + + + + Confirm Reset All Shortcuts + Konfirmasi + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Anda akan mengembalikan semua pintasan keyboard seperti semula. Lanjut? + + + + Import Keyboard Shortcuts + Impor Pintasan Keyboard + + + + + Error saving shortcuts + Gagal menyimpan pintasan + + + + Failed to open file for reading + Gagal membuka file + + + + Export Keyboard Shortcuts + Ekspor Pintasan Keyboard + + + + Export Shortcuts + Ekspor Pintasan + + + + Shortcuts exported successfully + Pintasan berhasil diekspor + + + + Failed to open file for writing + Gagal membaca file + + + + olive::ProgressDialog + + + Cancel + Batalkan + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &Buat + + + + &Import... + &Impor... + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + Buka di Explorer + + + + Reveal in Finder + Buka di Finder + + + + Reveal in File Manager + Buka di Manajer Berkas + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + Proyek + + + + (none) + (tidak ada) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + Telusur + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + Buka Proyek + + + + Save Project + Simpan Proyek + + + + Undo + Urung + + + + Redo + Ulangi + + + + Search media, markers, etc. + Cari media, penanda, dll. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + Nama + + + + Duration + Durasi + + + + Rate + Laju + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + Nama: + + + + New Sequence + Rangkaian Baru + + + + Editing "%1" + Mengedit "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + + + + + Width: + Lebar: + + + + Height: + Tinggi: + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + Rasio aspek piksel: + + + + Interlacing: + Mode interlace: + + + + Audio + + + + + Sample Rate: + Laju sampel: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + + + + + 720p + + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + Warna + + + + olive::StringSlider + + + (none) + (tidak ada) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + Warna + + + + Radius + + + + Opacity - - Blend Mode - Mode Penggabungan - - - - Normal - + + Inner + - Transition + olive::Task - - Length - Panjang + + Task + + + + + Unknown error + - UpdateNotification + olive::TaskDialog - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - Pembaruan aplikasi telah tersedia. Silahkan kunjungi www.olivevideoeditor.org untuk mengunduhnya. + + Task Failed + - VSTHost + olive::TaskManagerPanel - - - Error loading VST plugin - Gagal membuka plugin VST - - - - Failed to load VST plugin "%1": %2 - Gagal membuka plugin VST "%1": %2 - - - - Failed to locate entry point for dynamic library. - Gagal mencari titik masuk untuk pustaka dinamis (dynamic library). - - - - VST Error - Galat VST - - - - Plugin's magic number is invalid - Identifikasi (magic number) plugin salah - - - - Plugin - - - - - Interface - Antarmuka - - - - Show - Tampilkan - - - - VST Plugin - Plugin VST + + Task Manager + - Viewer + olive::TaskViewItem - - Sequence Viewer - Tampilan Rangkaian + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + Masukkan teks disini - - Media Viewer - Tampilan Media + + + Text + Teks - + + Generate rich text. + + + + + Font + Fon + + + + Font Size + + + + + Color + Warna + + + + Vertical Align + + + + + Top + Atas + + + + Center + Tengah + + + + Bottom + Bawah + + + + olive::TimeBasedPanel + + (none) - (tidak ada) - - - - Drag video only - Tarik video saja - - - - Drag audio only - Tarik audio saja + (tidak ada) - ViewerWidget + olive::TimeBasedWidget - - Save Frame as Image... - Simpan Frame sebagai Gambar... + + Set Marker + Masukkan Penanda - - Show Fullscreen - Tampilkan Layar Penuh + + Marker name: + + + + + olive::TimeInput + + + Time + - - Disable - Matikan + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + Garis Waktu + + + + olive::TimelineWidget + + + + Properties + Properti - - Screen %1: %2x%3 - Layar %1: %2x%3 + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + Alat Tunjuk - + + Edit Tool + Alat Edit + + + + Ripple Tool + Alat Pengatur + + + + Rolling Tool + + + + + Razor Tool + Alat Potong + + + + Slip Tool + Alat Slip + + + + Slide Tool + Alat Geser Klip + + + + Hand Tool + Alat Geser Tampilan + + + + Zoom Tool + + + + + Transition Tool + Alat Transisi + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Linier + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + Sinus + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + + + + + olive::VideoInput + + + Video Input + + + + + Video + + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + Mode interlace: + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + Zoom - Pembesaran + Pembesaran - + Fit - Pas + Pas - - Custom - Kustom + + %1% + - - Close Media - Tutup Media + + Full Screen + Layar Penuh - - Save Frame - Simpan Frame + + Screen %1: %2x%3 + Layar %1: %2x%3 - - Viewer Zoom - Pembesaran Tampilan + + Deinterlace + - - Set Custom Zoom Value: - Masukkan pembesaran kustom: + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + Matikan + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + - ViewerWindow + olive::VolumeNode - - Exit Fullscreen - Keluar dari Layar Penuh - - - - VoidEffect - - - (unknown) - (tidak diketahui) - - - - Missing Effect - Efek Hilang - - - - VolumeEffect - - + + Volume - - - - - transition - - - Invalid transition - Transisi salah + - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - Tidak ada kandidat untuk efek '%1'. Efek mungkin korup. Coba menginstal ulang efek tersebut, atau menginstal ulang Olive. + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/it_IT.ts b/app/ts/it_IT.ts index 79466c81d..5c1b92b6a 100644 --- a/app/ts/it_IT.ts +++ b/app/ts/it_IT.ts @@ -2,3863 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive è un editor video non lineare. Questo è software libero ed è protetto dalla licenza GNU GPL. + + %1 Hz + - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Gli sviluppatori di Olive sono grati di informare che il codice sorgente del programma è scaricabile dal sito. - - - - ActionSearch - - - Search for action... - Cerca un'azione... - - - - AdvancedVideoDialog - - - Advanced Video Settings - Impostazioni video avanzate - - - - Pixel Format: - Formato pixel: - - - - Threads: - Thread: - - - - Audio - - - %1 Audio - Audio %1 - - - - Recording %1 - Registrazione di %1 - - - - AudioNoiseEffect - - - Amount - Ammontare - - - - Mix - Miscela - - - - AutoCutSilenceDialog - - - Cut Silence - Taglia silenzio - - - - Attack Threshold: - Soglia d'attacco: - - - - Attack Time: - Tempo d'attacco: - - - - Release Threshold: - Soglia di rilascio: - - - - Release Time: - Tempo di rilascio: - - - - Cacher - - - - Could not open %1 - %2 - Impossibile aprire %1 - %2 - - - - ChannelLayoutName - - - Invalid - Non valido - - - + Mono - Mono + Mono - + Stereo - Stereo + Stereo + + + + 2.1 + 144p {2.1?} + + + + 5.1 + 144p {5.1?} + + + + 7.1 + 144p {7.1?} + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - Proprietà di "%1" + + Error loading settings + - - Multiple Clip Properties - Proprietà di clip multiple - - - - Name: - Nome: - - - - Duration: - Durata: - - - - (multiple) - (multiple) - - - - CollapsibleWidget - - - <untitled> - <senza titolo> - - - - ColorButton - - - Set Color - Imposta colore - - - - CornerPinEffect - - - Top Left - In alto a sinistra - - - - Top Right - In alto a destra - - - - Bottom Left - In basso a sinistra - - - - Bottom Right - In basso a destra - - - - Perspective - Prospettico - - - - DebugDialog - - - Debug Log - Log di debug - - - - DemoNotice - - - - Welcome to Olive! - Maschile riferito all'utente - Benvenuto in Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive è un editor video libero non lineare rilasciato sotto licenza GNU GPL. Se hai pagato per questo programma, sei stato truffato. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Il software è attualmente in ALFA; ciò significa che non è stabile ed è probabile che vada in crash, abbia errori o manchino alcune funzioni. Non offriamo alcuna garanzia, quindi usalo a tuo rischio. Puoi segnalare errori o richiedere funzionalità su %1 - - - - Thank you for trying Olive and we hope you enjoy it! - Grazie per aver provato Olive, speriamo che ti piaccia! - - - - Effect - - - Invalid effect - Effetto non valido - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - Nessun candidato per l'effetto "%1". Questo effetto potrebbe essere corrotto. Prova a reinstallare l'effetto o Olive. - - - Cu&t - &Taglia - - - &Copy - &Copia - - - Move &Up - Sposta in s&u - - - Move &Down - Sposta in &giù - - - D&elete - &Elimina - - - Load Settings From File - Carica le impostazioni da file - - - Save Settings to File - Salva le impostazioni su file - - - - Save Effect Settings - Salva impostazioni degli effetti - - - - - Effect XML Settings %1 - XML impostazioni effetti %1 - - - - Save Settings Failed - Salvataggio impostazioni fallito - - - - Failed to open "%1" for writing. - Impossibile aprire il file "%1" in scrittura. - - - - Load Effect Settings - Carica impostazioni effetto - - - - - Load Settings Failed - Caricamento impostazioni fallito - - - - Failed to open "%1" for reading. - Impossibile aprire "%1" in lettura. - - - - This settings file doesn't match this effect. - Questo file di impostazioni non corrisponde con questo effetto. - - - - EffectControls - - - Effects: - Effetti: - - - &Paste - &Incolla - - - - (none) - (nessuno) - - - - Add Video Effect - Aggiungi effetto video - - - - VIDEO EFFECTS - EFFETTI VIDEO - - - - Add Video Transition - Aggiungi transizione video - - - - Add Audio Effect - Aggiungi effetto video - - - - AUDIO EFFECTS - EFFETTI AUDIO - - - - Add Audio Transition - Aggiungi transizione audio - - - (Multiple clips selected) - (Più clip selezionate) - - - - EffectRow - - - Disable Keyframes - Disabilita fotogrammi chiave - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Disabilitare i fotogrammi chiave eliminerà tutti quelli attualmente esistenti. Sei sicuro di volerlo fare? - - - - EffectUI - - - %1 (Opening) - %1 (in apertura) - - - - %1 (Closing) - %1 (in chiusura) - - - - %1 (multiple) - %1 (multiple) - - - - Cu&t - &Taglia - - - - &Copy - &Copia - - - - Move &Up - Sposta in s&u - - - - Move &Down - Sposta in &giù - - - - D&elete - &Elimina - - - - Load Settings From File - Carica le impostazioni da file - - - - Save Settings to File - Salva le impostazioni su file - - - - EmbeddedFileChooser - - - File: - File: - - - - ExportDialog - - - Export "%1" - Esporta "%1" - Esporta "%1" - - - - Unknown codec name %1 - Nome del codec %1 sconosciuto - - - - Export Failed - Esportazione non riuscita - - - - Export failed - %1 - Esportazione non riuscita - %1 - - - - Invalid dimensions - Dimensioni non valide - - - - Export width and height must both be even numbers/divisible by 2. - La larghezza e l'altezza dell'esportazione devono essere pari/divisibili per due. - - - - Invalid codec - Codec non valido - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Impossibile determinare i parametri d'output per il codec selezionato. Questo è un errore, si prega di contattare gli sviluppatori. - - - - Invalid format - Formato non valido - - - - Couldn't determine output format. This is a bug, please contact the developers. - Impossibile determinare il formato di output. Questo è un errore, si prega di contattare gli sviluppatori. - - - - Export Media - Esporta media - - - - %p% (Total: %1:%2:%3) - %p% (totale: %1:%2:%3) - - - - %p% (ETA: %1:%2:%3) - %p% (tempo residuo %1:%2:%3) - - - - Quality-based (Constant Rate Factor) - Basata sulla qualità (CFR bitrate variabile) - - - - Constant Bitrate - Bitrate costante - - - - - Invalid Codec - Codec non valido - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Impossibile trovare un codificatore compatibile per questo codec. È facile che l'esportazione fallisca. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Impossibile trovare il formato dei pixel di questo codificatore. È facile che l'esportazione fallisca. - - - - Bitrate (Mbps): - Bitrate (Mbps): - - - - Quality (CRF): - Qualità (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Fattore di qualità: - -0 = senza perdita -17-18 = visivamente senza perdita (compresso, ma non si nota) -23 = alta qualità -51 = peggiore qualità possibile +%1 + - - Target File Size (MB): - Grandezza file desiderata (MB): + + Error saving settings + - - Format: - Formato: - - - - Range: - Intervallo: - - - - Entire Sequence - Sequenza completa - - - - In to Out - Zona selezionata - - - - Video - Video - - - - - Codec: - Codec: - - - - Width: - Larghezza: - - - - Height: - Altezza: - - - - Frame Rate: - Fotogrammi al secondo: - - - - Compression Type: - Tipo di compressione: - - - - Advanced - Avanzate - - - - Audio - Audio - - - - Sampling Rate: - Frequenza di campionamento: - - - - Bitrate (Kbps/CBR): - Bitrate (Kbps/CBR): + + Failed to save application settings. The application may lack write permissions to this location. + - ExportThread + Footage - - failed to send frame to encoder (%1) - errore nell'invio del fotogramma al codificatore (%1) + + %1 FPS + - - failed to receive packet from encoder (%1) - errore nella ricezione di un pacchetto dal codificatore (%1) + + %1 Hz + - - could not video encoder for %1 - impossibile trovare un codificatore video per %1 + + Filename: %1 + - - could not allocate video stream - impossibile allocare stream video - - - - could not allocate video encoding context - impossibile allocale contesto di codifica del video - - - - could not open output video encoder (%1) - impossibile aprire il codificatore video d'output (%1) - - - - could not copy video encoder parameters to output stream (%1) - impossibile copiare i parametri del codificatore video allo stream di output (%1) - - - - could not audio encoder for %1 - impossibile trovare un codificatore audio per %1 - - - - could not allocate audio stream - impossibile allocare lo stream audio - - - - could not allocate audio encoding context - impossibile allocale contesto di codifica dell'audio - - - - could not open output audio encoder (%1) - impossibile aprire il codificatore dell'output audio (%1) - - - - could not copy audio encoder parameters to output stream (%1) - impossibile copiare i parametri del codificatore audio allo stream di output (%1) - - - - could not allocate audio buffer (%1) - impossibile allocare il buffer audio (%1) - - - - could not create output format context - impossibile creare il contesto del formato d'output - - - - could not open output file (%1) - impossibile aprire il file di output (%1) - - - - could not write output file header (%1) - impossibile scrivere l'intestazione del file di output (%1) - - - - could not write output file trailer (%1) - impossibile scrivere la fine del file d'output (%1) + + This footage is not valid for use + - FillLeftRightEffect + ImportTool - - Type - Tipo + + Don't ask me again + - - Fill Left with Right - Riempi il sinistro con il destro + + No Active Sequence + - - Fill Right with Left - Riempi il destro con il sinistro + + No sequence is currently open. Would you like to create one? + + + + + Automatically Detect Parameters From Footage + + + + + Set Parameters Manually + - Frei0rEffect + MoveItemCommand - - Failed to load Frei0r plugin "%1": %2 - Impossibile caricare il plugin Frei0r "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - NOTA: Non si possono caricare plugin Frei0r a 32 bit in una versione a 64 bit di Olive. Si prega di trovare la versione a 64 bit di questo plugin oppure di passare alla versione 32 bit di Olive. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - NOTA: Non si possono caricare plugin Frei0r a 64 bit in una versione a 32 bit di Olive. Si prega di trovare la versione a 32 bit di questo plugin oppure di passare alla versione 64 bit di Olive. - - - - Error loading Frei0r plugin - Errore nel caricamento plugin Frei0r + + Move Item + - GraphEditor + NodeCopyPasteWidget - - Graph Editor - Editor del grafico + + Error pasting nodes + - - Linear - Lineare - - - - Bezier - Bézier - - - - Hold - Costante + + Failed to paste nodes: %1 + - GraphView + NodeFactory - - Zoom to Selection - Ingrandisci la selezione - - - - Zoom to Show All - Ingrandisci per mostrare tutto - - - - Reset View - Reimposta ingrandimento + + None + - InterlacingName + NodeViewItem - - None (Progressive) - Nessuno (progressivo) - - - - Top Field First - Prima la linea in alto - - - - Bottom Field First - Prima la linea in basso - - - - Invalid - Non valido + + %1... + - KeyframeNavigator + PresetManager - - Enable Keyframes - Abilita fotogrammi chiave + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + - KeyframeView + RatioDialog - - Linear - Lineare + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Bezier - Bézier + + Invalid custom ratio + - - Hold - Costante + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - LabelSlider + RenameItemCommand - - &Edit - &Modifica - - - - &Reset to Default - &Ripristina predefinito - - - - - Set Value - Imposta valore - - - - - New value: - Nuovo valore: - - - - LoadDialog - - - Loading... - Caricamento... - - - - Loading '%1'... - Caricamento di "%1"... - - - - Cancel - Annulla - - - - LoadThread - - - Version Mismatch - Mancata corrispondenza della versione - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Questo progetto è stato salvato con una versione diversa di Olive e potrebbe non essere compatibile con questa. Vuoi provare a caricarlo ugualmente? - - - - Invalid Clip Link - Link della clip non valido - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Questo progetto contiene un collegamento non valido a una clip. Potrebbe essere danneggiato. Vuoi continuare a caricarlo? - - - - %1 - Line: %2 Col: %3 - %1 - Linea: %2 Colonna: %3 - - - - User aborted loading - L'utente ha interrotto il caricamento - - - - XML Parsing Error - Errore nell'analisi XML - - - - Couldn't load '%1'. %2 - Impossibile caricare "%1". %2 - - - - Project Load Error - Errore nel caricamento del progetto - - - - Error loading project: %1 - Impossibile caricare il progetto: %1 - - - - MainWindow - - - Welcome to %1 - Benvenuti in %1 - - - - &File - &File - - - - &New - &Nuovo - - - - &Open Project - Apri pr&ogetto - - - - Clear Recent List - Svuota lista recenti - - - - Open Recent - Apri recenti - - - - &Save Project - &Salva progetto - - - - Save Project &As - S&alva progetto con nome - - - - &Import... - &Importa... - - - - &Export... - &Esporta... - - - - E&xit - Es&ci - - - - &Edit - &Modifica - - - - &Undo - &Annulla - - - - Redo - Rifai - - - - Select &All - Seleziona t&utto - - - - Deselect All - Deseleziona tutto - - - - Ripple to In Point - Taglia a catena fino al punto iniziale - - - - Ripple to Out Point - Intende il punto fine selezione o il cursore? - Taglia a catena dal punto finale - - - - Edit to In Point - Taglia fino al punto iniziale - - - - Edit to Out Point - Taglia dal punto finale - - - - Delete In/Out Point - Elimina tra l'inizio e fine selezione - - - - Ripple Delete In/Out Point - Elimina a catena tra l'inizio e fine selezione - - - - Set/Edit Marker - Imposta/modifica marcatore - - - - &View - &Visualizza - - - - Zoom In - Ingrandisci - - - - Zoom Out - Rimpicciolisci - - - - Increase Track Height - Aumenta l'altezza delle tracce - - - - Decrease Track Height - Diminuisci altezza delle tracce - - - - Toggle Show All - Commuta mostra tutti - - - - Track Lines - Linee tra le tracce - - - - Rectified Waveforms - Forme d'onda rettificate - - - - Frames - Fotogrammi - - - - Drop Frame - Salta fotogrammi - - - - Non-Drop Frame - Non saltare fotogrammi - - - - Milliseconds - Millisecondi - - - - Title/Action Safe Area - Area di sicurezza del titolo/azione - - - - Off - Disattivato - - - - Default - Predefinito - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - Personalizzato - - - - Full Screen - Schermo intero - - - - Full Screen Viewer - Visualizzatore a schermo intero - - - - &Playback - &Riproduzione - - - - Go to Start - Vai all'inizio - - - - Previous Frame - Fotogramma precedente - - - - Play/Pause - Riproduci/pausa - - - - Play In to Out - Riproduci tra inizio e fine selezione - - - - Next Frame - Fotogramma successivo - - - - Go to End - Vai alla fine - - - - Go to Previous Cut - Vai al taglio precedente - - - - Go to Next Cut - Vai al taglio successivo - - - - Go to In Point - Vai al punto di inizio selezione - - - - Go to Out Point - Vai al punto di fine selezione - - - - Shuttle Left - Scorri riproducendo verso sinistra - - - - Shuttle Stop - Ferma scorrimento riproduzione - - - - Shuttle Right - Scorri riproducendo verso destra - - - - Loop - Ciclico - - - - &Window - &Finestra - - - - Project - Progetto - - - - Effect Controls - Controllo effetti - - - - Timeline - Linea temporale - - - - Graph Editor - Editor del grafico - - - - Media Viewer - Visualizzatore media - - - - Sequence Viewer - Visualizzatore sequenza - - - - Maximize Panel - Massimizza pannello - - - - Lock Panels - Blocca pannelli - - - - Reset to Default Layout - Torna alla disposizione predefinita - - - - &Tools - S&trumenti - - - - Pointer Tool - Strumento puntatore - - - - Edit Tool - Strumento di modifica - - - - Ripple Tool - Strumento ridimensiona a catena - - - - Razor Tool - Strumento di taglio - - - - Slip Tool - Strumento di scivolamento - - - - Slide Tool - Strumento di scorrimento - - - - Hand Tool - Strumento mano - - - - Transition Tool - Strumento transizione - - - - Enable Snapping - Attiva bordi magnetici - - - - Auto-Cut Silence - Taglio automatico del silenzio - - - Selecting Also Seeks - Selezionando si sposta anche il cursore - - - Edit Tool Also Seeks - Lo strumento di modifica sposta anche il cursore - - - Edit Tool Selects Links - Lo strumento di modifica seleziona anche i collegamenti - - - Seek Also Selects - Spostare il cursore seleziona anche - - - Seek to the End of Pastes - Sposta cursore alla fine di ciò che viene incollato - - - Scroll Wheel Zooms - Ingrandisci con la rotellina del mouse - - - Enable Drag Files to Timeline - Permetti il trascinamento dei file alla linea temporale - - - Auto-Scale By Default - Scala automaticamente in maniera predefinita - - - Enable Seek to Import - Sposta cursore all'importazione - - - Audio Scrubbing - Da rivedere in base alla traduzione della linea verticale di riproduzione - Audio attivo durante il trascinamento - - - Enable Drop on Media to Replace - Permetti di rilasciare su un media per rimpiazzarlo - - - Enable Hover Focus - Abilita focus al passaggio - - - Ask For Name When Setting Marker - Chiedi un nome nell'impostazione del marcatore - - - - No Auto-Scroll - Disattiva scorrimento automatico - - - - Page Auto-Scroll - Scorrimento pagina automatico - - - - Smooth Auto-Scroll - Scorrimento automatico fluido - - - - Preferences - Impostazioni - - - - Clear Undo - Dimentica cronologia azioni - - - - &Help - &Aiuto - - - - A&ction Search - Ri&cerca azione - - - - Debug Log - Log di debug - - - - &About... - Inform&azioni... - - - - <untitled> - <senza titolo> - - - - Marker - - - Set Marker - Imposta marcatore - - - - Set clip marker name: - Imposta nome del marcatore della clip: - - - - Set sequence marker name: - Imposta nome del marcatore della sequenza: - - - - Media - - - New Folder - Nuova cartella - - - - Name: - Nome: - - - - Filename: - Nome file: - - - - Video Dimensions: - Dimensioni video: - - - - Frame Rate: - Velocità fotogrammi: - - - - %1 field(s) (%2 frame(s)) - %1 campo(i) (%2 fotogramma(i)) - - - - Interlacing: - Interlacciamento: - - - - Audio Frequency: - Frequenza audio: - - - - Audio Channels: - Canali audio: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Nome: %1 -Dimensioni video: %2x%3 -Velocità fotogrammi: %4 -Frequenza audio: %5 -Disposizione audio: %6 - - - - Name - Nome - - - - Duration - Durata - - - - Rate - Frequenza - - - - MediaPropertiesDialog - - - "%1" Properties - Proprietà di "%1" - - - - Tracks: - Tracce: - - - - Video %1: %2x%3 %4FPS - Video %1: %2x%3 %4FPS - - - - Audio %1: %2Hz %3 - Audio %1: %2Hz %3 - - - - %n channel(s) - - %n canale - %n canali - - - - - Conform to Frame Rate: - Conforme alla velocità dei fotogrammi: - - - - Alpha is Premultiplied - Canale alfa premoltiplicato - - - - Auto (%1) - Automatico (%1) - - - - Interlacing: - Interlacciamento: - - - - Name: - Nome: - - - - MenuHelper - - - &Project - &Progetto - - - - &Sequence - &Sequenza - - - - &Folder - C&artella - - - - Set In Point - Imposta punto di inizio selezione - - - - Set Out Point - Imposta punto di fine selezione - - - - Reset In Point - Azzera punto inizio selezione - - - - Reset Out Point - Azzera punto fine selezione - - - - Clear In/Out Point - Pulisci punti di inizio/fine selezione - - - - Add Default Transition - Aggiungi transizione predefinita - - - - Link/Unlink - Collega/scollega - - - - Enable/Disable - Attiva/disattiva - - - - Nest - Annida - - - - Cu&t - &Taglia - - - - Cop&y - &Copia - - - - - &Paste - &Incolla - - - - Paste Insert - Incolla e inserisci - - - - Duplicate - Duplica - - - - Delete - Elimina - - - - Ripple Delete - Elimina a catena - - - - Split - Dividi - - - - Invalid aspect ratio - Rapporto d'aspetto non valido - - - - The aspect ratio '%1' is invalid. Please try again. - Il rapporto d'aspetto "%1" non è valido. Riprovare. - - - - Enter custom aspect ratio - Inserisci rapporto d'aspetto personalizzato - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Inserisci il rapporto d'aspetto da usare per l'area di sicurezza (es. 16:9): - - - - NewSequenceDialog - - - Editing "%1" - Modifica di "%1" - - - - New Sequence - Nuova sequenza - - - - Preset: - Preimpostazioni: - - - - Film 4K - Film 4K - - - - TV 4K (Ultra HD/2160p) - TV 4K (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - Personalizzato - - - - Video - Video - - - - Width: - Larghezza: - - - - Height: - Altezza: - - - - Frame Rate: - Velocità fotogrammi: - - - - Pixel Aspect Ratio: - Proporzioni dei pixel: - - - - Square Pixels (1.0) - Pixel quadrati (1.0) - - - - Interlacing: - Interlacciamento: - - - - None (Progressive) - Nessuno (progressivo) - - - - Audio - Audio - - - - Sample Rate: - Frequenza di campionamento: - - - - Name: - Nome: - - - - OliveGlobal - - - Olive Project %1 - Progetto di Olive %1 - - - - Auto-recovery - Ripristino automatico - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive non è stato chiuso correttamente ed è stato trovato un file di ripristino. Desideri aprirlo? - - - - Open Project... - Apri progetto... - - - - Missing recent project - Progetto recente mancante - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Il progetto "%1" non esiste più. Vuoi rimuoverlo dalla lista dei progetti recenti? - - - - Save Project As... - Salva progetto con nome... - - - - Unsaved Project - Progetto non salvato - - - - This project has changed since it was last saved. Would you like to save it before closing? - Il progetto è stato modificato rispetto all'ultimo salvataggio. Vuoi salvarlo prima di chiuderlo? - - - - No active sequence - Nessuna sequenza attiva - - - - Please open the sequence to perform this action. - Si prega di aprire una sequenza per poter eseguire questa azione. - - - - No clips selected - Nessuna clip selezionata - - - - Select the clips you wish to auto-cut - Seleziona le clip che vuoi tagliare automaticamente - - - Please open the sequence you wish to export. - Si prega di aprire la sequenza che si desidera esportare. - - - - Missing Project File - File del progetto mancante - - - - Specified project '%1' does not exist. - Il progetto specificato "%1" non esiste. - - - - PanEffect - - - Pan - Trasla - - - - PreferencesDialog - - - Preferences - Impostazioni - - - - Default Sequence - Sequenza predefinita - - - - Invalid CSS File - File CSS non valido - - - - CSS file '%1' does not exist. - Il file CSS "%1" non esiste. - - - - Confirm Reset All Shortcuts - Conferma l'azzeramento di tutte le scorciatoie da tastiera - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - Sei sicuro di voler riportare tutte le scorciatoie da tastiera ai valori iniziali? - - - - Import Keyboard Shortcuts - Importa scorciatoie da tastiera - - - - - Error saving shortcuts - Errore nel salvataggio delle scorciatoie - - - - Failed to open file for reading - Errore nell'apertura del file in lettura - - - - Export Keyboard Shortcuts - Esporta scorciatoie da tastiera - - - - Export Shortcuts - Esporta scorciatoie - - - - Shortcuts exported successfully - Scorciatoie esportate con successo - - - - Failed to open file for writing - Errore nell'apertura del file in scrittura - - - - Browse for CSS file - Sfoglia file CSS - - - - Delete All Previews - Elimina tutte le anteprime - - - - Are you sure you want to delete all previews? - Sei sicuro di voler eliminare tutte le anteprime? - - - - Previews Deleted - Anteprime eliminate - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - Tutte le anteprime sono state eliminate con successo. Potresti dover riaprire il progetto attuale affinché i cambiamenti abbiano effetto. - - - - Language: - Lingua: - - - - Default Sequence Settings - Impostazioni predefinite della sequenza - - - - Add Default Effects to New Clips - Aggiungi gli effetti predefiniti alle nuove clip - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - Riporta il cursore all'inizio quando si riproduce alla fine di una sequenza - - - - Selecting Also Seeks - Selezionando si sposta anche il cursore - - - - Edit Tool Also Seeks - Lo strumento di modifica sposta anche il cursore - - - - Edit Tool Selects Links - collegamenti o collegàti? - Lo strumento di modifica seleziona anche i collegamenti - - - - Seek Also Selects - Spostare il cursore seleziona anche - - - - Seek to the End of Pastes - Sposta cursore alla fine di ciò che viene incollato - - - - Scroll Wheel Zooms - Ingrandisci con la rotellina del mouse - - - - Hold CTRL to toggle this setting - Tieni premuto CTRL per commutare questa impostazione - - - - Invert Timeline Scroll Axes - Inverti assi di scorrimento della linea temporale - - - - Enable Drag Files to Timeline - Permetti il trascinamento dei file alla linea temporale - - - - Auto-Scale By Default - Scala automaticamente in maniera predefinita - - - - Auto-Seek to Imported Clips - Sposta il cursore alle clip importate - - - - Audio Scrubbing - Audio attivo durante il trascinamento cursore - - - - Drop Files on Media to Replace - Rilascia i file sui media per rimpiazzarli - - - - Enable Hover Focus - Abilita focus al passaggio - - - - Ask For Name When Setting Marker - Chiedi un nome nell'impostazione del marcatore - - - - Appearance - Aspetto - - - - Theme - Tema - - - - Olive Dark (Default) - Olive scuro (predefinito) - - - - Olive Light - Olive chiaro - - - - Native - Nativo - - - - Native (Light Icons) - Nativo (icone chiare) - - - - Use Native Menu Styling - Usa lo stile nativo per i menu - - - - Custom CSS: - CSS personalizzato: - - - - Browse - Sfoglia - - - - Image sequence formats: - Formati delle sequenze immagini: - - - - Audio Recording: - Registrazione audio: - - - - Mono - Mono - - - - Stereo - Stereo - - - - Effect Textbox Lines: - N° linee nelle caselle di testo degli effetti: - - - - Thumbnail Resolution: - Risoluzione anteprime: - - - - Waveform Resolution: - Risoluzione forma d'onda: - - - - Delete Previews - Elimina anteprime - - - - Use Software Fallbacks When Possible - tradurre o no software fallback? è linguaggio parecchio tecnico - Usa i software fallback quando possibile - - - - General - Generale - - - - Behavior - Comportamento - - - Seeking - Spostamento cursore - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - Spostamento cursore accurato -Mostra sempre il fotogramma corretto (il video potrebbe bloccarsi brevemente per caricare il fotogramma) - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - Spostamento veloce del cursore -Sposta velocemente il cursore (potrebbe mostrare fotogrammi non perfettamente accurati durante lo spostamento - non interessa la riproduzione/esportazione) - - - - Memory Usage - Uso della memoria - - - - Upcoming Frame Queue: - Fotogrammi seguenti in coda: - - - - - frames - fotogrammi - - - - - seconds - secondi - - - - Previous Frame Queue: - Fotogrammi precedenti in coda: - - - - Playback - Riproduzione - - - - Output Device: - Dispositivo d'uscita: - - - - - Default - Predefinito - - - - Input Device: - Dispositivo d'ingresso: - - - - Sample Rate: - Frequenza di campionamento: - - - - Audio - Audio - - - - Search for action or shortcut - Cerca un'azione o una scorciatoia - - - - Action - Azione - - - - Shortcut - Scorciatoia - - - - Import - Importa - - - - Export - Esporta - - - - Reset Selected - Reimposta quelle selezionate - - - - Reset All - Reimposta tutto - - - - Keyboard - Tastiera - - - - PreviewGenerator - - - Failed to find any valid video/audio streams - Impossibile trovare stream audio/video validi - - - - Could not open file - %1 - Impossibile aprire il file - %1 - - - - Could not find stream information - %1 - Impossibile trovare le informazioni sullo stream - %1 - - - - Project - - - New - Nuovo - - - - Open Project - Apri progetto - - - - Save Project - Salva progetto - - - - Undo - Annulla - - - - Redo - Rifai - - - - Tree View - Vista ad albero - - - - Icon View - Vista ad icone - - - - List View - Vista a lista - - - - Search media, markers, etc. - Cerca media, marcatori, ecc. - - - - Project - Progetto - - - - Sequence - Sequenza - - - - Replace '%1' - Rimpiazza "%1" - - - - - All Files - Tutti i file - - - - - No active sequence - Nessuna sequenza attiva - - - - No sequence is active, please open the sequence you want to replace clips from. - Nessuna sequenza attiva, si prega di aprire quella da cui vuoi rimpiazzare le clip. - - - - Active sequence selected - Sequenza attiva selezionata - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - Non puoi inserire una sequenza dentro sé stessa, in questa sequenza non ci sarebbero clip di questo media. - - - - Rename '%1' - Rinomina "%1" - - - - Enter new name: - Inserisci un nuovo nome: - - - - Delete media in use? - Eliminare il media in uso? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - Il media "%1" è attualmente usato in "%2". Eliminandolo, toglierai tutte le sue istanze dalla sequenza. Sei sicuro di volerlo fare? - - - - Skip - Salta - - - - Import a Project - Importa un progetto - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" è un file di un progetto Olive. Verrà unito a questo progetto. Desideri continuare? - - - - Image sequence detected - Sequenza di immagini rilevata - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - Il file "%1" sembra far parte di una sequenza di immagini. Desideri importarla come tale? - - - - Import media... - Importa media... - - - - No sequence is active, please open the sequence you want to delete clips from. - Nessuna sequenza attiva, si prega di aprire la sequenza da cui vuoi eliminare le clip. - - - - ProxyDialog - - - Create Proxy - Crea clip rappresentativa - - - - Proxy - Clip rappresentativa - - - - Dimensions: - Dimensioni: - - - - Same Size as Source - Stessa dimensione del file originale - - - - Half Resolution (1/2) - Metà della risoluzione (1/2) - - - - Quarter Resolution (1/4) - Un quarto della risoluzione (1/4) - - - - Eighth Resolution (1/8) - Un ottavo della risoluzione (1/8) - - - - Sixteenth Resolution (1/16) - Un sedicesimo della risoluzione (1/16) - - - - Format: - Formato: - - - - ProRes HQ - ProRes HQ - - - - Location: - Posizione: - - - - Same as Source (in "%1" folder) - Stessa del file originale (nella cartella "%1") - - - - Proxy file exists - La clip rappresentativa esiste - - - - The file "%1" already exists. Do you wish to replace it? - Il file "%1" esiste già. Desideri sovrascriverlo? - - - - Custom Location - Posizione personalizzata - - - - ProxyGenerator - - - Finished generating proxy for "%1" - Generazione clip rappresentative di "%1" terminata - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - Rimpiazza clip usando "%1" - - - - Select which media you want to replace this media's clips with: - Seleziona quale media vuoi usare per rimpiazzare le clip di questo media: - - - - Keep the same media in-points - Mantieni lo stesso media nei punti - - - - Replace - Rimpiazza - - - - Cancel - Annulla - - - - No media selected - Nessun media selezionato - - - - Please select a media to replace with or click 'Cancel'. - Si prega di selezionare una media per la sostituzione o di cliccare "Annulla". - - - - Same media selected - Stesso media selezionato - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Hai selezionato lo stesso media che stai cercando di rimpiazzare. Si prega di selezionarne un altro o di cliccare "Annulla". - - - - Folder selected - Cartella selezionata - - - - You cannot replace footage with a folder. - Non puoi rimpiazzare un filmato con una cartella. - - - - Active sequence selected - Sequenza attiva selezionata - - - - You cannot insert a sequence into itself. - Non puoi inserire una sequenza dentro sé stessa. - - - - RichTextEffect - - - Text - Testo - - - - Padding - Spaziatura - - - - Position - Posizione - - - - Vertical Align: - Allineamento verticale: - - - - Top - In alto - - - - Center - Al centro - - - - Bottom - In basso - - - - Auto-Scroll - Scorri automaticamente - - - - Off - Disattivato - - - - Up - Verso su - - - - Down - Verso giù - - - - Left - Verso sinistra - - - - Right - Verso destra - - - - Shadow - Ombra - - - - Shadow Color - Colore dell'ombra - - - - Shadow Angle - Angolo dell'ombra - - - - Shadow Distance - Distanza dell'ombra - - - - Shadow Softness - Morbidezza dell'ombra - - - - Shadow Opacity - Opacità dell'ombra + + Rename Item + Sequence - - %1 (copy) - %1 (copia) + + %1 FPS + - ShakeEffect + Stream - - Intensity - Intensità + + %1: Audio - %2 Channels, %3Hz + - - Rotation - Rotazione + + %1: Unknown + - - Frequency - Frequenza + + %1: Image - %2x%3 + + + + + %1: Video - %2x%3 + - SolidEffect + TimelineViewBlockItem - - Type - Tipo - - - - Solid Color - Colore a tinta unita - - - - SMPTE Bars - Barre SMPTE - - - - Checkerboard - A scacchi - - - - Opacity - Opacità - - - - Color - Colore - - - - Checkerboard Size - Dimensione scacchiera - - - - SourcesCommon - - - Import... - Importa... - - - - New - Nuovo - - - - View - Visualizza - - - - Tree View - Vista ad albero - - - - Icon View - Vista ad icone - - - - Show Toolbar - Mostra barra degli strumenti - - - - Show Sequences - Mostra sequenza - - - - Replace/Relink Media - Rimpiazza/ricollega media - - - - Reveal in Explorer - Mostra in Esplora risorse - - - - Reveal in Finder - Mostra in Finder - - - - Reveal in File Manager - Mostra nel gestore file - - - - Replace Clips Using This Media - Rimpiazza clip usando questo media - - - - Create Sequence With This Media - Crea sequenza con questo media - - - - Duplicate - Duplica - - - - Delete All Clips Using This Media - Elimina tutte le clip che usano questo media - - - - Proxy - Clip rappresentativa - - - - Generating proxy: %1% complete - Generazione clip rappresentative: %1% completo - - - - Create/Modify Proxy - Crea/modifica clip rappresentativa - - - - Create Proxy - Crea clip rappresentativa - - - - Modify Proxy - Modifica clip rappresentativa - - - - Restore Original - Ripristina l'originale - - - - Delete - Elimina - - - - Preview in Media Viewer - Anteprima nel Visualizzatore media - - - - Properties... - Proprietà... - - - - Replace Media - Rimpiazza media - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Hai rilasciato un file dentro "%1". Desideri rimpiazzarlo con quello rilasciato? - - - - Delete proxy - Elimina clip rappresentativa - - - - Would you like to delete the proxy file "%1" as well? - Desideri eliminare anche il file della clip rappresentativa "%1"? - - - - SpeedDialog - - - Speed/Duration - Velocità/durata - - - - Speed: - Velocità: - - - - Frame Rate: - Velocità fotogrammi: - - - - Duration: - Durata: - - - - Reverse - In senso inverso - - - - Maintain Audio Pitch - Mantieni la tonalità dell'audio - - - - Ripple Changes - Sposta clip successive a catena - - - - TextEditDialog - - - Edit Text - Modifica testo - - - - Thin - Sottile - - - - Extra Light - Molto leggero - - - - Light - Leggero - - - - Normal - Normale - - - - Medium - Medio - - - - Demi Bold - Grassetto corsivo - - - - Bold - Grassetto - - - - Extra Bold - Grassetto più spesso - - - - Black - Nero - - - - TextEditEx - - - Edit Text - Modifica testo - - - - &Edit Text - Modifica t&esto - - - - TextEffect - - - Text - Testo - - - - Font - Carattere - - - - Size - Dimensione - - - - Color - Colore - - - - Alignment - Allineamento - - - - Left - A sinistra - - - - - Center - Al centro - - - - Right - A destra - - - - Justify - Giustifica - - - - Top - In alto - - - - Bottom - In basso - - - - Word Wrap - A capo automatico - - - - Padding - Spaziatura - - - - Position - Posizione - - - - Outline - Bordo - - - - Outline Color - Colore bordo - - - - Outline Width - Larghezza bordo - - - - Shadow - Ombra - - - - Shadow Color - Colore dell'ombra - - - - Shadow Angle - Angolo dell'ombra - - - - Shadow Distance - Distanza dell'ombra - - - - Shadow Softness - Morbidezza dell'ombra - - - - Shadow Opacity - Opacità dell'ombra - - - - Sample Text - Testo di esempio - - - &Edit Text - Modifica t&esto - - - - TimecodeEffect - - - Timecode - Codice temporale - - - - Sequence - Sequenza - - - - Media - Media - - - - Scale - Scala - - - - Color - Colore - - - - Background Color - Colore di sfondo - - - - Background Opacity - Opacità dello sfondo - - - - Offset - Traslazione - - - - Prepend - Aggiungi all'inizio - - - - Timeline - - - Timeline: - Linea temporale: - - - - Nested Sequence - Sequenza annidata - - - - Effect already exists - L'effetto esiste già - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - La clip "%1" contiene già un effetto "%2". Vuoi rimpiazzarlo con quello incollato oppure aggiungerlo come effetto separato? - - - - Add - Aggiungi - - - - Replace - Rimpiazza - - - - Skip - Salta - - - - Do this for all conflicts found - Ripeti per ogni conflitto trovato - - - - Title... - Titolo... - - - - Solid Color... - Colore a tinta unita... - - - - Bars... - Barre... - - - - Tone... - Suono... - - - - Noise... - Rumore... - - - - Unsaved Project - Progetto non salvato - - - - You must save this project before you can record audio in it. - Devi salvare il progetto prima di poterci registrare dell'audio. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Fa' clic sulla linea temporale nel punto in cui vuoi iniziare la registrazione (trascina per limitare la registrazione in una certa finestra) - - - - (none) - (nessuno) - - - - Pointer Tool - Strumento puntatore - - - - Edit Tool - Strumento di modifica - - - - Ripple Tool - Su premier è tradotto come -strumento montaggio con scarto-. Valutare quale usare - Strumento ridimensiona a catena - - - - Razor Tool - Strumento di taglio - - - - Slip Tool - Strumento di scivolamento - - - - Slide Tool - Strumento di scorrimento - - - - Hand Tool - Strumento mano - - - - Transition Tool - Strumento transizione - - - - Snapping - Bordi magnetici - - - - Zoom In - Ingrandisci - - - - Zoom Out - Rimpicciolisci - - - - Record audio - Registra audio - - - - Add title, solid, bars, etc. - Aggiungi titolo, colori, barre ecc. - - - - TimelineHeader - - - Center Timecodes - Centra codici temporali - - - - TimelineWidget - - - &Undo - Ann&ulla - - - - &Redo - &Rifai - - - C&ut - &Taglia - - - Cop&y - &Copia - - - &Paste - &Incolla - - - R&ipple Delete - El&imina a catena - - - - Sequence Settings - Impostazioni sequenza - - - - &Speed/Duration - &Velocità/durata - - - Auto-s&cale - S&cala automaticamente - - - - &Reveal in Project - Most&ra nel progetto - - - R&ename - &Rinomina - - - + %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Inizio: %2 -Fine: %3 -Durata: %4 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - Rename '%1' - Rinomina '%1' - - - Rename multiple clips - Rinomina più clip - - - Enter a new name for this clip: - Inserisci un nuovo nome per questa clip: - - - - R&ipple Delete Empty Space - El&imina spazio vuoto a catena - - - - Auto-Cut Silence - Taglio automatico del silenzio - - - - Auto-S&cale - S&cala automaticamente - - - - Properties - Proprietà - - - - Error - Errore - - - - Couldn't locate media wrapper for sequence. - Impossibile trovare contenitore media per la sequenza. - - - - Title - Titolo - - - - Solid Color - Colore a tinta unita - - - + Bars - Barre + Barre - + + Solid + + + + + Title + Titolo + + + Tone - Suono + Suono - - Noise - Rumore - - - - Duration: - Durata: + + Unknown + - ToneEffect + VideoParams - - Type - Tipo + + 8-bit + - - Sine - Seno + + 16-bit Integer + - - Frequency - Frequenza + + Half-Float (16-bit) + - - Amount - Ammontare + + Full-Float (32-bit) + - - Mix - Miscela + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + - TransformEffect + main - - Position - Posizione + + Show this help text + - - Scale - Scalatura + + Show application version + - - Uniform Scale - Mantieni proporzioni + + Start in full-screen mode + - - Rotation - Rotazione + + Export only (No GUI) + - - Anchor Point - Punto di ancoraggio + + Override language with file + - - Opacity - Opacità + + qm-file + - - Blend Mode - Modalità miscela - - - - Normal - Normale - - - Darken - Scurisci - - - Multiply - Moltiplica - - - Color Burn - Brucia colore - - - Lighten - Illumina - - - Screen - Scherma - - - Color Dodge - Scherma colore - - - Overlay - Sovrapponi - - - Soft Light - Luce leggera - - - Hard Light - Luce forte - - - Difference - Differenza - - - Exclusion - Esclusione + + Project to open on startup + - Transition + olive::AboutDialog - + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive è un editor video non lineare. Questo è software libero ed è protetto dalla licenza GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Gli sviluppatori di Olive sono grati di informare che il codice sorgente del programma è scaricabile dal sito. + + + + olive::ActionSearch + + + Search for action... + Cerca un'azione... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Audio + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + Length - Lunghezza + Lunghezza + + + + Media In + + + + + Enabled + + + + + Speed + - UpdateNotification + olive::BlurFilterNode - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - È disponibile un aggiornamento sul sito di Olive. Visita www.olivevideoeditor.org per scaricarlo. + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + - VSTHost + olive::ClipBlock - - - Error loading VST plugin - Errore nel caricamento del plugin VST + + Clip + - Failed to create VST reference - Errore nella creazione del riferimento VST + + A time-based node that represents a media source. + - - Failed to load VST plugin "%1": %2 - Impossibile caricare il plugin VST "%1": %2 - - - NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - NOTA: Non si possono caricare plugin VST a 32 bit in una versione a 64 bit di Olive. Si prega di trovare la versione a 64 bit di questo plugin oppure di passare alla versione 32 bit di Olive. - - - NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - NOTA: Non si possono caricare plugin VST a 64 bit in una versione a 32 bit di Olive. Si prega di trovare la versione a 32 bit di questo plugin oppure di passare alla versione 64 bit di Olive. - - - - Failed to locate entry point for dynamic library. - Impossibile trovare punto d'ingresso per la libreria dinamica. - - - - VST Error - Errore VST - - - - Plugin's magic number is invalid - Il magic number del plugin non è valido - - - - Plugin - Plugin - - - - Interface - Interfaccia - - - - Show - Mostra - - - - VST Plugin - Plugin VST + + Buffer + - Viewer + olive::ColorDialog - - Sequence Viewer - Visualizzatore sequenza - - - - Media Viewer - Visualizzatore media - - - - (none) - (nessuno) - - - - Drag video only - Sposta solamente il video - - - - Drag audio only - Sposta solamente l'audio + + Select Color + - ViewerWidget + olive::ColorSpaceChooser - - Save Frame as Image... - Salva fotogramma come immagine... + + Color Management + - - Show Fullscreen - Mostra a schermo intero + + Input: + - - Disable - Disattiva + + Color Space: + - - Screen %1: %2x%3 - Schermo %1: %2x%3 + + Display: + - - Zoom - Ingrandimento + + View: + - + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + Nuova cartella + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + Salva progetto + + + + + Error + Errore + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + Apri progetto + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Lineare + + + + Bezier + Bézier + + + + Hold + Costante + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Avanzate + + + + Pixel + + + + + Pixel Format: + Formato pixel: + + + + Performance + + + + + Threads: + Thread: + + + + olive::ExportAudioTab + + + Codec: + Codec: + + + + Sample Rate: + Frequenza di campionamento: + + + + Channel Layout: + + + + + Format: + Formato: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + Nome file: + + + + Browse for exported file filename + + + + + Preset: + Preimpostazioni: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Intervallo: + + + + Entire Sequence + Sequenza completa + + + + In to Out + Zona selezionata + + + + Format: + Formato: + + + + Export Video + + + + + Export Audio + + + + + Video + Video + + + + Audio + Audio + + + + + Export + Esporta + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Larghezza: + + + + Height: + Altezza: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + Fit - Adatta + Adatta - - Custom - Personalizzato + + Stretch + - - Close Media - Chiudi media + + Crop + - - Save Frame - Salva fotogramma + + Frame Rate: + - - Viewer Zoom - Ingrandimento visualizzatore + + Pixel Aspect Ratio: + Proporzioni dei pixel: - - Set Custom Zoom Value: - Imposta un valore di ingrandimento personalizzato: + + Interlacing: + Interlacciamento: + + + + Quality: + + + + + Codec + + + + + Codec: + Codec: + + + + Advanced + Avanzate - ViewerWindow + olive::FloatSlider - - Exit Fullscreen - Esci dalla modalità a schermo intero + + %1 dB + + + + + %1% + - VoidEffect + olive::FootagePropertiesDialog - + + "%1" Properties + Proprietà di "%1" + + + + Name: + Nome: + + + + Tracks: + Tracce: + + + + olive::FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + Sfoglia + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + Tutti i file + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Grandezza file desiderata (MB): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Nessuno (progressivo) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Lineare + + + + Hold + Costante + + + + Bezier + Bézier + + + + olive::KeyframeViewBase + + + Linear + Lineare + + + + Bezier + Bézier + + + + Hold + Costante + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + &Salva progetto + + + + Save Project &As + S&alva progetto con nome + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + &File + + + + &New + &Nuovo + + + + &Open Project + Apri pr&ogetto + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &Importa... + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + Es&ci + + + + &Edit + &Modifica + + + + Insert + + + + + Overwrite + + + + + Select &All + Seleziona t&utto + + + + Deselect All + Deseleziona tutto + + + + Ripple to In Point + Taglia a catena fino al punto iniziale + + + + Ripple to Out Point + Taglia a catena dal punto finale + + + + Edit to In Point + Taglia fino al punto iniziale + + + + Edit to Out Point + Taglia dal punto finale + + + + Delete In/Out Point + Elimina tra l'inizio e fine selezione + + + + Ripple Delete In/Out Point + Elimina a catena tra l'inizio e fine selezione + + + + Set/Edit Marker + Imposta/modifica marcatore + + + + &View + &Visualizza + + + + Zoom In + Ingrandisci + + + + Zoom Out + Rimpicciolisci + + + + Increase Track Height + Aumenta l'altezza delle tracce + + + + Decrease Track Height + Diminuisci altezza delle tracce + + + + Toggle Show All + Commuta mostra tutti + + + + Full Screen + Schermo intero + + + + Full Screen Viewer + Visualizzatore a schermo intero + + + + &Playback + &Riproduzione + + + + Go to Start + Vai all'inizio + + + + Previous Frame + Fotogramma precedente + + + + Play/Pause + Riproduci/pausa + + + + Play In to Out + Riproduci tra inizio e fine selezione + + + + Next Frame + Fotogramma successivo + + + + Go to End + Vai alla fine + + + + Go to Previous Cut + Vai al taglio precedente + + + + Go to Next Cut + Vai al taglio successivo + + + + Go to In Point + Vai al punto di inizio selezione + + + + Go to Out Point + Vai al punto di fine selezione + + + + Shuttle Left + Scorri riproducendo verso sinistra + + + + Shuttle Stop + Ferma scorrimento riproduzione + + + + Shuttle Right + Scorri riproducendo verso destra + + + + Loop + Ciclico + + + + &Sequence + &Sequenza + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + Massimizza pannello + + + + Lock Panels + Blocca pannelli + + + + Reset to Default Layout + Torna alla disposizione predefinita + + + + &Tools + S&trumenti + + + + Pointer Tool + Strumento puntatore + + + + Edit Tool + Strumento di modifica + + + + Ripple Tool + Strumento ridimensiona a catena + + + + Rolling Tool + + + + + Razor Tool + Strumento di taglio + + + + Slip Tool + Strumento di scivolamento + + + + Slide Tool + Strumento di scorrimento + + + + Hand Tool + Strumento mano + + + + Zoom Tool + + + + + Transition Tool + Strumento transizione + + + + Enable Snapping + Attiva bordi magnetici + + + + Preferences + Impostazioni + + + + &Help + &Aiuto + + + + A&ction Search + Ri&cerca azione + + + + Send &Feedback... + + + + + &About... + Inform&azioni... + + + + olive::MainStatusBar + + + Welcome to %1 %2 + Benvenuti in %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + Visualizza + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + Aggiungi + + + + Subtract + + + + + Multiply + Moltiplica + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + Posizione + + + + Rotation + Rotazione + + + + Scale + + + + + Uniform Scale + Mantieni proporzioni + + + + Anchor Point + Punto di ancoraggio + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + &Progetto + + + + &Sequence + &Sequenza + + + + &Folder + C&artella + + + + Cu&t + &Taglia + + + + Cop&y + &Copia + + + + &Paste + &Incolla + + + + Paste Insert + Incolla e inserisci + + + + Duplicate + Duplica + + + + Delete + Elimina + + + + Ripple Delete + Elimina a catena + + + + Split + Dividi + + + + Set In Point + Imposta punto di inizio selezione + + + + Set Out Point + Imposta punto di fine selezione + + + + Reset In Point + Azzera punto inizio selezione + + + + Reset Out Point + Azzera punto fine selezione + + + + Clear In/Out Point + Pulisci punti di inizio/fine selezione + + + + Add Default Transition + Aggiungi transizione predefinita + + + + Link/Unlink + Collega/scollega + + + + Enable/Disable + Attiva/disattiva + + + + Nest + Annida + + + + Frames + Fotogrammi + + + + Drop Frame + Salta fotogrammi + + + + Non-Drop Frame + Non saltare fotogrammi + + + + Milliseconds + Millisecondi + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + Generale + + + + Math + + + + + Color + Colore + + + + Filter + + + + + Timeline + Linea temporale + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + Colore + + + + Matrix + + + + + Text + Testo + + + + Font + Carattere + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Tipo + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + (unknown) - (sconosciuto) - - - - Missing Effect - Effetto mancante + (sconosciuto) - VolumeEffect + olive::NodeTreeView - + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + Aggiungi + + + + olive::PanNode + + + + Pan + Trasla + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (nessuno) + + + + (multiple) + (multiple) + + + + olive::PathWidget + + + Browse + Sfoglia + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + Colore + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + Colore + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + Tema + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + Dispositivo d'uscita: + + + + Input Device: + Dispositivo d'ingresso: + + + + Sample Rate: + Frequenza di campionamento: + + + + Audio Recording: + Registrazione audio: + + + + Mono + Mono + + + + Stereo + Stereo + + + + Refresh Devices + + + + + Please wait... + + + + + Default + Predefinito + + + + olive::PreferencesBehaviorTab + + + Behavior + Comportamento + + + + General + Generale + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Audio + + + + Enable audio scrubbing + + + + + Timeline + Linea temporale + + + + Auto-Seek to Imported Clips + Sposta il cursore alle clip importate + + + + Edit Tool Also Seeks + Lo strumento di modifica sposta anche il cursore + + + + Edit Tool Selects Links + Lo strumento di modifica seleziona anche i collegamenti + + + + Enable Drag Files to Timeline + Permetti il trascinamento dei file alla linea temporale + + + + Invert Timeline Scroll Axes + Inverti assi di scorrimento della linea temporale + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + Spostare il cursore seleziona anche + + + + Seek to the End of Pastes + Sposta cursore alla fine di ciò che viene incollato + + + + Selecting Also Seeks + Selezionando si sposta anche il cursore + + + + Playback + Riproduzione + + + + Ask For Name When Setting Marker + Chiedi un nome nell'impostazione del marcatore + + + + Automatically rewind at the end of a sequence + + + + + Project + Progetto + + + + Drop Files on Media to Replace + Rilascia i file sui media per rimpiazzarli + + + + Nodes + + + + + Add Default Effects to New Clips + Aggiungi gli effetti predefiniti alle nuove clip + + + + Auto-Scale By Default + Scala automaticamente in maniera predefinita + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + Impostazioni + + + + General + Generale + + + + Appearance + Aspetto + + + + Behavior + Comportamento + + + + Disk + + + + + Audio + Audio + + + + Keyboard + Tastiera + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + Lingua: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + Cerca un'azione o una scorciatoia + + + + Action + Azione + + + + Shortcut + Scorciatoia + + + + Import + Importa + + + + Export + Esporta + + + + Reset Selected + Reimposta quelle selezionate + + + + Reset All + Reimposta tutto + + + + Confirm Reset All Shortcuts + Conferma l'azzeramento di tutte le scorciatoie da tastiera + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Sei sicuro di voler riportare tutte le scorciatoie da tastiera ai valori iniziali? + + + + Import Keyboard Shortcuts + Importa scorciatoie da tastiera + + + + + Error saving shortcuts + Errore nel salvataggio delle scorciatoie + + + + Failed to open file for reading + Errore nell'apertura del file in lettura + + + + Export Keyboard Shortcuts + Esporta scorciatoie da tastiera + + + + Export Shortcuts + Esporta scorciatoie + + + + Shortcuts exported successfully + Scorciatoie esportate con successo + + + + Failed to open file for writing + Errore nell'apertura del file in scrittura + + + + olive::ProgressDialog + + + Cancel + Annulla + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &Nuovo + + + + &Import... + &Importa... + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + Mostra in Esplora risorse + + + + Reveal in Finder + Mostra in Finder + + + + Reveal in File Manager + Mostra nel gestore file + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + Progetto + + + + (none) + (nessuno) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + Sfoglia + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + Apri progetto + + + + Save Project + Salva progetto + + + + Undo + Annulla + + + + Redo + Rifai + + + + Search media, markers, etc. + Cerca media, marcatori, ecc. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + Nome + + + + Duration + Durata + + + + Rate + Frequenza + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + Grassetto + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + Nome: + + + + New Sequence + Nuova sequenza + + + + Editing "%1" + Modifica di "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Video + + + + Width: + Larghezza: + + + + Height: + Altezza: + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + Proporzioni dei pixel: + + + + Interlacing: + Interlacciamento: + + + + Audio + Audio + + + + Sample Rate: + Frequenza di campionamento: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + Visualizzatore sequenza + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + Colore + + + + olive::StringSlider + + + (none) + (nessuno) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + Colore + + + + Radius + + + + + Opacity + Opacità + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + Testo di esempio + + + + + Text + Testo + + + + Generate rich text. + + + + + Font + Carattere + + + + Font Size + + + + + Color + Colore + + + + Vertical Align + + + + + Top + In alto + + + + Center + Al centro + + + + Bottom + In basso + + + + olive::TimeBasedPanel + + + (none) + (nessuno) + + + + olive::TimeBasedWidget + + + Set Marker + Imposta marcatore + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + Linea temporale + + + + olive::TimelineWidget + + + + Properties + Proprietà + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + Strumento puntatore + + + + Edit Tool + Strumento di modifica + + + + Ripple Tool + Strumento ridimensiona a catena + + + + Rolling Tool + + + + + Razor Tool + Strumento di taglio + + + + Slip Tool + Strumento di scivolamento + + + + Slide Tool + Strumento di scorrimento + + + + Hand Tool + Strumento mano + + + + Zoom Tool + + + + + Transition Tool + Strumento transizione + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Lineare + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + Seno + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + Video + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + Interlacciamento: + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + Errore + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + Ingrandimento + + + + Fit + Adatta + + + + %1% + + + + + Full Screen + Schermo intero + + + + Screen %1: %2x%3 + Schermo %1: %2x%3 + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + Disattivato + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + Volume - Volume - - - - transition - - - Invalid transition - Transizione non valida + Volume - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - Nessun candidato per la transizione "%1". Questa transizione potrebbe essere danneggiata. Prova a reinstallare la transizione o Olive. + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/pt_BR.ts b/app/ts/pt_BR.ts index 0b7661ae6..9c3ab35cd 100644 --- a/app/ts/pt_BR.ts +++ b/app/ts/pt_BR.ts @@ -2,4197 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive é um editor de vídeos não-linear. Este software é livre e protegido pela licença GNU GPL. + + %1 Hz + - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - A equipe do Olive informa que o código-fonte está disponível no site do projeto. - - - - ActionSearch - - - Search for action... - Pesquisar ação... - - - - AdvancedVideoDialog - - - Advanced Video Settings - Configurações avançadas de vídeo - - - - Pixel Format: - Formato de pixel: - - - - Threads: - Threads: - - - - Audio - - - %1 Audio - Áudio %1 - - - - Recording %1 - Gravando %1 - - - - AudioNoiseEffect - - - Amount - Quantidade - - - - Mix - Mixar - - - - Noise - Ruído - - - - Generate audio noise that can be mixed with this clip. - Cria um ruído de áudio que pode ser mixado com este clipe. - - - - AutoCutSilenceDialog - - - Cut Silence - Cortar silêncio - - - - Attack Threshold: - Limiar de ataque: - - - - Attack Time: - Tempo de ataque: - - - - Release Threshold: - Limiar de liberação: - - - - Release Time: - Tempo de liberação: - - - - Cacher - - - - Could not open %1 - %2 - Não foi possível abrir %1 - %2 - - - - ChannelLayoutName - - - Invalid - Inválido - - - + Mono - Mono + Mono - + Stereo - Estéreo + Estéreo + + + + 2.1 + 144p {2.1?} + + + + 5.1 + 144p {5.1?} + + + + 7.1 + 144p {7.1?} + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - Propriedades "%1" + + Error loading settings + - - Multiple Clip Properties - Propriedades de vários clipes - - - - Name: - Nome: - - - - Duration: - Duração: - - - - (multiple) - (vários) - - - - CollapsibleWidget - - - <untitled> - <sem título> - - - - ColorButton - - - Set Color - Definir cor - - - - CornerPinEffect - - - Top Left - Acima à esquerda - - - - Top Right - Acima à direita - - - - Bottom Left - Abaixo à esquerda - - - - Bottom Right - Abaixo à direita - - - - Perspective - Perspectiva - - - - Corner Pin - Posicionar borda - - - - Distort - Distorcer - - - - Distort/warp this clip by pinning each of its four corners. - Distorce este clipe reposicionando cada um dos seus quatro cantos. - - - - CrashDialog - - - We're very sorry, Olive has crashed. Please send the following data to developers: - Desculpa, o Olive acabou de travar. Por favor, envie os dados a seguir aos desenvolvedores: - - - - CrossDissolveTransition - - - Cross Dissolve - Dissolver cruzado - - - - Dissolves - Dissolver - - - - Dissolve clips evenly. - Dissolve clipes uniformemente. - - - - DebugDialog - - - Debug Log - Log de depuração - - - - DemoNotice - - - - Welcome to Olive! - Bem-vindo ao Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive é um editor de vídeos com licença GNU GPL. Se você pagou por este software, então foi vítima de um golpe. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Este programa está em fase ALFA, o que significa que ele é instável e pode travar, ter defeitos e não ter vários recursos. Não oferecemos garantia, então use por sua conta e risco. Pedimos que avise sobre falhas ou sugestões no endereço %1 - - - - Thank you for trying Olive and we hope you enjoy it! - Obrigado por utilizar o Olive. Esperamos que você aproveite! - - - - EffectControls - - - (none) - (nenhum) - - - - Effects: - Efeitos: - - - - Add Video Effect - Adicionar efeito de vídeo - - - - VIDEO EFFECTS - EFEITOS DE VÍDEO - - - - Add Video Transition - Adicionar transição de vídeo - - - - Add Audio Effect - Adicionar efeito de áudio - - - - AUDIO EFFECTS - EFEITOS DE ÁUDIO - - - - Add Audio Transition - Adicionar transição de áudio - - - - EffectUI - - - %1 (Opening) - %1 (Abrindo) - - - - %1 (Closing) - %1 (Fechando) - - - - %1 (multiple) - %1 (vários) - - - - Cu&t - C&ortar - - - - &Copy - &Copiar - - - - Move &Up - Mover para c&ima - - - - Move &Down - Mover para &baixo - - - - D&elete - &Excluir - - - - Load Settings From File - Carregar configurações do arquivo - - - - Save Settings to File - Salvar configurações para o arquivo - - - - EmbeddedFileChooser - - - File: - Arquivo: - - - - ExponentialFadeTransition - - - Exponential Fade - Atenuação exponencial - - - - An exponential audio fade that starts slow and ends fast. - Uma atenuação de áudio exponencial que começa lenta e termina rapidamente. - - - - ExportDialog - - - Export "%1" - Exportar "%1" - - - - Unknown codec name %1 - Nome de codec desconhecido %1 - - - - Export Failed - Exportação falhou - - - - Export failed - %1 - A exportação falhou - %1 - - - - Invalid dimensions - Dimensões inválidas - - - - Export width and height must both be even numbers/divisible by 2. - A largura e altura de exportação devem ser números pares/divisíveis por 2. - - - - Invalid codec - Codec inválido - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Não foi possível determinar os parâmetros de saída para o codec selecionado. Isso é um bug, favor avisar os desenvolvedores. - - - - Invalid format - Formato inválido - - - - Couldn't determine output format. This is a bug, please contact the developers. - Não foi possível determinar o formato de saída. Isso é um bug, favor avisar os desenvolvedores. - - - - Export Media - Exportar mídia - - - - %p% (Total: %1:%2:%3) - %p% (Total: %1:%2:%3) - - - - %p% (ETA: %1:%2:%3) - %p% (Tempo estimado: %1:%2:%3) - - - - Quality-based (Constant Rate Factor) - Baseado na qualidade (Fator de taxa constante/CRF) - - - - Constant Bitrate - Taxa de bits constante - - - - - Invalid Codec - Codec inválido - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Não foi possível encontrar um codificador adequado para este codec. A exportação provavelmente falhará. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Não foi possível encontrar o formato de pixel para este codificador. A exportação provavelmente falhará. - - - - Bitrate (Mbps): - Taxa de bits (Mbps): - - - - Quality (CRF): - Qualidade (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Fator de qualidade: - -0 = sem perdas -17-18 = visualmente sem perdas (comprimido, porém imperceptível) -23 = alta qualidade -51 = menor qualidade possível +%1 + - - Target File Size (MB): - Tamanho do arquivo alvo (MB): + + Error saving settings + - - Format: - Formato: - - - - Range: - Intervalo: - - - - Entire Sequence - Sequência inteira - - - - In to Out - Faixa de entrada/saída - - - - Video - Vídeo - - - - - Codec: - Codec: - - - - Width: - Largura: - - - - Height: - Altura: - - - - Frame Rate: - Taxa de quadros: - - - - Compression Type: - Tipo de compressão: - - - - Advanced - Avançado - - - - Audio - Áudio - - - - Sampling Rate: - Taxa de amostragem: - - - - Bitrate (Kbps/CBR): - Taxa de bits (Kbps/CBR): + + Failed to save application settings. The application may lack write permissions to this location. + - ExportThread + Footage - - failed to send frame to encoder (%1) - falha ao enviar quadro para o codificador (%1) + + %1 FPS + - - failed to receive packet from encoder (%1) - falha ao receber pacote do codificador (%1) + + %1 Hz + - - could not video encoder for %1 - não foi possível localizar o codificador de vídeo para %1 + + Filename: %1 + - - could not allocate video stream - não foi possível alocar o fluxo de vídeo - - - - could not allocate video encoding context - não foi possível alocar o contexto de codificação de vídeo - - - - could not open output video encoder (%1) - não foi possível abrir o codificador de vídeo de saída (%1) - - - - could not copy video encoder parameters to output stream (%1) - não foi possível copiar os parâmetros de codificação de vídeo para o fluxo de saída (%1) - - - - could not audio encoder for %1 - não foi possível localizar o codificador de áudio para %1 - - - - could not allocate audio stream - não foi possível alocar fluxo de áudio - - - - could not allocate audio encoding context - não foi possível alocar o contexto de codificação de áudio - - - - could not open output audio encoder (%1) - não foi possível abrir o codificador de áudio de saída (%1) - - - - could not copy audio encoder parameters to output stream (%1) - não foi possível copiar os parâmetros de codificação de áudio para o fluxo de saída (%1) - - - - could not allocate audio buffer (%1) - não foi possível alocar o buffer de áudio (%1) - - - - could not create output format context - não foi possível criar o contexto do formato de saída - - - - could not open output file (%1) - não foi possível abrir o arquivo de saída (%1) - - - - could not write output file header (%1) - não foi possível escrever o cabeçalho do arquivo de saída (%1) - - - - could not write output file trailer (%1) - não foi possível escrever o rodapé do arquivo de saída (%1) + + This footage is not valid for use + - FillLeftRightEffect + ImportTool - - Type - Tipo + + Don't ask me again + - - Fill Left with Right - Preencher esquerdo com o direito + + No Active Sequence + - - Fill Right with Left - Preencher direito com o esquerdo + + No sequence is currently open. Would you like to create one? + - - Fill Left/Right - Preencher esquerdo/direito + + Automatically Detect Parameters From Footage + - - Replaces either the left or right channel with the other - Substitui o canal esquerdo ou direito com o outro + + Set Parameters Manually + - Frei0rEffect + MoveItemCommand - - Error loading Frei0r plugin - Erro ao carregar o plugin Frei0r - - - - Failed to load Frei0r plugin "%1": %2 - Falha ao carregar o plugin Frei0r %1: %2 + + Move Item + - GraphEditor + NodeCopyPasteWidget - - Graph Editor - Editor gráfico + + Error pasting nodes + - - Linear - Linear - - - - Bezier - Bézier - - - - Hold - Constante + + Failed to paste nodes: %1 + - GraphView + NodeFactory - - Zoom to Selection - Zoom para a seleção - - - - Zoom to Show All - Zoom para mostrar tudo - - - - Reset View - Redefinir visão + + None + - InterlacingName + NodeViewItem - - None (Progressive) - Nenhum (Progressivo) - - - - Upper Field First - Campo superior primeiro - - - - Lower Field First - Campo inferior primeiro - - - - Invalid - Inválido + + %1... + - KeyframeNavigator + PresetManager - - Enable Keyframes - Habilitar quadros-chave + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + - KeyframeView + RatioDialog - - Linear - Linear + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Bezier - Bézier + + Invalid custom ratio + - - Hold - Constante + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - LabelSlider + RenameItemCommand - - &Edit - &Editar - - - - &Reset to Default - &Restaurar ao padrão - - - - - Set Value - Definir valor - - - - - New value: - Novo valor: - - - - LinearFadeTransition - - - Linear Fade - Atenuação linear - - - - An linear audio fade that fades evenly at a constant rate. - Uma atenuação de áudio linear que diminui de forma constante. - - - - LoadDialog - - - Loading... - Carregando... - - - - Loading '%1'... - Carregando '%1'... - - - - Cancel - Cancelar - - - - LoadThread - - - Version Mismatch - Versões diferentes - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Este projeto foi salvo numa versão diferente do Olive e pode não ser totalmente compatível com esta versão. Você deseja carregá-lo mesmo assim? - - - - %1 - Line: %2 Col: %3 - %1 - Linha: %2 Col: %3 - - - - User aborted loading - Abertura cancelada pelo usuário - - - - XML Parsing Error - Erro na análise do XML - - - - Couldn't load '%1'. %2 - Não foi possível carregar '%1'. %2 - - - - Project Load Error - Erro ao carregar projeto - - - - Error loading project: %1 - Não foi possível carregar o projeto: %1 - - - - LogarithmicFadeTransition - - - Logarithmic Fade - Atenuação logarítmica - - - - An logarithmic audio fade that starts fast and ends slow. - Uma atenuação de áudio logarítmica que inicia rápida e termina lentamente. - - - - MainWindow - - - OpenColorIO Config Error - Erro na configuração do OpenColorIO - - - - Failed to set OpenColorIO configuration: %1 - Falha ao definir a configuração do OpenColorIO: %1 - - - - Welcome to %1 - Bem-vindo ao %1 - - - - &File - &Arquivo - - - - &New - &Novo - - - - &Open Project - &Abrir projeto - - - - Clear Recent List - Limpar lista - - - - Open Recent - Abrir recente - - - - &Save Project - &Salvar projeto - - - - Save Project &As - Salvar projeto &como - - - - &Import... - &Importar... - - - - &Export... - &Exportar... - - - - E&xit - Sai&r - - - - &Edit - &Editar - - - - &Undo - &Desfazer - - - - Redo - Refazer - - - - Select &All - Selecionar &tudo - - - - Deselect All - Desmarcar - - - - Ripple to In Point - Ajustar em cadeia à esquerda - - - - Ripple to Out Point - Ajustar em cadeia à direita - - - - Edit to In Point - Modificar à esquerda - - - - Edit to Out Point - Modificar à direita - - - - Delete In/Out Point - Excluir faixa de entrada/saída - - - - Ripple Delete In/Out Point - Excluir faixa de entrada/saída em cadeia - - - - Set/Edit Marker - Definir/editar marcador - - - - &View - E&xibir - - - - Zoom In - Aumentar zoom - - - - Zoom Out - Diminuir zoom - - - - Increase Track Height - Aumentar altura da faixa - - - - Decrease Track Height - Diminuir altura da faixa - - - - Toggle Show All - Mostrar toda a sequência - - - - Rectified Waveforms - Formas de onda retificadas - - - - Frames - Quadros - - - - Drop Frame - Código de tempo (com descarte de quadro) - - - - Non-Drop Frame - Código de tempo (sem descarte de quadro) - - - - Milliseconds - Milissegundos - - - - Title/Action Safe Area - Área segura de título/ação - - - - Off - Desativado - - - - Default - Padrão - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - Personalizado - - - - Full Screen - Tela cheia - - - - Full Screen Viewer - Visualizador de tela cheia - - - - &Playback - &Reprodução - - - - Go to Start - Ir ao início - - - - Previous Frame - Quadro anterior - - - - Play/Pause - Reproduzir/pausar - - - - Play In to Out - Reproduzir na faixa de entrada/saída - - - - Next Frame - Próximo quadro - - - - Go to End - Ir ao final - - - - Go to Previous Cut - Ir ao corte anterior - - - - Go to Next Cut - Ir ao próximo corte - - - - Go to In Point - Ir ao ponto de entrada - - - - Go to Out Point - Ir ao ponto de saída - - - - Shuttle Left - Avançar reprodução pela esquerda - - - - Shuttle Stop - Parar reprodução - - - - Shuttle Right - Avançar reprodução pela direita - - - - Loop - Repetir - - - - &Window - &Janela - - - - Project - Projeto - - - - Effect Controls - Controle de efeitos - - - - Timeline - Linha do tempo - - - - Graph Editor - Editor gráfico - - - - Node Editor - Editor de nós - - - - Media Viewer - Visualizador de mídia - - - - Sequence Viewer - Visualizador de sequência - - - - Maximize Panel - Maximizar painel - - - - Lock Panels - Travar painéis - - - - Reset to Default Layout - Restaurar leiaute padrão - - - - &Tools - &Ferramentas - - - - Pointer Tool - Ferramenta Ponteiro - - - - Edit Tool - Ferramenta Modificar - - - - Ripple Tool - Ferramenta Ajustar em cadeia - - - - Razor Tool - Ferramenta Fatiar - - - - Slip Tool - Ferramenta Escorregar - - - - Slide Tool - Ferramenta Deslizar - - - - Hand Tool - Ferramenta Mão - - - - Transition Tool - Ferramenta Transição - - - - Enable Snapping - Ativar encaixe - - - - Auto-Cut Silence - Cortar silêncio automaticamente - - - - No Auto-Scroll - Sem rolagem automática - - - - Page Auto-Scroll - Rolagem por página - - - - Smooth Auto-Scroll - Rolagem suave - - - - Preferences - Preferências - - - - Clear Undo - Limpar histórico do desfazer - - - - &Help - Aj&uda - - - - A&ction Search - &Pesquisar ação - - - - Debug Log - Log de depuração - - - - &About... - &Sobre... - - - - <untitled> - <sem título> - - - - Marker - - - - Set Marker - Definir marcador - - - - Set clip marker name: - Defina o nome do marcador do clipe: - - - - Set sequence marker name: - Defina o nome do marcador da sequência: - - - - Media - - - New Folder - Nova pasta - - - - Name: - Nome: - - - - Filename: - Nome do arquivo: - - - - Video Dimensions: - Dimensões do vídeo: - - - - Frame Rate: - Taxa de quadros: - - - - %1 field(s) (%2 frame(s)) - %1 campo(s) (%2 quadro(s)) - - - - Interlacing: - Entrelaçamento: - - - - Audio Frequency: - Frequência de áudio: - - - - Audio Channels: - Canais de áudio: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Nome: %1 -Dimensões do vídeo: %2x%3 -Taxa de quadros: %4 -Frequência de áudio: %5 -Layout do áudio: %6 - - - - Name - Nome - - - - Duration - Duração - - - - Rate - Taxa - - - - MediaPropertiesDialog - - - "%1" Properties - Propriedades "%1" - - - - Tracks: - Faixas: - - - - Video %1: %2x%3 %4FPS - Vídeo %1: %2x%3 %4QPS - - - - Audio %1: %2Hz %3 - Áudio %1: %2Hz %3 - - - - %n channel(s) - - Canais: %n - - - - - - Conform to Frame Rate: - Ajustar taxa de quadros: - - - - Alpha is Premultiplied - Canal alfa é pré-multiplicado - - - - Auto (%1) - Automático (%1) - - - - Interlacing: - Entrelaçamento: - - - - Color Space: - Espaço de cor: - - - - Name: - Nome: - - - - MenuHelper - - - &Project - &Projeto - - - - &Sequence - &Sequência - - - - &Folder - P&asta - - - - Set In Point - Definir ponto de entrada - - - - Set Out Point - Definir ponto de saída - - - - Reset In Point - Redefinir ponto de entrada - - - - Reset Out Point - Redefinir ponto de saída - - - - Clear In/Out Point - Limpar pontos de entrada/saída - - - - Add Default Transition - Adicionar transição padrão - - - - Link/Unlink - Vincular/desvincular - - - - Enable/Disable - Ativar/desativar - - - - Nest - Aninhar - - - - Cu&t - &Recortar - - - - Cop&y - &Copiar - - - - - &Paste - C&olar - - - - Paste Insert - Colar e inserir - - - - Duplicate - Duplicar - - - - Delete - Excluir - - - - Ripple Delete - Excluir em cadeia - - - - Split - Dividir - - - - Invalid aspect ratio - Taxa de proporção inválida - - - - The aspect ratio '%1' is invalid. Please try again. - A proporção de tela '%1' é inválida. Por favor, tente novamente. - - - - Enter custom aspect ratio - Informe a proporção de tela personalizada - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Informe a proporção de tela para utilizar na área segura (ex.: 16:9): - - - - NewSequenceDialog - - - Editing "%1" - Editando "%1" - - - - New Sequence - Nova sequência - - - - Preset: - Predefinição: - - - - Film 4K - Filme 4K - - - - TV 4K (Ultra HD/2160p) - TV 4K (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - Personalizado - - - - Video - Vídeo - - - - Width: - Largura: - - - - Height: - Altura: - - - - Frame Rate: - Taxa de quadros: - - - - Pixel Aspect Ratio: - Taxa de proporção do pixel: - - - - Square Pixels (1.0) - Pixels quadrados (1.0) - - - - Interlacing: - Entrelaçamento: - - - - None (Progressive) - Nenhum (Progressivo) - - - - Audio - Áudio - - - - Sample Rate: - Taxa de amostragem: - - - - Name: - Nome: - - - - Node - - - Node - - - - - NodeEditor - - - Node Editor - Editor de nós - - - - NodeIO - - - Disable Keyframes - Desativar quadros-chave - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Desativar os quadros-chave apagará todos os quadros-chave atuais. Tem certeza que deseja fazer isso? - - - - NodeImageOutput - - - Texture - Textura - - - - Image Output - Saída de imagem - - - - Outputs - Saídas - - - - Used for outputting images outside of the node graph. - Usado para enviar imagens para fora do gráfico de nós. - - - - NodeMedia - - - Matrix - Matriz - - - - Texture - Textura - - - - Media - Mídia - - - - Inputs - Entradas - - - - Retrieve frames from a media source. - Recuperar quadros de uma fonte de mídia. - - - - NodeView - - - Node Editor - Editor de nós - - - - OldEffectNode - - - Save Effect Settings - Salvar configurações de efeitos - - - - - Effect XML Settings %1 - Configurações do efeito XML %1 - - - - Save Settings Failed - Falha ao salvar as configurações - - - - Failed to open "%1" for writing. - Falha ao abrir "%1" para escrita. - - - - Load Effect Settings - Carregar configurações de efeitos - - - - - Load Settings Failed - Falha ao carregar as configurações - - - - Failed to open "%1" for reading. - Falha ao abrir "%1" para leitura. - - - - This settings file doesn't match this effect. - Este arquivo de configurações não corresponde a este efeito. - - - - OliveGlobal - - - Olive Project %1 - Projeto do Olive %1 - - - - Auto-recovery - Recuperação automática - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - O Olive não fechou corretamente e localizou um arquivo de recuperação automática. Você deseja abrí-lo? - - - - Effect already exists - O efeito já existe - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - O clipe '%1' já contém o efeito '%2'. Você deseja substituí-lo ou adicioná-lo como um efeito separado? - - - - Add - Adicionar - - - - Replace - Substituir - - - - Skip - Ignorar - - - - Do this for all conflicts found - Faça isso para todos os conflitos encontrados - - - - Open Project... - Abrir projeto... - - - - Missing recent project - Projeto recente não encontrado - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - O projeto '%1' não existe mais. Deseja removê-lo da lista de projetos recentes? - - - - Save Project As... - Salvar projeto como... - - - - Unsaved Project - Projeto não salvo - - - - This project has changed since it was last saved. Would you like to save it before closing? - O projeto mudou desde que foi salvo pela última vez. Você deseja salvá-lo antes de fechar? - - - - Import media... - Importar mídia... - - - - All Files - Todos os arquivos - - - - Missing Project File - Arquivo de projeto ausente - - - - Specified project '%1' does not exist. - O projeto especificado '%1' não existe. - - - - No active sequence - Não há sequência ativa - - - - Please open the sequence to perform this action. - Por favor, abra uma sequência para executar esta ação. - - - - No clips selected - Não há clipe selecionado - - - - Select the clips you wish to auto-cut - Selecione os clipes que você deseja cortar automaticamente - - - - PanEffect - - - - Pan - Balanço - - - - Modifying the panning on a stereo audio clip. - Modificar o baçanço em um clipe de áudio estéreo. - - - - PreferencesDialog - - - Preferences - Preferências - - - - Default Sequence - Sequência padrão - - - - (None) - (nenhum) - - - - OpenColorIO Config Error - Erro na configuração do OpenColorIO - - - - Failed to set OpenColorIO configuration: %1 - Falha ao definor configuração do OpenColorIO: %1 - - - - Invalid CSS File - Arquivo CSS inválido - - - - CSS file '%1' does not exist. - Arquivo CSS '%1' não existe. - - - - Invalid OpenColorIO Configuration File - Arquivo de configuração do OpenColorIO inválido - - - - You must specify an OpenColorIO configuration file if color management is enabled. - Você deve especificar um arquivo de configuração do OpenColorIO caso o gerenciamento de cores esteja ativo. - - - - OpenColorIO configuration file '%1' does not exist. - O arquivo de configuração do OpenColorIO '%1' não existe. - - - - Confirm Reset All Shortcuts - Confirmar a redefinição de todos os atalhos - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - Você deseja redefinir os atalhos de teclado para seus padrões? - - - - Import Keyboard Shortcuts - Importar atalhos de teclado - - - - - Error saving shortcuts - Erro ao salvar atalhos - - - - Failed to open file for reading - Falha ao abrir arquivo para leitura - - - - Export Keyboard Shortcuts - Exportar atalhos de teclado - - - - Export Shortcuts - Exportar atalhos - - - - Shortcuts exported successfully - Atalhos exportados com sucesso - - - - Failed to open file for writing - Falha ao abrir arquivo para escrita - - - - Browse for CSS file - Localizar arquivo CSS - - - - Browse for OpenColorIO configuration - Localizar arquivo de configuração do OpenColorIO - - - - Delete All Previews - Excluir todas as previsualizações - - - - Are you sure you want to delete all previews? - Você deseja excluir todas as previsualizações? - - - - Previews Deleted - Previsualizações apagadas - - - - All previews deleted successfully. You may have to re-open your current project for changes to take effect. - Todas as previsualizações foram excluídas com sucesso. Talvez seja necessário reabrir o projeto para que as alterações façam efeito. - - - - Language: - Idioma: - - - - Image sequence formats: - Formatos de sequência de imagem: - - - - Thumbnail Resolution: - Resolução da miniatura: - - - - Waveform Resolution: - Resolução da forma de onda: - - - - Delete Previews - Excluir previsualizações - - - - Use Software Fallbacks When Possible - Usar recursos de software quando possível - - - - Don't Use Proxies When Exporting - Não usar proxies ao exportar - - - - Use originals instead of proxies when exporting - Usar originais em vez de proxies ao exportar - - - - Default Sequence Settings - Configurações da sequência padrão - - - - General - Geral - - - - Behavior - Comportamento - - - - Add Default Effects to New Clips - Adicionar efeitos padrão para novos clipes - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - Mover o cursor para o início quando reproduzir no final da sequência - - - - Selecting Also Seeks - Selecionar também move o cursor - - - - Edit Tool Also Seeks - Ferramenta Modificar também move o cursor - - - - Edit Tool Selects Links - Ferramenta Modificar seleciona vínculos - - - - Seek Also Selects - Mover o cursor também seleciona - - - - Seek to the End of Pastes - Mover o cursor para o final do trecho colado - - - - Scroll Wheel Zooms - A roda do mouse controla o zoom - - - - Hold CTRL to toggle this setting - Mantenha a tecla CTRL pressionada para mudar esta configuração - - - - Invert Timeline Scroll Axes - Inverter eixos de rolagem na linha do tempo - - - - Enable Drag Files to Timeline - Arrastar arquivos diretamente à linha do tempo - - - - Auto-Scale By Default - Redimensionar automaticamente por padrão - - - - Auto-Seek to Imported Clips - Mover o cursor ao inserir um clipe na linha do tempo - - - - Audio Scrubbing - Reproduzir áudio ao mover o cursor - - - - Drop Files on Media to Replace - Arrastar arquivo sobre a mídia para substituí-la - - - - Enable Hover Focus - Foco segue o ponteiro do mouse - - - - Ask For Name When Setting Marker - Perguntar pelo nome quando definir o marcador - - - - Appearance - Aparência - - - - Theme - Tema - - - - Olive Dark (Default) - Olive Escuro (padrão) - - - - Olive Light - Olive Claro - - - - Native - Nativo - - - - Native (Light Icons) - Nativo (ícones claros) - - - - Use Native Menu Styling - Usar estilo de menu nativo - - - - Custom CSS: - CSS personalizado: - - - - - Browse - Procurar - - - - Effect Textbox Lines: - Linhas no campo de entrada de texto: - - - - Memory Usage - Uso da memória - - - - Upcoming Frame Queue: - Fila de quadros à frente: - - - - - frames - quadros - - - - - seconds - segundos - - - - Previous Frame Queue: - Fila de quadros anteriores: - - - - Playback - Reprodução - - - - Output Device: - Dispositivo de saída: - - - - - Default - Padrão - - - - Input Device: - Dispositivos de entrada: - - - - Sample Rate: - Taxa de amostragem: - - - - Audio Recording: - Gravação de áudio: - - - - Mono - Mono - - - - Stereo - Estéreo - - - - Audio - Áudio - - - - Enable Color Management - Habilitar gerenciamento de cores - - - - OpenColorIO Config File: - Arquivo de configuração do OpenColorIO: - - - - Default Input Color Space: - Espaço de cor de entrada padrão: - - - - Display: - Exibição: - - - - View: - Visualizar: - - - - Look: - Aparência: - - - - Bit Depth - Profundidade de bits - - - - Playback (Offline): - Reprodução (Offline): - - - - Export (Online): - Exportação (Online): - - - - Color Management - Gerenciamento de cores - - - - Search for action or shortcut - Pesquisar ação ou atalho - - - - Action - Ação - - - - Shortcut - Atalho - - - - Import - Importar - - - - Export - Exportar - - - - Reset Selected - Redefinir selecionado - - - - Reset All - Redefinir tudo - - - - Keyboard - Teclado - - - - PreviewGenerator - - - Failed to find any valid video/audio streams - Falha ao encontrar um fluxo válido de áudio/vídeo - - - - Could not open file - %1 - Não foi possível abrir o arquivo - %1 - - - - Could not find stream information - %1 - Não foi possível encontrar informações do fluxo - %1 - - - - Project - - - New - Novo - - - - Open Project - Abrir projeto - - - - Save Project - Salvar projeto - - - - Undo - Desfazer - - - - Redo - Refazer - - - - Tree View - Visão em árvore - - - - Icon View - Visão em ícones - - - - List View - Visão em lista - - - - Search media, markers, etc. - Pesquisar mídia, marcadores, etc. - - - - Project - Projeto - - - - - No active sequence - Nenhuma sequência ativa - - - - No sequence is active, please open the sequence you want to replace clips from. - Nenhuma sequência está ativa. Por favor, abra a sequência na qual você deseja substituir os clipes. - - - - Active sequence selected - Sequência ativa selecionada - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - Você não pode inserir uma sequência dentro dela mesma. Todos os clipes dentro da sequência seriam perdidos. - - - - Rename '%1' - Renomear '%1' - - - - Enter new name: - Digite o novo nome: - - - - Delete media in use? - Excluir mídia em uso? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - A mídia '%1' está sendo usada em '%2'. A exclusão removerá todas as instâncias na sequência. Você deseja fazer isso? - - - - Skip - Ignorar - - - - No sequence is active, please open the sequence you want to delete clips from. - Nenhuma sequência está ativa. Por favor, abra a sequência na qual você deseja excluir os clipes. - - - - ProjectModel - - - Sequence %1 - Sequência %1 - - - - Import a Project - Importar um projeto - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" é um arquivo de projeto do Olive. Ele será mesclado com o seu projeto. Você deseja continuar? - - - - Image sequence detected - Sequência de imagens detectada - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - O arquivo '%1' parece ser parte de uma sequência de imagens. Você deseja importar toda a sequência? - - - - ProxyDialog - - - Create Proxy - Criar proxy - - - - Proxy - Proxy - - - - Dimensions: - Dimensões: - - - - Same Size as Source - Mesmo tamanho da fonte - - - - Half Resolution (1/2) - Metade da resolução (1/2) - - - - Quarter Resolution (1/4) - Um quarto da resolução (1/4) - - - - Eighth Resolution (1/8) - Um oitavo da resolução (1/2) - - - - Sixteenth Resolution (1/16) - Um desesseis-avos da resolução (1/16) - - - - Format: - Formato: - - - - ProRes HQ - ProRes HQ - - - - Location: - Localização: - - - - Same as Source (in "%1" folder) - No mesmo lugar que a fonte (no diretório "%1") - - - - Proxy file exists - Arquivo de proxy existe - - - - The file "%1" already exists. Do you wish to replace it? - O arquivo "%1" já existe. Você deseja substituí-lo? - - - - Custom Location - Escolher a localização - - - - ProxyGenerator - - - Finished generating proxy for "%1" - Terminamos a geração do proxy para "%1" - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - Substituir clipes usando "%1" - - - - Select which media you want to replace this media's clips with: - Selecione a mídia que deseja usar para substituir: - - - - Keep the same media in-points - Manter os mesmos pontos de entrada da mídia - - - - Replace - Substituir - - - - Cancel - Cancelar - - - - No media selected - Mídia não selecionada - - - - Please select a media to replace with or click 'Cancel'. - Escolha uma mídia para substituir ou clique em 'Cancelar'. - - - - Same media selected - Mesma mídia selecionada - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Você selecionou a mesma mídia que deseja substituir. Escolha outra ou clique em 'Cancelar'. - - - - Folder selected - Pasta selecionada - - - - You cannot replace footage with a folder. - Você não pode substituir a gravação por uma pasta. - - - - Active sequence selected - Sequência ativa selecionada - - - - You cannot insert a sequence into itself. - Você não pode inserir uma sequência para dentro de si. - - - - RichTextEffect - - - Text - Texto - - - - Padding - Espaçamento - - - - Position - Posição - - - - Vertical Align: - Alinhamento vertical: - - - - Top - Em cima - - - - Center - Centro - - - - Bottom - Embaixo - - - - Auto-Scroll - Rolagem automática - - - - Off - Desligado - - - - Up - Para cima - - - - Down - Para baixo - - - - Left - Para a esquerda - - - - Right - Para a direita - - - - Shadow - Sombra - - - - Shadow Color - Cor da sombra - - - - Shadow Angle - Ângulo da sombra - - - - Shadow Distance - Distância da sombra - - - - Shadow Softness - Suavidade da sombra - - - - Shadow Opacity - Opacidade da sombra - - - - Rich Text - Texto formatado - - - - Render - Renderizar - - - - Render formatted rich text over a clip. - Renderiza um texto formatado em cima do clipe. + + Rename Item + Sequence - - %1 (copy) - %1 (cópia) + + %1 FPS + - ShakeEffect + Stream - - Intensity - Intensidade + + %1: Audio - %2 Channels, %3Hz + - - Rotation - Rotação + + %1: Unknown + - - Frequency - Frequência + + %1: Image - %2x%3 + - - Shake - Tremer - - - - Distort - Distorcer - - - - Simulate a camera shake movement. - Simula o movimento de tremer a câmera. + + %1: Video - %2x%3 + - SolidEffect + TimelineViewBlockItem - - Type - Tipo + + %1 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Solid Color - Cor sólida + + Bars + Barras - - SMPTE Bars - Barras SMPTE - - - - Checkerboard - Xadrez - - - - Opacity - Opacidade - - - - Color - Cor - - - - Checkerboard Size - Tamanho do quadrado - - - + Solid - Sólido + Sólido - - Render - Renderizar - - - - Render a solid color over this clip. - Renderiza uma cor sólida sobre este clipe. - - - - SourcesCommon - - - Import... - Importar... - - - - New - Novo - - - - View - Exibir - - - - Tree View - Exibição em árvore - - - - Icon View - Exibição em ícones - - - - Show Toolbar - Mostrar barra de tarefas - - - - Show Sequences - Mostrar sequências - - - - Replace/Relink Media - Substituir/revincular mídia - - - - Reveal in Explorer - Mostrar no Explorador de Arquivos - - - - Reveal in Finder - Mostrar no Finder - - - - Reveal in File Manager - Mostrar no gerenciador de arquivos - - - - Replace Clips Using This Media - Substituir clipes usando esta mídia - - - - Create Sequence With This Media - Criar sequência com esta mídia - - - - Duplicate - Duplicar - - - - Delete All Clips Using This Media - Excluir todos os clipes que usam esta mídia - - - - Proxy - Proxy - - - - Generating proxy: %1% complete - Geração de proxy: %1% completo - - - - Create/Modify Proxy - Criar/modificar proxy - - - - Create Proxy - Criar proxy - - - - Modify Proxy - Modificar proxy - - - - Restore Original - Restaurar original - - - - Delete - Excluir - - - - Preview in Media Viewer - Mostrar no visualizador de mídia - - - - Properties... - Propriedades... - - - - Replace '%1' - Substituir '%1' - - - - All Files - Todos os arquivos - - - - Replace Media - Substituir mídia - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Você arrastou um arquivo no lugar do '%1'. Deseja substituí-lo pelo arquivo arrastado? - - - - Delete proxy - Excluir proxy - - - - Would you like to delete the proxy file "%1" as well? - Você deseja excluir o arquivo de proxy "%1"? - - - - SpeedDialog - - - Speed/Duration - Velocidade/duração - - - - Speed: - Velocidade: - - - - Frame Rate: - Taxa de quadros: - - - - Duration: - Duração: - - - - Reverse - Inverter - - - - Maintain Audio Pitch - Manter o tom do áudio - - - - Ripple Changes - Mover clipes em cadeia - - - - TextEditDialog - - - Edit Text - Editar texto - - - - Thin - Fino - - - - Extra Light - Extraleve - - - - Light - Leve - - - - Normal - Regular - - - - Medium - Médio - - - - Demi Bold - Seminegrito - - - - Bold - Negrito - - - - Extra Bold - Extranegrito - - - - Black - Preto - - - - TextEditEx - - - Edit Text - Editar texto - - - - &Edit Text - &Editar texto - - - - TextEffect - - - - Text - Texto - - - - Font - Fonte - - - - Size - Tamanho - - - - Color - Cor - - - - Horizontal Alignment - Alinhamento horizontal - - - - Left - Esquerda - - - - - Center - Centro - - - - Right - Direita - - - - Justify - Justificado - - - - Vertical Alignment - Alinhamento vertical - - - - Top - Em cima - - - - Bottom - Embaixo - - - - Word Wrap - Quebra de linha automática - - - - Padding - Espaçamento - - - - Position - Posição - - - - Outline - Contorno - - - - Outline Color - Cor do contorno - - - - Outline Width - Largura do contorno - - - - Shadow - Sombra - - - - Shadow Color - Cor da sombra - - - - Shadow Angle - Ângulo da sombra - - - - Shadow Distance - Distância da sombra - - - - Shadow Softness - Suavidade da sombra - - - - Shadow Opacity - Opacidade da sombra - - - - Sample Text - Texto de exemplo - - - - Render - Renderizar - - - - Generate simple text over this clip - Cria um texto simples em cima do clipe - - - - TimecodeEffect - - - - Timecode - Código de tempo - - - - Sequence - Sequência - - - - Media - Mídia - - - - Scale - Escala - - - - Color - Cor - - - - Background Color - Cor do plano de fundo - - - - Background Opacity - Opacidade do plano de fundo - - - - Offset - Deslocamento - - - - Prepend - Texto no início - - - - Render - Renderizar - - - - Render the media or sequence timecode on this clip. - Renderiza o código de tempo da mídia ou da sequência neste clipe. - - - - Timeline - - - Pointer Tool - Ferramenta Ponteiro - - - - Edit Tool - Ferramenta Modificar - - - - Ripple Tool - Ferramenta Ajustar em cadeia - - - - Razor Tool - Ferramenta Fatiar - - - - Slip Tool - Ferramenta Escorregar - - - - Slide Tool - Ferramenta Deslizar - - - - Hand Tool - Ferramenta Mão - - - - Transition Tool - Ferramenta Transição - - - - Snapping - Encaixe - - - - Zoom In - Aumentar zoom - - - - Zoom Out - Diminuir zoom - - - - Record audio - Gravar áudio - - - - Add title, solid, bars, etc. - Adicionar título, cor sólida, barras, etc. - - - - Nested Sequence - Sequência aninhada - - - - Title... - Título... - - - - Solid Color... - Cor sólida... - - - - Bars... - Barras... - - - - Tone... - Tom... - - - - Noise... - Ruído... - - - - Unsaved Project - Projeto não salvo - - - - You must save this project before you can record audio in it. - Você precisa salvar este projeto antes de gravar áudio nele. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Clique na linha do tempo no ponto em que deseja iniciar a gravação (arraste para limitar a gravação a uma duração específica) - - - - Video Transitions - Transições de vídeo - - - - Audio Transitions - Transições de áudio - - - - Timeline: %1 - Linha do tempo: %1 - - - - (none) - (nenhum) - - - - TimelineHeader - - - Center Timecodes - Centralizar códigos de tempo - - - - TimelineLabel - - - Rename Track - Renomear faixa - - - - Enter the new name for this track - Digite o novo nome da faixa - - - - TimelineView - - - &Undo - &Desfazer - - - - &Redo - &Refazer - - - - R&ipple Delete Empty Space - &Excluir espaço em cadeia - - - - Sequence Settings - Configurações da sequência - - - - &Speed/Duration - &Velocidade/duração - - - - Auto-Cut Silence - Cortar silêncio automaticamente - - - - Auto-S&cale - &Ajustar escala automaticamente - - - - &Reveal in Project - &Mostrar no projeto - - - - Properties - Propriedades - - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Início: %2 -Fim: %3 -Duração: %4 - - - - Error - Erro - - - - Couldn't locate media wrapper for sequence. - Não foi possível localizar o contêiner de mídia para a sequência. - - - + Title - Título + Título - - Solid Color - Cor sólida - - - - Bars - Barras - - - + Tone - Tom + Tom - - Noise - Ruído - - - - Duration: - Duração: + + Unknown + - TimelineWidget + VideoParams - - &Undo - &Desfazer - - - - &Redo - &Refazer - - - - R&ipple Delete Empty Space - &Excluir espaço em cadeia - - - - Sequence Settings - Configurações da sequência - - - - &Speed/Duration - &Velocidade/duração - - - - Auto-Cut Silence - Cortar silêncio automaticamente - - - - Auto-S&cale - &Ajustar escala automaticamente - - - - &Reveal in Project - &Mostrar no projeto - - - - Properties - Propriedades - - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Início: %2 -Fim: %3 -Duração: %4 - - - - Error - Erro - - - - Couldn't locate media wrapper for sequence. - Não foi possível localizar o contêiner de mídia para a sequência. - - - - Title - Título - - - - Solid Color - Cor sólida - - - - Bars - Barras - - - - Tone - Tom - - - - Noise - Ruído - - - - Duration: - Duração: - - - - ToneEffect - - - Type - Tipo - - - - Sine - Senoidal - - - - Frequency - Frequência - - - - Amount - Quantidade - - - - Mix - Misturar - - - - Tone - Tom - - - - Generate a sine wave tone to mix into this clip's audio. - Cria um tom de onda senoidal para misturar no áudio deste clipe. - - - - Track - - - Video %1 - Vídeo %1 - - - - Audio %1 - Áudio %1 - - - - Subtitle %1 - Legenda %1 - - - - Unknown %1 - Desconhecido %1 - - - - TransformEffect - - - Position - Posição - - - - Scale - Escala - - - - Uniform Scale - Escala uniforme - - - - Rotation - Rotação - - - - Anchor Point - Ponto de ancoragem - - - - Opacity - Opacidade - - - - Transform - Transformar - - - - Distort - Distorcer - - - - Transform the position, scale, and rotation of this clip. - Transformar a posição, a escala e a rotação deste clipe. - - - - Transition - - - Length - Duração - - - - UpdateNotification - - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - Existe uma atualização disponível na página do Olive. Visite www.olivevideoeditor.org para fazer o download. - - - - VSTHost - - - - Error loading VST plugin - Erro ao carregar o plugin VST - - - - Failed to load VST plugin "%1": %2 - Não foi possível carregar o plugin VST "%1": %2 - - - - Failed to locate entry point for dynamic library. - Não foi possível localizar o ponto de entrada da biblioteca dinâmica. - - - - VST Error - Erro VST - - - - Plugin's magic number is invalid - O número mágico do plugin é inválido - - - - VST Plugin - Plugin VST - - - - Plugin - Plugin - - - - Interface - Interface - - - - Show - Mostrar - - - - VST Plugin 2.x - Plugin VST 2.x - - - - Use a VST 2.x plugin on this clip's audio. - Use um plugin VST 2.x neste clipe de áudio. - - - - Viewer - - - Viewer: %1 - Visualizador: %1 - - - - Failed to import recorded file - Falha ao importar o arquivo gravado - - - - An error occurred trying to import the recorded audio - Ocorreu um erro durante a importação do áudio gravado - - - - (none) - (nenhum) - - - - Drag video only - Arrastar apenas o vídeo - - - - Drag audio only - Arrastar apenas o áudio - - - - Sequence Viewer: %1 - Visualizador de sequência: %1 - - - - Media Viewer: %1 - Visualizador de mídia: %1 - - - - ViewerWidget - - - Save Frame as Image... - Salvar quadro como imagem... - - - - Show Fullscreen - Mostrar tela cheia - - - - Disable - Desativar - - - - Screen %1: %2x%3 - Tela %1: %2x%3 - - - - Zoom - Zoom - - - - Fit - Ajustar - - - - Custom - Personalizado - - - - Close Media - Fechar mídia - - - - Save Frame - Salvar quadro - - - - Viewer Zoom - Zoom do visualizador - - - - Set Custom Zoom Value: - Defina um valor de zoom personalizado: - - - - ViewerWindow - - - Exit Fullscreen - Sair da tela cheia - - - - VoidEffect - - - (unknown) - (desconhecido) - - - - Missing Effect - Efeito ausente - - - - VolumeEffect - - - - Volume - Volume - - - - Adjust the volume of this clip's audio - Ajusta o volume do áudio deste clipe - - - - bitdepths - - + 8-bit - Inteiro de 8 bits + Inteiro de 8 bits - + 16-bit Integer - Inteiro de 16 bits + Inteiro de 16 bits - + Half-Float (16-bit) - Ponto flutuante de 16 bits + Ponto flutuante de 16 bits - + Full-Float (32-bit) - Ponto flutuante de 32 bits + Ponto flutuante de 32 bits + + + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + + + + + main + + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + qm-file + + + + + Project to open on startup + + + + + olive::AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive é um editor de vídeos não-linear. Este software é livre e protegido pela licença GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + A equipe do Olive informa que o código-fonte está disponível no site do projeto. + + + + olive::ActionSearch + + + Search for action... + Pesquisar ação... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Áudio + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + + Length + Duração + + + + Media In + + + + + Enabled + + + + + Speed + + + + + olive::BlurFilterNode + + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + + + + + olive::ClipBlock + + + Clip + + + + + A time-based node that represents a media source. + + + + + Buffer + + + + + olive::ColorDialog + + + Select Color + + + + + olive::ColorSpaceChooser + + + Color Management + Gerenciamento de cores + + + + Input: + + + + + Color Space: + Espaço de cor: + + + + Display: + Exibição: + + + + View: + Visualizar: + + + + Look: + Aparência: + + + + (None) + (nenhum) + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + Nova pasta + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + Salvar projeto + + + + + Error + Erro + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + Sequência %1 + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + Abrir projeto + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + Dissolver cruzado + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Linear + + + + Bezier + Bézier + + + + Hold + Constante + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Avançado + + + + Pixel + + + + + Pixel Format: + Formato de pixel: + + + + Performance + + + + + Threads: + Threads: + + + + olive::ExportAudioTab + + + Codec: + Codec: + + + + Sample Rate: + Taxa de amostragem: + + + + Channel Layout: + + + + + Format: + Formato: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + Nome do arquivo: + + + + Browse for exported file filename + + + + + Preset: + Predefinição: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Intervalo: + + + + Entire Sequence + Sequência inteira + + + + In to Out + Faixa de entrada/saída + + + + Format: + Formato: + + + + Export Video + + + + + Export Audio + + + + + Video + Vídeo + + + + Audio + Áudio + + + + + Export + Exportar + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Largura: + + + + Height: + Altura: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + + Fit + Ajustar + + + + Stretch + + + + + Crop + + + + + Frame Rate: + Taxa de quadros: + + + + Pixel Aspect Ratio: + Taxa de proporção do pixel: + + + + Interlacing: + Entrelaçamento: + + + + Quality: + + + + + Codec + + + + + Codec: + Codec: + + + + Advanced + Avançado + + + + olive::FloatSlider + + + %1 dB + + + + + %1% + + + + + olive::FootagePropertiesDialog + + + "%1" Properties + Propriedades "%1" + + + + Name: + Nome: + + + + Tracks: + Faixas: + + + + olive::FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + Procurar + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + Todos os arquivos + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Tamanho do arquivo alvo (MB): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Nenhum (Progressivo) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Linear + + + + Hold + Constante + + + + Bezier + Bézier + + + + olive::KeyframeViewBase + + + Linear + Linear + + + + Bezier + Bézier + + + + Hold + Constante + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + &Salvar projeto + + + + Save Project &As + Salvar projeto &como + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + (nenhum) + + + + &File + &Arquivo + + + + &New + &Novo + + + + &Open Project + &Abrir projeto + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &Importar... + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + Sai&r + + + + &Edit + &Editar + + + + Insert + + + + + Overwrite + + + + + Select &All + Selecionar &tudo + + + + Deselect All + Desmarcar + + + + Ripple to In Point + Ajustar em cadeia à esquerda + + + + Ripple to Out Point + Ajustar em cadeia à direita + + + + Edit to In Point + Modificar à esquerda + + + + Edit to Out Point + Modificar à direita + + + + Delete In/Out Point + Excluir faixa de entrada/saída + + + + Ripple Delete In/Out Point + Excluir faixa de entrada/saída em cadeia + + + + Set/Edit Marker + Definir/editar marcador + + + + &View + E&xibir + + + + Zoom In + Aumentar zoom + + + + Zoom Out + Diminuir zoom + + + + Increase Track Height + Aumentar altura da faixa + + + + Decrease Track Height + Diminuir altura da faixa + + + + Toggle Show All + Mostrar toda a sequência + + + + Full Screen + Tela cheia + + + + Full Screen Viewer + Visualizador de tela cheia + + + + &Playback + &Reprodução + + + + Go to Start + Ir ao início + + + + Previous Frame + Quadro anterior + + + + Play/Pause + Reproduzir/pausar + + + + Play In to Out + Reproduzir na faixa de entrada/saída + + + + Next Frame + Próximo quadro + + + + Go to End + Ir ao final + + + + Go to Previous Cut + Ir ao corte anterior + + + + Go to Next Cut + Ir ao próximo corte + + + + Go to In Point + Ir ao ponto de entrada + + + + Go to Out Point + Ir ao ponto de saída + + + + Shuttle Left + Avançar reprodução pela esquerda + + + + Shuttle Stop + Parar reprodução + + + + Shuttle Right + Avançar reprodução pela direita + + + + Loop + Repetir + + + + &Sequence + &Sequência + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + Maximizar painel + + + + Lock Panels + Travar painéis + + + + Reset to Default Layout + Restaurar leiaute padrão + + + + &Tools + &Ferramentas + + + + Pointer Tool + Ferramenta Ponteiro + + + + Edit Tool + Ferramenta Modificar + + + + Ripple Tool + Ferramenta Ajustar em cadeia + + + + Rolling Tool + + + + + Razor Tool + Ferramenta Fatiar + + + + Slip Tool + Ferramenta Escorregar + + + + Slide Tool + Ferramenta Deslizar + + + + Hand Tool + Ferramenta Mão + + + + Zoom Tool + + + + + Transition Tool + Ferramenta Transição + + + + Enable Snapping + Ativar encaixe + + + + Preferences + Preferências + + + + &Help + Aj&uda + + + + A&ction Search + &Pesquisar ação + + + + Send &Feedback... + + + + + &About... + &Sobre... + + + + olive::MainStatusBar + + + Welcome to %1 %2 + Bem-vindo ao %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + Exibir + + + + Look + + + + + (None) + (nenhum) + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + Adicionar + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + Posição + + + + Rotation + Rotação + + + + Scale + Escala + + + + Uniform Scale + Escala uniforme + + + + Anchor Point + Ponto de ancoragem + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + &Projeto + + + + &Sequence + &Sequência + + + + &Folder + P&asta + + + + Cu&t + + + + + Cop&y + &Copiar + + + + &Paste + C&olar + + + + Paste Insert + Colar e inserir + + + + Duplicate + Duplicar + + + + Delete + Excluir + + + + Ripple Delete + Excluir em cadeia + + + + Split + Dividir + + + + Set In Point + Definir ponto de entrada + + + + Set Out Point + Definir ponto de saída + + + + Reset In Point + Redefinir ponto de entrada + + + + Reset Out Point + Redefinir ponto de saída + + + + Clear In/Out Point + Limpar pontos de entrada/saída + + + + Add Default Transition + Adicionar transição padrão + + + + Link/Unlink + Vincular/desvincular + + + + Enable/Disable + Ativar/desativar + + + + Nest + Aninhar + + + + Frames + Quadros + + + + Drop Frame + Código de tempo (com descarte de quadro) + + + + Non-Drop Frame + Código de tempo (sem descarte de quadro) + + + + Milliseconds + Milissegundos + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + Geral + + + + Math + + + + + Color + Cor + + + + Filter + + + + + Timeline + Linha do tempo + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + Editor de nós + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + Cor + + + + Matrix + Matriz + + + + Text + Texto + + + + Font + Fonte + + + + File + + + + + Texture + Textura + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Tipo + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + + (unknown) + (desconhecido) + + + + olive::NodeTreeView + + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + Adicionar + + + + olive::PanNode + + + + Pan + Balanço + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (nenhum) + + + + (multiple) + (vários) + + + + olive::PathWidget + + + Browse + Procurar + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + Cor + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + Cor + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + Tema + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + Dispositivo de saída: + + + + Input Device: + Dispositivos de entrada: + + + + Sample Rate: + Taxa de amostragem: + + + + Audio Recording: + Gravação de áudio: + + + + Mono + Mono + + + + Stereo + Estéreo + + + + Refresh Devices + + + + + Please wait... + + + + + Default + Padrão + + + + olive::PreferencesBehaviorTab + + + Behavior + Comportamento + + + + General + Geral + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Áudio + + + + Enable audio scrubbing + + + + + Timeline + Linha do tempo + + + + Auto-Seek to Imported Clips + Mover o cursor ao inserir um clipe na linha do tempo + + + + Edit Tool Also Seeks + Ferramenta Modificar também move o cursor + + + + Edit Tool Selects Links + Ferramenta Modificar seleciona vínculos + + + + Enable Drag Files to Timeline + Arrastar arquivos diretamente à linha do tempo + + + + Invert Timeline Scroll Axes + Inverter eixos de rolagem na linha do tempo + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + Mover o cursor também seleciona + + + + Seek to the End of Pastes + Mover o cursor para o final do trecho colado + + + + Selecting Also Seeks + Selecionar também move o cursor + + + + Playback + Reprodução + + + + Ask For Name When Setting Marker + Perguntar pelo nome quando definir o marcador + + + + Automatically rewind at the end of a sequence + + + + + Project + Projeto + + + + Drop Files on Media to Replace + Arrastar arquivo sobre a mídia para substituí-la + + + + Nodes + + + + + Add Default Effects to New Clips + Adicionar efeitos padrão para novos clipes + + + + Auto-Scale By Default + Redimensionar automaticamente por padrão + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + Preferências + + + + General + Geral + + + + Appearance + Aparência + + + + Behavior + Comportamento + + + + Disk + + + + + Audio + Áudio + + + + Keyboard + Teclado + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + Idioma: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + Pesquisar ação ou atalho + + + + Action + Ação + + + + Shortcut + Atalho + + + + Import + Importar + + + + Export + Exportar + + + + Reset Selected + Redefinir selecionado + + + + Reset All + Redefinir tudo + + + + Confirm Reset All Shortcuts + Confirmar a redefinição de todos os atalhos + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Você deseja redefinir os atalhos de teclado para seus padrões? + + + + Import Keyboard Shortcuts + Importar atalhos de teclado + + + + + Error saving shortcuts + Erro ao salvar atalhos + + + + Failed to open file for reading + Falha ao abrir arquivo para leitura + + + + Export Keyboard Shortcuts + Exportar atalhos de teclado + + + + Export Shortcuts + Exportar atalhos + + + + Shortcuts exported successfully + Atalhos exportados com sucesso + + + + Failed to open file for writing + Falha ao abrir arquivo para escrita + + + + olive::ProgressDialog + + + Cancel + Cancelar + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &Novo + + + + &Import... + &Importar... + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + Mostrar no Explorador de Arquivos + + + + Reveal in Finder + Mostrar no Finder + + + + Reveal in File Manager + Mostrar no gerenciador de arquivos + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + Projeto + + + + (none) + (nenhum) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + Espaço de cor de entrada padrão: + + + + Browse + Procurar + + + + Color Management + Gerenciamento de cores + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + Erro na configuração do OpenColorIO + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + Localizar arquivo de configuração do OpenColorIO + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + Abrir projeto + + + + Save Project + Salvar projeto + + + + Undo + Desfazer + + + + Redo + Refazer + + + + Search media, markers, etc. + Pesquisar mídia, marcadores, etc. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + Nome + + + + Duration + Duração + + + + Rate + Taxa + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + Negrito + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + Nome: + + + + New Sequence + Nova sequência + + + + Editing "%1" + Editando "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Vídeo + + + + Width: + Largura: + + + + Height: + Altura: + + + + Frame Rate: + Taxa de quadros: + + + + Pixel Aspect Ratio: + Taxa de proporção do pixel: + + + + Interlacing: + Entrelaçamento: + + + + Audio + Áudio + + + + Sample Rate: + Taxa de amostragem: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + Visualizador de sequência + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + Sólido + + + + Generate a solid color. + + + + + Color + Cor + + + + olive::StringSlider + + + (none) + (nenhum) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + Cor + + + + Radius + + + + + Opacity + Opacidade + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + Texto de exemplo + + + + + Text + Texto + + + + Generate rich text. + + + + + Font + Fonte + + + + Font Size + + + + + Color + Cor + + + + Vertical Align + + + + + Top + Em cima + + + + Center + Centro + + + + Bottom + Embaixo + + + + olive::TimeBasedPanel + + + (none) + (nenhum) + + + + olive::TimeBasedWidget + + + Set Marker + Definir marcador + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + Linha do tempo + + + + olive::TimelineWidget + + + + Properties + Propriedades + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + Ferramenta Ponteiro + + + + Edit Tool + Ferramenta Modificar + + + + Ripple Tool + Ferramenta Ajustar em cadeia + + + + Rolling Tool + + + + + Razor Tool + Ferramenta Fatiar + + + + Slip Tool + Ferramenta Escorregar + + + + Slide Tool + Ferramenta Deslizar + + + + Hand Tool + Ferramenta Mão + + + + Zoom Tool + + + + + Transition Tool + Ferramenta Transição + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + Vídeo %1 + + + + Audio %1 + Áudio %1 + + + + Subtitle %1 + Legenda %1 + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Linear + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + Senoidal + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + Vídeo + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + Entrelaçamento: + + + + Color Space: + Espaço de cor: + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + Taxa de quadros: + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + Textura + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + Erro + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + Zoom + + + + Fit + Ajustar + + + + %1% + + + + + Full Screen + Tela cheia + + + + Screen %1: %2x%3 + Tela %1: %2x%3 + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + + Volume + Volume + + + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/ru_RU.ts b/app/ts/ru_RU.ts index a5749e97a..a276780c7 100644 --- a/app/ts/ru_RU.ts +++ b/app/ts/ru_RU.ts @@ -2,3644 +2,4765 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive — нелинейный видеоредактор. Эта программа является свободной и защищена GNU GPL. - - - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Исходный код Olive доступен для скачивания на сайте программы. - - - - ActionSearch - - - Search for action... - Найти действие… - - - - AdvancedVideoDialog - - - Advanced Video Settings - Дополнительные параметры видео - - - - Pixel Format: - Формат пикселей: - - - - Threads: - Потоков: - - - - Audio - - - %1 Audio + + %1 Hz - - Recording %1 - Запись %1 - - - - AudioNoiseEffect - - - Amount - Количество - - - - Mix - Смешивание - - - - AutoCutSilenceDialog - - - Cut Silence - Вырезать тишину - - - - Attack Threshold: - Порог атаки: - - - - Attack Time: - Время атаки: - - - - Release Threshold: - Порог восстановления: - - - - Release Time: - Время восстановления: - - - - Cacher - - - - Could not open %1 - %2 - Не удалось открыть %1 - %2 - - - - ChannelLayoutName - - - Invalid - Некорректный - - - + Mono - Моно + Моно - + Stereo - Стерео + Стерео + + + + 2.1 + 144p {2.1?} + + + + 5.1 + 144p {5.1?} + + + + 7.1 + 144p {7.1?} + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - Свойства "%1" - - - - Multiple Clip Properties - Свойства клипов - - - - Name: - Название: - - - - Duration: - Длительность: - - - - (multiple) - (больше одного) - - - - CollapsibleWidget - - - <untitled> - <без названия> - - - - ColorButton - - - Set Color - Установить цвет - - - - CornerPinEffect - - - Top Left - Вверху слева - - - - Top Right - Вверху справа - - - - Bottom Left - Внизу слева - - - - Bottom Right - Внизу справа - - - - Perspective - Перспектива - - - - DebugDialog - - - Debug Log - Журнал отладки - - - - DemoNotice - - - - Welcome to Olive! - Приветствуем в Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Это свободный нелинейный видеоредактор с открытым исходным кодом под лицензией GNU GPL. Если вы заплатили за эту программу, скорее всего вас обманули. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - На текущий момент программа находится на стадии альфы, т.е. она нестабильна, может часто падать и не иметь нужных вам функций. Мы не даём никаких гарантий, используйте на свой страх и риск. Сообщения об ошибках и запросы на новые функции мы принимаем здесь: %1 - - - - Thank you for trying Olive and we hope you enjoy it! - Спасибо за интерес к Olive. Надеемся, что программа вам понравится! - - - - Effect - - - Invalid effect - Некорректный эффект - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + Error loading settings - - Save Effect Settings - Сохранить параметры эффекта - - - - - Effect XML Settings %1 - Файлы с параметрами эффектов %1 - - - - Save Settings Failed - Не удалось сохранить параметры - - - - Failed to open "%1" for writing. - Не удалось открыть "%1" для записи. - - - - Load Effect Settings - Загрузить параметры эффекта - - - - - Load Settings Failed - Не удалось загрузить параметры - - - - Failed to open "%1" for reading. - Не удалось открыть "%1" для чтения. - - - - This settings file doesn't match this effect. - Это файлс параметрами совсем другого эффекта. - - - - EffectControls - - - Effects: - Эффекты: - - - - (none) - (нет) - - - - Add Video Effect - Добавить видеоэффект - - - - VIDEO EFFECTS - ВИДЕОЭФФЕКТЫ - - - - Add Video Transition - Добавить видеопереход - - - - Add Audio Effect - Добавить аудиоэффект - - - - AUDIO EFFECTS - АУДИОЭФФЕКТЫ - - - - Add Audio Transition - Добавить аудиопереход - - - - EffectRow - - - Disable Keyframes - Отключить ключевые кадры - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Отключение приведёт к удалению всех текущих ключевых кадров. Вы уверены? - - - - EffectUI - - - %1 (Opening) - %1 (открывается) - - - - %1 (Closing) - %1 (закрывается) - - - - %1 (multiple) - %1 (больше одного) - - - - Cu&t - В&ырезать - - - - &Copy - &Скопировать - - - - Move &Up - &Поднять - - - - Move &Down - &Опустить - - - - D&elete - &Удалить - - - - Load Settings From File - Загрузить параметры из файла - - - - Save Settings to File - Сохранить параметры в файл - - - - EmbeddedFileChooser - - - File: - Файл: - - - - ExportDialog - - - Export "%1" - Экспортировать "%1" - - - - Unknown codec name %1 - - - - - Export Failed - Не удалось экспортировать - - - - Export failed - %1 - Не удалось экспортировать — %1 - - - - Invalid dimensions - Некорректный размер кадра - - - - Export width and height must both be even numbers/divisible by 2. - Ширина и высота кадра при экспорте должны делиться на 2 без остатка. - - - - Invalid codec - Некорректный кодек - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - - - - - Invalid format - Некорректный формат - - - - Couldn't determine output format. This is a bug, please contact the developers. - - - - - Export Media - Экспортировать проект - - - - %p% (Total: %1:%2:%3) - %p% (Итого: %1:%2:%3) - - - - %p% (ETA: %1:%2:%3) - %p% (Осталось: %1:%2:%3) - - - - Quality-based (Constant Rate Factor) - Качество (Constant Rate Factor) - - - - Constant Bitrate - Постоянная скорость потока - - - - - Invalid Codec - Некорректный кодек - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Не удалось найти подходящий кодировщик для этого кодека. Экспорт не гарантирован. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Не удалось найти пиксельный формат для этого кодировщика. Экспортировать скорее всего не получится. - - - - Bitrate (Mbps): - Скорость потока (Мбит/с): - - - - Quality (CRF): - Качество (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Показатель качества: - -0 = без потерь в качестве -17-18 = визуально без потерь, хотя есть сжатие -23 = высокое качество -51 = самое низкое качество - - - - Target File Size (MB): - Конечный размер файла (Мб): - - - - Format: - Формат: - - - - Range: - Диапазон: - - - - Entire Sequence - Вся последовательность - - - - In to Out - От входа от выхода - - - - Video - Видео - - - - - Codec: - Кодек: - - - - Width: - Ширина: - - - - Height: - Высота: - - - - Frame Rate: - Частота кадров: - - - - Compression Type: - Тип сжатия: - - - - Advanced - Дополнительно - - - - Audio - Звук - - - - Sampling Rate: - Частота дискретизации: - - - - Bitrate (Kbps/CBR): - Скорость потока (Кбит/с / CBR): - - - - ExportThread - - - failed to send frame to encoder (%1) +%1 - - failed to receive packet from encoder (%1) + + Error saving settings - - could not video encoder for %1 - - - - - could not allocate video stream - - - - - could not allocate video encoding context - - - - - could not open output video encoder (%1) - - - - - could not copy video encoder parameters to output stream (%1) - - - - - could not audio encoder for %1 - - - - - could not allocate audio stream - - - - - could not allocate audio encoding context - - - - - could not open output audio encoder (%1) - - - - - could not copy audio encoder parameters to output stream (%1) - - - - - could not allocate audio buffer (%1) - - - - - could not create output format context - - - - - could not open output file (%1) - - - - - could not write output file header (%1) - - - - - could not write output file trailer (%1) + + Failed to save application settings. The application may lack write permissions to this location. - FillLeftRightEffect + Footage - - Type - Тип - - - - Fill Left with Right - Заполнить левый канал правым - - - - Fill Right with Left - Заполнить правый канал левым - - - - Frei0rEffect - - - Failed to load Frei0r plugin "%1": %2 - Не удалось загрузить плагшин Frei0r "%1": %2 - - - - Error loading Frei0r plugin - Ошибка при загрузке плагина Frei0r - - - - GraphEditor - - - Graph Editor - Редактор графов - - - - Linear - Линейный - - - - Bezier - Безье - - - - Hold - Константа - - - - GraphView - - - Zoom to Selection - Масштабировать в выделение - - - - Zoom to Show All - Масштабировать и показать всё - - - - Reset View - Сбросить масштаб - - - - InterlacingName - - - None (Progressive) - Нет (прогрессивно) - - - - Top Field First - Сначала верхнее поле - - - - Bottom Field First - Сначала нижнее поле - - - - Invalid - Некорректно - - - - KeyframeNavigator - - - Enable Keyframes - Включить ключевые кадры - - - - KeyframeView - - - Linear - Линейный - - - - Bezier - Безье - - - - Hold - Константа - - - - LabelSlider - - - &Edit - &Изменить - - - - &Reset to Default - С&бросить до исходного - - - - - Set Value - Установить значение - - - - - New value: - Новое значение: - - - - LoadDialog - - - Loading... - Загрузка… - - - - Loading '%1'... - Загружается '%1'... - - - - Cancel - Отмена - - - - LoadThread - - - Version Mismatch - Несовпадение версий - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Этот проект был сохранён в другой версии Olive, которая неполностью совместима с установленной у вас. Всё-таки попробовать загрузить? - - - - Invalid Clip Link - Некорректная связь клипов - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - В проекте обнаружена некорректная связь клипов. Всё-таки попробовать загрузить её? - - - - %1 - Line: %2 Col: %3 - %1 - Строка: %2 Столбец: %3 - - - - User aborted loading - Пользователь прервал загрузку - - - - XML Parsing Error - Ошибка разбора XML - - - - Couldn't load '%1'. %2 - Не удалось загрузить '%1'. %2 - - - - Project Load Error - Ошибка при загрузке проекта - - - - Error loading project: %1 - Ошибка при загрузке проекта: %1 - - - - MainWindow - - - Welcome to %1 - Приветствуем в %1 - - - - &File - &Файл - - - - &New - &Создать - - - - &Open Project - &Открыть проект - - - - Clear Recent List - Очистить список - - - - Open Recent - Открыть недавний - - - - &Save Project - Со&хранить проект - - - - Save Project &As - Сохранить проект &как - - - - &Import... - &Импортировать… - - - - &Export... - &Экспортировать… - - - - E&xit - В&ыход - - - - &Edit - &Правка - - - - &Undo - &Отменить - - - - Redo - Вернуть - - - - Select &All - Выд&елить всё - - - - Deselect All - Снять выделение - - - - Ripple to In Point - Сдвиг до точки входа - - - - Ripple to Out Point - Сдвиг до точки выхода - - - - Edit to In Point - Правка до точки входа - - - - Edit to Out Point - Правка до точки выхода - - - - Delete In/Out Point - Удалить точку входа/выхода - - - - Ripple Delete In/Out Point - Удалить со сдвигом точку входа/выхода - - - - Set/Edit Marker - Установить/Изменить маркер - - - - &View - &Вид - - - - Zoom In - Приблизить - - - - Zoom Out - Отдалить - - - - Increase Track Height - Увеличить высоту дорожки - - - - Decrease Track Height - Уменьшить высоту дорожки - - - - Toggle Show All - Показывать весь проект - - - - Track Lines - Линии дорожек - - - - Rectified Waveforms - Волновая форма от низа - - - - Frames - Кадры - - - - Drop Frame - С пропуском кадров - - - - Non-Drop Frame - Без пропуска кадров - - - - Milliseconds - Миллисекунды - - - - Title/Action Safe Area - Безопасная область - - - - Off - Выкл. - - - - Default - По умолчанию - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - Другая - - - - Full Screen - Полноэкранный режим - - - - Full Screen Viewer - Просмотр в полноэкранном режиме - - - - &Playback - Вос&произведение - - - - Go to Start - К началу - - - - Previous Frame - К предыдущему кадру - - - - Play/Pause - Воспроизведение/Пауза - - - - Play In to Out - Проиграть от входа до выхода - - - - Next Frame - К следующему кадру - - - - Go to End - В конец - - - - Go to Previous Cut + + %1 FPS - - Go to Next Cut + + %1 Hz - - Go to In Point - К точке входа - - - - Go to Out Point - К точке выхода - - - - Shuttle Left - Уменьшить скорость - - - - Shuttle Stop - Пауза - - - - Shuttle Right - Увеличить скорость - - - - Loop - Петля - - - - &Window - &Окно - - - - Project - Проект - - - - Effect Controls - Управление эффектами - - - - Timeline - Монтажный стол - - - - Graph Editor - Редактор графов - - - - Media Viewer - Просмотр проекта - - - - Sequence Viewer - Просмотр последовательностей - - - - Maximize Panel - Развернуть панель - - - - Lock Panels - Закрепить панели - - - - Reset to Default Layout - Вернуть исходный вид панелей - - - - &Tools - &Инструменты - - - - Pointer Tool - Указатель - - - - Edit Tool - Выделение - - - - Ripple Tool - Монтаж со сдвигом - - - - Razor Tool - Подрезка - - - - Slip Tool - Прокрутка с совмещением - - - - Slide Tool - Прокрутка - - - - Hand Tool - Навигация - - - - Transition Tool - Переход - - - - Enable Snapping - Включить прилипание - - - - Auto-Cut Silence - Вырезать тишину - - - - No Auto-Scroll - Без автопрокрутки - - - - Page Auto-Scroll - Прокручивать перелистыванием - - - - Smooth Auto-Scroll - Прокручивать плавно - - - - Preferences - Параметры - - - - Clear Undo - Очистить историю изменений - - - - &Help - &Справка - - - - A&ction Search - &Найти команду - - - - Debug Log - Журнал отладки - - - - &About... - &О программе… - - - - <untitled> - <без названия> - - - - Marker - - - Set Marker - Установить маркер - - - - Set clip marker name: - Название маркера клипа: - - - - Set sequence marker name: - Название маркера последовательности: - - - - Media - - - New Folder - Новая папка - - - - Name: - Название: - - - - Filename: - Имя файла: - - - - Video Dimensions: - Размер кадров: - - - - Frame Rate: - Частота кадров: - - - - %1 field(s) (%2 frame(s)) - полей: %1 (кадров: %2) - - - - Interlacing: - Чересстрочность: - - - - Audio Frequency: - Частота звука: - - - - Audio Channels: - Звуковых каналов: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Название: %1 -Размер кадров: %2x%3 -Частота кадров: %4 -Частота звука: %5 -Звуковые каналы: %6 - - - - Name - Название - - - - Duration - Длительность - - - - Rate - Частота - - - - MediaPropertiesDialog - - - "%1" Properties - Свойства "%1" - - - - Tracks: - Дорожек: - - - - Video %1: %2x%3 %4FPS - Видео %1: %2x%3 %4к/с - - - - Audio %1: %2Hz %3 - Звук %1: %2Гц %3 - - - - %n channel(s) - - %n канал - %n канала - %n каналов - - - - - Conform to Frame Rate: + + Filename: %1 - - Alpha is Premultiplied - Предумноженный альфа-канал - - - - Auto (%1) - Авто (%1) - - - - Interlacing: - Чересстрочность: - - - - Name: - Название: + + This footage is not valid for use + - MenuHelper + ImportTool - - &Project - &Проект - - - - &Sequence - П&оследовательность - - - - &Folder - П&апка - - - - Set In Point - Установить точку входа - - - - Set Out Point - Установить точку выхода - - - - Reset In Point - Сбросить точку входа - - - - Reset Out Point - Сбросить точку выхода - - - - Clear In/Out Point - Очистить точку входа/выхода - - - - Add Default Transition - Добавить переход по умолчанию - - - - Link/Unlink - Связать/Убрать связь - - - - Enable/Disable - Включить/Отключить - - - - Nest - Вложить - - - - Cu&t - В&ырезать - - - - Cop&y - С&копировать - - - - - &Paste - &Вставить - - - - Paste Insert + + Don't ask me again - - Duplicate - Сделать копию - - - - Delete - Удалить - - - - Ripple Delete - Удалить со сдвигом - - - - Split - Разделить - - - - Invalid aspect ratio - Некорректное соотношение сторон - - - - The aspect ratio '%1' is invalid. Please try again. + + No Active Sequence - - Enter custom aspect ratio - Введите другое соотношение сторон - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Введите соотношение сторон для этой безопасной области (например, 16:9) - - - - NewSequenceDialog - - - Editing "%1" - Правка "%1" - - - - New Sequence - Новая последовательность - - - - Preset: - Предстановка: - - - - Film 4K - Кино 4К - - - - TV 4K (Ultra HD/2160p) - TV 4K (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - Другое - - - - Video - Видео - - - - Width: - Ширина: - - - - Height: - Высота: - - - - Frame Rate: - Частота кадров: - - - - Pixel Aspect Ratio: - Соотношение сторон пикселя: - - - - Square Pixels (1.0) - Квадратные пиксели (1.0) - - - - Interlacing: - Чересстрочность: - - - - None (Progressive) - Нет (прогрессивно) - - - - Audio - Звук - - - - Sample Rate: - Частота дискретизации: - - - - Name: - Название: - - - - OliveGlobal - - - Olive Project %1 - Проект Olive %1 - - - - Auto-recovery - Автовосстановление - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive аварийно завершил работу, обнаружен файл автовосстановления. Открыть его? - - - - Open Project... - Открыть проект… - - - - Missing recent project - Отсутствует недавний проект - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Проект '%1' больше не существует. Удалить его из списка недавних? - - - - Save Project As... - Сохранить проект как… - - - - Unsaved Project - Несохранённый проект - - - - This project has changed since it was last saved. Would you like to save it before closing? - Проект был изменён с момента последнего сохранения. Хотите сохранить его перед закрытием? - - - - No active sequence - Нет активных последовательностей - - - - Please open the sequence to perform this action. - Откройте последовательность для выполнения этого действия. - - - - No clips selected - Клипы не выделены - - - - Select the clips you wish to auto-cut - Выделите клипы, в которых надо вырезать тишину - - - - Missing Project File - Отсутствует проектный файл - - - - Specified project '%1' does not exist. - Указанный проект '%1' не существует. - - - - PanEffect - - - Pan - Панорама - - - - PreferencesDialog - - - Preferences - Параметры - - - - Default Sequence - Последовательности по умолчанию - - - - Invalid CSS File - Некорректный файл CSS - - - - CSS file '%1' does not exist. - Файл CSS '%1' не существует. - - - - Confirm Reset All Shortcuts - Подтвердите действие - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - Вы действительно хотите сбросить все клавиатурные комбинации к исходным значениям? - - - - Import Keyboard Shortcuts - Импортировать клавиатурные комбинации - - - - - Error saving shortcuts - Ошибка при сохранении клавиатурных комбинаций - - - - Failed to open file for reading - Не удалось открыть файл для чтения - - - - Export Keyboard Shortcuts - Экспортировать клавиатурные комбинации - - - - Export Shortcuts - Экспортировать клавиатурные комбинации - - - - Shortcuts exported successfully - Комбинации успешно экспортированы - - - - Failed to open file for writing - Не удалось открыть файл для записи - - - - Browse for CSS file - Указать файл CSS - - - - Delete All Previews - Удалить все миниатюры - - - - Are you sure you want to delete all previews? - Действительно удалить все миниатюры? - - - - Previews Deleted - Миниатюры удалены - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - Все миниатюры успешно удалены. Возможно, понадобится заново открыть проект, чтобы изменения вступили в силу. - - - - Language: - Язык: - - - - Default Sequence Settings + + No sequence is currently open. Would you like to create one? - - Add Default Effects to New Clips - Добавлять эффекты по умолчанию в новые клипы - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence + + Automatically Detect Parameters From Footage - - Selecting Also Seeks - Выделение с перемоткой - - - - Edit Tool Also Seeks - Выделение с перемоткой - - - - Edit Tool Selects Links - Выделение выбирает связи - - - - Seek Also Selects - Перемотка с выделением - - - - Seek to the End of Pastes - Перемотка до конца вставок - - - - Scroll Wheel Zooms - Колесо мыши масштабирует монтажный стол - - - - Hold CTRL to toggle this setting + + Set Parameters Manually - - - Invert Timeline Scroll Axes - - - - - Enable Drag Files to Timeline - Разрешить перетаскивание на монтажный стол извне - - - - Auto-Scale By Default - Автоматически масштабировать по умолчанию - - - - Auto-Seek to Imported Clips - - - - - Audio Scrubbing - Воспроизводить звук при прокрутке - - - - Drop Files on Media to Replace - - - - - Enable Hover Focus - Включить фокус наводкой - - - - Ask For Name When Setting Marker - Спрашивать имя маркера при добавлении - - - - Appearance - Внешний вид - - - - Theme - Тема - - - - Olive Dark (Default) - Olive Dark (по умолчанию) - - - - Olive Light - Olive Light - - - - Native - Системная - - - - Native (Light Icons) - Системная со светлыми значками - - - - Use Native Menu Styling - - - - - Custom CSS: - Свой CSS: - - - - Browse - Просмотр - - - - Image sequence formats: - Форматы изображений: - - - - Audio Recording: - Запись звука: - - - - Mono - Моно - - - - Stereo - Стерео - - - - Effect Textbox Lines: - Строк в редакторе титров: - - - - Thumbnail Resolution: - Разрешение миниатюр: - - - - Waveform Resolution: - Разрешение волновой формы: - - - - Delete Previews - Удалить миниатюры - - - - Use Software Fallbacks When Possible - По возможности использовать программную реализацию вместо аппаратной - - - - General - Общие - - - - Behavior - Поведение - - - - Memory Usage - Использование памяти - - - - Upcoming Frame Queue: - Очередь последующих кадров: - - - - - frames - кадров - - - - - seconds - секунд - - - - Previous Frame Queue: - Очередь предыдущих кадров: - - - - Playback - Воспроизведение - - - - Output Device: - Устройство выхода: - - - - - Default - По умолчанию - - - - Input Device: - Устройство входа: - - - - Sample Rate: - Частота дискретизации: - - - - Audio - Звук - - - - Search for action or shortcut - Искать действие или комбинацию клавиш - - - - Action - Действие - - - - Shortcut - Комбинация - - - - Import - Импортировать - - - - Export - Экспортировать - - - - Reset Selected - Сбросить выбранное - - - - Reset All - Сбросить все - - - - Keyboard - Клавиатурные комбинации - - PreviewGenerator + MoveItemCommand - - Failed to find any valid video/audio streams + + Move Item + + + + + NodeCopyPasteWidget + + + Error pasting nodes - - Could not open file - %1 - Не удалось открыть файл — %1 - - - - Could not find stream information - %1 - Не удалось найти информацию потока — %1 + + Failed to paste nodes: %1 + - Project + NodeFactory - - New - Создать - - - - Open Project - Открыть проект - - - - Save Project - Сохранить проект - - - - Undo - Отменить - - - - Redo - Вернуть - - - - Tree View - В виде дерева - - - - Icon View - В виде миниатюр - - - - List View - В виде списка - - - - Search media, markers, etc. - Искать файлы, маркеры и т.д. - - - - Project - Проект - - - - Sequence - Последовательность - - - - Replace '%1' - Заменить '%1' - - - - - All Files - Все файлы - - - - - No active sequence - Нет активных последовательностей - - - - No sequence is active, please open the sequence you want to replace clips from. - Нет активных последовательностей. Откройте последовательность, в которой хотите заменить клипы. - - - - Active sequence selected - Выбрана активная последовательность - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - Вы не можете вставить последовательность в саму себя, так что клипы из этих файлов не могут попасть в эту последовательность. - - - - Rename '%1' - Переименовать '%1' - - - - Enter new name: - Введите новое название: - - - - Delete media in use? - Удалить используемые в проекте файлы? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - Файл '%1' уже используется в '%2'. Его удаление приведет к удалению всех его копий в выбранной последовательности. Вы точно этого хотите? - - - - Skip - Пропустить - - - - Import a Project - Импортировать проект - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" является проектом Olive и будет добавлен в этот проект. Продолжить? - - - - Image sequence detected - Обнаружена последовательность изображений - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - Похоже, что файл '%1' яавляется частью последовательности изображений. Загрузить его как таковой? - - - - Import media... - Импортировать медиафайлы… - - - - No sequence is active, please open the sequence you want to delete clips from. - Нет активных последовательностей. Откройте последовательность, из которой хотите удалить клипы. + + None + - ProxyDialog + NodeViewItem - - Create Proxy - Создать прокси - - - - Proxy - Прокси - - - - Dimensions: - Размер: - - - - Same Size as Source - В размере оригинала - - - - Half Resolution (1/2) - Половина оригинала (1/2) - - - - Quarter Resolution (1/4) - Четверть оригинала (1/4) - - - - Eighth Resolution (1/8) - Восьмая оригинала (1/8) - - - - Sixteenth Resolution (1/16) - Шестнадцатая оригинала (1/16) - - - - Format: - Формат: - - - - ProRes HQ - ProRes HQ - - - - Location: - Размещение: - - - - Same as Source (in "%1" folder) - Как в исходнике (в папке «%1») - - - - Proxy file exists - Прокси-файл уже существует - - - - The file "%1" already exists. Do you wish to replace it? - Файл «%1» уже существует. Заменить его? - - - - Custom Location - Другое размещение + + %1... + - ProxyGenerator + PresetManager - - Finished generating proxy for "%1" - Завершено создание прокси для "%1" + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + - ReplaceClipMediaDialog + RatioDialog - - Replace clips using "%1" - Заменить клипы данными "%1" + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Select which media you want to replace this media's clips with: - Выберите файлы, которые хотите заменить клипы с этими файлами: + + Invalid custom ratio + - - Keep the same media in-points - Сохранить существующие точки входа - - - - Replace - Заменить - - - - Cancel - Отмена - - - - No media selected - Файлы не выбраны - - - - Please select a media to replace with or click 'Cancel'. - Выберите файлы для замены или нажмите кнопку «Отмена». - - - - Same media selected - Выбраны те же самые файлы - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Вы выбрали те же файлы, которые хотите заменить. Выберите что-то другое или нажмите кнопку «Отмена». - - - - Folder selected - Папка выбрана - - - - You cannot replace footage with a folder. - Вы не можете заменить видеосъёмку папкой. - - - - Active sequence selected - Выбрана активная последовательность - - - - You cannot insert a sequence into itself. - Вы не можете вставить последовательность в саму себя. + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - RichTextEffect + RenameItemCommand - - Text - Текст - - - - Padding - Отступ - - - - Position - Позиция - - - - Vertical Align: - Верт. выравнивание: - - - - Top - Сверху - - - - Center - По центру - - - - Bottom - Снизу - - - - Auto-Scroll - Автопрокрутка - - - - Off - Выкл. - - - - Up - Вверх - - - - Down - Вниз - - - - Left - Влево - - - - Right - Вправо - - - - Shadow - Тень - - - - Shadow Color - Цвет тени - - - - Shadow Angle - Угол тени - - - - Shadow Distance - Длина тени - - - - Shadow Softness - Мягкость тени - - - - Shadow Opacity - Непрозрачность тени + + Rename Item + Sequence - - %1 (copy) - %1 (копия) + + %1 FPS + - ShakeEffect + Stream - - Intensity - Интенсивность - - - - Rotation - Вращение - - - - Frequency - Частота - - - - SolidEffect - - - Type - Тип - - - - Solid Color - Сплошная заливка - - - - SMPTE Bars - Таблица SMPTE - - - - Checkerboard - Шахматная доска - - - - Opacity - Непрозрачность - - - - Color - Цвет - - - - Checkerboard Size - Размер клеток - - - - SourcesCommon - - - Import... - Импортировать… - - - - New - Создать - - - - View - Вид - - - - Tree View - В виде таблицы - - - - Icon View - В виде миниатюр - - - - Show Toolbar - Показывать панель - - - - Show Sequences - Показывать последовательности - - - - Replace/Relink Media - Заменить/пересвязать файлы - - - - Reveal in Explorer - Открыть в Проводнике - - - - Reveal in Finder - Открыть в Finder - - - - Reveal in File Manager - Открыть в файловом менеджере - - - - Replace Clips Using This Media - Заменить клипы с этими файлами - - - - Create Sequence With This Media - Создать последовательность с этими файлами - - - - Duplicate - Создать копию - - - - Delete All Clips Using This Media - Удалить все клипы с этим файлом - - - - Proxy - Прокси - - - - Generating proxy: %1% complete - Создание прокси: завершено на %1% - - - - Create/Modify Proxy - Создать/Изменить прокси - - - - Create Proxy - Создать прокси - - - - Modify Proxy - Изменить прокси - - - - Restore Original - Восстановить оригинал - - - - Delete - Удалить - - - - Preview in Media Viewer + + %1: Audio - %2 Channels, %3Hz - - Properties... - Свойства… + + %1: Unknown + - - Replace Media - Заменить файлы + + %1: Image - %2x%3 + - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Вы бросили файл в '%1'. Заменить на брошенное? - - - - Delete proxy - Удалить прокси - - - - Would you like to delete the proxy file "%1" as well? - Заодно удалить прокси-файл "%1"? + + %1: Video - %2x%3 + - SpeedDialog + TimelineViewBlockItem - - Speed/Duration - Скорость/длительность + + %1 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Speed: - Скорость: + + Bars + Испытательная таблица - + + Solid + + + + + Title + Титры + + + + Tone + Звуковой сигнал + + + + Unknown + + + + + VideoParams + + + 8-bit + + + + + 16-bit Integer + + + + + Half-Float (16-bit) + + + + + Full-Float (32-bit) + + + + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + + + + + main + + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + qm-file + + + + + Project to open on startup + + + + + olive::AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive — нелинейный видеоредактор. Эта программа является свободной и защищена GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Исходный код Olive доступен для скачивания на сайте программы. + + + + olive::ActionSearch + + + Search for action... + Найти действие… + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Звук + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + + Length + Длительность + + + + Media In + + + + + Enabled + + + + + Speed + + + + + olive::BlurFilterNode + + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + + + + + olive::ClipBlock + + + Clip + + + + + A time-based node that represents a media source. + + + + + Buffer + + + + + olive::ColorDialog + + + Select Color + + + + + olive::ColorSpaceChooser + + + Color Management + + + + + Input: + + + + + Color Space: + + + + + Display: + + + + + View: + + + + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + Новая папка + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + Сохранить проект + + + + + Error + Ошибка + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + Открыть проект + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Линейный + + + + Bezier + Безье + + + + Hold + Константа + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Дополнительно + + + + Pixel + + + + + Pixel Format: + Формат пикселей: + + + + Performance + + + + + Threads: + Потоков: + + + + olive::ExportAudioTab + + + Codec: + Кодек: + + + + Sample Rate: + Частота дискретизации: + + + + Channel Layout: + + + + + Format: + Формат: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + Имя файла: + + + + Browse for exported file filename + + + + + Preset: + Предстановка: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Диапазон: + + + + Entire Sequence + Вся последовательность + + + + In to Out + От входа от выхода + + + + Format: + Формат: + + + + Export Video + + + + + Export Audio + + + + + Video + Видео + + + + Audio + Звук + + + + + Export + Экспортировать + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Ширина: + + + + Height: + Высота: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + + Fit + Уместить + + + + Stretch + + + + + Crop + + + + Frame Rate: - Частота кадров: + Частота кадров: - - Duration: - Длительность: + + Pixel Aspect Ratio: + Соотношение сторон пикселя: - - Reverse - Реверс + + Interlacing: + Чересстрочность: - - Maintain Audio Pitch - Сохранять высоту тона + + Quality: + - - Ripple Changes - Изменять со сдвигом + + Codec + + + + + Codec: + Кодек: + + + + Advanced + Дополнительно - TextEditDialog + olive::FloatSlider - - Edit Text - Изменить текст - - - - Thin + + %1 dB - - Extra Light + + %1% + + + + + olive::FootagePropertiesDialog + + + "%1" Properties + Свойства "%1" + + + + Name: + Название: + + + + Tracks: + Дорожек: + + + + olive::FootageRelinkDialog + + + Footage - - Light + + Filename - - Normal - Обычный - - - - Medium + + Actions - - Demi Bold + + Browse + Просмотр + + + + Relink Footage - + + Relink "%1" + + + + + All Files + Все файлы + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Конечный размер файла (Мб): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Нет (прогрессивно) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Линейный + + + + Hold + Константа + + + + Bezier + Безье + + + + olive::KeyframeViewBase + + + Linear + Линейный + + + + Bezier + Безье + + + + Hold + Константа + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + Со&хранить проект + + + + Save Project &As + Сохранить проект &как + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + &Файл + + + + &New + &Создать + + + + &Open Project + &Открыть проект + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &Импортировать… + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + В&ыход + + + + &Edit + + + + + Insert + + + + + Overwrite + + + + + Select &All + Выд&елить всё + + + + Deselect All + Снять выделение + + + + Ripple to In Point + Сдвиг до точки входа + + + + Ripple to Out Point + Сдвиг до точки выхода + + + + Edit to In Point + Правка до точки входа + + + + Edit to Out Point + Правка до точки выхода + + + + Delete In/Out Point + Удалить точку входа/выхода + + + + Ripple Delete In/Out Point + Удалить со сдвигом точку входа/выхода + + + + Set/Edit Marker + Установить/Изменить маркер + + + + &View + &Вид + + + + Zoom In + Приблизить + + + + Zoom Out + Отдалить + + + + Increase Track Height + Увеличить высоту дорожки + + + + Decrease Track Height + Уменьшить высоту дорожки + + + + Toggle Show All + Показывать весь проект + + + + Full Screen + Полноэкранный режим + + + + Full Screen Viewer + Просмотр в полноэкранном режиме + + + + &Playback + Вос&произведение + + + + Go to Start + К началу + + + + Previous Frame + К предыдущему кадру + + + + Play/Pause + Воспроизведение/Пауза + + + + Play In to Out + Проиграть от входа до выхода + + + + Next Frame + К следующему кадру + + + + Go to End + В конец + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + К точке входа + + + + Go to Out Point + К точке выхода + + + + Shuttle Left + Уменьшить скорость + + + + Shuttle Stop + Пауза + + + + Shuttle Right + Увеличить скорость + + + + Loop + Петля + + + + &Sequence + П&оследовательность + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + Развернуть панель + + + + Lock Panels + Закрепить панели + + + + Reset to Default Layout + Вернуть исходный вид панелей + + + + &Tools + &Инструменты + + + + Pointer Tool + Указатель + + + + Edit Tool + Выделение + + + + Ripple Tool + Монтаж со сдвигом + + + + Rolling Tool + + + + + Razor Tool + Подрезка + + + + Slip Tool + Прокрутка с совмещением + + + + Slide Tool + Прокрутка + + + + Hand Tool + Навигация + + + + Zoom Tool + + + + + Transition Tool + Переход + + + + Enable Snapping + Включить прилипание + + + + Preferences + Параметры + + + + &Help + &Справка + + + + A&ction Search + &Найти команду + + + + Send &Feedback... + + + + + &About... + &О программе… + + + + olive::MainStatusBar + + + Welcome to %1 %2 + Приветствуем в %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + Вид + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + Добавить + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + Позиция + + + + Rotation + Вращение + + + + Scale + Масштаб + + + + Uniform Scale + Сохранять пропорции + + + + Anchor Point + Точка привязки + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + &Проект + + + + &Sequence + П&оследовательность + + + + &Folder + П&апка + + + + Cu&t + В&ырезать + + + + Cop&y + С&копировать + + + + &Paste + &Вставить + + + + Paste Insert + + + + + Duplicate + + + + + Delete + Удалить + + + + Ripple Delete + Удалить со сдвигом + + + + Split + Разделить + + + + Set In Point + Установить точку входа + + + + Set Out Point + Установить точку выхода + + + + Reset In Point + Сбросить точку входа + + + + Reset Out Point + Сбросить точку выхода + + + + Clear In/Out Point + Очистить точку входа/выхода + + + + Add Default Transition + Добавить переход по умолчанию + + + + Link/Unlink + Связать/Убрать связь + + + + Enable/Disable + Включить/Отключить + + + + Nest + Вложить + + + + Frames + Кадры + + + + Drop Frame + С пропуском кадров + + + + Non-Drop Frame + Без пропуска кадров + + + + Milliseconds + Миллисекунды + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + Общие + + + + Math + + + + + Color + Цвет + + + + Filter + + + + + Timeline + Монтажный стол + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + Цвет + + + + Matrix + + + + + Text + Текст + + + + Font + Шрифт + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Тип + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + + (unknown) + (неизвестно) + + + + olive::NodeTreeView + + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + Добавить + + + + olive::PanNode + + + + Pan + Панорама + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (нет) + + + + (multiple) + (больше одного) + + + + olive::PathWidget + + + Browse + Просмотр + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + Цвет + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + Цвет + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + Тема + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + Устройство выхода: + + + + Input Device: + Устройство входа: + + + + Sample Rate: + Частота дискретизации: + + + + Audio Recording: + Запись звука: + + + + Mono + Моно + + + + Stereo + Стерео + + + + Refresh Devices + + + + + Please wait... + + + + + Default + По умолчанию + + + + olive::PreferencesBehaviorTab + + + Behavior + Поведение + + + + General + Общие + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Звук + + + + Enable audio scrubbing + + + + + Timeline + Монтажный стол + + + + Auto-Seek to Imported Clips + + + + + Edit Tool Also Seeks + Выделение с перемоткой + + + + Edit Tool Selects Links + Выделение выбирает связи + + + + Enable Drag Files to Timeline + Разрешить перетаскивание на монтажный стол извне + + + + Invert Timeline Scroll Axes + + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + Перемотка с выделением + + + + Seek to the End of Pastes + Перемотка до конца вставок + + + + Selecting Also Seeks + Выделение с перемоткой + + + + Playback + Воспроизведение + + + + Ask For Name When Setting Marker + Спрашивать имя маркера при добавлении + + + + Automatically rewind at the end of a sequence + + + + + Project + Проект + + + + Drop Files on Media to Replace + + + + + Nodes + + + + + Add Default Effects to New Clips + Добавлять эффекты по умолчанию в новые клипы + + + + Auto-Scale By Default + Автоматически масштабировать по умолчанию + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + Параметры + + + + General + Общие + + + + Appearance + Внешний вид + + + + Behavior + Поведение + + + + Disk + + + + + Audio + Звук + + + + Keyboard + Клавиатурные комбинации + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + Язык: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + Искать действие или комбинацию клавиш + + + + Action + Действие + + + + Shortcut + Комбинация + + + + Import + Импортировать + + + + Export + Экспортировать + + + + Reset Selected + Сбросить выбранное + + + + Reset All + Сбросить все + + + + Confirm Reset All Shortcuts + Подтвердите действие + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Вы действительно хотите сбросить все клавиатурные комбинации к исходным значениям? + + + + Import Keyboard Shortcuts + Импортировать клавиатурные комбинации + + + + + Error saving shortcuts + Ошибка при сохранении клавиатурных комбинаций + + + + Failed to open file for reading + Не удалось открыть файл для чтения + + + + Export Keyboard Shortcuts + Экспортировать клавиатурные комбинации + + + + Export Shortcuts + Экспортировать клавиатурные комбинации + + + + Shortcuts exported successfully + Комбинации успешно экспортированы + + + + Failed to open file for writing + Не удалось открыть файл для записи + + + + olive::ProgressDialog + + + Cancel + Отмена + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &Создать + + + + &Import... + &Импортировать… + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + Открыть в Проводнике + + + + Reveal in Finder + Открыть в Finder + + + + Reveal in File Manager + Открыть в файловом менеджере + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + Проект + + + + (none) + (нет) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + Просмотр + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + Открыть проект + + + + Save Project + Сохранить проект + + + + Undo + Отменить + + + + Redo + Вернуть + + + + Search media, markers, etc. + Искать файлы, маркеры и т.д. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + Название + + + + Duration + Длительность + + + + Rate + Частота + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + Bold - - Extra Bold + + I - - Black + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align - TextEditEx + olive::SaveOTIOTask - - Edit Text - Изменить текст - - - - &Edit Text - &Изменить текст - - - - TextEffect - - - Text - Текст - - - - Font - Шрифт - - - - Size - Кегль - - - - Color - Цвет - - - - Alignment - Выравнивание - - - - Left - Слева - - - - - Center - По центру - - - - Right - Справа - - - - Justify - По ширине - - - - Top - Сверху - - - - Bottom - Снизу - - - - Word Wrap - Перенос строки - - - - Padding - Отступ - - - - Position - Позиция - - - - Outline - Обводка - - - - Outline Color - Цвет обводки - - - - Outline Width - Толщина обводки - - - - Shadow - Тень - - - - Shadow Color - Цвет тени - - - - Shadow Angle - Угол тени - - - - Shadow Distance - Длина тени - - - - Shadow Softness - Мягкость тени - - - - Shadow Opacity - Непрозрачность тени - - - - Sample Text - Образец текста - - - - TimecodeEffect - - - Timecode - Тайм-код - - - - Sequence - Последовательность - - - - Media - Файл - - - - Scale - Масштаб - - - - Color - Цвет - - - - Background Color - Цвет фона - - - - Background Opacity - Непрозрачность фона - - - - Offset - Смещение - - - - Prepend - Префикс - - - - Timeline - - - Timeline: - Монтажный стол: - - - - Effect already exists - Эффект уже добавлен - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - Клип '%1' уже содержит эффект '%2'. Хотите заменить его на вставляемый эффект или добавить вставляемый эффект как отдельный? - - - - Add - Добавить - - - - Replace - Заменить - - - - Skip - Пропустить - - - - Do this for all conflicts found - Применить для всех конфликтов - - - - Nested Sequence - Вложенная последовательность - - - - Title... - Титры… - - - - Solid Color... - Цветная заливка… - - - - Bars... - Испытательная таблица… - - - - Tone... - Звуковой сигнал… - - - - Noise... - Шум… - - - - Unsaved Project - Несохранённый проект - - - - You must save this project before you can record audio in it. - Перед записью звука необходимо сохранить проект. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Щелкните на монтажном столе в точке, от которой хотите начать запись звука. Перетащите курсор после щелчка, чтобы сразу задать длительность записи. - - - - Pointer Tool - Указатель - - - - Edit Tool - Выделение - - - - Ripple Tool - Монтаж со сдвигом - - - - Razor Tool - Подрезка - - - - Slip Tool - Прокрутка с совмещением - - - - Slide Tool - Прокрутка - - - - Hand Tool - Навигация - - - - Transition Tool - Переход - - - - Snapping - Прилипание - - - - Zoom In - Приблизить - - - - Zoom Out - Отдалить - - - - Record audio - Записать звук - - - - Add title, solid, bars, etc. - Добавить титры, заливку цветом, испытательную таблицу и т.д. - - - - (none) - (нет) - - - - TimelineHeader - - - Center Timecodes - Центрировать тайм-код - - - - TimelineWidget - - - &Undo - &Отменить - - - - &Redo - В&ернуть - - - - Sequence Settings - Параметры последовательности - - - - &Speed/Duration - С&корость/Длительность - - - - &Reveal in Project - &Показать в проекте - - - - Properties - Свойства - - - - %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Начало: %2 -Конец: %3 -Длительность: %4 - - - - R&ipple Delete Empty Space - &Удалить со сдвигом пустое пространство - - - - Auto-Cut Silence - Вырезать тишину - - - - Auto-S&cale - Авто&масштабирование - - - - Error - Ошибка - - - - Couldn't locate media wrapper for sequence. + + Exporting project to OpenTimelineIO - - Title - Титры - - - - Solid Color - Цветная заливка - - - - Bars - Испытательная таблица - - - - Tone - Звуковой сигнал - - - - Noise - Шум - - - - Duration: - Длительность: - - - - ToneEffect - - - Type - Тип - - - - Sine - Синусоида - - - - Frequency - Частота - - - - Amount - Количество - - - - Mix - Смешать - - - - TransformEffect - - - Position - Позиция - - - - Scale - Масштаб - - - - Uniform Scale - Сохранять пропорции - - - - Rotation - Вращение - - - - Anchor Point - Точка привязки - - - - Opacity - Непрозрачность - - - - Blend Mode - Режим смешивания - - - - Normal - Обычный - - - - Transition - - - Length - Длительность - - - - UpdateNotification - - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - На сайте Olive доступно обновление программы. Зайдите на www.olivevideoeditor.org, чтобы скачать его. - - - - VSTHost - - - - Error loading VST plugin - Ошибка при загрузке плагина VST - - - - Failed to load VST plugin "%1": %2 + + Project contains no sequences to export. - - Failed to locate entry point for dynamic library. + + Failed to serialize sequence "%1" - - - VST Error - Ошибка VST - - - - Plugin's magic number is invalid - - - - - Plugin - Плагин - - - - Interface - Интерфейс - - - - Show - Показать - - - - VST Plugin - Плагин VST - - Viewer + olive::ScopePanel - + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + Название: + + + + New Sequence + Новая последовательность + + + + Editing "%1" + Правка "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Видео + + + + Width: + Ширина: + + + + Height: + Высота: + + + + Frame Rate: + Частота кадров: + + + + Pixel Aspect Ratio: + Соотношение сторон пикселя: + + + + Interlacing: + Чересстрочность: + + + + Audio + Звук + + + + Sample Rate: + Частота дискретизации: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + Sequence Viewer - Просмотр последовательностей + Просмотр последовательностей + + + + olive::SliderBase + + + Invalid Value + - - Media Viewer - Просмотр проекта + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + - + + Generate a solid color. + + + + + Color + Цвет + + + + olive::StringSlider + + (none) - (нет) - - - - Drag video only - Перетаскивать только видео - - - - Drag audio only - Перетаскивать только звук + (нет) - ViewerWidget + olive::StrokeFilterNode - - Save Frame as Image... - Сохранить кадр как изображение… + + Stroke + - - Show Fullscreen - Полноэкранный режим + + Creates a stroke outline around an image. + - - Disable - Отключить + + Input + - - Screen %1: %2x%3 - Экран %1: %2×%3 + + Color + Цвет - + + Radius + + + + + Opacity + Непрозрачность + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + Образец текста + + + + + Text + Текст + + + + Generate rich text. + + + + + Font + Шрифт + + + + Font Size + + + + + Color + Цвет + + + + Vertical Align + + + + + Top + Сверху + + + + Center + По центру + + + + Bottom + Снизу + + + + olive::TimeBasedPanel + + + (none) + (нет) + + + + olive::TimeBasedWidget + + + Set Marker + Установить маркер + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + Монтажный стол + + + + olive::TimelineWidget + + + + Properties + Свойства + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + Указатель + + + + Edit Tool + Выделение + + + + Ripple Tool + Монтаж со сдвигом + + + + Rolling Tool + + + + + Razor Tool + Подрезка + + + + Slip Tool + Прокрутка с совмещением + + + + Slide Tool + Прокрутка + + + + Hand Tool + Навигация + + + + Zoom Tool + + + + + Transition Tool + Переход + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Линейный + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + Синусоида + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + Видео + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + Чересстрочность: + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + Частота кадров: + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + Ошибка + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + Zoom - Масштаб + Масштаб - + Fit - Уместить + Уместить - - Custom - Другой + + %1% + - - Close Media - Закрыть файл + + Full Screen + Полноэкранный режим - - Save Frame - Сохранить кадр + + Screen %1: %2x%3 + Экран %1: %2×%3 - - Viewer Zoom - Масштаб просмотра + + Deinterlace + - - Set Custom Zoom Value: - Другое значение масштаба: + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + Выкл. + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + - ViewerWindow + olive::VolumeNode - - Exit Fullscreen - Выйти из полноэкранного режима - - - - VoidEffect - - - (unknown) - (неизвестно) - - - - Missing Effect - Отсутствующий эффект - - - - VolumeEffect - - + + Volume - Громкость - - - - transition - - - Invalid transition - Некорректный переход + Громкость - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + Adjusts the volume of an audio source. + + + + + Samples diff --git a/app/ts/sr_SR.ts b/app/ts/sr_SR.ts index b2d7e0dbf..822dc1152 100644 --- a/app/ts/sr_SR.ts +++ b/app/ts/sr_SR.ts @@ -2,3701 +2,4765 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive је нелинеарни видео уређивач. Овај софтвер је слободан и заштићен GNU GPL-ом. - - - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Olive тим је под обавезом да обавести своје кориснике да је Olive-ов изворни код доступан за преузимање са његове веб странице. - - - - ActionSearch - - - Search for action... - Потражите радњу... - - - - AdvancedVideoDialog - - - Advanced Video Settings - Напредне видео поставке - - - - Pixel Format: - Формат пиксела: - - - - Threads: - - - - - Audio - - Audio - Аудио - - - Recording - Снимање - - - - %1 Audio - %1 Аудио - - - - Recording %1 - Снимање %1 - - - - AudioNoiseEffect - - - Amount - Количина - - - - Mix - Микс - - - - AutoCutSilenceDialog - - - Cut Silence + + %1 Hz - - Attack Threshold: - - - - - Attack Time: - - - - - Release Threshold: - - - - - Release Time: - - - - - Cacher - - - - Could not open %1 - %2 - - - - - ChannelLayoutName - - - Invalid - Неважеће - - - + Mono - Моно + Моно - + Stereo - Стерео + Стерео - - - ClipPropertiesDialog - - "%1" Properties + + 2.1 - - Multiple Clip Properties + + 5.1 - - Name: + + 7.1 - - Duration: - - - - - (multiple) + + Unknown (0x%1) - CollapsibleWidget + Config - - <untitled> - <неименовано> - - - - ColorButton - - - Set Color - Постави боју - - - - CornerPinEffect - - - Top Left - Горње лево - - - - Top Right - Горње десно - - - - Bottom Left - Доње лево - - - - Bottom Right - Доње десно - - - - Perspective - Перспектива - - - - DebugDialog - - - Debug Log - Запис за дебугирање - - - - DemoNotice - - - - Welcome to Olive! - Добродошли у Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive је слободан видео уређивач са отвореним изворним кодом издан под GNU GPL-ом. Ако сте платили за овај софтвер, ви сте били преварени. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Овај софтвер је тренутно у АЛФА стању, што значи да је нестабилан и веома је вероватно да ће се срушити, имати грешака и да не достаје неких могућности. Ми не даје никакву гаранцију, тако да користите на свој сопствени ризик. Молимо да пријавите све грешке и жељене функције на %1 - - - - Thank you for trying Olive and we hope you enjoy it! - Хвала што испробавате Olive и надамо се да ћете уживати у њему! - - - - Effect - - - Invalid effect - Неважећи ефекат - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - Нема кандидата за ефекат '%1'. Могуће је да је овај ефекат коруптиран. Покушајте поновно инсталирати њега или Olive. - - - Cu&t - &Режи - - - &Copy - &Копирај - - - Move &Up - Помери &горе - - - Move &Down - Помери &доле - - - D&elete - &Обриши - - - Load Settings From File - Учитај поставке из датотеке - - - Save Settings to File - Спаси поставке у датотеку - - - - Save Effect Settings - Спаси пиставке ефекта - - - - - Effect XML Settings %1 - XML поставке ефекта %1 - - - - Save Settings Failed - Спашавање поставки неуспешно - - - - Failed to open "%1" for writing. - Неуспешно отварање "%1" за уређивање. - - - - Load Effect Settings - Учитај поставке ефекта - - - - - Load Settings Failed - Учитавање поставки неуспешно - - - - Failed to open "%1" for reading. - Неуспешно отварање "%1" за читање. - - - - This settings file doesn't match this effect. - Ова датотека поставки није прикладна за овај ефекат. - - - - EffectControls - - - Effects: - Ефекти: - - - &Paste - &Залепи - - - - (none) - (нема) - - - - Add Video Effect - Додај видео ефекат - - - - VIDEO EFFECTS - Видео ефекти - - - - Add Video Transition - Додај видео прелаз - - - - Add Audio Effect - Додај аудио ефекат - - - - AUDIO EFFECTS - Аудио ефекти - - - - Add Audio Transition - Додај аудио прелаз - - - (Multiple clips selected) - (Више снимки је одабрано) - - - - EffectRow - - - Disable Keyframes - Онемогући кључне кадрове - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Онемогућавање кључних кадрова ће обрисати све тренутне кључне кадрове. Да ли сте сигурни да желите ово урадити? - - - - EffectUI - - - %1 (Opening) + + Error loading settings - - %1 (Closing) - - - - - %1 (multiple) - - - - - Cu&t - &Режи - - - - &Copy - &Копирај - - - - Move &Up - Помери &горе - - - - Move &Down - Помери &доле - - - - D&elete - &Обриши - - - - Load Settings From File - Учитај поставке из датотеке - - - - Save Settings to File - Спаси поставке у датотеку - - - - EmbeddedFileChooser - - - File: - Датотека: - - - - ExportDialog - - - Export "%1" - Извоз "%1" - - - - Unknown codec name %1 - Непознато име кодека %1 - - - - Export Failed - Извоз неуспешан - - - - Export failed - %1 - Извоз неуспешан - %1 - - - - Invalid dimensions - Неважеће димензије - - - - Export width and height must both be even numbers/divisible by 2. - Висина и ширина извоза обе морају бити парни бројеви/дељиве са два. - - - - Invalid codec - Неважећи кодек - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Параметри одабраног кодека се нису могли одредити. Ово је грешка, молимо да контактирате девелопере. - - - - Invalid format - Неважећи формат - - - - Couldn't determine output format. This is a bug, please contact the developers. - Излазни формат се није могао одредити. Ово је грешка, молимо да контактирате девелопере. - - - - Export Media - Извоз медија - - - - %p% (Total: %1:%2:%3) - - - - - %p% (ETA: %1:%2:%3) - - - - - Quality-based (Constant Rate Factor) - Базирано на квалитети (Фактор сталне стопе/Constant Rate Factor) - - - - Constant Bitrate - Стална стопа битова - - - - - Invalid Codec - Неважећи кодек - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Трагање за пркладним кодером за овај кодек није успело. Извоз највероватније неће успети. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Трагање за прикладним форматом пиксела за овај кодек није успело. Извоз највероватније неће успети. - - - - Bitrate (Mbps): - Стопа битова (Mbps): - - - - Quality (CRF): - Квалитета (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Фактор квалитете: - -0 = беспрекорно -17-18 = оку беспрекорно (компримирано, али неприметљиво) -23 = висока квалитета -51 = најнижа квалитета могућа - - - - Target File Size (MB): - Жељена величина датотеке (MB): - - - - Format: - Формат: - - - - Range: - Распон: - - - - Entire Sequence - Читава секвенца - - - - In to Out - Од почетка до краја - - - - Video - Видео - - - - - Codec: - Кодек: - - - - Width: - Ширина: - - - - Height: - Висина: - - - - Frame Rate: - Оквирна стопа: - - - - Compression Type: - Тип компримације: - - - - Advanced - Напредно - - - - Audio - Аудио - - - - Sampling Rate: - Стопа узорака: - - - - Bitrate (Kbps/CBR): - Стопа битова (Kbps/CBR): - - - - ExportThread - - - failed to send frame to encoder (%1) - Слање оквира кодеру није успело (%1) - - - - failed to receive packet from encoder (%1) - Примање пакета од кодера није успело (%1) - - - - could not video encoder for %1 - Није могао видео кодер за %1 - - - - could not allocate video stream - Видео ток се није могао заузети - - - - could not allocate video encoding context - Контекст видео кодирања се није могао заузети - - - - could not open output video encoder (%1) - Излазни видео кодер се није могао отворити (%1) - - - - could not copy video encoder parameters to output stream (%1) - Параметри видео кодера се нису могли копирати у излазни ток (%1) - - - - could not audio encoder for %1 - Није могао аудио кодер за %1 - - - - could not allocate audio stream - Аудио ток се није могао заузети - - - - could not allocate audio encoding context - Контекст аудио кодирања се није могао заузети - - - - could not open output audio encoder (%1) - Излаз аудио кодера се није могао отворити (%1) - - - - could not copy audio encoder parameters to output stream (%1) - Параметри аудио кодера се нису могли копирати у излазни ток (%1) - - - - could not allocate audio buffer (%1) - Аудио међуспремник се није могао заузети (%1) - - - - could not create output format context - Контекст излазног формата се није могао створити - - - - could not open output file (%1) - Излазна датотека се није могла отворити (%1) - - - - could not write output file header (%1) - Заглавље излазне датотеке се није могло исписати (%1) - - - - could not write output file trailer (%1) - Подножје излазне датотеке се није могло исписати (%1) - - - - FillLeftRightEffect - - - Type - Тип - - - - Fill Left with Right - Попуни лево са десним - - - - Fill Right with Left - Попуни десно са левим - - - - Frei0rEffect - - - Failed to load Frei0r plugin "%1": %2 - Учитавање Frei0r додатка није успело "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - ПАЖЊА: Ви не можете учитавати 32-битне Frei0r додатке у 64-битно издање Olive-a. Молимо нађите 64-битно издање ових додатака, или пређите на 32-битно издање Olive-а. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - ПАЖЊА: Ви не можете учитавати 64-битне Frei0r додатке у 32-битно издање Olive-a. Молимо нађите 32-битно издање ових додатака, или пређите на 64-битно издање Olive-а. - - - - Error loading Frei0r plugin - Грешка при учитавању Frei0r додатака - - - - GraphEditor - - - Graph Editor - Уређивач графикона - - - - Linear - Линеарно - - - - Bezier - Bezier - - - - Hold - Држи - - - - GraphView - - - Zoom to Selection - Повећај ка одабиру - - - - Zoom to Show All - Повећај ка свему - - - - Reset View - Врати првобитни приказ - - - - InterlacingName - - - None (Progressive) - Нема (прогресивно) - - - - Top Field First - Горње поље прво - - - - Bottom Field First - Доње поље прво - - - - Invalid - Неважеће - - - - KeyframeNavigator - - - Enable Keyframes - Омогући кључне кадрове - - - - KeyframeView - - - Linear - Линеарно - - - - Bezier - Bezier - - - - Hold - Држи - - - - LabelSlider - - - &Edit - - - - - &Reset to Default - - - - - - Set Value - Одреди вредност - - - - - New value: - Нова вредност: - - - - LoadDialog - - - Loading... - Учитавање... - - - - Loading '%1'... - Учитавање "%1"... - - - - Cancel - Прекини - - - - LoadThread - - - Version Mismatch - Верзије се не поклапају - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Овај проекат је био спашен у другачијој верзији Olive-а и могуће је да није у потпуности компатибилан са овом берзијом. Да ли још увек желите пробати учитати проекат? - - - - Invalid Clip Link - Неважећа веза снимке - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Овај проекат садржи неважећу везу снимке. Могуће је да је коруптиран. Да ли бисте хтели да га наставите учитавати? - - - - %1 - Line: %2 Col: %3 - %1 - Ред: %2 Колона: %3 - - - - User aborted loading - Корисник је прекинуо учитавање - - - - XML Parsing Error - Грешка у парсирању XML-а - - - - Couldn't load '%1'. %2 - "%1": %2 се није могло учитати - - - - Project Load Error - Грешка при учитавању проекта - - - - Error loading project: %1 - Грешка при учитавању проекта: %1 - - - - MainWindow - - - Welcome to %1 - - - - - &File - - - - - &New - - - - - &Open Project - - - - - Clear Recent List - - - - - Open Recent - - - - - &Save Project - - - - - Save Project &As - - - - - &Import... - - - - - &Export... - - - - - E&xit - - - - - &Edit - - - - - &Undo - - - - - Redo - - - - Cu&t - &Режи - - - &Paste - &Залепи - - - - Select &All - - - - - Deselect All - - - - - Ripple to In Point - - - - - Ripple to Out Point - - - - - Edit to In Point - - - - - Edit to Out Point - - - - - Delete In/Out Point - - - - - Ripple Delete In/Out Point - - - - - Set/Edit Marker - - - - - &View - - - - - Zoom In - - - - - Zoom Out - - - - - Increase Track Height - - - - - Decrease Track Height - - - - - Toggle Show All - - - - - Track Lines - - - - - Rectified Waveforms - - - - - Frames - - - - - Drop Frame - - - - - Non-Drop Frame - - - - - Milliseconds - - - - - Title/Action Safe Area - - - - - Off - - - - - Default - - - - - 4:3 - - - - - 16:9 - - - - - Custom - - - - - Full Screen - - - - - Full Screen Viewer - - - - - &Playback - - - - - Go to Start - - - - - Previous Frame - - - - - Play/Pause - - - - - Play In to Out - - - - - Next Frame - - - - - Go to End - - - - - Go to Previous Cut - - - - - Go to Next Cut - - - - - Go to In Point - - - - - Go to Out Point - - - - - Shuttle Left - - - - - Shuttle Stop - - - - - Shuttle Right - - - - - Loop - - - - - &Window - - - - - Project - - - - - Effect Controls - - - - - Timeline - - - - - Graph Editor - Уређивач графикона - - - - Media Viewer - - - - - Sequence Viewer - - - - - Maximize Panel - - - - - Lock Panels - - - - - Reset to Default Layout - - - - - &Tools - - - - - Pointer Tool - - - - - Edit Tool - - - - - Ripple Tool - - - - - Razor Tool - - - - - Slip Tool - - - - - Slide Tool - - - - - Hand Tool - - - - - Transition Tool - - - - - Enable Snapping - - - - - Auto-Cut Silence - - - - - No Auto-Scroll - - - - - Page Auto-Scroll - - - - - Smooth Auto-Scroll - - - - - Preferences - - - - - Clear Undo - - - - - &Help - - - - - A&ction Search - - - - - Debug Log - Запис за дебугирање - - - - &About... - - - - - <untitled> - <неименовано> - - - - Marker - - - Set Marker +%1 - - Set clip marker name: + + Error saving settings - - Set sequence marker name: + + Failed to save application settings. The application may lack write permissions to this location. - Media + Footage - - New Folder + + %1 FPS - - Name: + + %1 Hz - - Filename: + + Filename: %1 - - Video Dimensions: - - - - - Frame Rate: - Оквирна стопа: - - - - %1 field(s) (%2 frame(s)) - - - - - Interlacing: - - - - - Audio Frequency: - - - - - Audio Channels: - - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - - - - - Name - - - - - Duration - - - - - Rate + + This footage is not valid for use - MediaPropertiesDialog + ImportTool - - "%1" Properties + + Don't ask me again - - Tracks: + + No Active Sequence - - Video %1: %2x%3 %4FPS + + No sequence is currently open. Would you like to create one? - - Audio %1: %2Hz %3 - - - - - %n channel(s) - - - - - - - - - Conform to Frame Rate: + + Automatically Detect Parameters From Footage - - Alpha is Premultiplied - - - - - Auto (%1) - - - - - Interlacing: - - - - - Name: + + Set Parameters Manually - MenuHelper + MoveItemCommand - - &Project - - - - - &Sequence - - - - - &Folder - - - - - Set In Point - - - - - Set Out Point - - - - - Reset In Point - - - - - Reset Out Point - - - - - Clear In/Out Point - - - - - Add Default Transition - - - - - Link/Unlink - - - - - Enable/Disable - - - - - Nest - - - - - Cu&t - &Режи - - - - Cop&y - - - - - - &Paste - &Залепи - - - - Paste Insert - - - - - Duplicate - - - - - Delete - - - - - Ripple Delete - - - - - Split - - - - - Invalid aspect ratio - - - - - The aspect ratio '%1' is invalid. Please try again. - - - - - Enter custom aspect ratio - - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + Move Item - NewSequenceDialog + NodeCopyPasteWidget - - Editing "%1" + + Error pasting nodes - - New Sequence - - - - - Preset: - - - - - Film 4K - - - - - TV 4K (Ultra HD/2160p) - - - - - 1080p - - - - - 720p - - - - - 480p - - - - - 360p - - - - - 240p - - - - - 144p - - - - - NTSC (480i) - - - - - PAL (576i) - - - - - Custom - - - - - Video - Видео - - - - Width: - Ширина: - - - - Height: - Висина: - - - - Frame Rate: - Оквирна стопа: - - - - Pixel Aspect Ratio: - - - - - Square Pixels (1.0) - - - - - Interlacing: - - - - - None (Progressive) - Нема (прогресивно) - - - - Audio - Аудио - - - - Sample Rate: - - - - - Name: + + Failed to paste nodes: %1 - OliveGlobal + NodeFactory - - Olive Project %1 - - - - - Auto-recovery - - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - - - - - Open Project... - - - - - Missing recent project - - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - - - - - Save Project As... - - - - - Unsaved Project - - - - - This project has changed since it was last saved. Would you like to save it before closing? - - - - - No active sequence - - - - - Please open the sequence to perform this action. - - - - - No clips selected - - - - - Select the clips you wish to auto-cut - - - - - Missing Project File - - - - - Specified project '%1' does not exist. + + None - PanEffect + NodeViewItem - - Pan + + %1... - PreferencesDialog + PresetManager - - Preferences + + Save Preset - - Default Sequence + + Set preset name: - - Invalid CSS File + + Invalid preset name - - CSS file '%1' does not exist. + + You must enter a preset name - - Confirm Reset All Shortcuts + + Preset exists - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - - - - - Import Keyboard Shortcuts - - - - - - Error saving shortcuts - - - - - Failed to open file for reading - - - - - Export Keyboard Shortcuts - - - - - Export Shortcuts - - - - - Shortcuts exported successfully - - - - - Failed to open file for writing - - - - - Browse for CSS file - - - - - Delete All Previews - - - - - Are you sure you want to delete all previews? - - - - - Previews Deleted - - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - - - - - Language: - - - - - Default Sequence Settings - - - - - Add Default Effects to New Clips - - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - - - - - Selecting Also Seeks - - - - - Edit Tool Also Seeks - - - - - Edit Tool Selects Links - - - - - Seek Also Selects - - - - - Seek to the End of Pastes - - - - - Scroll Wheel Zooms - - - - - Hold CTRL to toggle this setting - - - - - Invert Timeline Scroll Axes - - - - - Enable Drag Files to Timeline - - - - - Auto-Scale By Default - - - - - Auto-Seek to Imported Clips - - - - - Audio Scrubbing - - - - - Drop Files on Media to Replace - - - - - Enable Hover Focus - - - - - Ask For Name When Setting Marker - - - - - Appearance - - - - - Theme - - - - - Olive Dark (Default) - - - - - Olive Light - - - - - Native - - - - - Native (Light Icons) - - - - - Use Native Menu Styling - - - - - Custom CSS: - - - - - Browse - - - - - Image sequence formats: - - - - - Audio Recording: - - - - - Mono - Моно - - - - Stereo - Стерео - - - - Effect Textbox Lines: - - - - - Thumbnail Resolution: - - - - - Waveform Resolution: - - - - - Delete Previews - - - - - Use Software Fallbacks When Possible - - - - - General - - - - - Behavior - - - - - Memory Usage - - - - - Upcoming Frame Queue: - - - - - - frames - - - - - - seconds - - - - - Previous Frame Queue: - - - - - Playback - - - - - Output Device: - - - - - - Default - - - - - Input Device: - - - - - Sample Rate: - - - - - Audio - Аудио - - - - Search for action or shortcut - - - - - Action - - - - - Shortcut - - - - - Import - - - - - Export - - - - - Reset Selected - - - - - Reset All - - - - - Keyboard + + A preset with this name already exists. Would you like to replace it? - PreviewGenerator + RatioDialog - - Failed to find any valid video/audio streams + + Enter custom ratio (e.g. "4:3", "16/9", etc.): - - Could not open file - %1 + + Invalid custom ratio - - Could not find stream information - %1 + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. - Project + RenameItemCommand - - New - - - - - Open Project - - - - - Save Project - - - - - Undo - - - - - Redo - - - - - Tree View - - - - - Icon View - - - - - List View - - - - - Search media, markers, etc. - - - - - Project - - - - - Sequence - - - - - Replace '%1' - - - - - - All Files - - - - - - No active sequence - - - - - No sequence is active, please open the sequence you want to replace clips from. - - - - - Active sequence selected - - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - - - - - Rename '%1' - - - - - Enter new name: - - - - - Delete media in use? - - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - - - - - Skip - - - - - Import a Project - - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - - - - - Image sequence detected - - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - - - - - Import media... - - - - - No sequence is active, please open the sequence you want to delete clips from. - - - - - ProxyDialog - - - Create Proxy - - - - - Proxy - - - - - Dimensions: - - - - - Same Size as Source - - - - - Half Resolution (1/2) - - - - - Quarter Resolution (1/4) - - - - - Eighth Resolution (1/8) - - - - - Sixteenth Resolution (1/16) - - - - - Format: - Формат: - - - - ProRes HQ - - - - - Location: - - - - - Same as Source (in "%1" folder) - - - - - Proxy file exists - - - - - The file "%1" already exists. Do you wish to replace it? - - - - - Custom Location - - - - - ProxyGenerator - - - Finished generating proxy for "%1" - - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - - - - - Select which media you want to replace this media's clips with: - - - - - Keep the same media in-points - - - - - Replace - - - - - Cancel - Прекини - - - - No media selected - - - - - Please select a media to replace with or click 'Cancel'. - - - - - Same media selected - - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - - - - - Folder selected - - - - - You cannot replace footage with a folder. - - - - - Active sequence selected - - - - - You cannot insert a sequence into itself. - - - - - RichTextEffect - - - Text - - - - - Padding - - - - - Position - - - - - Vertical Align: - - - - - Top - - - - - Center - - - - - Bottom - - - - - Auto-Scroll - - - - - Off - - - - - Up - - - - - Down - - - - - Left - - - - - Right - - - - - Shadow - - - - - Shadow Color - - - - - Shadow Angle - - - - - Shadow Distance - - - - - Shadow Softness - - - - - Shadow Opacity + + Rename Item Sequence - - %1 (copy) + + %1 FPS - ShakeEffect + Stream - - Intensity + + %1: Audio - %2 Channels, %3Hz - - Rotation + + %1: Unknown - - Frequency + + %1: Image - %2x%3 + + + + + %1: Video - %2x%3 - SolidEffect + TimelineViewBlockItem - - Type - Тип - - - - Solid Color - - - - - SMPTE Bars - - - - - Checkerboard - - - - - Opacity - - - - - Color - - - - - Checkerboard Size - - - - - SourcesCommon - - - Import... - - - - - New - - - - - View - - - - - Tree View - - - - - Icon View - - - - - Show Toolbar - - - - - Show Sequences - - - - - Replace/Relink Media - - - - - Reveal in Explorer - - - - - Reveal in Finder - - - - - Reveal in File Manager - - - - - Replace Clips Using This Media - - - - - Create Sequence With This Media - - - - - Duplicate - - - - - Delete All Clips Using This Media - - - - - Proxy - - - - - Generating proxy: %1% complete - - - - - Create/Modify Proxy - - - - - Create Proxy - - - - - Modify Proxy - - - - - Restore Original - - - - - Delete - - - - - Preview in Media Viewer - - - - - Properties... - - - - - Replace Media - - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - - - - - Delete proxy - - - - - Would you like to delete the proxy file "%1" as well? - - - - - SpeedDialog - - - Speed/Duration - - - - - Speed: - - - - - Frame Rate: - Оквирна стопа: - - - - Duration: - - - - - Reverse - - - - - Maintain Audio Pitch - - - - - Ripple Changes - - - - - TextEditDialog - - - Edit Text - - - - - Thin - - - - - Extra Light - - - - - Light - - - - - Normal - - - - - Medium - - - - - Demi Bold - - - - - Bold - - - - - Extra Bold - - - - - Black - - - - - TextEditEx - - - Edit Text - - - - - &Edit Text - - - - - TextEffect - - - Text - - - - - Font - - - - - Size - - - - - Color - - - - - Alignment - - - - - Left - - - - - - Center - - - - - Right - - - - - Justify - - - - - Top - - - - - Bottom - - - - - Word Wrap - - - - - Padding - - - - - Position - - - - - Outline - - - - - Outline Color - - - - - Outline Width - - - - - Shadow - - - - - Shadow Color - - - - - Shadow Angle - - - - - Shadow Distance - - - - - Shadow Softness - - - - - Shadow Opacity - - - - - Sample Text - - - - - TimecodeEffect - - - Timecode - - - - - Sequence - - - - - Media - - - - - Scale - - - - - Color - - - - - Background Color - - - - - Background Opacity - - - - - Offset - - - - - Prepend - - - - - Timeline - - - Nested Sequence - - - - - Timeline: - - - - - Effect already exists - - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - - - - - Add - - - - - Replace - - - - - Skip - - - - - Do this for all conflicts found - - - - - Title... - - - - - Solid Color... - - - - - Bars... - - - - - Tone... - - - - - Noise... - - - - - Unsaved Project - - - - - You must save this project before you can record audio in it. - - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - - - - - (none) - (нема) - - - - Pointer Tool - - - - - Edit Tool - - - - - Ripple Tool - - - - - Razor Tool - - - - - Slip Tool - - - - - Slide Tool - - - - - Hand Tool - - - - - Transition Tool - - - - - Snapping - - - - - Zoom In - - - - - Zoom Out - - - - - Record audio - - - - - Add title, solid, bars, etc. - - - - - TimelineHeader - - - Center Timecodes - - - - - TimelineWidget - - - &Undo - - - - - &Redo - - - - &Paste - &Залепи - - - - Sequence Settings - - - - - &Speed/Duration - - - - - &Reveal in Project - - - - + %1 -Start: %2 -End: %3 -Duration: %4 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty - - R&ipple Delete Empty Space - - - - - Auto-Cut Silence - - - - - Auto-S&cale - - - - - Properties - - - - - Error - - - - - Couldn't locate media wrapper for sequence. - - - - - Title - - - - - Solid Color - - - - + Bars - + + Solid + + + + + Title + + + + Tone - - Noise - - - - - Duration: + + Unknown - ToneEffect + VideoParams - - Type - Тип - - - - Sine + + 8-bit - - Frequency + + 16-bit Integer - - Amount - Количина - - - - Mix - Микс - - - - TransformEffect - - - Position + + Half-Float (16-bit) - - Scale + + Full-Float (32-bit) - - Uniform Scale + + Unknown (0x%1) - - Rotation + + %1 FPS - - Anchor Point + + Square Pixels (%1) - - Opacity + + NTSC Standard (%1) - - Blend Mode + + NTSC Widescreen (%1) - - Normal + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) - Transition + main - + + Show this help text + + + + + Show application version + + + + + Start in full-screen mode + + + + + Export only (No GUI) + + + + + Override language with file + + + + + qm-file + + + + + Project to open on startup + + + + + olive::AboutDialog + + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive је нелинеарни видео уређивач. Овај софтвер је слободан и заштићен GNU GPL-ом. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive тим је под обавезом да обавести своје кориснике да је Olive-ов изворни код доступан за преузимање са његове веб странице. + + + + olive::ActionSearch + + + Search for action... + Потражите радњу... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Аудио + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + Length - - - UpdateNotification - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. + + Media In + + + + + Enabled + + + + + Speed - VSTHost + olive::BlurFilterNode - - - Error loading VST plugin + + Blur - - Failed to load VST plugin "%1": %2 + + Blurs an image. - - Failed to locate entry point for dynamic library. + + Input - - VST Error + + Method - - Plugin's magic number is invalid + + Box - - Plugin + + Gaussian - - Interface + + Radius - - Show + + Horizontal - - VST Plugin + + Vertical + + + + + Repeat Edge Pixels - Viewer + olive::ClipBlock - - Sequence Viewer + + Clip - - Media Viewer + + A time-based node that represents a media source. - - (none) - (нема) - - - - Drag video only - - - - - Drag audio only + + Buffer - ViewerWidget + olive::ColorDialog - - Save Frame as Image... + + Select Color + + + + + olive::ColorSpaceChooser + + + Color Management - - Show Fullscreen + + Input: - - Disable + + Color Space: - - Screen %1: %2x%3 + + Display: - - Zoom + + View: - + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + + + + + + Error + + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Линеарно + + + + Bezier + Bezier + + + + Hold + Држи + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Напредно + + + + Pixel + + + + + Pixel Format: + Формат пиксела: + + + + Performance + + + + + Threads: + + + + + olive::ExportAudioTab + + + Codec: + Кодек: + + + + Sample Rate: + + + + + Channel Layout: + + + + + Format: + Формат: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + + + + + Browse for exported file filename + + + + + Preset: + + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Распон: + + + + Entire Sequence + Читава секвенца + + + + In to Out + Од почетка до краја + + + + Format: + Формат: + + + + Export Video + + + + + Export Audio + + + + + Video + Видео + + + + Audio + Аудио + + + + + Export + + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Ширина: + + + + Height: + Висина: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + Fit - - Custom + + Stretch - - Close Media + + Crop - - Save Frame + + Frame Rate: + Оквирна стопа: + + + + Pixel Aspect Ratio: - - Viewer Zoom + + Interlacing: - - Set Custom Zoom Value: + + Quality: + + + + + Codec + + + + + Codec: + Кодек: + + + + Advanced + Напредно + + + + olive::FloatSlider + + + %1 dB + + + + + %1% - ViewerWindow + olive::FootagePropertiesDialog - - Exit Fullscreen + + "%1" Properties + + + + + Name: + + + + + Tracks: - VoidEffect + olive::FootageRelinkDialog - + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Жељена величина датотеке (MB): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Нема (прогресивно) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Линеарно + + + + Hold + Држи + + + + Bezier + Bezier + + + + olive::KeyframeViewBase + + + Linear + Линеарно + + + + Bezier + Bezier + + + + Hold + Држи + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + + + + + Save Project &As + + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + + + + + &Edit + + + + + Insert + + + + + Overwrite + + + + + Select &All + + + + + Deselect All + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Full Screen + + + + + Full Screen Viewer + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + + + Loop + + + + + &Sequence + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + + + + + Lock Panels + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Preferences + + + + + &Help + + + + + A&ction Search + + + + + Send &Feedback... + + + + + &About... + + + + + olive::MainStatusBar + + + Welcome to %1 %2 + + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + + + + + Rotation + + + + + Scale + + + + + Uniform Scale + + + + + Anchor Point + + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Cu&t + &Режи + + + + Cop&y + + + + + &Paste + &Залепи + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Set In Point + + + + + Set Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + + + + + Math + + + + + Color + + + + + Filter + + + + + Timeline + + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + + + + + Matrix + + + + + Text + + + + + Font + + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Тип + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + (unknown) + + + olive::NodeTreeView - - Missing Effect + + Nodes - VolumeEffect + olive::NodeView - + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + + + + + olive::PanNode + + + + Pan + + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (нема) + + + + (multiple) + + + + + olive::PathWidget + + + Browse + + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio Recording: + + + + + Mono + Моно + + + + Stereo + Стерео + + + + Refresh Devices + + + + + Please wait... + + + + + Default + + + + + olive::PreferencesBehaviorTab + + + Behavior + + + + + General + + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Аудио + + + + Enable audio scrubbing + + + + + Timeline + + + + + Auto-Seek to Imported Clips + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Enable Drag Files to Timeline + + + + + Invert Timeline Scroll Axes + + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Selecting Also Seeks + + + + + Playback + + + + + Ask For Name When Setting Marker + + + + + Automatically rewind at the end of a sequence + + + + + Project + + + + + Drop Files on Media to Replace + + + + + Nodes + + + + + Add Default Effects to New Clips + + + + + Auto-Scale By Default + + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + + + + + General + + + + + Appearance + + + + + Behavior + + + + + Disk + + + + + Audio + Аудио + + + + Keyboard + + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + olive::ProgressDialog + + + Cancel + Прекини + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + + + + + &Import... + + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + + + + + (none) + (нема) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + + + + + Save Project + + + + + Undo + + + + + Redo + + + + + Search media, markers, etc. + + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + + + + + Duration + + + + + Rate + + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + + + + + New Sequence + + + + + Editing "%1" + + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Видео + + + + Width: + Ширина: + + + + Height: + Висина: + + + + Frame Rate: + Оквирна стопа: + + + + Pixel Aspect Ratio: + + + + + Interlacing: + + + + + Audio + Аудио + + + + Sample Rate: + + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + + + + + 720p + + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + + + + + olive::StringSlider + + + (none) + (нема) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + + + + + Radius + + + + + Opacity + + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + + + + + + Text + + + + + Generate rich text. + + + + + Font + + + + + Font Size + + + + + Color + + + + + Vertical Align + + + + + Top + + + + + Center + + + + + Bottom + + + + + olive::TimeBasedPanel + + + (none) + (нема) + + + + olive::TimeBasedWidget + + + Set Marker + + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + + + + + olive::TimelineWidget + + + + Properties + + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Линеарно + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + + + + + olive::VideoInput + + + Video Input + + + + + Video + Видео + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + Оквирна стопа: + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + + + + + Fit + + + + + %1% + + + + + Full Screen + + + + + Screen %1: %2x%3 + + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + Volume - - - transition - - Invalid transition + + Adjusts the volume of an audio source. - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + Samples diff --git a/app/ts/tr_TR.ts b/app/ts/tr_TR.ts index 461c962ea..6d2be9f9d 100644 --- a/app/ts/tr_TR.ts +++ b/app/ts/tr_TR.ts @@ -2,3812 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive doğrusal olmayan bir video editörüdür. Bu yazılım GNU GPL tarafından ücretsiz ve korunmaktadır. + + %1 Hz + - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Olive Takımı, kullanıcılara Olive kaynak kodunun web sitesinden indirilmek üzere kullanılabilir olduğunu bildirmek zorundadır. - - - - ActionSearch - - - Search for action... - İşlem Ara... - - - - AdvancedVideoDialog - - - Advanced Video Settings - Gelişmiş Video Ayarları - - - - Pixel Format: - Piksel Biçimi: - - - - Threads: - İş Parçacığı: - - - - Audio - - - %1 Audio - rafine - %1 Ses - - - - Recording %1 - Kayıt %1 - - - - AudioNoiseEffect - - - Amount - Miktar - - - - Mix - Karıştır - - - - AutoCutSilenceDialog - - - Cut Silence - Sessizlik - - - - Attack Threshold: - Hamleyi Eşitle: - - - - Attack Time: - Hamle Tarihi: - - - - Release Threshold: - Sürüm Eşik: - - - - Release Time: - Sürüm Tarihi: - - - - Cacher - - - - Could not open %1 - %2 - Dosya açılamadı %1 - %2 - - - - ChannelLayoutName - - - Invalid - Rafine - Yanlış - - - + Mono - Моno + - + Stereo - Stereo + Stereo + + + + 2.1 + 144p {2.1?} + + + + 5.1 + 144p {5.1?} + + + + 7.1 + 144p {7.1?} + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - Rafine - Ayarlar "%1" + + Error loading settings + - - Multiple Clip Properties - Rafine - Çoklu klip parametreleri - - - - Name: - Ad: - - - - Duration: - Uzunluk: - - - - (multiple) - rafine - (çoklu) - - - - CollapsibleWidget - - - <untitled> - <Adsız> - - - - ColorButton - - - Set Color - Renk Tanımla - - - - CornerPinEffect - - - Top Left - Sol Üst - - - - Top Right - Sağ Üst - - - - Bottom Left - Sol Alt - - - - Bottom Right - Sağ Alt - - - - Perspective - Perspektif - - - - DebugDialog - - - Debug Log - Hata Ayıklama Günlüğü - - - - DemoNotice - - - - Welcome to Olive! - Olive'e Hoşgeldiniz! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive, GNU GPL kapsamında yayınlanan ücretsiz bir açık kaynaklı video editörüdür. Bu yazılımın parasını ödediyseniz, kandırılmış olursunuz. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Bu yazılım ALFA aşamasında, hatalar ve eksik özelliklere sahip kararsız ve çökmesine çok muhtemel olduğu anlamına gelir.Hiçbir garanti sunmuyoruz, bu yüzden kendi sorumluluğunuzda kullanın. Lütfen %1 adresindeki hata veya özellik isteklerini bildirin - - - - Thank you for trying Olive and we hope you enjoy it! - Olive'i denediğiniz için teşekkür ederiz ve beğeneceğinizi umuyoruz! - - - - Effect - - - Invalid effect - Geçersiz efekt - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - Etki için aday yok '%1'. Bu etki bozulmuş olabilir. Yeniden kurmayı ya da Olive'i deneyin. - - - - Save Effect Settings - Efekt Ayarlarını Kaydet - - - - - Effect XML Settings %1 - Efekt XML Ayarları %1 - - - - Save Settings Failed - Ayarları Kaydetme Başarısız - - - - Failed to open "%1" for writing. - Açılamadı "%1" yazmak için. - - - - Load Effect Settings - Efekt Ayarlarını Yükle - - - - - Load Settings Failed - Yükleme Ayarları Başarısız Oldu - - - - Failed to open "%1" for reading. - Açılamadı "%1" Okumak için. - - - - This settings file doesn't match this effect. - Bu ayar dosyası doesn't bu efekt ile eşleşmiyor - - - - EffectControls - - - (none) - (пусто) - - - - Effects: - Efekt: - - - - Add Video Effect - Video Efekti Ekle - - - - VIDEO EFFECTS - VİDEO EFEKT - - - - Add Video Transition - Video Geçişi Ekle - - - - Add Audio Effect - Ses Efekti Ekleme - - - - AUDIO EFFECTS - SES EFEKTİ - - - - Add Audio Transition - Ses Geçişi Ekle - - - - EffectRow - - - Disable Keyframes - Anahtar Kareleri Devre Dışı Bırak - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Anahtar kareleri devre dışı bırakmak geçerli tüm anahtar kareleri siler. Bunu yapmak istediğinden emin misin? - - - - EfektUI - - - %1 (Opening) - rafine - %1 (Açılış) - - - - %1 (Closing) - rafine - %1 (Kapanış) - - - - %1 (multiple) - rafine - %1 (çoklu) - - - - Cu&t - Sen&kestin - - - - &Copy - &Kopya - - - - Move &Up - Yukarı &Taşı - - - - Move &Down - Aşağı &Taşı - - - - D&elete - S&il - - - - Load Settings From File - Ayarları Dosyadan Yükle - - - - Save Settings to File - Ayarları Dosyaya Kaydet - - - - EmbeddedFileChooser - - - File: - Dosya: - - - - İhraçDiyalog - - - Export "%1" - İhraç "%1" - - - - Unknown codec name %1 - Bilinmeyen kodlayıcı adı %1 - - - - Export Failed - Dışa Aktarma Başarısız Oldu - - - - Export failed - %1 - Dışa aktarma başarısız oldu - %1 - - - - Invalid dimensions - Geçersiz boyutlar - - - - Export width and height must both be even numbers/divisible by 2. - İhracat genişliğinin ve yüksekliğinin her ikisi ikinci sayılar/bölünebilir olmalıdır. - - - - Invalid codec - Geçersiz kodek - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Seçilen kod çözücünün çıktı parametrelerini belirleyemedi. Bu bir hatadır, lütfen geliştiricilere başvurun.. - - - - Invalid format - Geçersiz format - - - - Couldn't determine output format. This is a bug, please contact the developers. - Çıkış formatı belirlenemiyor. Bu bir hata, geliştiricilerle irtibata geçiniz. - - - - Export Media - Rafine - Medyayı Dışa Aktar - - - - %p% (Total: %1:%2:%3) - Rafine - %p% (Toplam: %1:%2:%3) - - - - %p% (ETA: %1:%2:%3) - %p% (Durdu: %1:%2:%3) - - - - Quality-based (Constant Rate Factor) - Rafine - Kalite (Sabit Hız Faktörü) - - - - Constant Bitrate - Sabit bit hızı - - - - - Invalid Codec - Geçersiz Codec - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Bu codec bileşeni için uygun bir kodlayıcı bulunamadı. İhracat muhtemelen başarısız olacak. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Bu kodlayıcı için piksel formatı bulunamadı. İhracat muhtemelen başarısız olacak. - - - - Bitrate (Mbps): - Akış hızı (Мбіт/с): - - - - Quality (CRF): - Kalite (CRF): - - - - Kalite Faktörü: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Kalite Katsayısı: - -0 = без втрат -17-18 = візульно без втрат (стиснуто, але майже непомітно) -23 = висока якість -51 = найнижча можлива якість +%1 + - - Target File Size (MB): - Hedef Dosya Boyutu (MB): + + Error saving settings + - - Format: - Biçim: - - - - Range: - Menzil: - - - - Entire Sequence - Tam Sıra - - - - In to Out - Girişten Çıkışa - - - - Video - Video - - - - - Codec: - Kodek: - - - - Width: - Genişlik: - - - - Height: - Yükseklik: - - - - Frame Rate: - Kare Hızı: - - - - Compression Type: - Sıkıştırma Tipi: - - - - Advanced - Gelişmiş - - - - Audio - Ses - - - - Sampling Rate: - Örnekleme oranı: - - - - Bitrate (Kbps/CBR): - Bit hızı (Kbps/CBR): + + Failed to save application settings. The application may lack write permissions to this location. + - İhraçThread + Footage - - failed to send frame to encoder (%1) - kodlayıcıya çerçeve gönderilemedi (%1) + + %1 FPS + - - failed to receive packet from encoder (%1) - kodlayıcıdan paket alınamadı (%1) + + %1 Hz + - - could not video encoder for %1 - için video kodlayıcı açılamadı %1 + + Filename: %1 + - - could not allocate video stream - video akışı ayrılamadı - - - - could not allocate video encoding context - video kodlama içeriği ayrılamadı - - - - could not open output video encoder (%1) - çıkış video kodlayıcı açılamadı (%1) - - - - could not copy video encoder parameters to output stream (%1) - video kodlayıcı parametreleri çıktı akışına kopyalanamadı (%1) - - - - could not audio encoder for %1 - için ses kodlayıcı açılamadı %1 - - - - could not allocate audio stream - ses akışı ayrılamadı - - - - could not allocate audio encoding context - ses kodlama içeriği ayrılamadı - - - - could not open output audio encoder (%1) - çıkış ses kodlayıcı açılamadı (%1) - - - - could not copy audio encoder parameters to output stream (%1) - ses kodlayıcı parametreleri çıktı akışına kopyalanamadı (%1) - - - - could not allocate audio buffer (%1) - ses arabelleği ayrılamadı (%1) - - - - could not create output format context - çıktı formatı bağlamı oluşturulamadı - - - - could not open output file (%1) - çıktı dosyası açılamadı (%1) - - - - could not write output file header (%1) - çıktı dosyası başlığı yazamadı (%1) - - - - could not write output file trailer (%1) - rafine - çıktı dosyası fragmanını yazamadı (%1) + + This footage is not valid for use + - SolSağEfektiDoldurun + ImportTool - - Type - Tür + + Don't ask me again + - - Fill Left with Right - Sağa Sola Doldur + + No Active Sequence + - - Fill Right with Left - Sağdaki kanalı Sola doğru doldur + + No sequence is currently open. Would you like to create one? + + + + + Automatically Detect Parameters From Footage + + + + + Set Parameters Manually + - Frei0rEffect + MoveItemCommand - - Failed to load Frei0r plugin "%1": %2 - Frei0r eklentisi yüklenemedi "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - NOT: 32-bit Frei0r eklentilerini 64-bit Olive inşa edemezsiniz. Lütfen bu eklentinin 64 bit sürümünü bulun veya 32 bit Olive ürününe geçin. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - NOT: 64-bit Frei0r eklentilerini 32-bit Olive'de indiremezsiniz. Bu eklentinin 64 bit sürümünü bulun veya Olive'in 64 bit sürümünü yükleyin. - - - - Error loading Frei0r plugin - Frei0r eklentisi yüklenirken hata oluştu + + Move Item + - GraphEditor + NodeCopyPasteWidget - - Graph Editor - Grafik Editörü + + Error pasting nodes + - - Linear - Doğrusal - - - - Bezier - Bezier - - - - Hold - Rafine - Oldu + + Failed to paste nodes: %1 + - GraphView + NodeFactory - - Zoom to Selection - Seçime Yakınlaştır - - - - Zoom to Show All - Ölçekle ve her şeyi göster - - - - Reset View - Görünümü Sıfırla + + None + - InterlacingName + NodeViewItem - - None (Progressive) - Merhaba (İlerleyen) - - - - Top Field First - İlk önce üst alan - - - - Bottom Field First - Önce Alt Alan - - - - Invalid - Geçersiz + + %1... + - KeyframeNavigator + PresetManager - - Enable Keyframes - Anahtar Kareleri Etkinleştir + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + - KeyframeView + RatioDialog - - Linear - Doğrusal + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Bezier - Bezier + + Invalid custom ratio + - - Hold - Rafine - Oldu + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - LabelSlider + RenameItemCommand - - &Edit - &Düzenle - - - - &Reset to Default - rafine - &Varsayılana sıfırla - - - - - Set Value - Değeri Ayarla - - - - - New value: - Yeni değer: - - - - LoadDialog - - - Loading... - Yüklüyor... - - - - Loading '%1'... - Yüklüyor '%1'... - - - - Cancel - rafine - İptal - - - - LoadThread - - - Version Mismatch - Sürüm uyuşmazlığı - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Bu proje Olive'in farklı bir sürümünde kaydedildi ve bu sürümle tam olarak uyumlu olmayabilir. Yine de yüklemeyi denemek ister misiniz? - - - - Invalid Clip Link - Geçersiz Klip Bağlantısı - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Bu proje geçersiz bir klip bağlantısı içeriyor. Bozulabilir. Yüklemeye devam etmek ister misiniz? - - - - %1 - Line: %2 Col: %3 - %1 - Sıra: %2 Kolon: %3 - - - - User aborted loading - Kullanıcı iptal edildi - - - - XML Parsing Error - XML Ayrıştırma Hatası - - - - Couldn't load '%1'. %2 - Yüklenemdi '%1'. %2 - - - - Project Load Error - Proje Yükleme Hatası - - - - Error loading project: %1 - Proje yüklenirken hata oluştu: %1 - - - - MainWindow - - - Welcome to %1 - Hoşgeldiniz %1 - - - - &File - &Dosya - - - - &New - &Yeni - - - - &Open Project - &Proje Aç - - - - Clear Recent List - Geçmişi temizle - - - - Open Recent - Son Aç - - - - &Save Project - &Projeyi Kaydet - - - - Save Project &As - Projeyi Farklı &Kaydet - - - - &Import... - &Dışa aktar... - - - - &Export... - &İhraç... - - - - E&xit - Çı&kış - - - - &Edit - &Düzenle - - - - &Undo - &Geri al - - - - Redo - Yinele - - - - Select &All - Tümünü &Seç - - - - Deselect All - Hiçbirini seçme - - - - Ripple to In Point - Giriş noktasına taşı - - - - Ripple to Out Point - Çıkış noktasına taşı - - - - Edit to In Point - Giriş noktasına Düzenle - - - - Edit to Out Point - Çıkış Noktasına göre Düzenle - - - - Delete In/Out Point - Giriş/Çıkış Noktasını Silin - - - - Ripple Delete In/Out Point - Dalgalanma Silme Giriş/Çıkış Noktası - - - - Set/Edit Marker - İşaretleyiciyi Kur/Düzenle - - - - &View - &Görünüm - - - - Zoom In - Yakınlaştır - - - - Zoom Out - Uzaklaştır - - - - Increase Track Height - İz Yüksekliğini Artır - - - - Decrease Track Height - Parça Yüksekliğini Azalt - - - - Toggle Show All - rafine - Tümünü Göster'e Geçiş Yap - - - - Track Lines - İz Hatları - - - - Rectified Waveforms - Alt Dalga Şekli - - - - Frames - Çerçeve - - - - Drop Frame - Başlangıç Çerçevesi - - - - Non-Drop Frame - Alt Düşmeyen Çerçeve - - - - Milliseconds - Milisaniyeler - - - - Title/Action Safe Area - rafine - Güvenli Başlık/Aksiyon Alan - - - - Off - Kapalı - - - - Default - Varsayılan - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - Özel - - - - Full Screen - Tam Ekran Modu - - - - Full Screen Viewer - Tam Ekran Görüntüleyici Modunda - - - - &Playback - Yeniden&Oynat - - - - Go to Start - Başlaş Git - - - - Previous Frame - Önceki Çerçeve - - - - Play/Pause - Oynat/Durdur - - - - Play In to Out - Dışarıda Oynat - - - - Next Frame - Sonraki Çerçeve - - - - Go to End - Sona Git - - - - Go to Previous Cut - Önceki bölüme git - - - - Go to Next Cut - Snraki bölüme git - - - - Go to In Point - Giriş noktasına git - - - - Go to Out Point - Çıkış noktasına git - - - - Shuttle Left - rafine - Hız Azaltma - - - - Shuttle Stop - rafine - Durma - - - - Shuttle Right - rafine - Hızını arttır - - - - Loop - rafine - Döngü tekrarlayın - - - - &Window - &Pencere - - - - Project - Proje - - - - Effect Controls - Efekt Kontrolleri - - - - Timeline - Montaj Masası - - - - Graph Editor - Grafik Editörü - - - - Media Viewer - rafine - Medya Dosyası Tarayıcısı - - - - Sequence Viewer - rafine - Sıra Görüntüleyici - - - - Maximize Panel - Paneli Büyüt - - - - Lock Panels - Paneli Kilitle - - - - Reset to Default Layout - Panel'i Varsayılan Düzen'e Sıfırla - - - - &Tools - &Araçlar - - - - Pointer Tool - rafine - İşaretçi Aracı - - - - Edit Tool - Düzenleme Aracı - - - - Ripple Tool - Makas ve Montaj Aracı - - - - Razor Tool - Budama - - - - Slip Tool - Kaydırma Aracı - - - - Slide Tool - Kaydırma - - - - Hand Tool - rafine - Yol Bulma Aracı - - - - Transition Tool - Geçiş - - - - Enable Snapping - Yapıştırmayı Etkinleştir - - - - Auto-Cut Silence - Otomatik Kesim Sessizliği - - - Selecting Also Seeks - Kaydırma ile seçim - - - Edit Tool Also Seeks - rafine - Kaydırma ile seçim - - - Edit Tool Selects Links - Seçim, bağlantıları seçer - - - Seek Also Selects - Ayrıca Arayın - - - Seek to the End of Pastes - Eklerin sonuna gidin - - - Scroll Wheel Zooms - rafine - Fare tekerleği montaj tablasını ölçeklendirir - - - Hold CTRL to toggle this setting - Bu ayarı değiştirmek için CTRL tuşunu basılı tutun - - - Invert Timeline Scroll Axes - rafine - Zaman Çizelgesi Kaydırma Eksenlerini Ters Çevir - - - Enable Drag Files to Timeline - rafine - Sürükle Dosyaları Zaman Çizelgesi'ne Etkinleştir - - - Auto-Scale By Default - Varsayılan Olarak Otomatik Ölçeklendir - - - Enable Seek to Import - rafine - Alınacak Arama'yı Etkinleştir - - - Audio Scrubbing - Kaydırırken ses çal - - - Enable Drop on Media to Replace - Уточнити - Değiştirilecek Medyada Bırakmayı Etkinleştir - - - Enable Hover Focus - Odağı Aç - - - Ask For Name When Setting Marker - İşaretleyiciyi Ayarlarken Ad İste - - - - No Auto-Scroll - Otomatik Kaydırma Yok - - - - Page Auto-Scroll - Sayfa Otomatik Kaydırma - - - - Smooth Auto-Scroll - Düzgün Otomatik Kaydırma - - - - Preferences - Ayarlar - - - - Clear Undo - Değişikliklerin geçmişini temizle - - - - &Help - &Yardım - - - - A&ction Search - Et&kin Arama - - - - Debug Log - Hata ayıklama günlüğü - - - - &About... - &Program Hakkında... - - - - <untitled> - <başlıksız> - - - - Marker - - - Set Marker - İşaretçiyi ayarla - - - - Set clip marker name: - Klip İşaretçisi Adı: - - - - Set sequence marker name: - Sıra işaretleyicisinin adını ayarla: - - - - Media - - - New Folder - Yeni Dosya - - - - Name: - Ad: - - - - Filename: - Dosyaadı: - - - - Video Dimensions: - Video Boyutları: - - - - Frame Rate: - Kare Hızı: - - - - %1 field(s) (%2 frame(s)) - rafine - alanlar: %1 (çerçeveler: %2) - - - - Interlacing: - Tarama: - - - - Audio Frequency: - Ses Frekansı: - - - - Audio Channels: - Ses Kanalı: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Ad: %1 -Video Boyutu: %2x%3 -Kare Hızı: %4 -Ses Frekansı: %5 -Ses Kanalları: %6 - - - - Name - Ad - - - - Duration - Süre - - - - Rate - Oran - - - - MediaPropertiesDialog - - - "%1" Properties - Sahne Özellikleri "%1" - - - - Tracks: - İzler: - - - - Video %1: %2x%3 %4FPS - Video %1: %2x%3 %4FPS - - - - Audio %1: %2Hz %3 - Ses %1: %2Hz %3 - - - - %n channel(s) - - %n kanal - %n kanallar - %n kanallar - - - - - Conform to Frame Rate: - Kare Hızına Uygunluk: - - - - Alpha is Premultiplied - rafine - Alfa, Önceden Gerçekleştirildi - - - - Auto (%1) - Otomatik (%1) - - - - Interlacing: - Geçmeli Tarama: - - - - Name: - Ad: - - - - MenuHelper - - - &Project - &Proje - - - - &Sequence - &Sıra - - - - &Folder - &Dosya - - - - Set In Point - Giriş Noktasını Ayarla - - - - Set Out Point - Çıkış Noktasını Ayarla - - - - Reset In Point - Giriş noktasını sıfırla - - - - Reset Out Point - Çıkış Noktasını Sıfırla - - - - Clear In/Out Point - Giriş/Çıkış Noktasını Temizle - - - - Add Default Transition - Varsayılan Geçiş Ekle - - - - Link/Unlink - Bağlantı/Bağlantıyı Kes - - - - Enable/Disable - Etkin/Devredışı - - - - Nest - Yuvarla - - - - Cu&t - Kes&s - - - - Cop&y - K&opya - - - - - &Paste - &Yapıştır - - - - Paste Insert - rafine - Yapıştır Ekle - - - - Duplicate - Yinele - - - - Delete - Sil - - - - Ripple Delete - Dalgacığı Sil - - - - Split - Böl - - - - Invalid aspect ratio - Geçersiz en boy oranı - - - - The aspect ratio '%1' is invalid. Please try again. - En boy oranı '%1' geçersizdir. Lütfen tekrar deneyin. - - - - Enter custom aspect ratio - Özel en boy oranını girin - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Başlık/işlem güvenli alanı için kullanılacak en boy oranını girin (misal, 16:9): - - - - NewSequenceDialog - - - Editing "%1" - Kurgu "%1" - - - - New Sequence - Yeni Sıra - - - - Preset: - Уточнити - Önayar: - - - - Film 4K - Film 4К - - - - TV 4K (Ultra HD/2160p) - TV 4K (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - Özel - - - - Video - Video - - - - Width: - Genişlik: - - - - Height: - Yükseklik: - - - - Frame Rate: - Kare Hızı: - - - - Pixel Aspect Ratio: - Piksel en boy oranı: - - - - Square Pixels (1.0) - Kare Piksel (1.0) - - - - Interlacing: - Karıştır: - - - - None (Progressive) - Merhaba (ilerleyen) - - - - Audio - Ses - - - - Sample Rate: - Aynı Oran: - - - - Name: - Ad: - - - - OliveGlobal - - - Olive Project %1 - Olive Proje %1 - - - - Auto-recovery - Otomatik-kurtarma - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive düzgün kapanmadı veya çöktü ve otomatik kurtarma dosyası buldu. Açmak istermisin? - - - - Open Project... - Proje Aç... - - - - Missing recent project - Son Proje Eksik - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Proje '%1' artık yok. Son projeler listesinden kaldırmak ister misiniz? - - - - Save Project As... - Projeyi farklı kaydet... - - - - Unsaved Project - Kaydedilmemiş Proje - - - - This project has changed since it was last saved. Would you like to save it before closing? - Bu proje son kurtarıldığından bu yana değişti. Kapatmadan önce kaydetmek ister misiniz? - - - - No active sequence - Aktif dizi yok - - - - Please open the sequence to perform this action. - Lütfen bu işlemi gerçekleştirmek için sırayı açın. - - - - No clips selected - Seçili klip yok - - - - Select the clips you wish to auto-cut - rafine - Otomatik kesmek istediğiniz klipleri seçin - - - Please open the sequence you wish to export. - Lütfen dışa aktarmak istediğiniz sırayı açın. - - - - Missing Project File - Eksik Proje Dosyası - - - - Specified project '%1' does not exist. - Belirtilen '%1' proje yok. - - - - PanEffect - - - Pan - rafine - Panorama - - - - PreferencesDialog - - - Preferences - Ayarlar - - - - Default Sequence - Varsayılan Sıra - - - - Invalid CSS File - Geçersiz CSS Dosyası - - - - CSS file '%1' does not exist. - CSS dosyası '%1' yok. - - - - Confirm Reset All Shortcuts - Tüm Kısayolları Sıfırlamayı Onayla - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - Tüm klavye kısayollarını varsayılan ayarlarına sıfırlamak istediğinizden emin misiniz? - - - - Import Keyboard Shortcuts - Klavye Kısayollarını İçe Aktar - - - - - Error saving shortcuts - Kısayollar kaydedilirken hata oluştu - - - - Failed to open file for reading - Dosya okumak için açılamadı - - - - Export Keyboard Shortcuts - Klavye Kısayollarını Dışa Aktar - - - - Export Shortcuts - Kısayolları Dışa Aktar - - - - Shortcuts exported successfully - Kısayollar başarıyla verildi - - - - Failed to open file for writing - Dosya yazma için açılamadı - - - - Browse for CSS file - CSS dosyasına göz atın - - - - Delete All Previews - Tüm Önizlemeleri Sil - - - - Are you sure you want to delete all previews? - Tüm önizlemeleri silmek istediğinize emin misiniz? - - - - Previews Deleted - Önizlemeler Silindi - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - rafine - Tüm önizlemeler başarıyla silindi. Değişikliklerin geçerli olması için mevcut projenizi yeniden açmanız gerekebilir. - - - - Language: - Dil: - - - - Image sequence formats: - Görüntü sırası formatları: - - - - Thumbnail Resolution: - Küçük Resim Çözünürlüğü: - - - - Waveform Resolution: - Dalga biçimi çözünürlük: - - - - Delete Previews - Önizlemeleri Sil - - - - Use Software Fallbacks When Possible - Mümkün olduğunda yazılım uygulamasını kullanın - - - - Default Sequence Settings - Varsayılan Sıralama Ayarları - - - - General - Genel - - - - Behavior - Davranış - - - - Add Default Effects to New Clips - Yeni Kliplere Varsayılan Efektler Ekleme - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - Bir Sıranın Sonunda Oynarken Başlangıcı Otomatik Olarak Ara - - - - Selecting Also Seeks - Ayrıca Seçme - - - - Edit Tool Also Seeks - Düzenleme Aracında Aranıyor - - - - Edit Tool Selects Links - Düzenleme Aracı Bağlantıları Seçer - - - - Seek Also Selects - Ayrıca Arayınor - - - - Seek to the End of Pastes - Eklerin sonuna gidin açın - - - - Scroll Wheel Zooms - Kaydırma Tekerleği Yakınlaştırmaları - - - - Hold CTRL to toggle this setting - Bu ayarı değiştirmek için CTRL tuşunu basılı tutun - - - - Invert Timeline Scroll Axes - Zaman Çizelgesi Kaydırma Eksenlerini Ters Çevir - - - - Enable Drag Files to Timeline - rafine - Dosyaları sürükleyerek kurulum tablosuna etkinleştirin - - - - Auto-Scale By Default - Otomatik ölçeklendirme varsayılanı - - - - Auto-Seek to Imported Clips - Уточнити - Alınan Kliplere Otomatik Arama - - - - Audio Scrubbing - Kaydırırken ses çal - - - - Drop Files on Media to Replace - Уточнити - Medyada Değiştirilecek Dosyaları Bırak - - - - Enable Hover Focus - Vurgulu Odağı Etkinleştir - - - - Ask For Name When Setting Marker - İşaretleyiciyi Ayarlarken Ad İste - - - - Appearance - Görünüm - - - - Theme - Tema - - - - Olive Dark (Default) - Olive Kara (типово) - - - - Olive Light - Olive Hafif - - - - Native - rafine - Yerel - - - - Native (Light Icons) - Уточнити - Yerel (Hafif Simgeler) - - - - Use Native Menu Styling - rafine - Yerel Menü Stilini Kullan - - - - Custom CSS: - Özel CSS: - - - - Browse - rafine - Göz at - - - - Effect Textbox Lines: - Efekt Metin Kutusu Satırları: - - - Seeking - Konumlandırma - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - Doğru Arama -Her zaman doğru çerçeveyi göster (doğru çerçeve alındıkça görsel kısaca yavaşlayabilir) - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - Hızlı konumlandırma -Hızlı konumlandırma (belki yanlış çerçeve ekranı-oynatmayı etkilemez) - - - - Memory Usage - Hafıza kullanımı - - - - Upcoming Frame Queue: - Yaklaşan Çerçeve Kuyruğu: - - - - - frames - Çerçeve - - - - - seconds - saniye - - - - Previous Frame Queue: - Önceki Çerçeve Sırası: - - - - Playback - Yeniden Oynat - - - - Output Device: - Çıkış Cihazı: - - - - - Default - Varsayılan - - - - Input Device: - Giriş aygıtı: - - - - Sample Rate: - Aynı oran: - - - - Audio Recording: - Ses Kayıt: - - - - Mono - Mono - - - - Stereo - Stereo - - - - Audio - Ses - - - - Search for action or shortcut - İşlem veya kısayol ara - - - - Action - Faaliyet - - - - Shortcut - Klavye Kısayol - - - - Import - Dışa Aktar - - - - Export - İhraç - - - - Reset Selected - Seçileni Sıfırla - - - - Reset All - Tümünü Sıfırla - - - - Keyboard - Klavye Kısayolları - - - - PreviewGenerator - - - Failed to find any valid video/audio streams - Geçerli herhangi bir video/ses akışı bulunamadı - - - - Could not open file - %1 - Dosya açılamadı — %1 - - - - Could not find stream information - %1 - Akış bilgisi bulunamadı — %1 - - - - Project - - - New - Yeni - - - - Open Project - Proje Aç - - - - Save Project - Projeyi Kaydet - - - - Undo - Geri Al - - - - Redo - Yinele - - - - Tree View - Ağaç Görünümü - - - - Icon View - Simge Görünümü - - - - List View - Liste Görünümü - - - - Search media, markers, etc. - Medya, işaretleyiciler vb. - - - - Project - Proje - - - - Sequence - Düzen - - - - Replace '%1' - Değiştir '%1' - - - - - All Files - Tüm Dosyalar - - - - - No active sequence - Etkin sıra yok - - - - No sequence is active, please open the sequence you want to replace clips from. - Hiçbir dizi etkin değil, lütfen klipleri değiştirmek istediğiniz sırayı açın.. - - - - Active sequence selected - Aktif sıra seçildi - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - rafine - Kendi içine bir dizi ekleyemezsiniz, bu nedenle bu ortamın hiçbir klibi bu sıralamada olmaz. - - - - Rename '%1' - Yeni ad ver '%1' - - - - Enter new name: - Yeni ad girin: - - - - Delete media in use? - rafine - Kullanılan medyayı sil? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - Medya '% 1'; şu anda '% 2' içinde kullanılmaktadır '%2'. Silme, dizideki tüm örnekleri siler. Bunu yapmak istediğinden emin misin? - - - - Skip - Atla - - - - Import a Project - Projeyi İçe Aktar - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" bir Olive proje dosyasıdır. Bu proje ile birleşecek. Devam etmek istiyor musun? - - - - Image sequence detected - Görüntü sırası algılandı - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - Dosya '%1' bir görüntü dizisinin parçası gibi görünüyor.. Bu şekilde ithal etmek ister misiniz? - - - - Import media... - Medyayı içe aktar... - - - - No sequence is active, please open the sequence you want to delete clips from. - Aktif dizi yok. Klipleri kaldırmak istediğiniz sırayı açın. - - - - ProxyDialog - - - Create Proxy - Vekil Oluştur - - - - Proxy - Vekil - - - - Dimensions: - Boyutlar: - - - - Same Size as Source - Kaynakla Aynı Boyut - - - - Half Resolution (1/2) - Yarısının Çözünürlüğü (1/2) - - - - Quarter Resolution (1/4) - Çeyrek Çözünürlük (1/4) - - - - Eighth Resolution (1/8) - Sekizinci Çözünürlük (1/8) - - - - Sixteenth Resolution (1/16) - Onaltıncı Çözünürlük (1/16) - - - - Format: - Biçim: - - - - ProRes HQ - ProRes HD - - - - Location: - Konum: - - - - Same as Source (in "%1" folder) - Kaynakla aynı (dosya "%1" içinde ) - - - - Proxy file exists - Vekil dosyası var - - - - The file "%1" already exists. Do you wish to replace it? - Dosya "%1" zaten var. Değiştirmek ister misiniz? - - - - Custom Location - Özel Konum - - - - ProxyGenerator - - - Finished generating proxy for "%1" - İçin tam bir vekil oluşturma "%1" - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - Üzerindeki klipleri değiştir "%1" - - - - Select which media you want to replace this media's clips with: - Bu ortamın kliplerini hangi ortamla değiştirmek istediğinizi seçin: - - - - Keep the same media in-points - Aynı ortamı yerinde tutun - - - - Replace - Değiştir - - - - Cancel - İptal - - - - No media selected - Medya seçilmedi - - - - Please select a media to replace with or click 'Cancel'. - Lütfen değiştirmek için bir medya seçin veya tıklayın «İptal». - - - - Same media selected - Aynı ortam seçildi - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Değiştirdiğiniz medyayı seçtiniz. Lütfen farklı bir tane seçin veya tıklayın «İptal». - - - - Folder selected - Klasör seçildi - - - - You cannot replace footage with a folder. - Görüntüleri bir klasörle değiştiremezsiniz. - - - - Active sequence selected - Aktif sıra seçildi - - - - You cannot insert a sequence into itself. - Kendi içinde bir sıra ekleyemezsiniz. - - - - RichTextEffect - - - Text - Metin - - - - Padding - rafine - Dolgu - - - - Position - Pozisyon - - - - Vertical Align: - Dikey Hizala: - - - - Top - Üst - - - - Center - Merkez - - - - Bottom - Alt - - - - Auto-Scroll - Ototomatik-kaydırma - - - - Off - Kapalı - - - - Up - Yukarı - - - - Down - Aşağı - - - - Left - Sola - - - - Right - Sağa - - - - Shadow - Gölge - - - - Shadow Color - Gölge Rengi - - - - Shadow Angle - Gölge Açısı - - - - Shadow Distance - Gölge Mesafesi - - - - Shadow Softness - Gölge Yumuşaklığı - - - - Shadow Opacity - Gölge Opaklığı + + Rename Item + Sequence - - %1 (copy) - %1 (kopya) + + %1 FPS + - ShakeEffect + Stream - - Intensity - Yoğunluk + + %1: Audio - %2 Channels, %3Hz + - - Rotation - Dönüş + + %1: Unknown + - - Frequency - Frekans + + %1: Image - %2x%3 + + + + + %1: Video - %2x%3 + - SolidEffect + TimelineViewBlockItem - - Type - Tür - - - - Solid Color - Koyu Renk - - - - SMPTE Bars - SMPTE Çubuğu - - - - Checkerboard - Santrançtahtası - - - - Opacity - Opaklık - - - - Color - Renk - - - - Checkerboard Size - Hücre boyutu - - - - SourcesCommon - - - Import... - İthal... - - - - New - Yeni - - - - View - Gör - - - - Tree View - Ağaç Görünümü - - - - Icon View - Simge Görünümü - - - - Show Toolbar - Araç Çubuğunu Göster - - - - Show Sequences - Sıraları Göster - - - - Replace/Relink Media - rafine - Medyayı Değiştir/Yeniden Bağla - - - - Reveal in Explorer - Gezgin içinde Göster - - - - Reveal in Finder - Bul içinde Göster - - - - Reveal in File Manager - Dosya Yöneticisinde Göster - - - - Replace Clips Using This Media - rafine - Bu Medyayı Kullanarak Klipleri Değiştir - - - - Create Sequence With This Media - Bu dosyalarla bir sıra oluşturun - - - - Duplicate - Benzer - - - - Delete All Clips Using This Media - rafine - Bu Medyayı Kullanarak Tüm Klipleri Sil - - - - Proxy - Vekil - - - - Generating proxy: %1% complete - Vekil oluşturma: Tamamlandı %1% - - - - Create/Modify Proxy - Vekil Oluştur/Değiştir - - - - Create Proxy - Vekil Oluştur - - - - Modify Proxy - Vekil'i Değiştir - - - - Restore Original - Orijinali Geri Yükle - - - - Delete - Sil - - - - Preview in Media Viewer - Medya Görüntüleyicide Önizleme - - - - Properties... - Sahne Özellikleri... - - - - Replace Media - Medyayı Değiştir - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Dosyayı. '%1'. Bu dosyayı değiştirmek istiyor musunuz? - - - - Delete proxy - Vekil Sunucu - - - - Would you like to delete the proxy file "%1" as well? - Vekil dosyasını silmek ister misiniz? "%1"? - - - - SpeedDialog - - - Speed/Duration - Hız/Süre - - - - Speed: - Hız: - - - - Frame Rate: - Kare hızı: - - - - Duration: - Süre: - - - - Reverse - Ters - - - - Maintain Audio Pitch - Ses Alanını Koru - - - - Ripple Changes - Dalgalanma Değişiklikleri - - - - TextEditDialog - - - Edit Text - Metni Düzenle - - - - Thin - rafine - İnce - - - - Extra Light - rafine - Ekstra Işık - - - - Light - rafine - Işık - - - - Normal - rafine - Normal - - - - Medium - rafine - Orta - - - - Demi Bold - rafine - Yarı Kalın - - - - Bold - rafine - Kalın - - - - Extra Bold - rafine - Ekstra Kalın - - - - Black - rafine - Kara - - - - TextEditEx - - - Edit Text - Metni Düzenle - - - - &Edit Text - &Metni Düzenle - - - - TextEffect - - - Text - Metin - - - - Font - Yazıtipi - - - - Size - Boyut - - - - Color - Renk - - - - Alignment - Hizalama - - - - Left - Sol - - - - - Center - Merkez - - - - Right - Sağ - - - - Justify - Yaslama - - - - Top - Üstte - - - - Bottom - Alt - - - - Word Wrap - Sözcük Kaydır - - - - Padding - Dolgu - - - - Position - Pozisyon - - - - Outline - Taslak - - - - Outline Color - anahat Renk - - - - Outline Width - Anahat Genişliği - - - - Shadow - Gölge - - - - Shadow Color - Gölge Renk - - - - Shadow Angle - Gölge Açısı - - - - Shadow Distance - Gölge Mesafesi - - - - Shadow Softness - Gölge Yumuşaklığı - - - - Shadow Opacity - Gölge Opaklığı - - - - Sample Text - Örnek yazı - - - - TimecodeEffect - - - Timecode - Zaman-kodu - - - - Sequence - Sıra - - - - Media - Dosya - - - - Scale - Ölçü - - - - Color - Renk - - - - Background Color - Arkaplan Rengi - - - - Background Opacity - Arkaplan Opaklığı - - - - Offset - Kaydırma - - - - Prepend - Başına Ekle - - - - Timeline - - - Pointer Tool - İşaretçi Aracı - - - - Edit Tool - Düzenleme Aracı - - - - Ripple Tool - Dalgalanma Aracı - - - - Razor Tool - Kırpma - - - - Slip Tool - Ofset kaydırma - - - - Slide Tool - Kaydırma Aracı - - - - Hand Tool - Yol Bul - - - - Transition Tool - Geçiş - - - - Snapping - Yapışma - - - - Zoom In - Yakınlaştır - - - - Zoom Out - Uzaklaştırmak - - - - Record audio - Ses kaydı - - - - Add title, solid, bars, etc. - Başlık, katı, çubuk vb. Ekleyin. - - - - Nested Sequence - İç içe sıra - - - - Effect already exists - Efekt zaten eklenmiş - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - Klip '%1' zaten bir efekt '%2' içeriyor. Yapıştırılanla değiştirmek veya ayrı bir efekt olarak eklemek ister misiniz? - - - - Add - Ekle - - - - Replace - Değiştir - - - - Skip - Atlama - - - - Do this for all conflicts found - Bulunan tüm çatışmalar için bunu yap - - - - Title... - Başlık... - - - - Solid Color... - Koyu Renk... - - - - Bars... - Test Masası... - - - - Tone... - Ton… - - - - Noise... - Gürültü... - - - - Unsaved Project - Kaydedilmemiş Proje - - - - You must save this project before you can record audio in it. - Ses kaydı yapmadan önce bu projeyi kaydetmelisiniz. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Kaydı başlatmak istediğiniz zaman çizelgesine tıklayın (kaydı belirli bir zaman dilimine sınırlamak için sürükleyin) - - - - Timeline: - Montaj Masası: - - - - (none) - (boş) - - - - TimelineHeader - - - Center Timecodes - Tarih Kodunuortala - - - - TimelineWidget - - - &Undo - &Geri Al - - - - &Redo - &Yinele - - - - R&ipple Delete Empty Space - Уточнити - D&algalanma Boş Alanı Sil - - - - Sequence Settings - Sıra Ayarları - - - - &Speed/Duration - &Hız/Süre - - - Auto-s&cale - Авто&масштабування - - - - Auto-Cut Silence - Otomatik Kesme Sessizliği - - - - Auto-S&cale - Otomatik&ölçeklendirme - - - - &Reveal in Project - rafine - &Projede Göster - - - - Properties - Sahne Özellikleri - - - + %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Başlat: %2 -Son: %3 -Süre: %4 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Error - Hata - - - - Couldn't locate media wrapper for sequence. - Dizi için ortam sargısı bulunamadı. - - - - Title - Başlık - - - - Solid Color - Koyu Renk - - - + Bars - Test Çubuğu + Test Çubuğu - + + Solid + + + + + Title + Başlık + + + Tone - Ton + Ton - - Noise - Gürültü - - - - Duration: - Süre: + + Unknown + - ToneEffect + VideoParams - - Type - Тür + + 8-bit + - - Sine - Sinüs + + 16-bit Integer + - - Frequency - Frekans + + Half-Float (16-bit) + - - Amount - Toplam + + Full-Float (32-bit) + - - Mix - Karıştır + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + - TransformEffect + main - - Position - Pozisyon + + Show this help text + - - Scale - Ölçek + + Show application version + - - Uniform Scale - Tek tip ölçek + + Start in full-screen mode + - - Rotation - Dönme + + Export only (No GUI) + - - Anchor Point - Dayanak noktası + + Override language with file + - - Opacity - Opaklık + + qm-file + - - Blend Mode - Karıştırma modu - - - - Normal - Normal + + Project to open on startup + - Transition + olive::AboutDialog - + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive doğrusal olmayan bir video editörüdür. Bu yazılım GNU GPL tarafından ücretsiz ve korunmaktadır. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive Takımı, kullanıcılara Olive kaynak kodunun web sitesinden indirilmek üzere kullanılabilir olduğunu bildirmek zorundadır. + + + + olive::ActionSearch + + + Search for action... + İşlem Ara... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Ses + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + Length - Süre + Süre + + + + Media In + + + + + Enabled + + + + + Speed + - UpdateNotification + olive::BlurFilterNode - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - Olive web sitesinde bir güncelleme mevcut. İndirmek için www.olivevideoeditor.org adresini ziyaret edin. + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + - VSTHost + olive::ClipBlock - - - Error loading VST plugin - VST eklentisi yüklenirken hata oluştu + + Clip + - Failed to create VST reference - VST referansı oluşturulamadı + + A time-based node that represents a media source. + - - Failed to load VST plugin "%1": %2 - VST eklentisi yüklenemedi "%1": %2 - - - NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - NOT: 64-bit Olive'de 32-bit VST eklentilerini indiremezsiniz. Bu eklentinin 64 bit sürümünü bulun veya Olive'in 32 bit sürümünü yükleyin. - - - NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - NOT: 64-bit VST eklentilerini 32-bit bir Olive yapısına yükleyebilirsiniz. Lütfen bu eklentinin 32 bit sürümünü bulun veya 64 bit Olive ürününe geçin. - - - - Failed to locate entry point for dynamic library. - Dinamik kütüphane için giriş noktası bulunamadı. - - - - VST Error - VST Hata - - - - Plugin's magic number is invalid - Eklentinin sihirli numarası geçersiz - - - - VST Plugin - VST Eklenti - - - - Plugin - Eklenti - - - - Interface - Arayüz - - - - Show - Göster + + Buffer + - Viewer + olive::ColorDialog - - (none) - (hiçbiri) - - - - Drag video only - Yalnızca video sürükleyin - - - - Drag audio only - Yalnızca sesi sürükleyin - - - - Sequence Viewer - Sıra Görüntüleyici - - - - Media Viewer - Medya Görüntüleyici + + Select Color + - ViewerWidget + olive::ColorSpaceChooser - - Save Frame as Image... - Çerçeveyi Görüntü Olarak Kaydet... + + Color Management + - - Show Fullscreen - Tam ekran modu + + Input: + - - Disable - Devre Dışı + + Color Space: + - - Screen %1: %2x%3 - Ekran %1: %2x%3 + + Display: + - - Zoom - Yakınlaştır + + View: + - + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + Yeni Dosya + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + Projeyi Kaydet + + + + + Error + Hata + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + Proje Aç + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Doğrusal + + + + Bezier + Bezier + + + + Hold + Oldu + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Gelişmiş + + + + Pixel + + + + + Pixel Format: + Piksel Biçimi: + + + + Performance + + + + + Threads: + İş Parçacığı: + + + + olive::ExportAudioTab + + + Codec: + Kodek: + + + + Sample Rate: + Aynı oran: + + + + Channel Layout: + + + + + Format: + Biçim: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + Dosyaadı: + + + + Browse for exported file filename + + + + + Preset: + Önayar: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Menzil: + + + + Entire Sequence + Tam Sıra + + + + In to Out + Girişten Çıkışa + + + + Format: + Biçim: + + + + Export Video + + + + + Export Audio + + + + + Video + Video + + + + Audio + Ses + + + + + Export + İhraç + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Genişlik: + + + + Height: + Yükseklik: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + Fit - Sığdır + Sığdır - - Custom - Özel + + Stretch + - - Close Media - Medyayı Kapat + + Crop + - - Save Frame - Çerçeveyi Kaydet + + Frame Rate: + - - Viewer Zoom - Görüntüleyici Yakınlaştırma + + Pixel Aspect Ratio: + Piksel en boy oranı: - - Set Custom Zoom Value: - Özel Yakınlaştırma Değerini Ayarla: + + Interlacing: + + + + + Quality: + + + + + Codec + + + + + Codec: + Kodek: + + + + Advanced + Gelişmiş - ViewerWindow + olive::FloatSlider - - Exit Fullscreen - Tam ekrandan çık + + %1 dB + + + + + %1% + - VoidEffect + olive::FootagePropertiesDialog - + + "%1" Properties + + + + + Name: + Ad: + + + + Tracks: + İzler: + + + + olive::FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + Göz at + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + Tüm Dosyalar + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Hedef Dosya Boyutu (MB): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Doğrusal + + + + Hold + Oldu + + + + Bezier + Bezier + + + + olive::KeyframeViewBase + + + Linear + Doğrusal + + + + Bezier + Bezier + + + + Hold + Oldu + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + &Projeyi Kaydet + + + + Save Project &As + Projeyi Farklı &Kaydet + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + &Dosya + + + + &New + &Yeni + + + + &Open Project + &Proje Aç + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &Dışa aktar... + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + Çı&kış + + + + &Edit + &Düzenle + + + + Insert + + + + + Overwrite + + + + + Select &All + Tümünü &Seç + + + + Deselect All + Hiçbirini seçme + + + + Ripple to In Point + Giriş noktasına taşı + + + + Ripple to Out Point + Çıkış noktasına taşı + + + + Edit to In Point + Giriş noktasına Düzenle + + + + Edit to Out Point + Çıkış Noktasına göre Düzenle + + + + Delete In/Out Point + Giriş/Çıkış Noktasını Silin + + + + Ripple Delete In/Out Point + Dalgalanma Silme Giriş/Çıkış Noktası + + + + Set/Edit Marker + İşaretleyiciyi Kur/Düzenle + + + + &View + &Görünüm + + + + Zoom In + Yakınlaştır + + + + Zoom Out + + + + + Increase Track Height + İz Yüksekliğini Artır + + + + Decrease Track Height + Parça Yüksekliğini Azalt + + + + Toggle Show All + Tümünü Göster'e Geçiş Yap + + + + Full Screen + Tam Ekran Modu + + + + Full Screen Viewer + Tam Ekran Görüntüleyici Modunda + + + + &Playback + Yeniden&Oynat + + + + Go to Start + Başlaş Git + + + + Previous Frame + Önceki Çerçeve + + + + Play/Pause + Oynat/Durdur + + + + Play In to Out + Dışarıda Oynat + + + + Next Frame + Sonraki Çerçeve + + + + Go to End + Sona Git + + + + Go to Previous Cut + Önceki bölüme git + + + + Go to Next Cut + Snraki bölüme git + + + + Go to In Point + Giriş noktasına git + + + + Go to Out Point + Çıkış noktasına git + + + + Shuttle Left + Hız Azaltma + + + + Shuttle Stop + Durma + + + + Shuttle Right + Hızını arttır + + + + Loop + Döngü tekrarlayın + + + + &Sequence + &Sıra + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + Paneli Büyüt + + + + Lock Panels + Paneli Kilitle + + + + Reset to Default Layout + Panel'i Varsayılan Düzen'e Sıfırla + + + + &Tools + &Araçlar + + + + Pointer Tool + İşaretçi Aracı + + + + Edit Tool + Düzenleme Aracı + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + Geçiş + + + + Enable Snapping + Yapıştırmayı Etkinleştir + + + + Preferences + Ayarlar + + + + &Help + &Yardım + + + + A&ction Search + Et&kin Arama + + + + Send &Feedback... + + + + + &About... + &Program Hakkında... + + + + olive::MainStatusBar + + + Welcome to %1 %2 + Hoşgeldiniz %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + Gör + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + Ekle + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + Pozisyon + + + + Rotation + + + + + Scale + + + + + Uniform Scale + Tek tip ölçek + + + + Anchor Point + Dayanak noktası + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + &Proje + + + + &Sequence + &Sıra + + + + &Folder + &Dosya + + + + Cu&t + + + + + Cop&y + K&opya + + + + &Paste + &Yapıştır + + + + Paste Insert + Yapıştır Ekle + + + + Duplicate + + + + + Delete + Sil + + + + Ripple Delete + Dalgacığı Sil + + + + Split + Böl + + + + Set In Point + Giriş Noktasını Ayarla + + + + Set Out Point + Çıkış Noktasını Ayarla + + + + Reset In Point + Giriş noktasını sıfırla + + + + Reset Out Point + Çıkış Noktasını Sıfırla + + + + Clear In/Out Point + Giriş/Çıkış Noktasını Temizle + + + + Add Default Transition + Varsayılan Geçiş Ekle + + + + Link/Unlink + Bağlantı/Bağlantıyı Kes + + + + Enable/Disable + Etkin/Devredışı + + + + Nest + Yuvarla + + + + Frames + Çerçeve + + + + Drop Frame + Başlangıç Çerçevesi + + + + Non-Drop Frame + Alt Düşmeyen Çerçeve + + + + Milliseconds + Milisaniyeler + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + Genel + + + + Math + + + + + Color + Renk + + + + Filter + + + + + Timeline + Montaj Masası + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + Renk + + + + Matrix + + + + + Text + Metin + + + + Font + Yazıtipi + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + (unknown) - (bilinmiyor) - - - - Missing Effect - Kayıp Efekt + (bilinmiyor) - VolumeEffect + olive::NodeTreeView - + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + Ekle + + + + olive::PanNode + + + + Pan + Panorama + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + + + + + (multiple) + (çoklu) + + + + olive::PathWidget + + + Browse + Göz at + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + Renk + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + Renk + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + Tema + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + Çıkış Cihazı: + + + + Input Device: + Giriş aygıtı: + + + + Sample Rate: + Aynı oran: + + + + Audio Recording: + Ses Kayıt: + + + + Mono + + + + + Stereo + Stereo + + + + Refresh Devices + + + + + Please wait... + + + + + Default + Varsayılan + + + + olive::PreferencesBehaviorTab + + + Behavior + Davranış + + + + General + Genel + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Ses + + + + Enable audio scrubbing + + + + + Timeline + Montaj Masası + + + + Auto-Seek to Imported Clips + Alınan Kliplere Otomatik Arama + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Enable Drag Files to Timeline + + + + + Invert Timeline Scroll Axes + Zaman Çizelgesi Kaydırma Eksenlerini Ters Çevir + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Selecting Also Seeks + + + + + Playback + Yeniden Oynat + + + + Ask For Name When Setting Marker + İşaretleyiciyi Ayarlarken Ad İste + + + + Automatically rewind at the end of a sequence + + + + + Project + Proje + + + + Drop Files on Media to Replace + Medyada Değiştirilecek Dosyaları Bırak + + + + Nodes + + + + + Add Default Effects to New Clips + Yeni Kliplere Varsayılan Efektler Ekleme + + + + Auto-Scale By Default + + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + Ayarlar + + + + General + Genel + + + + Appearance + Görünüm + + + + Behavior + Davranış + + + + Disk + + + + + Audio + Ses + + + + Keyboard + Klavye Kısayolları + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + Dil: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + İşlem veya kısayol ara + + + + Action + Faaliyet + + + + Shortcut + Klavye Kısayol + + + + Import + Dışa Aktar + + + + Export + İhraç + + + + Reset Selected + Seçileni Sıfırla + + + + Reset All + Tümünü Sıfırla + + + + Confirm Reset All Shortcuts + Tüm Kısayolları Sıfırlamayı Onayla + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Tüm klavye kısayollarını varsayılan ayarlarına sıfırlamak istediğinizden emin misiniz? + + + + Import Keyboard Shortcuts + Klavye Kısayollarını İçe Aktar + + + + + Error saving shortcuts + Kısayollar kaydedilirken hata oluştu + + + + Failed to open file for reading + Dosya okumak için açılamadı + + + + Export Keyboard Shortcuts + Klavye Kısayollarını Dışa Aktar + + + + Export Shortcuts + Kısayolları Dışa Aktar + + + + Shortcuts exported successfully + Kısayollar başarıyla verildi + + + + Failed to open file for writing + Dosya yazma için açılamadı + + + + olive::ProgressDialog + + + Cancel + İptal + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &Yeni + + + + &Import... + &Dışa aktar... + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + Gezgin içinde Göster + + + + Reveal in Finder + Bul içinde Göster + + + + Reveal in File Manager + Dosya Yöneticisinde Göster + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + Proje + + + + (none) + + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + Göz at + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + Proje Aç + + + + Save Project + Projeyi Kaydet + + + + Undo + Geri Al + + + + Redo + Yinele + + + + Search media, markers, etc. + Medya, işaretleyiciler vb. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + Ad + + + + Duration + Süre + + + + Rate + Oran + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + Kalın + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + Ad: + + + + New Sequence + Yeni Sıra + + + + Editing "%1" + Kurgu "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Video + + + + Width: + Genişlik: + + + + Height: + Yükseklik: + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + Piksel en boy oranı: + + + + Interlacing: + + + + + Audio + Ses + + + + Sample Rate: + Aynı oran: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + Sıra Görüntüleyici + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + Renk + + + + olive::StringSlider + + + (none) + + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + Renk + + + + Radius + + + + + Opacity + Opaklık + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + Örnek yazı + + + + + Text + Metin + + + + Generate rich text. + + + + + Font + Yazıtipi + + + + Font Size + + + + + Color + Renk + + + + Vertical Align + + + + + Top + + + + + Center + Merkez + + + + Bottom + Alt + + + + olive::TimeBasedPanel + + + (none) + + + + + olive::TimeBasedWidget + + + Set Marker + İşaretçiyi ayarla + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + Montaj Masası + + + + olive::TimelineWidget + + + + Properties + Sahne Özellikleri + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + İşaretçi Aracı + + + + Edit Tool + Düzenleme Aracı + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + Geçiş + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Doğrusal + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + Sinüs + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + Video + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + Hata + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + Yakınlaştır + + + + Fit + Sığdır + + + + %1% + + + + + Full Screen + Tam Ekran Modu + + + + Screen %1: %2x%3 + Ekran %1: %2x%3 + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + Kapalı + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + Volume - Ses Seviyesi - - - - transition - - - Invalid transition - Geçersiz geçiş + Ses Seviyesi - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - Geçiş için aday yok '%1'. Bu geçiş bozuk olabilir. Yeniden kurmayı ya da Olive'i deneyin. + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/uk_UK.ts b/app/ts/uk_UK.ts index 1a0c8e664..4123719ad 100644 --- a/app/ts/uk_UK.ts +++ b/app/ts/uk_UK.ts @@ -2,3812 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive є нелінійним редактором відео. Це програмне забезпечення є вільним і захищено ліцензією GNU GPL. + + %1 Hz + - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Olive Team інформує користувачів про те що джерельний код Olive є доступним для завантаження на сайті проекту. - - - - ActionSearch - - - Search for action... - Знайти дію... - - - - AdvancedVideoDialog - - - Advanced Video Settings - Розширені налаштування відео - - - - Pixel Format: - Формат пікселів: - - - - Threads: - Потоки: - - - - Audio - - - %1 Audio - Уточнити - %1 Аудіо - - - - Recording %1 - Запис %1 - - - - AudioNoiseEffect - - - Amount - Кількість - - - - Mix - Змішування - - - - AutoCutSilenceDialog - - - Cut Silence - Вирізати тишу - - - - Attack Threshold: - Поріг атаки: - - - - Attack Time: - Час атаки: - - - - Release Threshold: - Поріг відновлення: - - - - Release Time: - Час відновлення: - - - - Cacher - - - - Could not open %1 - %2 - Не вдалося відкрити %1 - %2 - - - - ChannelLayoutName - - - Invalid - Уточнити - Некоректний - - - + Mono - Моно + Моно - + Stereo - Стерео + Стерео + + + + 2.1 + 144p {2.1?} + + + + 5.1 + 144p {5.1?} + + + + 7.1 + 144p {7.1?} + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - Уточнити - Параметри "%1" + + Error loading settings + - - Multiple Clip Properties - Уточнити - Параметри множинного кліпа - - - - Name: - Назва: - - - - Duration: - Тривалість: - - - - (multiple) - Уточнити - (множинний) - - - - CollapsibleWidget - - - <untitled> - <без назви> - - - - ColorButton - - - Set Color - Визначити колір - - - - CornerPinEffect - - - Top Left - Верхній Лівий - - - - Top Right - Верхній Правий - - - - Bottom Left - Нижній Лівий - - - - Bottom Right - Нижній Правий - - - - Perspective - Перспектива - - - - DebugDialog - - - Debug Log - Журнал злагодження - - - - DemoNotice - - - - Welcome to Olive! - Ласкаво просимо в Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive є вільним нелінійним редактором відео створеним на умовах ліцензії GNU GPL. Якщо ви платили за це програмне забезпечення, то вас обманули. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Це програмне забезпечення наразі в стадії АЛЬФА і це означає що програма є нестабільною і може працювати некоректно, має помилки та відсутні функції. Ми не несемо відповідальності тож викикористовуйте програму на власний ризик. Будь-ласка, повідомляйте нам про помилки та бажані функції через %1 - - - - Thank you for trying Olive and we hope you enjoy it! - Дякуємо що спробували і маємо надію що вам сподобаєтся Olive! - - - - Effect - - - Invalid effect - Некоректний ефект - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - Відсутній відповідник для ефекту '%1'. Цей ефект можливо пошкоджений. Спробуйте перевстановити його або ж Olive. - - - - Save Effect Settings - Зберегти налаштування ефектів - - - - - Effect XML Settings %1 - Файли з налаштуваннями ефектів %1 - - - - Save Settings Failed - Не вдалося зберегти налаштування - - - - Failed to open "%1" for writing. - Не вдалося відкрити "%1" для запису. - - - - Load Effect Settings - Завантажити налаштування ефектів - - - - - Load Settings Failed - Не вдалося завантажити налаштування - - - - Failed to open "%1" for reading. - Не вдалося відкрити "%1" для зчитування. - - - - This settings file doesn't match this effect. - Цей файл налаштувань не підходить для даного ефекта. - - - - EffectControls - - - (none) - (пусто) - - - - Effects: - Ефекти: - - - - Add Video Effect - Додати відеоефект - - - - VIDEO EFFECTS - ВІДЕОЕФЕКТИ - - - - Add Video Transition - Додати відеоперехід - - - - Add Audio Effect - Додати аудіоефект - - - - AUDIO EFFECTS - АУДІОЕФЕКТИ - - - - Add Audio Transition - Додати аудіоперехід - - - - EffectRow - - - Disable Keyframes - Вимкнути ключові кадри - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Вимкнення ключових кадрів видалить усі існуючі ключові кадри. Ви впевнені що хочете зробити це? - - - - EffectUI - - - %1 (Opening) - Уточнити - %1 (Відкривання) - - - - %1 (Closing) - Уточнити - %1 (Закривання) - - - - %1 (multiple) - Уточнити - %1 (множинний) - - - - Cu&t - Ви&різати - - - - &Copy - &Копіювати - - - - Move &Up - Перемістити В&низ - - - - Move &Down - Перемістити В&гору - - - - D&elete - Ви&далити - - - - Load Settings From File - Завантажити налаштування з файла - - - - Save Settings to File - Зберегти налаштування у файл - - - - EmbeddedFileChooser - - - File: - Файл: - - - - ExportDialog - - - Export "%1" - Експортувати "%1" - - - - Unknown codec name %1 - Невідома назва кодека %1 - - - - Export Failed - Не вдалося експортувати - - - - Export failed - %1 - Не вдалося експортувати - %1 - - - - Invalid dimensions - Некоректні розміри кадра - - - - Export width and height must both be even numbers/divisible by 2. - Для експорту значення ширини та висоти повинні бути цілими парними числами. - - - - Invalid codec - Некоректний кодек - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - Неможливо визначити вихідні параметри для обраного кодека. Це помилка, будь-ласка, зв'яжітся з розробниками. - - - - Invalid format - Некоректний формат - - - - Couldn't determine output format. This is a bug, please contact the developers. - Неможливо визначити вихідний формат. Це помилка, будь-ласка, зв'яжітся з розробниками. - - - - Export Media - Уточнити - Експортувати медіафайл - - - - %p% (Total: %1:%2:%3) - Уточнити - %p% (Загалом: %1:%2:%3) - - - - %p% (ETA: %1:%2:%3) - %p% (Залишилося: %1:%2:%3) - - - - Quality-based (Constant Rate Factor) - Уточнити - Якість (Constant Rate Factor) - - - - Constant Bitrate - Стала швидкість потока - - - - - Invalid Codec - Некоректний кодек - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - Не вдалося знайти відповідний кодувальник для цього кодека. Експорт може бути некоректним. - - - - Failed to find pixel format for this encoder. Export will likely fail. - Не вдалося знайти формат пікселів для цього кодувальника. Експорт може бути некоректним. - - - - Bitrate (Mbps): - Швидкість потока (Мбіт/с): - - - - Quality (CRF): - Якість (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - Коефіцієнт Якості: - -0 = без втрат -17-18 = візульно без втрат (стиснуто, але майже непомітно) -23 = висока якість -51 = найнижча можлива якість +%1 + - - Target File Size (MB): - Кінцевий розмір файла (Мб): + + Error saving settings + - - Format: - Формат: - - - - Range: - Діапазон: - - - - Entire Sequence - Уся послідовність - - - - In to Out - Від входу до виходу - - - - Video - Відео - - - - - Codec: - Кодек: - - - - Width: - Ширина: - - - - Height: - Висота: - - - - Frame Rate: - Частота кадрів: - - - - Compression Type: - Тип cтискання: - - - - Advanced - Додатково - - - - Audio - Аудіо - - - - Sampling Rate: - Частота дискретизації: - - - - Bitrate (Kbps/CBR): - Швидкість потока (Кбіт/с / CBR): + + Failed to save application settings. The application may lack write permissions to this location. + - ExportThread + Footage - - failed to send frame to encoder (%1) - не вдалося надіслати кадр до кодувальника (%1) + + %1 FPS + - - failed to receive packet from encoder (%1) - не вдалося отримати пакет від кодувальника (%1) + + %1 Hz + - - could not video encoder for %1 - не вдалося знайти кодувальник відео для %1 + + Filename: %1 + - - could not allocate video stream - не вдалося встановити поток відео - - - - could not allocate video encoding context - не вдалося встановити контекст кодувльника відео - - - - could not open output video encoder (%1) - не вдалося відкрити вихідний кодувальник відео (%1) - - - - could not copy video encoder parameters to output stream (%1) - не вдалося скопіювати параметри кодувальника відео для вихідного потоку (%1) - - - - could not audio encoder for %1 - не вдалося знайти кодувальник аудіо для %1 - - - - could not allocate audio stream - не вдалося встановити поток аудіо - - - - could not allocate audio encoding context - не вдалося встановити контекст кодувльника аудіо - - - - could not open output audio encoder (%1) - не вдалося відкрити вихідний кодувальник аудіо (%1) - - - - could not copy audio encoder parameters to output stream (%1) - не вдалося скопіювати параметри кодувальника аудіо для вихідного потоку (%1) - - - - could not allocate audio buffer (%1) - не вдалося встановити буфер аудіо (%1) - - - - could not create output format context - не вдалося створити контекст вихідного формату - - - - could not open output file (%1) - не вдалося відкрити вихідний файл (%1) - - - - could not write output file header (%1) - не вдалося записати заголовок вихідного файлу (%1) - - - - could not write output file trailer (%1) - Уточнити - не вдалося записати кінець вихідного файла (%1) + + This footage is not valid for use + - FillLeftRightEffect + ImportTool - - Type - Тип + + Don't ask me again + - - Fill Left with Right - Заповнити лівий канал правим + + No Active Sequence + - - Fill Right with Left - Заповнити правий канал лівим + + No sequence is currently open. Would you like to create one? + + + + + Automatically Detect Parameters From Footage + + + + + Set Parameters Manually + - Frei0rEffect + MoveItemCommand - - Failed to load Frei0r plugin "%1": %2 - Не вдалося завантажити плагін Frei0r "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - ПРИМІТКА: Ви не можете завантажувати 32-розрядні плагіни Frei0r у 64-розрядний Olive. Знайдіть 64-розрядну версію цього плагіна або встановіть 32-розрядну версію Olive. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - ПРИМІТКА: Ви не можете завантажувати 64-розрядні плагіни Frei0r у 32-розрядний Olive. Знайдіть 64-розрядну версію цього плагіна або встановіть 64-розрядну версію Olive. - - - - Error loading Frei0r plugin - Помилка при завантаженні плагіна Frei0r + + Move Item + - GraphEditor + NodeCopyPasteWidget - - Graph Editor - Редактор графів + + Error pasting nodes + - - Linear - Лінійний - - - - Bezier - Безьє - - - - Hold - Уточнити - Стала + + Failed to paste nodes: %1 + - GraphView + NodeFactory - - Zoom to Selection - Масштабувати до виділеного - - - - Zoom to Show All - Масштабувати і показати все - - - - Reset View - Скинути масштабування + + None + - InterlacingName + NodeViewItem - - None (Progressive) - Ні (прогресивно) - - - - Top Field First - Спочатку верхне поле - - - - Bottom Field First - Спочатку нижнє поле - - - - Invalid - Некоректно + + %1... + - KeyframeNavigator + PresetManager - - Enable Keyframes - Увімкнути ключові кадри + + Save Preset + + + + + Set preset name: + + + + + Invalid preset name + + + + + You must enter a preset name + + + + + Preset exists + + + + + A preset with this name already exists. Would you like to replace it? + - KeyframeView + RatioDialog - - Linear - Лінійний + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Bezier - Безьє + + Invalid custom ratio + - - Hold - Уточнити - Стала + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - LabelSlider + RenameItemCommand - - &Edit - &Редагувати - - - - &Reset to Default - Уточнити - &Скинути до стандартних - - - - - Set Value - Встановити значення - - - - - New value: - Нове значення: - - - - LoadDialog - - - Loading... - Завантаження... - - - - Loading '%1'... - Завантажується '%1'... - - - - Cancel - Уточнити - Відміна - - - - LoadThread - - - Version Mismatch - Невідповіність версій - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Цей проект булр збережено в іншій версії Olive, котра неповністью сумісна з наявною версією. Ви все ж хочете спробувати завантажити цей проект? - - - - Invalid Clip Link - Некоректний зв'язок кліпів - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - У проекті виявлено некоректний зв'язок кліпів. Ви хочете продовжити завантаження? - - - - %1 - Line: %2 Col: %3 - %1 - Рядок: %2 Стовпчик: %3 - - - - User aborted loading - Завантаження зупинено користувачем - - - - XML Parsing Error - Помилка розбору XML - - - - Couldn't load '%1'. %2 - Не вдалося завантажити '%1'. %2 - - - - Project Load Error - Помилка при завантаженні проекта - - - - Error loading project: %1 - Помилка при завантаженні проекта: %1 - - - - MainWindow - - - Welcome to %1 - Вітаємо в %1 - - - - &File - &Файл - - - - &New - &Новий - - - - &Open Project - &Відкрити проект - - - - Clear Recent List - Очистити історію - - - - Open Recent - Відкрити недавній - - - - &Save Project - &Зберегти проект - - - - Save Project &As - Зберегти проект &як - - - - &Import... - &Імпортувати... - - - - &Export... - &Експортувати... - - - - E&xit - Ви&хід - - - - &Edit - &Редагування - - - - &Undo - &Відмінити - - - - Redo - Повернути - - - - Select &All - Виділити &усе - - - - Deselect All - Скасувати виділення - - - - Ripple to In Point - Зсунути до точки входу - - - - Ripple to Out Point - Зсунути до точки виходу - - - - Edit to In Point - Редагування до точки входу - - - - Edit to Out Point - Редагування до точки виходу - - - - Delete In/Out Point - Видалити точку входу/виходу - - - - Ripple Delete In/Out Point - Видалити зі зміщенням точку входу/виходу - - - - Set/Edit Marker - Встановити/Редагувати маркер - - - - &View - &Вигляд - - - - Zoom In - Наблизити - - - - Zoom Out - Віддалити - - - - Increase Track Height - Збільшити висоту доріжки - - - - Decrease Track Height - Зменшити висоту доріжки - - - - Toggle Show All - Уточнити - Показувати увесь проект - - - - Track Lines - Лінії доріжок - - - - Rectified Waveforms - Хвильова форма від низу - - - - Frames - Кадри - - - - Drop Frame - З пропусканням кадрів - - - - Non-Drop Frame - Без пропускання кадрів - - - - Milliseconds - Мілісекунди - - - - Title/Action Safe Area - Уточнити - Безпечна зона титрів/ефекта - - - - Off - Вимкнено - - - - Default - Типово - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - Інше - - - - Full Screen - Повноекранний режим - - - - Full Screen Viewer - Перегляд в повноекранному режимі - - - - &Playback - Від&творення - - - - Go to Start - На початок - - - - Previous Frame - Попередній кадр - - - - Play/Pause - Відтворення/Пауза - - - - Play In to Out - Відтворити від входу до виходу - - - - Next Frame - Наступний кадр - - - - Go to End - У кінець - - - - Go to Previous Cut - До попереднього розрізу - - - - Go to Next Cut - До наступного розрізу - - - - Go to In Point - До точки входу - - - - Go to Out Point - До точки виходу - - - - Shuttle Left - Уточнити - Зменшити швидкість - - - - Shuttle Stop - Уточнити - Пауза - - - - Shuttle Right - Уточнити - Збільшити швидкість - - - - Loop - Уточнити - Повторення петлі - - - - &Window - &Вікно - - - - Project - Проект - - - - Effect Controls - Керування ефектами - - - - Timeline - Монтажний стіл - - - - Graph Editor - Редактор графів - - - - Media Viewer - Уточнити - Переглядач медіа файлів - - - - Sequence Viewer - Уточнити - Переглядач послідовності - - - - Maximize Panel - Розгорнути панель - - - - Lock Panels - Зафіксувати панель - - - - Reset to Default Layout - Повернути початкове розташування панелей - - - - &Tools - &Інструменти - - - - Pointer Tool - Уточнити - Вказівник - - - - Edit Tool - Виділення - - - - Ripple Tool - Монтаж зі зсувом - - - - Razor Tool - Підрізка - - - - Slip Tool - Прокручування зі зміщенням - - - - Slide Tool - Прокручування - - - - Hand Tool - Уточнити - Навігація - - - - Transition Tool - Перехід - - - - Enable Snapping - Увімкнути прилипання - - - - Auto-Cut Silence - Автовирізання тиші - - - Selecting Also Seeks - Виділення з прокручуванням - - - Edit Tool Also Seeks - Уточнити - Виділення з прокручуванням - - - Edit Tool Selects Links - Виділення обирає зв'язки - - - Seek Also Selects - Прокручування з виділенням - - - Seek to the End of Pastes - Прокручування до кінця вставок - - - Scroll Wheel Zooms - Уточнити - Колесо миші масштабує монтажний стіл - - - Hold CTRL to toggle this setting - Утримуйте CTRL для перемикання цього налаштування - - - Invert Timeline Scroll Axes - Уточнити - Інвертувати напрямки прокручування монтажного столу - - - Enable Drag Files to Timeline - Уточнити - Увімкнути перетягування файлів на монтажний стіл - - - Auto-Scale By Default - Автомасштабування за умовчанням - - - Enable Seek to Import - Уточнити - Увімкнути прокручування для імпортування - - - Audio Scrubbing - Відтворювати звук під час прокручування - - - Enable Drop on Media to Replace - Уточнити - Увімкнути перетягування на медіа для заміни - - - Enable Hover Focus - Увімкнути фокус наведенням - - - Ask For Name When Setting Marker - Запитувати назву маркера при додаванні - - - - No Auto-Scroll - Без автопрокручування - - - - Page Auto-Scroll - Авторокручування перегортанням - - - - Smooth Auto-Scroll - Плавне автопрокручування - - - - Preferences - Параметри - - - - Clear Undo - Очистити історію змін - - - - &Help - &Довідка - - - - A&ction Search - По&шук дії - - - - Debug Log - Журнал злагодження - - - - &About... - &Про програму... - - - - <untitled> - <без назви> - - - - Marker - - - Set Marker - Встановити маркер - - - - Set clip marker name: - Назва маркера кліпу: - - - - Set sequence marker name: - Назва маркера послідовності: - - - - Media - - - New Folder - Нова тека - - - - Name: - Назва: - - - - Filename: - Ім'я файла: - - - - Video Dimensions: - Розмір кадрів: - - - - Frame Rate: - Частота кадрів: - - - - %1 field(s) (%2 frame(s)) - Уточнити - полів: %1 (кадрів: %2) - - - - Interlacing: - Черезрядковість: - - - - Audio Frequency: - Частота звука: - - - - Audio Channels: - Звукові канали: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - Назва: %1 -Розмір кадрів: %2x%3 -Частота кадрів: %4 -Частота звука: %5 -Звукові канали: %6 - - - - Name - Назва - - - - Duration - Тривалість - - - - Rate - Частота - - - - MediaPropertiesDialog - - - "%1" Properties - Властивості "%1" - - - - Tracks: - Доріжок: - - - - Video %1: %2x%3 %4FPS - Відео %1: %2x%3 %4к/c - - - - Audio %1: %2Hz %3 - Аудіо %1: %2Гц %3 - - - - %n channel(s) - - %n канал - %n канали - %n каналів - - - - - Conform to Frame Rate: - Підігнати до частоти кадрів: - - - - Alpha is Premultiplied - Уточнити - Альфа-значення помножено у зворотньому порядку - - - - Auto (%1) - Авто (%1) - - - - Interlacing: - Черезрядковість: - - - - Name: - Назва: - - - - MenuHelper - - - &Project - &Проект - - - - &Sequence - П&ослідовність - - - - &Folder - Т&ека - - - - Set In Point - Встановити точку входа - - - - Set Out Point - Встановити точку вихода - - - - Reset In Point - Скинути точку входа - - - - Reset Out Point - Скинути точку вихода - - - - Clear In/Out Point - Очистити точку входа/вихода - - - - Add Default Transition - Додати типовий перехід - - - - Link/Unlink - Зв'язати/Прибрати зв'язок - - - - Enable/Disable - Увімкнути/Вимкнути - - - - Nest - Вкласти - - - - Cu&t - Ви&різати - - - - Cop&y - С&копіювати - - - - - &Paste - В&ставити - - - - Paste Insert - Уточнити - Вставити з заміною - - - - Duplicate - Дюблювати - - - - Delete - Видалити - - - - Ripple Delete - Видалити зі зміщенням - - - - Split - Розділити - - - - Invalid aspect ratio - Некоректні пропорції сторін - - - - The aspect ratio '%1' is invalid. Please try again. - Пропорції сторін '%1' є некоректними. Будь-ласка, спробуйте ще раз. - - - - Enter custom aspect ratio - Встановіть інші пропорції сторін - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Встановіть пропорції сторін для безпечної зони титрів/ефекта (наприклад, 16:9): - - - - NewSequenceDialog - - - Editing "%1" - Редагування "%1" - - - - New Sequence - Нова послідовність - - - - Preset: - Уточнити - Профіль: - - - - Film 4K - Фільм 4К - - - - TV 4K (Ultra HD/2160p) - TV 4K (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - Інше - - - - Video - Відео - - - - Width: - Ширина: - - - - Height: - Висота: - - - - Frame Rate: - Частота кадрів: - - - - Pixel Aspect Ratio: - Пропорції сторін пікселів: - - - - Square Pixels (1.0) - Квадратні пікселі (1.0) - - - - Interlacing: - Черезрядковість: - - - - None (Progressive) - Ні (прогресивно) - - - - Audio - Аудіо - - - - Sample Rate: - Частота дискретизації: - - - - Name: - Назва: - - - - OliveGlobal - - - Olive Project %1 - Olive Проект %1 - - - - Auto-recovery - Автовідновлення - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive аварійно завершив роботу і виявив файл автовідновлення. Відкрити його? - - - - Open Project... - Відкрити проект... - - - - Missing recent project - Відсутній недавній проект - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Проект '%1' більше не існує. Видалити його з історії? - - - - Save Project As... - Зберегти проект як... - - - - Unsaved Project - Незбережений проект - - - - This project has changed since it was last saved. Would you like to save it before closing? - Проект було змінено з момента останнього збереження. Хочете зберегти його перед закриттям? - - - - No active sequence - Немає активних послідовностей - - - - Please open the sequence to perform this action. - Відкрийте послідовність для застосування цієї дії. - - - - No clips selected - Не обрано кліпи - - - - Select the clips you wish to auto-cut - Уточнити - Оберіть кліпи для автовирізання - - - Please open the sequence you wish to export. - Будь-ласка, відкрийте послідовність котру хочете експортувати. - - - - Missing Project File - Відсутній файл проекта - - - - Specified project '%1' does not exist. - Вказаний проект '%1' не існує. - - - - PanEffect - - - Pan - Уточнити - Панорама - - - - PreferencesDialog - - - Preferences - Параметри - - - - Default Sequence - Типова послідовність - - - - Invalid CSS File - Некоректний файл CSS - - - - CSS file '%1' does not exist. - Файл CSS '%1' не існує. - - - - Confirm Reset All Shortcuts - Підтвердіть скидання всіх комбінацій клавіш - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - Ви дійсно хочете скинути всі комбінації клавіш до типових значень? - - - - Import Keyboard Shortcuts - Імпортувати комбінації клавіш - - - - - Error saving shortcuts - Помилка при збереженні комбінацій клавіш - - - - Failed to open file for reading - Не вдалося відкрити файл для читання - - - - Export Keyboard Shortcuts - Експортувати комбінації клавіш - - - - Export Shortcuts - Експортувати комбінації клавіш - - - - Shortcuts exported successfully - Комбінації клавіш експортовано - - - - Failed to open file for writing - Не вдалося відкрити файл для запису - - - - Browse for CSS file - Обрати файл CSS - - - - Delete All Previews - Видалити усі мініатюри - - - - Are you sure you want to delete all previews? - Дійсно видалити усі мініатюри? - - - - Previews Deleted - Мініатюри видалено - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - Уточнити - Усі мініатюри видалено. Можливо знадобится перевідкрити поточний проект для того щоб зміни вступили в силу. - - - - Language: - Мова: - - - - Image sequence formats: - Формати зображень: - - - - Thumbnail Resolution: - Розмір мініатюр: - - - - Waveform Resolution: - Деталізація форми хвиль: - - - - Delete Previews - Видалити мініатюри - - - - Use Software Fallbacks When Possible - По можливості використовувати програмну реалізацію - - - - Default Sequence Settings - Типові налаштування послідовності - - - - General - Загальні - - - - Behavior - Поведінка - - - - Add Default Effects to New Clips - Додавати типові ефекти для нових кліпів - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - Автопрокручувати на початок при відворенні з кінця послідовності - - - - Selecting Also Seeks - Виділення з прокручуванням - - - - Edit Tool Also Seeks - Виділення з прокручуванням - - - - Edit Tool Selects Links - Виділення обирає зв'язки - - - - Seek Also Selects - Прокручування з виділенням - - - - Seek to the End of Pastes - Прокручування до кінця вставок - - - - Scroll Wheel Zooms - Колесо миші масштабує монтажний стіл - - - - Hold CTRL to toggle this setting - Утримуйте CTRL для перемикання цього налаштування - - - - Invert Timeline Scroll Axes - Інвертувати напрямки прокручування монтажного столу - - - - Enable Drag Files to Timeline - Уточнити - Увімкнути перетягування файлів на монтажний стіл - - - - Auto-Scale By Default - Автомасштабування за умовчанням - - - - Auto-Seek to Imported Clips - Уточнити - Автопрокручувати до імпортованих кліпів - - - - Audio Scrubbing - Відтворювати звук під час прокручування - - - - Drop Files on Media to Replace - Уточнити - Перетягування файлів на медіа для заміни - - - - Enable Hover Focus - Увімкнути фокус наведенням - - - - Ask For Name When Setting Marker - Запитувати назву маркера при додаванні - - - - Appearance - Вигляд - - - - Theme - Тема - - - - Olive Dark (Default) - Olive Dark (типово) - - - - Olive Light - Olive Light - - - - Native - Уточнити - Native - - - - Native (Light Icons) - Уточнити - Native (світлі іконки) - - - - Use Native Menu Styling - Уточнити - Використовувати стиль меню Native - - - - Custom CSS: - Інший CSS: - - - - Browse - Уточнити - Обрати - - - - Effect Textbox Lines: - Кількість рядків у полі вводу тексту: - - - Seeking - Позиціонування - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - Точне позиціонування -Завжди показувати правильний кадр (відображення може уповільнюватися) - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - Швидке позиціонування -Позиціонувати швидко (можливе неточне відображення кадрів - не впливає на відтворення) - - - - Memory Usage - Використання пам'яті - - - - Upcoming Frame Queue: - Резервування послідуючих кадрів: - - - - - frames - кадрів - - - - - seconds - секунд - - - - Previous Frame Queue: - Резервування попередніх кадрів: - - - - Playback - Відтворення - - - - Output Device: - Пристрій виводу: - - - - - Default - Типово - - - - Input Device: - Пристрій вводу: - - - - Sample Rate: - Частота дискретизації: - - - - Audio Recording: - Запис звука: - - - - Mono - Моно - - - - Stereo - Стерео - - - - Audio - Аудіо - - - - Search for action or shortcut - Знайти дію або комбінацію клавіш - - - - Action - Дія - - - - Shortcut - Комбінація клавіш - - - - Import - Імпортувати - - - - Export - Експортувати - - - - Reset Selected - Скинути виділення - - - - Reset All - Скинути все - - - - Keyboard - Комбінації клавіш - - - - PreviewGenerator - - - Failed to find any valid video/audio streams - Не вдалося знайти коректні відео/аудіо потоки - - - - Could not open file - %1 - Не вдалося відкрити файл — %1 - - - - Could not find stream information - %1 - Не вдалося знайти інформацію потоку — %1 - - - - Project - - - New - Створити - - - - Open Project - Відкрити проект - - - - Save Project - Зберегти проект - - - - Undo - Відмінити - - - - Redo - Повернути - - - - Tree View - У вигляді таблиці - - - - Icon View - У вигляді мініатюр - - - - List View - У вигляді списку - - - - Search media, markers, etc. - Шукати файли, маркери, і т.п. - - - - Project - Проект - - - - Sequence - Послідовність - - - - Replace '%1' - Замінити '%1' - - - - - All Files - Усі файли - - - - - No active sequence - Немає активних послідовностей - - - - No sequence is active, please open the sequence you want to replace clips from. - Немає активних послідовносте. Відкрийте послідовність в якій хочете замінити кліпи. - - - - Active sequence selected - Обрано активну послідовність - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - Уточнити - Ви не можете вставити послідовність в саму себе, тож кліпи з цих файлів не можуть бути вставлені в цю послідовність. - - - - Rename '%1' - Перейменувати '%1' - - - - Enter new name: - Введіть нову назву: - - - - Delete media in use? - Уточнити - Видалити використані у проекті файли? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - Файл '%1' вже використовується у '%2'. Його видалення приведе до видалення усіх його копій у вибраній послідовності. Ви точно цього хочете? - - - - Skip - Пропустити - - - - Import a Project - Імпортувати проект - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" є файлом проекту Olive. Його буде об'єднано з поточним проектом. Ви хочете продовжити? - - - - Image sequence detected - Виявлено послідовність зображень - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - Схоже що файл '%1' є частиною послідовності зображень. Імпортувати його як є? - - - - Import media... - Імпортувати медіафайли... - - - - No sequence is active, please open the sequence you want to delete clips from. - Немає активних послідовносте. Відкрийте послідовність з якої хочете видалити кліпи. - - - - ProxyDialog - - - Create Proxy - Створити проксі - - - - Proxy - Проксі - - - - Dimensions: - Розміри: - - - - Same Size as Source - Оригінальний розмір - - - - Half Resolution (1/2) - Половина оригінала (1/2) - - - - Quarter Resolution (1/4) - Чверть оригіналу (1/4) - - - - Eighth Resolution (1/8) - Восьма оригиніалу (1/8) - - - - Sixteenth Resolution (1/16) - Шістнадцята оригіналу (1/16) - - - - Format: - Формат: - - - - ProRes HQ - ProRes HQ - - - - Location: - Розташування: - - - - Same as Source (in "%1" folder) - Як в оригіналі (у теці "%1") - - - - Proxy file exists - Проксі-файл вже існує - - - - The file "%1" already exists. Do you wish to replace it? - Файл "%1" вже існує. Замінити його? - - - - Custom Location - Інше місцезнаходження - - - - ProxyGenerator - - - Finished generating proxy for "%1" - Завершено створення проксі для "%1" - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - Замінити кліпи на "%1" - - - - Select which media you want to replace this media's clips with: - Оберіть файли, які хочете замінити у кліпах з цими файлами: - - - - Keep the same media in-points - Зберегти існуючі точки входу - - - - Replace - Замінити - - - - Cancel - Відмінити - - - - No media selected - Не обрано медіафайли - - - - Please select a media to replace with or click 'Cancel'. - Оберіть медіафайли для заміни та натисніть «Відміна». - - - - Same media selected - Обрано ті ж самі файли - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - Ви обрали ті ж самі файли, що й хочете замінити. Оберіть якісь інші файли або ж натисніть «Відміна». - - - - Folder selected - Теку обрано - - - - You cannot replace footage with a folder. - Ви не можете замінити відеоряд текою. - - - - Active sequence selected - Обрано активну послідовність - - - - You cannot insert a sequence into itself. - Ви не можете вставити послідовність в саму себе. - - - - RichTextEffect - - - Text - Текст - - - - Padding - Уточнити - Відступ - - - - Position - Позиція - - - - Vertical Align: - Верктикальне вирівнювання: - - - - Top - Вгорі - - - - Center - По центру - - - - Bottom - Внизу - - - - Auto-Scroll - Автопрокручування - - - - Off - Вимкнено - - - - Up - Вгору - - - - Down - Вниз - - - - Left - Вліво - - - - Right - Вправо - - - - Shadow - Тінь - - - - Shadow Color - Колір тіні - - - - Shadow Angle - Кут падіння тіні - - - - Shadow Distance - Відстань до тіні - - - - Shadow Softness - Розсіювання тіні - - - - Shadow Opacity - Непрозорість тіні + + Rename Item + Sequence - - %1 (copy) - %1 (копія) + + %1 FPS + - ShakeEffect + Stream - - Intensity - Інтенсивність + + %1: Audio - %2 Channels, %3Hz + - - Rotation - Обертання + + %1: Unknown + - - Frequency - Частота + + %1: Image - %2x%3 + + + + + %1: Video - %2x%3 + - SolidEffect + TimelineViewBlockItem - - Type - Тип - - - - Solid Color - Суцільна заливка - - - - SMPTE Bars - Таблиця SMPTE - - - - Checkerboard - Шахівниця - - - - Opacity - Непрозорість - - - - Color - Колір - - - - Checkerboard Size - Розмір клітинок - - - - SourcesCommon - - - Import... - Імпортувати... - - - - New - Створити - - - - View - Вигляд - - - - Tree View - У вигляді таблиці - - - - Icon View - У вигляді мініатюр - - - - Show Toolbar - Показувати панель - - - - Show Sequences - Показувати послідовності - - - - Replace/Relink Media - Уточнити - Замінити/Перезв'язати файли - - - - Reveal in Explorer - Відкрити у Explorer - - - - Reveal in Finder - Відкрити у Finder - - - - Reveal in File Manager - Відкрити у менеджері файлів - - - - Replace Clips Using This Media - Уточнити - Замінити кліпи з цими файлами - - - - Create Sequence With This Media - Створити послідовність з цими файлами - - - - Duplicate - Дублювати - - - - Delete All Clips Using This Media - Уточнити - Видалити усі кліпи з цими файлами - - - - Proxy - Проксі - - - - Generating proxy: %1% complete - Створення проксі: завершено на %1% - - - - Create/Modify Proxy - Створити/Змінити проксі - - - - Create Proxy - Створити проксі - - - - Modify Proxy - Змінити проксі - - - - Restore Original - Відновити оригінал - - - - Delete - Видалити - - - - Preview in Media Viewer - Переглянути у Переглядачі медіа файлів - - - - Properties... - Властивості... - - - - Replace Media - Замінити медіафайли - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Ви перетягнули файл на '%1'. Ви хочете замінити на цей файл? - - - - Delete proxy - Видалити проксі - - - - Would you like to delete the proxy file "%1" as well? - Заразом видалити проксі-файл "%1"? - - - - SpeedDialog - - - Speed/Duration - Швидкість/Тривалість - - - - Speed: - Швидкість: - - - - Frame Rate: - Частота кадрів: - - - - Duration: - Тривалість: - - - - Reverse - Реверс - - - - Maintain Audio Pitch - Зберегти висоту тона - - - - Ripple Changes - Змінювати зі зміщенням - - - - TextEditDialog - - - Edit Text - Змінити текст - - - - Thin - Уточнити - Thin - - - - Extra Light - Уточнити - Extra Light - - - - Light - Уточнити - Light - - - - Normal - Уточнити - Normal - - - - Medium - Уточнити - Medium - - - - Demi Bold - Уточнити - Demi Bold - - - - Bold - Уточнити - Bold - - - - Extra Bold - Уточнити - Extra Bold - - - - Black - Уточнити - Black - - - - TextEditEx - - - Edit Text - Редагувати текст - - - - &Edit Text - &Редагувати Текст - - - - TextEffect - - - Text - Текст - - - - Font - Шрифт - - - - Size - Розмір - - - - Color - Колір - - - - Alignment - Вирівнювання - - - - Left - Ліворуч - - - - - Center - По центру - - - - Right - Праворуч - - - - Justify - По ширині - - - - Top - Вгорі - - - - Bottom - Внизу - - - - Word Wrap - Перенесення слів - - - - Padding - Відступ - - - - Position - Позиція - - - - Outline - Контури - - - - Outline Color - Колір контурів - - - - Outline Width - Ширина контурів - - - - Shadow - Тінь - - - - Shadow Color - Колір тіні - - - - Shadow Angle - Кут падіння тіні - - - - Shadow Distance - Відстань до тіні - - - - Shadow Softness - Розсіювання тіні - - - - Shadow Opacity - Непрозорість тіні - - - - Sample Text - Зразок тексту - - - - TimecodeEffect - - - Timecode - Тайм-код - - - - Sequence - Послідовність - - - - Media - Файл - - - - Scale - Масштаб - - - - Color - Колір - - - - Background Color - Колір фону - - - - Background Opacity - Непрозорість фону - - - - Offset - Зміщення - - - - Prepend - Префікс - - - - Timeline - - - Pointer Tool - Вказівник - - - - Edit Tool - Виділення - - - - Ripple Tool - Монтаж зі зміщенням - - - - Razor Tool - Підрізання - - - - Slip Tool - Прокручування зі зміщенням - - - - Slide Tool - Прокручування - - - - Hand Tool - Навігація - - - - Transition Tool - Перехід - - - - Snapping - Прилипання - - - - Zoom In - Наблизити - - - - Zoom Out - Віддалити - - - - Record audio - Запис звука - - - - Add title, solid, bars, etc. - Додати титри, заливку, тестову таблицю, і т.п. - - - - Nested Sequence - Вкладена послідовність - - - - Effect already exists - Ефект уже додано - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - Кліп '%1' уже містить ефект '%2'. Хочете замінити його на вставлюваний чи додати цей ефект як окремий? - - - - Add - Додати - - - - Replace - Замінити - - - - Skip - Пропустити - - - - Do this for all conflicts found - Застосувати для всіх конфліктів - - - - Title... - Титри... - - - - Solid Color... - Суцільна заливка... - - - - Bars... - Тестова таблиця... - - - - Tone... - Звуковой сигнал… - - - - Noise... - Шум... - - - - Unsaved Project - Незбережений проект - - - - You must save this project before you can record audio in it. - Перед записом звука необхідно зберегти проект. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Клікніть на монтажному столі у точці, куди хочете почати запис звука (перетягніть курсор після кліка щоб відразу встановити тривалість запису) - - - - Timeline: - Монтажний стіл: - - - - (none) - (пусто) - - - - TimelineHeader - - - Center Timecodes - Центрувати тайм-код - - - - TimelineWidget - - - &Undo - &Відмінити - - - - &Redo - По&вернути - - - - R&ipple Delete Empty Space - Уточнити - Видалити зі зміщенням порожнє &місце - - - - Sequence Settings - Налаштування послідовності - - - - &Speed/Duration - &Швидкість/Тривалість - - - Auto-s&cale - Авто&масштабування - - - - Auto-Cut Silence - Автовирізання тиші - - - - Auto-S&cale - Авто&масштабування - - - - &Reveal in Project - Уточнити - &Показати у проекті - - - - Properties - Властивості - - - + %1 -Start: %2 -End: %3 -Duration: %4 - %1 -Початок: %2 -Кінець: %3 -Тривалість: %4 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Error - Помилка - - - - Couldn't locate media wrapper for sequence. - Не вдається визначити обробник медіа для послідовності. - - - - Title - Титри - - - - Solid Color - Суцільна заливка - - - + Bars - Тестова таблиця + Тестова таблиця - + + Solid + + + + + Title + Титри + + + Tone - Звуковой сигнал + Звуковой сигнал - - Noise - Шум - - - - Duration: - Тривалість: + + Unknown + - ToneEffect + VideoParams - - Type - Тип + + 8-bit + - - Sine - Синусоїда + + 16-bit Integer + - - Frequency - Частота + + Half-Float (16-bit) + - - Amount - Кількість + + Full-Float (32-bit) + - - Mix - Змішування + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + - TransformEffect + main - - Position - Позиція + + Show this help text + - - Scale - Масштаб + + Show application version + - - Uniform Scale - Пропорційний масштаб + + Start in full-screen mode + - - Rotation - Обертання + + Export only (No GUI) + - - Anchor Point - Якірна точка + + Override language with file + - - Opacity - Непрозорість + + qm-file + - - Blend Mode - Режим змішування - - - - Normal - Звичайний + + Project to open on startup + - Transition + olive::AboutDialog - + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive є нелінійним редактором відео. Це програмне забезпечення є вільним і захищено ліцензією GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive Team інформує користувачів про те що джерельний код Olive є доступним для завантаження на сайті проекту. + + + + olive::ActionSearch + + + Search for action... + Знайти дію... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + Аудіо + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + Length - Тривалість + Тривалість + + + + Media In + + + + + Enabled + + + + + Speed + - UpdateNotification + olive::BlurFilterNode - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - Оновлення доступне на сайті Olive. Відвідайте www.olivevideoeditor.org для завантаження. + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + - VSTHost + olive::ClipBlock - - - Error loading VST plugin - Помилка при завантаженні плагіна VST + + Clip + - Failed to create VST reference - Не вдалося створити зв'язок VST + + A time-based node that represents a media source. + - - Failed to load VST plugin "%1": %2 - Не вдалося завантажити плагін VST "%1": %2 - - - NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - ПРИМІТКА: Ви не можете завантажувати 32-розрядні плагіни VST у 64-розрядний Olive. Знайдіть 64-розрядну версію цього плагіна або встановіть 32-розрядну версію Olive. - - - NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - ПРИМІТКА: Ви не можете завантажувати 64-розрядні плагіни VST у 32-розрядний Olive. Знайдіть 64-розрядну версію цього плагіна або встановіть 64-розрядну версію Olive. - - - - Failed to locate entry point for dynamic library. - Не вдалося визначити вхідну точку для динамічної бібліотеки. - - - - VST Error - Помилка VST - - - - Plugin's magic number is invalid - Магічний номер плагіна некоректний - - - - VST Plugin - Плагін VST - - - - Plugin - Плагін - - - - Interface - Інтерфейс - - - - Show - Показати + + Buffer + - Viewer + olive::ColorDialog - - (none) - (пусто) - - - - Drag video only - Перетягнути лише відео - - - - Drag audio only - Перетягнути лише аудіо - - - - Sequence Viewer - Переглядач послідовності - - - - Media Viewer - Переглядач медіа файлів + + Select Color + - ViewerWidget + olive::ColorSpaceChooser - - Save Frame as Image... - Зберегти кадр як зображення... + + Color Management + - - Show Fullscreen - Повноекранний режим + + Input: + - - Disable - Вимкнути + + Color Space: + - - Screen %1: %2x%3 - Екран %1: %2x%3 + + Display: + - - Zoom - Масштаб + + View: + - + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + Нова тека + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + Зберегти проект + + + + + Error + Помилка + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + Відкрити проект + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + Лінійний + + + + Bezier + Безьє + + + + Hold + Стала + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + Додатково + + + + Pixel + + + + + Pixel Format: + Формат пікселів: + + + + Performance + + + + + Threads: + Потоки: + + + + olive::ExportAudioTab + + + Codec: + Кодек: + + + + Sample Rate: + Частота дискретизації: + + + + Channel Layout: + + + + + Format: + Формат: + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + Ім'я файла: + + + + Browse for exported file filename + + + + + Preset: + Профіль: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + Діапазон: + + + + Entire Sequence + Уся послідовність + + + + In to Out + Від входу до виходу + + + + Format: + Формат: + + + + Export Video + + + + + Export Audio + + + + + Video + Відео + + + + Audio + Аудіо + + + + + Export + Експортувати + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + Ширина: + + + + Height: + Висота: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + Fit - Підігнати + Підігнати - - Custom - Інше + + Stretch + - - Close Media - Закрити файл + + Crop + - - Save Frame - Зберегти кадр + + Frame Rate: + Частота кадрів: - - Viewer Zoom - Масштаб перегляду + + Pixel Aspect Ratio: + Пропорції сторін пікселів: - - Set Custom Zoom Value: - Інше значення масштаба: + + Interlacing: + Черезрядковість: + + + + Quality: + + + + + Codec + + + + + Codec: + Кодек: + + + + Advanced + Додатково - ViewerWindow + olive::FloatSlider - - Exit Fullscreen - Вийти з повноекранного режиму + + %1 dB + + + + + %1% + - VoidEffect + olive::FootagePropertiesDialog - + + "%1" Properties + + + + + Name: + Назва: + + + + Tracks: + Доріжок: + + + + olive::FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + Обрати + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + Усі файли + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + Кінцевий розмір файла (Мб): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + Ні (прогресивно) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + Лінійний + + + + Hold + Стала + + + + Bezier + Безьє + + + + olive::KeyframeViewBase + + + Linear + Лінійний + + + + Bezier + Безьє + + + + Hold + Стала + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + &Зберегти проект + + + + Save Project &As + Зберегти проект &як + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + &Файл + + + + &New + &Новий + + + + &Open Project + &Відкрити проект + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + &Імпортувати... + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + Ви&хід + + + + &Edit + + + + + Insert + + + + + Overwrite + + + + + Select &All + Виділити &усе + + + + Deselect All + Скасувати виділення + + + + Ripple to In Point + Зсунути до точки входу + + + + Ripple to Out Point + Зсунути до точки виходу + + + + Edit to In Point + Редагування до точки входу + + + + Edit to Out Point + Редагування до точки виходу + + + + Delete In/Out Point + Видалити точку входу/виходу + + + + Ripple Delete In/Out Point + Видалити зі зміщенням точку входу/виходу + + + + Set/Edit Marker + Встановити/Редагувати маркер + + + + &View + &Вигляд + + + + Zoom In + Наблизити + + + + Zoom Out + Віддалити + + + + Increase Track Height + Збільшити висоту доріжки + + + + Decrease Track Height + Зменшити висоту доріжки + + + + Toggle Show All + Показувати увесь проект + + + + Full Screen + Повноекранний режим + + + + Full Screen Viewer + Перегляд в повноекранному режимі + + + + &Playback + Від&творення + + + + Go to Start + На початок + + + + Previous Frame + Попередній кадр + + + + Play/Pause + Відтворення/Пауза + + + + Play In to Out + Відтворити від входу до виходу + + + + Next Frame + Наступний кадр + + + + Go to End + У кінець + + + + Go to Previous Cut + До попереднього розрізу + + + + Go to Next Cut + До наступного розрізу + + + + Go to In Point + До точки входу + + + + Go to Out Point + До точки виходу + + + + Shuttle Left + Зменшити швидкість + + + + Shuttle Stop + Пауза + + + + Shuttle Right + Збільшити швидкість + + + + Loop + Повторення петлі + + + + &Sequence + П&ослідовність + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + Розгорнути панель + + + + Lock Panels + Зафіксувати панель + + + + Reset to Default Layout + Повернути початкове розташування панелей + + + + &Tools + &Інструменти + + + + Pointer Tool + Вказівник + + + + Edit Tool + Виділення + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + Прокручування зі зміщенням + + + + Slide Tool + Прокручування + + + + Hand Tool + Навігація + + + + Zoom Tool + + + + + Transition Tool + Перехід + + + + Enable Snapping + Увімкнути прилипання + + + + Preferences + Параметри + + + + &Help + &Довідка + + + + A&ction Search + По&шук дії + + + + Send &Feedback... + + + + + &About... + &Про програму... + + + + olive::MainStatusBar + + + Welcome to %1 %2 + Вітаємо в %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + Вигляд + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + Додати + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + Позиція + + + + Rotation + Обертання + + + + Scale + Масштаб + + + + Uniform Scale + Пропорційний масштаб + + + + Anchor Point + Якірна точка + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + &Проект + + + + &Sequence + П&ослідовність + + + + &Folder + Т&ека + + + + Cu&t + Ви&різати + + + + Cop&y + С&копіювати + + + + &Paste + В&ставити + + + + Paste Insert + Вставити з заміною + + + + Duplicate + + + + + Delete + Видалити + + + + Ripple Delete + Видалити зі зміщенням + + + + Split + Розділити + + + + Set In Point + Встановити точку входа + + + + Set Out Point + Встановити точку вихода + + + + Reset In Point + Скинути точку входа + + + + Reset Out Point + Скинути точку вихода + + + + Clear In/Out Point + Очистити точку входа/вихода + + + + Add Default Transition + Додати типовий перехід + + + + Link/Unlink + Зв'язати/Прибрати зв'язок + + + + Enable/Disable + Увімкнути/Вимкнути + + + + Nest + Вкласти + + + + Frames + Кадри + + + + Drop Frame + З пропусканням кадрів + + + + Non-Drop Frame + Без пропускання кадрів + + + + Milliseconds + Мілісекунди + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + Загальні + + + + Math + + + + + Color + Колір + + + + Filter + + + + + Timeline + Монтажний стіл + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + Колір + + + + Matrix + + + + + Text + Текст + + + + Font + Шрифт + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + Тип + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + (unknown) - (невідомо) - - - - Missing Effect - Відсутній ефект + (невідомо) - VolumeEffect + olive::NodeTreeView - + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + Додати + + + + olive::PanNode + + + + Pan + Панорама + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (пусто) + + + + (multiple) + (множинний) + + + + olive::PathWidget + + + Browse + Обрати + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + Колір + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + Колір + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + Тема + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + Пристрій виводу: + + + + Input Device: + Пристрій вводу: + + + + Sample Rate: + Частота дискретизації: + + + + Audio Recording: + Запис звука: + + + + Mono + Моно + + + + Stereo + Стерео + + + + Refresh Devices + + + + + Please wait... + + + + + Default + Типово + + + + olive::PreferencesBehaviorTab + + + Behavior + Поведінка + + + + General + Загальні + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + Аудіо + + + + Enable audio scrubbing + + + + + Timeline + Монтажний стіл + + + + Auto-Seek to Imported Clips + Автопрокручувати до імпортованих кліпів + + + + Edit Tool Also Seeks + Виділення з прокручуванням + + + + Edit Tool Selects Links + Виділення обирає зв'язки + + + + Enable Drag Files to Timeline + Увімкнути перетягування файлів на монтажний стіл + + + + Invert Timeline Scroll Axes + Інвертувати напрямки прокручування монтажного столу + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + Прокручування з виділенням + + + + Seek to the End of Pastes + Прокручування до кінця вставок + + + + Selecting Also Seeks + Виділення з прокручуванням + + + + Playback + Відтворення + + + + Ask For Name When Setting Marker + Запитувати назву маркера при додаванні + + + + Automatically rewind at the end of a sequence + + + + + Project + Проект + + + + Drop Files on Media to Replace + Перетягування файлів на медіа для заміни + + + + Nodes + + + + + Add Default Effects to New Clips + Додавати типові ефекти для нових кліпів + + + + Auto-Scale By Default + Автомасштабування за умовчанням + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + Параметри + + + + General + Загальні + + + + Appearance + Вигляд + + + + Behavior + Поведінка + + + + Disk + + + + + Audio + Аудіо + + + + Keyboard + Комбінації клавіш + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + Мова: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + Знайти дію або комбінацію клавіш + + + + Action + Дія + + + + Shortcut + Комбінація клавіш + + + + Import + Імпортувати + + + + Export + Експортувати + + + + Reset Selected + Скинути виділення + + + + Reset All + Скинути все + + + + Confirm Reset All Shortcuts + Підтвердіть скидання всіх комбінацій клавіш + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Ви дійсно хочете скинути всі комбінації клавіш до типових значень? + + + + Import Keyboard Shortcuts + Імпортувати комбінації клавіш + + + + + Error saving shortcuts + Помилка при збереженні комбінацій клавіш + + + + Failed to open file for reading + Не вдалося відкрити файл для читання + + + + Export Keyboard Shortcuts + Експортувати комбінації клавіш + + + + Export Shortcuts + Експортувати комбінації клавіш + + + + Shortcuts exported successfully + Комбінації клавіш експортовано + + + + Failed to open file for writing + Не вдалося відкрити файл для запису + + + + olive::ProgressDialog + + + Cancel + + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + &Новий + + + + &Import... + &Імпортувати... + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + Відкрити у Explorer + + + + Reveal in Finder + Відкрити у Finder + + + + Reveal in File Manager + Відкрити у менеджері файлів + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + Проект + + + + (none) + (пусто) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + Обрати + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + Відкрити проект + + + + Save Project + Зберегти проект + + + + Undo + Відмінити + + + + Redo + Повернути + + + + Search media, markers, etc. + Шукати файли, маркери, і т.п. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + Назва + + + + Duration + Тривалість + + + + Rate + Частота + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + Bold + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + Назва: + + + + New Sequence + Нова послідовність + + + + Editing "%1" + Редагування "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + Відео + + + + Width: + Ширина: + + + + Height: + Висота: + + + + Frame Rate: + Частота кадрів: + + + + Pixel Aspect Ratio: + Пропорції сторін пікселів: + + + + Interlacing: + Черезрядковість: + + + + Audio + Аудіо + + + + Sample Rate: + Частота дискретизації: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + Переглядач послідовності + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + Колір + + + + olive::StringSlider + + + (none) + (пусто) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + Колір + + + + Radius + + + + + Opacity + Непрозорість + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + Зразок тексту + + + + + Text + Текст + + + + Generate rich text. + + + + + Font + Шрифт + + + + Font Size + + + + + Color + Колір + + + + Vertical Align + + + + + Top + Вгорі + + + + Center + По центру + + + + Bottom + Внизу + + + + olive::TimeBasedPanel + + + (none) + (пусто) + + + + olive::TimeBasedWidget + + + Set Marker + Встановити маркер + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + Монтажний стіл + + + + olive::TimelineWidget + + + + Properties + Властивості + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + Вказівник + + + + Edit Tool + Виділення + + + + Ripple Tool + + + + + Rolling Tool + + + + + Razor Tool + + + + + Slip Tool + Прокручування зі зміщенням + + + + Slide Tool + Прокручування + + + + Hand Tool + Навігація + + + + Zoom Tool + + + + + Transition Tool + Перехід + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + Лінійний + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + Синусоїда + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + Відео + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + Черезрядковість: + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + Частота кадрів: + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + Помилка + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + Масштаб + + + + Fit + Підігнати + + + + %1% + + + + + Full Screen + Повноекранний режим + + + + Screen %1: %2x%3 + Екран %1: %2x%3 + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + Вимкнено + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + Volume - Гучність - - - - transition - - - Invalid transition - Некоректний перехід + Гучність - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - Немає кандидата для переходу '%1'. Цей перехід може бути некоректний. Спробуйте перевстановити його або ж Olive. + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/zh_CN.ts b/app/ts/zh_CN.ts index b48cd9c50..ca30822e1 100755 --- a/app/ts/zh_CN.ts +++ b/app/ts/zh_CN.ts @@ -2,3758 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive是免费的非线性视频编辑器.基于GNU通用公共许可证(GNU GPL)条款发布. + + %1 Hz + - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Olive团队有义务告知用户可以从官网下载olive的源码.翻译者已尝试用通俗易明的方式进行翻译,希望大家使用愉快.请支持自由开源软件谢谢. - - - - ActionSearch - - - Search for action... - 功能搜索... - - - - AdvancedVideoDialog - - - Advanced Video Settings - 高级视频设置 - - - - Pixel Format: - 视频格式: - - - - Threads: - 线程数量: - - - - Audio - - - %1 Audio - 音频渲染 - %1 音频 - - - - Recording %1 - 录音中 %1 - - - - AudioNoiseEffect - - - Amount - 质量 - - - - Mix - 混合 - - - - AutoCutSilenceDialog - - - Cut Silence - 静噪分离 - - - - Attack Threshold: - 触发阀值: - - - - Attack Time: - 触发时间: - - - - Release Threshold: - 释放阀值: - - - - Release Time: - 释放时间: - - - - Cacher - - - - Could not open %1 - %2 - 无法打开 %1 - %2 - - - - ChannelLayoutName - - - Invalid - 媒体文件损坏或者无效 - 媒体无效 - - - + Mono - 单声道 + 单声道 - + Stereo - 立体声 + 立体声 + + + + 2.1 + 144p {2.1?} + + + + 5.1 + 144p {5.1?} + + + + 7.1 + 144p {7.1?} + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - 处理中 "%1" + + Error loading settings + - - Multiple Clip Properties - 多个片段属性 - - - - Name: - 名称: - - - - Duration: - 片段长度: - - - - (multiple) - 多个特效 - (多个) - - - - CollapsibleWidget - - - <untitled> - <无标题> - - - - ColorButton - - - Set Color - 选择颜色 - - - - CornerPinEffect - - - Top Left - 左上角 - - - - Top Right - 右上角 - - - - Bottom Left - 左下角 - - - - Bottom Right - 右下角 - - - - Perspective - 透视图 - - - - DebugDialog - - - Debug Log - 调试日志 - - - - DemoNotice - - - - Welcome to Olive! - 欢迎来到Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive是一个自由开源的视频编辑器.基于GNU通用公共许可证(GNU GPL)条款发布.如果你购买了这个软件,你就被蒙骗了. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - 这个软件目前处于ALPHA版本的开发阶段,意味着功能尚未稳定并且有漏洞以至于崩溃,功能并不完善.我们不会承担任何责任,所有风险皆自行承担.若发现不足的地方请向此处报告: %1 - - - - Thank you for trying Olive and we hope you enjoy it! - 谢谢您选择Olive,尽情享受吧! - - - - Effect - - - Invalid effect - 无效的特效 - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - 特效无法使用 '%1'. Ц此特效可能已经损坏. 请尝试重新安装Olive. - - - - Save Effect Settings - 保存特效设定档 - - - - - Effect XML Settings %1 - 特效设定中 %1 - - - - Save Settings Failed - 保存设定失败 - - - - Failed to open "%1" for writing. - 无法打开 "%1" 用于写入. - - - - Load Effect Settings - 加载特效设定档 - - - - - Load Settings Failed - 加载设定档失败 - - - - Failed to open "%1" for reading. - 无法打开 "%1" 用于读取. - - - - This settings file doesn't match this effect. - 设定档不匹配于此特效 - - - - EffectControls - - - (none) - (无) - - - - Effects: - 特效: - - - - Add Video Effect - 添加视频效果 - - - - VIDEO EFFECTS - 视频特效 - - - - Add Video Transition - 添加视频转场效果 - - - - Add Audio Effect - 添加音频效果 - - - - AUDIO EFFECTS - 音频效果 - - - - Add Audio Transition - 添加音频转场效果 - - - - EffectRow - - - Disable Keyframes - 禁用关键帧/动画补间 - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - 所有禁用的关键帧/动画补间将会被删除. 确认这么做? - - - - EffectUI - - - %1 (Opening) - 打开特效 - %1 (正在打开) - - - - %1 (Closing) - 关闭特效 - %1 (正在关闭) - - - - %1 (multiple) - 多个特效 - %1 (多个) - - - - Cu&t - 剪切(&T) - - - - &Copy - 复制(&C) - - - - Move &Up - 向上移动(&U) - - - - Move &Down - 向下移动(&D) - - - - D&elete - 删除(&E) - - - - Load Settings From File - 从文件加载设置 - - - - Save Settings to File - 保存设置到文件 - - - - EmbeddedFileChooser - - - File: - 文件: - - - - ExportDialog - - - Export "%1" - 汇出 "%1" - - - - Unknown codec name %1 - 未知的编解码器 %1 - - - - Export Failed - 汇出失败 - - - - Export failed - %1 - 汇出失败 - %1 - - - - Invalid dimensions - 无效的大小 - - - - Export width and height must both be even numbers/divisible by 2. - 导出宽度和高度必须都是偶数/能被2整除. - - - - Invalid codec - 无效的编解码器 - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - 无法确定所选编解码器的输出参数.这是一个bug,请联系开发人员. - - - - Invalid format - 无效的格式 - - - - Couldn't determine output format. This is a bug, please contact the developers. - 无法确定输出格式.这是一个bug,请联系开发人员. - - - - Export Media - 输出媒体 - - - - %p% (Total: %1:%2:%3) - 总量 - %p% (总计: %1:%2:%3) - - - - %p% (ETA: %1:%2:%3) - %p% (估计所需时间: %1:%2:%3) - - - - Quality-based (Constant Rate Factor) - 速率 - 质量(恒定速率因子) - - - - Constant Bitrate - 恒定比特率 - - - - - Invalid Codec - 无效的编解码器 - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - 无法为此格式匹配编解码器.输出有可能会失败. - - - - Failed to find pixel format for this encoder. Export will likely fail. - 未能找到此编码器的像素格式.输出有可能会失败. - - - - Bitrate (Mbps): - 比特率 (Mbp/s): - - - - Quality (CRF): - 质量 (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - 质量因素: - -0 = 无损耗 -17-18 = 无法察觉的损耗 (压缩,但不明显) -23 = 高品质 -51 = 最低品质 - - - - Target File Size (MB): - 输出文件大小 (MB): - - - - Format: - 格式: - - - - Range: - 范围: - - - - Entire Sequence - 整个片段 - - - - In to Out - 已选择的时间段 - - - - Video - 视频 - - - - - Codec: - 编解码器: - - - - Width: - 宽度: - - - - Height: - 高度: - - - - Frame Rate: - 帧率: - - - - Compression Type: - 压缩类型: - - - - Advanced - 高级 - - - - Audio - 音频 - - - - Sampling Rate: - 采样率: - - - - Bitrate (Kbps/CBR): - 比特率 ((Kbps/CBR): - - - - ExportThread - - - failed to send frame to encoder (%1) - 发送帧到编码器失败 (%1) - - - - failed to receive packet from encoder (%1) - 无法从编码器接收数据包 (%1) - - - - could not video encoder for %1 - 无视频编解码器 %1 - - - - could not allocate video stream - 无法分配视频流 - - - - could not allocate video encoding context - 无法分配视频编码上下文 - - - - could not open output video encoder (%1) - 无法打开输出视频编码器 (%1) - - - - could not copy video encoder parameters to output stream (%1) - 无法将视频编码器参数复制到输出流 (%1) - - - - could not audio encoder for %1 - не вдалося знайти кодувальник аудіо для %1 - - - - could not allocate audio stream - 无法分配音频流 - - - - could not allocate audio encoding context - 无法分配音频编码上下文 - - - - could not open output audio encoder (%1) - 无法打开输出音频编码器 (%1) - - - - could not copy audio encoder parameters to output stream (%1) - 无法将音频编码器参数复制到输出流 (%1) - - - - could not allocate audio buffer (%1) - 无法分配音频缓冲区 (%1) - - - - could not create output format context - 无法分配音频缓冲区 - - - - could not open output file (%1) - 无法打开输出文件 (%1) - - - - could not write output file header (%1) - 无法写入输出文件标题 (%1) - - - - could not write output file trailer (%1) - 无法写入输出文件 - 无法写入输出文件预告片 (%1) - - - - FillLeftRightEffect - - - Type - 类型 - - - - Fill Left with Right - 从左到右填满 - - - - Fill Right with Left - 从右到左填满 - - - - Frei0rEffect - - - Failed to load Frei0r plugin "%1": %2 - 无法加载 плагін 插件 "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - 警告:您不能将32位的Frei0r插件加载到64位的Olive构建中.请找到这个插件的64位版本或切换到32位的Olive构建版本. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - 警告:您不能将64位的Frei0r插件加载到32位的Olive构建中.请找到这个插件的32位版本或切换到64位构建的Olive. - - - - Error loading Frei0r plugin - 加载Frei0插件时发生错误 - - - - GraphEditor - - - Graph Editor - 图形编辑器 - - - - Linear - 线性 - - - - Bezier - 贝塞尔曲线 - - - - Hold - 保留 - - - - GraphView - - - Zoom to Selection - 缩放选择 - - - - Zoom to Show All - 放大显示所有 - - - - Reset View - 重置视图 - - - - InterlacingName - - - None (Progressive) - 无 (进度) - - - - Top Field First - 顶端区域优先 - - - - Bottom Field First - 底部区域优先 - - - - Invalid - 无效 - - - - KeyframeNavigator - - - Enable Keyframes - 开启关键帧/动画补间 - - - - KeyframeView - - - Linear - 线性 - - - - Bezier - 贝塞尔曲线 - - - - Hold - 保留 - - - - LabelSlider - - - &Edit - 输入值(&E) - - - - &Reset to Default - 重置为默认(&R) - - - - - Set Value - 设定值 - - - - - New value: - 新值: - - - - LoadDialog - - - Loading... - 加载中... - - - - Loading '%1'... - 加载中 '%1'... - - - - Cancel - 取消 - - - - LoadThread - - - Version Mismatch - 版本不匹配 - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - 此项目用Olive的另一个版本保存,可能与此版本不完全兼容.无论如何,您想尝试加载它吗? - - - - Invalid Clip Link - 无效的视频链接 - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - 此项目包含无效的剪辑链接.可能已经损坏.您要继续装吗? - - - - %1 - Line: %2 Col: %3 - %1 - 行: %2 列: %3 - - - - User aborted loading - 用户终止加载 - - - - XML Parsing Error - XML解析错误 - - - - Couldn't load '%1'. %2 - 无法加载%1'. %2 - - - - Project Load Error - 项目加载错误 - - - - Error loading project: %1 - 加载项目是发生错误: %1 - - - - MainWindow - - - Welcome to %1 - 欢迎来到 %1 - - - - &File - 文件(&F) - - - - &New - 新建(&N) - - - - &Open Project - 打开项目(&O) - - - - Clear Recent List - 清除最近的列表 - - - - Open Recent - 打开最近的列表 - - - - &Save Project - 保存项目(&S) - - - - Save Project &As - 保存项目为(&A) - - - - &Import... - 输入(&I) - - - - &Export... - 输出(&E) - - - - E&xit - 退出(&I) - - - - &Edit - 编辑(&E) - - - - &Undo - 撤销(&U) - - - - Redo - 重做 - - - - Select &All - 选择全部(&A) - - - - Deselect All - 取消选择所有 - - - - Ripple to In Point +%1 - - Ripple to Out Point + + Error saving settings - - Edit to In Point + + Failed to save application settings. The application may lack write permissions to this location. - - - Edit to Out Point - - - - - Delete In/Out Point - 删除标记的区域 - - - - Ripple Delete In/Out Point - - - - - Set/Edit Marker - 设置/编辑标记 - - - - &View - 视图(&V) - - - - Zoom In - 放大 - - - - Zoom Out - 缩小 - - - - Increase Track Height - 增加轨道高度 - - - - Decrease Track Height - 降低轨道高度 - - - - Toggle Show All - 轨道全部显示 - - - - Track Lines - 轨道线 - - - - Rectified Waveforms - 整流波形 - - - - Frames - - - - - Drop Frame - 丢失的帧 - - - - - Non-Drop Frame - 保留的帧 - - - - - Milliseconds - 毫秒 - - - - Title/Action Safe Area - 字幕/行动安全区域 - - - - Off - 关闭 - - - - Default - 默认 - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - 自定义 - - - - Full Screen - 全屏 - - - - Full Screen Viewer - 全屏预览 - - - - &Playback - 回放(&P) - - - - Go to Start - 回到起始帧 - - - - Previous Frame - 前一帧 - - - - Play/Pause - 播放/暂停 - - - - Play In to Out - 播放已标记的区域 - - - - Next Frame - 下一帧 - - - - Go to End - 转到结束帧 - - - - Go to Previous Cut - 切换到之前的位置 - - - - Go to Next Cut - 转到下一个位置 - - - - Go to In Point - 转到时间的起始标记处 - - - - Go to Out Point - 转到时间的结束标记处 - - - - Shuttle Left - 向左播放 - - - - Shuttle Stop - 停止播放 - - - - Shuttle Right - 向右播放 - - - - Loop - 循环播放 - - - - &Window - 窗口(&W) - - - - Project - 项目 - - - - Effect Controls - 效果控制 - - - - Timeline - 时间轴 - - - - Graph Editor - 图形编辑器 - - - - Media Viewer - 媒体查看器 - - - - Sequence Viewer - 片段查看器 - - - - Maximize Panel - 最大化面板 - - - - Lock Panels - 锁定面板 - - - - Reset to Default Layout - 重置为默认布局 - - - - &Tools - 工具(&T) - - - - Pointer Tool - 选择/移动/默认 - - - - Edit Tool - 选择部分 - - - - Ripple Tool - 涟漪的工具 - - - - Razor Tool - 剪刀 - - - - Slip Tool - 滑动工具 - - - - Slide Tool - 幻灯片工具 - - - - Hand Tool - 移动时间轴 - - - - Transition Tool - 转场/过渡效果 - - - - Enable Snapping - 开启边缘吸合/自动对齐 - - - - Auto-Cut Silence - 噪声分离 - - - Selecting Also Seeks - - - - Edit Tool Also Seeks - - - - Edit Tool Selects Links - - - - Seek Also Selects - - - - Seek to the End of Pastes - - - - Scroll Wheel Zooms - - - - Hold CTRL to toggle this setting - 按住CTRL切换至此设置 - - - Invert Timeline Scroll Axes - 反转时间轴滚动轴 - - - Enable Drag Files to Timeline - 启用拖动文件到时间轴 - - - Auto-Scale By Default - 默认情况下自动缩放 - - - Enable Seek to Import - - - - Audio Scrubbing - 拖动音频同时播放 - - - Enable Drop on Media to Replace - 开启拖动到媒体上面后替换该媒体 - - - Enable Hover Focus - 启用悬停焦点 - - - Ask For Name When Setting Marker - 设置标记时询问名称 - - - - No Auto-Scroll - 关闭时间轴自动滚动 - - - - Page Auto-Scroll - 页面时间轴自动滚动 - - - - Smooth Auto-Scroll - 时间轴自动平滑滚动 - - - - Preferences - 首选项 - - - - Clear Undo - 清除撤消 - - - - &Help - 帮助(&H) - - - - A&ction Search - 功能查找(&C) - - - - Debug Log - 调试日志 - - - - &About... - 关于(&A) - - - - <untitled> - <无标题> - - Marker + Footage - - Set Marker - 设置标记 - - - - Set clip marker name: - 设置该剪辑标记的名称: - - - - Set sequence marker name: - 设置序列标记名称: - - - - Media - - - New Folder - 新建文件夹 - - - - Name: - 名称: - - - - Filename: - 文件名: - - - - Video Dimensions: - 视频大小: - - - - Frame Rate: - 帧速率: - - - - %1 field(s) (%2 frame(s)) + + %1 FPS - - Interlacing: + + %1 Hz - - Audio Frequency: - 音频频率: - - - - Audio Channels: - 音频通道: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - 名称: %1 -视频大小: %2x%3 -帧率:: %4 -音频: %5 -音频布局: %6 - - - - Name - 名称 - - - - Duration - 持续时间 - - - - Rate - 速率 - - - - MediaPropertiesDialog - - - "%1" Properties - 属性 "%1" - - - - Tracks: - 轨道: - - - - Video %1: %2x%3 %4FPS - 视频 %1: %2x%3 %4FPS - - - - Audio %1: %2Hz %3 - 音频 %1: %2Hz %3 - - - - %n channel(s) - - %n 通道 - - - - - Conform to Frame Rate: - 符合帧率: - - - - Alpha is Premultiplied + + Filename: %1 - - Auto (%1) - 自动 (%1) + + This footage is not valid for use + + + + ImportTool - - Interlacing: + + Don't ask me again - - Name: - 名称: - - - - MenuHelper - - - &Project - 项目(&P) - - - - &Sequence - 片段(&S) - - - - &Folder - 目录(&F) - - - - Set In Point - 设置时间的起始标记 - - - - Set Out Point - 设置时间的结束标记 - - - - Reset In Point - 重置时间的起始标记 - - - - Reset Out Point - 重置时间的结束标记 - - - - Clear In/Out Point - 清除时间标记 - - - - Add Default Transition - 添加默认的转场效果 - - - - Link/Unlink - 链接/取消链接音频和视频 - - - - Enable/Disable - 启用/禁用 - - - - Nest - 嵌套 - - - - Cu&t - 剪切(&T) - - - - Cop&y - 复制(&Y) - - - - - &Paste - 粘帖(&P) - - - - Paste Insert - 插入式粘贴 - - - - Duplicate - 复制 - - - - Delete - 删除 - - - - Ripple Delete - 抽出片段并删除 - - - - Split - 切断 - - - - Invalid aspect ratio - 无效的长宽比 - - - - The aspect ratio '%1' is invalid. Please try again. - 长宽比无效 '%1', 请再试一次. - - - - Enter custom aspect ratio - 输入自定义纵横比 - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - 输入字幕/动作安全区使用的纵横比 (例子, 16:9): - - - - NewSequenceDialog - - - Editing "%1" - 编辑中 "%1" - - - - New Sequence - 新片段 - - - - Preset: - 预置: - - - - Film 4K - 4k电影 - - - - TV 4K (Ultra HD/2160p) - 4K电视 (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - 自定义 - - - - Video - 视频 - - - - Width: - 宽度: - - - - Height: - 高度: - - - - Frame Rate: - 帧速率: - - - - Pixel Aspect Ratio: - 像素长宽比 - - - - Square Pixels (1.0) - 像素长宽比 (1.0) - - - - Interlacing: + + No Active Sequence - - None (Progressive) + + No sequence is currently open. Would you like to create one? - - Audio - 音频 - - - - Sample Rate: - 采样率: - - - - Name: - 名称: - - - - OliveGlobal - - - Olive Project %1 - Olive 项目 %1 - - - - Auto-recovery - 自动恢复 - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive没有被正确关闭并检测到一个自动恢复文件,你要打开吗? - - - - Open Project... - 打开项目... - - - - Missing recent project - 缺少最近的项目 - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - 这个项目 '%1' 已经不存在了。您想把它从最近的项目列表中删除吗? - - - - Save Project As... - 保存项目为... - - - - Unsaved Project - 未保存的项目 - - - - This project has changed since it was last saved. Would you like to save it before closing? - 这个项目自从上次保存以来已经发生了变化,您想在关门前保存吗? - - - - No active sequence - 没有已激活的片段 - - - - Please open the sequence to perform this action. - 请打开片段以执行这个功能. - - - - No clips selected - 没有剪辑被选择 - - - - Select the clips you wish to auto-cut - 选择剪辑以自动剪裁 - - - Please open the sequence you wish to export. - 请打开要输出的片段. - - - - Missing Project File - В丢失的项目文件 - - - - Specified project '%1' does not exist. - 指定的项目 '%1' 未找到. - - - - PanEffect - - - Pan - 左右平衡/平移 - - - - PreferencesDialog - - - Preferences - 首选项 - - - - Default Sequence - 默认片段 - - - - Invalid CSS File - 无效的CSS文件 - - - - CSS file '%1' does not exist. - CSS文件 '%1' 不存在. - - - - Confirm Reset All Shortcuts - 确认重置所有快捷键 - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - 您确定要将所有键盘快捷键重置为默认值吗? - - - - Import Keyboard Shortcuts - 导入键盘快捷键配置 - - - - - Error saving shortcuts - 保存键盘快捷键是发生错误 - - - - Failed to open file for reading - 无法读取文件 - - - - Export Keyboard Shortcuts - 汇出键盘快捷键配置 - - - - Export Shortcuts - 汇出快捷键 - - - - Shortcuts exported successfully - 快捷键成功汇出 - - - - Failed to open file for writing - 无法写入文件 - - - - Browse for CSS file - 浏览CSS文件 - - - - Delete All Previews - 删除所有预览 - - - - Are you sure you want to delete all previews? - 您确定要删除所有预览吗? - - - - Previews Deleted - 预览成功删除 - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - 所有预览成功删除,重新打开当前项目以生效. - - - - Language: - 语言: - - - - Image sequence formats: - 图形片段个是: - - - - Thumbnail Resolution: - 缩略图分辨率: - - - - Waveform Resolution: - 音频波形分辨率 - - - - Delete Previews - 删除预览 - - - - Use Software Fallbacks When Possible - 尽量用软件回放 - - - - Default Sequence Settings - 默认的片段设置 - - - - General - 一般 - - - - Behavior - 行为 - - - - Add Default Effects to New Clips - 添加默认效果到新的剪辑 - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - 当播放结束后自动回到开始位置 - - - - Selecting Also Seeks - 选择并查找 - - - - Edit Tool Also Seeks + + Automatically Detect Parameters From Footage - - Edit Tool Selects Links + + Set Parameters Manually + + + + + MoveItemCommand + + + Move Item + + + + + NodeCopyPasteWidget + + + Error pasting nodes - - Seek Also Selects + + Failed to paste nodes: %1 + + + + + NodeFactory + + + None + + + + + NodeViewItem + + + %1... + + + + + PresetManager + + + Save Preset - - Seek to the End of Pastes + + Set preset name: - - Scroll Wheel Zooms - 滚轮缩放 + + Invalid preset name + - - Hold CTRL to toggle this setting - CTRL键和滚轮同时使用实现同样的效果 + + You must enter a preset name + - - Invert Timeline Scroll Axes - 反转时间轴滚动轴 + + Preset exists + - - Enable Drag Files to Timeline - 开启拖放文件到时间轴 - - - - Auto-Scale By Default - 默认情况下自动缩放 - - - - Auto-Seek to Imported Clips - 自动寻找并导入剪辑 - - - - Audio Scrubbing - 拖动音频同时播放 - - - - Drop Files on Media to Replace - 拖放文件以代替媒体 - - - - Enable Hover Focus - 启用悬停焦点 - - - - Ask For Name When Setting Marker - 设置标记时询问名称 - - - - Appearance - 外观 - - - - Theme - 主题 - - - - Olive Dark (Default) - Olive 暗色 (默认) - - - - Olive Light - Olive 明亮 - - - - Native - 原生 - - - - Native (Light Icons) - 原生 (明亮图标) - - - - Use Native Menu Styling - 使用原生菜单风格 - - - - Custom CSS: - 自定义 CSS: - - - - Browse - 浏览 - - - - Effect Textbox Lines: - 文本框线效果: - - - Seeking - 查找中 - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - 精准查找 -总是显示当前按的帧 (视觉可能会在检索到正确的帧时暂停) - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - 快速查找 -查找得更快 (搜索时可能会短暂显示不准确的帧—不影响回放/导出) - - - - Memory Usage - 内存使用 - - - - Upcoming Frame Queue: - 即将到来的帧队列: - - - - - frames - - - - - - seconds - - - - - Previous Frame Queue: - 前一帧队列: - - - - Playback - 回放 - - - - Output Device: - 输出设备: - - - - - Default - 默认 - - - - Input Device: - 输入设备: - - - - Sample Rate: - 采样率: - - - - Audio Recording: - 音频录制: - - - - Mono - 单声道 - - - - Stereo - 立体声 - - - - Audio - 音频 - - - - Search for action or shortcut - 搜索功能或者快捷键 - - - - Action - 功能 - - - - Shortcut - 快捷键 - - - - Import - 输入 - - - - Export - 汇出 - - - - Reset Selected - 重新选择 - - - - Reset All - 全部重设 - - - - Keyboard - 键盘 + + A preset with this name already exists. Would you like to replace it? + - PreviewGenerator + RatioDialog - - Failed to find any valid video/audio streams - 未能找到任何有效的视频/音频流 + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Could not open file - %1 - 无法打开文件 — %1 + + Invalid custom ratio + - - Could not find stream information - %1 - 无法找到流信息 — %1 + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - Project + RenameItemCommand - - New - 新建 - - - - Open Project - 打开项目 - - - - Save Project - 保存项目 - - - - Undo - 撤销 - - - - Redo - 重做 - - - - Tree View - 详细视图 - - - - Icon View - 缩略图 - - - - List View - 列表视图 - - - - Search media, markers, etc. - 搜索媒体,标记等. - - - - Project - 项目 - - - - Sequence - 片段 - - - - Replace '%1' - 代替 '%1' - - - - - All Files - 全部文件 - - - - - No active sequence - 没有已激活的片段 - - - - No sequence is active, please open the sequence you want to replace clips from. - 没有片段处于激活状态,请打开要代替剪辑的片段. - - - - Active sequence selected - 激活选择的片段 - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - 无法插入该片段至自己当中,所以这个媒体的剪辑不会在这个片段中. - - - - Rename '%1' - 重命名 '%1' - - - - Enter new name: - 输入新的名称: - - - - Delete media in use? - 删除使用中的媒体? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - 此媒体 '%1' 正在被使用于 '%2'. 删除它将删除片段中的所有实例. В你确定你要这么做吗? - - - - Skip - 跳过 - - - - Import a Project - 导入一个项目 - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" 是Olive项目文件. 它将与这个项目合并. 你想继续吗? - - - - Image sequence detected - 图像片段检测 - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - 该文件 '%1' 似乎是图像片段中的一部分. 您要按原样代替吗? - - - - Import media... - 输入媒体... - - - - No sequence is active, please open the sequence you want to delete clips from. - 没有片段处于激活状态,请打开要从中删除剪辑的片段. - - - - ProxyDialog - - - Create Proxy - 创建代理 - - - - Proxy - 代理 - - - - Dimensions: - 大小: - - - - Same Size as Source - 使用与来源相同的大小 - - - - Half Resolution (1/2) - 一半的分辨率 (1/2) - - - - Quarter Resolution (1/4) - 四分之一的分辨率 (1/4) - - - - Eighth Resolution (1/8) - 八分之一的分辨率 (1/8) - - - - Sixteenth Resolution (1/16) - 十六分之一的分辨率 (1/16) - - - - Format: - 个格式: - - - - ProRes HQ - ProRes HQ - - - - Location: - 位置: - - - - Same as Source (in "%1" folder) - 使用与来源相同的大小 (在 "%1" 目录) - - - - Proxy file exists - 代理文件存在 - - - - The file "%1" already exists. Do you wish to replace it? - 该文件 "%1" 已经存在. 你想代替它吗? - - - - Custom Location - 自定义路径 - - - - ProxyGenerator - - - Finished generating proxy for "%1" - 完成生成代理 "%1" - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - 取代剪辑使用 "%1" - - - - Select which media you want to replace this media's clips with: - 选择要替换此媒体的媒体: - - - - Keep the same media in-points - 保持相同的媒体插入点 - - - - Replace - 取代 - - - - Cancel - 取消 - - - - No media selected - 没有已选择的媒体 - - - - Please select a media to replace with or click 'Cancel'. - 请选择一个媒体替代或取消. - - - - Same media selected - 相同的媒体被选择 - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - 你选择了相同的媒体代替.请选择其他或者取消. - - - - Folder selected - 目录选择 - - - - You cannot replace footage with a folder. - 您无法用文件夹替换素材. - - - - Active sequence selected - 激活的片段已经被选择 - - - - You cannot insert a sequence into itself. - 无法插入该片段至自己当中. - - - - RichTextEffect - - - Text - 文本格式 - - - - Padding - 填充 - - - - Position - 位置 - - - - Vertical Align: - 垂直对齐: - - - - Top - 顶部 - - - - Center - 中心点 - - - - Bottom - 底下 - - - - Auto-Scroll - 自动卷动 - - - - Off - 关闭 - - - - Up - - - - - Down - - - - - Left - - - - - Right - - - - - Shadow - 阴影 - - - - Shadow Color - 阴影颜色 - - - - Shadow Angle - 阴影角度 - - - - Shadow Distance - 阴影距离 - - - - Shadow Softness - 阴影柔软化 - - - - Shadow Opacity - 阴影透明度 + + Rename Item + Sequence - - %1 (copy) - %1 (复制) - - - - ShakeEffect - - - Intensity - 强度 - - - - Rotation - 旋转 - - - - Frequency - 频率 - - - - SolidEffect - - - Type - 类型 - - - - Solid Color - 纯色 - - - - SMPTE Bars - - - - - Checkerboard - - - - - Opacity - 透明度 - - - - Color - 颜色 - - - - Checkerboard Size + + %1 FPS - SourcesCommon + Stream - - Import... - 输入... - - - - New - 新建 - - - - View - 视图 - - - - Tree View - 树视图 - - - - Icon View - 图标视图 - - - - Show Toolbar - 显示工具栏 - - - - Show Sequences - 显示片段 - - - - Replace/Relink Media - 替换/重新链接媒体 - - - - Reveal in Explorer - 在浏览器中预览 - - - - Reveal in Finder - 在查找当中预览 - - - - Reveal in File Manager - 在文件管理器中预览 - - - - Replace Clips Using This Media - 使用此媒体替换剪辑 - - - - Create Sequence With This Media - 使用此媒体创建片段 - - - - Duplicate - 复制 - - - - Delete All Clips Using This Media - 删除所有使用此问题的剪辑 - - - - Proxy - 代理 - - - - Generating proxy: %1% complete - 生成代理: %1% 完成 - - - - Create/Modify Proxy - 创建/修改代理 - - - - Create Proxy - 创建代理 - - - - Modify Proxy - 修改代理 - - - - Restore Original - 还原为原始尺寸 - - - - Delete - 删除 - - - - Preview in Media Viewer - 在媒体浏览器中预览 - - - - Properties... - 属性... - - - - Replace Media - 取代媒体 - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - 你拖放了一个文件到 '%1'. 你要取代它吗? - - - - Delete proxy - 删除代理 - - - - Would you like to delete the proxy file "%1" as well? - 您要删除代理文件吗 "%1"? - - - - SpeedDialog - - - Speed/Duration - 速度/持续时间 - - - - Speed: - 速度: - - - - Frame Rate: - 帧速率: - - - - Duration: - 持续时间: - - - - Reverse - 反向 - - - - Maintain Audio Pitch - 保持音频音调 - - - - Ripple Changes - 波纹变化 - - - - TextEditDialog - - - Edit Text - 编辑文本格式 - - - - Thin - - - - - Extra Light - 加亮 - - - - Light - - - - - Normal - 正常 - - - - Medium - 中等 - - - - Demi Bold + + %1: Audio - %2 Channels, %3Hz - - Bold - 粗体 - - - - Extra Bold - 加粗 - - - - Black - - - - - TextEditEx - - - Edit Text - 编辑文本 - - - - &Edit Text - 编辑文本(&E) - - - - TextEffect - - - Text - 文本 - - - - Font - 字体 - - - - Size - 大小 - - - - Color - 颜色 - - - - Alignment - 校准 - - - - Left - - - - - - Center - 中心 - - - - Right - - - - - Justify - 整理版面 - - - - Top - 顶部 - - - - Bottom - 底下 - - - - Word Wrap - 自动换行 - - - - Padding - 填充 - - - - Position - 位置 - - - - Outline - 轮廓 - - - - Outline Color - 轮廓颜色 - - - - Outline Width - 轮廓宽 - - - - Shadow - 阴影 - - - - Shadow Color - 阴影颜色 - - - - Shadow Angle - 阴影角度 - - - - Shadow Distance - 阴影距离 - - - - Shadow Softness - 阴影柔软化 - - - - Shadow Opacity - 阴影透明度 - - - - Sample Text - 文字样本 - - - - TimecodeEffect - - - Timecode + + %1: Unknown - - Sequence - 片段 + + %1: Image - %2x%3 + - - Media - 媒体 - - - - Scale - 缩放 - - - - Color - 颜色 - - - - Background Color - 背景颜色 - - - - Background Opacity - 背景透明度 - - - - Offset - 补偿 - - - - Prepend - 前置 + + %1: Video - %2x%3 + - Timeline + TimelineViewBlockItem - - Pointer Tool - 选择/移动/默认 - - - - Edit Tool - 选择部分 - - - - Ripple Tool - 涟漪的工具 - - - - Razor Tool - 剪刀 - - - - Slip Tool - 滑动工具 - - - - Slide Tool - 幻灯片工具 - - - - Hand Tool - 手形工具 - - - - Transition Tool - 过度/转场效果 - - - - Snapping - 边缘吸合/自动对齐 - - - - Zoom In - 放大 - - - - Zoom Out - 缩小 - - - - Record audio - 录制声音 - - - - Add title, solid, bars, etc. - 添加字幕,实体,栏等. - - - - Nested Sequence - 嵌套的片段 - - - - Effect already exists - 特效已经存在 - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - 剪辑 '%1' 已经包含了 '%2'效果. 您是想替换它,还是作为单独的效果加入? - - - - Add - 添加 - - - - Replace - 取代 - - - - Skip - 跳过 - - - - Do this for all conflicts found - 对所有发现的冲突都这样做吗 - - - - Title... - 字幕... - - - - Solid Color... - 单色... - - - - Bars... - 栏... - - - - Tone... - 增强… - - - - Noise... - 噪音... - - - - Unsaved Project - 未保存的项目 - - - - You must save this project before you can record audio in it. - 必须先保存此项目,才能在其中录制音频. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - 单击要开始录制的时间轴(拖动可将录制限制在某个时间段) - - - - Timeline: - 时间轴: - - - - (none) - (无) - - - - TimelineHeader - - - Center Timecodes - 以时间区间/点显示 - - - - TimelineWidget - - - &Undo - 撤销(&U) - - - - &Redo - 重做(&R) - - - - R&ipple Delete Empty Space - 连接片段/去除空白空间(&I) - - - - Sequence Settings - 片段设置 - - - - &Speed/Duration - 速度/持续时间(&S) - - - Auto-s&cale - 自动缩放(&C) - - - - Auto-Cut Silence - 噪声分离 - - - - Auto-S&cale - 自动缩放(&C) - - - - &Reveal in Project - 在项目库中显示(&R) - - - - Properties - 属性 - - - + %1 -Start: %2 -End: %3 -Duration: %4 - %1 -起点: %2 -终止: %3 -持续时间: %4 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Error - 错误 - - - - Couldn't locate media wrapper for sequence. - 无法找到片段的媒体包装器. - - - - Title - 字幕 - - - - Solid Color - 单色 - - - + Bars - + - + + Solid + + + + + Title + 字幕 + + + Tone - - Noise - 噪音 - - - - Duration: - 持续时间: + + Unknown + - ToneEffect + VideoParams - - Type - 类型 + + 8-bit + - - Sine - 正弦 + + 16-bit Integer + - - Frequency - 频率 + + Half-Float (16-bit) + - - Amount - 数量 + + Full-Float (32-bit) + - - Mix - 混合 + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + - TransformEffect + main - - Position - 位置 + + Show this help text + - - Scale - 缩放 + + Show application version + - - Uniform Scale - 统一缩放的大小 + + Start in full-screen mode + - - Rotation - 旋转 + + Export only (No GUI) + - - Anchor Point - 锚点 + + Override language with file + - - Opacity - 透明度 + + qm-file + - - Blend Mode - 混合模式 - - - - Normal - 标准 + + Project to open on startup + - Transition + olive::AboutDialog - + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive是免费的非线性视频编辑器.基于GNU通用公共许可证(GNU GPL)条款发布. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive团队有义务告知用户可以从官网下载olive的源码.翻译者已尝试用通俗易明的方式进行翻译,希望大家使用愉快.请支持自由开源软件谢谢. + + + + olive::ActionSearch + + + Search for action... + 功能搜索... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + 音频 + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + Length - 长度 + 长度 + + + + Media In + + + + + Enabled + + + + + Speed + - UpdateNotification + olive::BlurFilterNode - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - 发现新版本.请访问www.olivevideoeditor.org下载. + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + - VSTHost + olive::ClipBlock - - - Error loading VST plugin - 加载VST插件按时发生错误 + + Clip + - Failed to create VST reference - 无法创建VST参考 + + A time-based node that represents a media source. + - - Failed to load VST plugin "%1": %2 - 无法加载VST插件 "%1": %2 - - - NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - 警告: 您不能将32位VST插件加载到64位Olive构建中。请找到这个插件的64位版本或切换到32位的Olive构建版本. - - - NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - 警告: 您不能将64位VST插件加载到32位Olive构建中。请找到这个插件的32位版本或切换到64位的Olive构建版本. - - - - Failed to locate entry point for dynamic library. - 未能找到动态库的入口点. - - - - VST Error - VST发生错误 - - - - Plugin's magic number is invalid - 插件的幻数无效 - - - - VST Plugin - VST插件 - - - - Plugin - 插件 - - - - Interface - 用户界面 - - - - Show - 显示 + + Buffer + - Viewer + olive::ColorDialog - - (none) - (无) - - - - Drag video only - 只拖放视频 - - - - Drag audio only - 只拖放音频 - - - - Sequence Viewer - 片段预览 - - - - Media Viewer - 媒体预览 + + Select Color + - ViewerWidget + olive::ColorSpaceChooser - - Save Frame as Image... - 保存帧为图像... + + Color Management + - - Show Fullscreen - 全屏模式 + + Input: + - - Disable - 关闭 + + Color Space: + - - Screen %1: %2x%3 - 放映 %1: %2x%3 + + Display: + - - Zoom - 缩放 + + View: + - + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + 新建文件夹 + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + 保存项目 + + + + + Error + 错误 + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + 打开项目 + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + 线性 + + + + Bezier + 贝塞尔曲线 + + + + Hold + 保留 + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + 高级 + + + + Pixel + + + + + Pixel Format: + 视频格式: + + + + Performance + + + + + Threads: + 线程数量: + + + + olive::ExportAudioTab + + + Codec: + 编解码器: + + + + Sample Rate: + 采样率: + + + + Channel Layout: + + + + + Format: + + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + 文件名: + + + + Browse for exported file filename + + + + + Preset: + 预置: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + 范围: + + + + Entire Sequence + 整个片段 + + + + In to Out + 已选择的时间段 + + + + Format: + + + + + Export Video + + + + + Export Audio + + + + + Video + 视频 + + + + Audio + 音频 + + + + + Export + 汇出 + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + 宽度: + + + + Height: + 高度: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + Fit - 适合 + 适合 - - Custom - 自定义 + + Stretch + - - Close Media - 关闭媒体 + + Crop + - - Save Frame - 保存帧 + + Frame Rate: + - - Viewer Zoom - 预览缩放 + + Pixel Aspect Ratio: + 像素长宽比 - - Set Custom Zoom Value: - 设置自己定义缩放: + + Interlacing: + + + + + Quality: + + + + + Codec + + + + + Codec: + 编解码器: + + + + Advanced + 高级 - ViewerWindow + olive::FloatSlider - - Exit Fullscreen - 退出全屏 + + %1 dB + + + + + %1% + - VoidEffect + olive::FootagePropertiesDialog - + + "%1" Properties + + + + + Name: + 名称: + + + + Tracks: + 轨道: + + + + olive::FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + 浏览 + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + 全部文件 + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + 输出文件大小 (MB): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + 无 (进度) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + 线性 + + + + Hold + 保留 + + + + Bezier + 贝塞尔曲线 + + + + olive::KeyframeViewBase + + + Linear + 线性 + + + + Bezier + 贝塞尔曲线 + + + + Hold + 保留 + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + 保存项目(&S) + + + + Save Project &As + 保存项目为(&A) + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + 文件(&F) + + + + &New + 新建(&N) + + + + &Open Project + 打开项目(&O) + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + 输入(&I) + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + 退出(&I) + + + + &Edit + + + + + Insert + + + + + Overwrite + + + + + Select &All + 选择全部(&A) + + + + Deselect All + 取消选择所有 + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + 删除标记的区域 + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + 设置/编辑标记 + + + + &View + 视图(&V) + + + + Zoom In + 放大 + + + + Zoom Out + 缩小 + + + + Increase Track Height + 增加轨道高度 + + + + Decrease Track Height + 降低轨道高度 + + + + Toggle Show All + 轨道全部显示 + + + + Full Screen + 全屏 + + + + Full Screen Viewer + 全屏预览 + + + + &Playback + 回放(&P) + + + + Go to Start + 回到起始帧 + + + + Previous Frame + 前一帧 + + + + Play/Pause + 播放/暂停 + + + + Play In to Out + 播放已标记的区域 + + + + Next Frame + 下一帧 + + + + Go to End + 转到结束帧 + + + + Go to Previous Cut + 切换到之前的位置 + + + + Go to Next Cut + 转到下一个位置 + + + + Go to In Point + 转到时间的起始标记处 + + + + Go to Out Point + 转到时间的结束标记处 + + + + Shuttle Left + 向左播放 + + + + Shuttle Stop + 停止播放 + + + + Shuttle Right + 向右播放 + + + + Loop + 循环播放 + + + + &Sequence + 片段(&S) + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + 最大化面板 + + + + Lock Panels + 锁定面板 + + + + Reset to Default Layout + 重置为默认布局 + + + + &Tools + 工具(&T) + + + + Pointer Tool + 选择/移动/默认 + + + + Edit Tool + 选择部分 + + + + Ripple Tool + 涟漪的工具 + + + + Rolling Tool + + + + + Razor Tool + 剪刀 + + + + Slip Tool + 滑动工具 + + + + Slide Tool + 幻灯片工具 + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Enable Snapping + 开启边缘吸合/自动对齐 + + + + Preferences + 首选项 + + + + &Help + 帮助(&H) + + + + A&ction Search + 功能查找(&C) + + + + Send &Feedback... + + + + + &About... + 关于(&A) + + + + olive::MainStatusBar + + + Welcome to %1 %2 + 欢迎来到 %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + 视图 + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + 添加 + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + 位置 + + + + Rotation + 旋转 + + + + Scale + 缩放 + + + + Uniform Scale + 统一缩放的大小 + + + + Anchor Point + 锚点 + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + 项目(&P) + + + + &Sequence + 片段(&S) + + + + &Folder + 目录(&F) + + + + Cu&t + 剪切(&T) + + + + Cop&y + 复制(&Y) + + + + &Paste + 粘帖(&P) + + + + Paste Insert + 插入式粘贴 + + + + Duplicate + 复制 + + + + Delete + 删除 + + + + Ripple Delete + 抽出片段并删除 + + + + Split + 切断 + + + + Set In Point + 设置时间的起始标记 + + + + Set Out Point + 设置时间的结束标记 + + + + Reset In Point + 重置时间的起始标记 + + + + Reset Out Point + 重置时间的结束标记 + + + + Clear In/Out Point + 清除时间标记 + + + + Add Default Transition + 添加默认的转场效果 + + + + Link/Unlink + 链接/取消链接音频和视频 + + + + Enable/Disable + 启用/禁用 + + + + Nest + 嵌套 + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + 毫秒 + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + 一般 + + + + Math + + + + + Color + 颜色 + + + + Filter + + + + + Timeline + 时间轴 + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + 颜色 + + + + Matrix + + + + + Text + + + + + Font + 字体 + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + 类型 + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + (unknown) - (未知) - - - - Missing Effect - 缺失特效 + (未知) - VolumeEffect + olive::NodeTreeView - + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + 添加 + + + + olive::PanNode + + + + Pan + 左右平衡/平移 + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (无) + + + + (multiple) + (多个) + + + + olive::PathWidget + + + Browse + 浏览 + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + 颜色 + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + 颜色 + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + 主题 + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + 输出设备: + + + + Input Device: + 输入设备: + + + + Sample Rate: + 采样率: + + + + Audio Recording: + 音频录制: + + + + Mono + 单声道 + + + + Stereo + 立体声 + + + + Refresh Devices + + + + + Please wait... + + + + + Default + 默认 + + + + olive::PreferencesBehaviorTab + + + Behavior + 行为 + + + + General + 一般 + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + 音频 + + + + Enable audio scrubbing + + + + + Timeline + 时间轴 + + + + Auto-Seek to Imported Clips + 自动寻找并导入剪辑 + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Enable Drag Files to Timeline + + + + + Invert Timeline Scroll Axes + 反转时间轴滚动轴 + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Selecting Also Seeks + 选择并查找 + + + + Playback + 回放 + + + + Ask For Name When Setting Marker + 设置标记时询问名称 + + + + Automatically rewind at the end of a sequence + + + + + Project + 项目 + + + + Drop Files on Media to Replace + 拖放文件以代替媒体 + + + + Nodes + + + + + Add Default Effects to New Clips + 添加默认效果到新的剪辑 + + + + Auto-Scale By Default + 默认情况下自动缩放 + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + 首选项 + + + + General + 一般 + + + + Appearance + 外观 + + + + Behavior + 行为 + + + + Disk + + + + + Audio + 音频 + + + + Keyboard + 键盘 + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + 语言: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + 搜索功能或者快捷键 + + + + Action + 功能 + + + + Shortcut + 快捷键 + + + + Import + 输入 + + + + Export + 汇出 + + + + Reset Selected + 重新选择 + + + + Reset All + 全部重设 + + + + Confirm Reset All Shortcuts + 确认重置所有快捷键 + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + 您确定要将所有键盘快捷键重置为默认值吗? + + + + Import Keyboard Shortcuts + 导入键盘快捷键配置 + + + + + Error saving shortcuts + 保存键盘快捷键是发生错误 + + + + Failed to open file for reading + 无法读取文件 + + + + Export Keyboard Shortcuts + 汇出键盘快捷键配置 + + + + Export Shortcuts + 汇出快捷键 + + + + Shortcuts exported successfully + 快捷键成功汇出 + + + + Failed to open file for writing + 无法写入文件 + + + + olive::ProgressDialog + + + Cancel + 取消 + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + 新建(&N) + + + + &Import... + 输入(&I) + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + 在浏览器中预览 + + + + Reveal in Finder + 在查找当中预览 + + + + Reveal in File Manager + 在文件管理器中预览 + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + 项目 + + + + (none) + (无) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + 浏览 + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + 打开项目 + + + + Save Project + 保存项目 + + + + Undo + 撤销 + + + + Redo + 重做 + + + + Search media, markers, etc. + 搜索媒体,标记等. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + 名称 + + + + Duration + 持续时间 + + + + Rate + 速率 + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + 粗体 + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + 名称: + + + + New Sequence + 新片段 + + + + Editing "%1" + 编辑中 "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + 视频 + + + + Width: + 宽度: + + + + Height: + 高度: + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + 像素长宽比 + + + + Interlacing: + + + + + Audio + 音频 + + + + Sample Rate: + 采样率: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + 颜色 + + + + olive::StringSlider + + + (none) + (无) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + 颜色 + + + + Radius + + + + + Opacity + 透明度 + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + 文字样本 + + + + + Text + + + + + Generate rich text. + + + + + Font + 字体 + + + + Font Size + + + + + Color + 颜色 + + + + Vertical Align + + + + + Top + 顶部 + + + + Center + + + + + Bottom + 底下 + + + + olive::TimeBasedPanel + + + (none) + (无) + + + + olive::TimeBasedWidget + + + Set Marker + 设置标记 + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + 时间轴 + + + + olive::TimelineWidget + + + + Properties + 属性 + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + 选择/移动/默认 + + + + Edit Tool + 选择部分 + + + + Ripple Tool + 涟漪的工具 + + + + Rolling Tool + + + + + Razor Tool + 剪刀 + + + + Slip Tool + 滑动工具 + + + + Slide Tool + 幻灯片工具 + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + 线性 + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + 正弦 + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + 视频 + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + 错误 + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + 缩放 + + + + Fit + 适合 + + + + %1% + + + + + Full Screen + 全屏 + + + + Screen %1: %2x%3 + 放映 %1: %2x%3 + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + 关闭 + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + Volume - 音量 - - - - transition - - - Invalid transition - 无效的转场效果 + 音量 - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - 没有适合做转场效果的条件 '%1'. 该效果的插件可能已经损坏. 请尝试重新安装它或者Olive. + + Adjusts the volume of an audio source. + + + + + Samples + diff --git a/app/ts/zh_TW.ts b/app/ts/zh_TW.ts index e784bb2bc..bf22b0f39 100755 --- a/app/ts/zh_TW.ts +++ b/app/ts/zh_TW.ts @@ -2,3758 +2,4766 @@ - AboutDialog + AudioParams - - Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive是免費的非線性視頻編輯器.基于GNU通用公共許可證(GNU GPL)條款發佈. + + %1 Hz + - - Olive Team is obliged to inform users that Olive source code is available for download from its website. - Olive團隊有義務告知用戶可以從官網下載olive的源碼.翻譯者已嘗試用通俗易明的方式進行翻譯,希望大家使用愉快.請支持自由開源軟件謝謝. - - - - ActionSearch - - - Search for action... - 功能搜索... - - - - AdvancedVideoDialog - - - Advanced Video Settings - 高級視頻設置 - - - - Pixel Format: - 視頻格式: - - - - Threads: - 綫程數量: - - - - Audio - - - %1 Audio - 音頻渲染 - %1 音頻 - - - - Recording %1 - 錄音中 %1 - - - - AudioNoiseEffect - - - Amount - 質量 - - - - Mix - 混合 - - - - AutoCutSilenceDialog - - - Cut Silence - 靜噪分離 - - - - Attack Threshold: - 觸發閥值: - - - - Attack Time: - 觸發時間: - - - - Release Threshold: - 釋放閥值: - - - - Release Time: - 釋放時間: - - - - Cacher - - - - Could not open %1 - %2 - 無法打開 %1 - %2 - - - - ChannelLayoutName - - - Invalid - 媒體檔案損壞或者無效 - 媒體無效 - - - + Mono - 單聲道 + 單聲道 - + Stereo - 立體聲 + 立體聲 + + + + 2.1 + 144p {2.1?} + + + + 5.1 + 144p {5.1?} + + + + 7.1 + 144p {7.1?} + + + + Unknown (0x%1) + - ClipPropertiesDialog + Config - - "%1" Properties - 處理中 "%1" + + Error loading settings + - - Multiple Clip Properties - 多個片段屬性 - - - - Name: - 名稱: - - - - Duration: - 片段長度: - - - - (multiple) - 多個特效 - (多個) - - - - CollapsibleWidget - - - <untitled> - <無標題> - - - - ColorButton - - - Set Color - 選擇顏色 - - - - CornerPinEffect - - - Top Left - 左上角 - - - - Top Right - 右上角 - - - - Bottom Left - 左下角 - - - - Bottom Right - 右下角 - - - - Perspective - 透視圖 - - - - DebugDialog - - - Debug Log - 調試日誌 - - - - DemoNotice - - - - Welcome to Olive! - 歡迎來到Olive! - - - - Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive是一個自由開源的視頻編輯器.基于GNU通用公共許可證(GNU GPL)條款發佈.如果你購買了這個軟件,你就被矇騙了. - - - - This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - 這個軟件目前處于ALPHA版本的開發階段,意味着功能尚未穩定並且有漏洞以至于崩潰,功能並不完善.我們不會承擔任何責任,所有風險皆自行承擔.若發現不足的地方請向此處報告: %1 - - - - Thank you for trying Olive and we hope you enjoy it! - 謝謝您選擇Olive,盡情享受吧! - - - - Effect - - - Invalid effect - 無效的特效 - - - - No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - 特效無法使用 '%1'. Ц此特效可能已經損壞. 請嘗試重新安裝Olive. - - - - Save Effect Settings - 保存特效設定檔 - - - - - Effect XML Settings %1 - 特效設定中 %1 - - - - Save Settings Failed - 保存設定失敗 - - - - Failed to open "%1" for writing. - 無法打開 "%1" 用於寫入. - - - - Load Effect Settings - 加載特效設定檔 - - - - - Load Settings Failed - 加載設定檔失敗 - - - - Failed to open "%1" for reading. - 無法打開 "%1" 用於讀取. - - - - This settings file doesn't match this effect. - 設定檔不匹配于此特效 - - - - EffectControls - - - (none) - (無) - - - - Effects: - 特效: - - - - Add Video Effect - 添加視頻效果 - - - - VIDEO EFFECTS - 視頻特效 - - - - Add Video Transition - 添加視頻轉場效果 - - - - Add Audio Effect - 添加音頻效果 - - - - AUDIO EFFECTS - 音頻效果 - - - - Add Audio Transition - 添加音頻轉場效果 - - - - EffectRow - - - Disable Keyframes - 禁用關鍵幀/動畫補間 - - - - Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - 所有禁用的關鍵幀/動畫補間將會被刪除. 確認這麼做? - - - - EffectUI - - - %1 (Opening) - 打開特效 - %1 (正在打開) - - - - %1 (Closing) - 關閉特效 - %1 (正在關閉) - - - - %1 (multiple) - 多個特效 - %1 (多個) - - - - Cu&t - 剪切(&T) - - - - &Copy - 複製(&C) - - - - Move &Up - 向上移動(&U) - - - - Move &Down - 向下移動(&D) - - - - D&elete - 刪除(&E) - - - - Load Settings From File - 從檔案加載設置 - - - - Save Settings to File - 保存設置到檔案 - - - - EmbeddedFileChooser - - - File: - 檔案: - - - - ExportDialog - - - Export "%1" - 匯出 "%1" - - - - Unknown codec name %1 - 未知的編解碼器 %1 - - - - Export Failed - 匯出失敗 - - - - Export failed - %1 - 匯出失敗 - %1 - - - - Invalid dimensions - 無效的大小 - - - - Export width and height must both be even numbers/divisible by 2. - 導出寬度和高度必須都是偶數/能被2整除. - - - - Invalid codec - 無效的編解碼器 - - - - Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - 無法確定所選編解碼器的輸出參數.這是一個bug,請聯繫開發人員. - - - - Invalid format - 無效的格式 - - - - Couldn't determine output format. This is a bug, please contact the developers. - 無法確定輸出格式.這是一個bug,請聯繫開發人員. - - - - Export Media - 匯出媒體 - - - - %p% (Total: %1:%2:%3) - 總量 - %p% (總計: %1:%2:%3) - - - - %p% (ETA: %1:%2:%3) - %p% (估計所需時間: %1:%2:%3) - - - - Quality-based (Constant Rate Factor) - 速率 - 質量(恆定速率因子) - - - - Constant Bitrate - 恆定比特率 - - - - - Invalid Codec - 無效的編解碼器 - - - - Failed to find a suitable encoder for this codec. Export will likely fail. - 無法為此格式匹配編解碼器.輸出有可能會失敗. - - - - Failed to find pixel format for this encoder. Export will likely fail. - 未能找到此編碼器的像素格式.輸出有可能會失敗. - - - - Bitrate (Mbps): - 比特率 (Mbp/s): - - - - Quality (CRF): - 質量 (CRF): - - - - Quality Factor: + + Failed to load application settings. This session will use defaults. -0 = lossless -17-18 = visually lossless (compressed, but unnoticeable) -23 = high quality -51 = lowest quality possible - 質量因素: - -0 = 無損耗 -17-18 = 無法察覺的損耗 (壓縮,但不明顯) -23 = 高品質 -51 = 最低品質 - - - - Target File Size (MB): - 輸出檔案大小 (MB): - - - - Format: - 格式: - - - - Range: - 範圍: - - - - Entire Sequence - 整個片段 - - - - In to Out - 已選擇的時間段 - - - - Video - 視頻 - - - - - Codec: - 編解碼器: - - - - Width: - 寬度: - - - - Height: - 高度: - - - - Frame Rate: - 幀率: - - - - Compression Type: - 壓縮類型: - - - - Advanced - 高級 - - - - Audio - 音頻 - - - - Sampling Rate: - 採樣率: - - - - Bitrate (Kbps/CBR): - 比特率 ((Kbps/CBR): - - - - ExportThread - - - failed to send frame to encoder (%1) - 發送幀到編碼器失敗 (%1) - - - - failed to receive packet from encoder (%1) - 無法從編碼器接收數據包 (%1) - - - - could not video encoder for %1 - 無視頻編解碼器 %1 - - - - could not allocate video stream - 無法分配視頻流 - - - - could not allocate video encoding context - 無法分配視頻編碼上下文 - - - - could not open output video encoder (%1) - 無法打開輸出視頻編碼器 (%1) - - - - could not copy video encoder parameters to output stream (%1) - 無法將視頻編碼器參數複製到輸出流 (%1) - - - - could not audio encoder for %1 - не вдалося знайти кодувальник аудіо для %1 - - - - could not allocate audio stream - 無法分配音頻流 - - - - could not allocate audio encoding context - 無法分配音頻編碼上下文 - - - - could not open output audio encoder (%1) - 無法打開輸出音頻編碼器 (%1) - - - - could not copy audio encoder parameters to output stream (%1) - 無法將音頻編碼器參數複製到輸出流 (%1) - - - - could not allocate audio buffer (%1) - 無法分配音頻緩衝區 (%1) - - - - could not create output format context - 無法分配音頻緩衝區 - - - - could not open output file (%1) - 無法打開輸出檔案 (%1) - - - - could not write output file header (%1) - 無法寫入輸出檔案標題 (%1) - - - - could not write output file trailer (%1) - 無法寫入輸出檔案 - 無法寫入輸出檔案預告片 (%1) - - - - FillLeftRightEffect - - - Type - 類型 - - - - Fill Left with Right - 從左到右填滿 - - - - Fill Right with Left - 從右到左填滿 - - - - Frei0rEffect - - - Failed to load Frei0r plugin "%1": %2 - 無法加載 плагін 插件 "%1": %2 - - - NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - 警告:您不能將32位的Frei0r插件加載到64位的Olive構建中.請找到這個插件的64位版本或切換到32位的Olive構建版本. - - - NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - 警告:您不能將64位的Frei0r插件加載到32位的Olive構建中.請找到這個插件的32位版本或切換到64位構建的Olive. - - - - Error loading Frei0r plugin - 加載Frei0插件時發生錯誤 - - - - GraphEditor - - - Graph Editor - 圖形編輯器 - - - - Linear - 線性 - - - - Bezier - 貝塞爾曲綫 - - - - Hold - 保留 - - - - GraphView - - - Zoom to Selection - 縮放選擇 - - - - Zoom to Show All - 放大顯示所有 - - - - Reset View - 重置視圖 - - - - InterlacingName - - - None (Progressive) - 無 (進度) - - - - Top Field First - 頂端區域優先 - - - - Bottom Field First - 底部區域優先 - - - - Invalid - 無效 - - - - KeyframeNavigator - - - Enable Keyframes - 開啟關鍵幀/動畫補間 - - - - KeyframeView - - - Linear - 線性 - - - - Bezier - 貝塞爾曲綫 - - - - Hold - 保留 - - - - LabelSlider - - - &Edit - 輸入值(&E) - - - - &Reset to Default - 重置為預設(&R) - - - - - Set Value - 設定值 - - - - - New value: - 新值: - - - - LoadDialog - - - Loading... - 加載中... - - - - Loading '%1'... - 加載中 '%1'... - - - - Cancel - 取消 - - - - LoadThread - - - Version Mismatch - 版本不匹配 - - - - This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - 此項目用Olive的另一個版本保存,可能與此版本不完全兼容.無論如何,您想嘗試加載它嗎? - - - - Invalid Clip Link - 無效的視頻連結 - - - - This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - 此項目包含無效的剪輯連結.可能已經損壞.您要繼續裝嗎? - - - - %1 - Line: %2 Col: %3 - %1 - 行: %2 列: %3 - - - - User aborted loading - 用戶終止加載 - - - - XML Parsing Error - XML解析錯誤 - - - - Couldn't load '%1'. %2 - 無法加載%1'. %2 - - - - Project Load Error - 項目加載錯誤 - - - - Error loading project: %1 - 加載項目是發生錯誤: %1 - - - - MainWindow - - - Welcome to %1 - 歡迎來到 %1 - - - - &File - 檔案(&F) - - - - &New - 新建(&N) - - - - &Open Project - 打開項目(&O) - - - - Clear Recent List - 清除最近的列表 - - - - Open Recent - 打開最近的列表 - - - - &Save Project - 保存項目(&S) - - - - Save Project &As - 保存項目為(&A) - - - - &Import... - 匯入(&I) - - - - &Export... - 匯出(&E) - - - - E&xit - 退出(&I) - - - - &Edit - 編輯(&E) - - - - &Undo - 撤銷(&U) - - - - Redo - 重做 - - - - Select &All - 選擇全部(&A) - - - - Deselect All - 取消選擇所有 - - - - Ripple to In Point +%1 - - Ripple to Out Point + + Error saving settings - - Edit to In Point + + Failed to save application settings. The application may lack write permissions to this location. - - - Edit to Out Point - - - - - Delete In/Out Point - 刪除標記的區域 - - - - Ripple Delete In/Out Point - - - - - Set/Edit Marker - 設置/編輯標記 - - - - &View - 視圖(&V) - - - - Zoom In - 放大 - - - - Zoom Out - 縮小 - - - - Increase Track Height - 增加軌道高度 - - - - Decrease Track Height - 降低軌道高度 - - - - Toggle Show All - 軌道全部顯示 - - - - Track Lines - 軌道綫 - - - - Rectified Waveforms - 整流波形 - - - - Frames - - - - - Drop Frame - 丟失的幀 - - - - - Non-Drop Frame - 保留的幀 - - - - - Milliseconds - 毫秒 - - - - Title/Action Safe Area - 字幕/行動安全區域 - - - - Off - 關閉 - - - - Default - 預設 - - - - 4:3 - 4:3 - - - - 16:9 - 16:9 - - - - Custom - 自定義 - - - - Full Screen - 全屏 - - - - Full Screen Viewer - 全屏預覽 - - - - &Playback - 回放(&P) - - - - Go to Start - 回到起始幀 - - - - Previous Frame - 前一幀 - - - - Play/Pause - 播放/暫停 - - - - Play In to Out - 播放已標記的區域 - - - - Next Frame - 下一幀 - - - - Go to End - 轉到結束幀 - - - - Go to Previous Cut - 切換到之前的位置 - - - - Go to Next Cut - 轉到下一個位置 - - - - Go to In Point - 轉到時間的起始標記處 - - - - Go to Out Point - 轉到時間的結束標記處 - - - - Shuttle Left - 向左播放 - - - - Shuttle Stop - 停止播放 - - - - Shuttle Right - 向右播放 - - - - Loop - 循環播放 - - - - &Window - 窗口(&W) - - - - Project - 項目 - - - - Effect Controls - 效果控制 - - - - Timeline - 時間軸 - - - - Graph Editor - 圖形編輯器 - - - - Media Viewer - 媒體查看器 - - - - Sequence Viewer - 片段查看器 - - - - Maximize Panel - 最大化面板 - - - - Lock Panels - 鎖定面板 - - - - Reset to Default Layout - 重置為預設佈局 - - - - &Tools - 工具(&T) - - - - Pointer Tool - 選擇/移動/預設 - - - - Edit Tool - 選擇部分 - - - - Ripple Tool - 漣漪的工具 - - - - Razor Tool - 剪刀 - - - - Slip Tool - 滑動工具 - - - - Slide Tool - 幻燈片工具 - - - - Hand Tool - 移動時間軸 - - - - Transition Tool - 轉場/過渡效果 - - - - Enable Snapping - 開啟邊緣吸合/自動對齊 - - - - Auto-Cut Silence - 雜訊分離 - - - Selecting Also Seeks - - - - Edit Tool Also Seeks - - - - Edit Tool Selects Links - - - - Seek Also Selects - - - - Seek to the End of Pastes - - - - Scroll Wheel Zooms - - - - Hold CTRL to toggle this setting - 按住CTRL切換至此設置 - - - Invert Timeline Scroll Axes - 反轉時間軸滾動軸 - - - Enable Drag Files to Timeline - 啟用拖動檔案到時間軸 - - - Auto-Scale By Default - 預設情況下自動縮放 - - - Enable Seek to Import - - - - Audio Scrubbing - 拖動音頻同時播放 - - - Enable Drop on Media to Replace - 開啟拖動到媒體上面後替換該媒體 - - - Enable Hover Focus - 啟用懸停焦點 - - - Ask For Name When Setting Marker - 設置標記時詢問名稱 - - - - No Auto-Scroll - 關閉時間軸自動滾動 - - - - Page Auto-Scroll - 頁面時間軸自動滾動 - - - - Smooth Auto-Scroll - 時間軸自動平滑滾動 - - - - Preferences - 首選項 - - - - Clear Undo - 清除撤消 - - - - &Help - 幫助(&H) - - - - A&ction Search - 功能查找(&C) - - - - Debug Log - 調試日誌 - - - - &About... - 關於(&A) - - - - <untitled> - <無標題> - - Marker + Footage - - Set Marker - 設置標記 - - - - Set clip marker name: - 設置該剪輯標記的名稱: - - - - Set sequence marker name: - 設置序列標記名稱: - - - - Media - - - New Folder - 新建檔案夾 - - - - Name: - 名稱: - - - - Filename: - 檔案名: - - - - Video Dimensions: - 視頻大小: - - - - Frame Rate: - 幀速率: - - - - %1 field(s) (%2 frame(s)) + + %1 FPS - - Interlacing: + + %1 Hz - - Audio Frequency: - 音頻頻率: - - - - Audio Channels: - 音頻通道: - - - - Name: %1 -Video Dimensions: %2x%3 -Frame Rate: %4 -Audio Frequency: %5 -Audio Layout: %6 - 名稱: %1 -視頻大小: %2x%3 -幀率:: %4 -音頻: %5 -音頻佈局: %6 - - - - Name - 名稱 - - - - Duration - 持續時間 - - - - Rate - 速率 - - - - MediaPropertiesDialog - - - "%1" Properties - 屬性 "%1" - - - - Tracks: - 軌道: - - - - Video %1: %2x%3 %4FPS - 視頻 %1: %2x%3 %4FPS - - - - Audio %1: %2Hz %3 - 音頻 %1: %2Hz %3 - - - - %n channel(s) - - %n 通道 - - - - - Conform to Frame Rate: - 符合幀率: - - - - Alpha is Premultiplied + + Filename: %1 - - Auto (%1) - 自動 (%1) + + This footage is not valid for use + + + + ImportTool - - Interlacing: + + Don't ask me again - - Name: - 名稱: - - - - MenuHelper - - - &Project - 項目(&P) - - - - &Sequence - 片段(&S) - - - - &Folder - 目錄(&F) - - - - Set In Point - 設置時間的起始標記 - - - - Set Out Point - 設置時間的結束標記 - - - - Reset In Point - 重置時間的起始標記 - - - - Reset Out Point - 重置時間的結束標記 - - - - Clear In/Out Point - 清除時間標記 - - - - Add Default Transition - 添加預設的轉場效果 - - - - Link/Unlink - 連結/取消連結音頻和視頻 - - - - Enable/Disable - 啟用/禁用 - - - - Nest - 嵌套 - - - - Cu&t - 剪切(&T) - - - - Cop&y - 複製(&Y) - - - - - &Paste - 粘帖(&P) - - - - Paste Insert - 插入式粘貼 - - - - Duplicate - 複製 - - - - Delete - 刪除 - - - - Ripple Delete - 抽出片段並刪除 - - - - Split - 切斷 - - - - Invalid aspect ratio - 無效的長寬比 - - - - The aspect ratio '%1' is invalid. Please try again. - 長寬比無效 '%1', 請再試一次. - - - - Enter custom aspect ratio - 輸入自定義縱橫比 - - - - Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - 輸入字幕/動作安全區使用的縱橫比 (例子, 16:9): - - - - NewSequenceDialog - - - Editing "%1" - 編輯中 "%1" - - - - New Sequence - 新片段 - - - - Preset: - 預置: - - - - Film 4K - 4k電影 - - - - TV 4K (Ultra HD/2160p) - 4K電視 (Ultra HD/2160p) - - - - 1080p - 1080p - - - - 720p - 720p - - - - 480p - 480p - - - - 360p - 360p - - - - 240p - 240p - - - - 144p - 144p - - - - NTSC (480i) - NTSC (480i) - - - - PAL (576i) - PAL (576i) - - - - Custom - 自定義 - - - - Video - 視頻 - - - - Width: - 寬度: - - - - Height: - 高度: - - - - Frame Rate: - 幀速率: - - - - Pixel Aspect Ratio: - 像素長寬比 - - - - Square Pixels (1.0) - 像素長寬比 (1.0) - - - - Interlacing: + + No Active Sequence - - None (Progressive) + + No sequence is currently open. Would you like to create one? - - Audio - 音頻 - - - - Sample Rate: - 採樣率: - - - - Name: - 名稱: - - - - OliveGlobal - - - Olive Project %1 - Olive 項目 %1 - - - - Auto-recovery - 自動恢復 - - - - Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive沒有被正確關閉並檢測到一個自動恢復檔案,你要打開嗎? - - - - Open Project... - 打開項目... - - - - Missing recent project - 缺少最近的項目 - - - - The project '%1' no longer exists. Would you like to remove it from the recent projects list? - 這個項目 '%1' 已經不存在了。您想把它從最近的項目列表中刪除嗎? - - - - Save Project As... - 保存項目為... - - - - Unsaved Project - 未保存的項目 - - - - This project has changed since it was last saved. Would you like to save it before closing? - 這個項目自從上次保存以來已經發生了變化,您想在關門前保存嗎? - - - - No active sequence - 沒有已激活的片段 - - - - Please open the sequence to perform this action. - 請打開片段以執行這個功能. - - - - No clips selected - 沒有剪輯被選擇 - - - - Select the clips you wish to auto-cut - 選擇剪輯以自動剪裁 - - - Please open the sequence you wish to export. - 請打開要輸出的片段. - - - - Missing Project File - В丟失的項目檔案 - - - - Specified project '%1' does not exist. - 指定的項目 '%1' 未找到. - - - - PanEffect - - - Pan - 左右平衡/平移 - - - - PreferencesDialog - - - Preferences - 首選項 - - - - Default Sequence - 預設片段 - - - - Invalid CSS File - 無效的CSS檔案 - - - - CSS file '%1' does not exist. - CSS檔案 '%1' 不存在. - - - - Confirm Reset All Shortcuts - 確認重置所有快捷鍵 - - - - Are you sure you wish to reset all keyboard shortcuts to their defaults? - 您確定要將所有鍵盤快捷鍵重置為預設值嗎? - - - - Import Keyboard Shortcuts - 導入鍵盤快捷鍵配置 - - - - - Error saving shortcuts - 保存鍵盤快捷鍵是發生錯誤 - - - - Failed to open file for reading - 無法讀取檔案 - - - - Export Keyboard Shortcuts - 匯出鍵盤快捷鍵配置 - - - - Export Shortcuts - 匯出快捷鍵 - - - - Shortcuts exported successfully - 快捷鍵成功匯出 - - - - Failed to open file for writing - 無法寫入檔案 - - - - Browse for CSS file - 瀏覽CSS檔案 - - - - Delete All Previews - 刪除所有預覽 - - - - Are you sure you want to delete all previews? - 您確定要刪除所有預覽嗎? - - - - Previews Deleted - 預覽成功刪除 - - - - All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - 所有預覽成功刪除,重新打開當前項目以生效. - - - - Language: - 語言: - - - - Image sequence formats: - 圖形片段個是: - - - - Thumbnail Resolution: - 縮略圖分辨率: - - - - Waveform Resolution: - 音頻波形分辨率 - - - - Delete Previews - 刪除預覽 - - - - Use Software Fallbacks When Possible - 儘量用軟件回放 - - - - Default Sequence Settings - 預設的片段設置 - - - - General - 一般 - - - - Behavior - 行為 - - - - Add Default Effects to New Clips - 添加預設效果到新的剪輯 - - - - Automatically Seek to the Beginning When Playing at the End of a Sequence - 當播放結束後自動回到開始位置 - - - - Selecting Also Seeks - 選擇並查找 - - - - Edit Tool Also Seeks + + Automatically Detect Parameters From Footage - - Edit Tool Selects Links + + Set Parameters Manually + + + + + MoveItemCommand + + + Move Item + + + + + NodeCopyPasteWidget + + + Error pasting nodes - - Seek Also Selects + + Failed to paste nodes: %1 + + + + + NodeFactory + + + None + + + + + NodeViewItem + + + %1... + + + + + PresetManager + + + Save Preset - - Seek to the End of Pastes + + Set preset name: - - Scroll Wheel Zooms - 滾輪縮放 + + Invalid preset name + - - Hold CTRL to toggle this setting - CTRL鍵和滾輪同時使用實現同樣的效果 + + You must enter a preset name + - - Invert Timeline Scroll Axes - 反轉時間軸滾動軸 + + Preset exists + - - Enable Drag Files to Timeline - 開啟拖放檔案到時間軸 - - - - Auto-Scale By Default - 預設情況下自動縮放 - - - - Auto-Seek to Imported Clips - 自動尋找並導入剪輯 - - - - Audio Scrubbing - 拖動音頻同時播放 - - - - Drop Files on Media to Replace - 拖放檔案以代替媒體 - - - - Enable Hover Focus - 啟用懸停焦點 - - - - Ask For Name When Setting Marker - 設置標記時詢問名稱 - - - - Appearance - 外觀 - - - - Theme - 主題 - - - - Olive Dark (Default) - Olive 暗色 (預設) - - - - Olive Light - Olive 明亮 - - - - Native - 原生 - - - - Native (Light Icons) - 原生 (明亮表徵圖) - - - - Use Native Menu Styling - 使用原生菜單風格 - - - - Custom CSS: - 自定義 CSS: - - - - Browse - 瀏覽 - - - - Effect Textbox Lines: - 文本框線效果: - - - Seeking - 查找中 - - - Accurate Seeking -Always show the correct frame (visual may pause briefly as correct frame is retrieved) - 精準查找 -總是顯示當前按的幀 (視覺可能會在檢索到正確的幀時暫停) - - - Fast Seeking -Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - 快速查找 -查找得更快 (搜索時可能會短暫顯示不准確的幀—不影響回放/導出) - - - - Memory Usage - 內存使用 - - - - Upcoming Frame Queue: - 即將到來的幀隊列: - - - - - frames - - - - - - seconds - - - - - Previous Frame Queue: - 前一幀隊列: - - - - Playback - 回放 - - - - Output Device: - 輸出設備: - - - - - Default - 預設 - - - - Input Device: - 輸入設備: - - - - Sample Rate: - 採樣率: - - - - Audio Recording: - 音頻錄製: - - - - Mono - 單聲道 - - - - Stereo - 立體聲 - - - - Audio - 音頻 - - - - Search for action or shortcut - 搜索功能或者快捷鍵 - - - - Action - 功能 - - - - Shortcut - 快捷鍵 - - - - Import - 匯入 - - - - Export - 匯出 - - - - Reset Selected - 重新選擇 - - - - Reset All - 全部重設 - - - - Keyboard - 鍵盤 + + A preset with this name already exists. Would you like to replace it? + - PreviewGenerator + RatioDialog - - Failed to find any valid video/audio streams - 未能找到任何有效的視頻/音頻流 + + Enter custom ratio (e.g. "4:3", "16/9", etc.): + - - Could not open file - %1 - 無法打開檔案 — %1 + + Invalid custom ratio + - - Could not find stream information - %1 - 無法找到流信息 — %1 + + Failed to parse "%1" into an aspect ratio. Please format a rational fraction with a ':' or a '/' separator. + - Project + RenameItemCommand - - New - 新建 - - - - Open Project - 打開項目 - - - - Save Project - 保存項目 - - - - Undo - 撤銷 - - - - Redo - 重做 - - - - Tree View - 詳細視圖 - - - - Icon View - 縮略圖 - - - - List View - 列表視圖 - - - - Search media, markers, etc. - 搜索媒體,標記等. - - - - Project - 項目 - - - - Sequence - 片段 - - - - Replace '%1' - 代替 '%1' - - - - - All Files - 全部檔案 - - - - - No active sequence - 沒有已激活的片段 - - - - No sequence is active, please open the sequence you want to replace clips from. - 沒有片段處于激活狀態,請打開要代替剪輯的片段. - - - - Active sequence selected - 激活選擇的片段 - - - - You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - 無法插入該片段至自己當中,所以這個媒體的剪輯不會在這個片段中. - - - - Rename '%1' - 重命名 '%1' - - - - Enter new name: - 輸入新的名稱: - - - - Delete media in use? - 刪除使用中的媒體? - - - - The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - 此媒體 '%1' 正在被使用於 '%2'. 刪除它將刪除片段中的所有實例. В你確定你要這麼做嗎? - - - - Skip - 跳過 - - - - Import a Project - 導入一個項目 - - - - "%1" is an Olive project file. It will merge with this project. Do you wish to continue? - "%1" 是Olive項目檔案. 它將與這個項目合併. 你想繼續嗎? - - - - Image sequence detected - 圖像片段檢測 - - - - The file '%1' appears to be part of an image sequence. Would you like to import it as such? - 該檔案 '%1' 似乎是圖像片段中的一部分. 您要按原樣代替嗎? - - - - Import media... - 匯入媒體... - - - - No sequence is active, please open the sequence you want to delete clips from. - 沒有片段處于激活狀態,請打開要從中刪除剪輯的片段. - - - - ProxyDialog - - - Create Proxy - 創建代理 - - - - Proxy - 代理 - - - - Dimensions: - 大小: - - - - Same Size as Source - 使用與來源相同的大小 - - - - Half Resolution (1/2) - 一半的分辨率 (1/2) - - - - Quarter Resolution (1/4) - 四分之一的分辨率 (1/4) - - - - Eighth Resolution (1/8) - 八分之一的分辨率 (1/8) - - - - Sixteenth Resolution (1/16) - 十六分之一的分辨率 (1/16) - - - - Format: - 個格式: - - - - ProRes HQ - ProRes HQ - - - - Location: - 位置: - - - - Same as Source (in "%1" folder) - 使用與來源相同的大小 (在 "%1" 目錄) - - - - Proxy file exists - 代理檔案存在 - - - - The file "%1" already exists. Do you wish to replace it? - 該檔案 "%1" 已經存在. 你想代替它嗎? - - - - Custom Location - 自定義路徑 - - - - ProxyGenerator - - - Finished generating proxy for "%1" - 完成生成代理 "%1" - - - - ReplaceClipMediaDialog - - - Replace clips using "%1" - 取代剪輯使用 "%1" - - - - Select which media you want to replace this media's clips with: - 選擇要替換此媒體的媒體: - - - - Keep the same media in-points - 保持相同的媒體插入點 - - - - Replace - 取代 - - - - Cancel - 取消 - - - - No media selected - 沒有已選擇的媒體 - - - - Please select a media to replace with or click 'Cancel'. - 請選擇一個媒體替代或取消. - - - - Same media selected - 相同的媒體被選擇 - - - - You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - 你選擇了相同的媒體代替.請選擇其他或者取消. - - - - Folder selected - 目錄選擇 - - - - You cannot replace footage with a folder. - 您無法用檔案夾替換素材. - - - - Active sequence selected - 激活的片段已經被選擇 - - - - You cannot insert a sequence into itself. - 無法插入該片段至自己當中. - - - - RichTextEffect - - - Text - 文本格式化 - - - - Padding - 填充 - - - - Position - 位置 - - - - Vertical Align: - 垂直對齊: - - - - Top - 頂部 - - - - Center - 中心點 - - - - Bottom - 底下 - - - - Auto-Scroll - 自動捲動 - - - - Off - 關閉 - - - - Up - - - - - Down - - - - - Left - - - - - Right - - - - - Shadow - 陰影 - - - - Shadow Color - 陰影顏色 - - - - Shadow Angle - 陰影角度 - - - - Shadow Distance - 陰影距離 - - - - Shadow Softness - 陰影柔軟化 - - - - Shadow Opacity - 陰影透明度 + + Rename Item + Sequence - - %1 (copy) - %1 (複製) - - - - ShakeEffect - - - Intensity - 強度 - - - - Rotation - 旋轉 - - - - Frequency - 頻率 - - - - SolidEffect - - - Type - 類型 - - - - Solid Color - 純色 - - - - SMPTE Bars - - - - - Checkerboard - - - - - Opacity - 透明度 - - - - Color - 顏色 - - - - Checkerboard Size + + %1 FPS - SourcesCommon + Stream - - Import... - 匯入... - - - - New - 新建 - - - - View - 視圖 - - - - Tree View - 樹視圖 - - - - Icon View - 表徵圖視圖 - - - - Show Toolbar - 顯示工具欄 - - - - Show Sequences - 顯示片段 - - - - Replace/Relink Media - 替換/重新連結媒體 - - - - Reveal in Explorer - 在瀏覽器中預覽 - - - - Reveal in Finder - 在查找當中預覽 - - - - Reveal in File Manager - 在檔案管理器中預覽 - - - - Replace Clips Using This Media - 使用此媒體替換剪輯 - - - - Create Sequence With This Media - 使用此媒體創建片段 - - - - Duplicate - 複製 - - - - Delete All Clips Using This Media - 刪除所有使用此問題的剪輯 - - - - Proxy - 代理 - - - - Generating proxy: %1% complete - 生成代理: %1% 完成 - - - - Create/Modify Proxy - 創建/修改代理 - - - - Create Proxy - 創建代理 - - - - Modify Proxy - 修改代理 - - - - Restore Original - 還原為原始尺寸 - - - - Delete - 刪除 - - - - Preview in Media Viewer - 在媒體瀏覽器中預覽 - - - - Properties... - 屬性... - - - - Replace Media - 取代媒體 - - - - You dropped a file onto '%1'. Would you like to replace it with the dropped file? - 你拖放了一個檔案到 '%1'. 你要取代它嗎? - - - - Delete proxy - 刪除代理 - - - - Would you like to delete the proxy file "%1" as well? - 您要刪除代理檔案嗎 "%1"? - - - - SpeedDialog - - - Speed/Duration - 速度/持續時間 - - - - Speed: - 速度: - - - - Frame Rate: - 幀速率: - - - - Duration: - 持續時間: - - - - Reverse - 反向 - - - - Maintain Audio Pitch - 保持音頻音調 - - - - Ripple Changes - 波紋變化 - - - - TextEditDialog - - - Edit Text - 編輯文本格式 - - - - Thin - - - - - Extra Light - 加亮 - - - - Light - - - - - Normal - 正常 - - - - Medium - 中等 - - - - Demi Bold + + %1: Audio - %2 Channels, %3Hz - - Bold - 粗體 - - - - Extra Bold - 加粗 - - - - Black - - - - - TextEditEx - - - Edit Text - 編輯文本 - - - - &Edit Text - 編輯文本(&E) - - - - TextEffect - - - Text - 文本 - - - - Font - 字型 - - - - Size - 大小 - - - - Color - 顏色 - - - - Alignment - 校準 - - - - Left - - - - - - Center - 中心 - - - - Right - - - - - Justify - 整理版面 - - - - Top - 頂部 - - - - Bottom - 底下 - - - - Word Wrap - 自動換行 - - - - Padding - 填充 - - - - Position - 位置 - - - - Outline - 輪廓 - - - - Outline Color - 輪廓顏色 - - - - Outline Width - 輪廓寬 - - - - Shadow - 陰影 - - - - Shadow Color - 陰影顏色 - - - - Shadow Angle - 陰影角度 - - - - Shadow Distance - 陰影距離 - - - - Shadow Softness - 陰影柔軟化 - - - - Shadow Opacity - 陰影透明度 - - - - Sample Text - 文字樣本 - - - - TimecodeEffect - - - Timecode + + %1: Unknown - - Sequence - 片段 + + %1: Image - %2x%3 + - - Media - 媒體 - - - - Scale - 縮放 - - - - Color - 顏色 - - - - Background Color - 背景顏色 - - - - Background Opacity - 背景透明度 - - - - Offset - 補償 - - - - Prepend - 前置 + + %1: Video - %2x%3 + - Timeline + TimelineViewBlockItem - - Pointer Tool - 選擇/移動/預設 - - - - Edit Tool - 選擇部分 - - - - Ripple Tool - 漣漪的工具 - - - - Razor Tool - 剪刀 - - - - Slip Tool - 滑動工具 - - - - Slide Tool - 幻燈片工具 - - - - Hand Tool - 手形工具 - - - - Transition Tool - 過度/轉場效果 - - - - Snapping - 邊緣吸合/自動對齊 - - - - Zoom In - 放大 - - - - Zoom Out - 縮小 - - - - Record audio - 錄製聲音 - - - - Add title, solid, bars, etc. - 添加字幕,實體,欄等. - - - - Nested Sequence - 嵌套的片段 - - - - Effect already exists - 特效已經存在 - - - - Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - 剪輯 '%1' 已經包含了 '%2'效果. 您是想替換它,還是作為單獨的效果加入? - - - - Add - 添加 - - - - Replace - 取代 - - - - Skip - 跳過 - - - - Do this for all conflicts found - 對所有發現的衝突都這樣做嗎 - - - - Title... - 字幕... - - - - Solid Color... - 單色... - - - - Bars... - 欄... - - - - Tone... - 增強… - - - - Noise... - 噪音... - - - - Unsaved Project - 未保存的項目 - - - - You must save this project before you can record audio in it. - 必須先保存此項目,才能在其中錄製音頻. - - - - Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - 單擊要開始錄製的時間軸(拖動可將錄製限制在某個時間段) - - - - Timeline: - 時間軸: - - - - (none) - (無) - - - - TimelineHeader - - - Center Timecodes - 以時間區間/點顯示 - - - - TimelineWidget - - - &Undo - 撤銷(&U) - - - - &Redo - 重做(&R) - - - - R&ipple Delete Empty Space - 連接片段/去除空白空間(&I) - - - - Sequence Settings - 片段設置 - - - - &Speed/Duration - 速度/持續時間(&S) - - - Auto-s&cale - 自動縮放(&C) - - - - Auto-Cut Silence - 雜訊分離 - - - - Auto-S&cale - 自動縮放(&C) - - - - &Reveal in Project - 在項目庫中顯示(&R) - - - - Properties - 屬性 - - - + %1 -Start: %2 -End: %3 -Duration: %4 - %1 -起點: %2 -終止: %3 -持續時間: %4 + +In: %2 +Out: %3 +Length: %4 + + + + + Tool + + + Empty + - - Error - 錯誤 - - - - Couldn't locate media wrapper for sequence. - 無法找到片段的媒體包裝器. - - - - Title - 字幕 - - - - Solid Color - 單色 - - - + Bars - + - + + Solid + + + + + Title + 字幕 + + + Tone - - Noise - 噪音 - - - - Duration: - 持續時間: + + Unknown + - ToneEffect + VideoParams - - Type - 類型 + + 8-bit + - - Sine - 正弦 + + 16-bit Integer + - - Frequency - 頻率 + + Half-Float (16-bit) + - - Amount - 數量 + + Full-Float (32-bit) + - - Mix - 混合 + + Unknown (0x%1) + + + + + %1 FPS + + + + + Square Pixels (%1) + + + + + NTSC Standard (%1) + + + + + NTSC Widescreen (%1) + + + + + PAL Standard (%1) + + + + + PAL Widescreen (%1) + + + + + HD Anamorphic 1080 (%1) + - TransformEffect + main - - Position - 位置 + + Show this help text + - - Scale - 縮放 + + Show application version + - - Uniform Scale - 統一縮放的大小 + + Start in full-screen mode + - - Rotation - 旋轉 + + Export only (No GUI) + - - Anchor Point - 錨點 + + Override language with file + - - Opacity - 透明度 + + qm-file + - - Blend Mode - 混合模式 - - - - Normal - 標準 + + Project to open on startup + - Transition + olive::AboutDialog - + + About %1 + + + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive是免費的非線性視頻編輯器.基于GNU通用公共許可證(GNU GPL)條款發佈. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive團隊有義務告知用戶可以從官網下載olive的源碼.翻譯者已嘗試用通俗易明的方式進行翻譯,希望大家使用愉快.請支持自由開源軟件謝謝. + + + + olive::ActionSearch + + + Search for action... + 功能搜索... + + + + olive::AudioInput + + + Audio Input + + + + + Audio + 音頻 + + + + Import an audio footage stream. + + + + + olive::AudioMonitorPanel + + + Audio Monitor + + + + + olive::Block + + Length - 長度 + 長度 + + + + Media In + + + + + Enabled + + + + + Speed + - UpdateNotification + olive::BlurFilterNode - - An update is available from the Olive website. Visit www.olivevideoeditor.org to download it. - 發現新版本.請訪問www.olivevideoeditor.org下載. + + Blur + + + + + Blurs an image. + + + + + Input + + + + + Method + + + + + Box + + + + + Gaussian + + + + + Radius + + + + + Horizontal + + + + + Vertical + + + + + Repeat Edge Pixels + - VSTHost + olive::ClipBlock - - - Error loading VST plugin - 加載VST插件按時發生錯誤 + + Clip + - Failed to create VST reference - 無法創建VST參考 + + A time-based node that represents a media source. + - - Failed to load VST plugin "%1": %2 - 無法加載VST插件 "%1": %2 - - - NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - 警告: 您不能將32位VST插件加載到64位Olive構建中。請找到這個插件的64位版本或切換到32位的Olive構建版本. - - - NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - 警告: 您不能將64位VST插件加載到32位Olive構建中。請找到這個插件的32位版本或切換到64位的Olive構建版本. - - - - Failed to locate entry point for dynamic library. - 未能找到動態庫的入口點. - - - - VST Error - VST發生錯誤 - - - - Plugin's magic number is invalid - 插件的幻數無效 - - - - VST Plugin - VST插件 - - - - Plugin - 插件 - - - - Interface - 用戶界面 - - - - Show - 顯示 + + Buffer + - Viewer + olive::ColorDialog - - (none) - (無) - - - - Drag video only - 只拖放視頻 - - - - Drag audio only - 只拖放音頻 - - - - Sequence Viewer - 片段預覽 - - - - Media Viewer - 媒體預覽 + + Select Color + - ViewerWidget + olive::ColorSpaceChooser - - Save Frame as Image... - 保存幀為圖像... + + Color Management + - - Show Fullscreen - 全屏模式 + + Input: + - - Disable - 關閉 + + Color Space: + - - Screen %1: %2x%3 - 放映 %1: %2x%3 + + Display: + - - Zoom - 縮放 + + View: + - + + Look: + + + + + (None) + + + + + olive::ColorValuesTab + + + Red + + + + + Green + + + + + Blue + + + + + olive::ColorValuesWidget + + + Preview + + + + + Input + + + + + Reference + + + + + Display + + + + + olive::ConformTask + + + Conforming Audio %1:%2 + + + + + olive::Core + + + Import error + + + + + Nothing to import + + + + + Importing... + + + + + Import footage... + + + + + Failed to import footage + + + + + Failed to find active Project panel + + + + + No Active Project + + + + + No project is currently open to set the properties for + + + + + Failed to create new folder + + + + + + Failed to find active project + + + + + New Folder + 新建檔案夾 + + + + Failed to create new sequence + + + + + Possible image sequence detected + + + + + The file '%1' looks like it might be part of an image sequence. Would you like to import it as such? + + + + + You must specify a project file to export + + + + + Specified project does not exist + + + + + Project contains no sequences, nothing to export + + + + + This project has multiple sequences. Which do you wish to export? + + + + + Enter number (or %1 to cancel): + + + + + Invalid sequence number + + + + + Export succeeded + + + + + Export failed: %1 + + + + + Project failed to load: %1 + + + + + Failed to open startup file + + + + + The project "%1" doesn't exist. A new project will be started instead. + + + + + + Missing OpenTimelineIO Libraries + + + + + + This build was compiled without OpenTimelineIO and therefore cannot open OpenTimelineIO files. + + + + + Save Project + 保存項目 + + + + + Error + 錯誤 + + + + This Sequence is empty. There is nothing to export. + + + + + No valid sequence detected. + +Make sure a sequence is loaded and it has a connected Viewer node. + + + + + Olive Project + + + + + OpenTimelineIO + + + + + Save Project As + + + + + Load Project + + + + + Label Node + + + + + Set node label + + + + + Sequence %1 + + + + + Cannot open recent project + + + + + The project "%1" doesn't exist. Would you like to remove this file from the recent list? + + + + + Unsaved Changes + + + + + The project '%1' has unsaved changes. Would you like to save them? + + + + + Save + + + + + Save All + + + + + Don't Save + + + + + Don't Save All + + + + + Failed to cache sequence + + + + + No active viewer found with this sequence. + + + + + Open Project + 打開項目 + + + + olive::CrashHandlerDialog + + + Olive + + + + + We're sorry, Olive has crashed. Please help us fix it by sending an error report. + + + + + Describe what you were doing in as much detail as possible. If you can, provide steps to reproduce this crash. + + + + + Crash Report: + + + + + Send Error Report + + + + + Don't Send + + + + + Waiting for crash report to be generated... + + + + + Upload Failed + + + + + Failed to send error report. Please try again later. + + + + + No Crash Summary + + + + + Are you sure you want to send an error report with no crash summary? + + + + + olive::CrossDissolveTransition + + + Cross Dissolve + + + + + Smoothly transition between two clips. + + + + + olive::CurvePanel + + + Curve Editor + + + + + olive::CurveView + + + Zoom to Fit + + + + + olive::CurveWidget + + + Linear + 線性 + + + + Bezier + 貝塞爾曲綫 + + + + Hold + 保留 + + + + olive::DipToColorTransition + + + Dip To Color + + + + + Transition between clips by dipping to a color. + + + + + olive::DiskCacheDialog + + + Disk Cache: %1 + + + + + Disk Cache Settings + + + + + Maximum Disk Cache: + + + + + %1 GB + + + + + + + Clear Disk Cache + + + + + Automatically clear disk cache on close + + + + + Are you sure you want to clear the disk cache in '%1'? + + + + + Disk Cache Cleared + + + + + Disk cache failed to fully clear. You may have to delete the cache files manually. + + + + + Disk Cache Partially Cleared + + + + + olive::DiskManager + + + + Disk Cache Error + + + + + Unable to set custom application disk cache. Using default instead. + + + + + Disk Cache + + + + + You've chosen to change the default disk cache location. This will invalidate your current cache. Would you like to continue? + + + + + Failed to open disk cache at "%1". Try a different folder. + + + + + olive::ElapsedCounterWidget + + + Elapsed: %1 + + + + + Remaining: %1 + + + + + olive::ExportAdvancedVideoDialog + + + Advanced + 高級 + + + + Pixel + + + + + Pixel Format: + 視頻格式: + + + + Performance + + + + + Threads: + 綫程數量: + + + + olive::ExportAudioTab + + + Codec: + 編解碼器: + + + + Sample Rate: + 採樣率: + + + + Channel Layout: + + + + + Format: + + + + + olive::ExportCodec + + + DNxHD + + + + + H.264 + + + + + H.265 + + + + + OpenEXR + + + + + PNG + + + + + ProRes + + + + + TIFF + + + + + MP2 + + + + + MP3 + + + + + AAC + + + + + PCM (Uncompressed) + + + + + Unknown + + + + + olive::ExportDialog + + + Filename: + 檔案名: + + + + Browse for exported file filename + + + + + Preset: + 預置: + + + + Same As Source - High Quality + + + + + Same As Source - Medium Quality + + + + + Same As Source - Low Quality + + + + + Range: + 範圍: + + + + Entire Sequence + 整個片段 + + + + In to Out + 已選擇的時間段 + + + + Format: + + + + + Export Video + + + + + Export Audio + + + + + Video + 視頻 + + + + Audio + 音頻 + + + + + Export + 匯出 + + + + Preview + + + + + Invalid parameters + + + + + Both video and audio are disabled. There's nothing to export. + + + + + Invalid filename + + + + + The filename must contain the extension "%1". Would you like to append it automatically? + + + + + Failed to create output directory + + + + + The intended output directory doesn't exist and Olive couldn't create it. Please choose a different filename. + + + + + Confirm Overwrite + + + + + The file "%1" already exists. Do you want to overwrite it? + + + + + Invalid Parameters + + + + + Width and height must be multiples of 2. + + + + + olive::ExportFormat + + + DNxHD + + + + + Matroska Video + + + + + MPEG-4 Video + + + + + OpenEXR + + + + + PNG + + + + + TIFF + + + + + QuickTime + + + + + Unknown + + + + + olive::ExportTask + + + Exporting "%1" + + + + + Failed to create encoder + + + + + Failed to open file + + + + + Failed to overwrite "%1". Export has been saved as "%2" instead. + + + + + olive::ExportVideoTab + + + Basic + + + + + Width: + 寬度: + + + + Height: + 高度: + + + + Maintain Aspect Ratio: + + + + + Scaling Method: + + + + Fit - 適合 + 適合 - - Custom - 自定義 + + Stretch + - - Close Media - 關閉媒體 + + Crop + - - Save Frame - 保存幀 + + Frame Rate: + - - Viewer Zoom - 預覽縮放 + + Pixel Aspect Ratio: + 像素長寬比 - - Set Custom Zoom Value: - 設置自己定義縮放: + + Interlacing: + + + + + Quality: + + + + + Codec + + + + + Codec: + 編解碼器: + + + + Advanced + 高級 - ViewerWindow + olive::FloatSlider - - Exit Fullscreen - 退出全屏 + + %1 dB + + + + + %1% + - VoidEffect + olive::FootagePropertiesDialog - + + "%1" Properties + + + + + Name: + 名稱: + + + + Tracks: + 軌道: + + + + olive::FootageRelinkDialog + + + Footage + + + + + Filename + + + + + Actions + + + + + Browse + 瀏覽 + + + + Relink Footage + + + + + Relink "%1" + + + + + All Files + 全部檔案 + + + + olive::FootageViewerPanel + + + Footage Viewer + + + + + olive::GapBlock + + + Gap + + + + + A time-based node that represents an empty space. + + + + + olive::H264BitRateSection + + + Target Bit Rate (Mbps): + + + + + Maximum Bit Rate (Mbps): + + + + + Two-Pass + + + + + olive::H264FileSizeSection + + + Target File Size (MB): + 輸出檔案大小 (MB): + + + + Two-Pass + + + + + olive::H264Section + + + Compression Method: + + + + + Constant Rate Factor + + + + + Target Bit Rate + + + + + Target File Size + + + + + olive::ImageSection + + + Image Sequence: + + + + + olive::InterlacedComboBox + + + None (Progressive) + 無 (進度) + + + + Top-Field First + + + + + Bottom-Field First + + + + + olive::KeyframePropertiesDialog + + + Keyframe Properties + + + + + In: + + + + + Out: + + + + + Linear + 線性 + + + + Hold + 保留 + + + + Bezier + 貝塞爾曲綫 + + + + olive::KeyframeViewBase + + + Linear + 線性 + + + + Bezier + 貝塞爾曲綫 + + + + Hold + 保留 + + + + P&roperties + + + + + olive::LoadOTIOTask + + + Failed to load OpenTimelineIO from file "%1" + + + + + Unknown OpenTimelineIO root element + + + + + Failed to load clip + + + + + olive::MainMenu + + + &Save '%1' + + + + + Save '%1' &As + + + + + Close '%1' + + + + + Close All Except '%1' + + + + + &Save Project + 保存項目(&S) + + + + Save Project &As + 保存項目為(&A) + + + + Close Project + + + + + Close All Except Current Project + + + + + (None) + + + + + &File + 檔案(&F) + + + + &New + 新建(&N) + + + + &Open Project + 打開項目(&O) + + + + Open &Recent + + + + + &Clear Recent List + + + + + Sa&ve All Projects + + + + + &Import... + 匯入(&I) + + + + &Export + + + + + &Media... + + + + + &Project Properties... + + + + + Close All Projects + + + + + E&xit + 退出(&I) + + + + &Edit + + + + + Insert + + + + + Overwrite + + + + + Select &All + 選擇全部(&A) + + + + Deselect All + 取消選擇所有 + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + 刪除標記的區域 + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + 設置/編輯標記 + + + + &View + 視圖(&V) + + + + Zoom In + 放大 + + + + Zoom Out + 縮小 + + + + Increase Track Height + 增加軌道高度 + + + + Decrease Track Height + 降低軌道高度 + + + + Toggle Show All + 軌道全部顯示 + + + + Full Screen + 全屏 + + + + Full Screen Viewer + 全屏預覽 + + + + &Playback + 回放(&P) + + + + Go to Start + 回到起始幀 + + + + Previous Frame + 前一幀 + + + + Play/Pause + 播放/暫停 + + + + Play In to Out + 播放已標記的區域 + + + + Next Frame + 下一幀 + + + + Go to End + 轉到結束幀 + + + + Go to Previous Cut + 切換到之前的位置 + + + + Go to Next Cut + 轉到下一個位置 + + + + Go to In Point + 轉到時間的起始標記處 + + + + Go to Out Point + 轉到時間的結束標記處 + + + + Shuttle Left + 向左播放 + + + + Shuttle Stop + 停止播放 + + + + Shuttle Right + 向右播放 + + + + Loop + 循環播放 + + + + &Sequence + 片段(&S) + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Maximize Panel + 最大化面板 + + + + Lock Panels + 鎖定面板 + + + + Reset to Default Layout + 重置為預設佈局 + + + + &Tools + 工具(&T) + + + + Pointer Tool + 選擇/移動/預設 + + + + Edit Tool + 選擇部分 + + + + Ripple Tool + 漣漪的工具 + + + + Rolling Tool + + + + + Razor Tool + 剪刀 + + + + Slip Tool + 滑動工具 + + + + Slide Tool + 幻燈片工具 + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Enable Snapping + 開啟邊緣吸合/自動對齊 + + + + Preferences + 首選項 + + + + &Help + 幫助(&H) + + + + A&ction Search + 功能查找(&C) + + + + Send &Feedback... + + + + + &About... + 關於(&A) + + + + olive::MainStatusBar + + + Welcome to %1 %2 + 歡迎來到 %1 %2 + + + + Running %1 background tasks + + + + + olive::MainWindow + + + Driver Warning + + + + + Olive has detected your system is using the Nouveau graphics driver. + +This driver is known to have stability and performance issues with Olive. It is highly recommended you install the proprietary NVIDIA driver before continuing to use Olive. + + + + + olive::ManagedDisplayWidget + + + Color Space + + + + + No color manager connected + + + + + Display + + + + + View + 視圖 + + + + Look + + + + + (None) + + + + + OpenColorIO Error + + + + + Failed to set color configuration: %1 + + + + + olive::ManagedPixelSamplerWidget + + + Display + + + + + Reference + + + + + olive::MathNode + + + Math + + + + + Perform a mathematical operation between two values. + + + + + Method + + + + + + Value + + + + + Add + 添加 + + + + Subtract + + + + + Multiply + + + + + Divide + + + + + Power + + + + + olive::MatrixGenerator + + + Orthographic Matrix + + + + + Ortho + + + + + Generate an orthographic matrix using position, rotation, and scale. + + + + + Position + 位置 + + + + Rotation + 旋轉 + + + + Scale + 縮放 + + + + Uniform Scale + 統一縮放的大小 + + + + Anchor Point + 錨點 + + + + olive::MediaInput + + + Footage + + + + + olive::MenuShared + + + &Project + 項目(&P) + + + + &Sequence + 片段(&S) + + + + &Folder + 目錄(&F) + + + + Cu&t + 剪切(&T) + + + + Cop&y + 複製(&Y) + + + + &Paste + 粘帖(&P) + + + + Paste Insert + 插入式粘貼 + + + + Duplicate + 複製 + + + + Delete + 刪除 + + + + Ripple Delete + 抽出片段並刪除 + + + + Split + 切斷 + + + + Set In Point + 設置時間的起始標記 + + + + Set Out Point + 設置時間的結束標記 + + + + Reset In Point + 重置時間的起始標記 + + + + Reset Out Point + 重置時間的結束標記 + + + + Clear In/Out Point + 清除時間標記 + + + + Add Default Transition + 添加預設的轉場效果 + + + + Link/Unlink + 連結/取消連結音頻和視頻 + + + + Enable/Disable + 啟用/禁用 + + + + Nest + 嵌套 + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + 毫秒 + + + + Seconds + + + + + olive::MergeNode + + + Merge + + + + + Merge two textures together. + + + + + Base + + + + + Blend + + + + + olive::Node + + + Input + + + + + Output + + + + + General + 一般 + + + + Math + + + + + Color + 顏色 + + + + Filter + + + + + Timeline + 時間軸 + + + + Generator + + + + + Channel + + + + + Transition + + + + + Uncategorized + + + + + olive::NodeInput + + + Input + + + + + olive::NodeOutput + + + Output + + + + + olive::NodePanel + + + Node Editor + + + + + olive::NodeParam + + + Value + + + + + None + + + + + Integer + + + + + Float + + + + + Rational + + + + + Boolean + + + + + Color + 顏色 + + + + Matrix + + + + + Text + + + + + Font + 字型 + + + + File + + + + + Texture + + + + + Samples + + + + + Footage + + + + + Vector 2D + + + + + Vector 3D + + + + + Vector 4D + + + + + Unknown + + + + + olive::NodeParamViewArrayWidget + + + + + + + + + %1 elements + + + + + olive::NodeParamViewConnectedLabel + + + Connected to + + + + + Nothing + + + + + Disconnect + + + + + olive::NodeParamViewItem + + + %1 (%2) + + + + + olive::NodeParamViewItemBody + + + %1: + + + + + olive::NodeParamViewKeyframeControl + + + Warning + + + + + Are you sure you want to disable keyframing on this value? This will clear all existing keyframes. + + + + + olive::NodeTablePanel + + + Table View + + + + + olive::NodeTableView + + + Type + 類型 + + + + Source + + + + + R/X + + + + + G/Y + + + + + B/Z + + + + + A/W + + + + (unknown) - (未知) - - - - Missing Effect - 缺失特效 + (未知) - VolumeEffect + olive::NodeTreeView - + + Nodes + + + + + olive::NodeView + + + Label + + + + + Auto-Position + + + + + Smooth Edges + + + + + Filter + + + + + Show All + + + + + Show Selected Blocks Only + + + + + Direction + + + + + Top to Bottom + + + + + Bottom to Top + + + + + Left to Right + + + + + Right to Left + + + + + Add + 添加 + + + + olive::PanNode + + + + Pan + 左右平衡/平移 + + + + Adjust the stereo panning of an audio source. + + + + + Samples + + + + + olive::PanelWidget + + + %1: %2 + + + + + olive::ParamPanel + + + Parameter Editor + + + + + (none) + (無) + + + + (multiple) + (多個) + + + + olive::PathWidget + + + Browse + 瀏覽 + + + + Browse for path + + + + + olive::PixelAspectRatioComboBox + + + Set Custom Pixel Aspect Ratio + + + + + Custom... + + + + + Custom (%1) + + + + + olive::PixelSamplerPanel + + + Pixel Sampler + + + + + olive::PixelSamplerWidget + + + Color + 顏色 + + + + <html><font color='#FF8080'>R: %1</font><br><font color='#80FF80'>G: %2</font><br><font color='#8080FF'>B: %3</font><br>A: %4</html> + + + + + olive::PolygonGenerator + + + Polygon + + + + + Generate a 2D polygon of any amount of points. + + + + + Points + + + + + Color + 顏色 + + + + olive::PreCacheTask + + + Pre-caching %1:%2 + + + + + olive::PreferencesAppearanceTab + + + Theme + 主題 + + + + Node Color Scheme + + + + + olive::PreferencesAudioTab + + + Output Device: + 輸出設備: + + + + Input Device: + 輸入設備: + + + + Sample Rate: + 採樣率: + + + + Audio Recording: + 音頻錄製: + + + + Mono + 單聲道 + + + + Stereo + 立體聲 + + + + Refresh Devices + + + + + Please wait... + + + + + Default + 預設 + + + + olive::PreferencesBehaviorTab + + + Behavior + 行為 + + + + General + 一般 + + + + Enable hover focus + + + + + Panels will be considered focused when the mouse cursor is over them without having to click them. + + + + + Scroll wheel zooms by default instead of scrolling + + + + + Holding CTRL while using Olive toggles this setting + + + + + Audio + 音頻 + + + + Enable audio scrubbing + + + + + Timeline + 時間軸 + + + + Auto-Seek to Imported Clips + 自動尋找並導入剪輯 + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Enable Drag Files to Timeline + + + + + Invert Timeline Scroll Axes + 反轉時間軸滾動軸 + + + + Hold ALT on any UI element to switch scrolling axes + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Selecting Also Seeks + 選擇並查找 + + + + Playback + 回放 + + + + Ask For Name When Setting Marker + 設置標記時詢問名稱 + + + + Automatically rewind at the end of a sequence + + + + + Project + 項目 + + + + Drop Files on Media to Replace + 拖放檔案以代替媒體 + + + + Nodes + + + + + Add Default Effects to New Clips + 添加預設效果到新的剪輯 + + + + Auto-Scale By Default + 預設情況下自動縮放 + + + + Splitting Clips Copies Dependencies + + + + + Multiple clips can share the same nodes. Disable this to automatically share node dependencies among clips when copying or splitting them. + + + + + olive::PreferencesDialog + + + Preferences + 首選項 + + + + General + 一般 + + + + Appearance + 外觀 + + + + Behavior + 行為 + + + + Disk + + + + + Audio + 音頻 + + + + Keyboard + 鍵盤 + + + + olive::PreferencesDiskTab + + + Disk Management + + + + + Disk Cache Location: + + + + + Disk Cache Settings + + + + + Cache Behavior + + + + + Cache Ahead: + + + + + + %1 seconds + + + + + Cache Behind: + + + + + Disk Cache + + + + + Failed to set disk cache location. Access was denied. + + + + + olive::PreferencesGeneralTab + + + Language: + 語言: + + + + Auto-Scroll Method: + + + + + None + + + + + Page Scrolling + + + + + Smooth Scrolling + + + + + Rectified Waveforms: + + + + + Default Still Image Length: + + + + + %1 seconds + + + + + %1 (%2) + + + + + olive::PreferencesKeyboardTab + + + Search for action or shortcut + 搜索功能或者快捷鍵 + + + + Action + 功能 + + + + Shortcut + 快捷鍵 + + + + Import + 匯入 + + + + Export + 匯出 + + + + Reset Selected + 重新選擇 + + + + Reset All + 全部重設 + + + + Confirm Reset All Shortcuts + 確認重置所有快捷鍵 + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + 您確定要將所有鍵盤快捷鍵重置為預設值嗎? + + + + Import Keyboard Shortcuts + 導入鍵盤快捷鍵配置 + + + + + Error saving shortcuts + 保存鍵盤快捷鍵是發生錯誤 + + + + Failed to open file for reading + 無法讀取檔案 + + + + Export Keyboard Shortcuts + 匯出鍵盤快捷鍵配置 + + + + Export Shortcuts + 匯出快捷鍵 + + + + Shortcuts exported successfully + 快捷鍵成功匯出 + + + + Failed to open file for writing + 無法寫入檔案 + + + + olive::ProgressDialog + + + Cancel + 取消 + + + + olive::Project + + + + (untitled) + + + + + olive::ProjectExplorer + + + &New + 新建(&N) + + + + &Import... + 匯入(&I) + + + + &Project Properties... + + + + + Open in New Tab + + + + + Open in New Window + + + + + Reveal in Explorer + 在瀏覽器中預覽 + + + + Reveal in Finder + 在查找當中預覽 + + + + Reveal in File Manager + 在檔案管理器中預覽 + + + + Pre-Cache + + + + + No sequences exist in project + + + + + For "%1" + + + + + P&roperties + + + + + Confirm Footage Deletion + + + + + The footage "%1" is currently used in the following sequence(s): + +%2 +What would you like to do with these clips? + + + + + Offline Footage + + + + + Delete Clips + + + + + olive::ProjectExplorerNavigation + + + Go to parent folder + + + + + olive::ProjectImportErrorDialog + + + Import Error + + + + + The following files failed to import. Olive likely does not support their formats. + + + + + olive::ProjectImportTask + + + Importing %1 files + + + + + olive::ProjectLoadBaseTask + + + Loading '%1' + + + + + olive::ProjectLoadTask + + + This project is newer than this version of Olive and cannot be opened. + + + + + + This project is from a version of Olive that is no longer supported in this version. + + + + + Failed to read file "%1" for reading. + + + + + olive::ProjectPanel + + + Folder + + + + + Project + 項目 + + + + (none) + (無) + + + + olive::ProjectPropertiesDialog + + + Project Properties for '%1' + + + + + OpenColorIO Configuration: + + + + + (default) + + + + + Default Input Color Space: + + + + + Browse + 瀏覽 + + + + Color Management + + + + + Use Default Location + + + + + Store Alongside Project + + + + + Use Custom Location: + + + + + Disk Cache Settings + + + + + + "Store alignside project" functionality not implemented yet + + + + + Disk Cache + + + + + OpenColorIO Config Error + + + + + Failed to set OpenColorIO configuration: %1 + + + + + Invalid path + + + + + The cache path is invalid. Please check it and try again. + + + + + Browse for OpenColorIO configuration + + + + + olive::ProjectSaveTask + + + Saving '%1' + + + + + Failed to write XML data + + + + + Failed to overwrite "%1". Project has been saved as "%2" instead. + + + + + Failed to open temporary file "%1" for writing. + + + + + olive::ProjectToolbar + + + New... + + + + + Open Project + 打開項目 + + + + Save Project + 保存項目 + + + + Undo + 撤銷 + + + + Redo + 重做 + + + + Search media, markers, etc. + 搜索媒體,標記等. + + + + Switch to Tree View + + + + + Switch to List View + + + + + Switch to Icon View + + + + + olive::ProjectViewModel + + + Name + 名稱 + + + + Duration + 持續時間 + + + + Rate + 速率 + + + + Move Items + + + + + olive::RenderCancelDialog + + + Waiting for workers to finish... + + + + + Renderer + + + + + olive::RichTextDialog + + + B + + + + + Bold + 粗體 + + + + I + + + + + Italic + + + + + U + + + + + Underline + + + + + S + + + + + Strikethrough + + + + + Font Family + + + + + Font Size + + + + + L + + + + + Left Align + + + + + C + + + + + Center Align + + + + + R + + + + + Right Align + + + + + J + + + + + Justify Align + + + + + olive::SaveOTIOTask + + + Exporting project to OpenTimelineIO + + + + + Project contains no sequences to export. + + + + + Failed to serialize sequence "%1" + + + + + olive::ScopePanel + + + Waveform + + + + + Histogram + + + + + Scope + + + + + olive::SequenceDialog + + + Name: + 名稱: + + + + New Sequence + 新片段 + + + + Editing "%1" + 編輯中 "%1" + + + + Error editing Sequence + + + + + Please enter a name for this Sequence. + + + + + olive::SequenceDialogParameterTab + + + Video + 視頻 + + + + Width: + 寬度: + + + + Height: + 高度: + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + 像素長寬比 + + + + Interlacing: + + + + + Audio + 音頻 + + + + Sample Rate: + 採樣率: + + + + Channels: + + + + + Preview + + + + + Resolution: + + + + + Quality: + + + + + Save Preset + + + + + (%1x%2) + + + + + olive::SequenceDialogPresetTab + + + Preset + + + + + My Presets + + + + + 4K UHD + + + + + 1080p + 1080p + + + + 720p + 720p + + + + NTSC + + + + + PAL + + + + + %1 23.976 FPS + + + + + %1 25 FPS + + + + + %1 29.97 FPS + + + + + %1 50 FPS + + + + + %1 59.94 FPS + + + + + %1 Standard + + + + + %1 Widescreen + + + + + Delete Preset + + + + + olive::SequenceViewerPanel + + + Sequence Viewer + + + + + olive::SliderBase + + + Invalid Value + + + + + The entered value is not valid for this field. + + + + + olive::SolidGenerator + + + Solid + + + + + Generate a solid color. + + + + + Color + 顏色 + + + + olive::StringSlider + + + (none) + (無) + + + + olive::StrokeFilterNode + + + Stroke + + + + + Creates a stroke outline around an image. + + + + + Input + + + + + Color + 顏色 + + + + Radius + + + + + Opacity + 透明度 + + + + Inner + + + + + olive::Task + + + Task + + + + + Unknown error + + + + + olive::TaskDialog + + + Task Failed + + + + + olive::TaskManagerPanel + + + Task Manager + + + + + olive::TaskViewItem + + + Error: %1 + + + + + olive::TextGenerator + + + Sample Text + 文字樣本 + + + + + Text + + + + + Generate rich text. + + + + + Font + 字型 + + + + Font Size + + + + + Color + 顏色 + + + + Vertical Align + + + + + Top + 頂部 + + + + Center + + + + + Bottom + 底下 + + + + olive::TimeBasedPanel + + + (none) + (無) + + + + olive::TimeBasedWidget + + + Set Marker + 設置標記 + + + + Marker name: + + + + + olive::TimeInput + + + Time + + + + + Generates the time (in seconds) at this frame + + + + + olive::TimelinePanel + + + Timeline + 時間軸 + + + + olive::TimelineWidget + + + + Properties + 屬性 + + + + Use Audio Time Units + + + + + olive::ToolPanel + + + Tools + + + + + olive::Toolbar + + + Pointer Tool + 選擇/移動/預設 + + + + Edit Tool + 選擇部分 + + + + Ripple Tool + 漣漪的工具 + + + + Rolling Tool + + + + + Razor Tool + 剪刀 + + + + Slip Tool + 滑動工具 + + + + Slide Tool + 幻燈片工具 + + + + Hand Tool + + + + + Zoom Tool + + + + + Transition Tool + + + + + Record Tool + + + + + Add Tool + + + + + Toggle Snapping + + + + + olive::TrackOutput + + + Track + + + + + Node for representing and processing a single array of Blocks sorted by time. Also represents the end of a Sequence. + + + + + Blocks + + + + + Muted + + + + + Video %1 + + + + + Audio %1 + + + + + Subtitle %1 + + + + + Track %1 + + + + + olive::TrackViewItem + + + M + + + + + L + + + + + olive::TransitionBlock + + + From + + + + + To + + + + + Curve + + + + + Linear + 線性 + + + + Exponential + + + + + Logarithmic + + + + + olive::TrigonometryNode + + + Trigonometry + + + + + Perform a trigonometry operation on a value. + + + + + Sine + 正弦 + + + + Cosine + + + + + Tangent + + + + + Inverse Sine + + + + + Inverse Cosine + + + + + Inverse Tangent + + + + + Hyperbolic Sine + + + + + Hyperbolic Cosine + + + + + Hyperbolic Tangent + + + + + Method + + + + + olive::VideoDividerComboBox + + + Full + + + + + 1/%1 + 144p {1/%1?} + + + + olive::VideoInput + + + Video Input + + + + + Video + 視頻 + + + + Import a video footage stream. + + + + + olive::VideoStreamProperties + + + Pixel Aspect: + + + + + Interlacing: + + + + + Color Space: + + + + + Default (%1) + + + + + Premultiplied Alpha + + + + + Image Sequence + + + + + Start Index: + + + + + End Index: + + + + + Frame Rate: + + + + + Invalid Configuration + + + + + Image sequence end index must be a value higher than the start index. + + + + + olive::ViewerOutput + + + Viewer + + + + + Interface between a Viewer panel and the node system. + + + + + Texture + + + + + Samples + + + + + Video Tracks + + + + + Audio Tracks + + + + + Subtitle Tracks + + + + + olive::ViewerPanel + + + Viewer + + + + + olive::ViewerWidget + + + Error + 錯誤 + + + + No in or out points are set to cache. + + + + + + Safe Margins + + + + + Zoom + 縮放 + + + + Fit + 適合 + + + + %1% + + + + + Full Screen + 全屏 + + + + Screen %1: %2x%3 + 放映 %1: %2x%3 + + + + Deinterlace + + + + + Scopes + + + + + Cache + + + + + Auto-Cache + + + + + Pause Auto-Cache During Playback + + + + + Cache Entire Sequence + + + + + Cache Sequence In/Out + + + + + Off + 關閉 + + + + On + + + + + Custom Aspect + + + + + Show Audio Waveform + + + + + olive::VolumeNode + + + Volume - 音量 - - - - transition - - - Invalid transition - 無效的轉場效果 + 音量 - - No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - 沒有適合做轉場效果的條件 '%1'. 該效果的插件可能已經損壞. 請嘗試重新安裝它或者Olive. + + Adjusts the volume of an audio source. + + + + + Samples + From 04dd502a40e71b6e31c9d3ac0e5893a46f243b3e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Nov 2020 12:56:00 +1100 Subject: [PATCH 65/72] nodes: bypass invalidate length limit for certain track operations Fixes #1290 Fixes #1228 --- app/node/output/track/track.cpp | 23 +++++++++++---------- app/widget/timelinewidget/undo/undo.cpp | 27 +++++++++++++------------ 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index 723d97003..28f12558e 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -300,7 +300,7 @@ void TrackOutput::PrependBlock(Block *block) EndOperation(); // Everything has shifted at this point - InvalidateCache(TimeRange(0, track_length()), block_input_, block_input_); + Node::InvalidateCache(TimeRange(0, track_length()), block_input_, block_input_); } void TrackOutput::InsertBlockAtIndex(Block *block, int index) @@ -314,7 +314,7 @@ void TrackOutput::InsertBlockAtIndex(Block *block, int index) EndOperation(); - InvalidateCache(TimeRange(block->in(), track_length()), block_input_, block_input_); + Node::InvalidateCache(TimeRange(block->in(), track_length()), block_input_, block_input_); } void TrackOutput::AppendBlock(Block *block) @@ -327,7 +327,7 @@ void TrackOutput::AppendBlock(Block *block) EndOperation(); // Invalidate area that block was added to - InvalidateCache(TimeRange(block->in(), track_length()), block_input_, block_input_); + Node::InvalidateCache(TimeRange(block->in(), track_length()), block_input_, block_input_); } void TrackOutput::RippleRemoveBlock(Block *block) @@ -335,12 +335,13 @@ void TrackOutput::RippleRemoveBlock(Block *block) BeginOperation(); rational remove_in = block->in(); + rational remove_out = block->out(); block_input_->RemoveAt(GetInputIndexFromCacheIndex(block)); EndOperation(); - InvalidateCache(TimeRange(remove_in, track_length()), block_input_, block_input_); + Node::InvalidateCache(TimeRange(remove_in, qMax(track_length(), remove_out)), block_input_, block_input_); } void TrackOutput::ReplaceBlock(Block *old, Block *replace) @@ -358,9 +359,9 @@ void TrackOutput::ReplaceBlock(Block *old, Block *replace) EndOperation(); if (old->length() == replace->length()) { - InvalidateCache(TimeRange(replace->in(), replace->out()), block_input_, block_input_); + Node::InvalidateCache(TimeRange(replace->in(), replace->out()), block_input_, block_input_); } else { - InvalidateCache(TimeRange(replace->in(), RATIONAL_MAX), block_input_, block_input_); + Node::InvalidateCache(TimeRange(replace->in(), RATIONAL_MAX), block_input_, block_input_); } } @@ -434,7 +435,7 @@ void TrackOutput::Hash(QCryptographicHash &hash, const rational &time) const void TrackOutput::SetMuted(bool e) { muted_input_->set_standard_value(e); - InvalidateCache(TimeRange(0, track_length()), block_input_, block_input_); + Node::InvalidateCache(TimeRange(0, track_length()), block_input_, block_input_); } void TrackOutput::SetLocked(bool e) @@ -489,9 +490,9 @@ void TrackOutput::SetLengthInternal(const rational &r, bool invalidate) emit TrackLengthChanged(); if (invalidate) { - InvalidateCache(invalidate_range, - block_input_, - block_input_); + Node::InvalidateCache(invalidate_range, + block_input_, + block_input_); } } } @@ -594,7 +595,7 @@ void TrackOutput::BlockLengthChanged() TimeRange invalidate_region(qMin(old_out, new_out), track_length()); - InvalidateCache(invalidate_region, block_input_, block_input_); + Node::InvalidateCache(invalidate_region, block_input_, block_input_); } void TrackOutput::MutedInputValueChanged() diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index 6de8941d2..349eb0390 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -284,9 +284,9 @@ void TrackRippleRemoveAreaCommand::redo_internal() track_->EndOperation(); - track_->InvalidateCache(TimeRange(in_, insert_ ? out_ : RATIONAL_MAX), - track_->block_input(), - track_->block_input()); + track_->Node::InvalidateCache(TimeRange(in_, insert_ ? out_ : RATIONAL_MAX), + track_->block_input(), + track_->block_input()); } void TrackRippleRemoveAreaCommand::undo_internal() @@ -342,7 +342,8 @@ void TrackRippleRemoveAreaCommand::undo_internal() track_->EndOperation(); - track_->InvalidateCache(TimeRange(in_, insert_ ? out_ : RATIONAL_MAX), track_->block_input(), track_->block_input()); + track_->Node::InvalidateCache(TimeRange(in_, insert_ ? out_ : RATIONAL_MAX), + track_->block_input(), track_->block_input()); } TrackPlaceBlockCommand::TrackPlaceBlockCommand(TrackList *timeline, int track, Block *block, rational in, QUndoCommand *parent) : @@ -1092,7 +1093,7 @@ void TrackReplaceBlockWithGapCommand::redo_internal() track_->EndOperation(); - track_->InvalidateCache(invalidate_range, track_->block_input(), track_->block_input()); + track_->Node::InvalidateCache(invalidate_range, track_->block_input(), track_->block_input()); } void TrackReplaceBlockWithGapCommand::undo_internal() @@ -1137,20 +1138,20 @@ void TrackReplaceBlockWithGapCommand::undo_internal() // required no gap extension/replacement // However, we may have removed an unnecessary gap that preceded it - if (existing_merged_gap_) { - static_cast(track_->parent())->AddNode(existing_merged_gap_); - track_->AppendBlock(existing_merged_gap_); - existing_merged_gap_ = nullptr; - } + if (existing_merged_gap_) { + static_cast(track_->parent())->AddNode(existing_merged_gap_); + track_->AppendBlock(existing_merged_gap_); + existing_merged_gap_ = nullptr; + } - // Restore block - track_->AppendBlock(block_); + // Restore block + track_->AppendBlock(block_); } track_->EndOperation(); - track_->InvalidateCache(TimeRange(block_->in(), block_->out()), track_->block_input(), track_->block_input()); + track_->Node::InvalidateCache(TimeRange(block_->in(), block_->out()), track_->block_input(), track_->block_input()); } TrackSlideCommand::TrackSlideCommand(TrackOutput* track, const QList& moving_blocks, Block *in_adjacent, Block *out_adjacent, const rational& movement, QUndoCommand* parent) : From aeb7bc02b669bf66336370f78dbc2de903991884 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Nov 2020 13:08:09 +1100 Subject: [PATCH 66/72] autocache: added brief delay between changes and recache --- app/config/config.cpp | 2 +- app/render/previewautocacher.cpp | 10 +++++++++- app/render/previewautocacher.h | 12 +++++++----- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/config/config.cpp b/app/config/config.cpp index 51dc15713..3274236e1 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -91,7 +91,7 @@ void Config::SetDefaults() SetEntryInternal(QStringLiteral("Loop"), NodeParam::kBoolean, false); SetEntryInternal(QStringLiteral("SplitClipsCopyNodes"), NodeParam::kBoolean, true); - SetEntryInternal(QStringLiteral("AutoCacheInterval"), NodeParam::kInt, 250); + SetEntryInternal(QStringLiteral("AutoCacheDelay"), NodeParam::kInt, 1000); SetEntryInternal(QStringLiteral("NodeCatColor0"), NodeParam::kColor, QVariant::fromValue(Color(0.75f, 0.75f, 0.75f))); SetEntryInternal(QStringLiteral("NodeCatColor1"), NodeParam::kColor, QVariant::fromValue(Color(0.25f, 0.25f, 0.25f))); diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 7a309e467..8037b6a6f 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -24,6 +24,10 @@ PreviewAutoCacher::PreviewAutoCacher() : { // Set default autocache range SetPlayhead(rational()); + + delayed_requeue_timer_.setInterval(Config::Current()[QStringLiteral("AutoCacheDelay")].toInt()); + delayed_requeue_timer_.setSingleShot(true); + connect(&delayed_requeue_timer_, &QTimer::timeout, this, &PreviewAutoCacher::RequeueFrames); } RenderTicketPtr PreviewAutoCacher::GetSingleFrame(const rational &t) @@ -169,7 +173,9 @@ void PreviewAutoCacher::HashesProcessed() if (hash_tasks_.contains(watcher)) { hash_tasks_.removeOne(watcher); - RequeueFrames(); + // Restart delayed requeue timer + delayed_requeue_timer_.stop(); + delayed_requeue_timer_.start(); } // The cacher might be waiting for this job to finish @@ -595,6 +601,8 @@ void PreviewAutoCacher::TryRender() void PreviewAutoCacher::RequeueFrames() { + delayed_requeue_timer_.stop(); + if (viewer_node_ && viewer_node_->video_frame_cache()->HasInvalidatedRanges() && hash_tasks_.isEmpty() diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index 03898c169..99c7aec70 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -104,11 +104,6 @@ private: void TryRender(); - /** - * @brief Generic function called whenever the frames to render need to be (re)queued - */ - void RequeueFrames(); - /** * @brief Process all changes to internal NodeGraph copy * @@ -156,6 +151,8 @@ private: ColorManager* color_manager_; + QTimer delayed_requeue_timer_; + private slots: /** * @brief Handler for when the NodeGraph reports a video change over a certain time range @@ -202,6 +199,11 @@ private slots: void SingleFrameFinished(); + /** + * @brief Generic function called whenever the frames to render need to be (re)queued + */ + void RequeueFrames(); + }; } From b3c3fe0fc8fd95fec6b867fdcfcded50d987274f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Nov 2020 13:48:14 +1100 Subject: [PATCH 67/72] merged video and audio nodes into a single media node They performed exactly the same function so I don't think we need the clutter. Also bumped the project version, but old projects are automatically converted. --- app/core.cpp | 2 +- app/node/factory.cpp | 9 ++-- app/node/factory.h | 3 +- app/node/input/media/CMakeLists.txt | 3 -- app/node/input/media/audio/CMakeLists.txt | 22 -------- app/node/input/media/audio/audio.cpp | 55 -------------------- app/node/input/media/audio/audio.h | 47 ----------------- app/node/input/media/media.cpp | 2 +- app/node/input/media/media.h | 21 +++++++- app/node/input/media/video/CMakeLists.txt | 22 -------- app/node/input/media/video/video.cpp | 63 ----------------------- app/node/input/media/video/video.h | 50 ------------------ app/project/item/folder/folder.cpp | 4 +- app/project/item/folder/folder.h | 2 +- app/project/item/footage/footage.cpp | 2 +- app/project/item/footage/footage.h | 2 +- app/project/item/item.h | 2 +- app/project/item/sequence/sequence.cpp | 13 ++++- app/project/item/sequence/sequence.h | 2 +- app/project/project.cpp | 4 +- app/project/project.h | 2 +- app/task/precache/precachetask.cpp | 2 +- app/task/precache/precachetask.h | 4 +- app/task/project/load/load.cpp | 5 +- app/task/project/loadotio/loadotio.cpp | 7 +-- app/widget/timelinewidget/tool/import.cpp | 7 ++- app/widget/viewer/footageviewer.cpp | 4 +- app/widget/viewer/footageviewer.h | 7 ++- 28 files changed, 62 insertions(+), 306 deletions(-) delete mode 100644 app/node/input/media/audio/CMakeLists.txt delete mode 100644 app/node/input/media/audio/audio.cpp delete mode 100644 app/node/input/media/audio/audio.h delete mode 100644 app/node/input/media/video/CMakeLists.txt delete mode 100644 app/node/input/media/video/video.cpp delete mode 100644 app/node/input/media/video/video.h diff --git a/app/core.cpp b/app/core.cpp index 8017c8a10..0d545f41f 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -71,7 +71,7 @@ namespace olive { Core* Core::instance_ = nullptr; -const uint Core::kProjectVersion = 201003; +const uint Core::kProjectVersion = 201118; Core::Core(const CoreParams& params) : main_window_(nullptr), diff --git a/app/node/factory.cpp b/app/node/factory.cpp index a7efd6b2e..6a488f76f 100644 --- a/app/node/factory.cpp +++ b/app/node/factory.cpp @@ -32,8 +32,7 @@ #include "generator/text/text.h" #include "filter/blur/blur.h" #include "filter/stroke/stroke.h" -#include "input/media/video/video.h" -#include "input/media/audio/audio.h" +#include "input/media/media.h" #include "input/time/timeinput.h" #include "math/math/math.h" #include "math/merge/merge.h" @@ -183,10 +182,8 @@ Node *NodeFactory::CreateFromFactoryIndex(const NodeFactory::InternalID &id) return new PolygonGenerator(); case kMatrixGenerator: return new MatrixGenerator(); - case kVideoInput: - return new VideoInput(); - case kAudioInput: - return new AudioInput(); + case kFootageInput: + return new MediaInput(); case kTrackOutput: return new TrackOutput(); case kViewerOutput: diff --git a/app/node/factory.h b/app/node/factory.h index eeef59986..63f13f258 100644 --- a/app/node/factory.h +++ b/app/node/factory.h @@ -35,10 +35,9 @@ public: kViewerOutput, kClipBlock, kGapBlock, - kAudioInput, kPolygonGenerator, kMatrixGenerator, - kVideoInput, + kFootageInput, kTrackOutput, kAudioVolume, kAudioPanning, diff --git a/app/node/input/media/CMakeLists.txt b/app/node/input/media/CMakeLists.txt index a8e7169c5..3ff361000 100644 --- a/app/node/input/media/CMakeLists.txt +++ b/app/node/input/media/CMakeLists.txt @@ -14,9 +14,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -add_subdirectory(audio) -add_subdirectory(video) - set(OLIVE_SOURCES ${OLIVE_SOURCES} node/input/media/media.h diff --git a/app/node/input/media/audio/CMakeLists.txt b/app/node/input/media/audio/CMakeLists.txt deleted file mode 100644 index 02fbbb83b..000000000 --- a/app/node/input/media/audio/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Olive - Non-Linear Video Editor -# Copyright (C) 2020 Olive Team -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -set(OLIVE_SOURCES - ${OLIVE_SOURCES} - node/input/media/audio/audio.h - node/input/media/audio/audio.cpp - PARENT_SCOPE -) diff --git a/app/node/input/media/audio/audio.cpp b/app/node/input/media/audio/audio.cpp deleted file mode 100644 index fe0faff7d..000000000 --- a/app/node/input/media/audio/audio.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2020 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "audio.h" - -namespace olive { - -Node *AudioInput::copy() const -{ - return new AudioInput(); -} - -Stream::Type AudioInput::type() const -{ - return Stream::kAudio; -} - -QString AudioInput::Name() const -{ - return tr("Audio Input"); -} - -QString AudioInput::ShortName() const -{ - return tr("Audio"); -} - -QString AudioInput::id() const -{ - return QStringLiteral("org.olivevideoeditor.Olive.audioinput"); -} - -QString AudioInput::Description() const -{ - return tr("Import an audio footage stream."); -} - -} diff --git a/app/node/input/media/audio/audio.h b/app/node/input/media/audio/audio.h deleted file mode 100644 index 7a2b8a272..000000000 --- a/app/node/input/media/audio/audio.h +++ /dev/null @@ -1,47 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2020 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef AUDIOINPUT_H -#define AUDIOINPUT_H - -#include "../media.h" - -namespace olive { - -class AudioInput : public MediaInput -{ - Q_OBJECT -public: - AudioInput() = default; - - virtual Node* copy() const override; - - virtual Stream::Type type() const override; - - virtual QString Name() const override; - virtual QString ShortName() const override; - virtual QString id() const override; - virtual QString Description() const override; - -}; - -} - -#endif // AUDIOINPUT_H diff --git a/app/node/input/media/media.cpp b/app/node/input/media/media.cpp index a7ad7f953..ea9aefb6e 100644 --- a/app/node/input/media/media.cpp +++ b/app/node/input/media/media.cpp @@ -57,7 +57,7 @@ bool MediaInput::IsMedia() const void MediaInput::Retranslate() { - footage_input_->set_name(tr("Footage")); + footage_input_->set_name(tr("Media")); } NodeValueTable MediaInput::Value(NodeValueDatabase &value) const diff --git a/app/node/input/media/media.h b/app/node/input/media/media.h index c7b23ca08..4a84a7d3d 100644 --- a/app/node/input/media/media.h +++ b/app/node/input/media/media.h @@ -36,7 +36,25 @@ class MediaInput : public Node public: MediaInput(); - virtual Stream::Type type() const = 0; + virtual QString Name() const override + { + return tr("Media"); + } + + virtual QString id() const override + { + return QStringLiteral("org.olivevideoeditor.Olive.mediainput"); + } + + virtual QString Description() const override + { + return tr("Import footage into the node graph."); + } + + virtual Node* copy() const override + { + return new MediaInput(); + } virtual QVector Category() const override; @@ -45,7 +63,6 @@ public: virtual bool IsMedia() const override; - virtual void Retranslate() override; virtual NodeValueTable Value(NodeValueDatabase& value) const override; diff --git a/app/node/input/media/video/CMakeLists.txt b/app/node/input/media/video/CMakeLists.txt deleted file mode 100644 index 7ade38f4e..000000000 --- a/app/node/input/media/video/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Olive - Non-Linear Video Editor -# Copyright (C) 2020 Olive Team -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -set(OLIVE_SOURCES - ${OLIVE_SOURCES} - node/input/media/video/video.h - node/input/media/video/video.cpp - PARENT_SCOPE -) diff --git a/app/node/input/media/video/video.cpp b/app/node/input/media/video/video.cpp deleted file mode 100644 index 3bcf98352..000000000 --- a/app/node/input/media/video/video.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2020 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "video.h" - -#include -#include -#include - -#include "codec/ffmpeg/ffmpegdecoder.h" -#include "core.h" -#include "project/item/footage/footage.h" - -namespace olive { - -Node *VideoInput::copy() const -{ - return new VideoInput(); -} - -Stream::Type VideoInput::type() const -{ - return Stream::kVideo; -} - -QString VideoInput::Name() const -{ - return tr("Video Input"); -} - -QString VideoInput::ShortName() const -{ - return tr("Video"); -} - -QString VideoInput::id() const -{ - return QStringLiteral("org.olivevideoeditor.Olive.videoinput"); -} - -QString VideoInput::Description() const -{ - return tr("Import a video footage stream."); -} - -} diff --git a/app/node/input/media/video/video.h b/app/node/input/media/video/video.h deleted file mode 100644 index 0606ceece..000000000 --- a/app/node/input/media/video/video.h +++ /dev/null @@ -1,50 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2020 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#ifndef VIDEOINPUT_H -#define VIDEOINPUT_H - -#include - -#include "../media.h" -#include "render/colormanager.h" - -namespace olive { - -class VideoInput : public MediaInput -{ - Q_OBJECT -public: - VideoInput() = default; - - virtual Node* copy() const override; - - virtual Stream::Type type() const override; - - virtual QString Name() const override; - virtual QString ShortName() const override; - virtual QString id() const override; - virtual QString Description() const override; - -}; - -} - -#endif // VIDEOINPUT_H diff --git a/app/project/item/folder/folder.cpp b/app/project/item/folder/folder.cpp index 6c8ec1916..69c0aaa82 100644 --- a/app/project/item/folder/folder.cpp +++ b/app/project/item/folder/folder.cpp @@ -42,7 +42,7 @@ QIcon Folder::icon() return icon::Folder; } -void Folder::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const QAtomicInt *cancelled) +void Folder::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, uint version, const QAtomicInt *cancelled) { XMLAttributeLoop(reader, attr) { if (cancelled && *cancelled) { @@ -75,7 +75,7 @@ void Folder::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const QA } add_child(child); - child->Load(reader, xml_node_data, cancelled); + child->Load(reader, xml_node_data, version, cancelled); } } diff --git a/app/project/item/folder/folder.h b/app/project/item/folder/folder.h index 93eaa9f6c..fcd6a6d15 100644 --- a/app/project/item/folder/folder.h +++ b/app/project/item/folder/folder.h @@ -44,7 +44,7 @@ public: virtual QIcon icon() override; - virtual void Load(QXmlStreamReader* reader, XMLNodeData &xml_node_data, const QAtomicInt *cancelled) override; + virtual void Load(QXmlStreamReader* reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt *cancelled) override; virtual void Save(QXmlStreamWriter* writer) const override; diff --git a/app/project/item/footage/footage.cpp b/app/project/item/footage/footage.cpp index 01da128ef..c2d1b1c63 100644 --- a/app/project/item/footage/footage.cpp +++ b/app/project/item/footage/footage.cpp @@ -42,7 +42,7 @@ Footage::~Footage() ClearStreams(); } -void Footage::Load(QXmlStreamReader *reader, XMLNodeData &xml_node_data, const QAtomicInt* cancelled) +void Footage::Load(QXmlStreamReader *reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt* cancelled) { while (XMLReadNextStartElement(reader)) { if (cancelled && *cancelled) { diff --git a/app/project/item/footage/footage.h b/app/project/item/footage/footage.h index ec59750d8..2ffd9e272 100644 --- a/app/project/item/footage/footage.h +++ b/app/project/item/footage/footage.h @@ -60,7 +60,7 @@ public: /** * @brief Load function */ - virtual void Load(QXmlStreamReader* reader, XMLNodeData &xml_node_data, const QAtomicInt *cancelled) override; + virtual void Load(QXmlStreamReader* reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt *cancelled) override; /** * @brief Save function diff --git a/app/project/item/item.h b/app/project/item/item.h index 32ed1fb8a..efaaaf963 100644 --- a/app/project/item/item.h +++ b/app/project/item/item.h @@ -67,7 +67,7 @@ public: DISABLE_COPY_MOVE(Item) - virtual void Load(QXmlStreamReader* reader, XMLNodeData &xml_node_data, const QAtomicInt *cancelled) = 0; + virtual void Load(QXmlStreamReader* reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt *cancelled) = 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 02440f29a..d0a6d58c6 100644 --- a/app/project/item/sequence/sequence.cpp +++ b/app/project/item/sequence/sequence.cpp @@ -45,7 +45,7 @@ Sequence::Sequence() AddNode(viewer_output_); } -void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const QAtomicInt *cancelled) +void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, uint version, const QAtomicInt *cancelled) { { XMLAttributeLoop(reader, attr) { @@ -130,7 +130,16 @@ void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const { XMLAttributeLoop(reader, attr) { if (attr.name() == QStringLiteral("id")) { - node = NodeFactory::CreateFromID(attr.value().toString()); + QString id = attr.value().toString(); + if (version <= 201003) { + // After version 201003, the video and audio nodes were merged into one media node + if (id == QStringLiteral("org.olivevideoeditor.Olive.audioinput") + || id == QStringLiteral("org.olivevideoeditor.Olive.videoinput")) { + id = QStringLiteral("org.olivevideoeditor.Olive.mediainput"); + } + } + + node = NodeFactory::CreateFromID(id); break; } } diff --git a/app/project/item/sequence/sequence.h b/app/project/item/sequence/sequence.h index d364c298d..aab7920df 100644 --- a/app/project/item/sequence/sequence.h +++ b/app/project/item/sequence/sequence.h @@ -45,7 +45,7 @@ public: /** * @brief Load function */ - virtual void Load(QXmlStreamReader* reader, XMLNodeData &xml_node_data, const QAtomicInt* cancelled) override; + virtual void Load(QXmlStreamReader* reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt* cancelled) override; /** * @brief Save function diff --git a/app/project/project.cpp b/app/project/project.cpp index 839474b73..84f15dd8b 100644 --- a/app/project/project.cpp +++ b/app/project/project.cpp @@ -43,14 +43,14 @@ Project::Project() : this, &Project::DefaultColorSpaceChanged); } -void Project::Load(QXmlStreamReader *reader, MainWindowLayoutInfo* layout, const QAtomicInt* cancelled) +void Project::Load(QXmlStreamReader *reader, MainWindowLayoutInfo* layout, uint version, const QAtomicInt* cancelled) { XMLNodeData xml_node_data; while (XMLReadNextStartElement(reader)) { if (reader->name() == QStringLiteral("root")) { - root_.Load(reader, xml_node_data, cancelled); + root_.Load(reader, xml_node_data, version, cancelled); } else if (reader->name() == QStringLiteral("colormanagement")) { diff --git a/app/project/project.h b/app/project/project.h index e4075ca5d..c86bf6e64 100644 --- a/app/project/project.h +++ b/app/project/project.h @@ -47,7 +47,7 @@ class Project : public QObject public: Project(); - void Load(QXmlStreamReader* reader, MainWindowLayoutInfo *layout, const QAtomicInt* cancelled); + void Load(QXmlStreamReader* reader, MainWindowLayoutInfo *layout, uint version, const QAtomicInt* cancelled); void Save(QXmlStreamWriter* writer) const; diff --git a/app/task/precache/precachetask.cpp b/app/task/precache/precachetask.cpp index fc033dac2..b26568063 100644 --- a/app/task/precache/precachetask.cpp +++ b/app/task/precache/precachetask.cpp @@ -31,7 +31,7 @@ PreCacheTask::PreCacheTask(VideoStreamPtr footage, Sequence* sequence) : viewer()->set_video_params(sequence->video_params()); viewer()->set_audio_params(sequence->audio_params()); - video_node_ = new VideoInput(); + video_node_ = new MediaInput(); video_node_->SetStream(footage); NodeParam::ConnectEdge(video_node_->output(), viewer()->texture_input()); diff --git a/app/task/precache/precachetask.h b/app/task/precache/precachetask.h index 7fb2483e7..5f3bf0b74 100644 --- a/app/task/precache/precachetask.h +++ b/app/task/precache/precachetask.h @@ -21,7 +21,7 @@ #ifndef PRECACHETASK_H #define PRECACHETASK_H -#include "node/input/media/video/video.h" +#include "node/input/media/media.h" #include "project/item/footage/footage.h" #include "project/item/sequence/sequence.h" #include "task/render/render.h" @@ -46,7 +46,7 @@ protected: private: VideoStreamPtr footage_; - VideoInput* video_node_; + MediaInput* video_node_; }; diff --git a/app/task/project/load/load.cpp b/app/task/project/load/load.cpp index a246abbbc..1003ac2c6 100644 --- a/app/task/project/load/load.cpp +++ b/app/task/project/load/load.cpp @@ -37,6 +37,7 @@ ProjectLoadTask::ProjectLoadTask(const QString &filename) : bool ProjectLoadTask::Run() { QFile project_file(GetFilename()); + uint project_version; if (project_file.open(QFile::ReadOnly | QFile::Text)) { QXmlStreamReader reader(&project_file); @@ -45,7 +46,7 @@ bool ProjectLoadTask::Run() if (reader.name() == QStringLiteral("olive")) { while(XMLReadNextStartElement(&reader)) { if (reader.name() == QStringLiteral("version")) { - uint project_version = reader.readElementText().toUInt(); + project_version = reader.readElementText().toUInt(); if (project_version > Core::kProjectVersion) { // Project is newer than we support @@ -63,7 +64,7 @@ bool ProjectLoadTask::Run() project_->set_filename(GetFilename()); - project_->Load(&reader, &layout_info_, &IsCancelled()); + project_->Load(&reader, &layout_info_, project_version, &IsCancelled()); // Ensure project is in main thread project_->moveToThread(qApp->thread()); diff --git a/app/task/project/loadotio/loadotio.cpp b/app/task/project/loadotio/loadotio.cpp index beeb65b90..c8928ff5e 100644 --- a/app/task/project/loadotio/loadotio.cpp +++ b/app/task/project/loadotio/loadotio.cpp @@ -29,8 +29,7 @@ #include "node/block/clip/clip.h" #include "node/block/gap/gap.h" -#include "node/input/media/audio/audio.h" -#include "node/input/media/video/video.h" +#include "node/input/media/media.h" #include "project/item/folder/folder.h" #include "project/item/sequence/sequence.h" @@ -172,12 +171,10 @@ bool LoadOTIOTask::Run() } if (probed_item && probed_item->type() == Item::kFootage) { - MediaInput* media; + MediaInput* media = new MediaInput(); if (track->track_type() == Timeline::kTrackTypeVideo) { - media = new VideoInput(); media->SetStream(probed_item->get_first_stream_of_type(Stream::kVideo)); } else { - media = new AudioInput(); media->SetStream(probed_item->get_first_stream_of_type(Stream::kAudio)); } sequence->AddNode(media); diff --git a/app/widget/timelinewidget/tool/import.cpp b/app/widget/timelinewidget/tool/import.cpp index 80d610bad..61c07ed35 100644 --- a/app/widget/timelinewidget/tool/import.cpp +++ b/app/widget/timelinewidget/tool/import.cpp @@ -31,8 +31,7 @@ #include "dialog/sequence/sequence.h" #include "node/audio/volume/volume.h" #include "node/generator/matrix/matrix.h" -#include "node/input/media/audio/audio.h" -#include "node/input/media/video/video.h" +#include "node/input/media/media.h" #include "node/math/math/math.h" #include "project/item/sequence/sequence.h" #include "widget/nodeview/nodeviewundo.h" @@ -416,7 +415,7 @@ void ImportTool::DropGhosts(bool insert) switch (footage_stream->type()) { case Stream::kVideo: { - VideoInput* video_input = new VideoInput(); + MediaInput* video_input = new MediaInput(); video_input->SetStream(footage_stream); new NodeAddCommand(dst_graph, video_input, command); @@ -438,7 +437,7 @@ void ImportTool::DropGhosts(bool insert) } case Stream::kAudio: { - AudioInput* audio_input = new AudioInput(); + MediaInput* audio_input = new MediaInput(); audio_input->SetStream(footage_stream); new NodeAddCommand(dst_graph, audio_input, command); diff --git a/app/widget/viewer/footageviewer.cpp b/app/widget/viewer/footageviewer.cpp index 0cc0ef2c9..2dc2b2f7b 100644 --- a/app/widget/viewer/footageviewer.cpp +++ b/app/widget/viewer/footageviewer.cpp @@ -32,10 +32,10 @@ FootageViewerWidget::FootageViewerWidget(QWidget *parent) : ViewerWidget(parent), footage_(nullptr) { - video_node_ = new VideoInput(); + video_node_ = new MediaInput(); sequence_.AddNode(video_node_); - audio_node_ = new AudioInput(); + audio_node_ = new MediaInput(); sequence_.AddNode(audio_node_); connect(display_widget(), &ViewerDisplayWidget::DragStarted, this, &FootageViewerWidget::StartFootageDrag); diff --git a/app/widget/viewer/footageviewer.h b/app/widget/viewer/footageviewer.h index 9b76b6000..036a96c1f 100644 --- a/app/widget/viewer/footageviewer.h +++ b/app/widget/viewer/footageviewer.h @@ -21,8 +21,7 @@ #ifndef FOOTAGEVIEWERWIDGET_H #define FOOTAGEVIEWERWIDGET_H -#include "node/input/media/audio/audio.h" -#include "node/input/media/video/video.h" +#include "node/input/media/media.h" #include "node/output/viewer/viewer.h" #include "viewer.h" @@ -49,9 +48,9 @@ private: Sequence sequence_; - VideoInput* video_node_; + MediaInput* video_node_; - AudioInput* audio_node_; + MediaInput* audio_node_; QHash cached_timestamps_; From 5ff234de922750c6eb46ca2227f7a5ac70aa5d1f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Nov 2020 14:10:56 +1100 Subject: [PATCH 68/72] fixed uninitialized variable --- app/task/project/load/load.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/task/project/load/load.cpp b/app/task/project/load/load.cpp index 1003ac2c6..6a17075b5 100644 --- a/app/task/project/load/load.cpp +++ b/app/task/project/load/load.cpp @@ -37,7 +37,7 @@ ProjectLoadTask::ProjectLoadTask(const QString &filename) : bool ProjectLoadTask::Run() { QFile project_file(GetFilename()); - uint project_version; + uint project_version = Core::kProjectVersion; if (project_file.open(QFile::ReadOnly | QFile::Text)) { QXmlStreamReader reader(&project_file); From ad2e3d160fe9f83525355faa1104134ce147df67 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Nov 2020 14:21:47 +1100 Subject: [PATCH 69/72] added mosaic filter node --- app/node/factory.cpp | 3 + app/node/factory.h | 1 + app/node/filter/CMakeLists.txt | 1 + app/node/filter/mosaic/CMakeLists.txt | 22 ++++++ app/node/filter/mosaic/mosaicfilternode.cpp | 81 +++++++++++++++++++++ app/node/filter/mosaic/mosaicfilternode.h | 75 +++++++++++++++++++ app/shaders/mosaic.frag | 38 ++++++++++ 7 files changed, 221 insertions(+) create mode 100644 app/node/filter/mosaic/CMakeLists.txt create mode 100644 app/node/filter/mosaic/mosaicfilternode.cpp create mode 100644 app/node/filter/mosaic/mosaicfilternode.h create mode 100644 app/shaders/mosaic.frag diff --git a/app/node/factory.cpp b/app/node/factory.cpp index 6a488f76f..eb0eca531 100644 --- a/app/node/factory.cpp +++ b/app/node/factory.cpp @@ -31,6 +31,7 @@ #include "generator/solid/solid.h" #include "generator/text/text.h" #include "filter/blur/blur.h" +#include "filter/mosaic/mosaicfilternode.h" #include "filter/stroke/stroke.h" #include "input/media/media.h" #include "input/time/timeinput.h" @@ -212,6 +213,8 @@ Node *NodeFactory::CreateFromFactoryIndex(const NodeFactory::InternalID &id) return new CrossDissolveTransition(); case kDipToColorTransition: return new DipToColorTransition(); + case kMosaicFilter: + return new MosaicFilterNode(); case kInternalNodeCount: break; diff --git a/app/node/factory.h b/app/node/factory.h index 63f13f258..4b5942119 100644 --- a/app/node/factory.h +++ b/app/node/factory.h @@ -51,6 +51,7 @@ public: kTextGenerator, kCrossDissolveTransition, kDipToColorTransition, + kMosaicFilter, // Count value kInternalNodeCount diff --git a/app/node/filter/CMakeLists.txt b/app/node/filter/CMakeLists.txt index 6e3351a58..95e7ce21c 100644 --- a/app/node/filter/CMakeLists.txt +++ b/app/node/filter/CMakeLists.txt @@ -15,6 +15,7 @@ # along with this program. If not, see . add_subdirectory(blur) +add_subdirectory(mosaic) add_subdirectory(stroke) set(OLIVE_SOURCES diff --git a/app/node/filter/mosaic/CMakeLists.txt b/app/node/filter/mosaic/CMakeLists.txt new file mode 100644 index 000000000..17c75fa7e --- /dev/null +++ b/app/node/filter/mosaic/CMakeLists.txt @@ -0,0 +1,22 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2020 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + node/filter/mosaic/mosaicfilternode.h + node/filter/mosaic/mosaicfilternode.cpp + PARENT_SCOPE +) diff --git a/app/node/filter/mosaic/mosaicfilternode.cpp b/app/node/filter/mosaic/mosaicfilternode.cpp new file mode 100644 index 000000000..8e657151a --- /dev/null +++ b/app/node/filter/mosaic/mosaicfilternode.cpp @@ -0,0 +1,81 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2020 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "mosaicfilternode.h" + +namespace olive { + +MosaicFilterNode::MosaicFilterNode() +{ + tex_input_ = new NodeInput(QStringLiteral("tex_in"), NodeParam::kTexture); + AddInput(tex_input_); + + horiz_input_ = new NodeInput(QStringLiteral("horiz_in"), NodeParam::kFloat); + horiz_input_->set_property(QStringLiteral("min"), 1.0f); + AddInput(horiz_input_); + + vert_input_ = new NodeInput(QStringLiteral("vert_in"), NodeParam::kFloat); + vert_input_->set_property(QStringLiteral("min"), 1.0f); + AddInput(vert_input_); +} + +void MosaicFilterNode::Retranslate() +{ + tex_input_->set_name(tr("Texture")); + horiz_input_->set_name(tr("Horizontal")); + vert_input_->set_name(tr("Vertical")); +} + +NodeValueTable MosaicFilterNode::Value(NodeValueDatabase &value) const +{ + ShaderJob job; + + job.InsertValue(tex_input_, value); + job.InsertValue(horiz_input_, value); + job.InsertValue(vert_input_, value); + + // Mipmapping makes this look weird + job.SetInterpolation(tex_input_, Texture::kLinear); + + NodeValueTable table = value.Merge(); + + if (!job.GetValue(tex_input_).data.isNull()) { + TexturePtr texture = job.GetValue(tex_input_).data.value(); + + if (texture + && job.GetValue(horiz_input_).data.toInt() != texture->width() + && job.GetValue(vert_input_).data.toInt() != texture->height()) { + table.Push(NodeParam::kShaderJob, QVariant::fromValue(job), this); + } else { + table.Push(job.GetValue(tex_input_), this); + } + } + + return table; +} + +ShaderCode MosaicFilterNode::GetShaderCode(const QString &shader_id) const +{ + Q_UNUSED(shader_id) + + return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/mosaic.frag"), QString()); +} + +} diff --git a/app/node/filter/mosaic/mosaicfilternode.h b/app/node/filter/mosaic/mosaicfilternode.h new file mode 100644 index 000000000..104e05b31 --- /dev/null +++ b/app/node/filter/mosaic/mosaicfilternode.h @@ -0,0 +1,75 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2020 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef MOSAICFILTERNODE_H +#define MOSAICFILTERNODE_H + +#include "node/node.h" + +namespace olive { + +class MosaicFilterNode : public Node +{ + Q_OBJECT +public: + MosaicFilterNode(); + + virtual Node* copy() const override + { + return new MosaicFilterNode(); + } + + virtual QString Name() const override + { + return tr("Mosaic"); + } + + virtual QString id() const override + { + return QStringLiteral("org.olivevideoeditor.Olive.mosaicfilter"); + } + + virtual QVector Category() const override + { + return {kCategoryFilter}; + } + + virtual QString Description() const override + { + return tr("Apply a pixelated mosaic filter to video."); + } + + virtual void Retranslate() override; + + virtual NodeValueTable Value(NodeValueDatabase &value) const override; + virtual ShaderCode GetShaderCode(const QString &shader_id) const override; + +private: + NodeInput* tex_input_; + + NodeInput* horiz_input_; + + NodeInput* vert_input_; + +}; + +} + +#endif // MOSAICFILTERNODE_H diff --git a/app/shaders/mosaic.frag b/app/shaders/mosaic.frag new file mode 100644 index 000000000..3321e9937 --- /dev/null +++ b/app/shaders/mosaic.frag @@ -0,0 +1,38 @@ +#version 150 + +#ifdef GL_ES +precision highp int; +precision highp float; +#endif + +// Input texture +uniform sampler2D tex_in; + +uniform float horiz_in; +uniform float vert_in; + +// Input texture coordinate +in vec2 ove_texcoord; + +// Output color +out vec4 fragColor; + +void main() { + float x; + float y; + + if (horiz_in > 0.0) { + x = floor(ove_texcoord.x * horiz_in) / horiz_in; + } else { + x = ove_texcoord.x; + } + + if (vert_in > 0.0) { + y = floor(ove_texcoord.y * vert_in) / vert_in; + } else { + y = ove_texcoord.y; + } + + vec4 color = texture(tex_in, vec2(x, y)); + fragColor = color; +} From 3c3fd5bd44c6916d24f6085a49afb50ada7f0494 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Nov 2020 14:23:18 +1100 Subject: [PATCH 70/72] ensure colors are loaded from string as doubles --- app/node/input.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/node/input.cpp b/app/node/input.cpp index c305f8557..c8d07f65b 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -413,7 +413,7 @@ QVariant NodeInput::StringToValue(const DataType& data_type, const QString &stri ValidateVectorString(&vals, 4); - return QVariant::fromValue(Color(vals.at(0).toFloat(), vals.at(1).toFloat(), vals.at(2).toFloat(), vals.at(3).toFloat())); + return QVariant::fromValue(Color(vals.at(0).toDouble(), vals.at(1).toDouble(), vals.at(2).toDouble(), vals.at(3).toDouble())); } else if (data_type == kInt) { return QVariant::fromValue(string.toLongLong()); } else if (data_type == kRational) { From 640b157a2f99975bad74a4cbeed09f5332cb152c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Nov 2020 14:24:47 +1100 Subject: [PATCH 71/72] use doubles as default node colors --- app/config/config.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/config/config.cpp b/app/config/config.cpp index 3274236e1..60c659456 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -93,16 +93,16 @@ void Config::SetDefaults() SetEntryInternal(QStringLiteral("AutoCacheDelay"), NodeParam::kInt, 1000); - SetEntryInternal(QStringLiteral("NodeCatColor0"), NodeParam::kColor, QVariant::fromValue(Color(0.75f, 0.75f, 0.75f))); - SetEntryInternal(QStringLiteral("NodeCatColor1"), NodeParam::kColor, QVariant::fromValue(Color(0.25f, 0.25f, 0.25f))); - SetEntryInternal(QStringLiteral("NodeCatColor2"), NodeParam::kColor, QVariant::fromValue(Color(0.75f, 0.75f, 0.25f))); - SetEntryInternal(QStringLiteral("NodeCatColor3"), NodeParam::kColor, QVariant::fromValue(Color(0.75f, 0.25f, 0.75f))); - SetEntryInternal(QStringLiteral("NodeCatColor4"), NodeParam::kColor, QVariant::fromValue(Color(0.25f, 0.75f, 0.75f))); - SetEntryInternal(QStringLiteral("NodeCatColor5"), NodeParam::kColor, QVariant::fromValue(Color(0.50f, 0.50f, 0.50f))); - SetEntryInternal(QStringLiteral("NodeCatColor6"), NodeParam::kColor, QVariant::fromValue(Color(0.25f, 0.75f, 0.25f))); - SetEntryInternal(QStringLiteral("NodeCatColor7"), NodeParam::kColor, QVariant::fromValue(Color(0.25f, 0.25f, 0.75f))); - SetEntryInternal(QStringLiteral("NodeCatColor8"), NodeParam::kColor, QVariant::fromValue(Color(0.75f, 0.25f, 0.25f))); - SetEntryInternal(QStringLiteral("NodeCatColor9"), NodeParam::kColor, QVariant::fromValue(Color(0.55f, 0.55f, 0.75f))); + SetEntryInternal(QStringLiteral("NodeCatColor0"), NodeParam::kColor, QVariant::fromValue(Color(0.75, 0.75, 0.75))); + SetEntryInternal(QStringLiteral("NodeCatColor1"), NodeParam::kColor, QVariant::fromValue(Color(0.25, 0.25, 0.25))); + SetEntryInternal(QStringLiteral("NodeCatColor2"), NodeParam::kColor, QVariant::fromValue(Color(0.75, 0.75, 0.25))); + SetEntryInternal(QStringLiteral("NodeCatColor3"), NodeParam::kColor, QVariant::fromValue(Color(0.75, 0.25, 0.75))); + SetEntryInternal(QStringLiteral("NodeCatColor4"), NodeParam::kColor, QVariant::fromValue(Color(0.25, 0.75, 0.75))); + SetEntryInternal(QStringLiteral("NodeCatColor5"), NodeParam::kColor, QVariant::fromValue(Color(0.50, 0.50, 0.50))); + SetEntryInternal(QStringLiteral("NodeCatColor6"), NodeParam::kColor, QVariant::fromValue(Color(0.25, 0.75, 0.25))); + SetEntryInternal(QStringLiteral("NodeCatColor7"), NodeParam::kColor, QVariant::fromValue(Color(0.25, 0.25, 0.75))); + SetEntryInternal(QStringLiteral("NodeCatColor8"), NodeParam::kColor, QVariant::fromValue(Color(0.75, 0.25, 0.25))); + SetEntryInternal(QStringLiteral("NodeCatColor9"), NodeParam::kColor, QVariant::fromValue(Color(0.55, 0.55, 0.75))); SetEntryInternal(QStringLiteral("AudioOutput"), NodeParam::kString, QString()); SetEntryInternal(QStringLiteral("AudioInput"), NodeParam::kString, QString()); From afbd3ada3696bdef608c547bd1dd5d3a7e806e3b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Nov 2020 19:34:12 +1100 Subject: [PATCH 72/72] bypass track invalidate length limit on trim command --- app/widget/timelinewidget/undo/undo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index 349eb0390..d873591b9 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -942,7 +942,7 @@ void BlockTrimCommand::redo_internal() invalidate_range = TimeRange(block_->in(), block_->out()); } - track_->InvalidateCache(invalidate_range, track_->block_input(), track_->block_input()); + track_->Node::InvalidateCache(invalidate_range, track_->block_input(), track_->block_input()); } void BlockTrimCommand::undo_internal() @@ -1009,7 +1009,7 @@ void BlockTrimCommand::undo_internal() track_->EndOperation(); - track_->InvalidateCache(invalidate_range, track_->block_input(), track_->block_input()); + track_->Node::InvalidateCache(invalidate_range, track_->block_input(), track_->block_input()); } TrackReplaceBlockWithGapCommand::TrackReplaceBlockWithGapCommand(TrackOutput *track, Block *block, QUndoCommand *command) :