Add test for disappearing timeline effects, and some fixes for a random nesting test heap after use

This commit is contained in:
Jean-Baptiste Mardelle
2023-07-07 16:03:51 +02:00
parent cb50a866ef
commit 7bb5f92100
10 changed files with 942 additions and 19 deletions

View File

@@ -131,7 +131,9 @@ ProjectClip::ProjectClip(const QString &id, const QIcon &thumb, const std::share
setTags(getProducerProperty(QStringLiteral("kdenlive:tags")));
AbstractProjectItem::setRating(uint(getProducerIntProperty(QStringLiteral("kdenlive:rating"))));
connectEffectStack();
if (m_clipStatus == FileStatus::StatusProxy || m_clipStatus == FileStatus::StatusReady || m_clipStatus == FileStatus::StatusProxyOnly) {
// Timeline clip thumbs will be generated later after the tractor has been updated
if (m_clipType != ClipType::Timeline &&
(m_clipStatus == FileStatus::StatusProxy || m_clipStatus == FileStatus::StatusReady || m_clipStatus == FileStatus::StatusProxyOnly)) {
// Generate clip thumbnail
ClipLoadTask::start({ObjectType::BinClip, m_binId.toInt()}, QDomElement(), true, -1, -1, this);
// Generate audio thumbnail
@@ -631,7 +633,6 @@ bool ProjectClip::setProducer(std::shared_ptr<Mlt::Producer> producer, bool gene
m_duration = getStringDuration();
m_clipStatus = m_usesProxy ? FileStatus::StatusProxy : FileStatus::StatusReady;
locker.unlock();
if (m_clipStatus != currentStatus) {
updateRoles << AbstractProjectItem::ClipStatus << AbstractProjectItem::IconOverlay;
updateTimelineClips({TimelineModel::StatusRole, TimelineModel::ClipThumbRole});
@@ -2231,10 +2232,12 @@ void ProjectClip::deregisterTimelineClip(int clipId, bool audioClip)
Q_EMIT registeredClipChanged();
}
QList<int> ProjectClip::timelineInstances() const
QList<int> ProjectClip::timelineInstances(QUuid activeUuid) const
{
QList<int> ids;
const QUuid activeUuid = pCore->currentTimelineId();
if (activeUuid.isNull()) {
activeUuid = pCore->currentTimelineId();
}
for (const auto &registeredClip : m_registeredClips) {
if (auto ptr = registeredClip.second.lock()) {
if (ptr->uuid() != activeUuid) {

View File

@@ -195,7 +195,7 @@ public:
*/
bool isIncludedInTimeline() override;
/** @brief Returns a list of all timeline clip ids for this bin clip */
QList<int> timelineInstances() const;
QList<int> timelineInstances(QUuid activeUuid = QUuid()) const;
/** @brief This function returns a cut to the master producer associated to the timeline clip with given ID.
Each clip must have a different master producer (see comment of the class)
*/

View File

@@ -2100,6 +2100,22 @@ void KdenliveDoc::addTimeline(const QUuid &uuid, std::shared_ptr<TimelineItemMod
m_timelines.insert(uuid, model);
}
bool KdenliveDoc::checkConsistency()
{
if (m_timelines.isEmpty()) {
qDebug() << "==== CONSISTENCY CHECK FAILED; NO TIMELINE";
return false;
}
QMapIterator<QUuid, std::shared_ptr<TimelineItemModel>> j(m_timelines);
while (j.hasNext()) {
j.next();
if (!j.value()->checkConsistency()) {
return false;
}
}
return true;
}
void KdenliveDoc::loadSequenceGroupsAndGuides(const QUuid &uuid)
{
Q_ASSERT(m_timelines.find(uuid) != m_timelines.end());

View File

@@ -299,6 +299,8 @@ public:
/** @brief Set the autoclose attribute to all playlists in @param doc.
* This is eg. needed for rendering, as the process would not stop at the end of the playlist if it was not closed */
static void setAutoclosePlaylists(QDomDocument &doc);
/** @brief Check that the timelines hash have not changed between saved version and current status */
bool checkConsistency();
protected:
static int next_id; /// next valid id to assign

View File

@@ -1232,7 +1232,6 @@ bool EffectStackModel::checkConsistency()
ct++;
}
}
return true;
}

View File

@@ -10,6 +10,7 @@ SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
#include "core.h"
#include "doc/docundostack.hpp"
#include "doc/kdenlivedoc.h"
#include "jobs/cliploadtask.h"
#include "kdenlivesettings.h"
#include "mainwindow.h"
#include "monitor/monitormanager.h"
@@ -339,7 +340,6 @@ bool ProjectManager::testSaveFileAs(const QString &outputFileName)
// QString scene = m_activeTimelineModel->sceneList(saveFolder);
int duration = m_activeTimelineModel->duration();
QString scene = pCore->projectItemModel()->sceneList(saveFolder, QString(), QString(), m_activeTimelineModel->tractor(), duration);
QSaveFile file(outputFileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "////// ERROR writing to file: " << outputFileName;
@@ -412,7 +412,6 @@ bool ProjectManager::closeCurrentDocument(bool saveChanges, bool quit)
pCore->bin()->cleanDocument();
pCore->mixer()->unsetModel();
delete m_project;
m_project = nullptr;
} else {
pCore->projectItemModel()->clean();
// Close all timelines
@@ -420,8 +419,8 @@ bool ProjectManager::closeCurrentDocument(bool saveChanges, bool quit)
for (auto &uid : uuids) {
m_project->closeTimeline(uid);
}
m_project = nullptr;
}
m_project = nullptr;
return true;
}
@@ -816,6 +815,11 @@ void ProjectManager::doOpenFile(const QUrl &url, KAutoSaveFile *stale, bool isBa
openTimeline(binId, uuid);
}
}
// Now that sequence clips are fully built, fetch thumbnails
const QStringList sequenceIds = pCore->projectItemModel()->getAllSequenceClips().values();
for (auto &id : sequenceIds) {
ClipLoadTask::start({ObjectType::BinClip, id.toInt()}, QDomElement(), true, -1, -1, this);
}
// Raise last active timeline
QUuid activeUuid(m_project->getDocumentProperty(QStringLiteral("activetimeline")));
if (activeUuid.isNull()) {
@@ -1621,10 +1625,6 @@ bool ProjectManager::openTimeline(const QString &id, const QUuid &uuid, int posi
std::shared_ptr<TimelineItemModel> timelineModel = TimelineItemModel::construct(uuid, m_project->commandStack());
m_project->addTimeline(uuid, timelineModel);
TimelineWidget *timeline = nullptr;
if (pCore->window()) {
// Create tab widget
pCore->window()->openTimeline(uuid, clip->clipName(), timelineModel, pCore->monitorManager()->projectMonitor()->getControllerProxy());
}
if (internalLoad) {
qDebug() << "QQQQQQQQQQQQQQQQQQQQ\nINTERNAL SEQUENCE LOAD\n\nQQQQQQQQQQQQQQQQQQQQQQ";
qDebug() << "============= LOADING INTERNAL PLAYLIST: " << uuid;
@@ -1740,8 +1740,12 @@ bool ProjectManager::openTimeline(const QString &id, const QUuid &uuid, int posi
}
updateSequenceProducer(uuid, prod);
clip->setProducer(prod, false, false);
m_project->loadSequenceGroupsAndGuides(uuid);
}
if (pCore->window()) {
// Create tab widget
pCore->window()->openTimeline(uuid, clip->clipName(), timelineModel, pCore->monitorManager()->projectMonitor()->getControllerProxy());
}
m_project->loadSequenceGroupsAndGuides(uuid);
int activeTrackPosition = m_project->getSequenceProperty(uuid, QStringLiteral("activeTrack"), QString::number(-1)).toInt();
if (timeline == nullptr) {

View File

@@ -1348,7 +1348,7 @@ QDomElement ClipModel::toXml(QDomDocument &document)
bool ClipModel::checkConsistency()
{
if (!m_effectStack->checkConsistency()) {
qDebug() << "Consistency check failed for effecstack";
qDebug() << "Consistency check failed for effectstack";
return false;
}
if (m_currentTrackId == -1) {
@@ -1356,7 +1356,11 @@ bool ClipModel::checkConsistency()
return true;
}
std::shared_ptr<ProjectClip> binClip = pCore->projectItemModel()->getClipByBinID(m_binClipId);
auto instances = binClip->timelineInstances();
QUuid timelineUuid;
if (auto ptr = m_parent.lock()) {
timelineUuid = ptr->uuid();
}
auto instances = binClip->timelineInstances(timelineUuid);
bool found = instances.contains(m_id);
if (!found) {
qDebug() << "ERROR: binClip doesn't acknowledge timeline clip existence: " << m_id << ", CURRENT TRACK: " << m_currentTrackId;

View File

@@ -0,0 +1,796 @@
<?xml version='1.0' encoding='utf-8'?>
<mlt LC_NUMERIC="C" producer="main_bin" version="7.17.0" root="">
<profile frame_rate_num="25" sample_aspect_num="1" display_aspect_den="9" colorspace="709" progressive="1" description="HD 1080p 25 fps" display_aspect_num="16" frame_rate_den="1" width="1920" height="1080" sample_aspect_den="1"/>
<chain id="chain2" out="00:00:00.160">
<property name="length">5</property>
<property name="eof">pause</property>
<property name="resource">red.mpg</property>
<property name="mlt_service">avformat-novalidate</property>
<property name="meta.media.nb_streams">2</property>
<property name="meta.media.0.stream.type">video</property>
<property name="meta.media.0.stream.frame_rate">25</property>
<property name="meta.media.0.stream.sample_aspect_ratio">0</property>
<property name="meta.media.0.codec.width">720</property>
<property name="meta.media.0.codec.height">576</property>
<property name="meta.media.0.codec.rotate">0</property>
<property name="meta.media.0.codec.pix_fmt">yuv420p</property>
<property name="meta.media.0.codec.sample_aspect_ratio">1.09202</property>
<property name="meta.media.0.codec.colorspace">601</property>
<property name="meta.media.0.codec.name">mpeg1video</property>
<property name="meta.media.0.codec.long_name">MPEG-1 video</property>
<property name="meta.media.0.codec.bit_rate">104857200</property>
<property name="meta.media.1.stream.type">audio</property>
<property name="meta.media.1.codec.sample_fmt">s16p</property>
<property name="meta.media.1.codec.sample_rate">48000</property>
<property name="meta.media.1.codec.channels">2</property>
<property name="meta.media.1.codec.name">mp2</property>
<property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
<property name="meta.media.1.codec.bit_rate">384000</property>
<property name="seekable">1</property>
<property name="meta.media.sample_aspect_num">178</property>
<property name="meta.media.sample_aspect_den">163</property>
<property name="audio_index">1</property>
<property name="video_index">0</property>
<property name="meta.media.frame_rate_num">25</property>
<property name="meta.media.frame_rate_den">1</property>
<property name="meta.media.colorspace">601</property>
<property name="meta.media.color_trc">2</property>
<property name="meta.media.has_b_frames">1</property>
<property name="meta.media.width">720</property>
<property name="meta.media.height">576</property>
<property name="meta.media.color_range">mpeg</property>
<property name="kdenlive:clipname"/>
<property name="meta.media.top_field_first">0</property>
<property name="meta.media.progressive">1</property>
<property name="kdenlive:clip_type">0</property>
<property name="kdenlive:folderid">-1</property>
<property name="kdenlive:id">4</property>
<property name="mute_on_pause">0</property>
<property name="kdenlive:file_size">22528</property>
<property name="kdenlive:file_hash">8843808b89cc22ece225bdab6b6e4f21</property>
<property name="kdenlive:audio_max1">1</property>
<property name="kdenlive:activeeffect">-1</property>
</chain>
<producer id="producer0" in="00:00:00.000" out="00:20:00.400">
<property name="length">2147483647</property>
<property name="eof">continue</property>
<property name="resource">black</property>
<property name="aspect_ratio">1</property>
<property name="mlt_service">color</property>
<property name="kdenlive:playlistid">black_track</property>
<property name="mlt_image_format">rgba</property>
<property name="set.test_audio">0</property>
</producer>
<playlist id="playlist0">
<property name="kdenlive:audio_track">1</property>
</playlist>
<playlist id="playlist1">
<property name="kdenlive:audio_track">1</property>
</playlist>
<tractor id="tractor0" in="00:00:00.000">
<property name="kdenlive:audio_track">1</property>
<property name="kdenlive:trackheight">67</property>
<property name="kdenlive:timeline_active">1</property>
<property name="kdenlive:collapsed">0</property>
<property name="kdenlive:thumbs_format"/>
<property name="kdenlive:audio_rec"/>
<track hide="video" producer="playlist0"/>
<track hide="video" producer="playlist1"/>
<filter id="filter0">
<property name="window">75</property>
<property name="max_gain">20dB</property>
<property name="mlt_service">volume</property>
<property name="internal_added">237</property>
<property name="disable">1</property>
</filter>
<filter id="filter1">
<property name="channel">-1</property>
<property name="mlt_service">panner</property>
<property name="internal_added">237</property>
<property name="start">0.5</property>
<property name="disable">1</property>
</filter>
<filter id="filter2">
<property name="iec_scale">0</property>
<property name="mlt_service">audiolevel</property>
<property name="dbpeak">1</property>
<property name="disable">1</property>
</filter>
</tractor>
<chain id="chain0" out="00:00:00.160">
<property name="length">5</property>
<property name="eof">pause</property>
<property name="resource">red.mpg</property>
<property name="mlt_service">avformat-novalidate</property>
<property name="seekable">1</property>
<property name="audio_index">1</property>
<property name="video_index">0</property>
<property name="kdenlive:clipname"/>
<property name="kdenlive:clip_type">0</property>
<property name="kdenlive:folderid">-1</property>
<property name="kdenlive:id">4</property>
<property name="mute_on_pause">0</property>
<property name="kdenlive:file_size">22528</property>
<property name="kdenlive:file_hash">8843808b89cc22ece225bdab6b6e4f21</property>
<property name="kdenlive:audio_max1">1</property>
<property name="meta.media.nb_streams">2</property>
<property name="meta.media.0.stream.type">video</property>
<property name="meta.media.0.stream.frame_rate">25</property>
<property name="meta.media.0.stream.sample_aspect_ratio">0</property>
<property name="meta.media.0.codec.width">720</property>
<property name="meta.media.0.codec.height">576</property>
<property name="meta.media.0.codec.rotate">0</property>
<property name="meta.media.0.codec.pix_fmt">yuv420p</property>
<property name="meta.media.0.codec.sample_aspect_ratio">1.09202</property>
<property name="meta.media.0.codec.colorspace">601</property>
<property name="meta.media.0.codec.name">mpeg1video</property>
<property name="meta.media.0.codec.long_name">MPEG-1 video</property>
<property name="meta.media.0.codec.bit_rate">104857200</property>
<property name="meta.media.1.stream.type">audio</property>
<property name="meta.media.1.codec.sample_fmt">s16p</property>
<property name="meta.media.1.codec.sample_rate">48000</property>
<property name="meta.media.1.codec.channels">2</property>
<property name="meta.media.1.codec.name">mp2</property>
<property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
<property name="meta.media.1.codec.bit_rate">384000</property>
<property name="meta.media.sample_aspect_num">178</property>
<property name="meta.media.sample_aspect_den">163</property>
<property name="meta.media.frame_rate_num">25</property>
<property name="meta.media.frame_rate_den">1</property>
<property name="meta.media.colorspace">601</property>
<property name="meta.media.color_trc">2</property>
<property name="meta.media.has_b_frames">1</property>
<property name="meta.media.width">720</property>
<property name="meta.media.height">576</property>
<property name="meta.media.color_range">mpeg</property>
<property name="xml">was here</property>
<property name="meta.media.top_field_first">0</property>
<property name="meta.media.progressive">1</property>
<property name="set.test_audio">0</property>
<property name="set.test_image">1</property>
</chain>
<producer id="producer1" in="00:00:00.000" out="00:20:00.200">
<property name="length">2147483647</property>
<property name="eof">continue</property>
<property name="resource">0</property>
<property name="aspect_ratio">1</property>
<property name="mlt_service">color</property>
<property name="kdenlive:playlistid">black_track</property>
<property name="mlt_image_format">rgba</property>
<property name="set.test_audio">0</property>
</producer>
<playlist id="playlist3"/>
<playlist id="playlist4"/>
<tractor id="tractor1" in="00:00:00.000">
<property name="kdenlive:audio_track">1</property>
<property name="kdenlive:trackheight">67</property>
<property name="kdenlive:timeline_active">1</property>
<property name="kdenlive:thumbs_format"/>
<property name="kdenlive:audio_rec"/>
<track hide="video" producer="playlist3"/>
<track hide="video" producer="playlist4"/>
<filter id="filter3">
<property name="window">75</property>
<property name="max_gain">20dB</property>
<property name="mlt_service">volume</property>
<property name="internal_added">237</property>
<property name="disable">1</property>
</filter>
<filter id="filter4">
<property name="channel">-1</property>
<property name="mlt_service">panner</property>
<property name="internal_added">237</property>
<property name="start">0.5</property>
<property name="disable">1</property>
</filter>
<filter id="filter5">
<property name="iec_scale">0</property>
<property name="mlt_service">audiolevel</property>
<property name="dbpeak">1</property>
<property name="disable">0</property>
</filter>
</tractor>
<chain id="chain1" out="00:00:00.160">
<property name="length">5</property>
<property name="eof">pause</property>
<property name="resource">red.mpg</property>
<property name="mlt_service">avformat-novalidate</property>
<property name="seekable">1</property>
<property name="audio_index">1</property>
<property name="video_index">0</property>
<property name="kdenlive:clipname"/>
<property name="kdenlive:clip_type">0</property>
<property name="kdenlive:folderid">-1</property>
<property name="kdenlive:id">4</property>
<property name="mute_on_pause">0</property>
<property name="kdenlive:file_size">22528</property>
<property name="kdenlive:file_hash">8843808b89cc22ece225bdab6b6e4f21</property>
<property name="kdenlive:audio_max1">1</property>
<property name="meta.media.nb_streams">2</property>
<property name="meta.media.0.stream.type">video</property>
<property name="meta.media.0.stream.frame_rate">25</property>
<property name="meta.media.0.stream.sample_aspect_ratio">0</property>
<property name="meta.media.0.codec.width">720</property>
<property name="meta.media.0.codec.height">576</property>
<property name="meta.media.0.codec.rotate">0</property>
<property name="meta.media.0.codec.pix_fmt">yuv420p</property>
<property name="meta.media.0.codec.sample_aspect_ratio">1.09202</property>
<property name="meta.media.0.codec.colorspace">601</property>
<property name="meta.media.0.codec.name">mpeg1video</property>
<property name="meta.media.0.codec.long_name">MPEG-1 video</property>
<property name="meta.media.0.codec.bit_rate">104857200</property>
<property name="meta.media.1.stream.type">audio</property>
<property name="meta.media.1.codec.sample_fmt">s16p</property>
<property name="meta.media.1.codec.sample_rate">48000</property>
<property name="meta.media.1.codec.channels">2</property>
<property name="meta.media.1.codec.name">mp2</property>
<property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
<property name="meta.media.1.codec.bit_rate">384000</property>
<property name="meta.media.sample_aspect_num">178</property>
<property name="meta.media.sample_aspect_den">163</property>
<property name="meta.media.frame_rate_num">25</property>
<property name="meta.media.frame_rate_den">1</property>
<property name="meta.media.colorspace">601</property>
<property name="meta.media.color_trc">2</property>
<property name="meta.media.has_b_frames">1</property>
<property name="meta.media.width">720</property>
<property name="meta.media.height">576</property>
<property name="meta.media.color_range">mpeg</property>
<property name="xml">was here</property>
<property name="meta.media.top_field_first">0</property>
<property name="meta.media.progressive">1</property>
<property name="set.test_audio">0</property>
<property name="set.test_image">1</property>
</chain>
<playlist id="playlist5">
<entry producer="chain1" in="00:00:00.000" out="00:00:00.160">
<property name="kdenlive:id">4</property>
</entry>
</playlist>
<playlist id="playlist6"/>
<tractor id="tractor2" in="00:00:00.000" out="00:00:00.160">
<property name="kdenlive:audio_track">1</property>
<property name="kdenlive:trackheight">67</property>
<property name="kdenlive:timeline_active">1</property>
<property name="kdenlive:thumbs_format"/>
<property name="kdenlive:audio_rec"/>
<track hide="video" producer="playlist5"/>
<track hide="video" producer="playlist6"/>
<filter id="filter6">
<property name="window">75</property>
<property name="max_gain">20dB</property>
<property name="mlt_service">volume</property>
<property name="internal_added">237</property>
<property name="disable">1</property>
</filter>
<filter id="filter7">
<property name="channel">-1</property>
<property name="mlt_service">panner</property>
<property name="internal_added">237</property>
<property name="start">0.5</property>
<property name="disable">1</property>
</filter>
<filter id="filter8">
<property name="iec_scale">0</property>
<property name="mlt_service">audiolevel</property>
<property name="dbpeak">1</property>
<property name="disable">0</property>
</filter>
</tractor>
<chain id="chain3" out="00:00:00.160">
<property name="length">5</property>
<property name="eof">pause</property>
<property name="resource">red.mpg</property>
<property name="mlt_service">avformat-novalidate</property>
<property name="seekable">1</property>
<property name="audio_index">1</property>
<property name="video_index">0</property>
<property name="kdenlive:clipname"/>
<property name="kdenlive:clip_type">0</property>
<property name="kdenlive:folderid">-1</property>
<property name="kdenlive:id">4</property>
<property name="mute_on_pause">0</property>
<property name="kdenlive:file_size">22528</property>
<property name="kdenlive:file_hash">8843808b89cc22ece225bdab6b6e4f21</property>
<property name="kdenlive:audio_max1">1</property>
<property name="meta.media.nb_streams">2</property>
<property name="meta.media.0.stream.type">video</property>
<property name="meta.media.0.stream.frame_rate">25</property>
<property name="meta.media.0.stream.sample_aspect_ratio">0</property>
<property name="meta.media.0.codec.width">720</property>
<property name="meta.media.0.codec.height">576</property>
<property name="meta.media.0.codec.rotate">0</property>
<property name="meta.media.0.codec.pix_fmt">yuv420p</property>
<property name="meta.media.0.codec.sample_aspect_ratio">1.09202</property>
<property name="meta.media.0.codec.colorspace">601</property>
<property name="meta.media.0.codec.name">mpeg1video</property>
<property name="meta.media.0.codec.long_name">MPEG-1 video</property>
<property name="meta.media.0.codec.bit_rate">104857200</property>
<property name="meta.media.1.stream.type">audio</property>
<property name="meta.media.1.codec.sample_fmt">s16p</property>
<property name="meta.media.1.codec.sample_rate">48000</property>
<property name="meta.media.1.codec.channels">2</property>
<property name="meta.media.1.codec.name">mp2</property>
<property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
<property name="meta.media.1.codec.bit_rate">384000</property>
<property name="meta.media.sample_aspect_num">178</property>
<property name="meta.media.sample_aspect_den">163</property>
<property name="meta.media.frame_rate_num">25</property>
<property name="meta.media.frame_rate_den">1</property>
<property name="meta.media.colorspace">601</property>
<property name="meta.media.color_trc">2</property>
<property name="meta.media.has_b_frames">1</property>
<property name="meta.media.width">720</property>
<property name="meta.media.height">576</property>
<property name="meta.media.color_range">mpeg</property>
<property name="xml">was here</property>
<property name="meta.media.top_field_first">0</property>
<property name="meta.media.progressive">1</property>
<property name="set.test_audio">1</property>
<property name="set.test_image">0</property>
</chain>
<playlist id="playlist7">
<entry producer="chain3" in="00:00:00.000" out="00:00:00.160">
<property name="kdenlive:id">4</property>
<property name="kdenlive:activeeffect">0</property>
<filter id="filter9">
<property name="u">226</property>
<property name="v">150</property>
<property name="mlt_service">sepia</property>
<property name="kdenlive_id">sepia</property>
<property name="kdenlive:collapsed">0</property>
</filter>
</entry>
</playlist>
<playlist id="playlist8"/>
<tractor id="tractor3" in="00:00:00.000" out="00:00:00.160">
<property name="kdenlive:trackheight">67</property>
<property name="kdenlive:timeline_active">1</property>
<property name="kdenlive:thumbs_format"/>
<property name="kdenlive:audio_rec"/>
<track producer="playlist7"/>
<track producer="playlist8"/>
</tractor>
<playlist id="playlist9"/>
<playlist id="playlist10"/>
<tractor id="tractor4" in="00:00:00.000">
<property name="kdenlive:trackheight">67</property>
<property name="kdenlive:timeline_active">1</property>
<property name="kdenlive:thumbs_format"/>
<property name="kdenlive:audio_rec"/>
<track producer="playlist9"/>
<track producer="playlist10"/>
</tractor>
<tractor id="{ba2b281d-29ba-40ca-8cdf-90d5cc311a41}" in="00:00:00.000" out="00:00:00.160">
<property name="kdenlive:duration">00:00:00.200</property>
<property name="kdenlive:maxduration">5</property>
<property name="kdenlive:clipname">Sequence 2</property>
<property name="kdenlive:description"/>
<property name="kdenlive:uuid">{ba2b281d-29ba-40ca-8cdf-90d5cc311a41}</property>
<property name="kdenlive:producer_type">17</property>
<property name="kdenlive:id">5</property>
<property name="kdenlive:clip_type">0</property>
<property name="kdenlive:file_hash">a99f5b4b8b22264335637be74eee19cb</property>
<property name="kdenlive:folderid">2</property>
<property name="kdenlive:sequenceproperties.activeTrack">2</property>
<property name="kdenlive:sequenceproperties.documentuuid">{3638a297-8a87-4e73-91f0-882e770efeb9}</property>
<property name="kdenlive:sequenceproperties.hasAudio">1</property>
<property name="kdenlive:sequenceproperties.hasVideo">1</property>
<property name="kdenlive:sequenceproperties.tracks">4</property>
<property name="kdenlive:sequenceproperties.tracksCount">4</property>
<property name="kdenlive:sequenceproperties.verticalzoom">1</property>
<property name="kdenlive:sequenceproperties.zonein">0</property>
<property name="kdenlive:sequenceproperties.zoneout">75</property>
<property name="kdenlive:sequenceproperties.zoom">0</property>
<property name="kdenlive:sequenceproperties.groups">[
{
"children": [
{
"data": "2:0",
"leaf": "clip",
"type": "Leaf"
},
{
"data": "1:0",
"leaf": "clip",
"type": "Leaf"
}
],
"type": "AVSplit"
}
]
</property>
<property name="kdenlive:sequenceproperties.guides">[
]
</property>
<property name="kdenlive:sequenceproperties.position">0</property>
<property name="kdenlive:sequenceproperties.scrollPos">0</property>
<property name="kdenlive:sequenceproperties.disablepreview">0</property>
<track producer="producer1"/>
<track producer="tractor1"/>
<track producer="tractor2"/>
<track producer="tractor3"/>
<track producer="tractor4"/>
<transition id="transition0">
<property name="a_track">0</property>
<property name="b_track">1</property>
<property name="mlt_service">mix</property>
<property name="kdenlive_id">mix</property>
<property name="internal_added">237</property>
<property name="always_active">1</property>
<property name="accepts_blanks">1</property>
<property name="sum">1</property>
</transition>
<transition id="transition1">
<property name="a_track">0</property>
<property name="b_track">2</property>
<property name="mlt_service">mix</property>
<property name="kdenlive_id">mix</property>
<property name="internal_added">237</property>
<property name="always_active">1</property>
<property name="accepts_blanks">1</property>
<property name="sum">1</property>
</transition>
<transition id="transition2">
<property name="a_track">0</property>
<property name="b_track">3</property>
<property name="version">0.1</property>
<property name="mlt_service">frei0r.cairoblend</property>
<property name="kdenlive_id">frei0r.cairoblend</property>
<property name="internal_added">237</property>
<property name="always_active">1</property>
</transition>
<transition id="transition3">
<property name="a_track">0</property>
<property name="b_track">4</property>
<property name="version">0.1</property>
<property name="mlt_service">frei0r.cairoblend</property>
<property name="kdenlive_id">frei0r.cairoblend</property>
<property name="internal_added">237</property>
<property name="always_active">1</property>
</transition>
<filter id="filter10">
<property name="window">75</property>
<property name="max_gain">20dB</property>
<property name="mlt_service">volume</property>
<property name="internal_added">237</property>
<property name="disable">1</property>
</filter>
<filter id="filter11">
<property name="channel">-1</property>
<property name="mlt_service">panner</property>
<property name="internal_added">237</property>
<property name="start">0.5</property>
<property name="disable">1</property>
</filter>
</tractor>
<playlist id="playlist2">
<property name="kdenlive:audio_track">1</property>
<entry producer="chain0" in="00:00:00.000" out="00:00:00.160">
<property name="kdenlive:id">4</property>
</entry>
<entry producer="{ba2b281d-29ba-40ca-8cdf-90d5cc311a41}" in="00:00:00.000" out="00:00:00.160">
<property name="kdenlive:maxduration">5</property>
<property name="kdenlive:id">5</property>
</entry>
</playlist>
<playlist id="playlist11">
<property name="kdenlive:audio_track">1</property>
</playlist>
<tractor id="tractor5" in="00:00:00.000" out="00:00:00.360">
<property name="kdenlive:audio_track">1</property>
<property name="kdenlive:trackheight">67</property>
<property name="kdenlive:timeline_active">1</property>
<property name="kdenlive:collapsed">0</property>
<property name="kdenlive:thumbs_format"/>
<property name="kdenlive:audio_rec"/>
<track hide="video" producer="playlist2"/>
<track hide="video" producer="playlist11"/>
<filter id="filter12">
<property name="window">75</property>
<property name="max_gain">20dB</property>
<property name="mlt_service">volume</property>
<property name="internal_added">237</property>
<property name="disable">1</property>
</filter>
<filter id="filter13">
<property name="channel">-1</property>
<property name="mlt_service">panner</property>
<property name="internal_added">237</property>
<property name="start">0.5</property>
<property name="disable">1</property>
</filter>
<filter id="filter14">
<property name="iec_scale">0</property>
<property name="mlt_service">audiolevel</property>
<property name="dbpeak">1</property>
<property name="disable">1</property>
</filter>
</tractor>
<chain id="chain4" out="00:00:00.160">
<property name="length">5</property>
<property name="eof">pause</property>
<property name="resource">red.mpg</property>
<property name="mlt_service">avformat-novalidate</property>
<property name="seekable">1</property>
<property name="audio_index">1</property>
<property name="video_index">0</property>
<property name="kdenlive:clipname"/>
<property name="kdenlive:clip_type">0</property>
<property name="kdenlive:folderid">-1</property>
<property name="kdenlive:id">4</property>
<property name="mute_on_pause">0</property>
<property name="kdenlive:file_size">22528</property>
<property name="kdenlive:file_hash">8843808b89cc22ece225bdab6b6e4f21</property>
<property name="kdenlive:audio_max1">1</property>
<property name="meta.media.nb_streams">2</property>
<property name="meta.media.0.stream.type">video</property>
<property name="meta.media.0.stream.frame_rate">25</property>
<property name="meta.media.0.stream.sample_aspect_ratio">0</property>
<property name="meta.media.0.codec.width">720</property>
<property name="meta.media.0.codec.height">576</property>
<property name="meta.media.0.codec.rotate">0</property>
<property name="meta.media.0.codec.pix_fmt">yuv420p</property>
<property name="meta.media.0.codec.sample_aspect_ratio">1.09202</property>
<property name="meta.media.0.codec.colorspace">601</property>
<property name="meta.media.0.codec.name">mpeg1video</property>
<property name="meta.media.0.codec.long_name">MPEG-1 video</property>
<property name="meta.media.0.codec.bit_rate">104857200</property>
<property name="meta.media.1.stream.type">audio</property>
<property name="meta.media.1.codec.sample_fmt">s16p</property>
<property name="meta.media.1.codec.sample_rate">48000</property>
<property name="meta.media.1.codec.channels">2</property>
<property name="meta.media.1.codec.name">mp2</property>
<property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
<property name="meta.media.1.codec.bit_rate">384000</property>
<property name="meta.media.sample_aspect_num">178</property>
<property name="meta.media.sample_aspect_den">163</property>
<property name="meta.media.frame_rate_num">25</property>
<property name="meta.media.frame_rate_den">1</property>
<property name="meta.media.colorspace">601</property>
<property name="meta.media.color_trc">2</property>
<property name="meta.media.has_b_frames">1</property>
<property name="meta.media.width">720</property>
<property name="meta.media.height">576</property>
<property name="meta.media.color_range">mpeg</property>
<property name="xml">was here</property>
<property name="meta.media.top_field_first">0</property>
<property name="meta.media.progressive">1</property>
<property name="set.test_audio">1</property>
<property name="set.test_image">0</property>
</chain>
<playlist id="playlist12">
<entry producer="chain4" in="00:00:00.000" out="00:00:00.160">
<property name="kdenlive:id">4</property>
</entry>
<entry producer="{ba2b281d-29ba-40ca-8cdf-90d5cc311a41}" in="00:00:00.000" out="00:00:00.160">
<property name="kdenlive:id">5</property>
</entry>
</playlist>
<playlist id="playlist13"/>
<tractor id="tractor6" in="00:00:00.000" out="00:00:00.360">
<property name="kdenlive:trackheight">67</property>
<property name="kdenlive:timeline_active">1</property>
<property name="kdenlive:collapsed">0</property>
<property name="kdenlive:thumbs_format"/>
<property name="kdenlive:audio_rec"/>
<track hide="audio" producer="playlist12"/>
<track hide="audio" producer="playlist13"/>
</tractor>
<playlist id="playlist14"/>
<playlist id="playlist15"/>
<tractor id="tractor7" in="00:00:00.000">
<property name="kdenlive:trackheight">67</property>
<property name="kdenlive:timeline_active">1</property>
<property name="kdenlive:collapsed">0</property>
<property name="kdenlive:thumbs_format"/>
<property name="kdenlive:audio_rec"/>
<track hide="audio" producer="playlist14"/>
<track hide="audio" producer="playlist15"/>
</tractor>
<tractor id="tractor8" in="00:00:00.000" out="00:20:00.400">
<property name="kdenlive:duration">00:00:00:10</property>
<property name="kdenlive:maxduration">10</property>
<property name="kdenlive:clipname">Sequence 1</property>
<property name="kdenlive:description"/>
<property name="kdenlive:uuid">{3638a297-8a87-4e73-91f0-882e770efeb9}</property>
<property name="kdenlive:producer_type">17</property>
<property name="kdenlive:id">3</property>
<property name="kdenlive:clip_type">0</property>
<property name="kdenlive:file_hash">292891f0f2ed4aab81ab0236f74494b4</property>
<property name="kdenlive:folderid">2</property>
<property name="kdenlive:sequenceproperties.activeTrack">2</property>
<property name="kdenlive:sequenceproperties.scrollPos">0</property>
<property name="kdenlive:sequenceproperties.zonein">0</property>
<property name="kdenlive:sequenceproperties.zoneout">75</property>
<property name="kdenlive:sequenceproperties.disablepreview">0</property>
<property name="kdenlive:sequenceproperties.audioChannels">2</property>
<property name="kdenlive:sequenceproperties.audioTarget">1</property>
<property name="kdenlive:sequenceproperties.documentuuid">{3638a297-8a87-4e73-91f0-882e770efeb9}</property>
<property name="kdenlive:sequenceproperties.hasAudio">1</property>
<property name="kdenlive:sequenceproperties.hasVideo">1</property>
<property name="kdenlive:sequenceproperties.position">0</property>
<property name="kdenlive:sequenceproperties.tracks">4</property>
<property name="kdenlive:sequenceproperties.tracksCount">4</property>
<property name="kdenlive:sequenceproperties.verticalzoom">1</property>
<property name="kdenlive:sequenceproperties.videoTarget">2</property>
<property name="kdenlive:sequenceproperties.zoom">1</property>
<property name="kdenlive:sequenceproperties.groups">[
{
"children": [
{
"data": "2:0",
"leaf": "clip",
"type": "Leaf"
},
{
"data": "1:0",
"leaf": "clip",
"type": "Leaf"
}
],
"type": "AVSplit"
},
{
"children": [
{
"data": "2:5",
"leaf": "clip",
"type": "Leaf"
},
{
"data": "1:5",
"leaf": "clip",
"type": "Leaf"
}
],
"type": "AVSplit"
}
]
</property>
<property name="kdenlive:sequenceproperties.guides">[
]
</property>
<track producer="producer0"/>
<track producer="tractor0"/>
<track producer="tractor5"/>
<track producer="tractor6"/>
<track producer="tractor7"/>
<transition id="transition4">
<property name="a_track">0</property>
<property name="b_track">1</property>
<property name="mlt_service">mix</property>
<property name="kdenlive_id">mix</property>
<property name="internal_added">237</property>
<property name="always_active">1</property>
<property name="accepts_blanks">1</property>
<property name="sum">1</property>
</transition>
<transition id="transition5">
<property name="a_track">0</property>
<property name="b_track">2</property>
<property name="mlt_service">mix</property>
<property name="kdenlive_id">mix</property>
<property name="internal_added">237</property>
<property name="always_active">1</property>
<property name="accepts_blanks">1</property>
<property name="sum">1</property>
</transition>
<transition id="transition6">
<property name="a_track">0</property>
<property name="b_track">3</property>
<property name="version">0.1</property>
<property name="mlt_service">frei0r.cairoblend</property>
<property name="always_active">1</property>
<property name="internal_added">237</property>
</transition>
<transition id="transition7">
<property name="a_track">0</property>
<property name="b_track">4</property>
<property name="version">0.1</property>
<property name="mlt_service">frei0r.cairoblend</property>
<property name="always_active">1</property>
<property name="internal_added">237</property>
</transition>
<filter id="filter15">
<property name="window">75</property>
<property name="max_gain">20dB</property>
<property name="mlt_service">volume</property>
<property name="internal_added">237</property>
<property name="disable">1</property>
</filter>
<filter id="filter16">
<property name="channel">-1</property>
<property name="mlt_service">panner</property>
<property name="internal_added">237</property>
<property name="start">0.5</property>
<property name="disable">1</property>
</filter>
</tractor>
<playlist id="main_bin">
<property name="kdenlive:folder.-1.2">Sequences</property>
<property name="kdenlive:docproperties.activetimeline">{3638a297-8a87-4e73-91f0-882e770efeb9}</property>
<property name="kdenlive:docproperties.browserurl">Samples/Testing?/</property>
<property name="kdenlive:docproperties.compositing">1</property>
<property name="kdenlive:docproperties.documentid">1688711817958</property>
<property name="kdenlive:docproperties.enableTimelineZone">0</property>
<property name="kdenlive:docproperties.enableexternalproxy">0</property>
<property name="kdenlive:docproperties.enableproxy">0</property>
<property name="kdenlive:docproperties.externalproxyparams">./;;.LRV;./;;.MP4</property>
<property name="kdenlive:docproperties.generateimageproxy">0</property>
<property name="kdenlive:docproperties.generateproxy">0</property>
<property name="kdenlive:docproperties.guidesCategories">[
{
"color": "#9b59b6",
"comment": "Category 1",
"index": 0
},
{
"color": "#3daee9",
"comment": "Category 2",
"index": 1
},
{
"color": "#1abc9c",
"comment": "Category 3",
"index": 2
},
{
"color": "#1cdc9a",
"comment": "Category 4",
"index": 3
},
{
"color": "#c9ce3b",
"comment": "Category 5",
"index": 4
},
{
"color": "#fdbc4b",
"comment": "Category 6",
"index": 5
},
{
"color": "#f39c1f",
"comment": "Category 7",
"index": 6
},
{
"color": "#f47750",
"comment": "Category 8",
"index": 7
},
{
"color": "#da4453",
"comment": "Category 9",
"index": 8
}
]
</property>
<property name="kdenlive:docproperties.kdenliveversion">23.07.70</property>
<property name="kdenlive:docproperties.opensequences">{3638a297-8a87-4e73-91f0-882e770efeb9};{ba2b281d-29ba-40ca-8cdf-90d5cc311a41}</property>
<property name="kdenlive:docproperties.previewextension"/>
<property name="kdenlive:docproperties.previewparameters"/>
<property name="kdenlive:docproperties.profile">atsc_1080p_25</property>
<property name="kdenlive:docproperties.proxyextension"/>
<property name="kdenlive:docproperties.proxyimageminsize">2000</property>
<property name="kdenlive:docproperties.proxyimagesize">800</property>
<property name="kdenlive:docproperties.proxyminsize">1000</property>
<property name="kdenlive:docproperties.proxyparams"/>
<property name="kdenlive:docproperties.proxyresize">640</property>
<property name="kdenlive:docproperties.seekOffset">30000</property>
<property name="kdenlive:docproperties.uuid">{3638a297-8a87-4e73-91f0-882e770efeb9}</property>
<property name="kdenlive:docproperties.version">1.1</property>
<property name="kdenlive:expandedFolders">2</property>
<property name="kdenlive:binZoom">5</property>
<property name="kdenlive:documentnotes"/>
<property name="xml_retain">1</property>
<entry producer="chain2" in="00:00:00.000" out="00:00:00.160"/>
<entry producer="tractor8" in="00:00:00.000" out="00:00:00.160"/>
<entry producer="{ba2b281d-29ba-40ca-8cdf-90d5cc311a41}" in="00:00:00.000" out="00:00:00.000"/>
</playlist>
<tractor id="tractor9" in="00:00:00.000" out="00:00:00.400">
<property name="kdenlive:projectTractor">1</property>
<track producer="tractor8" in="00:00:00.000" out="00:00:00.400"/>
</tractor>
</mlt>

View File

@@ -18,6 +18,7 @@ using namespace fakeit;
TEST_CASE("Open and Close Sequence", "[OCS]")
{
auto binModel = pCore->projectItemModel();
Q_ASSERT(binModel->clipsCount() == 0);
binModel->clean();
std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
@@ -103,6 +104,7 @@ TEST_CASE("Open and Close Sequence", "[OCS]")
TEST_CASE("Save File With 2 Sequences", "[SF2]")
{
auto binModel = pCore->projectItemModel();
Q_ASSERT(binModel->clipsCount() == 0);
binModel->clean();
std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
@@ -375,3 +377,103 @@ TEST_CASE("Save File With 2 Sequences", "[SF2]")
pCore->projectManager()->closeCurrentDocument(false, false);
}
}
TEST_CASE("Save File, Reopen and check for corruption", "[SF3]")
{
auto binModel = pCore->projectItemModel();
Q_ASSERT(binModel->clipsCount() == 0);
binModel->clean();
std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
SECTION("Open and simply save file")
{
QString path = sourcesPath + "/dataset/test-nesting-effects.kdenlive";
QUrl openURL = QUrl::fromLocalFile(path);
QUndoGroup *undoGroup = new QUndoGroup();
undoGroup->addStack(undoStack.get());
DocOpenResult openResults = KdenliveDoc::Open(openURL, QDir::temp().path(), undoGroup, false, nullptr);
REQUIRE(openResults.isSuccessful() == true);
std::unique_ptr<KdenliveDoc> openedDoc = openResults.getDocument();
pCore->projectManager()->m_project = openedDoc.get();
const QUuid uuid = openedDoc->uuid();
QDateTime documentDate = QFileInfo(openURL.toLocalFile()).lastModified();
pCore->projectManager()->updateTimeline(0, false, QString(), QString(), documentDate, 0);
QMap<QUuid, QString> allSequences = binModel->getAllSequenceClips();
const QString firstSeqId = allSequences.value(uuid);
pCore->projectManager()->openTimeline(firstSeqId, uuid);
std::shared_ptr<TimelineItemModel> timeline = openedDoc->getTimeline(uuid);
pCore->projectManager()->testSetActiveDocument(openedDoc.get(), timeline);
// Now reopen all timeline sequences
QList<QUuid> allUuids = allSequences.keys();
for (auto &u : allUuids) {
if (u == uuid) {
continue;
}
const QString id = allSequences.value(u);
pCore->projectManager()->openTimeline(id, u);
}
REQUIRE(openedDoc->checkConsistency());
// Save file
QDir dir = QDir::temp();
pCore->projectManager()->testSaveFileAs(dir.absoluteFilePath(QStringLiteral("test-nest.kdenlive")));
pCore->projectManager()->closeCurrentDocument(false, false);
}
SECTION("Reopen and check in/out points")
{
// Create new document
// We mock the project class so that the undoStack function returns our undoStack, and our mocked document
KdenliveDoc::next_id = 0;
QString saveFile = QDir::temp().absoluteFilePath(QStringLiteral("test-nest.kdenlive"));
QUrl openURL = QUrl::fromLocalFile(saveFile);
Mock<ProjectManager> pmMock;
When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
QUndoGroup *undoGroup = new QUndoGroup();
undoGroup->addStack(undoStack.get());
DocOpenResult openResults = KdenliveDoc::Open(openURL, QDir::temp().path(), undoGroup, false, nullptr);
REQUIRE(openResults.isSuccessful() == true);
std::unique_ptr<KdenliveDoc> openedDoc = openResults.getDocument();
pCore->projectManager()->m_project = openedDoc.get();
const QUuid uuid = openedDoc->uuid();
QDateTime documentDate = QFileInfo(openURL.toLocalFile()).lastModified();
pCore->projectManager()->updateTimeline(0, false, QString(), QString(), documentDate, 0);
QMap<QUuid, QString> allSequences = binModel->getAllSequenceClips();
const QString firstSeqId = allSequences.value(uuid);
pCore->projectManager()->openTimeline(firstSeqId, uuid);
std::shared_ptr<TimelineItemModel> timeline = openedDoc->getTimeline(uuid);
// Now reopen all timeline sequences
QList<QUuid> allUuids = allSequences.keys();
// Collect saved hashes
QMap<QUuid, QString> timelineHashes;
for (auto &u : allUuids) {
timelineHashes.insert(u, openedDoc->getSequenceProperty(u, QStringLiteral("timelineHash")));
qDebug() << ":::: READING TIMELINE HASH FOR: " << u << " = " << openedDoc->getSequenceProperty(u, QStringLiteral("timelineHash"));
}
for (auto &u : allUuids) {
if (u == uuid) {
continue;
}
const QString id = allSequences.value(u);
pCore->projectManager()->openTimeline(id, u);
}
pCore->projectManager()->testSetActiveDocument(openedDoc.get(), timeline);
REQUIRE(openedDoc->checkConsistency());
for (auto &u : allUuids) {
QByteArray updatedHex = openedDoc->getTimeline(u)->timelineHash().toHex();
REQUIRE(updatedHex == timelineHashes.value(u));
}
QDir dir = QDir::temp();
QFile::remove(dir.absoluteFilePath(QStringLiteral("test-nest.kdenlive")));
// binModel->clean();
// pCore->m_projectManager = nullptr;
pCore->projectManager()->closeCurrentDocument(false, false);
}
}

View File

@@ -3,10 +3,7 @@
SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
#include <QString>
<<<<<<< HEAD
=======
>>>>>>> c39fc17768d72eac9e49c6041d2ff5f301efb8c3
static const QString sourcesPath("@TEST_SOURCES@");