mirror of
https://invent.kde.org/multimedia/kdenlive
synced 2025-12-06 16:29:58 +01:00
Compare commits
12 Commits
work/embed
...
v21.04.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8414e83fe7 | ||
|
|
a735af832e | ||
|
|
3f1c428b0d | ||
|
|
10ef3b9d6c | ||
|
|
dc00699237 | ||
|
|
3195a83785 | ||
|
|
be5f24f72a | ||
|
|
f32acaf7b6 | ||
|
|
8ab92f3906 | ||
|
|
f24a21e92a | ||
|
|
e2da06720b | ||
|
|
fcd82a3fde |
@@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 3.0)
|
||||
# KDE Application Version, managed by release script
|
||||
set (RELEASE_SERVICE_VERSION_MAJOR "21")
|
||||
set (RELEASE_SERVICE_VERSION_MINOR "04")
|
||||
set (RELEASE_SERVICE_VERSION_MICRO "2")
|
||||
set (RELEASE_SERVICE_VERSION_MICRO "3")
|
||||
|
||||
set(KDENLIVE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
|
||||
|
||||
|
||||
@@ -267,10 +267,10 @@
|
||||
</ul>
|
||||
</description>
|
||||
<releases>
|
||||
<release version="21.04.3" date="2021-07-08"/>
|
||||
<release version="21.04.2" date="2021-06-10"/>
|
||||
<release version="21.04.1" date="2021-05-13"/>
|
||||
<release version="21.04.0" date="2021-04-22"/>
|
||||
<release version="20.12.3" date="2021-03-04"/>
|
||||
</releases>
|
||||
<url type="homepage">https://kdenlive.org/</url>
|
||||
<url type="bugtracker">https://bugs.kde.org</url>
|
||||
|
||||
0
data/scripts/checkvosk.py
Normal file → Executable file
0
data/scripts/checkvosk.py
Normal file → Executable file
@@ -23,6 +23,7 @@ if not os.path.exists(sys.argv[2]):
|
||||
sample_rate=16000
|
||||
model = Model(sys.argv[2])
|
||||
rec = KaldiRecognizer(model, sample_rate)
|
||||
rec.SetWords(True)
|
||||
|
||||
process = subprocess.Popen(['ffmpeg', '-loglevel', 'quiet', '-i',
|
||||
sys.argv[3],
|
||||
|
||||
@@ -22,6 +22,7 @@ if not os.path.exists(sys.argv[2]):
|
||||
sample_rate=16000
|
||||
model = Model(sys.argv[2])
|
||||
rec = KaldiRecognizer(model, sample_rate)
|
||||
rec.SetWords(True)
|
||||
|
||||
# zone rendering
|
||||
if len(sys.argv) > 4 and (float(sys.argv[4])>0 or float(sys.argv[5])>0):
|
||||
|
||||
@@ -134,6 +134,7 @@ int main(int argc, char **argv)
|
||||
|
||||
// older MLT version, does not support embedded consumer in/out in xml, and current
|
||||
// MLT (6.16) does not pass it onto the multi / movit consumer, so read it manually and enforce
|
||||
LocaleHandling::resetAllLocale();
|
||||
QFile f(playlist);
|
||||
QDomDocument doc;
|
||||
doc.setContent(&f, false);
|
||||
@@ -146,7 +147,6 @@ int main(int argc, char **argv)
|
||||
playlist.append(QStringLiteral("?multi=1"));
|
||||
}
|
||||
}
|
||||
LocaleHandling::resetAllLocale();
|
||||
auto *rJob = new RenderJob(render, playlist, target, pid, in, out, qApp);
|
||||
rJob->start();
|
||||
QObject::connect(rJob, &RenderJob::renderingFinished, rJob, [&, rJob]() {
|
||||
|
||||
@@ -737,7 +737,7 @@ QString KeyframeModel::getRotoProperty() const
|
||||
int out = in + ptr->data(m_index, AssetParameterModel::ParentDurationRole).toInt();
|
||||
QVariantMap map;
|
||||
for (const auto &keyframe : m_keyframeList) {
|
||||
map.insert(QString::number(keyframe.first.frames(pCore->getCurrentFps())).rightJustified(int(log10(double(out + 1))), '0'), keyframe.second.second);
|
||||
map.insert(QString::number(keyframe.first.frames(pCore->getCurrentFps())).rightJustified(int(log10(double(out))) + 1, '0'), keyframe.second.second);
|
||||
}
|
||||
doc = QJsonDocument::fromVariant(map);
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ QStringList ClipCreationDialog::getExtensions()
|
||||
mimeTypes << QStringLiteral("image/gif") << QStringLiteral("image/jpeg") << QStringLiteral("image/png") << QStringLiteral("image/x-tga")
|
||||
<< QStringLiteral("image/x-bmp") << QStringLiteral("image/svg+xml") << QStringLiteral("image/tiff") << QStringLiteral("image/x-xcf")
|
||||
<< QStringLiteral("image/x-xcf-gimp") << QStringLiteral("image/x-vnd.adobe.photoshop") << QStringLiteral("image/x-pcx")
|
||||
<< QStringLiteral("image/x-exr") << QStringLiteral("image/x-portable-pixmap") << QStringLiteral("application/x-krita");
|
||||
<< QStringLiteral("image/x-exr") << QStringLiteral("image/x-portable-pixmap") << QStringLiteral("application/x-krita") << QStringLiteral("image/webp");
|
||||
|
||||
QMimeDatabase db;
|
||||
QStringList allExtensions;
|
||||
|
||||
@@ -1887,8 +1887,10 @@ void KdenliveSettingsDialog::checkVoskDependencies()
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
QString pyExec = QStandardPaths::findExecutable(QStringLiteral("python"));
|
||||
QString pip3Exec = QStandardPaths::findExecutable(QStringLiteral("pip"));
|
||||
#else
|
||||
QString pyExec = QStandardPaths::findExecutable(QStringLiteral("python3"));
|
||||
QString pip3Exec = QStandardPaths::findExecutable(QStringLiteral("pip3"));
|
||||
#endif
|
||||
if (pyExec.isEmpty()) {
|
||||
doShowSpeechMessage(i18n("Cannot find python3, please install it on your system."), KMessageWidget::Warning);
|
||||
@@ -1925,7 +1927,7 @@ void KdenliveSettingsDialog::checkVoskDependencies()
|
||||
} else {
|
||||
if (m_speechListWidget->count() == 0) {
|
||||
doShowSpeechMessage(i18n("Please add a speech model."), KMessageWidget::Information);
|
||||
} else {
|
||||
} else if (!pip3Exec.isEmpty()) {
|
||||
if (!m_voskUpdated) {
|
||||
// only allow upgrading python modules once
|
||||
m_voskAction->setText(i18n("Check for update"));
|
||||
@@ -1939,7 +1941,7 @@ void KdenliveSettingsDialog::checkVoskDependencies()
|
||||
} else {
|
||||
if (m_speechListWidget->count() == 0) {
|
||||
doShowSpeechMessage(i18n("Please add a speech model."), KMessageWidget::Information);
|
||||
} else {
|
||||
} else if (!pip3Exec.isEmpty()) {
|
||||
if (!m_voskUpdated) {
|
||||
// only allow upgrading python modules once
|
||||
m_voskAction->setText(i18n("Check for update"));
|
||||
|
||||
@@ -50,11 +50,11 @@ void LocaleHandling::resetLocale()
|
||||
void LocaleHandling::resetAllLocale()
|
||||
{
|
||||
#ifdef Q_OS_FREEBSD
|
||||
setlocale(LC_ALL, "C");
|
||||
setlocale(LC_ALL, "C.UTF-8");
|
||||
#else
|
||||
std::setlocale(LC_ALL, "C");
|
||||
std::setlocale(LC_ALL, "C.UTF-8");
|
||||
#endif
|
||||
::qputenv("LC_ALL", "C");
|
||||
::qputenv("LC_ALL", "C.UTF-8");
|
||||
}
|
||||
|
||||
QPair<QLocale, LocaleHandling::MatchType> LocaleHandling::getQLocaleForDecimalPoint(const QString &requestedLocale, const QString &decimalPoint)
|
||||
|
||||
@@ -121,7 +121,10 @@ GLWidget::GLWidget(int id, QObject *parent)
|
||||
setPersistentSceneGraph(true);
|
||||
setClearBeforeRendering(false);
|
||||
setResizeMode(QQuickView::SizeRootObjectToView);
|
||||
m_offscreenSurface.setFormat(QOpenGLContext::globalShareContext()->format());
|
||||
auto fmt = QOpenGLContext::globalShareContext()->format();
|
||||
fmt.setDepthBufferSize(format().depthBufferSize());
|
||||
fmt.setStencilBufferSize(format().stencilBufferSize());
|
||||
m_offscreenSurface.setFormat(fmt);
|
||||
m_offscreenSurface.create();
|
||||
|
||||
m_refreshTimer.setSingleShot(true);
|
||||
|
||||
@@ -210,11 +210,13 @@ bool ClipModel::requestResize(int size, bool right, Fun &undo, Fun &redo, bool l
|
||||
outPoint = out - in;
|
||||
inPoint = 0;
|
||||
}
|
||||
bool closing = false;
|
||||
if (m_currentTrackId != -1) {
|
||||
if (auto ptr = m_parent.lock()) {
|
||||
if (ptr->getTrackById(m_currentTrackId)->isLocked()) {
|
||||
return false;
|
||||
}
|
||||
closing = ptr->m_closing;
|
||||
if (right && ptr->getTrackById_const(m_currentTrackId)->isLastClip(getPosition())) {
|
||||
trackDuration = ptr->getTrackById_const(m_currentTrackId)->trackDuration();
|
||||
}
|
||||
@@ -316,7 +318,9 @@ bool ClipModel::requestResize(int size, bool right, Fun &undo, Fun &redo, bool l
|
||||
qDebug() << "----------\n-----------\n// ADJUSTING EFFECT LENGTH, LOGUNDO " << logUndo << ", " << old_in << "/" << inPoint << ", "
|
||||
<< m_producer->get_playtime();
|
||||
|
||||
adjustEffectLength(right, old_in, inPoint, old_out - old_in, m_producer->get_playtime(), offset, reverse, operation, logUndo);
|
||||
if (!closing) {
|
||||
adjustEffectLength(right, old_in, inPoint, old_out - old_in, m_producer->get_playtime(), offset, reverse, operation, logUndo);
|
||||
}
|
||||
UPDATE_UNDO_REDO(operation, reverse, undo, redo);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1841,7 +1841,13 @@ bool TimelineModel::requestClipDeletion(int clipId, Fun &undo, Fun &redo)
|
||||
res = getTrackById(trackId)->requestRemoveMix({clipId, mixData.secondClipId}, undo, redo);
|
||||
}
|
||||
}
|
||||
res = res && getTrackById(trackId)->requestClipDeletion(clipId, true, true, undo, redo, false, true);
|
||||
if (getTrackById_const(trackId)->hasStartMix(clipId)) {
|
||||
MixInfo mixData = getTrackById_const(trackId)->getMixInfo(clipId).first;
|
||||
if (isClip(mixData.firstClipId)) {
|
||||
res = getTrackById(trackId)->requestRemoveMix({mixData.firstClipId, clipId}, undo, redo);
|
||||
}
|
||||
}
|
||||
res = res && getTrackById(trackId)->requestClipDeletion(clipId, true, !m_closing, undo, redo, false, true);
|
||||
if (!res) {
|
||||
undo();
|
||||
return false;
|
||||
|
||||
@@ -98,6 +98,8 @@ void TimelineController::prepareClose()
|
||||
disconnect(m_model.get(), &TimelineModel::selectionChanged, this, &TimelineController::selectionChanged);
|
||||
disconnect(this, &TimelineController::videoTargetChanged, this, &TimelineController::updateVideoTarget);
|
||||
disconnect(this, &TimelineController::audioTargetChanged, this, &TimelineController::updateAudioTarget);
|
||||
disconnect(m_model.get(), &TimelineModel::selectedMixChanged, this, &TimelineController::showMixModel);
|
||||
disconnect(m_model.get(), &TimelineModel::selectedMixChanged, this, &TimelineController::selectedMixChanged);
|
||||
m_ready = false;
|
||||
m_root = nullptr;
|
||||
// Delete timeline preview before resetting model so that removing clips from timeline doesn't invalidate
|
||||
@@ -133,10 +135,8 @@ void TimelineController::setModel(std::shared_ptr<TimelineItemModel> model)
|
||||
connect(m_model.get(), &TimelineModel::invalidateZone, this, &TimelineController::invalidateZone, Qt::DirectConnection);
|
||||
connect(m_model.get(), &TimelineModel::durationUpdated, this, &TimelineController::checkDuration);
|
||||
connect(m_model.get(), &TimelineModel::selectionChanged, this, &TimelineController::selectionChanged);
|
||||
connect(m_model.get(), &TimelineModel::selectedMixChanged, [this] (int cid, const std::shared_ptr<AssetParameterModel> &asset) {
|
||||
emit showMixModel(cid, asset);
|
||||
emit selectedMixChanged();
|
||||
});
|
||||
connect(m_model.get(), &TimelineModel::selectedMixChanged, this, &TimelineController::showMixModel);
|
||||
connect(m_model.get(), &TimelineModel::selectedMixChanged, this, &TimelineController::selectedMixChanged);
|
||||
connect(m_model.get(), &TimelineModel::checkTrackDeletion, this, &TimelineController::checkTrackDeletion, Qt::DirectConnection);
|
||||
}
|
||||
|
||||
|
||||
@@ -179,10 +179,7 @@ void TimelineWidget::setModel(const std::shared_ptr<TimelineItemModel> &model, M
|
||||
rootContext()->setContextProperty("audiorec", pCore->getAudioDevice());
|
||||
rootContext()->setContextProperty("guidesModel", pCore->projectManager()->current()->getGuideModel().get());
|
||||
rootContext()->setContextProperty("clipboard", new ClipboardProxy(this));
|
||||
QFont ft = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
|
||||
ft.setPointSize(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont).pointSize());
|
||||
setFont(ft);
|
||||
rootContext()->setContextProperty("miniFont", font());
|
||||
rootContext()->setContextProperty("miniFont", QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont));
|
||||
rootContext()->setContextProperty("subtitleModel", pCore->getSubtitleModel().get());
|
||||
const QStringList effs = sortedItems(KdenliveSettings::favorite_effects(), false).values();
|
||||
const QStringList trans = sortedItems(KdenliveSettings::favorite_transitions(), true).values();
|
||||
|
||||
Reference in New Issue
Block a user