multimedia/olive: Added (Olive Video Editor)

Signed-off-by: Dave Woodfall <dave@slackbuilds.org>

Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
This commit is contained in:
Bloyburt 2022-08-25 22:45:40 +01:00 committed by Willy Sudiarto Raharjo
parent c45fa88c8c
commit f388a2c154
No known key found for this signature in database
GPG Key ID: 3F617144D7238786
13 changed files with 449 additions and 0 deletions

19
multimedia/olive/README Normal file
View File

@ -0,0 +1,19 @@
Olive is a cross-platform video editing application licensed under
the GNU GPL version 3. The plan of the development team is to combine
complete colour managment, a fast and high-fidelity float-based
render pipeline, node-based compositing and audio-mixing, and a
highly efficient automated disk cache all together in one program.
It should be noted that Olive is still in the early alpha stages of
development, and thus should not be used for serious projects; if you
do choose to use Olive for any serious projects, frequent backups of
said projects are highly recommended.
This SlackBuild packages an older version of Olive (0.1.2), which is
the latest stable version as of this writing.
The patches in this SlackBuild were originally written by Tércio
Martins for Arch's Olive AUR, and have been graciously re-used here
with his permission.
Homepage: https://olivevideoeditor.org/

View File

@ -0,0 +1,14 @@
if [ -x /usr/bin/update-desktop-database ]; then
/usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
fi
if [ -x /usr/bin/update-mime-database ]; then
/usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
fi
# If other icon themes are installed, then add to/modify this as needed
if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
if [ -x /usr/bin/gtk-update-icon-cache ]; then
/usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
fi
fi

View File

@ -0,0 +1,12 @@
diff --unified --recursive --text olive-0.1.2-orig/ui/flowlayout.cpp olive-0.1.2-new/ui/flowlayout.cpp
--- olive-0.1.2-orig/ui/flowlayout.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/flowlayout.cpp 2020-06-23 18:29:57.338203268 -0300
@@ -114,7 +114,7 @@
Qt::Orientations FlowLayout::expandingDirections() const
{
- return 0;
+ return { };
}
bool FlowLayout::hasHeightForWidth() const

View File

@ -0,0 +1,121 @@
diff --unified --recursive --text olive-0.1.2-orig/effects/internal/texteffect.cpp olive-0.1.2-new/effects/internal/texteffect.cpp
--- olive-0.1.2-orig/effects/internal/texteffect.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/effects/internal/texteffect.cpp 2020-06-23 17:41:00.714422192 -0300
@@ -183,11 +183,11 @@
if (word_wrap_field->GetBoolAt(timecode)) {
for (int i=0;i<lines.size();i++) {
QString s(lines.at(i));
- if (fm.width(s) > width) {
+ if (fm.horizontalAdvance(s) > width) {
int last_space_index = 0;
for (int j=0;j<s.length();j++) {
if (s.at(j) == ' ') {
- if (fm.width(s.left(j)) > width) {
+ if (fm.horizontalAdvance(s.left(j)) > width) {
break;
} else {
last_space_index = j;
@@ -211,11 +211,11 @@
switch (halign_field->GetValueAt(timecode).toInt()) {
case Qt::AlignLeft: text_x = 0; break;
- case Qt::AlignRight: text_x = width - fm.width(lines.at(i)); break;
+ case Qt::AlignRight: text_x = width - fm.horizontalAdvance(lines.at(i)); break;
case Qt::AlignJustify:
// add spaces until the string is too big
text_x = 0;
- while (fm.width(lines.at(i)) < width) {
+ while (fm.horizontalAdvance(lines.at(i)) < width) {
bool space = false;
QString spaced(lines.at(i));
for (int i=0;i<spaced.length();i++) {
@@ -228,7 +228,7 @@
while (i < spaced.length() && spaced.at(i) == ' ') i++;
}
}
- if (fm.width(spaced) > width || !space) {
+ if (fm.horizontalAdvance(spaced) > width || !space) {
break;
} else {
lines[i] = spaced;
@@ -237,7 +237,7 @@
break;
case Qt::AlignHCenter:
default:
- text_x = (width/2) - (fm.width(lines.at(i))/2);
+ text_x = (width/2) - (fm.horizontalAdvance(lines.at(i))/2);
break;
}
diff --unified --recursive --text olive-0.1.2-orig/effects/internal/timecodeeffect.cpp olive-0.1.2-new/effects/internal/timecodeeffect.cpp
--- olive-0.1.2-orig/effects/internal/timecodeeffect.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/effects/internal/timecodeeffect.cpp 2020-06-23 17:41:51.815020590 -0300
@@ -117,7 +117,7 @@
int text_x, text_y, rect_y, offset_x, offset_y;
int text_height = fm.height();
- int text_width = fm.width(display_timecode);
+ int text_width = fm.horizontalAdvance(display_timecode);
QColor background_color = color_bg_val->GetColorAt(timecode);
int alpha_val = qCeil(bg_alpha->GetDoubleAt(timecode)*2.55);
background_color.setAlpha(alpha_val);
diff --unified --recursive --text olive-0.1.2-orig/ui/graphview.cpp olive-0.1.2-new/ui/graphview.cpp
--- olive-0.1.2-orig/ui/graphview.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/graphview.cpp 2020-06-23 17:38:31.572539882 -0300
@@ -175,7 +175,7 @@
void GraphView::draw_line_text(QPainter &p, bool vert, int line_no, int line_pos, int next_line_pos) {
// draws last line's text
QString str = QString::number(line_no*kGraphSize);
- int text_sz = vert ? fontMetrics().height() : fontMetrics().width(str);
+ int text_sz = vert ? fontMetrics().height() : fontMetrics().horizontalAdvance(str);
if (text_sz < (next_line_pos - line_pos)) {
QRect text_rect = vert ? QRect(0, line_pos-50, 50, 50) : QRect(line_pos, height()-50, 50, 50);
p.drawText(text_rect, Qt::AlignBottom | Qt::AlignLeft, str);
diff --unified --recursive --text olive-0.1.2-orig/ui/sourceiconview.cpp olive-0.1.2-new/ui/sourceiconview.cpp
--- olive-0.1.2-orig/ui/sourceiconview.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/sourceiconview.cpp 2020-06-23 17:42:48.155657141 -0300
@@ -140,7 +140,7 @@
painter->setPen(text_fgcolor);
QString duration_str = index.data(Qt::UserRole).toString();
- int timecode_width = fm.width(duration_str);
+ int timecode_width = fm.horizontalAdvance(duration_str);
int max_name_width = option.rect.width();
if (timecode_width < option.rect.width() / 2) {
diff --unified --recursive --text olive-0.1.2-orig/ui/timelineheader.cpp olive-0.1.2-new/ui/timelineheader.cpp
--- olive-0.1.2-orig/ui/timelineheader.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/timelineheader.cpp 2020-06-23 17:43:45.496282517 -0300
@@ -390,7 +390,7 @@
bool draw_text = false;
if (text_enabled && lineX-textWidth > lastTextBoundary) {
timecode = frame_to_timecode(frame + in_visible, olive::CurrentConfig.timecode_view, viewer->seq->frame_rate);
- fullTextWidth = fm.width(timecode);
+ fullTextWidth = fm.horizontalAdvance(timecode);
textWidth = fullTextWidth>>1;
text_x = lineX;
diff --unified --recursive --text olive-0.1.2-orig/ui/timelinewidget.cpp olive-0.1.2-new/ui/timelinewidget.cpp
--- olive-0.1.2-orig/ui/timelinewidget.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/timelinewidget.cpp 2020-06-23 17:39:05.582988929 -0300
@@ -3162,7 +3162,7 @@
}
if (clip->linked.size() > 0) {
int underline_y = olive::timeline::kClipTextPadding + p.fontMetrics().height() + clip_rect.top();
- int underline_width = qMin(text_rect.width() - 1, p.fontMetrics().width(clip->name()));
+ int underline_width = qMin(text_rect.width() - 1, p.fontMetrics().horizontalAdvance(clip->name()));
p.drawLine(text_rect.x(), underline_y, text_rect.x() + underline_width, underline_y);
}
QString name = clip->name();
diff --unified --recursive --text olive-0.1.2-orig/ui/viewerwindow.cpp olive-0.1.2-new/ui/viewerwindow.cpp
--- olive-0.1.2-orig/ui/viewerwindow.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/viewerwindow.cpp 2020-06-23 17:44:21.156661091 -0300
@@ -172,7 +172,7 @@
p.setPen(Qt::white);
p.setBrush(QColor(0, 0, 0, 128));
- int text_width = fm.width(fs_str);
+ int text_width = fm.horizontalAdvance(fs_str);
int text_x = (width()/2)-(text_width/2);
int text_y = fm.height()+fm.ascent();

View File

@ -0,0 +1,44 @@
diff --unified --recursive --text olive-0.1.2-orig/effects/internal/texteffect.cpp olive-0.1.2-new/effects/internal/texteffect.cpp
--- olive-0.1.2-orig/effects/internal/texteffect.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/effects/internal/texteffect.cpp 2020-06-23 03:57:45.377783457 -0300
@@ -25,6 +25,7 @@
#include <QOpenGLTexture>
#include <QTextEdit>
#include <QPainter>
+#include <QPainterPath>
#include <QPushButton>
#include <QColorDialog>
#include <QFontDatabase>
diff --unified --recursive --text olive-0.1.2-orig/effects/internal/timecodeeffect.cpp olive-0.1.2-new/effects/internal/timecodeeffect.cpp
--- olive-0.1.2-orig/effects/internal/timecodeeffect.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/effects/internal/timecodeeffect.cpp 2020-06-23 05:44:58.589605133 -0300
@@ -25,6 +25,7 @@
#include <QOpenGLTexture>
#include <QTextEdit>
#include <QPainter>
+#include <QPainterPath>
#include <QPushButton>
#include <QColorDialog>
#include <QFontDatabase>
diff --unified --recursive --text olive-0.1.2-orig/ui/graphview.cpp olive-0.1.2-new/ui/graphview.cpp
--- olive-0.1.2-orig/ui/graphview.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/graphview.cpp 2020-06-23 05:48:06.800458024 -0300
@@ -21,6 +21,7 @@
#include "graphview.h"
#include <QPainter>
+#include <QPainterPath>
#include <QMouseEvent>
#include <QtMath>
#include <cfloat>
diff --unified --recursive --text olive-0.1.2-orig/ui/timelineheader.cpp olive-0.1.2-new/ui/timelineheader.cpp
--- olive-0.1.2-orig/ui/timelineheader.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/timelineheader.cpp 2020-06-23 05:48:36.440594616 -0300
@@ -21,6 +21,7 @@
#include "timelineheader.h"
#include <QPainter>
+#include <QPainterPath>
#include <QMouseEvent>
#include <QScrollBar>
#include <QtMath>

View File

@ -0,0 +1,21 @@
diff --unified --recursive --text olive-0.1.2-orig/ui/graphview.cpp olive-0.1.2-new/ui/graphview.cpp
--- olive-0.1.2-orig/ui/graphview.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/graphview.cpp 2020-06-23 17:55:37.852888364 -0300
@@ -795,7 +795,7 @@
new_y_zoom = y_zoom + (zoom_diff * (delta_v / 120.0));
// Center zoom around the mouse cursor vertically
- int true_mouse_y = height()-event->pos().y();
+ int true_mouse_y = height()-event->position().y();
set_scroll_y(qRound((double(y_scroll + true_mouse_y) / y_zoom) * new_y_zoom) - true_mouse_y);
redraw = true;
@@ -807,7 +807,7 @@
new_x_zoom = x_zoom + (zoom_diff * (delta_h / 120.0));
// Center zoom around the mouse cursor horizontally
- set_scroll_x(qRound((double(x_scroll + event->pos().x()) / x_zoom) * new_x_zoom) - event->pos().x());
+ set_scroll_x(qRound((double(x_scroll + event->position().x()) / x_zoom) * new_x_zoom) - event->position().x());
redraw = true;
}

View File

@ -0,0 +1,24 @@
diff --unified --recursive --text olive-0.1.2-orig/packaging/linux/org.olivevideoeditor.Olive.appdata.xml olive-0.1.2-new/packaging/linux/org.olivevideoeditor.Olive.appdata.xml
--- olive-0.1.2-orig/packaging/linux/org.olivevideoeditor.Olive.appdata.xml 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/packaging/linux/org.olivevideoeditor.Olive.appdata.xml 2020-06-23 22:02:58.793224798 -0300
@@ -31,7 +31,6 @@
</screenshots>
<content_rating type="oars-1.1" />
<releases>
- <release version="20181223" date="2018-12-23"></release>
- <release version="20181130" date="2018-11-30"></release>
+ <release version="0.1.2" date="2019-11-11"/>
</releases>
</component>
diff --unified --recursive --text olive-0.1.2-orig/packaging/linux/org.olivevideoeditor.Olive.desktop olive-0.1.2-new/packaging/linux/org.olivevideoeditor.Olive.desktop
--- olive-0.1.2-orig/packaging/linux/org.olivevideoeditor.Olive.desktop 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/packaging/linux/org.olivevideoeditor.Olive.desktop 2020-06-23 22:03:16.533367553 -0300
@@ -3,7 +3,7 @@
Comment=Professional open-source non-linear video editor
Comment[it]=Programma di montaggio video professionale open-source
Comment[id]=Aplikasi edit video yang non-linier, profesional serta sumbernya terbuka.
-Exec=olive-editor
+Exec=olive-editor %f
Icon=org.olivevideoeditor.Olive
Terminal=false
Type=Application

View File

@ -0,0 +1,24 @@
diff --unified --recursive --text olive-0.1.2-orig/rendering/cacher.cpp olive-0.1.2-new/rendering/cacher.cpp
--- olive-0.1.2-orig/rendering/cacher.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/rendering/cacher.cpp 2020-06-23 16:08:47.307076532 -0300
@@ -254,7 +254,7 @@
dout << "starting rev_frame";
#endif
rev_frame->nb_samples = 0;
- rev_frame->pts = frame_->pkt_pts;
+ rev_frame->pts = frame_->pts;
}
int offset = rev_frame->nb_samples * av_get_bytes_per_sample(static_cast<AVSampleFormat>(rev_frame->format)) * rev_frame->channels;
#ifdef AUDIOWARNINGS
@@ -277,9 +277,9 @@
/*
#ifdef AUDIOWARNINGS
dout << "time for the end of rev cache" << rev_frame->nb_samples << clip->rev_target << frame_->pts << frame_->pkt_duration << frame_->nb_samples;
- dout << "diff:" << (frame_->pkt_pts + frame_->pkt_duration) - clip->rev_target;
+ dout << "diff:" << (frame_->pts + frame_->pkt_duration) - clip->rev_target;
#endif
- int cutoff = qRound64((((frame_->pkt_pts + frame_->pkt_duration) - reverse_target) * timebase) * audio_output->format().sampleRate());
+ int cutoff = qRound64((((frame_->pts + frame_->pkt_duration) - reverse_target) * timebase) * audio_output->format().sampleRate());
if (cutoff > 0) {
#ifdef AUDIOWARNINGS
dout << "cut off" << cutoff << "samples (rate:" << audio_output->format().sampleRate() << ")";

View File

@ -0,0 +1,14 @@
diff --unified --recursive --text olive-0.1.2-orig/ui/clickablelabel.h olive-0.1.2-new/ui/clickablelabel.h
--- olive-0.1.2-orig/ui/clickablelabel.h 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/ui/clickablelabel.h 2020-06-23 14:12:08.786765041 -0300
@@ -31,8 +31,8 @@
class ClickableLabel : public QLabel {
Q_OBJECT
public:
- ClickableLabel(QWidget * parent = 0, Qt::WindowFlags f = 0);
- ClickableLabel(const QString & text, QWidget * parent = 0, Qt::WindowFlags f = 0);
+ ClickableLabel(QWidget * parent = 0, Qt::WindowFlags f = Qt::Widget);
+ ClickableLabel(const QString & text, QWidget * parent = 0, Qt::WindowFlags f = Qt::Widget);
void mousePressEvent(QMouseEvent *ev);
signals:
void clicked();

View File

@ -0,0 +1,18 @@
diff --unified --recursive --text olive-0.1.2-orig/project/proxygenerator.cpp olive-0.1.2-new/project/proxygenerator.cpp
--- olive-0.1.2-orig/project/proxygenerator.cpp 2019-11-11 03:05:02.000000000 -0300
+++ olive-0.1.2-new/project/proxygenerator.cpp 2020-06-23 21:07:29.808353198 -0300
@@ -167,7 +167,13 @@
}
// write video header
- avformat_write_header(output_fmt_ctx, nullptr);
+ int error_code;
+ error_code = avformat_write_header(output_fmt_ctx, nullptr);
+ if (error_code < 0) {
+ qWarning() << "Failed to write video header";
+ cancelled = true;
+ skip = true;
+ }
// packet that av_read_frame will dump file packets into
AVPacket packet;

View File

@ -0,0 +1,109 @@
#!/bin/bash
# Slackware build script for olive
# Copyright 2022 Bloyburt
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=olive
VERSION=${VERSION:-0.1.2}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) ARCH=i586 ;;
arm*) ARCH=arm ;;
*) ARCH=$( uname -m ) ;;
esac
fi
# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
# the name of the created package would be, and then exit. This information
# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
fi
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
LIBDIRSUFFIX=""
fi
set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
-o -perm 511 \) -exec chmod 755 {} \; -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
# Apply the various patches
for i in $CWD/*.patch; do patch -p1 < $i; done
mkdir -p build
cd build
cmake \
-DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=Release ..
make
make install/strip DESTDIR=$PKG
cd ..
rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a *.md $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE

View File

@ -0,0 +1,10 @@
PRGNAM="olive"
VERSION="0.1.2"
HOMEPAGE="https://olivevideoeditor.org/"
DOWNLOAD="https://github.com/olive-editor/olive/archive/0.1.2/olive-0.1.2.tar.gz"
MD5SUM="69f391ff44060ae08c7a462d71504515"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="openimageio opencolorio graphviz"
MAINTAINER="Bloyburt"
EMAIL="alexpen@startmail.com"

View File

@ -0,0 +1,19 @@
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.
# Line up the first '|' above the ':' following the base package name, and
# the '|' on the right side marks the last column you can put a character in.
# You must make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
olive: olive (Olive Video Editor)
olive:
olive: Olive is a cross-platform video editing application licensed under
olive: the GNU GPL version 3. The plan of the development team is to combine
olive: complete colour managment, a fast and high-fidelity float-based
olive: render pipeline, node-based compositing and audio-mixing, and a
olive: highly efficient automated disk cache all together in one program.
olive:
olive: Homepage: https://olivevideoeditor.org/
olive:
olive: